友善之臂smart210 uboot移植过程中的体会
2014-02-20 10:54
405 查看
移植的是从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来区分
在spl.c中的board_init_f 前有个注释
注释中前面的要求我们在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)
首先看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 U-Boot移植 之Readme文件分析 (基于u-boot-2015.07)
- Tiny210 s5pv210 uboot移植(编译过程)
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——配置过程(三)
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——配置过程(二)
- Qt-5.3.2 在友善Smart210开发板的移植记录
- Qt-5.3.2 在友善Smart210开发板的移植记录
- 友善micro2440(s3c2440) U-boot移植过程
- Qt-5.3.2 在友善Smart210开发板的移植记录
- tiny210(s5pv210)移植u-boot(基于 2014.4 版本)——配置过程(二)
- tiny210 android 移植过程中的几个问题
- 嵌入式linux开发uboot移植(三)——uboot启动过程源码分析
- 转让:友善之臂Cortex-A8 Smart210开发板
- Tiny210(S5PV210) U-BOOT(一)----启动过程
- U-BOOT移植过程详解: SPL
- QT210,U-Boot移植(2)
- U-boot移植过程
- u-boot在s3c2410开发板上移植(NAND Flash Boot)过程
- u-boot移植编译过程
- 移植u-boot1.1.6到友善mini2440学习笔记之环境搭建(系列之一)
- 移植U-Boot-2008.10到友善之臂mini2440(五)