免费注册 查看新帖 |

Chinaunix

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

S3C6410移植日记之六 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2009-07-20 17:18 |只看该作者 |倒序浏览
之五搁置了编译器和链接器打架的问题,接下来就要验证能否顺利启动了,验证能否启动的最好方法,就是在程序开头加上闪灯的死循环,于是迫不及待地把这段代码加到initcpu.s的开头:
reset_start:
    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,=10000000
delay1:
    sub     r4,r4,#1
    cmp     r4,#0
    bne     delay1
    str     r3,[r0]
    ldr     r4,=40000000
delay2:
    sub     r4,r4,#1
    cmp     r4,#0
    bne     delay2
    b       nn
编译,下载,瞪大眼睛看着LED,迫不及待地打开电源,令人失望地,蓝色的LED始终没有发出一丝光线,好不容易“解决”了编译问题,新的问题又出来了。才灭恶狼,又遇猛虎,6410移植之路,命运多舛啊,简直是在考验我的忍耐力。由于没有仿真器,也不知道程序跑到哪里去了。用SD卡启动的话,norflash的物理地址是0x10000000,烧入程序后,写了一个非常简单的SD卡启动的程序,该程序直接跳转到0x10000000处,发现是可以正常闪灯的。于是判断为,要么是启动时从norflash读指令出错,要么根本没从norflash读指令。先找友坚科技的工程师问问吧,结果一样令我失望,他们根本就没有测试过从norflash启动,只好自己啃问题了。又把6410 datasheet中关于启动的部分仔细读了一遍,并且对比idea6410和三星开发板SMDK6410的图纸,还是没有发现错误。
无奈之下,找来示波器,看启动时读norflash的信号是否正常,对比am29lv160db的数据手册,芯片访问的时序也是正确的,难道真的无解了吗?
既然复位后确实读了norflash,且波形正确,就不应该怀疑cpu是否正确地从norflash启动了,google吧,耗费了半天时间,一点线索都没有,无奈之下,还是对比源程序仔细读手册吧,不过这时换成读arm1176jzf-s的文档了。
终于,在inticpu.s中看到这个指令:
    ldr     r0, =(Peripheral_base+0x13)
    mcr     p15,0,r0,c15,c2,4
这两条指令是把外设寄存器的地址告诉cpu的,难道是这里出了问题?于是把闪灯程序挪到这两条指令后面,再试,OK,令人激动的蓝色LED,终于像我的脉搏一样,欢快地跳动起来了。
原来,arm1176jzf-s把memory和Peripheral接口分开了,你需要在初始化时告诉cpu,哪些地址范围是属于Peripheral的,否则它就当memory访问,当然就访问不到属于Peripheral 区间的IO口寄存器了,所以灯也就不闪了。
这个问题,看似短短几句话就说完了,却着实为难了我好几天。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP