Buildroot 2022.11如何从树外dts文件编译生成dtbo?
在Buildroot 2022.11中自动生成并应用树外Device Tree Overlay(DTBO)
可以实现,Buildroot 2022.11支持从树外DTS文件批量生成DTBO,以下是具体操作步骤:
1. 启用内核Overlay支持
首先需要确保内核开启了Device Tree Overlay功能:
- 创建一个内核配置片段文件(比如
kernel-overlay.config),内容为:CONFIG_OF_OVERLAY=y - 在Buildroot配置中,通过
BR2_LINUX_KERNEL_CONFIG_FRAGMENT_FILES选项指定这个配置片段,让Buildroot在内核编译时自动启用该功能。
2. 批量编译树外DTS为DTBO
Buildroot默认的DTS编译逻辑是生成DTB,要生成DTBO需要自定义编译步骤,推荐通过内核编译后脚本实现:
- 编写一个Shell脚本(比如
build-dtbo.sh),内容如下:#!/bin/sh # 树外DTS存放目录(根据你的实际路径调整) OVERLAY_DTS_DIR="${BR2_EXTERNAL}/board/your-platform/overlays" # Buildroot提供的dtc工具路径 DTC="${HOST_DIR}/bin/dtc" # DTBO输出目录(最终会打包到根文件系统) DTBO_OUTPUT="${BINARIES_DIR}/dtbo" # 创建输出目录 mkdir -p "${DTBO_OUTPUT}" # 遍历所有树外DTS文件,编译为DTBO for dts_file in "${OVERLAY_DTS_DIR}"/*.dts; do dtbo_file="${DTBO_OUTPUT}/$(basename "${dts_file}" .dts).dtbo" # 使用dtc编译,-@参数是生成overlay的关键 "${DTC}" -I dts -O dtb -@ -o "${dtbo_file}" "${dts_file}" done - 在Buildroot配置中,设置
BR2_LINUX_KERNEL_POST_BUILD_SCRIPT选项指向这个脚本,Buildroot会在内核编译完成后自动执行该脚本,批量生成DTBO。
3. 将DTBO打包到系统中
要让系统能加载DTBO,需要将生成的DTBO文件放到合适的位置:
- 通过
BR2_ROOTFS_OVERLAY选项,指定一个根文件系统覆盖目录,比如在该目录下创建boot/overlays子目录,将${BINARIES_DIR}/dtbo下的所有DTBO文件复制到这里,Buildroot会自动将其打包到根文件系统镜像中。
4. 启动时加载DTBO
根据你的启动方式(U-Boot或GRUB等)配置加载逻辑:
- 如果使用U-Boot,可以在启动脚本中添加
fdt apply命令加载DTBO,比如:fdt apply ${bootdir}/overlays/your-overlay.dtbo - 或者通过内核启动参数指定,比如
overlay_root=/boot/overlays(需要内核支持动态加载overlay)。
注意事项
- 树外DTS文件必须符合Device Tree Overlay的语法规范,比如必须包含
/dts-v1/;声明,以及fragment@N节点结构。 - 确保你的DTBO与主DTB的硬件节点兼容,避免冲突。
内容的提问来源于stack exchange,提问作者ADecostre
相关产品推荐
相关产品推荐

