1. 程式人生 > >am335x uboot2016.05 (MLO u-boot.img)執行流程(轉)

am335x uboot2016.05 (MLO u-boot.img)執行流程(轉)

eve eset dog 不同的 common 速度 star setup oba

am335x的cpu上電後,執行流程:ROM->MLO(SPL)->u-boot.img

第一級bootloader:引導加載程序,板子上電後會自動執行這些代碼,如啟動方式(SDcard、SPI、NOR),然後跳轉至第二級bootloader。這些代碼應該是存放在 176KB 的 ROM 中

第二級bootloader:MLO(SPL),用於硬件初始化,關看門狗,關中斷,設置CPU時鐘頻率、速度、加載uboot.img、dts等操作,MLO文件應該會被映射到 64 KB的 Internal SRAM 中。

第三級bootloader:u-boot.img, C代碼的入口

MLO與u-boot執行流程如下:

reset //(arch/arm/cpu/armv7/start.S)
save_boot_params_ret //(arch/arm/cpu/armv7/start.S)
|- disable interrupts
|- cpu_init_cp15 //(arch/arm/cpu/armv7/start.S)
| |- Invalidate L1 I/D
| |- disable MMU stuff and caches
|- cpu_init_crit //(arch/arm/cpu/armv7/start.S)
| |- 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
| |- set_uart_mux_conf
| |- setup_clocks_for_console
| |- uart_soft_reset
|- _main //(arch/arm/lib/crt0.S)

|(MLO)如果是 MLO 文件
|- board_init_f //(arch/arm/cpu/armv7/am33xx/board.c)
| |- board_early_init_f //(arch/arm/cpu/armv7/am33xx/board.c)
| | |- prcm_init
| | |- set_mux_conf_regs
| |- sdram_init //(board/ti/am335x/board.c) 初始化 DDR
|- spl_relocate_stack_gd
|- board_init_r //(common/spl/spl.c) 【完成u-boot.img dts加載】
|- ...
|- spl_load_image //根據不同的啟動方式加載 u-boot 鏡像,
|- jump_to_image_no_args //進入u-boot代碼運行


|(U-Boot)如果是U-Boot 鏡像
|- board_init_f //(common/board_f.c)
| |- ...
| |- initcall_run_list(init_sequence_f)
| |- ...
|
|- relocate_code //(arch/arm/lib/relocate.S) 代碼重定位
|- relocate_vectors //(arch/arm/lib/relocate.S) 向量表重定義
|- Set up final (full) environment
|- board_init_r //(common/board_r.c)
|- initcall_run_list(init_sequence_r)//初始化各種外設
|- main_loop()

am335x uboot2016.05 (MLO u-boot.img)執行流程(轉)