一、為什么要了解uboot啟動流程uboot一般已經調試好了,如果是原廠給的源碼,基本上不需要做過多的修改,但是在實際應用中,可能會出現各種問題,可能需要啟動優化、開機速度調整等,這個時候就需要關注uboot了。初學者甚至很多工程師不知其中原理,往往在開發過程中不知所措,消耗很多不必要的時間,導致項目開發周期拉長。二、相關概念、流程和理解Boot-order RK平臺根據前級Loader代碼是否開源,目前有兩套啟動方式:
TPL 相當于 ddr bin,SPL 相當于 miniloader。TPL+SPL 的組合實現了跟 RK 閉源 ddr.bin+miniloader 一致的功能,可相互替換。Driver-probe U-Boot雖然引入了device-driver開發模型,但初始化階段不會像kernel那樣自動發起已注冊device-driver的probe。driver的probe必須由用戶主動調用發起。接口如下:// 前級loader閉源BOOTROM => ddr bin => Miniloader => TRUST => U-BOOT => KERNEL// 前級loader開源BOOTROM => TPL => SPL => TRUST => U-BOOT => KERNEL
上述接口的核心調用:int uclass_get_device(enum uclass_id id, int index, struct udevice **devp);int uclass_get_device_by_name(enum uclass_id id, const char *name,struct udevice **devp);int uclass_get_device_by_seq(enum uclass_id id, int seq, struct udevice **devp);int uclass_get_device_by_of_offset(enum uclass_id id, int node, struct udevice**devp);int uclass_get_device_by_ofnode(enum uclass_id id, ofnode node, struct udevice**devp);int uclass_get_device_by_phandle_id(enum uclass_id id,int phandle_id, struct udevice **devp);int uclass_get_device_by_phandle(enum uclass_id id,struct udevice *parent, struct udevice **devp);int uclass_get_device_by_driver(enum uclass_id id,const struct driver *drv, struct udevice**devp);int uclass_get_device_tail(struct udevice *dev, int ret, struct udevice **devp);......
int device_probe(struct udevice *dev); // 建議用戶一定要了解內部實現!
ShellU-Boot的Shell叫CLI(cmdline line interface),即命令行模式,用戶可以根據自己需求自定義CMD。CMD除了通過Shell調用,還能通過 run_command() 和 run_command_list() 以代碼的形式調用。Boot-CommandU-Boot 最終通過 CONFIG_BOOTCOMMAND 定義的啟動命令引導kernel。在執行 CONFIG_BOOTCMD 之前還會執行 CONFIG_PREBOOT 預啟動命令,通常這個命令定義為空。TPL/SPL/U-Boot-properU-Boot 通過使用不同的編譯條件可以用同一套代碼獲取三種不同功能的Loader:TPL/SPL/U-Boot proper。TPL(Tiny Program Loader)和 SPL(Secondary Program Loader)是比 U-Boot 更早階段的 Loader:TPL:運行在 sram 中,負責完成 ddr 初始化;SPL:運行在 ddr 中,負責完成系統的 lowlevel 初始化、后級固件加載(trust.img 和 uboot.img);U-Boot proper:運行在ddr中,即我們通常所說的"U-Boot",它負責引導kernel;說明:U-Boot proper 這一說法主要是為了和 SPL 區分開。出于習慣,后續章節提到的 U Boot proper 我們都簡稱為 U-Boot。啟動流程:int run_command(const char *cmd, int flag)int run_command_list(const char *cmd, int len, int flag)
BOOTROM => TPL(ddr bin) => SPL(miniloader) => TRUST => U-BOOT => KERNEL
聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網站授權轉載。文章觀點僅代表作者本人,不代表電子發燒友網立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規問題,請聯系本站處理。
舉報投訴
-
Linux
+關注
關注
88文章
11641瀏覽量
218195 -
Uboot
+關注
關注
4文章
131瀏覽量
29805
發布評論請先 登錄
相關推薦
熱點推薦
請問有沒有用uboot引導啟動過rtthread-smart的?
通過uboot引導,在imx6ull開發板上啟動rtthread-smart,通過thtp從網口下載到內存后,用go命令無法啟動,且沒有額外的打印消息,有沒有遇到同樣問題的?這個該怎么解決
發表于 09-28 10:50
BB Black使用uboot啟動rtt,data abort錯誤怎么解決?
編譯通過,生成了rtthread.bin。把他復制到uboot的FAT分區,按照目錄下的uboot_cmd.txt的命令,把rtthread.bin加載到DDR,然后啟動的時候出現如下錯誤,單板重新
發表于 09-28 06:45
RK3128 Android 7.1 進入深度休眠流程分析
RK3128 Android 7.1 進入深度休眠流程分析RK3128是瑞芯微電子推出的一款低功耗四核Cortex-A7處理器,運行Android 7.1系統時進入深度休眠(Deep Sleep
發表于 07-22 10:45
求助,關于K230啟動流程疑問求解
proper,然后再啟動opensbi,再啟動linux 內核,為什么要將opensbi放在uboot proper的后面啟動,這樣做的好處是啥?
目前
發表于 07-11 06:42
迅為RK3588開發板修改默認配置并保存-android12/Linux編譯驅動到uboot
如果想要配置自己的 uboot,可以運行以下命令進行操作,在 SDK 源碼目錄下:
cd u-boot
make rk3588_defconfig
make menuconfig
運行結果如下圖所示
發表于 07-01 14:40
Linux修改uboot啟動延時方法詳細攻略,觸覺智能RK3568開發板演示
本文介紹Linux系統修改uboot啟動延時方法,使用觸覺智能EVB3568鴻蒙開發板演示,搭載瑞芯微RK3568,四核A55處理器,主頻2.0Ghz,1T算力NPU;支持開源鴻蒙
RK3562開發板uboot下GPIO的控制方法,觸覺智能嵌入式方案商
本文介紹如何uboot下GPIO的控制方法等,使用觸覺智能RK3562開發板演示,搭載4核A53處理器,主頻高達2.0GHz;內置獨立1Tops算力NPU,可應用于物聯網網關、平板電腦、智能家居
飛凌嵌入式ElfBoard ELF 1板卡-uboot啟動流程分析之uboot啟動階段
uboot啟動可分為匯編語言執行和C語言執行兩個階段,兩個階段以_main函數為分界。uboot第一階段由_start (arch/arm/lib/vectors.S)進入,然后跳轉到reset
發表于 05-30 09:24
飛凌嵌入式ElfBoard ELF 1板卡-uboot啟動流程分析之boot ROM階段
CPU上電之后執行的第一段代碼并不是uboot代碼,因為uboot存儲在啟動介質(存儲介質),如eMMC Flash、NAND Flash、SD卡,CPU想要執行啟動介質中的
發表于 05-28 10:01
RK3576 Android 14.0 SDK開發指南(第一集)
RK3576 Android 14.0 SDK代碼編譯
SDK下載到本地后大概70多個G
下載后要做個校驗
解壓后內核源碼
kernel代碼路徑說明
Android14支持6.1 版本
發表于 05-20 08:43
迅為RK3562開發板Android源碼定制開發-uboot開發
1.1 uboot 開發
Uboot 源碼是 v2017.09 版本。目前在該平臺上已經支持 RK 所有主流在售芯片。支持的功能主要有:
? 支持
發表于 02-07 11:12

rk版本uboot啟動流程
評論