Eboot启动代码分析

Eboot启动代码分析
启动代码通常都是用处理器相应的汇编代码写成,比较晦涩,但是却包含了很多与平台相关的信息,对初始化代码进行分析有利于对平台的理解。本文将对Eboot的初始化代码进行分析,主要包含从Reset到进入C的main开始。
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
做一些初始化前的准备工作,主要是关闭MMU和CACHE,然后获得reset的原因
主要有三个,从sleep中唤醒,或者是被GPIO的RESET或者就是直接的RESET
然后,对于各种不同的情况,就有不同的初始化过程
这些步骤大同小异,但是最后,一定是b INITMMU
INITMMU是内核和EBoot公用的,如果是和内核链接,那么INITMMU仅仅是把OEMAddressTable地址装载到寄存器中,然后就调用NK的kernelstart了,如果是做EBOOT,则 INITMMU是将MMU启动,然后把boot代码搬运到内存当中。
INITMMU的最后通过bl      main 来跳转到C的main函数
 
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值