如何修改内核DTB文件

时间:2017-09-28 13:04:33

标签: c linux linux-kernel arm embedded-linux

摘要

我目前正在使用一些自定义板的自定义驱动程序编译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文件

2 个答案:

答案 0 :(得分:5)

为什么不生成新的dtb?

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

U-boot将board信息结构传递给内核,该内核源自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

答案 1 :(得分:1)

只想用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编译输出。