免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3391 | 回复: 0
打印 上一主题 下一主题

S3C6410移植日志之三 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-20 17:16 |只看该作者 |倒序浏览
接续上回,开始啃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了。待续……
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP