读书人

smdkc100之u-boot 2010.03代码的分析二

发布时间: 2013-01-07 10:02:24 作者: rapoo

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

--------------------

读书人网 >移动开发

热点推荐