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

科创之家 2026-02-04 共9740人围观

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

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

wKgZPGkam2uAdqg0AAEIS7J4m90804.png

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

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

•初始化并选择启动设备(如eMMC、SD卡、NVMe、SCSI等);

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

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

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

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

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

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

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

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

•功能:初始化指定类型的启动设备(如mmc、nvme、scsi)。

•细节:

◦根据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),直接读取按键状态;

◦若支持ADC(CONFIG_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.分发版DTB(LOCATE_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.启动前准备:确定启动设备,初始化硬件接口(MMC、NVMe等),为后续加载镜像铺路;

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

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

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

四、总结

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

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

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

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

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

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


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