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

Ezi*_*zio 15 linux linux-kernel device-tree

我将在我的开发板上启动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 >;
                } ;
Run Code Online (Sandbox Code Playgroud)

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

The*_*ist 17

看看董事会的dts,它与你的开发板非常相似.使用它作为参考,并根据参考板和开发板之间的差异对dts进行更改.

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


Cir*_*四事件 5

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

我们的示例将以下设备树节点添加到versatilepbQEMU 将使用的设备树中-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>;
};
Run Code Online (Sandbox Code Playgroud)

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

  • 注册地址
  • 中断请求
  • 从驱动程序读取自定义属性

这些是示例的主要组件:

  • .dtsLinux fork 上的 Linux多功能补丁
    • reginterrupt匹配在 QEMU 多功能机器(代表 SoC)中硬编码的数字
    • compatible匹配platform_driver.name内核模块中的 ,并通知内核哪个模块将处理此设备
    • 我们还向驱动程序传递了一个自定义属性:lkmc-asdf = <0x12345678>;,它被读取of_property_read_u32
    • 设备树通过-dtb参数传递给 QEMU 的固件
  • QEMU 叉:
  • 内核模块在探测器上写入内存以进行测试,这也会生成一个 IRQ。

设备树有很多我们没有涉及的功能,但是这个例子应该能让你开始,并且可以轻松地让你尝试使用出现的任何新功能。

更多资源: