首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

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

2013-01-07 
smdkc100之u-boot 2010.03代码的分析2下面是一条跳转指令,代码这里不贴,但是其中的代码很重要,在lowlevel.

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

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

热点排行