本帖最后由 q15920078530 于 2015-8-28 22:21 编辑
【OK210试用体验】u-boot篇 -- SPL移植(续)
做好的准备工作,知道了u-boot的启动走向,对接下来的移植就比较方便了。
移植涉及到的文件:
Makefile
board/samsung/smdkv210/smdkv210.c
arch/arm/include/asm/arch-s5pc1xx/cpu.h
include/configs/smdkv210.h
board/samsung/smdkv210/lowlevel_init.S
spl/Makefile
arch/arm/lib/crt0.S
arch/arm/include/asm/arch-s5pc1xx/clock.h
arch/arm/include/asm/arch-s5pc1xx/dmc.h
首先,为了方便以后编译,在顶层的Makefile文件中添加交叉编译器信息:
这里用SPL的方式,所以要在include/configs/smdkv210.h中添加宏定义,来关联编译。
在S5PC110版本中,肯定有相关的寄存器定义,这里把其改成S5PV210的版本,毕竟自己定义了单板信息smdkv210。在arch/arm/include/asm/arch-s5pc1xx/cpu.h中,增加这些寄存器的定义:
这里参考的模板是位于同个文件下的S5PC110版本。S5PC110和S5PV210除了封装体积,其他的一模一样,只是应用在不同环境下而已。
在 board/samsung/smdkv210/lowlevel_init.S中的代码是对硬件的初始化,这里为了方方便些,直接用裸机程序上写好的代码,直接应用,当然,应用的也是C语言的代码,但是对于S5PV210这里强大的CPU来说,这点性能开销也不算什么。有兴趣的可以用汇编代码来添加自己板子的初始化,提高效率。这里对系统时钟和RAM做初始化。
通过宏可以有效的区分好不同的编译情况和输出文件的内容。这里用一个宏来检测是否被编译,在board/samsung/smdkv210/smdkv210.c中添加: 这里也做修改:
最后记得#endif。
要对clock和ddr做初始化,要有实现的代码,在arch/arm/include/asm/arch-s5pc1xx/clock.h中有对clock初始化的相关寄存器定义和代码,这里的寄存器同样参照S5PC110的版本改成S5PV210的版本
。
在board/samsung/smdkv210/smdkv210.c中添加实现包含的头文件。
clock_init在board/samsung/smdkv210/smdkv210.c中来实现。
在arch/arm/include/asm/arch-s5pc1xx/cpu.h中修改一个在clock_init中有用到的编译宏信息:
同理,可以完成ddr_init的相关操作,dmc.h需要新创建。
在arch/arm/lib/crt0.S中有对栈的设置,因为u-boot-spl.bin的代码相当小,SRAM提供的栈空间已经足够了,所以这里屏蔽掉栈的设置,做如下修改:
这里有CONFIG_SYS_SDRAM_BASE在include/configs/smdkv210.h中,可以把地址修改成另外合理的地址。
完成了这些初始化的实现,还要完成将BL2的代码拷贝到RAM中运行的代码,这个也是根据裸机程序中的重定位代码,直接使用即可。在board/samsung/smdkv210/smdkv210.c中添加代码。
最后,还需要为u-boot-spl.bin添加头信息,在spl/Makefile中做修改
头信息工具和命令脚本这里借用友善之臂提供的:
将工具addheader.c编译生成addheader,拷贝到tools目录下,改名为mksmdkv210spl.
OK,编译,即可生成 .bin 文件,烧到SD卡上,然后用SD卡启动即可。