u-boot启动过程代码分析
基于u-boot2017和Rk3288产品板子
第一阶段:和架构相关的初始化
Start.S (/
arch/arm/cpu/armv7文件夹中)----------
-> bl
_main (start.S进入_main 入口在
\arch\arm\lib\crt0.S中
)------>
board_init_f
Start.S:保存重要寄存器、关闭中断、、初始化MMU、关看门狗等等
会跳出到其他文件夹执行例如:bowlevel_init()(关两只狗函数)
_main:
(相当重要)
建立C的执行环境,然后跳转至
board_init_f函数
================================================================================================
第二阶段:
板级
的初始化
_main (arch/arm/lib/crt0.S) ---->
board_init_f
(
位于\arch\arm\mach-omap2\hwinit-common)
-->
init_sequence_f (位于/common/board_f.c
会回调
一系列函数
)
---> (回到_main) 调用
board_init_r
( 位于common\spl\spl.c
)
--> init_sequence_r (位于/common/board_r.c会回调一系列函数)
-->
run_main_loop
(在
/common/board_r.c中
)
-->
main_loop
(common\main.c)
board_init_f:
其中sdram_init()是初始化SDRAM的关键代码,其调用关系如下:
Board_init_f--àhw_data_init() --àearly_system_init()àsdarm_init()
/
/初始化SDRAM
borad_init_r:(重要)
(位于common\spl\spl.c
):调用init_sequence_r执行内部函数完成:
初始化
NORFLASH, NANDFLASH,
初始化
ONENAND FLASH
初始化环境变量
初始化
PCI
设置
IP
地址
初始化各类外 设
:IIC
、
LCD
、键盘、
USB
初始化控制台
建立
IRQ
中断堆栈
初始化以太网
初始化跳转表(定义了
U-Boot
中基本的常用函数库)
遍历laoder,看哪个laoder和设备匹配,
将u-boot.img加载到内存,并进行解析
。
当镜像加载到内存时,此时SPL进行判断,加载的镜像时u-boot还是kernel然后便跳转到镜像的入口中进行执行。此时SPL的使命
便完成了.
通过验证,就board_init_r函数而言,在SPL中链接向SPL.c中的board_init_r函数,
而在u-boot中,是链接向board_r.c中的board_init_r函数,那么我就从board_init_r函数入手,
在board_init_r函数实现一个死循环,但是发现还是有信息能够输出,说明在board_init_r还进行了初始化的工作。
其实在board_init_f中都已经
链接在别的文件中
了,他是
位于board_f.c文
件中
init_sequence_f :
函数中最关键的是initcall_run_list(init_sequence_f);
init_sequence_r
:
initcall_run_list(
init_sequence_r);
这个数组的作用就是一个个的按顺序去调用这个数组里的函数。
main_loop: U-boot启动管理函数,关键函数
u-boot工作内容:
U-boot存储器映射
整体启动框架