u-boot-1.1.6源代码---start.S

来源:互联网 发布:mac下载不了软件 编辑:程序博客网 时间:2024/05/18 02:30

下面是u-boot的入口start.S程序:

/* ************************************************************************* * * Jump vector table as in table 3.1 in [1] *1.set SVC mode *2.关看门狗 *3.屏蔽所有中断 *4.初始化SDRAM *5.设置堆栈 *6.设置时钟 *7.将代码从nor flash拷贝到SDRAM *8.跳转到start_armboot ************************************************************************* */.globl _start_start:b       resetldrpc, _undefined_instructionldrpc, _software_interruptldrpc, _prefetch_abortldrpc, _data_abortldrpc, _not_usedldrpc, _irqldrpc, _fiq_undefined_instruction:.word undefined_instruction_software_interrupt:.word software_interrupt_prefetch_abort:.word prefetch_abort_data_abort:.word data_abort_not_used:.word not_used_irq:.word irq_fiq:.word fiq.balignl 16,0xdeadbeef_TEXT_BASE:.wordTEXT_BASE.globl _armboot_start_armboot_start:.word _start/* * These are defined in the board-specific linker script. */.globl _bss_start_bss_start:.word __bss_start.globl _bss_end_bss_end:.word _end.globl FREE_RAM_ENDFREE_RAM_END:.word0x0badc0de.globl FREE_RAM_SIZEFREE_RAM_SIZE:.word0x0badc0de.globl PreLoadedONRAMPreLoadedONRAM:.word0#ifdef CONFIG_USE_IRQ/* IRQ stack memory (calculated at run-time) */.globl IRQ_STACK_STARTIRQ_STACK_START:.word0x0badc0de/* IRQ stack memory (calculated at run-time) */.globl FIQ_STACK_STARTFIQ_STACK_START:.word 0x0badc0de#endif/* * the actual reset code */reset:/* * set the cpu to SVC32 mode */mrsr0,cpsrbicr0,r0,#0x1f/*4    3    2    1    0*//*1    0    0    1    1*/orrr0,r0,#0xd3msrcpsr,r0/* turn off the watchdog */#if defined(CONFIG_S3C2400)# define pWTCON0x15300000# define INTMSK0x14400008/* Interupt-Controller base addresses */# define CLKDIVN0x14800014/* clock divisor register */#elif defined(CONFIG_S3C2410)# define pWTCON0x53000000# define INTMOD     0X4A000004# define INTMSK0x4A000008/* Interupt-Controller base addresses */# define INTSUBMSK0x4A00001C# define CLKDIVN0x4C000014/* clock divisor register */#endif/*屏蔽所有中断*/#if defined(CONFIG_S3C2400) || defined(CONFIG_S3C2410)ldr     r0, =pWTCONmov     r1, #0x0str     r1, [r0]/* * mask all IRQs by setting all bits in the INTMR - default */movr1, #0xffffffffldrr0, =INTMSKstrr1, [r0]# if defined(CONFIG_S3C2410)ldrr1, =0x3ffldrr0, =INTSUBMSKstrr1, [r0]# endif#if 0/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldrr0, =CLKDIVNmovr1, #3strr1, [r0]#endif#endif/* CONFIG_S3C2400 || CONFIG_S3C2410 *//* * we do sys-critical inits only at reboot, * not when booting from ram! */#ifndef CONFIG_SKIP_LOWLEVEL_INITadrr0, _start//这里要注意  adr指令是将_start的加载地址传给r0的,即0x0000_0000ldrr1, _TEXT_BASE//这里ldr指令是将_TEXT_BASE的链接地址传给r1的,ldr和adr指令有很大区别cmp     r0, r1                  /* don't reloc during debug         */blnecpu_init_crit            // 初始化SDRAM#endif/* Set up the stack    */stack_setup:ldrr0, _TEXT_BASE/* upper 128 KiB: relocated uboot   */subr0, r0, #CFG_MALLOC_LEN/* malloc area                      */subr0, r0, #CFG_GBL_DATA_SIZE /* bdinfo                        */#ifdef CONFIG_USE_IRQsubr0, r0, #(CONFIG_STACKSIZE_IRQ+CONFIG_STACKSIZE_FIQ)#endifsubsp, r0, #12/* leave 3 words for abort-stack    */#ifndef CONFIG_SKIP_LOWLEVEL_INIT    bl clock_init#endif    /* *这里有一个说明 : *  adr指令 : 取相对地址,例如我们的u-boot的链接地址开始是0x33f8_0000,而加载地址是0x0000_0000,所以 *  adrr0, _startr0=====0 *  而ldr直接取的链接地址    */#ifndef CONFIG_SKIP_RELOCATE_UBOOTrelocate:/* relocate U-Boot to RAM    */adrr0, _start/* r0 == 0x0000_0000  */ldrr1, _TEXT_BASE/* test if we run from flash or RAM */cmp     r0, r1                  /* don't reloc during debug         */beq     clear_bssldrr2, _armboot_startldrr3, _bss_startsubr2, r3, r2/* r2 <- size of armboot            */#if 1bl  CopyCode2Ram/* r0: source, r1: dest, r2: size */#elseaddr2, r0, r2/* r2 <- source end address         */copy_loop:ldmiar0!, {r3-r10}/* copy from source address [r0]    */stmiar1!, {r3-r10}/* copy to   target address [r1]    */cmpr0, r2/* until source end addreee [r2]    */blecopy_loop#endif#endif/* CONFIG_SKIP_RELOCATE_UBOOT */clear_bss:ldrr0, _bss_start/* find start of bss segment        */ldrr1, _bss_end/* stop here                        */mov r2, #0x00000000/* clear                            */clbss_l:strr2, [r0]/* clear loop...                    */addr0, r0, #4cmpr0, r1bleclbss_lSetLoadFlag:/* Set a global flag, PreLoadedONRAM */adrr0, _start/* r0 <- current position of code   */ldrr1, _TEXT_BASE/* test if we run from flash or RAM */cmp     r0, r1                  /* don't reloc during debug         */ldr r2, =PreLoadedONRAMmov r3, #1streq r3, [r2]#if 0/* try doing this stuff after the relocation */ldr     r0, =pWTCONmov     r1, #0x0str     r1, [r0]/* * mask all IRQs by setting all bits in the INTMR - default */movr1, #0xffffffffldrr0, =INTMRstrr1, [r0]/* FCLK:HCLK:PCLK = 1:2:4 *//* default FCLK is 120 MHz ! */ldrr0, =CLKDIVNmovr1, #3strr1, [r0]/* END stuff after relocation */#endif/* 第三阶段  将u-boot的其余代码拷贝到SDRAM以后,在这里跳转到拷贝的目的地址执行*/// 这里将_start_armboot的链接地址给pc指针,从而实现了从nor flash// 执行到跳到SDRAM执行。ldrpc, _start_armboot_start_armboot:.word start_armboot/* ************************************************************************* * * CPU_init_critical registers * * setup important registers * setup memory timing * ************************************************************************* */#ifndef CONFIG_SKIP_LOWLEVEL_INITcpu_init_crit:/* * flush v4 I/D caches */movr0, #0mcrp15, 0, r0, c7, c7, 0/* flush( 清空 ) v3/v4 cache */mcrp15, 0, r0, c8, c7, 0/* flush v4 TLB *//* * disable MMU stuff and caches */mrcp15, 0, r0, c1, c0, 0bicr0, r0, #0x00002300@ clear bits 13, 9:8 (--V- --RS)bicr0, r0, #0x00000087@ clear bits 7, 2:0 (B--- -CAM)orrr0, r0, #0x00000002@ set bit 2 (A) Alignorrr0, r0, #0x00001000@ set bit 12 (I) I-Cachemcrp15, 0, r0, c1, c0, 0/* * before relocating, we have to setup RAM timing * because memory timing is board-dependend, you will * find a lowlevel_init.S in your board directory. */movip, lrbllowlevel_initmovlr, ipmovpc, lr#endif /* CONFIG_SKIP_LOWLEVEL_INIT */


0 0