您的位置:首页 > 其它

210学习日记(2) --工欲善其事,必先利其器

2012-10-29 19:04 197 查看
一,如何下载裸机程序到开发板(刚拿到开发板的时候,为这事儿犯愁好几天):

1.下载裸机程序到SD卡:

1). PC上执行ls /dev/sd*,得到:

/dev/sda /dev/sda1 /dev/sda2

2). 插入带有SD卡的读卡器到PC,PC再次上执行ls /dev/sd*,得到:

/dev/sda /dev/sda1 /dev/sda2 /dev/sdb /dev/sdb1

从而说明我的sd卡对应的设备文件是/dev/sdb;

3). PC上执行dd iflag=dsync oflag=dsync if=sd-wy.bin of=/dev/sdb seek=1下载sd-wy.bin文件到SD卡,

dd命令用于对SD进行烧写,根据三星手册《S5PV210_iROM_ApplicationNote_Preliminary_20091126》,将sd-wy.bin烧写到SD卡的第一个Block,保留第0个block不用,每个block=512B。

2. 用上述方法下载u-boot到SD卡:

1). 支持Tiny210的u-boot源码可以从http://blog.csdn.net/liukun321/article/details/7438880处获得,我表示该博主才是真正的高手;

2). 编译u-boot(记得修改Makefile中的CROSS_COMPILE ?= arm-linux-)得到tiny210-uboot.bin,并下载;

3. 用u-boot的命令再烧写程序到nand flash(我想大家都应该知道怎么做了,我就不啰嗦了),注意,该u-boot对nand的读写是开启了8bit硬件ECC校验的;

二,写一个流水灯,体验一下烧写过程:

以下为start.s:

.global _start

_start:

ldr sp, =0xD0030000 /* 设置栈(地址位于IRAM中),调用C函数的时候,会用到栈 */

b mymain /* 调用C函数 */

问:在写s3c2440的程序的时候,会关闭看门狗,为什么这里不做这样的操作呢?

答:查看s5pv210的芯片手册的"BOOTING SEQUENCE"可得得知程序上电时,最先从内部的IROM开始里执行(里面固话了代码),会做关闭看门狗,设置时钟,拷贝外部存储器(如SD,NAND)的数据到IRAM中,详细信息会在下面的启动流程中介绍。

以下为main.c:

#define GPJ2CON (*(volatile unsigned int *)0xe0200280)

#define GPJ2DAT (*(volatile unsigned int *)0xe0200284)

#define GPH2CON (*(volatile unsigned int *)0xE0200C40)

#define GPH2DAT (*(volatile unsigned int *)0xE0200C44)

void delay()

{

volatile int i = 0x100000;

while (i--);

}

int main(void)

{

int i = 0;

/* 配置GPJ2_0为输出引脚 */

GPJ2CON = 0x1111;

while (1)

{

GPJ2DAT = i;

i++;

if (i == 16)

i = 0;

delay();

}

return 0;

}

我想大家都应该会写Makefile吧,我这里就不上Makefile的代码了。编译之后,将生成一个bin文件,我这里是led_c.bin文件。注意,该bin文件还不能够直接在开发板上面运行,后面会解释为什么。

在led_c.bin的同一目录下面执行:

./mktiny210spl.exe led_c.bin leds.bin,生成leds.bin后,可以用上述烧写的办法烧写到开发板直接运行。

问:mktiny210spl.exe是什么?

答:mktiny210spl.exe只是编译u-boot的时候,同时生成的一个工具而已。该工具是怎么制作的,我会在后面的日志中讲述。

问:mktiny210spl.exe有什么用?

答:对比led_c.bin和leds.bin的反汇编文件后发现,leds.bin的反汇编只比led_c.bin的反汇编多出四行信息,类容如下:

00000000 <.data>:

0: 43503553 cmpmi r0, #348127232 ; 0x14c00000

4: 20303131 eorscs r3, r0, r1, lsr r1

8: 00002034 andeq r2, r0, r4, lsr r0

c: 20205245 eorcs r5, r0, r5, asr #4

对上述内容解析:

---------------------------------------------

0x0地址:BL1 size

---------------------------------------------

0x4地址:必须设置为0 (是规定)

---------------------------------------------

0x8地址:CheckSum

---------------------------------------------

0xc地址:必须设置为0 (是规定)

---------------------------------------------

进一步解析:

BL1 size:就是用于告诉IROM中的代码,需要从外部存储器中(SD,Nand等)拷贝多大的数据到IRAM中,最多16K;

CheckSum:用作校验,当IROM将数据往IRAM拷贝完以后,会自动生成一个“校验数据”,然后会让该“校验数据”和CheckSum进行比较。

注意:

这四行信息是如何生成的,我会在后面讲到!!

问:看了这么久的学习日记了,心中肯定最想知道的就是s5pv210的启动流程吧,那么是什么呢?

答:以下是一般情况下(上电,复位)的启动流程:

开发板一上电,将从0地址开始执行,即从内部的IROM(出厂时,已经固化了代码)中开始执行:

1).关闭看门狗;

2).初始化Cache;

3).判断是否是一般情况的启动;

4).初始化堆;

5).判断是什么启动(SD卡启动,NAND启动等);

6).从外部存储器拷贝BL1 size那么大的数据到IRAM中;

7).CheckSum检测;

8).如果检测成功,跳到0xD0020010地址处,开始执行IRAM中的代码。

注意:记住0xD0020010这个地址,以后会用到。

注:

如有问题,请到韦东山LINUX视频讨论群里面,我们一起讨论学习,或者加我QQ:317312379
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: