如何将dts Linux设备树源文件编译为dtb?

56

我有一个设备树文件(.dts),想要为我的基于PowerPC的板子编译该文件。

我应该如何在非PowerPC的机器上进行编译? 我能否使用在我的Ubuntu系统上已安装的DTC进行编译?还是更像使用单独的编译器并传递ARCH信息(例如使用工具链)?

3个回答

81

设备树不需要使用“面向体系结构”的工具进行编译。您的Ubuntu机器上的dtc编译器可能足以编译您的设备树。或者您可以下载最新的源代码并自行编译。dtc编译器可以在此处找到:

https://git.kernel.org/pub/scm/utils/dtc/dtc.git

该软件包中有一些很好的文档,可以帮助您更好地了解设备树的基本概念。

编译(和反汇编)设备树非常容易。例如

$ dtc -O dtb -o p4080ds.dtb p4080ds.dts

要从设备树 Blob 中以文本形式获取设备树,请执行以下操作:

$ dtc -I dtb -O dts p4080ds.dtb
希望这能帮到您!

是的,你说得没错,Challinan。它们不需要使用“架构感知”工具进行编译。虽然我不太确定为什么? - mdsingh
1
编译为在计算机上运行的程序应该具备适应计算机体系结构的能力,不是吗? - mdsingh
2
@mdsingh:“编译”DTS到DTB并不会生成可在CPU上运行的二进制文件。DTB文件只是DTS文件的二进制表示(就像序列化XML一样),它有助于内核了解架构上可用的设备及其配置。这有助于使内核源码不那么依赖硬件配置。因此,可以看出,设备树旨在成为架构“无知”的。 - Isaac
因此,它并没有被加载到内存中,而只是被内核读取(解析)。这就是它具有架构无关性的原因,因为它被设计成如此。谢谢。 - mdsingh
你应该尝试更新dtc的git链接。它似乎已经失效了! - Raulp
@mdsingh,内核从引导加载程序那里传递了一个数据结构,告知它DTB的位置。它可能仍然在磁盘上,也可能已经被加载到内存中。 - sherrellbc

31
  • dtc 可以通过以下命令在Linux上进行安装

    sudo apt-get install device-tree-compiler

  • 您可以使用以下命令编译 dtsdtsi 文件:

    dtc -I dts -O dtb -o devicetree_file_name.dtb devicetree_file_name.dts

  • 您可以使用以下命令将dts文件转换dtb

    dtc -I dts -O dtb -f devicetree_file_name.dts -o devicetree_file_name.dtb

  • 您可以使用以下命令将dtb文件转换dts

    dtc -I dtb -O dts -f devicetree_file_name.dtb -o devicetree_file_name.dts


哦,但现在的dts文件可以包含其他文件,所以你需要cpp和makefiles。 - Alan Corey
1
我可能有点晚了,但在这种情况下,“编译”和“将dts转换为dtb”的区别是什么? - elhe
1
@elhe 基本上,编译会收集其他文件和它们上面的所有符号,以创建最终的 DTB 文件。从 DTB 转换为 DTS 只是获取已经编译好的 DTB 并将其转换回可读形式的 DTS。 - Bybit360

24

生成设备树二进制文件

从内核树中进行此操作是另一种常见的编译方式,因为将dts放置在内核树下的标准位置是以./arch/<arch>/boot/dts/目录形式命名。

这最终会调用dtc,但由于包含的潜在文件将处于正确位置,因此可能效果更佳。

dtb文件与dts文件放置在同一目录下。


2
是的,为了使其工作,我不得不将dts添加到./arch/<arch>/boot/dts/Makefile中。 - Goosebumps

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