Rockchip rk3588 U-Boot詳解 (二)
1.1 DM
DM (Driver Model) 是 U-Boot 標準的 device-driver 開發(fā)模型,跟 kernel 的 device-driver 模型?常類似。
v2017版本也遵循 DM 框架開發(fā)各功能模塊。建議讀者先閱讀DM?檔,了解DM架構原理和實現(xiàn)。
README:
/doc/driver-model/README.txt
Terminology
-----------
Uclass - a group of devices which operate in the same way. A uclass provides
a way of accessing individual devices within the group, but always
using the same interface. For example a GPIO uclass provides
operations for get/set value. An I2C uclass may have 10 I2C ports,
4 with one driver, and 6 with another.
Driver - some code which talks to a peripheral and presents a higher-level
interface to it.
Device - an instance of a driver, tied to a particular port or peripheral.
簡要概括:
- uclass: 設備驅動模型
- driver:驅動
- device:設備
核心代碼:
./driver/core
1.2 Security
U-Boot在ARM TrustZone的安全體系中屬于Non-Secure World, 無法直接訪問任何安全的資源(如:安全memory、安全otp、efuse...),需要借助trust間接訪問。RK平臺上U-boot的CPU運行模式:
32位平臺:Non-Secure PL2
64位平臺:EL2(Always be Non-Secure)
1.3 Boot-order
RK平臺根據前級Loader代碼是否開源,目前有兩套啟動方式:
// 前級loader鼻淵
BOOTROM = > ddr bin = > Miniloader = > TRUST = > U-Boot = > KERNEL
// 前級loader開源
BOOTROM = > TPL(Tiny Program Loader) = > SPL(Secondary Program Loader) = > TRUST = > U-Boot = > KERNEL
TPL相當于ddr bin,SPL相當于miniloader。TPL + SPL 的組合實現(xiàn)了跟RK閉源ddr.bin+miniloader一致的功能,可相互替換。
1.4 Driver-probe
U-boot雖然引入了device-device開發(fā)模型,但初始化階段不會像kernel那樣自動發(fā)起已注冊device-driver的probe。driver的probe必須由用戶主動調用發(fā)起。接口如下
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);
......
上述接口的核心調用
1.5 Shell
U-Boot的Shell叫CLI(cmdline line interface),即命令行模式,用戶可以根據自己需求自定義CMD,CMD除了通過Shell調用,還能通過run_command()和run_command_list()以代碼的形式調用
int run_command(const char *cmd, int flag)
int run_command_list(const char *cmd, int len, int flag)
1.6 Boot-Command
U-Boot最終通過CONFIG_BOOTCOMMAND定義的啟動命令引導kernel。在執(zhí)行CONFIG_BOOTCMD之前還會執(zhí)行CONFIG_PREBOOT預啟動命令,通常這個命令定義為空
1.7 TPL/SPL/U-Boot-proper
U-Boot通過使用不同的編譯條件可以用同一套代碼獲取三種不同功能的Loader:TPL/SPL/U-Boot-proper
- TPL: 運行在sram中,負責完成ddr初始化;
- SPL:運行在ddr中,負責完成系統(tǒng)的lowlevel初始化,后級固件加載(trust.img和uboot.img)
- U-Boot proper: 運行在ddr中,即我們通常所說的 U-Boot,它負責引導kernel;
啟動流程:
BOOTROM => TPL(ddr bin) => SPL(miniloader) => TRUST => U-BOOT => KERNEL
1.8 Build-Output
U-Boot編譯成功后會在根目錄下生成一些重要文件(支持TPL/SPL編譯時才有TPL/SPL的生成文件)
// U-Boot階段
./u-boot.map //MAP表文件
./u-boot.sym //SYMBOL表文件
./u-boot //ELF文件,類同內核的vmlinux(重要?。?span>
// SPL階段
./spl/u-boot-spl.map //MAP表文件
./spl/u-boot-spl.sym //SYMBOL表文件
./spl/u-boot-spl // ELF文件,類同內核的vmlinux(重要)
./spl/u-boot-spl.dtb //spl自己的dtb文件
./spl/u-boot-spl.bin //可執(zhí)行二進制文件,會被打包成loader用于燒寫
// TPL階段
./tpl/u-boot-tpl.map // MAP表文件
./tpl/u-boot-tpl.sym // SYMBOL表文件
./tpl/u-boot-tpl //ELF文件,類同內核的vmlinux(重要?。?span>
./tpl/u-boot-tpl.dtb //tpl自己的dtb文件
./tpl/u-boot-tpl.bin // 可執(zhí)行二進制文件,會被打包成loader用于燒寫
1.9 Environment-Variables
ENV(Environment-Variables)是U-Boot支持的一種全局數(shù)據管理和傳遞方式,原理是構建一張HASH映射表,把用戶的數(shù)據以“鍵值-數(shù)據”作為表項進行管理。
EVN通常用于定義平臺配置參數(shù):固件加載地址,網絡配置(ipaddr、serverip)、bootcmd、bootargs等,用戶可以在命令行下使用printenv命令打印出來
- ??可選擇是否把ENV數(shù)據保存到本地存儲上
- ENV數(shù)據僅限于U-Boot使?,?法直接傳遞給內核、內核也?法直接解析
- ??層可以通過U-Boot提供的fw_printenv?具訪問ENV數(shù)據
RK 平臺上 ENV 數(shù)據的存儲地址和?小定義如下(單位:字節(jié)):
if ARCH_ROCKCHIP
config ENV_OFFSET
hex
depends on !ENV_IS_IN_UBI
depends on !ENV_IS_NOWHERE
default 0x3f8000
help
Offset from the start of the device (or partition)
config ENV_SIZE
hex
default 0x8000
help
Size of the environment storage area
endif
審核編輯 黃宇
-
Rockchip
+關注
關注
0文章
72瀏覽量
18516 -
RK3588
+關注
關注
6文章
303瀏覽量
4148
發(fā)布評論請先 登錄
相關推薦
評論