RK平台U-Boot开发干货:defconfig分层配置体系 电子说
U-Boot 内置上千项可配置开关,如果每款硬件板卡都单独维护一份完整配置文件,配置文件数量会急剧膨胀、维护成本极高。瑞芯微 RK 平台独创基础 defconfig + config fragment 配置片段叠加方案,完美解决多板卡配置冗余、同步难的痛点,本文以 RK3576 为例完整拆解整套配置体系。
一、RK3576 完整配置家族图谱
RK3576 所有产品配置均依托同一份基础配置衍生,不同产品仅保留差异化配置项,整体层级关系如下:

核心设计思路:每个产品变体只维护差异配置项,不再拷贝完整基础配置。
二、基础 defconfig:所有产品统一底层底座
configs/rk3576_defconfig 是 RK3576 全系产品的通用基础配置,内置约 120 项通用开关,按功能分类整理核心配置如下:
1. 架构与 SoC(4 项)
CONFIG_ARM=yCONFIG_ARCH_ROCKCHIP=yCONFIG_ROCKCHIP_RK3576=yCONFIG_TARGET_EVB_RK3576=y
2. 启动流程(8 项)
CONFIG_SUPPORT_TPL=y # 三级启动CONFIG_SUPPORT_SPL=y # 二级启动CONFIG_SPL_ATF=y # 加载ATFCONFIG_SPL_AB=y # AB系统升级CONFIG_ANDROID_BOOTLOADER=y # Android引导CONFIG_ANDROID_AVB=y # 安全验证CONFIG_SPL_SPI_FLASH_SUPPORT=y # SPI Flash启动
3. 存储(8 项)
CONFIG_MMC_DW=y # DW MMC控制器CONFIG_MMC_SDHCI=y # SDHCI控制器CONFIG_SDHCI_ROCKCHIP=y # RK SDHCICONFIG_SPI_FLASH=y # SPI NORCONFIG_SPI_NAND=y # SPI NANDCONFIG_UFS=y # UFSCONFIG_CMD_SATA=y # SATA命令
4. 显示(6 项)
CONFIG_DRM_ROCKCHIP=yCONFIG_ROCKCHIP_HDMI_QP=y # HDMI QP(RK3576特有)CONFIG_ROCKCHIP_DP=y # DisplayPortCONFIG_ROCKCHIP_MIPI_DSI2=y # MIPI DSI2CONFIG_ROCKCHIP_RGB=y # RGB接口
5. 网络(3 项)
CONFIG_GMAC_ROCKCHIP=yCONFIG_CMD_DHCP=yCONFIG_CMD_PING=y
6. 调试(3 项)
CONFIG_DEBUG_UART_BASE=0x2ad40000 # UART2基地址CONFIG_DEBUG_UART_CLOCK=24000000 # 24MHz时钟CONFIG_BAUDRATE=1500000 # 1.5M波特率
完整基础配置合计约 120 项,以上为开发中高频使用的核心开关。
三、Config Fragment:产品差异化配置片段
Fragment 配置片段语法和标准 defconfig 完全一致,文件内仅存放需要新增、关闭、覆盖的差异化配置,通过指定基础配置实现自动继承。
1. 平板变体 rk3576-tb.config
# rk3576-tb.configCONFIG_BASE_DEFCONFIG="rk3576_defconfig" # 核心标识:绑定基础defconfig# Falcon模式:SPL直接启动内核(跳过U-Boot Proper)CONFIG_SPL_KERNEL_BOOT=yCONFIG_SPL_ADC_KEY=y # ADC按键检测CONFIG_SPL_INPUT=y # 输入子系统# 关闭AB系统,使用单分区# CONFIG_SPL_AB is not set# 关闭TPL,SPL直接完成DDR初始化# CONFIG_SUPPORT_TPL is not set
2. 车载变体 rk3576-car.config
CONFIG_BASE_DEFCONFIG="rk3576_defconfig"# Serdes串行显示芯片支持CONFIG_DISPLAY_MAXIM_SERDES=yCONFIG_ROCKCHIP_RKX111=y # RK串行器CONFIG_ROCKCHIP_RKX121=y # RK解串器# 多路GPIO扩展芯片CONFIG_GPIO_PCA953X=y
3. USB 下载极简变体 rk3576-usbplug.config
CONFIG_BASE_DEFCONFIG="rk3576_defconfig"极致精简,仅保留USB镜像烧录功能CONFIG_MMC is not setCONFIG_UFS is not setCONFIG_DRM_ROCKCHIP is not setCONFIG_NET is not setCONFIG_CMD_PING is not set... 其余非必要功能全部关闭
该配置编译出的 U-Boot 仅具备 USB 烧录镜像能力,无其他冗余功能。
四、两种 Fragment 编译构建方式
方式 1:RK 封装 [make.sh](make.sh) 脚本(推荐)
# 编译基础EVB完整固件./make.sh rk3576 # 等价于 make rk3576_defconfig + 编译打包# 编译平板变体固件(自动叠加fragment)./make.sh rk3576-tb
方式 2:原生 make 命令分步编译
手动执行配置叠加流程,适合调试场景:
# 第一步:加载通用基础配置make rk3576_defconfig# 第二步:叠加产品差异化片段make rk3576-tb.config# 第三步:指定交叉编译器编译全量代码make CROSS_COMPILE=... all
五、编译时完整配置加载流程
执行./make.sh rk3576-tb后,底层执行逻辑完整链路:
./make.sh rk3576-tb│▼process_args()│ 解析参数 ARG_BOARD=rk3576-tb│ 检索到configs/rk3576-tb.config(识别为fragment片段,非基础defconfig)│▼make rk3576_defconfig # 第一步:加载公共基础配置│▼make rk3576-tb.config # 第二步:叠加产品差异化配置片段│▼make all # 第三步:编译U-Boot完整工程│▼pack_images() # 第四步:打包输出固件镜像
六、Fragment 叠加机制核心优势对比
对比「全量 defconfig 独立维护」和「基础 + fragment 片段」两种方案:
|
使用场景 |
采用 fragment 片段 |
不使用 fragment(全量配置) |
|
1 份基础配置 + 7 款衍生产品 |
8 个小型配置文件 |
8 份完整百行 defconfig |
|
修改全局通用配置(如调试串口) |
仅修改基础文件 1 处,全产品同步生效 |
需要逐个修改 8 份配置 |
|
新增一款硬件产品 |
新建 1 个极简 fragment 片段 |
复制完整 defconfig 再逐条删减修改 |
|
快速区分产品硬件差异 |
仅查看 fragment 几行差异化开关 |
需要对比两份百行完整配置文件 |
七、补充:非 RK3576 平台可不使用 Fragment
Fragment 是瑞芯微 RK 平台专属优化方案,其他 SoC 型号可直接维护独立完整 defconfig,无需继承基础配置:
configs/rk3588_defconfig # 独立完整配置,无继承configs/rk3568_defconfig # 独立完整配置,无继承
补充说明:主线开源 U-Boot 并未采用该 fragment 叠加方案,主线通用方案为基于 defconfig 通过 menuconfig 交互式修改后保存配置。
全部0条评论
快来发表一下你的评论吧 !