Chinaunix首页 | 论坛 | 博客
  • 博客访问: 356422
  • 博文数量: 197
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 303
  • 用 户 组: 普通用户
  • 注册时间: 2013-09-02 14:21
文章分类

全部博文(197)

文章存档

2014年(89)

2013年(108)

我的朋友

分类: 嵌入式

2013-11-14 17:57:52

设置堆栈指针

stack_setup:

ldr r0, _TEXT_BASE /* upper 128 KiB: relocated uboot   */

sub r0, r0, #CFG_MALLOC_LEN /* malloc area                      */

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    */

设置cpu的时钟

#ifndef CONFIG_SKIP_LOWLEVEL_INIT

    bl clock_init

#endif  

#define S3C2410_MPLL_200MHZ     ((0x5c<<12)|(0x04<<4)|(0x00))

#define S3C2410_UPLL_48MHZ      ((0x28<<12)|(0x01<<4)|(0x02))

#define S3C2410_CLKDIV          0x03    /* FCLK:HCLK:PCLK = 1:2:4 */

void clock_init(void)

{

S3C24X0_CLOCK_POWER *clk_power = (S3C24X0_CLOCK_POWER *)0x4C000000;

    /* support both of S3C2410 and S3C2440, by */

    if ((GSTATUS1 == 0x32410000) || (GSTATUS1 == 0x32410002))

    {

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

        clk_power->CLKDIVN = S3C2410_CLKDIV;

        /* change to asynchronous bus mod */

        __asm__(    "mrc    p15, 0, r1, c1, c0, 0\n"    /* read ctrl register   */  

                    "orr    r1, r1, #0xc0000000\n"      /* Asynchronous         */  

                    "mcr    p15, 0, r1, c1, c0, 0\n"    /* write ctrl register  */  

                    :::"r1"

                    );

        

        /* to reduce PLL lock time, adjust the LOCKTIME register */

        clk_power->LOCKTIME = 0xFFFFFFFF;

        /* configure UPLL */

        clk_power->UPLLCON = S3C2410_UPLL_48MHZ;

        /* some delay between MPLL and UPLL */

        delay (4000);

        /* configure MPLL */

        clk_power->MPLLCON = S3C2410_MPLL_200MHZ;

        /* some delay between MPLL and UPLL */

        delay (8000);

    }

    else

    {

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

        clk_power->CLKDIVN = S3C2440_CLKDIV;

        /* change to asynchronous bus mod */

        __asm__(    "mrc    p15, 0, r1, c1, c0, 0\n"    /* read ctrl register   */  

                    "orr    r1, r1, #0xc0000000\n"      /* Asynchronous         */  

                    "mcr    p15, 0, r1, c1, c0, 0\n"    /* write ctrl register  */  

                    :::"r1"

                    );

        /* to reduce PLL lock time, adjust the LOCKTIME register */

        clk_power->LOCKTIME = 0xFFFFFFFF;

        /* configure UPLL */

        clk_power->UPLLCON = S3C2440_UPLL_48MHZ;

        /* some delay between MPLL and UPLL */

        delay (4000);

        /* configure MPLL */

        clk_power->MPLLCON = S3C2440_MPLL_400MHZ;

        /* some delay between MPLL and UPLL */

        delay (8000);

    }

}

硬件初始化完成,堆栈设置完成,之后将u-boot第二阶段的代码拷贝到内存

#ifndef CONFIG_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     clear_bss

ldr r2, _armboot_start

ldr r3, _bss_start

sub r2, r3, r2 /* r2 <- size of armboot            */

#if 1

bl  CopyCode2Ram /* r0: source, r1: dest, r2: size */

#else

add r2, r0, r2 /* r2 <- source end address         */

copy_loop:

ldmia r0!, {r3-r10} /* copy from source address [r0]    */

stmia r1!, {r3-r10} /* copy to   target address [r1]    */

cmp r0, r2 /* until source end addreee [r2]    */

ble copy_loop

#endif

#endif /* CONFIG_SKIP_RELOCATE_UBOOT */

上面的代码过程是,首先看uboot是不是已经在内存中运行了,如果是这样直接将bss区间置0就可以了,如果不是运行在内存中设置

r0 为flash起始位置

r1 为希望将u-boot拷贝到的ram位置

r2 u-boot代码段的长度

int CopyCode2Ram(unsigned long start_addr, unsigned char *buf, int size)

{

    unsigned int *pdwDest;

    unsigned int *pdwSrc;

    int i;

    if (bBootFrmNORFlash())

    {

        pdwDest = (unsigned int *)buf;

        pdwSrc  = (unsigned int *)start_addr;

        /* 从 NOR Flash启动 */

        for (i = 0; i < size / 4; i++)

        {

            pdwDest[i] = pdwSrc[i];

        }

        return 0;

    }

    else

    {

        /* 初始化NAND Flash */

nand_init_ll();

        /* 从 NAND Flash启动 */

        nand_read_ll(buf, start_addr, (size + NAND_BLOCK_MASK)&~(NAND_BLOCK_MASK));

return 0;

    }

}

将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 loop...                    */

add r0, r0, #4

cmp r0, r1

ble clbss_l

跳转到内存中执行u-boot的第二阶段过程

ldr pc, _start_armboot


阅读(461) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~