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

22

我要在我的开发板上启动Linux,并需要一个dts文件(设备树文件)来描述整个硬件。但是我对这个文件的语法了解很少,这不足以使Linux在开发板上正常运行。

目前我只知道如何描述一个单元的中断号、频率、地址、父单元以及它兼容的驱动程序类型(如下所述):

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 >;
                } ;

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

4个回答

27

非常感谢您提供的参考资料。不幸的是,第一个链接已经失效了。是否有合适的替代方案呢? - rbrito
1
@rbrito 感谢您指出这个失效的链接。已将其删除。更新了Link1,并提供了一个更全面的来源,该来源在过去几个月中得到了扩展。 - TheCodeArtist

5

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

我们的示例将向versatilepb设备树添加以下设备节点,由于-M versatilepb,QEMU将使用它:

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功能:

  • 寄存器地址
  • IRQs
  • 从驱动程序中读取自定义属性

这些是示例的主要组件:

  • Linux versatile .dts patch on Linux fork
    • reginterrupt匹配的数字在QEMU versatile机器中硬编码(代表SoC)
    • compatible与内核模块中的platform_driver.name相匹配,并通知内核哪个模块将处理此设备
    • 我们还向驱动程序传递了一个自定义属性:lkmc-asdf = <0x12345678>;,使用of_property_read_u32读取
    • 设备树通过-dtb参数传递给QEMU固件
  • QEMU分支:
  • 内核模块在探测时写入内存以测试功能,也会生成IRQ。
设备树有许多我们没有涉及到的功能,但是这个例子可以帮助您入门,并轻松地让您玩转任何新功能。
更多资源:
- 不可或缺的elinux教程:http://elinux.org/Device_Tree_Usage - 使用dtc进行纯语法问题的测试。例如,它展示了如何通过路径简单合并节点:https://unix.stackexchange.com/a/375923/32558 - https://unix.stackexchange.com/questions/118683/what-is-a-device-tree-and-a-device-tree-blob

4
让我们以一个例子为例,并在下面逐一解释每个内容。
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";
};

必需的属性:
- compatible:应为"fsl,-auart"。支持的SoCs包括imx23和imx28。
- reg:设备寄存器集的地址和长度
- interrupts:应包含auart中断号
- dmas:DMA说明符,由DMA控制器节点的phandle和AUART DMA通道ID组成。
- dma-names:"rx"表示RX通道,"tx"表示TX通道。

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

希望能帮到您!


0

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