对于普通的SD卡,我有个2g的sd卡,拿它作为例子:
(1)使用本站提供的windows工具完全格式化一次你的sd卡
(2)进到ubuntu的环境下查看SD卡扇区数量:
zswan@zswan-laptop-ubuntu:~/tmp$ sudo fdisk /dev/sdb1
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): p
Disk /dev/sdb1: 2059 MB, 2059278848 bytes
64 heads, 62 sectors/track, 1013 cylinders
Units = cylinders of 3968 * 512 = 2031616 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
计算扇区数量:
2059278848/512 = 4022029个扇区,按图1的结构,BL1应该烧写在第4022029-18=4022011个扇区当中。BL2应该烧写在第(4022011-BL2扇区数)的中。
飞凌提供的MMC启动的bin文件,其实就是个支持SD卡的uboot,其结构是这样的:
所以为了一次性烧写方便,MMC.bin其实应该是BL2的代码,BL2的前8k字节作为BL1的代码。但是由于BL2,BL1是分着烧写的,不大方便,所以干脆在BL2的后面再附上一个BL1的相同代码,这样结合出来的mmc.bin,我只需要把它烧写到:4022029-2-560(mmc.bin为280k=560个扇区)= 4021467起始的扇区中去,就可以了。
烧写方法:
Ubuntu环境下:
sudo dd of=/dev/sdb1 if=./mmc.bin count=560 seek=4021467
这样就可以了。
SDHC的类同,只是总的扇区数减去(1026+560)才是mmc bin烧写的位置。
(二)
拷贝的过程
BL1被拷贝到8k的steppingstone中这个是硬件就做好了的。但是BL2被拷贝到SDRAM中是BL1中的代码实现的。在BL1中也使用了IROM硬件code定义好了的copyMMCtoMEM函数,直接从MMC中拷贝BL2的代码。
两次拷贝执行完后MMC.BIN作为一个完整的uboot就已经被拷贝到SDRAM中了。
在ok6410的开发板上,SD卡boot主要的作用就是启动mmc.BIN的uboot去初始化NAND,把保存在sd
中的uboot.bin, zImage拷贝到内存中,然后写进NAND中,是为了从NANDboot做准备的。