如何修改内核DTB文件

How to modify kernel DTB file

总结

我目前正在编译 Linux 内核(内核、模块和 DTB),其中包含一些用于自定义板的自定义驱动程序。偶尔我会编译内核并意识到 DTB 文件中的兼容性字符串不是自定义驱动程序正在寻找的内容。现在我唯一可以补救的方法是修改 DTS 或内核驱动程序,使字符串匹配,然后再次重新编译内核。有什么方法可以只编辑 DTB 文件来更新兼容性字符串吗?

尝试失败

我已经能够使用以下命令将 DTB 文件反编译回 DTS 文件:

dtc -I dtb -o <filename>.dts -<filename>.dtb

但是,如果我修改 DTS 文件并使用以下命令重新编译:

dtc -I dts -o <filename>.dtb -<filename>.dts

内核不会加载重新编译的DTB文件

你为什么不生成新的 dtb?

DTB(Device tree blob/binary),是硬件数据库,代表板子的硬件组件。

U-boot 将电路板信息结构传递给内核,该结构来自 U-Boot 中的头文件。

DTB 由特殊编译器编译,以适合 U-Boot 和 Linux 理解的形式生成二进制文件。


DTC(设备树编译器)它将设备树文件转换为 U-Boot 和 Linux 内核可以理解的机器可读二进制文件。

直接使用 DTC 的方法。

$ dtc -O dtb -o arm_board.dtb -b 0 arm_board.dts

从 dtb 获取文本中的设备树。

dtc -I dtb -O dts arm_board.dtb

board.dts 是由上述命令创建的二进制文件。 -O 指定输出格式。 -o 标志是输出文件。 -b 0 指定物理引导 CPU.

然后做

$ make ARCH=arm arm_board.dtb

另一种方法可能只是使用 make dtbs 这将调用 dtc。 arch/arm/boot/dts/Makefile 列出应该是哪些 DTB 在构建时生成 这是另一种编译方式。 make 会将它放在内核树的这个位置 /arch/arm/boot/dts

看看这个Device Tree for Dummies

只是想用 2 年的经验来更新这个主题。

Linux 存储库中的 DTS 文件是 DTS C 预处理器指令(#include、#define 等)的混合体。因此,当编译原始 DTB 时,预处理器链接到引用的文件以创建纯 DTS 文件。 dtc 将单个 DTS 文件转换为 DTB 文件。

所以如果你想修改一个内核DTS文件并编译它,那么你有两个选择:

  1. 只需 运行 make dtbs 即可自动处理所有这些
  2. 手动运行预处理器(cpp -nostdinc -I <include dir> -undef -x assembler-with-cpp ...)然后用dtc编译输出。