这儿运用 的uboot并非uboot官方揭晓的uboot代码,而是为三星定制的一个uboot版别s3c-u-boot-1.1.6,其代码作者就包含了三星的程序员与denx的职工。这个版别支撑 SD发动,不过默许是nand发动,使它支撑 uboot需要 做以下工作:
1、
//#define CONFIG_BOOT_NOR
//#define CONFIG_BOOT_NAND
#define CONFIG_BOOT_MOVINAND
//#define CONFIG_BOOT_ONENAND
//#define CONFIG_BOOT_ONENAND_IROM
#define
//#define CONFIG_ONENAND
#define CONFIG_MOVINAND
2、假定 单纯是做上面的改动,依旧 不行的,在运转的时间 会发觉 到了有必要 的时间 uboot就死掉了,原本这是由于uboot中假定SMDK6410在运用 SD方式 的时间 是从CH0发动的,可是手上的这个板子是议定 CH1发动,那么在运转被仿制到SRAM中的8K代码时间 没方法 在CH0检测到SD,更没方法 将SD 里的代码仿制到SDRAM中。修正方法 是在incluede/
movi.h中HSMMC_CHANNEL修正为1。
3、然后假定 将上述修正后编译出来的u-boot.bin议定 IROM_Fusing_tools直接烧写到SD中也是没方法发动的,需要 运转以下的指令实施 处理:
cat u-boot.bin >> temp
cat u-boot.bin >> temp
split -b 256k temp
mv xaa u-boot_256k.bin
split -b 8k u-boot.bin
mv xaa u-boot_8k.bin
cat u-boot_256k.bin >> u-boot_mmc.bin
cat 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格局),接着获取总的扇区数目TOTAl_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_MOVINAND
ldr
bl
b
#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 是需要 copy 的数据坐落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)
这个解说实际上是调用了坐落TCM_BASE + 0x8这个地址的函数指针,其间TCM_BASE的值为0x0C004000,至于这个地址放的是什么,也没材料标明 。
当仿制完BL2后便会跳转到BL2的start_armboot这个C言语函数中运转了,尔后的运转流程 就不需要 再分析了。