主机平台:Linux CentOS 6.5
arm平台:粤嵌GEC210开发板(S5PV210)
注:以下方法与S5PV210的启动流程有关,具体请参考“S5PV210_UM_REV1.1“和“S5PV210_iROM_ApplicationNote_Preliminary_20091126”这两本数据手册,也因此,在某些地方可能只适用于S5PV210,其它的芯片请参照相关的数据手册。
总体步骤:
SD卡:
1.编译程序
2.添加16字节的头信息,包括计算长度字段和校检和字段
3.将二进制文件以第二个扇区(512字节处)为起始地址写入SD卡
flash:
1.编译程序
2.添加16字节的头信息,长度字段为0x2000,校捡和字段随意(这样填写是因为当用fastboot烧写代码到flash时,会自动计算 0x2000字节的校检和并填入校检和字段中)
3.烧写代码到flash中
具体步骤
SD卡:
1.将裸机程序写入SD卡,需要了解SD卡的启动流程以及代码在SD卡的位置
启动流程:
由上图可以看出,在执行完以固化好的IROM里的程序后,将复制启动设备的BL1到内存里运行。所以需要知道BL1的位置:
这里可以清楚看出BL1的起始地址位置是SD卡的第一扇区处(512字节)。此外,在S5PV210中,BL1大小为8k,也就是说你的裸机程序不能超过8k,否则就要将代码复制到BL2在运行。为了简化问题,假设程序是小于8k的。
2.为二进制代码添加16字节的头信息
第一个字段为包括头信息的BL1大小
第三个字段为校检和,计算方式:
for(count=0;count< dataLength;count+=1)
{
buffer = (*(volatile u8*)(uBlAddr+count));
checkSum = checkSum + buffer;
}
其余两个字段为0
3.将二进制代码写入SD卡
这里的方法有很多:
(1)在linux下使用dd命令
(2)在windows下使用dd_for_windows工具
(3)在windows下使用IROM_Fusing_Tool工具
(4)通过uboot,用dnw命令将代码写入内存,再用mmc write 写入SD卡
这里用的是第(4)种方法
4.然后是写入过程:
(1)启动uboot
(2)用dnw工具将二进制文件写入内存,假设是0xc0000000
(3)用mmc list查看可用的mmc设备
GEC210 # mmc list
S3C_HSMMC0_dev0
S3C_HSMMC2_dev1
(4)通过mmc write 写入
GEC210 # mmc write S3C_HSMMC2_dev1 0xc0000000 0x1 0x10
MMC write: dev # 0, block # 1, count 16 ... 16 blocks written: OK
mmcwrite参数:
设备标识:可由mmc list获得,不知到SD卡对应那个标识的话可以逐个试
内存读取起始地址:从内存中哪个地址开始读取,此处是0xc0000000
SD卡写入起始扇区号:扇区号从0开始,有前面可知,写入的起始扇区号为1,所以此处为0x1
读取的扇区数:可根据程序长度设定,也可以直接写BL1的大小,BL1大小为8k,即16ge扇区,也就是0x10
若出现:16 blocks written :OK 表示写入成功
flash:
1.代码在flash中的位置
也就是说,代码放在flash最前面就可以了
2.添加头信息
注意了,这里的头信息和SD卡时不同,代码长度字段必须为0x2000,校检和字段不用算,随便填,烧写时会自动计算的
3.烧写代码
有两种烧写方法:
用fastboot工具烧写(需要先下载fastboot工具,过程较简单)
(1)启动开发板上的uboot,执行fastboot命令
(2)在linux下,执行fastboot flash uboot <二进制文件>
arm:
GEC210 # fastboot
Fastboot: employ default partition information
[Partition table on NAND]
ptn 0 name='uboot' start=0x0 len=0x100000(~1024KB)
ptn 1 name='recovery' start=0x100000 len=0x500000(~5120KB)
ptn 2 name='kernel' start=0x600000 len=0x500000(~5120KB)
ptn 3 name='ramdisk' start=0xB00000 len=0x300000(~3072KB)
ptn 4 name='system' start=0xE00000 len=N/A (Yaffs)
//<span style="font-size:14px;">在linux下执行fastboot后会出现下面信息
</span>Received 17 bytes: download:0006c000
Starting download of 442368 bytes
downloading of 442368 bytes finished
Received 11 bytes: flash:uboot
flashing 'uboot'
NAND erase: device 0 offset 0x0, size 0x100000
Erasing at 0xe0000 -- 100% complete.
OK
NAND write: device 0 offset 0x0, size 0x80000
Main area write (4 blocks):
524288 bytes written: OK
partition 'uboot' flashed
linu
x:
# fastboot flash uboot u-boot-yaffs-4.3Inch.bin
sending 'uboot' (432 KB)... OKAY
writing 'uboot'... OKAY
用dnw和nand write 命令(不需要fastboot,但比较麻烦)
(1)用dnw将二进制文件写入内存,假设为0xc0000000
(2)用nand erase擦除数据:nand erase 0x0 0x20000
用法:nand erase<起始地址> <字节数>
注意:<起始地址><字节数> 在这两个参数必须要与block对齐,这里的block大小为0x20000字节,所以字节数最小也要填写0x20000
(3)用nand write写入:nand write 0xc0000000 0x0 0x20000
第一个参数为要烧写的数据在内存中的起始地址,后面的两个参数与nand erase 相同