uboot优化(rk版本uboot启动流程)

uboot优化(rk版本uboot启动流程)

admin 2025-10-11 社会资讯 128 次浏览 0个评论

一、为什么要了解uboot启动流程

uboot优化(rk版本uboot启动流程)
(图片来源网络,侵删)

uboot一般已经调试好了,如果是原厂给的源码,基本上不需要做过多的修改,但是在实际应用中,可能会出现各种问题,可能需要启动优化、开机速度调整等,这个时候就需要关注uboot了。初学者甚至很多工程师不知其中原理,往往在开发过程中不知所措,消耗很多不必要的时间,导致项目开发周期拉长。

二、相关概念、流程和理解

Boot-order

RK平台根据前级Loader代码是否开源,目前有两套启动方式:

// 前级loader闭源 BOOTROM => ddr bin => Miniloader => TRUST => U-BOOT => KERNEL // 前级loader开源 BOOTROM => TPL => SPL => TRUST => U-BOOT => KERNEL

TPL 相当于 ddr bin,SPL 相当于 miniloader。TPL+SPL 的组合实现了跟 RK 闭源 ddr.bin+miniloader 一致的功能,可相互替换。

Driver-probe

U-Boot虽然引入了device-driver开发模型,但初始化阶段不会像kernel那样自动发起已注册device-driver的probe。driver的probe必须由用户主动调用发起。接口如下:

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); // 建议用户一定要了解内部实现!

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)

Boot-Command

U-Boot 最终通过 CONFIG_BOOTCOMMAND 定义的启动命令引导kernel。在执行 CONFIG_BOOTCMD 之前还会执行 CONFIG_PREBOOT 预启动命令,通常这个命令定义为空。

TPL/SPL/U-Boot-proper

U-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。

启动流程:

BOOTROM => TPL(ddr bin) => SPL(miniloader) => TRUST => U-BOOT => KERNEL

转载请注明来自海坡下载,本文标题:《uboot优化(rk版本uboot启动流程)》

每一天,每一秒,你所做的决定都会改变你的人生!

发表评论

快捷回复:

评论列表 (暂无评论,128人围观)参与讨论

还没有评论,来说两句吧...