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

科创之家 2026-02-04 8873人围观

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

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

wKgZPGkam2uAdqg0AAEIS7J4m90804.png

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

boot_rkimg.cRockchip平台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设备);

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

举例:若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/fdtimages/resource节点提取DTB数据。

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

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

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

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

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

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

四、总结

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

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

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

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

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

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


  • 随机文章
  • 热门文章
  • 热评文章
不容错过
Powered By Z-BlogPHP