解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么? 电子说
在嵌入式开发中,U-Boot 作为引导程序的 “中流砥柱”,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c 是 U-Boot 中专门处理启动流程的核心文件之一。
今天我们就来深入剖析这个文件,看看它如何管理启动设备、处理下载 / 恢复模式,以及加载设备树(DTB),最终为内核启动铺平道路。

boot_rkimg.c 是 Rockchip 平台 U-Boot 定制化开发的关键文件,主要职责包括:
•初始化并选择启动设备(如 eMMC、SD 卡、NVMe、SCSI 等);
•检测下载 / 恢复模式触发条件(如按键、热键);
•加载并验证设备树(DTB),为内核启动提供硬件描述;
•处理 Android 启动相关的参数(如 bootargs)。
可以说,它是 Rockchip 设备从 U-Boot 过渡到内核的 “桥梁”。
设备启动的第一步是确定“从哪个存储介质启动”(如 eMMC、SD 卡)。这部分逻辑由多个函数协作完成。
•功能:初始化指定类型的启动设备(如 mmc、nvme、scsi)。
•细节:
◦根据devtype 调用对应设备的初始化函数(如mmc_initialize 初始化 MMC 设备,nvme_scan_namespace 扫描 NVMe 设备);
◦验证设备是否存在,若存在则设置环境变量devtype 和devnum(供后续流程使用)。
•举例:若devtype 为“mmc”,则初始化 MMC 控制器并检查设备是否可用。
•功能:按照优先级确定最终的启动设备(核心逻辑)。
•优先级顺序:
a.配置参数:从平台配置中解析启动设备(param_parse_assign_bootdev);
b.ATAGS:从 ATAGS 中获取启动设备(param_parse_atags_bootdev,仅部分平台支持);
c.扫描列表:若前两步失败,调用rk_board_scan_bootdev 扫描默认设备列表;
d.默认值:若所有扫描失败,默认使用“mmc 0”(eMMC 设备)。
•输出:打印启动设备来源(如“Bootdev (assign): mmc 0”)。
•功能:根据启动设备类型(devtype)设置系统参数,为内核传递启动信息。
•细节:
◦映射设备类型到枚举值(如“mmc” 对应 IF_TYPE_MMC,“nvme” 对应 IF_TYPE_NVME);
◦向bootargs 中添加存储介质信息(如storagemedia=emmc)和 Android 启动模式(如 androidboot.mode=normal);
◦兼容新旧 Android 版本规则(旧版本需指定介质作为模式,新版本统一用 “normal” 或 “charger”)。
•功能:获取启动设备的块设备描述符(struct blk_desc),供后续读写操作使用。
•流程:
a.调用boot_devtype_init 确保启动设备已初始化;
b.通过设备类型和编号获取blk_desc(块设备描述符,包含设备大小、块大小等信息);
c.若为 MMC 设备,额外打印时序模式(如 “HS400”)和时钟频率。
U-Boot 需支持 “下载模式”(烧录固件)和 “恢复模式”(系统修复),这些逻辑由以下函数实现。
•功能:检测“下载按键” 是否按下(弱函数,可被板级代码覆盖)。
•实现:
◦若支持按键设备(CONFIG_DM_KEY),直接读取按键状态;
◦若支持 ADC(CONFIG_ADC),通过 ADC 采样判断按键是否按下(如音量键,采样值在 0~30 范围内视为按下)。
•功能:根据按键或热键状态,决定进入下载模式、恢复模式或 fastboot 模式。
•流程:
a.若下载按键按下或检测到HK_ROCKUSB_DNL 热键:
检测 USB 总线供电(rockchip_u2phy_vbus_detect),若供电正常则进入下载模式(执行“download” 命令);
若供电异常,进入恢复模式(设置reboot_mode=recovery-key)。
a.若检测到HK_FASTBOOT 热键,进入 fastboot 模式(设置 reboot_mode=fastboot)。
•功能:触发“恢复模式并擦除数据”(如用户执行恢复出厂设置)。
•流程:
a.找到misc 分区(存储启动控制信息的特殊分区);
b.向misc 分区写入bootloader_message(包含命令boot-recovery 和参数--wipe_data);
c.设置reboot_mode=recovery 并重启,触发恢复模式。
设备树(DTB)是内核识别硬件的关键,boot_rkimg.c 负责加载和验证 DTB。
•功能:从不同位置扫描并加载 DTB(按优先级尝试)。
•扫描位置:
a.分发版 DTB(LOCATE_DISTRO):从可启动分区加载预定义路径的 DTB(如 /boot/dtb);
b.资源镜像(LOCATE_RESOURCE):从 Rockchip 资源镜像中提取 DTB;
c.FIT 镜像(LOCATE_FIT):从 FIT 镜像(一种多组件镜像格式)的 images/fdt 节点加载 DTB。
•功能:加载 DTB 到指定内存地址,并进行初始化。
•流程:
a.调用dtb_scan 尝试从不同位置加载 DTB;
b.为 DTB 分配内存(sysmem_alloc_base),确保内核可访问;
c.执行设备树修复(rk_board_early_fdt_fixup,板级定制化修正)和 Android 相关的设备树叠加(android_fdt_overlay_apply)。
•功能:从内存中的镜像(如已加载的 Android 启动镜像或 FIT 镜像)中提取 DTB。
•细节:
◦若为 Android 镜像:跳过内核和 ramdisk 区域,提取后续的 DTB;
◦若为 FIT 镜像:从 images/fdt 或images/resource 节点提取 DTB 数据。
boot_rkimg.c 贯穿 U-Boot 启动的多个关键阶段,简单来说,它的作用是:
1.启动前准备:确定启动设备,初始化硬件接口(MMC、NVMe 等),为后续加载镜像铺路;
2.模式判断:检测特殊按键或热键,决定进入正常启动、下载模式还是恢复模式;
3.内核启动铺垫:加载并验证 DTB,设置内核启动参数(bootargs),确保内核能正确识别硬件。
没有它,Rockchip 设备就无法确定从哪里启动、如何适配硬件,更无法响应烧录或恢复等特殊操作。
boot_rkimg.c 是 Rockchip 平台 U-Boot 中连接硬件与内核的 “核心枢纽”。它通过精细化的设备管理、灵活的模式切换和可靠的 DTB 处理,确保设备从 U-Boot 平稳过渡到内核启动。
对于开发者而言,理解这个文件的逻辑有助于:
•调试启动设备识别问题(如“找不到 eMMC”);
•定制化启动流程(如添加新的启动设备类型);
•修复 DTB 加载失败等常见启动故障。
下次调试 Rockchip 设备启动问题时,不妨从这个文件入手,或许能快速定位症结所在~
全部0条评论
快来发表一下你的评论吧 !