RK3576执行boot命令后到底跑了哪些步骤?——RKIMG_BOOTCOMMAND拆解

电子说

1.4w人已加入

描述

在 U‑Boot 命令行输入 boot,设备就开始启动内核了。但在这之前到底发生了什么?如果启动失败,是卡在了设备检测阶段,还是引导尝试阶段?为什么 RK3576 从 eMMC 启动时有时会尝试检测 SD 卡?本文逐行拆解 RKIMG_BOOTCOMMAND 和RKIMG_DET_BOOTDEV 的完整执行过程。
导读:RK 平台 U‑Boot 的 bootcmd 环境变量默认由RKIMG_BOOTCOMMAND 宏定义。这不是一个简单的命令,而是一个复杂的多级启动策略—— 它自动检测启动设备(SD 卡→eMMC→MTD→USB→PXE),然后对每个设备尝试多种引导方式。理解这个检测链和引导尝试顺序,是排查启动问题的关键。

一、RKIMG_BOOTCOMMAND 的结构

CONFIG_BOOTCOMMAND 在include/configs/evb_rk3576.h 中赋值为RKIMG_BOOTCOMMAND,该宏定义在include/configs/rockchip‑common.h 中,根据安全配置有三个变体:

 

// include/configs/evb_rk3576.h#ifndef CONFIG_SPL_BUILD#undef CONFIG_BOOTCOMMAND#define CONFIG_BOOTCOMMAND  RKIMG_BOOTCOMMAND#endif

 

 

// include/configs/rockchip-common.h (在 #ifndef CONFIG_SPL_BUILD 块内)// 变体1:AVB签名验证启用#if defined(CONFIG_AVB_VBMETA_PUBLIC_KEY_VALIDATE)#define RKIMG_BOOTCOMMAND     "boot_android ${devtype} ${devnum};"// 变体2:FIT签名启用#elif defined(CONFIG_FIT_SIGNATURE)#define RKIMG_BOOTCOMMAND     "boot_fit;"// 变体3:默认(RK3576通常使用)#else#define RKIMG_BOOTCOMMAND     "boot_android ${devtype} ${devnum};"     "boot_fit;"     "bootrkp;"     "run distro_bootcmd;"#endif

 

RK3576 默认走变体 3,依次尝试四种引导方式。

二、设备检测链 (RKIMG_DET_BOOTDEV)

在执行RKIMG_BOOTCOMMAND 之前,必须先确定启动设备。这一工作由RKIMG_DET_BOOTDEV 完成,它也是一个环境变量宏:

Boot

三、四种引导方式的优先级

设备确定后,RKIMG_BOOTCOMMAND 按顺序尝试引导:

Boot

① boot_android — Android 引导

用于启动 Android 或带有 Android boot header 的 Linux 镜像。扫描 boot 和 vendor_boot 分区:

 

# boot_android 内部流程# 1. 读取boot分区头部(boot.img header)# 2. 解析kernel/ramdisk/dtb偏移# 3. 如果启用AVB → 验证vbmeta签名# 4. 加载kernel到kernel_addr_r# 5. 加载DTB到fdt_addr_r# 6. booti 引导

 

② boot_fit — FIT 镜像引导

尝试从boot分区加载 FIT 格式的镜像文件:

 

# boot_fit 内部流程# 1. 在boot分区中查找FIT镜像# 2. 解析FIT的configurations段# 3. 提取kernel/fdt/ramdisk# 4. 校验签名(如果CONFIG_FIT_SIGNATURE启用)# 5. bootm 引导

 

③ bootrkp — Rockchip 签名包

Rockchip 专有的签名引导方式,使用 bootrkp 命令:

 

# bootrkp 内部流程# 1. 加载签名后的boot资源# 2. 验证RSA签名# 3. 提取并引导内核

 

④ distro_bootcmd — 发行版引导

标准 U‑Boot 发行版引导命令,扫描所有可用设备尝试加载 extlinux/extlinux.conf 或boot.scr:

 

# distro_bootcmd 的 BOOT_TARGET_DEVICES# 1. MMC (mmc 1, mmc 0)     ← SD卡优先# 2. MTD (mtd 2, mtd 1, mtd 0)# 3. RKNAND (rknand 0)# 4. USB (usb 0)# 5. PXE (网络)# 6. DHCP (网络)

 

四、debug 启动问题

当启动遇到问题时,可以通过以下方式调试:

 

# 查看当前bootcmd=> printenv bootcmd=> printenv devtype devnum   # 查看设备检测结果# 手动模拟设备检测=> run rkimg_bootdev         # 执行设备检测脚本# 输出: Boot from SDcard (或eMMC等)# 单步执行各引导方式=> boot_android ${devtype} ${devnum}=> boot_fit=> run distro_bootcmd# 查看设备检测的具体命令=> printenv rkimg_bootdev

 

五、定制 RKIMG_BOOTCOMMAND

如果需要修改默认启动行为,可以在板级头文件中覆盖:

 

// include/configs/evb_rk3576.h(或其他板级头文件)#define CONFIG_BOOTCOMMAND     "if mmc dev 1; then "         "fatload mmc 1:1 ${kernel_addr_r} Image; "         "fatload mmc 1:1 ${fdt_addr_r} rk3576.dtb; "         "booti ${kernel_addr_r} - ${fdt_addr_r}; "     "elif mmc dev 0; then "         "ext4load mmc 0:1 ${kernel_addr_r} boot/Image; "         "ext4load mmc 0:1 ${fdt_addr_r} boot/dtbs/rk3576.dtb; "         "booti ${kernel_addr_r} - ${fdt_addr_r}; "     "fi"

 

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分