如何编写Linux .dts设备树文件?

我将在我的开发板上启动一个Linux,我需要一个dts文件(设备树文件)来描述整个硬件。 但是我对这个文件的语法知之甚less,不足以在电路板上正确运行Linux。

我现在所知道的只是如何描述一个单元的中断号,频率,地址,父单元及其兼容的驱动程序types(如下所述):

ps7_scuwdt_0: ps7-scuwdt@f8f00620 { compatible = "xlnx,ps7-scuwdt-1.00.a"; device_type = "watchdog"; interrupt-parent = <&ps7_scugic_0>; interrupts = < 1 14 769 >; reg = < 0xf8f00620 0xe0 >; } ; 

其他高级用法或语法对我来说是陌生的。

Solutions Collecting From Web of "如何编写Linux .dts设备树文件?"

看看最接近你的开发板的董事会的DTS。 使用它作为参考,并根据参考板和开发板之间的差异对dts进行更改。

还要检查以下内容:
– 在eLinux上的设备树文档项目 (有大量链接开始阅读)。
一系列关于设备树基础知识的文章
– 迁移到设备树的演练

让我们举个例子,我会解释他们每一个如下

 auart0: serial@8006a000 { compatible = "fsl,imx28-auart", "fsl,imx23-auart"; reg = <0x8006a000 0x2000>; interrupts = <112>; dmas = <&dma_apbx 8>, <&dma_apbx 9>; dma-names = "rx", "tx"; }; 

所需的属性:
– 兼容:应该是“fsl,-auart”。 支持的SoC包括imx23和imx28。
– reg:设备寄存器的地址和长度
– 中断:应该包含auart中断号码
– dmas:DMA说明符,由DMA控制器节点和AUART DMA通道ID组成。
– dma-names:接收通道的“rx”,TX通道的“tx”。

注意:每个auart端口应该在“别名”节点中有一个正确编号的别名。
对于更多的高级属性,请到这个链接,这是非常有用的
设备树说明

希望能帮助到你!

QEMU虚拟设备的最小reg + interrupt示例

我们的示例将下面的设备树节点添加到QEMU将使用的versatilepb pb设备树,因为-M versatilepb

 lkmc_platform_device@101e9000 { compatible = "lkmc_platform_device"; reg = <0x101e9000 0x1000>; interrupts = <18>; interrupt-controller; #interrupt-cells = <2>; clocks = <&pclk>; clock-names = "apb_pclk"; lkmc-asdf = <0x12345678>; }; 

然后,通过使用Linux内核模块与设备交互,我们将测试以下DTS功能:

  • 注册地址
  • 的IRQ
  • 从驱动程序读取自定义属性

这些是这个例子的主要组成部分:

  • Linux多功能.dts补丁在Linux分叉
    • reginterrupt在QEMU多功能机器(代表SoC)中硬编码的匹配号码,
    • compatible与内核模块中的platform_driver.name匹配,并通知内核哪个模块将处理该设备
    • 我们还将一个自定义属性传递给驱动程序: lkmc-asdf = <0x12345678>; ,这是用of_property_read_u32读取的
    • 设备树通过-dtb参数传递给QEMU的固件
  • QEMU前叉:
    • 读取寄存器并产生中断的设备
    • 将设备插入-M versatilepb
  • 内核模块写入探针上的内存来测试事情,这也会产生一个IRQ。

设备树还有许多我们没有涉及到的功能,但是这个例子可以帮助您开始,并且可以轻松地使用任何新功能。

更多资源: