首先必须弄清楚S3C6410关于SD启动的整个过程。
再来谈移植:
1.把movi.h文件放在include目录下。
2.把movi_boot.c放在/nand_spl目录下并创建链接,把链接放到/nand_spl/board/samsung/smdk6410目录下并修改该目录下的Makefile
2.1 增加movi_boot.o
COBJS = nand_boot.o nand_ecc.o s3c64xx.o smdk6410_nand_spl.o nand_base.o movi_boot.o
2.2 指明movi_boot.c路径
$(obj)movi_boot.c:
@rm -f $@
@ln -s $(TOPDIR)/nand_spl/movi_boot.c $@
3.增加宏定义#define CONFIG_MOVINAND到smdk6410.h(include/configs)
4.Start.s在程序中nand_boot这里添加movi_boot的代码,如下:
#ifdef CONFIG_NAND_SPL
#ifdef CONFIG_MOVINAND
ldr sp, _TEXT_PHY_BASE
blmovi_bl2_copy
bafter_copy
after_copy:
ldr pc,_TEXT_PHY_BASE
#endif
ldrsp, =(CONFIG_SYS_INIT_SP_ADDR)
bicsp, sp, #7 /* 8-byte alignment for ABI compliance */
ldr r0,_nand_boot
mov pc, r0
_nand_boot: .word nand_boot
#else
......
#endif
编译可能提示movi_bl2_copy没有定义,我是把它声明在include目录下的nand.h里面:
#ifdef CONFIG_MOVINAND
void movi_bl2_copy(void);//__attribute__((noreturn))
#endif
也可以把它放在common.h里面。
OK,编译应该可以通过了,接下来制作u-boot-mmc.nb0用于烧录到SD卡中:
5.u-boot-mmc.nb0的制作方法
5.1先制作一个512K的u-boot.bin,这个就是用在SDRAM中运行的,因此原材料自然就是主目录下的
u-boot.bin. 可能我们编译好的u-boot.bin并没有512K这么大,那么可以采用“复制”或“拼接”的方法做一个512k的bin:
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 512k temp
mv xaa u-boot_512k.bin
5.2 再制作一个8k的u-boot.bin,这个是BL1阶段运行的,所以原料必须是在nand_spl下u-boot_spl-16k.bin
cat nand_spl/u-boot-spl-16k.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 8k temp
mv xaa u-boot_8k.bin
5.3我们还需要一个16K的"空白"bin,就是上面出现的那个movi-env-zero-16k.bin
5.4把这几个bin合并起来就是u-boot-mmc.nb0啦:
cat u-boot_512k.bin >> u-boot_mmc.nb0
cat movi-env-zero-16k.bin >> u-boot_mmc.nb0
cat u-boot_8k.bin >> u-boot_mmc.nb0
嫌上面步骤多手工输入麻烦?那么,就在主目录下建立一个文件,随便命名比:u2mmc
编辑这个文件内容如下:
#!/bin/sh
rm -rf u-boot_mmc.bin
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat u-boot.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 512k temp
mv xaa u-boot_512k.bin
rm -f temp x*
cat nand_spl/u-boot-spl-16k.bin >> temp
cat movi-env-zero-16k.bin >> temp
split -b 8k temp
mv xaa u-boot_8k.bin
rm -f temp x*
cat u-boot_512k.bin >> u-boot_mmc.bin
cat movi-env-zero-16k.bin >> u-boot_mmc.bin
cat u-boot_8k.bin >> u-boot_mmc.bin
rm -rf u-boot_512k.bin u-boot_8k.bin
这样我们每次
root@ubuntu:/home/my/u-boot-2012.10# make
完后再
root@ubuntu:/home/my/u-boot-2012.10# ./u2mmc
就制作好u-boot_mmc.nb0文件了,把它烧录到SD卡中,然后从SD启动试试看你的U-boot有没有运行起来.
最后说明一下为什么第一个u-boot是512K,中间为何有个16K的“0X00”?其实这2个都是根据系统的配置而定的,也就是说,系统配置不同,这两个地方的大小就会不同。
其中512K是这样来的:
(include/movi.h)#define PART_SIZE_BL (512 * 1024)
而16K的"0x00"是这个:
(include/configs/smdk6410.h)#define CONFIG_ENV_SIZE 0x4000