Eboot启动汇编代码分析

王朝other·作者佚名  2006-01-09
窄屏简体版  字體: |||超大  

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

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
 
 
© 2005- 王朝網路 版權所有 導航