
清空记录
历史记录
取消
清空记录
历史记录

本文基于触觉智能RK3506开发板进行演示。选这块板子作为示例,是因为SDK天然覆盖了常见的三个配置维度:
多种存储介质(eMMC/NAND Flash)、多种屏幕接口与分辨率组合、再加上内核的切换——同一块板子,SDK里就带了10个板级defconfig,恰好是这三个常见维度排列的组合产物。
对BSP工程师来说,接手这类板子时最实际的问题就是:换一块屏要改什么?把存储从NAND换成eMMC要动几个字段?启用AMP内核时defconfig多了哪些配置?这10个文件不是10块不同的板子,而是同一套硬件在三个维度上的变体。搞清楚每个维度绑定了哪些构建变量,换配置就变成查表而不是逐行修改。
一、defconfig 放在哪
device/rockchip/.chips/rk3506/ ├── rockchip_ido_evb3506_v1_emmc_mipi_1024x600_defconfig ├── rockchip_ido_evb3506_v1_emmc_mipi_1280x800_defconfig ├── rockchip_ido_evb3506_v1_emmc_mipi_720x720_defconfig ├── rockchip_ido_evb3506_v1_emmc_mipi_720x720_amp_defconfig ├── rockchip_ido_evb3506_v1_emmc_rgb_1024x600_defconfig ├── rockchip_ido_evb3506_v1_flash_mipi_1024x600_defconfig ├── rockchip_ido_evb3506_v1_flash_mipi_1280x800_defconfig ├── rockchip_ido_evb3506_v1_flash_mipi_720x720_defconfig ├── rockchip_ido_evb3506_v1_flash_mipi_720x720_amp_defconfig ├── rockchip_ido_evb3506_v1_flash_rgb_1024x600_defconfig ├── default_device/ # Rockchip 官方的参考配置 ├── parameter-*.txt # 分区表 └── *.its # FIT 镜像描述
文件名本身就是规格说明:<厂商>_<板子>_<存储>_<屏幕接口>_<分辨率>[_amp]。
只有芯片目录顶层的 *_defconfig会出现在 ./build.sh help的候选列表里。
mk-config.sh 里的实现是:
rockchip_defconfigs()
{
cd "$RK_CHIP_DIR"
ls rockchip_defconfig 2>/dev/null || true
ls *_defconfig | grep -v rockchip_defconfig || true
}二、三个维度的组合
| 存储介质 | ||
| 屏幕接口 | ||
| 分辨率 | ||
| AMP |
三个维度如果做笛卡尔积是2 × 2 × 3 = 12个,但实际只挑了10个——每个存储介质下,mipi做了三档分辨率,rgb只做了1024x600 一档。
emmc × {mipi, rgb} × {1024x600, 1280x800, 720x720} → 5 个(mipi 三种 + rgb 一种 + amp 一种)
flash × {mipi, rgb} × {1024x600, 1280x800, 720x720} → 5 个(同上)三、关键字段对照
下面这张表直接从十个 defconfig 里提取,四列分别对应"存储介质、分区表、设备树、内核配置":
从这张表能读出三条规律:
存储介质决定三样东西:
emmc 用parameter-emmc.txt + rk3506_emmc_defconfig + EXT4;
flash 用 parameter-flash.txt + rk3506_defconfig + UBI。
这三者是绑定的,不能只改其中一个。
屏幕接口和分辨率只影响设备树:
从 mipi_1024x600换到 mipi_1280x800、乃至换到 rgb_1024x600,改的都只是 RK_KERNEL_DTS_NAME。
内核defconfig构建变量只有两种:
rk3506_defconfig(NAND)和 rk3506_emmc_defconfig(eMMC),差别不只是名字——比如前者的CONFIG_EXT4_FS=m,后者是 =y。这一点在后面的篇目里会再展开。
四、AMP 变体多改了什么
把普通变体和 AMP 变体做 diff,一共六处差异:
+ RK_ROOTFS=y - RK_UBOOT_CFG_FRAGMENTS="rk3506b rk3506_tb" + RK_UBOOT_CFG_FRAGMENTS="rk3506b rk-amp" + RK_AMP=y + RK_AMP_FIT_ITS="amp_linux.its" - RK_KERNEL_CFG_FRAGMENTS="rk3506-display.config" + RK_KERNEL_CFG_FRAGMENTS="rockchip_amp.config rk3506-display.config" - RK_RECOVERY_FIT_ITS_NAME="thunderboot4recovery.its" - RK_PARAMETER="parameter-flash.txt" + RK_PARAMETER="parameter-flash-amp.txt"
可以看出AMP是一层叠加:它不替换原有的显示、存储配置,而是在U-Boot 片段、内核片段、分区表上各自追加一份AMP版本。
这也是为什么AMP只做了720x720一种分辨率——变体数量会随分辨率成倍增长,没必要都覆盖。
五、换配置要动哪些字段
只改设备树一行:
- RK_KERNEL_DTS_NAME="ido-evb3506-v1a-flash-mipi-720x720" + RK_KERNEL_DTS_NAME="ido-evb3506-v1a-flash-mipi-1280x800"
实际操作用 ./build.sh defconfig 切到现成的变体即可,不必手工改文件。
这是改动最大的一种,涉及四处:
前三个是显式的配置项,容易注意到;第四个是最容易漏的——它不在板级 defconfig 的头部,而是以 RK_ROOTFS_UBI=y 的形式单独占一行。
漏掉它的后果是内核检查阶段直接报错:rootfs 声明为 ext4 但内核没编 ext4 支持,check-kernel.sh 会拦下来。这个拦截是有意的,属于"提前失败"。
改配置之后不要急着cleanall。板级 defconfig 的改动大多只影响配置依赖链,大部分情况下 ./build.sh 会自动感知——prepare_config() 每次构建都会检查 output/.config 与 defconfig 的时间戳关系,不一致就重新生成。
六、default_device/ 是什么
device/rockchip/.chips/rk3506/default_device/ 下还有八个 defconfig:
rockchip_rk3502_robot_defconfig rockchip_rk3506_b_evb1_defconfig rockchip_rk3506_g_demo_defconfig rockchip_rk3506_g_evb1_defconfig rockchip_rk3506_g_evb1_amp_defconfig rockchip_rk3506_g_evb1_mcu_defconfig rockchip_rk3506_g_evb1_smp_defconfig rockchip_rk3506_g_evb2_defconfig
这是 Rockchip 官方的参考配置,板厂在它基础上改出自己的 rockchip_ido_evb3506_v1_*。对比一下可以看出继承关系:
RK_ROOTFS_UBI=y RK_ROOTFS_INSTALL_MODULES=y RK_WIFIBT_CHIP="AP6256" - RK_UBOOT_CFG_FRAGMENTS="rk3506_tb" + RK_UBOOT_CFG_FRAGMENTS="rk3506b rk3506_tb"
这个目录不会被任何脚本自动扫描,也不会出现在 ./build.sh help 的候选项里——rockchip_defconfigs() 只列 $RK_CHIP_DIR 顶层。
注意:switch_defconfig 的逻辑是"如果给的路径不是文件,就拼到 $RK_CHIP_DIR/ 下找"。所以理论上可以传 default_device/rockchip_rk3506_g_evb1_defconfig 选中它。但这会把 .chip 链接指向 default_device/ 那个子目录:
DEFCONFIG="$(realpath "$DEFCONFIG")" rm -rf "$RK_CHIP_DIR" ln -rsf "$(dirname "$DEFCONFIG")" "$RK_CHIP_DIR"
.chip 一旦指向子目录,后续所有 $RK_CHIP_DIR/xxx(分区表、its 文件等)都会在那个子目录里找,很可能找不到。要基于参考配置做自己的板子,正确做法是复制到芯片目录顶层再改,而不是直接选中子目录里的那份。
七、开发者视角:新增一个板级变体
硬件改版、或者要支持一块新屏,按现有结构不需要改代码,加一个defconfig就行。
从现有的10 个里挑差异最小的那份,复制改名。比如要做一块 eMMC+RGB+800x600的板子:
cd device/rockchip/.chips/rk3506/ cp rockchip_ido_evb3506_v1_emmc_rgb_1024x600_defconfig \ rockchip_ido_evb3506_v1_emmc_rgb_800x600_defconfig
换存储介质时那四处必须一起改。 前三处是显式配置项,第四处 RK_ROOTFS_UBI=y / RK_ROOTFS_EXT4=y 单独占一行,最容易漏。漏掉的后果不是编译失败,而是运行到内核检查阶段才报错。
如果分辨率或接口是全新的,需要新增 DTS 文件:
kernel-6.1/arch/arm/boot/dts/ido-evb3506-v1a-<新配置>.dts
新 DTS 通常从同系列的现成文件改起,主要改三个地方:panel 节点、背光节点、以及 chosen 里的 bootargs。改完 RK_KERNEL_DTS_NAME 指过去即可,构建时会自动编译出同名 .dtb。
./build.sh defconfig # 在列表里选中新变体 readlink output/defconfig # 确认指向了新文件 ./build.sh
第一条命令会重建 .chip 与 output/defconfig 两个链接,readlink 确认一下能避免"切了但没生效"的困惑。
如果新板子需要额外分区(比如独立的factory分区),不是改defconfig,而是改分区表文件和它对应的 RK_PARAMETER。分区表的语法与操作命令属于下一篇的范畴,但要先知道一点:新增分区要同时保证分区表、package-file、以及实际镜像三者对齐,缺一个都会在打包阶段报错。
八、本文小结
相关资料,请关注深圳触觉智能公众号,添加官方客服13423856106,另提供近80GB软硬件资料与Demo。
