4113|11

75

帖子

0

TA的资源

一粒金砂(初级)

楼主
 

关于NK.NB0下载的问题 [复制链接]

我们通常都是通过eboot进入菜单选择U,然后通过dnw下载nk.bin的,其实,NK.NB0也可以直接下载到内存里面运行的,至少我用nor起来下载过NK.NB0运行的,这样有个好处,不用每次都烧写nand,效率高速度快。
但我手头的开发板没有nor,USB又不好使,我想调nk,只能通过jtag或者什么工具下载下去,但现在问题来了,每次运行NK.NB0都报错,就是一开始的汇编都出错了。
详细情况如下:
在我的config.bib里面定义如下:
MEMORY
        NK                80200000  01E00000  RAMIMAGE


        ROMSTART = 80200000
于是,我就把它下载到30200000地址,然后将pc指针指向这里,汇编语句看到了,       
ldr        r0, =WTCON       ; disable the watchdog timer.
mov        r1,#0         
str        r1, [r0]
我就一条一条执行,第一条,取0x53000000地址,没有问题;第二条,取0到R1,没有问题;第三条,把0存到0x53000000出错了,invalid address了。。。
我怀疑是MMU的问题,于是,我把stepldr加载进去,运行一把,再把eboot下载下去,运行一把,最后,下载NK.NB0,现在应该跟NAND里面起来一样了吧,但情况还是如此,这是为什么呢?
两个问题:
1,有没有谁直接运行过NK.NB0的?通过什么样的方法运行?先stepldr,再eboot,再nk.nb0嘛?
2,nk.nb0,比方说起始地址是80200000,那么一开始的代码是kernel\oal\start.s代码嘛?前几句看上去很像,后面就有点不像了,难道不是?
谢谢了。

最新回复

有进展?  详情 回复 发表于 2009-2-10 10:42
点赞 关注

回复
举报

83

帖子

0

TA的资源

一粒金砂(初级)

沙发
 
我一直用nk.nb0

这个东西是裸二进制,使bootloader边简单,不用对他解析。
30200000地址应该是对的。不过我使用优龙的bootloader,在eboot中我也下载bin文件,nk.nb0没有下载过。
 
 

回复

68

帖子

0

TA的资源

一粒金砂(初级)

板凳
 
刚才试验了一下,如果stepldr、eboot固化在里面的话,eboot会把nand里面的Nk.nb0读到内存中,然后跳转到0x3022C654H地址:
INFO: OEMLaunch: Jumping to Physical Address 0x3022C654h (Virtual Address 0x8022C654h)...
我一比较,这个不就是我下载NK.NB0到内存30200000的第二条语句嘛:
30200000: b  0x3022c654
...
3022c654: b  xxxxx

为什么stepldr读eboot,然后eboot读NK.NB0,然后跳转到NB0,就可以运行呢?
为什么我直接下载stepldr运行,然后再下载eboot运行,然后再下载nb0运行,就不成功呢?每次运行到最后都是跳转到同一个地址:
SR:00000010: 00000000   andeq r0,r0,r0

为什么啊,大侠们救命啊!!!
 
 
 

回复

71

帖子

0

TA的资源

一粒金砂(初级)

4
 
你电灯看看程序死在哪个地方了。

————————————————

还有你的操作这样会有些问题的,你使用USB多次下载文件就会出问题了。尤其是下载eboot直接运行,然后又下载NK,这样按照经验就会出毛病了。

我使用ADS bootloader也会这样,如果直接把bootloader下载运行,然后继续NK.nb0,也会导致运行失败。

目前我也不知道什么原因,只能老老实实固化bootloader先。
 
 
 

回复

69

帖子

0

TA的资源

一粒金砂(初级)

5
 
你说的一开始的汇编出错是否是startup.s里的?0x53000000应该是个物理地址,"invalid address报错",是否是因为你在执行那三句汇编之前已经开启了MMU使用了虚拟地址造成的??
 
 
 

回复

73

帖子

0

TA的资源

一粒金砂(初级)

6
 
这个和你的bootloader有关系的,NK.BIN里面包含了很多NK.NB0里面没有的信息,所以要直接下载NK.NB0的话,要修改bootloader,把这些信息指定。具体的,你读明白了bootlaoder的代码就知道了。
 
 
 

回复

74

帖子

0

TA的资源

一粒金砂(初级)

7
 
引用 5 楼 yashi 的回复:
这个和你的bootloader有关系的,NK.BIN里面包含了很多NK.NB0里面没有的信息,所以要直接下载NK.NB0的话,要修改bootloader,把这些信息指定。具体的,你读明白了bootlaoder的代码就知道了。

能详细的说说嘛?除了加载地址等还有什么额外的信息嘛?eboot下载nk.bin的时候,只是把它解析成NK.NB0然后存到nand里面去的嘛,然后加载的时候从nand里面读nk.nb0到加载地址,然后跳转到加载地址,直接运行了。。。
难道我的理解有错?
 
 
 

回复

72

帖子

0

TA的资源

一粒金砂(初级)

8
 
引用 4 楼 kkkcxf1981 的回复:
你说的一开始的汇编出错是否是startup.s里的?0x53000000应该是个物理地址,"invalid address报错",是否是因为你在执行那三句汇编之前已经开启了MMU使用了虚拟地址造成的??


我也这么怀疑,但eboot拷贝nand内容后最后一句就是jump(0x30200000)物理地址的。如果真的是MMU问题,我什么都不运行,直接运行NK.NB0,应该什么问题都没有啊,但不知道为什么。。。
 
 
 

回复

81

帖子

0

TA的资源

一粒金砂(初级)

9
 
引用 6 楼 Seven_zhangxw 的回复:
引用 5 楼 yashi 的回复:
这个和你的bootloader有关系的,NK.BIN里面包含了很多NK.NB0里面没有的信息,所以要直接下载NK.NB0的话,要修改bootloader,把这些信息指定。具体的,你读明白了bootlaoder的代码就知道了。

能详细的说说嘛?除了加载地址等还有什么额外的信息嘛?eboot下载nk.bin的时候,只是把它解析成NK.NB0然后存到nand里面去的嘛,然后加载的时候从nand里面读nk.nb0到加载地址,然后跳转到加载地址,直接运行…


我看过eboot的代码,是支持烧写nk.nb0文件的,并且比NK.bin简单很多。

我现在想起来楼主没有固化下载nk.nb0会失败的原因了。——是没有清理cache!禁用——》使能MMU等环节

在ARM的官文是有解释的。一旦代码下载,就必须对cache进行特殊操作的。这个正是eboot没有考虑的地方,所以
这样操作导致外存和CPU获得的数据不一致,导致访问出错。下面是ARM官文的解释。
 
 
 

回复

62

帖子

0

TA的资源

一粒金砂(初级)

10
 
重写截图给你
 
 
 

回复

83

帖子

0

TA的资源

一粒金砂(中级)

11
 
eboot在解析nk.bin时,首先就提取了nk.nb0应该放在SDRAM的位置,有了这个值,eboot才可以跳转过去。
你如果没有专门修改过eboot,那对于下载nk.nb0可没有这样的提取动作,没有正确的位置,跳转自然不可行。
 
 
 

回复

76

帖子

0

TA的资源

一粒金砂(初级)

12
 
有进展?
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/9 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表