uboot移植心得

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个Bootloader,反正以前也没怎么深入研究,便说花一到两周时间来搞搞U-BOOT。

参考了fzb和赵春江两位大牛的,也研究了2010.06版本的和2011.06版本两个经典版本,也对比了TQ(我买的板是天嵌的)自己写的U-BOOT,学到了不少,也发现了很多东西,以下便记录以下自己的心得吧,以便以后可以自己参考下。

U-BOOT的两个阶段启动过程:(2010.06经典版来说)

第一阶段:start.S的路径位于arch\arm\cpu\arm920t\这段汇编代码一般被称作第一阶段初始化代码。主要作用是初始化运行环境;初始化内存;重新放置UBOOT代码到内存中;跳入到内存中执行第二段初始化代码

1、关闭开门狗,屏蔽所有中断

2、设置分频比

3、bl cpu_init_crit() 关MMU,初始化内存

bl lowlevel_init() 配置内存,修改内存刷新率参数等

4、relocate判断当前代码是在NORFLASH还是RAM

copy_loop循环将FLASH代码复制至RAM中

5、stack_setup栈设置

clear_bss_bss_start到_bss_end之间的数据清0

6、ldr pc , start_armboot 跳转到第二阶段

//=====================================================================

第二阶段:board.c的路径位于arch/arm/lib/board.c,这段代码为U-BOOT的第二阶段初始化代码。主要作用是初始化两个重要数据结构,对SDRAM的内存分配设置,对各种需要用到的外设进行初始化,最后循环跳入main_loop()函数

二阶段start_armboot分为board_init_f 和 board_init_r两部分

先执行的board_init_f部分:

1、为gd数据结构分配地址,并清零

2、执行init_fnc_ptr函数指针数组中的各个初始化函数,如下

board_early_init_f ,timer_init ,env_init init_baudrate serial_init

console_init_f display_banner dram_init

3、A、分配SDRAM高64KB为TLB,用于U-BOOT

B、分配SDRAM下一单元为U-BOOT代码段,数据段,BSS段

(这里插一句,原来BSS段是用来存放未初始化的全局变量与静态变量)

C、接着开辟malloc空间,存bd , gd , 3个字大小的异常堆空间

4、将relorate的地址值赋给gd结构体相应变量(2011.06版本的,用于返回start.S)

后执行的board_init_r部分:

1、对gd , bd 数据结构赋值初始化

2、各种外设初始化:

初始化NORFLASH, NANDFLASH,初始化ONENAND FLASH

初始化环境变量初始化PCI设置IP地址初始化各类外设:IIC、LCD、键盘、USB初始化控制台建立IRQ中断堆栈初始化以太网

初始化跳转表(定义了U-Boot中基本的常用函数库)。。这不算外设

3、一个死循环执行 main_loop()函数

/**********************************

两个版本的U-BOOT启动对比:

************************************/

其实在总体上都差不多,只不过相对于经典版(2010.06版),新版之后都变恶心了

主要有这样的区别:

1、原版本第一阶段的第5步栈设置被放到第4步relorate前(这个没什么)

2、原版第二阶段的board_init_f被放到第一阶段第4步relorate前,就是说执行完

stack_setup栈设置后变进入了第二阶段的部分初始化,然后通过4、将relorate的地址值赋

给gd结构体相应变量(2011.06版本的,用于返回start.S)又返回来第一阶段。。。感觉新版改后很乱,很没条理(开源的每年改,就是烦呀,哈哈)

//=================================================

以下列出两个阶段可能要用到的函数的路径,方便以后找:(按2011.06版本)

一阶段:

lowlevel_init函数,它是在board/samsung/smdk2410目录下的lowlevel_init.s文件中定义

二阶段:

gd是一个保存在ARM的r8寄存器中的gd_t结构体的指针,它是在/include/asm目录下的global_data.h文件内被定义的

bd结构体的数据原型为bd_t数据结构,它表示的是“板级信息”结构体,它是在/include/asm目录下的u-boot.h文件中定义的。

init_fnc_ptr函数指针数组中的各个初始化函数:

board_early_init_f函数在board/samsung/smdk2410目录下的smdk2410.c文件内

timer_init函数在arch/arm/cpu/arm920t/s3c24x0目录下的timer.c文件内

env_init函数在common目录下的env_flash.c文件内

init_baudrate函数在arch/arm/lib目录下的board.c文件内

serial_init函数在drivers/serial目录下的serial_s3c24x0.c文件内,在

include/configs/smdk2410.h中定义了CONFIG_S3C24X0_SERIAL

console_init_f函数在common目录下的console.c文件内

display_banner函数在arch/arm/lib目录下的board.c文件内

dram_init函数在board/samsung/smdk2410目录下的smdk2410.c文件内

各种外设的初始化:

flash_init函数是在drivers/mtd目录下的cfi_flash.c文件内(因为

include/configs/smdk2410.h中定义了CONFIG_FLASH_CFI_DRIVER)

nand_init函数是在divers/mtd/nand目录下的nand.c文件内定义的

相关文档
最新文档