【2014-4/11~4/14】经过之前的实验,对Uboot已经有了大体的了解,前我们已经把led灯给点亮,但这不是我们的根本目的,我们是要进入boot启动,经过两天的分析代码和反复的实验,终于可以进入正常的uboot启动了。
接下来,我们看看关闭MMU,至于为什么要关闭MMU,网上大家都说的很清楚,我就不再重述,但关于关闭MMU有如下代码:
/*
* disable MMU stuff and caches
*/
mrc p15, 0, r0, c1, c0, 0
bic r0, r0, #0x00002300 @ clear bits 13, 9:8 (--V- --RS)
bic r0, r0, #0x00000087 @ clear bits 7, 2:0 (B--- -CAM)
orr r0, r0, #0x00000002 @ set bit 2 (A) Align
orr r0, r0, #0x00001000 @ set bit 12 (I) I-Cache
/* Prepare to disable the MMU */
mcr p15, 0, r0, c1, c0, 0
#if 0 //I don't know why mark blow
/* Prepare to disable the MMU */
adr r1, mmu_disable_phys
/* We presume we're within the first 1024 bytes */
and r1, r1, #0x3fc
ldr r2, _TEXT_PHY_BASE
ldr r3, =0xfff00000
and r2, r2, r3
orr r2, r2, r1
b mmu_disable .align 5
/* Run in a single cache-line */
mmu_disable:
mcr p15, 0, r0, c1, c0, 0
nop
nop
mov pc, r2
#endif
#endif
我尝试不去注释掉if0的内容,但是连灯都亮不起来,我不是太清楚这是问什么,反正mcr p15, 0, r0, c1, c0, 0将MMU关闭清楚就行了。
接下来就进入bl lowlevel_init /* go setup pll,mux,memory */,进行系统时钟,nandflash控制器,ddr内存控制室,led等简单的 初始化。
接下来也是大多数移植过程中需要改的地方了:
重定位代码->从nandflash复制到DDR中并执行!
我自己写的代码如下:
#ifdef CONFIG_BOOT_NAND
relocate:
adr r0, _start /* 当前指令地址 */
ldr r1, =_start /* 链接地址 */
//ldr r2, _armboot_start
//ldr r3, _bss_start
cmp r0, r1
beq after_copy copy_from_nand:
ldr r0, _armboot_start
ldr r1, _bss_start
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
sub sp, sp, #12
bl copy_nand2ram tst r0, #0x0
bne copy_fail copy_fail:
nop /* copy from nand failed */
b copy_fail
#endif
首先比较r0,r1, 大家可以用反汇编来看看代码执行过程(反汇编生成方法为:arm-linux-objdump –D uboot > uboot.dis),反汇编后发现,
r0 存放的是程序当前指令地址,即r0 =0,而r1 = 0x57e00000,因此需要重定位。而关键在于,我想通过r0,r1来把代码的起始地址和终止地址传入nandcopy2ram函数,这样就灵活了,但是奇怪的是,传参并传不进去,会导致启动不来,后来我们把这些零零碎碎的判断啊,重定位什么的都不要了,就两句代码:设置栈指针,跳入c函数的copy_nand2ram ,而copy_nand2ram 函数复制uboot代码大小固定死了,为0x3c000,结果烧进去,咦!终于看到希望,终于起来了!!!!
甚是高兴,后来我们又改回r0,r1来传参,还是不行,算了,这肯定是由某个原因导致的。
我们对于汇编指令不是特别熟悉,特别是adr,ldr,还有ldr, =XXX、tst,beq, bnq这些指令太陌生了。后面需要去深入理解。
我同学的这个想法很好,什么都不用做,我们最终的结果不就是去nandflash复制到ram嘛,干脆用以下两句:
ldr sp, _TEXT_PHY_BASE /* setup temp stack pointer */
bl copy_nand2ram
有时我们为了达到目的,确实可以去简化过程,达到目的后再来添加详细过程和步骤。今天总算有点进展了,加油!!!
由于下班回来思路没有理清,过段时间把思考的过程文档化写出来。