.word TEXT_BASE
.globl lowlevel_init
lowlevel_init:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
ldr r0, =SMRDATA
ldr r1, _TEXT_BASE
sub r0, r0, r1 // r0 减去 r1 其结果存入 r0 ,也即 SMDATA 中的起始地 0x33F8xxxx
减去0x33F80000,其结果就是13个寄存器的值在NOR Flash存放的开始地址
ldrr1, =BWSCON/* Bus Width Status Controller */
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
relocate: /* 把U-BOOT重新定位到RAM*/
//r0=0;
adr r0, _start /* r0是代码的当前位置*/
//r1=TEXT_BASE = 0x33F80000
ldr r1, _TEXT_BASE /*测试判断是从FLASH启动,还是RAM */
cmp r0, r1 /*比较R0、R1,调试的时候不需要重定位。 */
beq stack_setup /*如果R0等于R1,跳到重定位代码。*/
//如果不是从RAM运行的话,则将代码拷贝到_TEXT_BASE标识的RAM中。
/*准备重新定义代码。*/
ldr r2, _armboot_start//_armboot_start=_start
ldr r3, _bss_start //
sub r2, r3, r2 /* r2得到armboot的大小*/
add r2, r0, r2 /* r2得到要复制代码的末尾地址*/
//kaobei guo cheng
copy_loop:/*重新定位代码*/
ldmia r0!, {r3-r10} /*从源地址[r0]复制,r0指向_start(=0)*/
stmia r1!, {r3-r10} /*复制到目的地址[r1],r1指向_TEXT_BASE(=0x33F80000)*/
cmp r0, r2 /* 复制数据块直到源数据末尾地址[r2]*/
ble copy_loop