一、为什么要了解uboot启动流程
uboot一般已经调试好了,如果是原厂给的源码,基本上不需要做过多的修改,但是在实际应用中,可能会出现各种问题,可能需要启动优化、开机速度调整等,这个时候就需要关注uboot了。初学者甚至很多工程师不知其中原理,往往在开发过程中不知所措,消耗很多不必要的时间,导致项目开发周期拉长。
二、相关概念、流程和理解
Boot-order
RK平台根据前级Loader代码是否开源,目前有两套启动方式:
// 前级loader闭源 BOOTROM => ddr bin => Miniloader => TRUST => U-BOOT => KERNEL // 前级loader开源 BOOTROM => TPL => SPL => TRUST => U-BOOT => KERNELTPL 相当于 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启动流程)》
京公网安备11000000000001号
京ICP备11000001号
还没有评论,来说两句吧...