在说到调用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的物理基址加上,才能跳转到正确的地方。
阅读(1300) | 评论(1) | 转发(0) |