【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

有时我们为了达到目的,确实可以去简化过程,达到目的后再来添加详细过程和步骤。今天总算有点进展了,加油!!!

由于下班回来思路没有理清,过段时间把思考的过程文档化写出来。

最新文章

  1. getComputedStyle的应用
  2. [转]iOS开发中@property的属性weak nonatomic strong readonly等介绍
  3. Python函数式编程:从入门到走火入魔
  4. linux中mysql运程连接时错误host ‘192.168.0.1’ is not allowed to connect to this MySql server
  5. docker 会这些也够
  6. SublimeText使用技巧
  7. 从协议VersionedProtocol开始
  8. DevExpress LookUpEdit和ComboBoxEdit部分用法
  9. python 函数对象(函数式编程 lambda、map、filter、reduce)、闭包(closure)
  10. Visual Studio 扩展包(.vsix)制作
  11. 如何用C#代码查找某个路径下是否包含某个文件
  12. Gradle使用手册(一):为什么要用Gradle?
  13. for之Python vs C#
  14. scrapy(一)建立一个scrapy项目
  15. Linux入门(11)——Ubuntu16.04安装texlive2016并配置texmaker和sublime text3
  16. ssh框架-Struts2(二)
  17. Java代理模式之Cglib代理
  18. 详解tween.js 中文使用指南
  19. CSS中的before和:after伪元素深入理解
  20. Spring源码解析 – @Configuration配置类及注解Bean的解析

热门文章

  1. python image show()方法的预览问题
  2. JSC学习笔记:JavaScriptCore 初识
  3. 【转】Python中执行cmd的三种方式
  4. Linux的用户和用户组管理
  5. fragment中listview触发事件setOnItemClickListener不好使
  6. JavaScript实现定点圆周运动
  7. 利用 Windows Azure 实现“云优先”
  8. HDOJ1166 敌兵布阵
  9. iOS 唯一设备号
  10. HealthKit框架参考(转)