Eboot启动汇编代码分析

类别:软件工程 点击:0 评论:0 推荐:

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函数

 

 

本文地址:http://com.8s8s.com/it/it32862.htm