MPC8309 NAND_SPL uboot初始化流程

nand_spl只是在常規uboot的前面打了一個padding,用該padding支持系統從NAND中啓動,最後還是跳轉到常規uboot處開始執行。

UBOOT第一階段

UBOOT第一階段在內部FCM 4K RAM中執行。當CPU啓動時,自動把NAND Flash的前4K內容拷貝到FCM的4K RAM中,並根據配置字把這4K RAM映射到BMS(即0x00000000或0xFFF00000,下面假設爲0xFFF00000)。然後CPU從0x100偏移處開始執行代碼(即0xFFF00100,連接器應該保證_start剛好在該地址處,在Start.S中)。然後代碼執行一系列初始化操作,其中有操作要LOCK CPU的數據CACHE作爲RAM,LOCK的地址爲CONFIG_SYS_INIT_RAM_ADDR(0xE6000000),長度爲CONFIG_SYS_INIT_RAM_END(0x1000,即4K)。這個RAM作用有三個,一是存放C運行環境的全局變量,二是開闢C運行環境的STACK,三是存放uboot的global_data數據。代碼在初始化好C語言運行環境後跳轉到cpu_init_f(在nand_init.c中),在此函數中設定CPU的一些特性,並初始化好LOCALBUS的BANK0,爲讀取掛在上面的NAND做準備。然後CPU調用board_init_f(在mpc8309som.c中),在這裏初始化串口打印、定時器、SDRAM,從此SDRAM便可讀寫;在此函數最後調用relocate_code,把FCM 4K RAM中的代碼拷貝並重定向到SDRAM中,同時在SDRAM中開闢新的大的STACK(默認拷貝到0x10000,SP開闢到0x20000)。在relocate_code的最後調用board_init_r函數(在mpc8309som.c中),此函數主要用來加載nand中的代碼到SDRAM中(默認0x1000000),加載完後跳轉到SDRAM中(CONFIG_SYS_NAND_U_BOOT_START)執行第二階段的操作(該函數並不返回)。
UBOOT第二階段
該階段其實也是從Start.S開始的,不過直接從_start_warm開始。跟第一階段一樣重新把CPU初始化一遍,跳轉到cpu_init_f、board_init_f,不過這兩個函數並不是第一階段的那兩個函數,這兩個函數分別位於cpu_init.c和board.c。這個cpu_init_f相較於第一階段精簡版的cpu_init_f初始化的東西比較多,對於LOCALBUS,它把所有要用到的BANK和WINDOW都初始化了。board_init_f也是全功能版的,它依次調用init_sequence中所有的init函數,對板級進行初始化,然後準備把運行環境完全搬到SDRAM的末尾處,包括分配堆空間、棧空間、拷貝global_data到新地址,做好以上操作後,再次調用relocate_code運行到SDRAM的末端代碼中,relocate_code最後調用board.c中的board_init_r,執行進一步的操作。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章