S5PV210裸板驱动:启动
以往2440和6410的启动方式,只要我们把裸板代码烧写到NAND FLASH的开始位置,当开发板上点启动时,处理器会自动从NAND FLASH上拷贝前面一段的代码到内部的RAM中执行。按照以前的方法,我写了一段汇编代码,如下:
1_ARM/1_start/start.S
#define WTCON 0xE2700000 .text
.align
.global _start _start:
//close the watchdog
ldr r1, =WTCON
mov r0, #
str r0, [r1] loop:
b loop
代码没做什么具体的操作,大致如下:
1.只是将0写入看门狗寄存器0xE2700000,关闭看门狗,如果不关闭看门狗,芯片启动一段时间后就会自己复位。
2.进入死循环loop。
按我们所想,这段程序烧进我们的开发板后,我们也不会看到任何实际的现象,因为他什么都没做,仅仅陷入了死循环。
1_ARM/1_start/Makefile
all:
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-gcc -c start.S -o start.o
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-ld start.o -o start
/usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-objcopy -O binary start start.bin
cp start.bin /fastboot/test.bin
clean:
rm start start.o start.bin
有兴趣学习Makefile的可以上网查看关于Makefile的规则,我这里只是简单带过,用到哪个介绍哪个,具体的命令使用可以百度。
1.arm-none-linux-gnueabi-gcc:将汇编文件编译成.o文件,该命令同样可以将.c文件编译成.o文件,-o参数是指定输出文件的名字。
2.arm-none-linux-gnueabi-ld:将命令参数所带的.o文件链接成elf格式的文件,-o参数是指定输出参数的名字。
3.arm-none-linux-gnueabi-objcopy:将elf格式转化成.bin格式,这个格式可以放在开发板上运行。
当使用命令”make”的时候,就会执行Makefile中all文段的命令,当使用命令”make clean”,就会执行clean文段的命令,删除相关文件
至于烧写的方法,不同的开发板有不同的方法,我开发板的烧写办法是:
1.将一个能正常启动的uboot烧写倒SD卡上。
2.通过SD卡启动,在uboot中,通过fastboot将我自己的镜像烧写到NAND FLSAH的bootloader分区上。
3.选择通过NAND启动,开发板就会加载并且运行我的代码。
但是,我将编译出来的start.bin文件烧写到开发板后,并没有出现我预期的现象,而且会发现,如果我没有将SD卡拔出的情况下,它居然会跑到了SD卡上的uboot,而明明我选择的是从NAND启动。
这段代码我曾在2440和6410上都是可以正常运行的。
这是问什么呢?接下来一一解答。
这是我从《s5pv210_irom_applicationnote_preliminary_20091126.pdf》中拿出来的,它描述了一个系统起来的步骤。一个系统的起来会经过3个步骤:
1.BL0,上图显示IROM的框图。一个芯片上电能够运行起来必须要有两个设备:存放启动代码器件和让代码运行的内存,这分别就是S5PV210自带64K的IROM和 96K的IRAM 。当开发板上电时,芯片就会从IROM中将固化的启动代码放到IROM上运行,而我们将IROM上的代码称为BL0。它主要做一些加载我们自己代码前的一些初始化工作,按上面的描述介绍:
1)关闭看门狗和使能I Cache。
2)初始化堆栈。
3)初始化PLL和系统时钟。
4)通过读取OM几个GPIO管教的高低电平,判断从那个块设备读取代码到IRAM中,接着还需要进行一个校验,如果校验通过就往下走,否则就会从另一个块设备读取代码,直到校验通过,才会做下一个步骤。
5)如果启用了安全模式,还要检查BL1的完整性。
完成以上步骤,BL0就会转跳到BL1的代码处继续运行。
2.BL1,我们的裸板代码就是烧写到这个位置上,但是BL1的大小是有限制的,最大才16KB,这比我们的bootloader的大小要小。在实际的嵌入式开发中,BL1会做一些基本的硬件初始化,初始化内存,并把整个bootloader加载到开发板的内存上,并跳转到新加载代码的位置。
3.BL2,这才是真正bootloader运行的代码,实现了一下bootloader应有的功能。
我们这次的重点是BL0部分,其中步骤5的安全模式我们是没有启动的,而步骤1.2.3是不会影响代码跑不起来的,值得怀疑出问题的地方就在步骤4。
通过检查,OM的6个GPIO管脚是正确的(关于OM管脚的介绍可以查看芯片手册的《BOOTING SEQUENCE 》章节)。而上面也描述了另一个现象:在插有SD卡的情况下,开发板启动了SD卡上的Uboot。
所以,我的代码不能启动的原因大致已经清楚了:在步骤4中,我的代码校验失败,而同时开发板上的SD卡存在,处理器重新在SD卡上读取代码,并通过了校验成功运行起来。
有文档的介绍看出
IRAM的地址是从0xD0020000开始,总大小有96KB,但文档介绍存放BL1代码的位置最大之后16KB,包括BL1的前4个字节。
IRAM的前4个字节是定义用于存放BL1的header info。主要的是0xD0020000地址处存放的BL1大小和0xD00200008地址处的校验和。当BL0加载BL1时,会根据”BL1 size”加载BL1到IRAM上,最大只能加载16KB。加载BL1后,BL0会计算BL1的校验和并且与header info中的”Checksum”比较,如果两个相等才会开始运行BL1的代码。而所谓的校验和,就是计算代码中“1”的个数。
而我的代码,并没有header info那部分,所以启动时就会出错。改正的方法很简单,将编译后的start.bin在处理一下就可以了。
在原来的Makefile基础上再多加两句话:
gcc mkv210_image.c -o mk210
./mk210 start.bin 210.bin
mkv210_image.c是网上的代码,主要的内容就是求出镜像的校验和并放在header info的位置,并将herder info和原来的镜像合并在一起生成一个新的镜像。至于 BL1 size的位置,这个代码的并没有存放BL1的大小进去,但并不影响,因为“BL1 size”处的值已经远远超出了16KB的大小,BL0加载BL1时就只会加载16KB的代码到IRAM上。
上面新加的两条命令先通过gcc将mkv210_image.c编译成可执行文件,接着通过mk210将start.bin和求出的header info整合成新的210.bin。
将新的镜像下载到开发板上,同样没有任何的现象——因为我的代码什么都没做,但在不会发现说启动SD卡上的uboot这种情况。
根据上面BL0的介绍,代码里面的关闭看门狗操作也是多余的。
源码下载到文章原创作者http://blog.chinaunix.net/uid-25014876-id-3544728.html
S5PV210裸板驱动:启动的更多相关文章
- 裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- arm裸板驱动总结(makefile+lds链接脚本+裸板调试)
在裸板2440中,当我们使用nand启动时,2440会自动将前4k字节复制到内部sram中,如下图所示: 然而此时的SDRAM.nandflash的控制时序等都还没初始化,所以我们就只能使用前0~40 ...
- 今天学习的裸板驱动之GPIO实验学习心得
GPIO分成很多组今天学习的这个芯片的GPIO有GPA-GPJ个组.具体可在芯片手册中看到. GPIO有很多寄存器,今天学习的这个芯片,他的寄存器分为以下几种类型: (1)端口控制寄存器 (2)端口数 ...
- s3c2440串口裸板驱动(使用fifo)
使用fifo的好处有: 1:串口的数据发送的数据量较大时,使用fifo可以大大降低MCU的开销.(有点类似串入并出的cput处理模型,本质上还是串行收发) 2:在某些特殊场合,例如制定较复杂的协议时, ...
- 今天学习的裸板驱动之存储控制器心得(初始化SDRAM)
CPU只管操作地址,而有些地址代表的是某些存储设备. 但是操作这些存储设备需要很多东西,比如需要制定bank,行/列地址等.所以就有了存储管理器,用来处理这种CPU操作的地址和存储设备间的转换. (1 ...
- 关于在arm裸板编程时使用printf问题的解决方法
在ARM裸板驱动编程中,是不允许程序直接调用C库程序的.为什么呢?因为此时kernel还没有被加载,所以在封装在kernel层的C库的API是用不了的,那怎么办? 在开发过程中,printf的功能我不 ...
- uboot-tiny4412启动流程(下)----如何将自己的裸板测试程序加入uboot中启动测试
今天在工作上搞了一天高通的芯片uboot程序,目的是希望将一个裸板的程序移植到uboot中,并且开机让它运行.这个芯片是NXP4330,目前是高通的一个芯片,基于ARM-contexA9架构,那么就跟 ...
- 【团购活动】接口最全最好用的S5PV210开发板Sate210-F 开发板开始团购活动了,一起学习linux!
接口最全最好用的S5PV210开发板Sate210-F 开发板开始团购活动了,一起学习linux!http://bbs.eeworld.com.cn/forum.php?mod=viewthread& ...
- 【嵌入式开发】 嵌入式开发工具简介 (裸板调试示例 | 交叉工具链 | Makefile | 链接器脚本 | eclipse JLink 调试环境)
作者 : 韩曙亮 博客地址 : http://blog.csdn.net/shulianghan/article/details/42239705 参考博客 : [嵌入式开发]嵌入式 开发环境 (远 ...
随机推荐
- wamp下php无法保存SESSION问题总汇
由于是在windows 下的iis进行php的环境,所以很多情况下不能像lamp那么简单进行设置.由于工作原因我也遇到很多session无法保存的情况(在wamp下).以下是相信信息的汇总,仅供参考学 ...
- 深入理解 KVC\KVO 实现机制 — KVC
KVC和KVO都属于键值编程而且底层实现机制都是isa-swizzing,所以本来想放在一起讲的.但是篇幅有限所以就分成了两篇博文 KVO实现机制传送门 KVC概述 KVC是Key Value Cod ...
- Python开发的10个小贴士
下面是十个Python中很有用的贴士和技巧.其中一些是初学这门语言常常会犯的错误. 注意:假设我们都用的是Python 3 1. 列表推导式 你有一个list:bag = [1, 2, 3, 4, 5 ...
- Myeclipse 60.激活
Myeclipse 用来开发java web应用是十分的方便的,不过如果没有激活的话,用起来感觉会非常不爽. 当然,个人来说还是非常支持正版的,也鼓励大家支持正版. 好了,下面介绍一下怎么破解Myec ...
- .NET 4.0中的泛型的协变和逆变
转自:http://www.cnblogs.com/jingzhongliumei/archive/2012/07/02/2573149.html 先做点准备工作,定义两个类:Animal类和其子类D ...
- WCF 超时情形
在做WCF开发时,会经常碰到超时的情况,总结了一下,主要是由一下原因引起: 1.客户端没有正确地Close. 确保每次客户端调用完毕之后,就要调用Close,保证连接数. 另外,服务端配置最大连接数: ...
- BZOJ3775 : 点和直线
设第$i$条直线的解析式为$a_ix+b_iy+c_i=0$,$d_i=a_i^2+b_i^2$,则要求一个点$(x,y)$,使得$\sum\left(\frac{\left|a_ix+b_iy+c_ ...
- javascript生成n至m的随机整数
摘要: 本文讲解如何使用js生成n到m间的随机数字,主要目的是为后期的js生成验证码做准备. Math.random()函数返回0和1之间的伪随机数,可能为0,但总是小于1,[0,1) 生成n-m,包 ...
- 【COGS & USACO Training】710. 命名那个数字(hash+水题+dfs)
http://cojs.tk/cogs/problem/problem.php?pid=710 近日开始刷水... 此题我为了练一下hash...但是hash跑得比暴力还慢.. 不言而喻... #in ...
- 【BZOJ】2002: [Hnoi2010]Bounce 弹飞绵羊(lct)
http://www.lydsy.com/JudgeOnline/problem.php?id=2002 (BZOJ挂了,还没在BZOJ测,先是在wikioi测过了,,) 囧.在军训时立志要学lct! ...