uboot的启动BL1和BL2两个阶段介绍

描述

  之前对这个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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分