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