如何修改内核DTB文件

Lia*_*lly 7 c linux arm linux-kernel embedded-linux

摘要

我目前正在使用一些自定义板的自定义驱动程序编译Linux内核(内核,模块和DTB).有时我会编译内核并意识到DTB文件中的兼容性字符串不是自定义驱动程序要查找的内容.现在,我可以解决这个问题的唯一方法是修改DTS或内核驱动程序,使字符串匹配,然后再次重新编译内核.有没有办法我可以编辑DTB文件来更新兼容性字符串?

尝试失败

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

dtc -I dtb -o <filename>.dts -<filename>.dtb
Run Code Online (Sandbox Code Playgroud)

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

dtc -I dts -o <filename>.dtb -<filename>.dts
Run Code Online (Sandbox Code Playgroud)

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

Lia*_*lly 11

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

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

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

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


dan*_*ter 5

您为什么不生成新的dtb?

DTB(设备树blob /二进制),是代表板子硬件组件的硬件数据库。

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
Run Code Online (Sandbox Code Playgroud)

从dtb获取文本的设备树。

dtc -I dtb -O dts arm_board.dtb
Run Code Online (Sandbox Code Playgroud)

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

然后做

$ make ARCH=arm arm_board.dtb
Run Code Online (Sandbox Code Playgroud)

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

看看这个傻瓜设备树