经过之前的实验,对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
有时我们为了达到目的,确实可以去简化过程,达到目的后再来添加详细过程和步骤。
上一篇:S3C6410嵌入式应用平台构建(三)
下一篇:S3C6410嵌入式应用平台构建(一)
推荐阅读最新更新时间:2024-11-12 21:52
设计资源 培训 开发板 精华推荐
- 用于多输出多相应用的 LTC3728LIUH-1 降压转换器的典型应用电路
- STC8A4K60S2A12
- QS30-1辉光管主控
- LTC2939HMS 缓冲 VREF 为高电流电路供电的典型应用电路
- 使用 Microchip Technology 的 U644B-FP 的参考设计
- [Q]JW5068A核心8A大电流可调降压DCDC
- DC2347A,用于 LTC2937 编程板的演示板
- #训练营#便携式功率计(PD/QC诱骗版)
- ADP1048-600-EVALZ,评估板在具有 600 瓦和可编程数字滤波器的典型 AC/DC 开关电源中使用 ADP1048
- NCP81239REFGEVB,USB 供电 4 开关降压升压控制器评估板