VERSION = 2014
PATCHLEVEL = 04
芯片到uboot啟動流程 :ROM → MLO(SPL)→ uboot.img
第一級bootloader:引導加載程序,板子上電后會自動執(zhí)行這些代碼晕窑,如啟動方式(SDcard、SPI蓬坡、NOR)岗憋,然后跳轉至第二級bootloader阁簸。這些代碼存放在 176KB 的 ROM 中.
第二級bootloader:MLO(SPL)畔柔,用于硬件初始化,關看門狗捍掺,關中斷撼短,設置CPU時鐘頻率、速度挺勿、加載uboot.img曲横、dts等操作,然后會跳轉到第三級bootloader不瓶。MLO文件應該會被映射到 64 KB的 Internal SRAM 中.
第三級bootloader:u-boot.img, C代碼的入口.
其中第一級 bootloader 是板子固化的禾嫉,第二級和第三級是通過編譯 uboot 所得的。
這里先整體介紹u-boot的整體功能蚊丐,接下來再具體展開分析熙参。
執(zhí)行流程如下:
SPL(MLO):
-
1. reset; (@arch/arm/cpu/armv7/start.s)
- -> @ disable interrupts (FIQ and IRQ);
- -> @ set the cpu to SVC32 mode;
-
2. cpu_init_cp15: (@arch/arm/cpu/armv7/start.s)
- -> @ setup CP15 registers (cache, MMU, TLBs);
- -> @ Invalidate L1 I/D;
- -> @ disable MMU stuff and caches
-
3. cpu_init_crit: (@arch/arm/cpu/armv7/start.s)
- -> go setup pll,mux,memory;
- -> lowlevel_init: (@arch/arm/cpu/armv7/lowlevel_init.s)
- ----> @ Setup a temporary stack
- ----> @ Set up global data
- ----> s_init: (@arch/arm/cpu/armv7/am33xx/board.c)
- -------> watchdog_disable
- -------> timer_init
- -------> set_uart_mux_conf
- -------> setup_clocks_for_console
- -------> uart_soft_reset
- -------> preloader_console_init
- -------> rtc32k_enable
- ------->
prcm_init
- ------->
sdram_init
-
4. _main: (@arch/arm/lib/crt0.s)
- -> @ Set up initial C runtime environment and call board_init_f;
- -> board_init_f:(@arch/arm/lib/spl.c)
- ----> @ call board_init_r;
- ----> board_init_r:(@common/spl/spl.c)
- -------> spl_xxx_load_image :根據不同的啟動方式加載 u-boot 鏡像
- -------> jump_to_image_no_args:進入u-boot代碼運行
U-BOOT:
-
1. reset; (@arch/arm/cpu/armv7/start.s)
- -> @ set SVC mode;
- -> @ disable FIQ and IRQ;
-
2. _main: (@arch/arm/lib/crt0.s)
- -> @ Set up initial C runtime environment and call board_init_f;
- -> board_init_f:(@arch/arm/lib/board.c)
- ----> init_sequence:(@arch/arm/lib/board.c);
- -> relocate_code:(@arch/arm/lib/relocate.S)
- ----> @ 代碼重定位;
- -> board_init_r:(@arch/arm/lib/board.c)
- ----> enable_caches;
- ----> board_init:(@board/ti/am335x/board.c);
- -------> @ 根據配置初始化各種外設;
- ----> main_loop:(@common/main.c);
參考文獻:
http://blog.chinaunix.net/uid-28458801-id-3486399.html