资讯详情

基于全志A33开发板linux系统移植学习记录(Boot0)

基于全志A33开发板linux系统移植学习记录

第一章 Boot0基于ARMGCC编译和修改


文章目录

  • 基于全志A33开发板linux系统移植学习记录
  • 前言
  • 一、全志A33简介及上电引导流程
  • 二、Boot编译器修改的一般流程
    • 1.Boot0大体流程
    • 2.这部分需要做的工作
    • 3.修改流程
  • 三、Boot0调试
  • 总结


前言

进入行业近两年,希望通过学习系统移植巩固相关知识,使用基于全志的目标板A33 的astar-parrot开发板开始想用。Boot0来加载uboot,但后期发现,为了统一和方便代码,最终选择了代码SPL但是Boot0流程比较清晰,所以贴出来容易理解。


一、全志A33简介及上电引导流程

  • 硬件方面:A三三三芯片以四核为基础Cortex- A支持高清1080的7架构处理器P视频处理,支持各种主流视频标准,如H.264、VP8、MPEG1/2/4、JPEG/MJPEG,支持RGB/LVDS和LCD接口。256KB一级缓存和512KB二级缓存… 软件:适应全志原厂openWrt构建的Tina系统:采用uboot2011,Linux3.4版,可支持Android4.3,

上电流程:

  • 芯片支持五种指导方法,即NAND Flash,eMMC NAND,SPI Nor Flash,SD卡(SDC 0/2)和USB。但如果要直接从USB启动系统,内部上拉50k电阻的UBOOT_SEL引脚需要降低。具体引导流程如下图所示:

Yes
No
Yes
No
Yes
No
Yes
No
No
Yes
Power up
UBOOT_SEL==0 ?
SDC0 Boot
NAND Flash Boot
SDC2 Boot
SPI Boot
Boot Ok,run other firmware
USB boot operation
  • Soc内部SROM区固化一段代码,上电首先执行这段代码,其主要是判断启动介质并将介质中的部分代码搬运至内部SRAM中(SRAM A1区域,最大32KB,相关控制器已经初始化)并mv PC跳转,判断的顺序就是上图所示。由于目标板使用mmc存储方式,并向外提供了SD卡插槽,为了保证不烧砖(由于移植过程中去掉了fel mode,相对不是很安全),首先利用工具将厂商提供的镜像烧录至mmc(SDC2)中,然后后面利用TF卡,将编译好的bin档dd到sd卡偏移16sector的位置,(SDC0)启动移植代码(SDC0优先级高,所以不会有影响),

二、Boot0编译器修改大致流程

1.Boot0大体流程

根据上述A33的启动方式描述,由于主体u-boot占用内存远远大于其SRAM容量,所以Boot0的主要作用就是运行在SRAM中,初始化启动介质,初始化外部DDR,并搬运uboot到DDR最后跳转。源码github:https://github.com/wangzl-coder/sunxi-basicLoader.git

2.此部分需做的工作

Boot0是比较简单但非常底层的裸机程序,SOC厂商发布的Boot0源码是基于cygwin+armcc进行编译,为了后续的方便,我们需要修改并重新编译,而由于armcc的非开源性,所以第一步是将其转换标准,使用ARM GCC编译方式编译。

3.修改流程

(1)编译环境的搭建部分省略,选用arm通用编译器arm-linux-gnueabi-,首先新建armgcc配置文件,添加如下:

#/* #********************************************************************************************************* #* MELIS #* the Easy Portable/Player Develop Kits #* Compiler Module #* #* (c) Copyright 2006-2010, kevin.z China #* All Rights Reserved #* #* File : crosstool.cfg #* By : kevin.z #* Version : v1.0 #* Date : 2010-9-7 10:38 #* Descript: configuration script for RVDS compiler #* Update : date auther ver notes #* #********************************************************************************************************* #*/
#

#工具链配置
CROSSTOOL   = ARMGCC

LICHEEPATH      = $(SDKROOT)/../../tools/pack/chips/$(ARCH)
WORKSPACEPATH   = $(SDKROOT)/../pack/chips/$(ARCH)
WORKTOOLS       = $(SDKROOT)/pctools

ifeq ($(CROSSTOOL), ARMRVDS)

#===============================================================
#RVDS编译器参数配置
#===============================================================


else


ifeq ($(CROSSTOOL), ARMGCC)

#===============================================================
#GNU编译器参数配置
#===============================================================
CROSS_COMPILE ?= arm-linux-gnueabi-
#编译器
CC          = $(CROSS_COMPILE)gcc
#编译器参数
CFLAGS      =  

#打包库
AS          = $(CROSS_COMPILE)as
#打包库参数
ASFLAGS     =

#链接器
LD        = $(CROSS_COMPILE)ld
#链接器参数
LKFLAGS     =

#objcopy
OBJCOPY        = $(CROSS_COMPILE)objcopy
#加载器参数
OBJCOPY_FLAGS     = -O binary -S

else

error:
	$(error CROSSTOOL configuration is invalid!!!)

endif
endif

