u_boot初始化流程

u_boot初始化流程

ID:39469466

大小:323.04 KB

页数:10页

时间:2019-07-04

u_boot初始化流程_第1页
u_boot初始化流程_第2页
u_boot初始化流程_第3页
u_boot初始化流程_第4页
u_boot初始化流程_第5页
资源描述:

《u_boot初始化流程》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

1、U-Boot启动代码分析U-boot的启动顺序分为stage1和stage2两部分,见下图。依赖于CPU体系结构的代码(如设备初始化代码等)通常放在stage1中用汇编语言实现,而在stage2则通常由C语言实现,这样可以实现复杂的功能,而且有更好的可读性和移植性。以下主要梳理了stage2阶段函数的调用顺序以及每个函数的功能。U-boot的启动顺序C语言代码部分lib_arm/board.c中的start_armboot既是C语言开始的函数也是整个启动代码中C语言的主函数,同时还是整个U-boot的主函数,该函数只要完成如下操作。(1)调用一系列

2、的初始化函数。(2)初始化Flash设备。(3)初始化系统内存分配函数(4)如果目标系统拥有NAND设备,则初始化NAND设备(5)如果目标系统有显示设备,则初始化该类设备。(6)初始化相关网络设备,填写IP、MAC地址等。(7)进入命令循环(即整个Boot的工作循环),接收用户从串口输入的命令,然后进行相应的工作。下面结合源码分析函数调用顺序以及函功能:代码:voidstart_armboot(void){init_fnc_t**init_fnc_ptr;char*s;intmmc_exist=0;#ifdefined(CONFIG_VFD)

3、

4、

5、defined(CONFIG_LCD)unsignedlongaddr;#endif注释:从U-bootstage1中start.s程序调到这里执行start_armboot函数,这一段代码进行了变量声明,其中定义了一个名为init_fnc_ptr的双重指针。如果CONFIG_VFD或者CONFIG_LCD被定义了则声明一无符号长整型变量addr,本开发板中没有定义无需声明addr。代码:/*Pointeriswritablesinceweallocatedaregisterforit*/gd=(gd_t*)(_armboot_start-CONF

6、IG_SYS_MALLOC_LEN-sizeof(gd_t));/*compileroptimizationbarrierneededforGCC>=3.4*/__asm____volatile__("":::"memory");//内存屏障,告诉编译器内存被修改过了memset((void*)gd,0,sizeof(gd_t));gd->bd=(bd_t*)((char*)gd-sizeof(bd_t));//指向gd之前memset(gd->bd,0,sizeof(bd_t));//gd->flags

7、=GD_FLG_RELOC;monitor

8、_flash_len=_bss_start-_armboot_start;//u-boot映像的大小其中_armboot_start为codestart,_bss_start为code+dataend==BSSstart.注释:gd=(gd_t*)(_armboot_start-CONFIG_SYS_MALLOC_LEN-sizeof(gd_t));//内存强制转换,gd为全局环境变量,gd指向uboot之前的地址;memset():void*memset(void*s,charc,size_tcount)将指针s所指地址以及之后count个地址中

9、数值赋值为c。memset((void*)gd,0,sizeof(gd_t))的作用为:gd整个地址的值初始化为0;memset(gd->bd,0,sizeof(bd_t))的作用为bd地址的值初始化为0。代码:for(init_fnc_ptr=init_sequence;*init_fnc_ptr;++init_fnc_ptr){if((*init_fnc_ptr)()!=0){//相当于调用指针中的一个函数,如果不为0就表示死机hang();}}注释:将init_squence数组送给init_fnc_ptr,利用循环调用init_squenc

10、e数组中的多个初始化函数,包括初始化CPU、board、中断、时钟、NORFlash、NANDFlash等,后面根据代码进行分析。初始化完成之后进入hang()处于死循环即完成U-boot使命。init_sequence[]数组保存基本的初始化函数指针,在board.c中对数组进行了定义:#ifdefined(CONFIG_ARCH_CPU_INIT)arch_cpu_init,/*basicarchcpudependentsetup*/#endifboard_init,/*basicboarddependentsetup*///#ifdefine

11、d(CONFIG_USE_IRQ)interrupt_init,/*setupexceptions*///#endif//

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。