smdkc100之u-boot 2010.03代码的分析2
下面是一条跳转指令,代码这里不贴,但是其中的代码很重要,在lowlevel.S中实现比如说点亮LED灯、关闭watchdog、关闭中断、串口初始化、系统时钟初始、nand flash初始化、内存控制器初始化。不过说实在的,去仔细分析这些初始化的过程,对于你对如何控制硬件有很大的帮
助, 对于这个函数,所要说的东西太多,会在后面的文章中单独分析它,现在先知道功能就好,没有它代码无法启动。
*/
--------------------
bllowlevel_init
--------------------
/* 跳转出来以后,继续执行下面的代码,下面的代码是判断程序是否已经在ram中了,在的话就不拷贝,直接跳转到stack_setup了,否则
继续执行copy_loop */
--------------------
#ifndefCONFIG_SKIP_RELOCATE_UBOOT
relocate: @relocate U-Boot to RAM
adr r0,_start @r0 <- current position of code
ldr r1,_TEXT_BASE @ test if we run from flash or RAM
cmp r0,r1 @ don't reloc during debug
beq stack_setup
..........................................
copy_loop: @copy 32 bytes at a time
ldmia r0!,{r3 - r10} @ copy from source address [r0]
stmia r1!,{r3 - r10} @ copy to targetaddress [r1]
cmp r0,r2 @ until source end addreee [r2]
ble copy_loop
#endif /* CONFIG_SKIP_RELOCATE_UBOOT */
--------------------
--------------------
/*
堆栈初始化代码
*/
--------------------
/* Set up the stack */
stack_setup:
ldr r0, _TEXT_BASE /* upper 128 KiB:relocated uboot */
sub r0, r0, #CFG_MALLOC_LEN /* mallocarea */
sub r0, r0, #CFG_GBL_DATA_SIZE /*bdinfo */
#ifdef CONFIG_USE_IRQ
sub r0, r0,#(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)
#endif
sub sp, r0, #12 /* leave 3 words for abort-stack */
and sp, sp, #~7 @ 8 byte alinged for (ldr/str)d
#endif
--------------------
/* 清零BSS段内容为0 */
--------------------
clear_bss:
ldr r0, _bss_start /* find start of bss segment */
ldr r1, _bss_end /* stop here */
mov r2, #0x00000000 /* clear */
clbss_l:
str r2, [r0] @ clear BSS location
cmp r0, r1 @are we at the end yet
add r0, r0, #4 @ increment clear index pointer
bne clbss_l @ keep clearing till at end
--------------------
/* 跳转到uboot代码的第二个阶段,第二阶段基本上都是用C实现的,幸好前面sp的值已经设置好了 */
--------------------
ldr pc, _start_armboot
_start_armboot:.word start_armboot
--------------------