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

如何编写Linux.dts设备树文件?,linux,linux-kernel,device-tree,Linux,Linux Kernel,Device Tree,我将在我的开发板上启动一个Linux,我需要一个dts文件(设备树文件)来描述整个硬件。但是我对这个文件的语法知之甚少,这还不足以在主板上正确运行Linux 我现在只知道如何描述单元的中断号、频率、地址、父单元及其兼容的驱动程序类型(如下所述): ps7\u scuwdt\u 0:ps7-scuwdt@f8f00620 { compatible=“xlnx,ps7-scuwdt-1.00.a”; 设备类型=“看门狗”; 中断父项=; 中断=; reg=; } ; 其他高级用法或语法对我来说并不

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

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

ps7\u scuwdt\u 0:ps7-scuwdt@f8f00620 {
compatible=“xlnx,ps7-scuwdt-1.00.a”;
设备类型=“看门狗”;
中断父项=;
中断=<114769>;
reg=<0xf8f00620 0xe0>;
} ;

其他高级用法或语法对我来说并不熟悉。

看看与开发板最相似的开发板的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";
};
auart0:serial@8006a000 {
compatible=“fsl,imx28 auart”,“fsl,imx23 auart”;
reg=;
中断=;
dmas=;
dma名称=“接收”、“发送”;
};
所需属性:
-兼容:应为“fsl,-auart”。受支持的SOC包括 imx23和imx28。
-reg:为设备设置的寄存器的地址和长度
-中断:应包含auart中断编号
-dmas:DMA说明符,由一个到DMA控制器节点的幻影组成 和AUART DMA信道ID。
-dma名称:rx信道为“rx”,tx信道为“tx”。

注意:每个auart端口都应该有一个在“别名”中正确编号的别名 节点。
有关更多高级属性,请访问此链接,它非常有用


希望有帮助

最小
reg
+
中断
使用QEMU虚拟设备的示例

我们的示例将以下设备树节点添加到
versatilepb
设备树中,QEMU将使用该设备树,因为
-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>;
};
lkmc_平台_device@101e9000 {
compatible=“lkmc\u平台\u设备”;
reg=;
中断=;
中断控制器;
#中断单元=;
时钟=;
时钟名称=“apb_pclk”;
lkmc-asdf=;
};
然后,通过使用Linux内核模块与设备交互,我们将测试以下DTS功能:

  • 注册地址
  • IRQ
  • 从驱动程序读取自定义属性
以下是示例的主要组成部分:

    • reg
      中断
      匹配QEMU多功能机器(代表SoC)中硬编码的数字
    • compatible
      匹配内核模块中的
      平台驱动程序.name
      ,并通知内核哪个模块将处理此设备
    • 我们还将一个自定义属性传递给驱动程序:
      lkmcasdf=,使用属性的
      读取
    • 设备树通过
      -dtb
      参数传递给QEMU的固件
  • QEMU叉子:
    • 它读取寄存器并生成中断
  • 写入探测器上的内存以进行测试,这也会生成IRQ
设备树还有很多我们没有介绍的功能,但是这个例子应该可以让您开始使用,并且让您可以轻松地使用出现的任何新功能

其他资源:

  • elinux教程:
  • 使用
    dtc
    解决纯粹的语法问题。例如,它显示了如何通过路径简单地合并节点:

补充其他答案:


请记住,在官方内核源代码的
根目录/Documentation/devicetree
()下还有一个关于devicetree的部分。

非常感谢您的参考。不幸的是,第一个坏了。有合适的替代品吗?@rbrito谢谢你指出了死链接。移除它。使用过去几个月增长的更全面的来源更新link1。
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>;
};