Chinaunix首页 | 论坛 | 博客
  • 博客访问: 57904
  • 博文数量: 11
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 140
  • 用 户 组: 普通用户
  • 注册时间: 2009-01-09 15:19
文章分类
文章存档

2017年(2)

2011年(1)

2010年(1)

2009年(7)

我的朋友

分类:

2009-01-11 15:15:52

在说到调用nand_read_ll函数的时候,有一些曲折情况也没有说明,呵呵。当时对于参数的设置也是有过一些反复的,特别是对于拷贝的长度参数r2的设置。最开始的时候是将这一段代码放到hal_mmu_init的后面进行的,那样传递的参数就应该是虚地址而不是物理地址。而且由于同样的情况hal_mmu_init函数也没有在前4k代码段里面(如果在我就直接将nand_read_ll放到hal_mmu_init所在的文件了,呵呵)。所以这样是一直没有调通的。
因此后来将nand_read_ll放到了hal_mmu_init的前面,这样就可以直接使用物理地址了。nand_read_ll的三个参数分别为:r0,NAND内部的起始地址,当然是0了;r1,SDRAM的起始地址,则应该是SDRAM的物理地址,在代码段里就是LEO2410_SDRAM_PHYS_BASE;第三个r2就是拷贝的长度,这一段需要知道RedBoot的实际长度,一开始不知道是怎么算的,就直接给了个定长,当然也可以工作,但是总觉得别扭。不过参考一下ROMRAM启动方式下的代码就知道了,用__rom_data_end减去__exception_handlers就得到了RedBoot的长度。这里面__exception_handlers就是RedBoot的起始段地址,当然就是0了;而__rom_data_end则是最后一个段的结束地址,反映了RedBoot的最后一个字节的位置,这样就解决了参数设置的问题。将RedBoot启动时显示的已使用内存的长度和编译得到的RedBoot.bin的长度进行比较就可以发现是相等的。
另外,在vivi的代码段里面,最后在设置pc的值以跳转到SDRAM中执行时,并没有
 

ldr         r2,=LEO2410_SDRAM_PHYS_BASE
add         pc,r1,r2

这两句,而是直接将on_the_ram标志的地址给了pc,但是在我们现在这中情况下是无法工作的,因为并没有启动mmu,所以必须将SDRAM的物理基址加上,才能跳转到正确的地方。

阅读(1293) | 评论(1) | 转发(0) |
0

上一篇:Boot from NAND (二)

下一篇:Drive CS8900

给主人留下些什么吧!~~

孤独的死灵法师2010-06-04 09:57:20

楼主,你好。我现在正在做2410nand的移植。结果按照楼主的方法,redboot没有起来。我看了一下,是在nand_read.c处,返回-1了。是第三个参数的问题,改成定长,进入nand_read.c就成了死循环。请问怎么解决?望回复。我的邮箱是songding117@163.com