搜索
bottom↓
回复: 68

S3C6410制作SD启动卡以及简易SDbootloader的方法

[复制链接]

出0入0汤圆

发表于 2009-7-22 22:49:06 | 显示全部楼层 |阅读模式
S3C6410出来有一段时间了,它可以用SD卡来启动系统,但由于三星对S3C6410的开发资料严格保密,很少有人知道如何制作SD启动卡。这里公开一下djyos的SDbootloader的制作和使用方法,其中包含SD启动卡的制作方法,以及执行裸奔程序的方法。
因图比较多,偷一下懒吧,贴上pdf文件,请大家下载阅读,不便之处请谅解。
点击此处下载说明文档: ourdev_463611.pdf(文件大小:670K) (原文件名:SDbootloader使用说明.pdf)

点击此处下载源码: ourdev_463613.zip(文件大小:73K) (原文件名:sdboot6410.zip)

因没有资料,制作SDbootloader的过程费了很多周折,下面跟帖连载之。

阿莫论坛20周年了!感谢大家的支持与爱护!!

一只鸟敢站在脆弱的枝条上歇脚,它依仗的不是枝条不会断,而是自己有翅膀,会飞。

出0入0汤圆

 楼主| 发表于 2009-7-22 22:51:52 | 显示全部楼层
应深圳友坚科技之邀,这几天要把djyos移植到他们的idea6410上。
    现在发布的是si版本,是以单片机模式运行的,S3C6410这样强劲的cpu,运行si版本,就作为高速单片机用了,所有地址都是按照物理地址一一对应映射。cpu的状态也没有区分内核态和用户态。
1、中断引擎最初的部分代码在IRQ态(还没决定是否使用FIQ)。
2、中断引擎的大部分以及用户ISR运行在SVC态。
3、所有其他代码运行在SYS态。
    移植碰到的第一个问题就是烧录代码到flash的问题,由于廉价的jtag烧录器不支持arm11,我们不能要求用户必须拥有昂贵的仿真烧录工具才能够在idea6410上使用djyos,这样不利于用户使用。所以,移植的第一步,是要制作SD启动卡。
    我的第一个目标,就是弄清楚怎么下载程序的问题,也就是把一个最简单的闪灯程序运行起来,写了几行代码,如下:
    ldr     r0,=0x7f008820
    ldr     r1,=0x1111
    str     r1,[r0]
    ldr     r0,=0x7f008824
    ldr     r1,[r0]
    bic     r2,r1,#3
    orr     r2,r2,#0xc
    bic     r3,r1,#0xc
    orr     r3,r3,#3
nn:
    str     r2,[r0]
    ldr     r4,=5000000
delay1:
    sub     r4,r4,#1
    cmp     r4,#0
    bne     delay1
    str     r3,[r0]
    ldr     r4,=5000000
delay2:
    sub     r4,r4,#1
    cmp     r4,#0
    bne     delay2
    b       nn

    6410的手册上说,可以从nandflash、onenand、SD卡启动,没有专用的烧录工具的情况下,只有SD卡启动是可以考虑的。手册上看到,SD卡启动,实际上是先执行片内IROM中的一段程序,该程序从SD卡中读取代码,写到stepping stone中,stepping stone是位于0x0c000000、size为8K的片内内存,代码写入stepping stone后,跳到0x0c000000处继续执行程序。那么,要实现从SD卡启动,就必须弄清楚:
1、8K的代码保存在SD卡的什么位置。
2、代码以什么格式存储。
    为弄清楚上述问题,依例google一番,没找到有用的资料,上三星的网站,6410的资料没有公开,申请了一下,第二天得到了批准,也没有关于怎样从SD卡启动的资料。找三星代理,似乎不太爱搭理我,也是,我势单力薄一个人,他们怎看得上眼。难道就没有办法了?
    山穷水尽疑无路,柳暗花明又一村,2450不是也可以从SD卡启动吗?找找2450的资料看有没有,谢天谢地,从网上找到一篇文档:
