解析Rockchip平台U-Boot核心文件:boot_rkimg.c到底做了什么?

电子说

1.4w人已加入

描述

 

 

在嵌入式开发中,U-Boot 作为引导程序的 中流砥柱,负责初始化硬件、加载内核并启动系统。对于 Rockchip 平台的设备(如常见的开发板、智能终端),boot_rkimg.c  U-Boot 中专门处理启动流程的核心文件之一。

 

 

今天我们就来深入剖析这个文件,看看它如何管理启动设备、处理下载 / 恢复模式,以及加载设备树(DTB),最终为内核启动铺平道路。

 

 

 

一、文件定位:Rockchip 启动流程的 调度中心

 

boot_rkimg.c  Rockchip 平台 U-Boot 定制化开发的关键文件,主要职责包括:

 

 

初始化并选择启动设备(如 eMMCSD 卡、NVMeSCSI 等);

 

 

检测下载 / 恢复模式触发条件(如按键、热键);

 

 

加载并验证设备树(DTB),为内核启动提供硬件描述;

 

 

处理 Android 启动相关的参数(如 bootargs)。

 

 

可以说,它是 Rockchip 设备从 U-Boot 过渡到内核的 桥梁

 

 

二、核心函数解析:一步步看懂启动逻辑

 

1. 启动设备管理:确定 从哪里启动

 

设备启动的第一步是确定从哪个存储介质启动(如 eMMCSD 卡)。这部分逻辑由多个函数协作完成。

 

 

bootdev_init(const char *devtype, const char *devnum)

 

功能:初始化指定类型的启动设备(如 mmcnvmescsi)。

 

 

细节

 

 

根据devtype 调用对应设备的初始化函数(如mmc_initialize 初始化 MMC 设备,nvme_scan_namespace 扫描 NVMe 设备);

 

 

验证设备是否存在,若存在则设置环境变量devtype devnum(供后续流程使用)。

 

 

举例:若devtype “mmc”,则初始化 MMC 控制器并检查设备是否可用。

 

 

boot_devtype_init(void)

 

功能:按照优先级确定最终的启动设备(核心逻辑)。

 

 

优先级顺序

 

 

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”)。

 

 

get_bootdev_type(void)

 

功能:根据启动设备类型(devtype)设置系统参数,为内核传递启动信息。

 

 

细节

 

 

映射设备类型到枚举值(如“mmc” 对应 IF_TYPE_MMC“nvme” 对应 IF_TYPE_NVME);

 

 

bootargs 中添加存储介质信息(如storagemedia=emmc)和 Android 启动模式(如 androidboot.mode=normal);

 

 

兼容新旧 Android 版本规则(旧版本需指定介质作为模式,新版本统一用 “normal” 或 “charger”)。

 

 

rockchip_get_bootdev(void)

 

功能:获取启动设备的块设备描述符(struct blk_desc),供后续读写操作使用。

 

 

流程

 

 

a.调用boot_devtype_init 确保启动设备已初始化;

 

 

b.通过设备类型和编号获取blk_desc(块设备描述符,包含设备大小、块大小等信息);

 

 

c.若为 MMC 设备,额外打印时序模式(如 “HS400”)和时钟频率。

 

 

2. 下载与恢复模式:应对特殊启动场景

 

U-Boot 需支持 下载模式(烧录固件)和 恢复模式(系统修复),这些逻辑由以下函数实现。

 

 

rockchip_dnl_key_pressed(void)

 

功能:检测下载按键” 是否按下(弱函数,可被板级代码覆盖)。

 

 

实现

 

 

若支持按键设备(CONFIG_DM_KEY),直接读取按键状态;

 

 

若支持 ADCCONFIG_ADC),通过 ADC 采样判断按键是否按下(如音量键,采样值在 0~30 范围内视为按下)。

 

 

setup_download_mode(void)

 

功能:根据按键或热键状态,决定进入下载模式、恢复模式或 fastboot 模式。

 

 

