Chinaunix首页 | 论坛 | 博客
  • 博客访问: 280238
  • 博文数量: 66
  • 博客积分: 2636
  • 博客等级: 少校
  • 技术积分: 762
  • 用 户 组: 普通用户
  • 注册时间: 2009-09-25 16:40
文章存档

2013年(1)

2012年(2)

2011年(8)

2010年(15)

2009年(40)

我的朋友

分类:

2009-12-21 21:34:46

启动代码通常都是用处理器相应的汇编代码写成,比较晦涩,但是却包含了很多与平台相关的信息,对初始化代码进行分析有利于对平台的理解。本文将对Eboot的初始化代码进行分析,主要包含从Reset到进入Cmain开始。

    mov     r0, #0x48000000         ; Memory controller base physical addr.

    add     r0, r0, #0x4            ; Add offset of MDREFR

 

    mov     r1, #0x03800000        

    orr     r1, r1, #0x000FF000     ; VALUE

 

    str     r1, [r0]                ; STORE

MDREFR初始化为0x38ff000,使得所有的SDCLK自由运行,禁止自我刷新,不允许自动掉电,SDCLK以时钟频率运行,允许SDCLK信号,允许SDCKE

    mov     r0, #0xA0000000         ; SDRAM ADDRESS

    ldr     r1, [r0]                ; CAUSES the first row refresh to all partitions

   

    ldr     r1, [r0]                ; CAUSES the second row refresh to all partitions

不大懂这是什么意思,哪位知道麻烦通知一声

 

    mov     r4, #0x40000000         ; Main address section

    orr     r4, r4, #0x00F00000     ; Rest of address

    ; set the immediate sleep mode on batt/vdd fault

    mov     r3, #3                   ; force Imprecise Data Abort on Fault

    str     r3, [r4]

 配置PMCR寄存器的IDEA位,使得电池不足时产生一个data abort中断而不是直接进入sleep模式。

    mov     r2, #0x2000             ; 8k loop

 

EARLY_REFRESH_LOOP

    ldr     r1, [r0]                ; CAUSES a row refresh to all partitions

   

    subs    r2, r2, #0x1           

    bpl     EARLY_REFRESH_LOOP      ; while >= 0

然后循环对存储器进行读操作,我也不知道为什么要这么做

  bl PREINIT

做一些初始化前的准备工作,主要是关闭MMUCACHE,然后获得reset的原因

主要有三个,从sleep中唤醒,或者是被GPIORESET或者就是直接的RESET

然后,对于各种不同的情况,就有不同的初始化过程

这些步骤大同小异,但是最后,一定是b  INITMMU

INITMMU是内核和EBoot公用的,如果是和内核链接,那么INITMMU仅仅是把OEMAddressTable地址装载到寄存器中,然后就调用NKkernelstart了,如果是做EBOOT,则 INITMMU是将MMU启动,然后把boot代码搬运到内存当中。

INITMMU的最后通过bl     main  来跳转到Cmain函数

阅读(497) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~