如何修改内核的DTB文件。

12

概述

我目前正在为一块自定义板编译Linux内核(包括内核、模块和设备树)。偶尔会发现设备树文件中的兼容性字符串与自定义驱动程序要求的不同。现在唯一的解决方法是修改DTS或内核驱动程序,使字符串匹配,并重新编译内核。是否有一种方法可以直接编辑DTB文件以更新兼容性字符串?

失败的尝试

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

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

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

dtc -I dts -o <filename>.dtb -<filename>.dts
内核将不会加载重新编译的DTB文件。

1
你能显示任何错误或内核日志吗? - Krupal Tharwala
你应该使用 -O 标志进行编译,-I 是为了从设备树 blob 中获取文本形式的设备树。 - danglingpointer
3个回答

11

我想在这里加入两年的经验更新。

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

8
为什么不生成新的DTB?
DTB(设备树二进制/二进制文件)是硬件数据库,它代表了板子上的硬件组件。
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

请查看此设备树入门指南


1
make 呼叫一定会有效。不幸的是,我使用 yocto 构建系统,因此我需要再制作一个配方来公开该呼叫。我认为这是最佳选择,因为 dtc(即使使用 -O)仍然对我无效。 - Liam Kelly

0

使用yocto,您可以执行以下操作:

bitbake <KERNEL-VERSION> -f -c compile

例如:

bitbake linux-stable -f -c compile

您将在此处找到结果:

build/tmp/work/<YOUR_MACHINE>-<YOUR-DISTRO>-linux-gnueabi/<KERNEL-RECIPE>/<KERNEL-VERSION>/linux-<YOUR-MACHINE>-standard-build/arch/<ARCH>/boot/dts/<YOUR-DTS-FILENAME>.dtb

你还可以在那里找到名为.<YOUR-DTS-FILENAME>.dtb.dts.tmp的预处理器结果。该文件包含所有的引用,对于错误分析非常有用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接