接下来,我们看看关闭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
上一篇:S3C6410嵌入式应用平台构建(二)
下一篇:移植属于自己的6410开发板的U-Boot
推荐阅读最新更新时间:2026-03-23 11:04
- LDK120M12R 1.2V低压降稳压器典型应用(可调版)电路
- EVB-UTC2000-DFP、EVK-UTC2000 评估套件基于 UTC2000 USB 3.0/2.0 Type-A,即插即用 Type-C DFP
- LTC3219 演示板、250mA 通用九通道 LED 驱动器
- DC919A-D,LTC2204 CMOS 输出演示板,直流输入,40Msps 16 位 ADC,DC
- AD8618ARZ-REEL 二阶低通滤波器运算放大器的典型应用电路
- 使用 NXP Semiconductors 的 PCA9511A 的参考设计
- LT3091MPDE 恒流恒压实验室电源的典型应用
- ADR392B 4.096 Vout 微功率、低噪声精密电压基准的典型应用
- LT3470HDDB 5V 降压转换器的典型应用电路
- 使用 Diodes Incorporated 的 AZ7042ZTR-E1 的参考设计

背包客_Follow me 第三季第4期
Azure RTOS ThreadX内核用户手册,含SMP多核(中文版)
现代雷达系统的信号设计
BFR340T






京公网安备 11010802033920号