896554S3C2450_IROM_ApplicationNote_Rev003.pdf
我如获至宝,细细读之,虽然写得不太细,比如代码校验算法等都没有讲,总是可以试一下了。
    依葫芦画瓢,把编译好的代码写入到最后芯片末尾偏移-9216字节处,插入SD卡座,把开关拨到SD0卡启动的位置,上电,哈哈,成功了,几个蓝色的LED欢快地闪烁起来。试了两个SD卡,16M的可以,2G的不行,不知何故,暂且放一边吧。
    首战告捷,该歇歇了,待续。

出0入0汤圆

 楼主| 发表于 2009-7-22 22:52:20 | 显示全部楼层
上篇说道,用16M的SD卡启动可以,但用2G的卡却不行,反复试过,实在不知道怎么回事,也没有IROM中的加载程序的进一步资料,问题也就无从查起了,暂且先放一边,把后续的移植工作做完再说吧。
    移植操作系统,跟开发裸奔程序是不一样的,裸奔程序可以从main开始写程序,在执行main之前,编译器产生了大量的代码用于初始化cpu、内存清零、初始化堆和栈、直到建立main的执行环境。而操作系统往往有自己的运行环境要求,C编译器完成的这些环境往往不能符合要求,需要自己写初始化文件,即initcpu.s文件。
    初始化文件主要完成以下工作:
1、从复位地址跳转到启动地址。
2、设置cpu为特权模式,禁止看门狗和中断,禁止cache。
3、设置时钟,有些cpu的时钟设置很复杂的,尤其是高速cpu,因为涉及到内核和外设匹配的问题,设置起来比较麻烦。
4、设置内存总线,设置内存访问速度,要跟上一步的时钟设计配合,使cpu能正确读写内存和内存映射的外设。
5、配置cache和mmu,然后使能cache和mmu。
6、初始化栈,跳转到C代码。
    根据拿来主义的原则,写cpu初始化代码千万不能自己从0开始写,而是要找一个现成的来参考,因为各个系统的cpu初始化工作是大同小异的。移植到2440的时候,因为2410和2440非常相似,用的是2410的initcpu.s直接改的,但看了一下6410的datasheet,发现6410与2440差别太大了,不能用2440的initcpu.s来改,必须另外找一个。一般来说,许多cpu厂商都会出example,会带一个文件名类似startup.s的文件,参考该文件来写即可。但是,三星不知从何年何月开始不公开其cpu的文档了,甚至连datasheet都要申请才给。当我千辛万苦找到三星提供的“6410_Test_Rev01”源代码包时,心都凉了,该代码包中虽然有start.s文件,但文件中只有几条指令,初始化过程都在"__rt_entry“函数中,而该函数在库中。对芯片应用资料的保密工作做得如此周密,不知三星所谋何事。
    没办法,继续找,实在不行再自己一行行写。好在天无绝人之路,终于在友坚提供的wince的eboot代码中,找到了eboot的start.s文件,打开一看,果然是一个详细的启动文件,心中不禁狂喜!
    接下来的工作,就是对照datasheet,看懂这个start.s,然后改造成适合djyos的。别看说的轻巧,这里面工作量还是很大的,6410的datasheet有1300多页,光时钟和总线配置相关的部分就有100多页,E文的,晕死。而且第一次用arm11,其mmu和cache配置和arm9有多大差别,还不可知。今天先写到这里,下回分解吧。

出0入0汤圆

 楼主| 发表于 2009-7-22 22:52:52 | 显示全部楼层
接续上回,开始啃start.s,跟所有的启动文件一样,开始部分是关闭cache、禁止中断等,没什么问题。这里稍稍解释一下为什么要做这些工作,禁止中断大家应该没什么异议,关键是为什么一定要禁止cache,原来,我们不知道程序为什么要重新启动,也不知道重新启动前cpu和cache处于什么状态,cache可能包含错误的信息,cpu可能会从中取得错误的指令,从而不能正常启动系统。eboot的start.s遗漏了一个很重要的过程,就是要重新把cpu设置成svc状态,因为就像我们不了解重启动前cache状态一样,cpu的状态也是未知的,须加上这几句确保cpu处于svc态:
    mrs     r0,cpsr                 @取CPSR
    bic     r0,r0,#MODEMASK         @清模式位
    orr     r1,r0,#SVCMODE|NOINT    @设置为管理态,并禁止中断
    msr     cpsr_cxsf,r1            @切换到管理态,可防止意外返回0地址时出错.
    实际上,这几句仍然不够保险,因为如果程序是从user态直接跳转到0地址的话,mrs和msr指令是无效的。保险的做法是用swi指令强制修改,既然是个简易的bootloader程序,暂且偷懒一下。
    依惯例,接下来是各种时钟初始化,S3C6410的时钟结构比较复杂,共有3个pll要设置,而且分频控制也较为复杂,虽然start.s有得抄,但还是要自己弄清楚,因为接下来的编程用得上。6410的时钟部分之所以如此复杂,完全是为了适应其内部丰富的外设,不同的外设需要不同的时钟。设置时钟,不外乎就是定义几个常用的主频,然后分别为这些主频定义锁相环(pll)的分频系数,再把这些分频系数填充到相应的寄存器中去,细节就不再赘述了,看代码吧。
   初始化完时钟后,就轮到初始化内存总线了。依据用什么初始化什么的原则,这里只初始化了srom0和dram两个区域,这部分代码是用C语言实现的,参见memcfg.c文件,代码比较简单,不过是按照datasheet的要求,依次设置寄存器而已。
    接下来,你一定会想到,该初始化mmu了,初始化mmu本来是一项复杂的工作,但si版本是为单片机准备的,即使6410再强劲,也只能委屈一下,当高速单片机了。mmu在这里并没有用来做地址变换,而是把4G内存空间全部映射到其物理地址上了。这种映射效果跟禁止mmu是一样的,但是arm的mmu和cache是绑定在一起的,禁止mmu的同时也就禁止了cache,故只能打开mmu。页表的地址在0x50000000,占用16Kbytes,故应用程序的起始地址是0x50004000。
    又可以偷懒了,6410的核是arm11jzf-s的,2440的核是arm920T的,arm11jzf-s的mmu功能比arm920t的强很多,但都是arm公司的,做最简单映射的话,能否兼容呢?懒得读arm11的手册了,先试一下把2440版本的mmu初始化部分直接copy看行不行。事实证明是可行的,但我在这里绕了一个大大的圈子,浪费了许多时间。加入初始化mmu部分代码后,试了一下,发现灯不闪了,而把该段程序放到初始化页表的代码之前,则可以。仔细检查,发现是因为dram没有初始化,加上dram初始化后,先把闪灯程序放在dram初始化后面,发现可以了。这时候,不幸发生了,移动闪灯程序时,只copy了一半的代码,当然不闪了,可我没仔细检查代码,就怀疑是2440的mmu初始化代码不能用于6410的造成的(偷懒了,心虚),于是找来arm11jzf-s的手册猛啃,几百页的英文资料啊,费了好几天功夫,最后证明了一件事:原来的mmu初始化是正确的!!
    到这里,基本硬件的初始化就算完成了,接下来要搞norflash和uart的driver了。待续……

出0入0汤圆

 楼主| 发表于 2009-7-22 22:53:21 | 显示全部楼层
之三讲到,cpu的初始化已经完成,下一步的工作便是初始化uart,使之能够跟PC连接上。
    初始化6410的uart,有两个时钟必须区分清楚,即uartclk和baudclk,前者由系统控制寄存器CLK_SRC和CLK_DIV2控制,手册并没有说明这个时钟的用途,我猜测是用于uart模块本身运行的;另一个时钟是baudclk,用来控制baud,产生串行移位时钟的,在uart模块的控制寄存器UCON中设置,然后用UBRDIV和UDIVSLOT0两个寄存器设置baud。uart的工作方式为:
baud=115200
接收和发送fifo:开
中断:关闭,以查询方式收发。
    接下来是norflash的驱动程序,也就是编写擦除和写入程序,根据am29lv160db的手册写就是了,没什么好说的。除了一些低级错误外,测试也几乎一次成功。
    至此,该轮到xmodem协议收发程序了,xmodem是一个简单的串口收发文件的协议,它把文件分成128字节的一个个小包传送,最后一包数据如果不满128字节,则以0x1a填充。该协议是有缺陷的,用来传送文本文件没问题,因为文本文件不会出现0x1a,但传送2进制文件的话,就不行了,因为接收方无法分辨最后的0x1a是文件本身的内容,还是填充物。不过没关系,作为代码,最后多一些垃圾并不碍事,无非就是多占几个字节而已。
    xmodem本来是有差错控制的,通过逐帧应答和校验和(或者CRC)来确保传输正确,不过这里偷了下懒,所有这些都省略了,传错了就再传一次。
    至此,移植到S3C6410的第一步,sdbootloader就制作完成了,接下来就是移植整个操作系统了,sdbootloader的代码在这里下载:

出0入0汤圆

发表于 2009-7-23 08:59:15 | 显示全部楼层
支持下先,ARM11还没碰过

出0入0汤圆

发表于 2009-7-23 09:21:55 | 显示全部楼层
楼主,你的拨码开关是GPN15-13吗?我是用SD CH1的,怎么设?

出0入0汤圆

 楼主| 发表于 2009-7-23 16:08:53 | 显示全部楼层
三星datasheet上不是有吗?3位均设为1就行了。
但从SD1启动我没试过,我手上的板子SD1卡槽没焊。

出0入0汤圆

发表于 2009-7-29 00:55:35 | 显示全部楼层
我也在使用Idea6410,有机会多多交流.

出0入0汤圆

发表于 2009-7-31 15:52:39 | 显示全部楼层
顶一个,顺便问一下S3C6410多少钱一片?

出0入0汤圆

 楼主| 发表于 2009-7-31 22:02:10 | 显示全部楼层
我也不知道,我用的是厂家送给我的开发板。

出0入0汤圆

发表于 2009-10-27 09:27:39 | 显示全部楼层
10美金一片

出0入0汤圆

发表于 2009-10-27 18:27:34 | 显示全部楼层
mark

出0入0汤圆

发表于 2009-10-28 19:27:03 | 显示全部楼层
好东西!佩服djyos的功力, 酷~

出0入0汤圆

发表于 2009-11-1 16:54:55 | 显示全部楼层
请问楼主,S3C6410的编译软件用的是什么,我找了好久都没有找到支持ARM11的,谢谢诶

出0入0汤圆

 楼主| 发表于 2009-11-1 17:19:54 | 显示全部楼层
我用的是gcc编译的。
iar也支持arm11,但再往上到A8、A9就不能支持了。

出0入0汤圆

发表于 2009-11-12 08:51:10 | 显示全部楼层
楼主说2G的SD卡不行,应该是放的位置不对。我用的就是2G的SD卡,用友坚提供的bootloader工具烧写,对比发现,bootloader是从0x7537DC00这个地址开始写的,是一条跳转语句……我自己用RVDS写了个闪烁LED的汇编小程序,编译后,从这个位置开始写入,发现是可以用的,至于原因,还不清楚,估计与SD卡的结构有关

我用的是UT-S3C6410开发板,与idea相比,核心板是一样的,地底板不同

另外,楼主的资料可否把896554S3C2450_IROM_ApplicationNote_Rev003.pdf  跟大家分享一下,兄弟在网上找了半天也没找到

出0入0汤圆

 楼主| 发表于 2009-11-12 10:03:23 | 显示全部楼层
哈哈,楼上真行,把这个给弄清楚了,功德无量啊。

点击此处下载 ourdev_502503.pdf(文件大小:2.03M) (原文件名:896554S3C2450_IROM_ApplicationNote_Rev003.pdf)

出0入0汤圆

发表于 2009-11-12 10:33:02 | 显示全部楼层
太感谢了

出0入0汤圆

发表于 2009-11-12 15:25:54 | 显示全部楼层
看了楼主的IROM_ApplicationNote_Rev003.pdf之后明白了

16M的SD卡属于里面的SD/MMC Device,所以,从末地址,向前偏移9K(18个block),就行了

