友善之臂smart210 uboot移植过程中的体会

移植的是从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)



你可能感兴趣的:(smart210,s5pv210,u-boot)