之前对这个uboot的源码了解有些许遗忘。最近做AVB校验,需要uboot到kernel的这个过程。这里再复习一下。
与大多数BootLoader一样,uboot的启动过程分为BL1和BL2两个阶段。
BL1阶段通常是开发板的配置等设备初始化代码,需要依赖依赖于SoC体系结构,通常用汇编语言来实现;
BL2阶段主要是对外部设备如网卡、Flash等的初始化以及uboot命令集等的自身实现,通常用C语言来实现。
1、BL1阶段
uboot的BL1阶段代码通常放在start.s文件中,用汇编语言实现,其主要代码功能如下:
• (1) 指定uboot的入口。在链接脚本uboot.lds中指定uboot的入口为start.S中的_start。
• (2)设置异常向量(exception vector)
• (3)关闭IRQ、FIQ,设置SVC模式
• (4)关闭L1 cache、设置L2 cache、关闭MMU
• (5)根据OM引脚确定启动方式
• (6)在SoC内部SRAM中设置栈
• (7)lowlevel_init(主要初始化系统时钟、SDRAM初始化、串口初始化等)
• (8)设置开发板供电锁存
• (9)设置SDRAM中的栈
• (10)将uboot从SD卡拷贝到SDRAM中
• (11)设置并开启MMU
• (12)通过对SDRAM整体使用规划,在SDRAM中合适的地方设置栈
• (13)清除bss段,远跳转到start_armboot执行,BL1阶段执行完
2、BL2阶段
start_armboot函数位于lib_arm/board.c中,是C语言开始的函数,也是BL2阶段代码中C语言的 主函数,同时还是整个u-boot(armboot)的主函数,BL2阶段的主要功能如下:
• (1)规划uboot的内存使用
• (2)遍历调用函数指针数组init_sequence中的初始化函数
• (3)初始化uboot的堆管理器mem_malloc_init
• (4)初始化SMDKV210开发板的SD/MMC控制器mmc_initialize
• (5)环境变量重定位env_relocate
• (6)将环境变量中网卡地址赋值给全局变量的开发板变量
• (7)开发板硬件设备的初始化devices_init
• (8)跳转表jumptable_init
• (9)控制台初始化console_init_r
• (10)网卡芯片初始化eth_initialize
• (11)uboot进入主循环main_loop
这里主要对第二个阶段BL2进行一个分析。
3、start_armboot函数分析
start_armboot函数的主要功能如下:
• (1)遍历调用函数指针数组init_sequence中的初始化函数
依次遍历调用函数指针数组init_sequence中的函数,如果有函数执行出错,则执行hang函数,打印出”### ERROR ### Please RESET the board ###”,进入死循环。
• (2)初始化uboot的堆管理器mem_malloc_init
• (3)初始化SMDKV210的SD/MMC控制器mmc_initialize
• (4)环境变量重定位env_relocate
• (5)将环境变量中网卡地址赋值给全局变量的开发板变量
• (6)开发板硬件设备的初始化devices_init
• (7)跳转表jumptable_init
• (8)控制台初始化console_init_r
• (9)网卡芯片初始化eth_initialize
• (10)uboot进入主循环main_loop
-
soc
+关注
关注
38文章
4165浏览量
218239 -
函数
+关注
关注
3文章
4331浏览量
62604 -
开发板
+关注
关注
25文章
5050浏览量
97456 -
Uboot
+关注
关注
4文章
125浏览量
28229
发布评论请先 登录
相关推荐
评论