在嵌入式開發(fā)中,U-Boot作為引導程序的“中流砥柱”,負責初始化硬件、加載內核并啟動系統(tǒng)。對于Rockchip平臺的設備(如常見的開發(fā)板、智能終端),boot_rkimg.c是U-Boot中專門處理啟動流程的核心文件之一。
今天我們就來深入剖析這個文件,看看它如何管理啟動設備、處理下載/恢復模式,以及加載設備樹(DTB),最終為內核啟動鋪平道路。

一、文件定位:Rockchip啟動流程的“調度中心”
boot_rkimg.c是Rockchip平臺U-Boot定制化開發(fā)的關鍵文件,主要職責包括:
?初始化并選擇啟動設備(如eMMC、SD卡、NVMe、SCSI等);
?檢測下載/恢復模式觸發(fā)條件(如按鍵、熱鍵);
?加載并驗證設備樹(DTB),為內核啟動提供硬件描述;
?處理Android啟動相關的參數(shù)(如bootargs)。
可以說,它是Rockchip設備從U-Boot過渡到內核的“橋梁”。
二、核心函數(shù)解析:一步步看懂啟動邏輯
1.啟動設備管理:確定“從哪里啟動”
設備啟動的第一步是確定“從哪個存儲介質啟動”(如eMMC、SD卡)。這部分邏輯由多個函數(shù)協(xié)作完成。
bootdev_init(const char *devtype, const char *devnum)
?功能:初始化指定類型的啟動設備(如mmc、nvme、scsi)。
?細節(jié):
?根據(jù)devtype調用對應設備的初始化函數(shù)(如mmc_initialize初始化MMC設備,nvme_scan_namespace掃描NVMe設備);
?驗證設備是否存在,若存在則設置環(huán)境變量devtype和devnum(供后續(xù)流程使用)。
?舉例:若devtype為“mmc”,則初始化MMC控制器并檢查設備是否可用。
boot_devtype_init(void)
?功能:按照優(yōu)先級確定最終的啟動設備(核心邏輯)。
?優(yōu)先級順序:
a.配置參數(shù):從平臺配置中解析啟動設備(param_parse_assign_bootdev);
b.ATAGS:從ATAGS中獲取啟動設備(param_parse_atags_bootdev,僅部分平臺支持);
c.掃描列表:若前兩步失敗,調用rk_board_scan_bootdev掃描默認設備列表;
d.默認值:若所有掃描失敗,默認使用“mmc 0”(eMMC設備)。
?輸出:打印啟動設備來源(如“Bootdev (assign): mmc 0”)。
get_bootdev_type(void)
?功能:根據(jù)啟動設備類型(devtype)設置系統(tǒng)參數(shù),為內核傳遞啟動信息。
?細節(jié):
?映射設備類型到枚舉值(如“mmc”對應IF_TYPE_MMC,“nvme”對應IF_TYPE_NVME);
?向bootargs中添加存儲介質信息(如storagemedia=emmc)和Android啟動模式(如androidboot.mode=normal);
?兼容新舊Android版本規(guī)則(舊版本需指定介質作為模式,新版本統(tǒng)一用“normal”或“charger”)。
rockchip_get_bootdev(void)
?功能:獲取啟動設備的塊設備描述符(struct blk_desc),供后續(xù)讀寫操作使用。
?流程:
a.調用boot_devtype_init確保啟動設備已初始化;
b.通過設備類型和編號獲取blk_desc(塊設備描述符,包含設備大小、塊大小等信息);
c.若為MMC設備,額外打印時序模式(如“HS400”)和時鐘頻率。
2.下載與恢復模式:應對特殊啟動場景
U-Boot需支持“下載模式”(燒錄固件)和“恢復模式”(系統(tǒng)修復),這些邏輯由以下函數(shù)實現(xiàn)。
rockchip_dnl_key_pressed(void)
?功能:檢測“下載按鍵”是否按下(弱函數(shù),可被板級代碼覆蓋)。
?實現(xiàn):
?若支持按鍵設備(CONFIG_DM_KEY),直接讀取按鍵狀態(tài);
?若支持ADC(CONFIG_ADC),通過ADC采樣判斷按鍵是否按下(如音量鍵,采樣值在0~30范圍內視為按下)。
setup_download_mode(void)
?功能:根據(jù)按鍵或熱鍵狀態(tài),決定進入下載模式、恢復模式或fastboot模式。
?流程:
a.若下載按鍵按下或檢測到HK_ROCKUSB_DNL熱鍵:
檢測USB總線供電(rockchip_u2phy_vbus_detect),若供電正常則進入下載模式(執(zhí)行“download”命令);
若供電異常,進入恢復模式(設置reboot_mode=recovery-key)。
a.若檢測到HK_FASTBOOT熱鍵,進入fastboot模式(設置reboot_mode=fastboot)。
board_run_recovery_wipe_data(void)
?功能:觸發(fā)“恢復模式并擦除數(shù)據(jù)”(如用戶執(zhí)行恢復出廠設置)。
?流程:
a.找到misc分區(qū)(存儲啟動控制信息的特殊分區(qū));
b.向misc分區(qū)寫入bootloader_message(包含命令boot-recovery和參數(shù)--wipe_data);
c.設置reboot_mode=recovery并重啟,觸發(fā)恢復模式。
3.設備樹(DTB)處理:為內核提供硬件描述
設備樹(DTB)是內核識別硬件的關鍵,boot_rkimg.c負責加載和驗證DTB。
dtb_scan(void *fdt, int where)
?功能:從不同位置掃描并加載DTB(按優(yōu)先級嘗試)。
?掃描位置:
a.分發(fā)版DTB(LOCATE_DISTRO):從可啟動分區(qū)加載預定義路徑的DTB(如/boot/dtb);
b.資源鏡像(LOCATE_RESOURCE):從Rockchip資源鏡像中提取DTB;
c.FIT鏡像(LOCATE_FIT):從FIT鏡像(一種多組件鏡像格式)的images/fdt節(jié)點加載DTB。
rockchip_read_dtb_file(void *fdt)
?功能:加載DTB到指定內存地址,并進行初始化。
?流程:
a.調用dtb_scan嘗試從不同位置加載DTB;
b.為DTB分配內存(sysmem_alloc_base),確保內核可訪問;
c.執(zhí)行設備樹修復(rk_board_early_fdt_fixup,板級定制化修正)和Android相關的設備樹疊加(android_fdt_overlay_apply)。
rockchip_ram_read_dtb_file(void *img, void *fdt)
?功能:從內存中的鏡像(如已加載的Android啟動鏡像或FIT鏡像)中提取DTB。
?細節(jié):
?若為Android鏡像:跳過內核和ramdisk區(qū)域,提取后續(xù)的DTB;
?若為FIT鏡像:從images/fdt或images/resource節(jié)點提取DTB數(shù)據(jù)。
三、在U-Boot啟動流程中的作用
boot_rkimg.c貫穿U-Boot啟動的多個關鍵階段,簡單來說,它的作用是:
1.啟動前準備:確定啟動設備,初始化硬件接口(MMC、NVMe等),為后續(xù)加載鏡像鋪路;
2.模式判斷:檢測特殊按鍵或熱鍵,決定進入正常啟動、下載模式還是恢復模式;
3.內核啟動鋪墊:加載并驗證DTB,設置內核啟動參數(shù)(bootargs),確保內核能正確識別硬件。
沒有它,Rockchip設備就無法確定從哪里啟動、如何適配硬件,更無法響應燒錄或恢復等特殊操作。
四、總結
boot_rkimg.c是Rockchip平臺U-Boot中連接硬件與內核的“核心樞紐”。它通過精細化的設備管理、靈活的模式切換和可靠的DTB處理,確保設備從U-Boot平穩(wěn)過渡到內核啟動。
對于開發(fā)者而言,理解這個文件的邏輯有助于:
?調試啟動設備識別問題(如“找不到eMMC”);
?定制化啟動流程(如添加新的啟動設備類型);
?修復DTB加載失敗等常見啟動故障。
下次調試Rockchip設備啟動問題時,不妨從這個文件入手,或許能快速定位癥結所在~
發(fā)布評論請先 登錄
U-boot的基本介紹
U-Boot的啟動及移植分析
Porting U-Boot to the Control
u-boot的Makefile分析
嵌入式U-BOOT的啟動流程及移植
基于S3C2440的U-Boot開機logo的設計
u-boot學習指南
u-boot簡介
詳解U-Boot引導內核分析
fireflyAIO-3399C主板U-Boot介紹
深度解析U-Boot網(wǎng)絡實現(xiàn)
U-Boot架構淺析
深入解析U-Boot image.c:RK平臺鏡像處理核心邏輯
解析Rockchip平臺U-Boot核心文件:boot_rkimg.c到底做了什么?
評論