移植的是从SD卡启动的,版本2012.10,我们需要最终生成uboot-spl.bin和uboot.bin分别写入SD卡的1扇区和49扇区,前面是BL1阶段后面是BL2阶段,查看spl和uboot都是从start.S这个入口点进入的,主要做一下这两个从start.S开始后分支的路线。
首先看spl的start.S的程序流程是如何的,当有疑惑的时候需要分析一下Makefile,start.S中有宏定义CONFIG_SPL_BUILD来控制程序是在spl中被编译链接还是在uboot中被编译链接。
set the cpu to SVC32 mode
↓
cpu_init_cp15
↓
cpu_init_crit -----> lowlevel_init(board/samsung/smart210/lowlevel_init.S)
↓
board_init_f -----> (u-boot-2012.10\arch\arm\lib\ spl.c)
↓ (如果没有被重定义)
board_init_r -----> (u-boot-2012.10\u-boot-2012.10\common\spl\spl.c)
关键就在 board_init_f 这个函数了,这个函数在u-boot-2012.10\arch\arm\lib中的board.c 和 spl.c当中都有定义,到底是哪个呢?看文件名其实都可以知道uboot-spl.bin当然需要的是spl.c中的board_init_f ,我们可以再从当前目录下的Makefile来区分
ifndef CONFIG_SPL_BUILD
COBJS-y += board.o
COBJS-y += bootm.o
COBJS-$(CONFIG_SYS_L2_PL310) += cache-pl310.o
COBJS-y += interrupts.o
COBJS-y += reset.o
SOBJS-$(CONFIG_USE_ARCH_MEMSET) += memset.o
SOBJS-$(CONFIG_USE_ARCH_MEMCPY) += memcpy.o
else
COBJS-$(CONFIG_SPL_FRAMEWORK) += spl.o
endif
很明显由于定义了CONFIG_SPL_BUILD,start.S会链接spl.o中的
board_init_f ,而不是board.o中的,当然前提是在smart210.h中定义了CONFIG_SPL_FRAMEWORK。
在spl.c中的board_init_f 前有个注释
/*
* In the context of SPL, board_init_f must ensure that any clocks/etc for
* DDR are enabled, ensure that the stack pointer is valid, clear the BSS
* and call board_init_f. We provide this version by default but mark it
* as __weak to allow for platforms to do this in their own way if needed.
*/
注释中前面的要求我们在lowlevel_init中都已经完成了,最后说这个函数被默认定义为一个弱函数,我们自己可以重新定义。我们可以重写这个函数,
在里面完成uboot从SD卡到SDRAM的拷贝,然后跳到SDRAM中的uboot执行,这样的话start.S中的relocate_code就需要被注释掉,因为我们自己完
成了重定向,我目前是把它重写了。如果不重写board_init_f ,就按照spl.c中的继续执行common/spl/spl.c中的void board_init_r(gd_t *dummy1, ulong dummy2),
后面的流程等我调好了自己定义的board_init_f再来补充。
uboot.bin的start.S流程
set the cpu to SVC32 mode
↓
board_init_f -----> (u-boot-2012.10\arch\arm\lib\ board.c)
↓relocate_code被我注释掉了
board_init_r -----> (u-boot-2012.10\arch\arm\lib\ board.c)