u-boot-mini6410-20111018 是 friendlyarm 根据 samsung 提供的 u-boot 修改而来的,可以支持 NAND 启动 和 IROM + SD 启动。
1.探索 IROM + SD 启动
在 u-boot 中 SD 卡又叫做 MoviNand,如果要从 IROM + SD 启动,需要在 include/configs/mini6410.h 中定义 CONFIG_BOOT_MOVINAND 宏,相应地在 cpu/s3c64xx/start.S 中使用如下代码完成代码的拷贝。
#ifdef CONFIG_BOOT_MOVINAND
ldr sp, _TEXT_PHY_BASE
bl movi_bl2_copy
b after_copy
#endif
movi_bl2_copy 负责将 SD 卡内的 BL2 代码复制到 DDR,BL2 包含了整个 u-boot 代码,movi_bl2_copy 实际上是调用了 CopyMovitoMem。
CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *)BL2_BASE, MOVI_INIT_REQUIRED);
HSMMC_CHANNEL:SD/MMC 通道号。
MOVI_BL2_POS:数据的源地址,即 BL2 代码在 SD 卡中的起始地址,必须以 block(扇区) 为单位。
MOVI_BL2_BLKCNT:需要复制的 blocks(扇区数目)。
BL2_BASE:数据的目的地址,也就是 DDR 中的地址。
MOVI_INIT_REQUIRED:是否需要重新初始化,一般设为 0 即可。
CopyMovitoMem 的定义在 /include/movi.h 中:
#define CopyMovitoMem(a,b,c,d,e) (((int(*)(int, uint, ushort, uint *, int))(*((uint *)(TCM_BASE + 0x8))))(a,b,c,d,e))
这个定义实际上是调用了位于 TCM_BASE + 0x8 这个地址的函数指针(TCM_BASE 的值为 0x0C004000),这是 samsung 在 S3C6410 片内实现的代码。
2.编译 u-boot-mini6410-20111018
# make mini6410_sd_config-ram256
# make
3.制作适合 IROM + SD 启动的 u-boot
编译出来的 u-boot.bin 并不能直接用于 SD 启动,因为 SD 卡启动对代码的存放位置有一定的要求。
从 u-boot 的源代码中可以知道 BL2 = 256K(u-boot) + 128K(param),而编译出来的 u-boot 实际上只有 192K,因此需要手动填充无用数据。
1.分离前面 8K 启动代码:
# split -b 8k u-boot.bin
# mv xaa u-boot-8k.bin
# rm xa*
2.扩充 u-boot 至少到 256K + 128K = 384K
# cp u-boot.bin abc.bin
# cat abc.bin >> u-boot.bin //刚好 384K
3.合并
# cat u-boot-8k.bin >> u-boot.bin
最终生成的 u-boot.bin 就是我们想要的,为了方便管理可以将其重命名为 u-boot-sd.bin。
——忠于梦想 勇于实践 linux_xpj@opencores.org
阅读(363) | 评论(0) | 转发(0) |