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
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
相关文章推荐
- MatLab工程领域的利器-----工欲善其事,必先利其器
- 工欲善其事,必先利其器.
- 工欲善其事,必先利其器——图文并茂详解VisualStudio使用技巧一
- eclipse技巧 工欲善其事,必先利其器
- 工欲善其事,必先利其器
- PHP学习之路――工欲善其事,必先利其器(Zend配置)
- 工欲善其事,必先利其器系列--Netbeans之远程开发
- 工欲善其事,必先利其器--vim-tips
- 项目管理实践教程一、工欲善其事,必先利其器【Basic Tools】
- 工欲善其事,必先利其器
- 第一章 工欲善其事 必先利其器—Android SDK工具(6)
- 工欲善其事,必先利其器:分享一套Code Smith 搭建N层架构模板
- MySQL优化—工欲善其事,必先利其器之EXPLAIN
- 转: NetBean 远程开发的好文2 --> 工欲善其事,必先利其器系列--Netbeans之远程开发
- 工欲善其事-必先利其器之终端
- (工欲善其事,必先利其器)eclipse 快捷键
- 菜鸟学Python(1):工欲善其事,必先利其器
- 工欲善其事,必先利其器——VC2005的常用快捷键(来自http://www.cppblog.com/corelito/archive/2008/10/17/64233.html)