2020-09-30

嵌入式系统移植—U-boot移植(1)

实验设备
软件:VMware11.0 + Ubuntu12.04
*硬件:创龙OMAPL138系列实验箱 *

OMAPL138的U-boot启动流程
1.根据start.S梳理出u-boot启动流程:
_start -> reset -> cpu_init_crit -> lowlevel_init -> cpu_init_crit -> reset -> 配置异常向量表 -> 配置回调函数call_board_init_f -> 调用call_board_init_f执行board_init_f -> relocate_code -> board_init_r -> main_loop等待用户输入命令,根据读取到的u-boot配置信息加载内核
每个流程阶段说明如下:
(1)_start 阶段
程序入口,所在文件:arch/arm/cpu/arm926ejs/start.S
(2)reset 阶段
配置CPU成SVC32模式后进入cpu_init_crit,所在文件:arch/arm/cpu/arm926ejs/start.S
关键代码如下图所示:
2020-09-30

(3)cpu_init_crit 阶段
关闭MMU、D Cache和I Cache,进入lowlevel_init,所在文件:arch/arm/cpu/arm926ejs/start.S
关键代码如下图所示:
2020-09-30

(4)lowlevel_init 阶段
lowlevel_init所在文件:arch/arm/cpu/arm926ejs/davinci/lowlevel_init.S,根据文件代码实现只有配置了“CONFIG_SOC_DM644X”才进行处理,omapl138不使用“CONFIG_SOC_DM644X”配置,所以在lowlevel_init函数中不做任何处理,直接返回上层函数cpu_init_crit
(5)cpu_init_crit 阶段
cpu_init_crit处理完后,返回上层调用reset,所在文件:arch/arm/cpu/arm926ejs/start.S
(6)reset 阶段
到这阶段reset执行完成,返回_start,继续配置异常向量表,所在文件:arch/arm/cpu/arm926ejs/start.S
2020-09-30

(7)配置回调函数call_board_init_f
根据堆栈指示字“CONFIG_SYS_INIT_SP_ADDR”配置call_board_init_f回调函数,如下图1,“CONFIG_SYS_INIT_SP_ADDR”配置在include/configs/da850sdi.h文件中配置,如下图。
所在文件:arch/arm/cpu/arm926ejs/start.S

2020-09-30

2020-09-30

(8)U-boot启动时调用回调函数call_board_init_f阶段
调用board_init_f函数。所在文件:arch/arm/cpu/arm926ejs/start.S

2020-09-30

(9)board_init_f阶段
board_init_f所在文件:arch/arm/lib/board.c
准备全局信息GD结构,内核启动参数就是来自于这个结构体,最后跳转到relocate_code阶段。

2020-09-30

(10)relocate_code阶段
把U-boot代码拷贝到SRAM中执行。所在文件:arch/arm/cpu/arm926ejs/start.S。
(11)board_init_r阶段
U-boot代码拷贝到SRAM中执行后,根据配置编译配置,调用board_init_r函数,如下图。
2020-09-30

board_init_r函数实现所在文件:arch/arm/lib/board.c,如下图。
board_init_r实现API、FLASH、MMC、中断等初始化,最后跳到main_loop阶段。

2020-09-30

(12)main_loop阶段
V-boot启动过程中等待用户通过键盘输入命令,根据预配置的内核环境变量加载内核并启动,内核启动后U-boot工作就结束。所在文件:/common/main.c

2020-09-30