2G或者更大的的SD卡,属于SDHC Device,所以需要从末地址,向前偏移521K(1042个block)

但是,还有个问题,我的SD卡上明确标的是SD,不是SDHC,网上的2G卡都是SD,>2G才是SDHC

出0入0汤圆

发表于 2009-11-18 10:34:23 | 显示全部楼层
如果用RVDS编译的话,linktype选simple,那RObase,和RWbase应该怎么设置呀,其他有没有要求呀

出0入0汤圆

发表于 2009-11-18 17:09:31 | 显示全部楼层
明白了,RO、RW都设成Steppingstone的地址,initcpu.o的代码放在最前面,就OK了

出0入0汤圆

发表于 2009-11-22 00:19:49 | 显示全部楼层
强帖,mark!

出0入0汤圆

发表于 2009-12-5 12:15:55 | 显示全部楼层
gz

出0入0汤圆

发表于 2009-12-7 10:31:58 | 显示全部楼层
2G页面大小的Nandflash做写操作的时候,ECC校验码要怎么写入的啊?

1、硬件生成ECC校验码,是在所有数据写完后,一次读取?还是怎么样

2、硬件生成ECC校验码,写在空闲区的什么位置?需要操作哪些寄存器呢?

出0入0汤圆

发表于 2010-2-10 20:48:53 | 显示全部楼层
回复【20楼】zhanglf08
看了楼主的IROM_ApplicationNote_Rev003.pdf之后明白了
16M的SD卡属于里面的SD/MMC Device,所以,从末地址,向前偏移9K(18个block),就行了
2G或者更大的的SD卡,属于SDHC Device,所以需要从末地址,向前偏移521K(1042个block)
但是,还有个问题,我的SD卡上明确标的是SD,不是SDHC,网上的2G卡都是SD,>2G才是SDHC
-----------------------------------------------------------------------

mark

出0入0汤圆

发表于 2010-3-11 11:02:50 | 显示全部楼层
回复【楼主位】djyos 都江堰操作系统
-----------------------------------------------------------------------

您好,请问这个是sd卡启动e-boot是么?请问有完全使用sd卡启动系统的资料么?我们的设备体积很小,想利用6410的这个特点,将nand flash和nor flash去掉。谢谢

出0入0汤圆

 楼主| 发表于 2010-3-11 22:48:47 | 显示全部楼层
回楼上,理论上是可以的,但我没有这样做。
你可以把我共享的简易sdboot的代码稍作修改:把从串口接受并写入norflash的那部分代码,改成从SD卡中读代码到内存就可以了。

出0入0汤圆

发表于 2010-3-23 17:20:28 | 显示全部楼层
请问有遇到SD1(8BIT SD)的时钟脚怎么弄都没有信号出来?不管是IROM方式,还是系统正常运行后,

出0入0汤圆

发表于 2010-3-25 20:28:09 | 显示全部楼层
突然看到这张帖子……

首先说句:对楼主的钻研精神表示下敬意

然后,不得不说,换我的话,绝对不会在三星的器材上做自己 OS 的演示系统——除非已经有现实的项目摆到面前……因为没工夫跟三星逗这份咳嗽,有那么多闲工夫跟它玩黑盒猜谜,不如拿来完善自己程序本身的功能……

出0入0汤圆

发表于 2010-3-25 20:30:02 | 显示全部楼层
另外补充一句,三星器材的 iROM 代码是有 bug 的,SD 和 SDHC 没办法正确区分,所以 SDHC 时候,那个引导加载用的启动代码还要再往前倒若干扇区——具体多少我忘记了……

出0入0汤圆

发表于 2010-3-27 08:53:58 | 显示全部楼层
强帖留名,楼上的,查一下资料看看,等你好消息

出0入0汤圆

发表于 2010-5-26 16:29:34 | 显示全部楼层
顶一个,佩服Lz 的钻研精神  。。。。

好久不玩这些了,要不是老板塞给我任务,我还真懒得研究这份代码  。。。。

DJYOS 我在友坚开发板的送的CD里已经看到了,没仔细看,没想到是从这里出去的,呵呵 。

好了,非常感谢LZ 的资料 ,

