Linux系統移植⑦:uboot啟動流程詳解-board_init_r執行過程
在uboot中,board_init_r 是啟動流程中的一個關鍵函數,負責完成板級(board-specific)的后期初始化工作。以下是關于該函數的詳細說明:
1. 函數作用
board_init_r 是U-Boot在重定位(relocation)后執行的第二階段初始化函數,主要完成:
- 外設初始化:如網卡、存儲設備(MMC/NAND)、USB等。
- 環境變量加載:從Flash或EEPROM中讀取環境變量。
- 命令行準備:初始化命令行解析器,準備接收用戶輸入。
- 啟動延遲處理:處理bootdelay,等待用戶中斷或自動啟動。
- 執行主循環:進入main_loop(),處理用戶命令或自動啟動內核。
其源碼如下:
可以看出board_init_r函數中也是通過調用初始化序列 init_sequence_r進行依次初始化
給出部分代碼截圖和主要函數解釋
initr_trace 函數:如果定義了宏 CONFIG_TRACE 的話就會調用函數 trace_init,初始化和調試跟蹤有關的內容。
initr_reloc 函數:用于設置 gd->flags,標記重定位完成。
initr_caches 函數:用于初始化 cache,使能 cache。
initr_reloc_global_data 函數:初始化重定位后 gd 的一些成員變量。
initr_barrier 函數: I.MX6ULL 未用到。
initr_malloc 函數:初始化 malloc。
initr_console_record 函數:初始化控制臺相關的內容, I.MX6ULL 未用到,空函數。
bootstage_relocate 函數:啟動狀態重定位。
initr_bootstage 函數:初始化 bootstage 什么的。
board_init 函數:板級初始化,包括 74XX 芯片, I2C、 FEC、 USB 和 QSPI 等。這里執行的是 mx6ull_alientek_emmc.c 文件中的 board_init 函數。
stdio_init_tables 函數: stdio 相關初始化。
initr_serial 函數:初始化串口。
initr_announce 函數:與調試有關,通知已經在 RAM 中運行。
power_init_board 函數:初始化電源芯片,正點原子的 I.MX6ULL 開發板沒有用到。
initr_flash 函數:對于 I.MX6ULL 而言,沒有定義宏 CONFIG_SYS_NO_FLASH的話函數 initr_flash 才有效。
initr_nand 函數:初始化 NAND,如果使用 NAND 版本核心板的話就會初始化NAND。
initr_mmc 函數:初始化 EMMC,如果使用 EMMC 版本核心板的話就會初始EMMC,
initr_env 函數:初始化環境變量。
initr_secondary_cpu 函數:初始化其他 CPU 核, I.MX6ULL 只有一個核,因此此函數沒用。
stdio_add_devices 函數:各種輸入輸出設備的初始化,如 LCD driver, I.MX6ULL使用 drv_video_init 函數初始化 LCD。
initr_jumptable 函數:初始化跳轉表。
console_init_r 函數 : 控制 臺初 始 化, 初 始化 完 成以 后 此函 數會 調 用stdio_print_current_devices 函數來打印出當前的控制臺設備
interrupt_init 函數:初始化中斷。
initr_enable_interrupts 函數:使能中斷。
initr_ethaddr 函數:初始化網絡地址,也就是獲取 MAC 地址。讀取環境變量“ethaddr”的值。
board_late_init 函數:板子后續初始化,此函數定義在文件 mx6ull_alientek_emmc.c中,如果環境變量存儲在 EMMC 或者 SD 卡中的話此函數會調用 board_late_mmc_env_init 函數初始化 EMMC/SD。會切換到正在時候用的 emmc 設備
initr_net 函數:初 始 化 網 絡 設 備 , 函 數 調 用 順 序 為 initr_net->eth_initialize->board_eth_init()
run_main_loop 函數:主循環,處理命令。