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的啓動流程。這裏我通過一個圖來說明這個過程。

         由於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上電後就會自動執行。以下是時序圖:


          下面是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*/




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章