资源描述
使 uboot 支持 S3C6410 的 SD 启动2010-4-1 10:46:00这里使用的 uboot 并非 uboot 官方发布的 uboot 代码,而是为三星定制的一个 uboot 版本s3c-u-boot-1.1.6 ,其代码作者就包括了三星的程序员与 denx 的员工。这个版本支持SD 启动,不过默认是 nand 启动,使它支持 uboot 需要做以下事情:nand1、虽然支持 uboot 启动,但是 uboot 代码里不叫 SD 启动方式,而是叫 movinand 启动 方式,在 incluede/configs/smdk6410.h 中就有这个选项,所以在这个文件里关闭 启动,打开 movinand 启动就可以了:/#define CONFIG_BOOT_NOR注释 nand 启动打开 movinand 启动/#define CONFIG_BOOT_NAND#define CONFIG_BOOT_MOVINAND/#define CONFIG_BOOT_ONENAND /#define CONFIG_BOOT_ONENAND_IROM #define CONFIG_NAND /#define CONFIG_ONENAND#define CONFIG_MOVINAND 打开 movinand 选项,使 uboot 支持 movinand 的操作2、如果单纯是做上面的改动,还是不够的,在运行的时候会发现到了一定的时候uboot 就死掉了,其实这是因为 uboot 中假设 SMDK6410 在使用 SD 方式的时候是从 CH0 启 动的,但是手上的这个板子是通过 CH1 启动,那么在运行被复制到 SRAM 中的 8K 代码时 候没办法在 CH0 检测到 SD ,更没办法将 SD 里的代码复制到 SDRAM 中。修改办法是在 incluede/ movi.h 中 HSMMC_CHANNEL 修改为 13、然后如果将上述修改后编译出来的u-boot.bin 通过 IROM_Fusing_tools 直接烧写到SD 中也是没办法启动的,需要运行以下的命令进行处理:cat u-boot.bin >> tempcat u-boot.bin >> tempsplit -b 256k tempmv xaa u-boot_256k.binsplit -b 8k u-boot.binmv xaa u-boot_8k.bincat u-boot_256k.bin >> u-boot_mmc.bincat u-boot_8k.bin >> u-boot_mmc.bin经过这些处理,实际上是将 u-boot.bin 内容重复一次后(为了保证达到 256K ,如果这个 bin 更小,那么可能需要重复 3 次、 4 次,直到超过 256K 为止),将前 256K 制成 u-boot_256k.bin ,再将前 8K 制成 u-boot_8k.bin ,最后将 u-boot_256k.bin +u-boot_8k.bin 合并成一个 256K+8K 大小的文件 u-boot_mmc.bin ,这个文件前 256K 就是 u- boot_256k.bin 而后 8K 就是 u-boot_8k.bin 。把这个 u-boot_mmc.bin 通过 IROM_Fusing_tools 烧写到 SD 卡就可以成功启动系统了。为什么要做这样的处理这个 bin 文件呢?下面通过分析 IROM_Fusing_tools 、 uboot 的 源码来揭示其中的由来。从网上可以下载到 IROM_Fusing_tools 的源码,在按下这个软件的 start 控件后,先是读取这个 SD 卡的第一个扇区,也就是这个磁盘的 MBR 扇区,判断是不是 FAT32 格式的 磁盘(这也是为什么用来做启动的 SD 必须格式化为 FAT32 格式),接着获取总的扇区数目TOTAI_SECOTR,并将所要烧写的 bin文件烧写到磁盘的这个扇区:TOTAL_SECTOR -2 - SIZE_OF_IMAGE/512 。其中 TOTAl_SECTOR 是这个磁盘总的扇区数目; SIZE_OF_IMAGE/512 是这个 bin 文件将要占据的扇区数(这里是以 512 为扇区大小的, 因此对于扇区更大的 SD 卡也就没办法使用了,而现在的大容量 SD 都可能使用了 2K 甚至 4K 的扇区,除非修改这个程序,并同步地在uboot 中修改程序) ;至于 2 则是保留的 2个扇区,至于为什么要保留这 2 个扇区,需要分析 uboot 的源码情况,下面将做进一步 的阐述。在 SD 启动方式下, S3C6410 内部的 IROM 程序 BL0 首先运行,并将 SD 中的最后 18 个扇区开 始的 16 个扇区内容复制到片内的 8K SRAM ,也就是 SteppingStone ,接着跳转到这块 SRAM 的开始地址开始运行,这 8K 的代码实际上就是上面 u-boot_mmc.bin 这个文件的最 后 8K ,也是 u-boot.bin 的最开始 8K 代码,这段代码也叫 BL1 。从 BL0 跳转到 BL1 的时候 uboot 也就接管了 CPU 。Uboot 的入口在 start.S 这个文件, cpu/s3c64x0/start.S 中有这样一段代码:#ifdef CONFIG_BOOT_MOVINANDldr sp, _TEXT_PHY_BASEbl movi_bl2_copyb after_copy#endif这段代码是实现 SD 启动的关键。到了这里后就执行 movi_bl2_copy ,这个函数负责将SD 内的 uboot 完整地复制到 SDRAM ,这时候完整的 uboot 也叫 BL2 ,而这个函数实际上是 调用了以下函数:CopyMovitoMem(HSMMC_CHANNEL, MOVI_BL2_POS, MOVI_BL2_BLKCNT, (uint *) BL2_BASE, MOVI_INIT_REQUIRED);HSMMC_CHANNEL 这是 SD/MMC 通道号,手上板子使用的是 CH1 ,而默认是 CH0 ,所以需要 对这个进行修改。MOVI_BL2_POS 是需要拷贝的数据位于 SD 的起始扇区,其计算办法是这样的,先得到这个SD的总扇区数TOTAL,再减去256K的BL2和8K的BL1所占的扇区数,最后减去0.5K的eFuse和0.5K的保留区所占的扇区数,而这里还定义 SD的扇区为512B。从这里可以看到和 IROM_Fusing_tools 对 SD 卡的处理是完全对应的。这里还有一个问题,总扇区数 TOTAL 是如何得到的?从程序来看是从 (TCM_BASE - 0x4) 这个地址读取到的,至于TOTAL 是如何被放到这里的就只能从 BL0 的代码找答案了。MOVI_BL2_BLKCNT 是需要复制的扇区数目这里就是定义为256K,这也是为什么必须把 u-boot.bin 转换成 256K 的文件。BL2_BASE 是目的地址,也就是 SDRAM 中的地址。这里定义为 0x57E00000 ,就是 128M 的SDRAM的最后2M,因为到这里为止 MMU尚未打开,因此这里使用的是物理地址。MOVI_INIT_REQUIRED 这个参数的意义是什么暂时没有任何资料说明。而 CopyMovitoMem 这个函数的定义是这样的:#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 ,至于这个地址放的是什么,也没资料说明。当复制完 BL2 后便会跳转到 BL2 的 start_armboot 这个 C 语言函数中运行了,此后的运行 过程就不需要再分析了
展开阅读全文