提醒一下 __rt_entry 是 ARM 标准初始化库的入口  ,不是三星的,呵呵 。

有机会多交流, 。。。。

出0入0汤圆

发表于 2010-5-26 19:45:24 | 显示全部楼层
一句都看不明白,但还是一句一句的看完了,佩服高手!

出0入0汤圆

发表于 2010-6-3 01:07:31 | 显示全部楼层
呵呵 , 根据LZ代码,改了一个RVDS4PRO 的版本,回馈一下楼主,如果LZ不喜欢, 请删除 。。。。

SDboot RVDS 4.0 PRO ourdev_559125.rar(文件大小:47K) (原文件名:s3c6410_SDboot.rar)

出0入0汤圆

发表于 2010-6-3 09:10:51 | 显示全部楼层

出0入0汤圆

发表于 2010-6-3 09:50:29 | 显示全部楼层
不错,想象力比技术更重要

出0入0汤圆

发表于 2010-7-1 08:28:47 | 显示全部楼层
mark 一个

出0入0汤圆

发表于 2010-7-1 08:50:00 | 显示全部楼层
学习一下!

出0入0汤圆

发表于 2010-9-23 15:16:39 | 显示全部楼层
好东西
mark一下

出0入0汤圆

发表于 2010-9-25 10:40:23 | 显示全部楼层
记号

出0入0汤圆

发表于 2010-10-11 11:13:37 | 显示全部楼层
公司购了一批 UT-S3C6410 开发板,原来都江堰操作系统出自这里,呵呵!

出0入0汤圆

发表于 2010-10-14 20:48:57 | 显示全部楼层
学习一下,顺便记号一下

出0入0汤圆

发表于 2010-12-3 15:17:54 | 显示全部楼层
mark

出0入0汤圆

发表于 2011-2-24 10:31:20 | 显示全部楼层
mark,正在入手搞6410,相信这篇文章肯定日后用的着。佩服楼主!

出0入0汤圆

发表于 2011-2-28 20:18:06 | 显示全部楼层
和楼上一样,正在裸奔ARM11,还没成功

出0入0汤圆

发表于 2011-6-24 12:55:50 | 显示全部楼层
现在才发现这个么好帖子。

出0入0汤圆

发表于 2011-7-1 23:27:57 | 显示全部楼层
MARK

出0入0汤圆

发表于 2011-7-5 15:41:12 | 显示全部楼层
MARK  强贴

出0入0汤圆

发表于 2011-7-5 15:55:04 | 显示全部楼层
MARK 狠实!

出0入0汤圆

发表于 2011-10-9 10:41:35 | 显示全部楼层
有没有试过从sd卡到nand的启动方式呢?

出0入0汤圆

发表于 2011-10-11 08:51:19 | 显示全部楼层
找到把6410当单片机用的方法了。。

出0入0汤圆

发表于 2011-12-21 14:24:01 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-1-12 10:04:46 | 显示全部楼层
学习了···很好很强大呀··

出0入0汤圆

发表于 2012-2-3 21:15:08 | 显示全部楼层
mark

出0入4汤圆

发表于 2012-2-3 21:41:45 | 显示全部楼层
mark

出0入0汤圆

发表于 2012-2-6 13:55:32 | 显示全部楼层
好材料

出0入0汤圆

发表于 2012-2-20 12:47:32 | 显示全部楼层
学习了

出0入0汤圆

发表于 2012-6-25 06:36:40 | 显示全部楼层
MARK                                

出0入0汤圆

发表于 2013-7-28 22:35:47 | 显示全部楼层
正在学习,谢谢楼主了……!

出0入0汤圆

发表于 2013-10-23 09:00:30 | 显示全部楼层
mark            

出0入0汤圆

发表于 2013-10-23 09:17:46 来自手机 | 显示全部楼层
好帖!mark

出0入0汤圆

发表于 2013-10-23 09:44:40 | 显示全部楼层
非常感谢!
认真读了下,直接SD卡应该就可以了,不需要nand flash和nor flash。
要当单片机用 ,那些外接的DDR可以省略吗
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-3-29 20:30

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表