流程

 

 

a.若下载按键按下或检测到HK_ROCKUSB_DNL 热键:

 

 

检测 USB 总线供电(rockchip_u2phy_vbus_detect),若供电正常则进入下载模式(执行“download” 命令);

 

 

若供电异常,进入恢复模式(设置reboot_mode=recovery-key)。

 

 

a.若检测到HK_FASTBOOT 热键,进入 fastboot 模式(设置 reboot_mode=fastboot)。

 

 

board_run_recovery_wipe_data(void)

 

功能:触发恢复模式并擦除数据(如用户执行恢复出厂设置)。

 

 

流程

 

 

a.找到misc 分区(存储启动控制信息的特殊分区);

 

 

b.misc 分区写入bootloader_message(包含命令boot-recovery 和参数--wipe_data);

 

 

c.设置reboot_mode=recovery 并重启,触发恢复模式。

 

 

3. 设备树(DTB)处理:为内核提供硬件描述

 

设备树(DTB)是内核识别硬件的关键,boot_rkimg.c 负责加载和验证 DTB

 

 

dtb_scan(void *fdt, int where)

 

功能:从不同位置扫描并加载 DTB(按优先级尝试)。

 

 

扫描位置

 

 

a.分发版 DTBLOCATE_DISTRO):从可启动分区加载预定义路径的 DTB(如 /boot/dtb);

 

 

b.资源镜像LOCATE_RESOURCE):从 Rockchip 资源镜像中提取 DTB

 

 

c.FIT 镜像LOCATE_FIT):从 FIT 镜像(一种多组件镜像格式)的 images/fdt 节点加载 DTB

 

 

rockchip_read_dtb_file(void *fdt)

 

功能:加载 DTB 到指定内存地址,并进行初始化。

 

 

流程

 

 

a.调用dtb_scan 尝试从不同位置加载 DTB

 

 

b. DTB 分配内存(sysmem_alloc_base),确保内核可访问;

 

 

c.执行设备树修复(rk_board_early_fdt_fixup,板级定制化修正)和 Android 相关的设备树叠加(android_fdt_overlay_apply)。

 

 

rockchip_ram_read_dtb_file(void *img, void *fdt)

 

功能:从内存中的镜像(如已加载的 Android 启动镜像或 FIT 镜像)中提取 DTB

 

 

细节

 

 

若为 Android 镜像:跳过内核和 ramdisk 区域,提取后续的 DTB

 

 

若为 FIT 镜像:从 images/fdt images/resource 节点提取 DTB 数据。

 

 

三、在 U-Boot 启动流程中的作用

 

boot_rkimg.c 贯穿 U-Boot 启动的多个关键阶段,简单来说,它的作用是:

 

 

1.启动前准备:确定启动设备,初始化硬件接口(MMCNVMe 等),为后续加载镜像铺路;

 

 

2.模式判断:检测特殊按键或热键,决定进入正常启动、下载模式还是恢复模式;

 

 

3.内核启动铺垫:加载并验证 DTB,设置内核启动参数(bootargs),确保内核能正确识别硬件。

 

 

没有它,Rockchip 设备就无法确定从哪里启动、如何适配硬件,更无法响应烧录或恢复等特殊操作。

 

 

四、总结

 

boot_rkimg.c  Rockchip 平台 U-Boot 中连接硬件与内核的 核心枢纽。它通过精细化的设备管理、灵活的模式切换和可靠的 DTB 处理,确保设备从 U-Boot 平稳过渡到内核启动。

 

 

对于开发者而言,理解这个文件的逻辑有助于:

 

 

调试启动设备识别问题(如找不到 eMMC”);

 

 

定制化启动流程(如添加新的启动设备类型);

 

 

修复 DTB 加载失败等常见启动故障。

 

 

下次调试 Rockchip 设备启动问题时,不妨从这个文件入手,或许能快速定位症结所在~


 


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

全部0条评论

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

×
20
完善资料,
赚取积分