主机平台: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卡的位置

启动流程:

es一G内存多少分片_GEC210

由上图可以看出,在执行完以固化好的IROM里的程序后,将复制启动设备的BL1到内存里运行。所以需要知道BL1的位置:

es一G内存多少分片_GEC210_02

这里可以清楚看出BL1的起始地址位置是SD卡的第一扇区处(512字节)。此外,在S5PV210中,BL1大小为8k,也就是说你的裸机程序不能超过8k,否则就要将代码复制到BL2在运行。为了简化问题,假设程序是小于8k的。


2.为二进制代码添加16字节的头信息

es一G内存多少分片_GEC210_03

第一个字段为包括头信息的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中的位置

es一G内存多少分片_es一G内存多少分片_04

也就是说,代码放在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 相同