以下例子都以project X项目tiny210(s5pv210平台,armv7架构)为例。
[uboot] uboot流程系列:
[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)
[uboot] (第一章)uboot流程——概述
[uboot] (第二章)uboot流程——uboot-spl编译流程
建议参考文章
[kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断
[kernel 启动流程] (第六章)第一阶段之——打开MMU
ARM的CP15协处理器的寄存器
建议先看《[project X] tiny210(s5pv210)上电启动流程(BL0-BL2)》,根据例子了解一下上电之后的BL0\BL1\BL2阶段,以及各个阶段的运行位置,功能。
========================================================================================================
一、说明
1、uboot-spl入口说明
通过uboot-spl编译脚本project-X/u-boot/arch/arm/cpu/u-boot-spl.lds
ENTRY(_start)
所以uboot-spl的代码入口函数是_start
对应于路径project-X/u-boot/arch/arm/lib/vector.S的_start,后续就是从这个函数开始分析。
2、CONFIG_SPL_BUILD说明
前面说过,在编译SPL的时候,编译参数会有如下语句:
project-X/u-boot/scripts/Makefile.spl
KBUILD_CPPFLAGS += -DCONFIG_SPL_BUILD
所以说在编译SPL的代码的过程中,CONFIG_SPL_BUILD这个宏是打开的。
uboot-spl和uboot的代码是通用的,其区别就是通过CONFIG_SPL_BUILD宏来进行区分的。
二、uboot-spl需要做的事情
CPU初始刚上电的状态。需要小心的设置好很多状态,包括cpu状态、中断状态、MMU状态等等。
在armv7架构的uboot-spl,主要需要做如下事情
- 关闭中断,svc模式
- 禁用MMU、TLB
- 芯片级、板级的一些初始化操作
- IO初始化
- 时钟
- 内存
- 选项,串口初始化
- 选项,nand flash初始化
- 其他额外的操作
- 加载BL2,跳转到BL2
上述工作,也就是uboot-spl代码流程的核心。
三、代码流程
1、代码整体流程
代码整体流程如下,以下列出来的就是spl核心函数。
_start———–>reset————–>关闭中断
………………………………|
………………………………———->cpu_init_cp15———–>关闭MMU,TLB
………………………………|
………………………………———->cpu_init_crit————->lowlevel_init————->平台级和板级的初始化
………………………………|
………………………………———->_main————–>board_init_f_alloc_reserve & board_init_f_init_reserve & board_init_f———->加载BL2,跳转到BL2
board_init_f执行时已经是C语言环境了。在这里需要结束掉SPL的工作,跳转到BL2中。
2、_start
上述已经说明了_start是整个spl的入口,其代码如下:
arch/arm/lib/vector.S
_start:
#ifdef CONFIG_SYS_DV_NOR_BOOT_CFG
.word CONFIG_SYS_DV_NOR_BOOT_CFG
#endif
b reset
会跳转到reset中。
注意,spl的流程在reset中就应该被结束,也就是说在reset中,就应该转到到BL2,也就是uboot中了。
后面看reset的实现。
3、reset
建议先参考[kernel 启动流程] (第二章)第一阶段之——设置SVC、关闭中断,了解一下为什么要设置SVC、关闭中断以及如何操作。
代码如下:
arch/arm/cpu/armv7/start.S