天天看点

u-boot-1.3.4的start.S代码分析

u-boot-1.3.4的start.S代码分析

代码:u-boot-1.3.4\cpu\arm920t\start.S

本段代码是uboot的stage1,主要作以下处理:

1)设置CPU为SVC32模式同时屏蔽IRQ,FIQ中断

       mrs    r0,cpsr

    bic    r0,r0,#0x1f

    orr    r0,r0,#0xd3

    msr    cpsr,r0

2)点亮红色LED(但是好像什么也没做)

    bl coloured_LED_init

    bl red_LED_on

3)如果是AT91RM9200把异常表拷到地址0x00000000处(其它CPU为什么不需要拷?)

4)如果是CONFIG_S3C2400或S3C2410关看门狗和屏蔽所有中断,以及设置FCLK:HCLK:PCLK的比例关系为1:2:4

        /* turn off the watchdog */

    ldr     r0, =pWTCON

    mov     r1, #0x0

    str     r1, [r0]

    /*

     * mask all IRQs by setting all bits in the INTMR - default

     */

    mov    r1, #0xffffffff

    ldr    r0, =INTMSK

    str    r1, [r0]

# if defined(CONFIG_S3C2410)

    ldr    r1, =0x3ff

    ldr    r0, =INTSUBMSK

# endif

    /* FCLK:HCLK:PCLK = 1:2:4 */

    /* default FCLK is 120 MHz ! */

    ldr    r0, =CLKDIVN

    mov    r1, #3

5)CPU低级初始化(cache,MMU,RAM timing)

bl    cpu_init_crit

6)如果当前位置为FLASH, 拷贝uboot到RAM

7)设置Stage2的堆栈,清除BSS

8)跳转到Stage2的起始地址_start_armboot

ldr    pc, _start_armboot

其它start.S中有下面这行代码,是以前的1.1.6上是没有的。

    .balignl 16,0xdeadbeef

它的含义是以16字节边界对齐,为了对齐而越过的

地址以字为单位填冲值0xdeadbeef。我猜0xdeadbeef可能NOP指令。

继续阅读