ENTRY(_main)
/*
* Set up initial C runtime environment and call board_init_f(0).
*/
#if defined(CONFIG_SPL_BUILD) && defined(CONFIG_SPL_STACK)
ldr
sp, =(CONFIG_SPL_STACK)
#else
ldr
sp, =(CONFIG_SYS_INIT_SP_ADDR)
#endif
bic
sp, sp, #7
/* 8-byte alignment for ABI compliance */
sub
sp, sp, #GD_SIZE
/* allocate one GD above SP */
bic
sp, sp, #7
/* 8-byte alignment for ABI compliance */
mov
r9, sp
/* GD is above SP */
mov
r0, #0
/* 以上代码都是为board_init_f函数准备堆栈空间和gd空间,都在iram中 */
bl
board_init_f /* */
/* 此时gd空间被初始化了 */
#if ! defined(CONFIG_SPL_BUILD)
/*
* Set up intermediate environment (new sp and gd) and call
* relocate_code(addr_moni). Trick here is that we'll return
* 'here' but relocated.
*/
/* 初始化sp堆栈 *//* 为relcate, 等函数装备运行环境。 */
ldr
sp, [r9, #GD_START_ADDR_SP]
/* sp = gd->start_addr_sp */
bic
sp, sp, #7
/* 8-byte alignment for ABI compliance */
/* [r9, #GD_BD]就是gd->bd, r9保存的是gd */
ldr
r9, [r9, #GD_BD]
/* r9 = gd->bd */
sub
r9, r9, #GD_SIZE
/* new GD is below bd */
adr
lr, here
ldr
r0, [r9, #GD_RELOC_OFF]
/* r0 = gd->reloc_off */
add
lr, lr, r0 /* here加 gd->reloc_off,就是要返回的地址(代码重定位后执行)*/
ldr
r0, [r9, #GD_RELOCADDR]
/* r0 = gd->relocaddr */
b
relocate_code /* 把自己从*(nand)拷贝到dram,返回后here是拷贝到dram中的here。 */
/* 在此之前的代码都是在iram中执行的。 */
here:
/* 此后代码在dram中执行了 */
/* Set up final (full) environment */
bl
c_runtime_cpu_setup
/* we still call old routine here */
ldr
r0, =__bss_start
/* this is auto-relocated! */
ldr
r1, =__bss_end
/* this is auto-relocated! */
mov
r2, #0x00000000
/* prepare zero to clear BSS */
clbss_l:cmp
r0, r1
/* while not at end of BSS */
strlo
r2, [r0]
/* clear 32-bit BSS word */
addlo
r0, r0, #4
/* move to next */
blo
clbss_l
bl coloured_LED_init
bl red_led_on
/* call board_init_r(gd_t *id, ulong dest_addr) */
mov r0, r9 /* gd_t */
ldr
r1, [r9, #GD_RELOCADDR]
/* dest_addr */
/* call board_init_r */
ldr
pc, =board_init_r
/* this is auto-relocated! */
/* we should not return here. */
#endif
ENDPROC(_main)