硬件平台:NUC972
uboot版本:2013.4
第一阶段:编译nand_spl,引导uboot,宏CONFIG_NAND_SPL打开。
//arch/arm/cpu/arm926ejs/start.S
.globl _TEXT_BASE
_TEXT_BASE:
.word CONFIG_SYS_TEXT_BASE
//宏CONFIG_SYS_TEXT_BASE 在两个阶段都有,只是定义不同。
reset:
//进入管理模式
call_board_init_f:
//设置堆栈
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)//两阶段都有,定义不同
bl board_init_f
//nand_spl/board/nuvoton/nuv970evb/nuc970_nand_spl.c
void board_init_f()
{
//初始化串口
nand_boot();
}
void nand_boot()
{
board_nand_init(&nand_chip);//初始化nand flash ,获取页大小
nand_load()//加载uboot
跳到uboot加载地址,这里是0xe00000
}
第二阶段uboot启动:
reset:
bl cpu_init_crit //设置cpu,mmu,disable interupt
bl _main//arch/arm/lib/crt0.S
//arch/arm/lib/crt0.S
_main:
ldr sp, =(CONFIG_SYS_INIT_SP_ADDR)
sub sp,#GD_SIZE
mov r8,sp//r8指向全局指针gd,
bl board_init_f //arch/arm/lib/board.c
//arch/arm/lib/board.c
void board_init_f(ulong bootflag):bootflag(0)
{
gd->mon_len = _bss_end_ofs;//实际上是uboot镜像大小
//初始化硬件
for (init_fnc_ptr = init_sequence; *init_fnc_ptr; ++init_fnc_ptr) {
if ((*init_fnc_ptr)() != 0) {
hang ();
}
}
}
init_fnc_t *init_sequence[] = {
board_early_init_f,//board/$board//开启uart,timer,gpio时钟
}