G870 uboot启动流程

硬件平台:飞思卡尔iMX258 ARM9 CPU +256MB的Nand Flash(uboot存放在此中)

        首先通过uboot的链接文件,其中text段为uboot的代码段,我们可以看到uboot运行时执行的第一段代码在start.S中:


OUTPUT_FORMAT("elf32-littlearm", "elf32-littlearm", "elf32-littlearm")
OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0x00000000;

    . = ALIGN(4);                                               //于4个字节对齐
    .text :                                                            //代码段
    {
        cpu/arm926ejs/start.o    (.text)
        *(.text)
    }

    . = ALIGN(4);
    .rodata : { *(SORT_BY_ALIGNMENT(SORT_BY_NAME(.rodata*))) }  //只读数据段

    . = ALIGN(4);
    .data : { *(.data) }   //读写数据段

    . = ALIGN(4);
    .got : { *(.got) }     //uboot特有段

    . = .;
    __u_boot_cmd_start = .;
    .u_boot_cmd : { *(.u_boot_cmd) }     //uboot命令段
    __u_boot_cmd_end = .;

    . = ALIGN(4);
    __bss_start = .;
    .bss (NOLOAD) : { *(.bss) . = ALIGN(4); }            // bss段
    _end = .;
}

        找到start.s这个文件,以这个文件为起点看uboot的启动流程。这里我通过一个图来说明这个过程。

G870 uboot启动流程_第1张图片

         由于iMX258内部具有有32KB的ROM(包括HAB)和128KB的RAM,在uboot加载前,CPU先运行iROM里面的一部分代码,这部分代码为芯片出厂时固化,它根据相关引脚的配置值(NF8BOOT or  NF16BOOT为低)可以检测到CPU从外部Nand Flash进行引导,先copy 4KB的uboot代码(即从start.s开始)到NFC的内部RAM Buffer运行,copy完成后,会产生一个中断信号IPI_INT_NFC,以上过程CPU上电后就会自动执行。以下是时序图:

G870 uboot启动流程_第2张图片


          下面是iMAX25在start.s特有的一部分代码,它完成了把uboot接下来的代码copy到RAM的功能(内部RAM的地址为0x7802_0000~0x7fff_ffff,外部SDRAM的地址为0x8000_0000~0x8fff_ffff)。

#ifdef CONFIG_MX25
       /* Copy vectors to mask ROM indirect addr */
    adr r0, _start   /* r0 <- current position of code   */
    ldr r1, =0x7801FFC0     /*把 从0x7801FFC0开始的RAM 地址装入r1*/
    mov r2, #16   /*计数寄存器*/
copyex:
    subs r2, r2, #1   /*循环16次,一次copy 4个字,总共1kb*/
    ldr r3, [r0], #4   /*将存储器地址为r0的字数据-> r3,然后再把r0+4->r0*/
    str r3, [r1], #4  /*把r3中的数据加载到r1所对应的地址上,然后r1+4->r1*/
    bne copyex    /*r2若不等于0,跳至copyex*/




你可能感兴趣的:(G870 uboot启动流程)