预览加载中,请您耐心等待几秒...
1/5
2/5
3/5
4/5
5/5

在线预览结束,喜欢就下载吧,查找使用更方便

如果您无法下载资料,请参考说明:

1、部分资料下载需要金币,请确保您的账户上有足够的金币

2、已购买过的文档,再次下载不重复扣费

3、资料包下载后请先用软件解压,在使用对应软件打开

最近跑完裸机之后,便开始跑系统,但想着裸机与系统之间隔着个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、blcpu_init_crit()关MMU,初始化内存 bllowlevel_init()配置内存,修改内存刷新率参数等 4、relocate判断当前代码是在NORFLASH还是RAM copy_loop循环将FLASH代码复制至RAM中 5、stack_setup栈设置 clear_bss_bss_start到_bss_end之间的数据清0 6、ldrpc,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_initinit_baudrateserial_init console_init_fdisplay_bannerdram_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,初始化ONENANDFLASH 初始化环境变量初始化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数据结构,它表示的是“板级信息”结构体,它