设备树文本文件的写入顺序是否重要?

时间:2017-06-17 21:51:12

标签: kernel linux-device-driver device-tree

设备树文本文件(.dts)的编写顺序是否完整?

例如,如果从文件顶部取一个节点并将其移到底部,它是否会改变硬件检测,IRQ配置等等的顺序?

1 个答案:

答案 0 :(得分:1)

  

设备树文本文件(.dtx)的编写顺序是否完整?

.dts .dtsi 源文件的答案为"取决于"。
设备树具有结构,因此重新排列节点可能会也可能不会改变系统硬件配置。

总体而言,设备树具有诸如(Device Tree for Dummies的幻灯片23)

之类的结构
/ {
    aliases { ... };
    cpus { ... };
    apb@80000000 {
        apbh@80000000 {
            /* Some devices */
        };
        apbx@80040000 {
            /* Some devices */
        };
    };
    ahb@80080000 {
        /* Some devices */
    };
};

设备将由节点描述 连接到特定总线的设备节点(例如,apbh @ 80000000)可以通过设备地址以数字方式排序,或者按设备名称按字母顺序排序。节点(在总线内)的这种排序并不重要 但是如果"你从文件顶部取一个节点并将其移到底部" 并将节点重新分配到另一个总线,那么显然你会定义一个不同的配置(可能不正确)。

设备树源文本的文件结构由 .dts 文件(用于电路板)和可选的 .dtsi 文件组成。理想情况下,SoC的 .dtsi 文件应该是通用的,并且可以包含在使用该SoC的每个 .dts 电路板文件中。

SoC的 .dtsi 文件通常由供应商提供,并且应该具有所有芯片设备的定义。将定义和启用基本设备(例如,电源管理,DMA控制器)。但是,非必需的可选外围设备和/或I / O连接到多路复用引脚的外围设备将被禁用。

apbh@80000000 {
    [...]
    hsadc: hsadc@80002000 {
        reg = <0x80002000 0x2000>;
        [...]
        status = "disabled";
    };
    [...]
};

如果您想在电路板上使用可选外围设备,则不应仅为您的电路板修改或自定义SoC .dtsi 文件。
相反,您应该在顶级电路板文件(包括SoC .dtsi 文件)中扩充该设备的节点,并重新声明设备的状态。

#include "my_soc.dtsi"
/ {
    apb@80000000 {
        apbh@80000000 {

            hsadc: hsadc@80002000 {
                status = "okay";
            };

            [...]
        };
    };
};

要获得正确的配置,具有status = "okay"的此节点必须位于通用节点之后(包含在 .dtsi 中),以便status = "disabled"可以覆盖。
很明显,这是位置依赖的另一种情况。

  

我的意思是,例如,如果你从文件顶部取一个节点并将其移到底部,它会改变硬件检测,irq配置或其他什么顺序吗?

设备树仅用于定义系统硬件的配置。设备驱动程序的执行顺序由驱动程序的构建方式控制,即 initcall 宏。请参阅init function invocation of drivers compiled into kernelWhat is the difference between module_init and subsys_initcall while initializing the driver?
设备驱动程序对资源的获取受该驱动程序的控制,而不是由设备树属性引导,这些属性仅由驱动程序读取。