(2) 修改相关文件格式:根据gnuc标准,首先将所有汇编文件后缀修改为.S(大写),将目录标识符"“修改linux格式”/"。 (3)boot0/make.cfg 添加编译,链接参数

ifeq ($(CROSSTOOL), ARMGCC)

#===============================================================================
#使用GNU-GCC编译器
#===============================================================================

CFLAGS += -O2 -Wno-nonnull-compare -fno-strict-aliasing -fno-stack-protector -Werror -Wall $(INCLUDES) 

LDFLAGS += -T./config/sun8iw5p1.lds -static

(4)添加链接脚本,_start段作为起始段,将头校验段链接在起始位置,此处首先需要对head自定义段,boot0/Boot0_head.c:

#include "boot0_i.h"

#define DDR3_USED

const boot0_file_head_t  BT0_head __attribute__((__section__(".bt0_head")))= { 
        
									{ 
        
	  /* jump_instruction */      		( 0xEA000000 | ( ( ( sizeof( boot0_file_head_t ) + sizeof( int ) - 1 ) / sizeof( int ) - 2 ) & 0x00FFFFFF ) ),	// one intruction jumping to real code
										BOOT0_MAGIC,		// ="eGON.BT0" or "eGON.BT1", not C-style string.
										STAMP_VALUE,		// generated by PC
		#ifdef ALIGN_SIZE_8K
										0x2000,
		#else
										0x8000,			// generated by PC
		#endif
										sizeof( boot_file_head_t ),	// the size of boot_file_head_t
										BOOT_PUB_HEAD_VERSION,		// the version of boot_file_head_t
										0,							 // the return value
										0,							// run addr
										EGON_VERSION,					// eGON version
										{ 
        
											0, 0, '3','.','1','.','0',0	// platform information
										},
									},
#ifdef DDR3_USED
									{ 
        
										sizeof( boot0_private_head_t ),	// the size of prvt_head
										BOOT0_PRVT_HEAD_VERSION,			// the version of boot0_private_head_t
										/******DRAM patameters for initialising dram. Original values is arbitrary******/
										{ 
         	
											/***normal configuration******/
											552, 				//dram_clk
											3, 				//dram_type
											0x3bbb,				//dram_zq
											1,				//dram_odt_en
											0x10F20200,				//dram_para1
											0x00,				//dram_para2

											/****timing configuration*****/
											0x1840,				//dram_mr0
											0x40,				//dram_mr1
											0x8,			//dram_mr2
											0,			//dram_mr3
											0x0048A192,				//dram_tpr0
											0x01B1B18d,				//dram_tpr1
											0x00076052,				//dram_tpr2
											0x0,				//dram_tpr3
											0x0,				//dram_tpr4
											0x0,				//dram_tpr5
											0x0,				//dram_tpr6
											0x0,				//dram_tpr7
											0x0,				//dram_tpr8
											0x0,				//dram_tpr9
											0x0,				//dram_tpr10
											0x0,				//dram_tpr11
											168,				//dram_tpr12
											0x10900,				//dram_tpr13
										},							
										3,								// UART控制器编号
										{ 
        
											{ 
         8, 6, 3, 1, 0xff, 0xff, { 
        0, 0} },	// UART控制器(调试打印口)数据信息 tx
											{ 
         8, 7, 3, 1, 0xff, 0xff, { 
        0, 0} }		// UART控制器(调试打印口)数据信息 rx
										},
										0,									// jtag 1 : enable, 0 : disable
										{ 
        
											{ 
         0, 0, 0, 0, 0, 0, { 
        0, 0} },
											{ 
         0, 0, 0, 0, 0, 0, { 
        0, 0} },
											{ 
         0, 0, 0, 0, 0, 0, { 
        0, 0} },
											{ 
         0, 0, 0, 0, 0, 0, { 
        0, 0} },
											{ 
         0, 0, 0, 0, 0, 0, { 
        0, 0} },
										},							// 保存JTAG的全部GPIO信息
										{ 
        
											{ 
         6, 0, 2, 1, 2, 0, { 
        0, 0} },	
											{ 
         6, 1, 2, 1, 2, 0, { 
        0, 0} },
											{ 
         6, 2, 2, 1, 2, 0, { 
        0, 0} },
											{ 
         6, 3, 2, 1, 2, 0, { 
        0, 0} },
											{ 
         6, 4, 2, 1, 2, 0, { 
        0, 0} },
											{ 
         6, 5, 2, 1, 2, 0, { 
        0, 0} },			// 存储设备 GPIO信息
										},

										/****用户保留数据信息****/
										{ 
         
											0,
										}					
									}
#else
									{ 
        
										sizeof( boot0_private_head_t ),
										BOOT0_PRVT_HEAD_VERSION,
										{ 
         0x40000000,
											1024,
											180,
											1,
											1,
											0,
											(__dram_type_e)1,
											16,
											10,
											14,
											4,
											3,
											0,
											16,
											1024
										},
										0,
										{ 
        
											 

标签: 3aa0电阻

锐单商城拥有海量元器件数据手册IC替代型号,打造 电子元器件IC百科大全!

锐单商城 - 一站式电子元器件采购平台