您的位置:

深入了解dtsi

设备树(Data Tree Structure, dts)是一种描述硬件信息的数据格式,它以树形结构的形式,描述了设备的属性、寄存器、中断等信息。dtsi文件是设备树的一个重要组成部分,其作用是提供一些设备节点的基本属性和引用关系,方便其他dts文件引用和重用这些设备节点。

一、dtsi文件的作用

dtsi文件是设备树的组成部分之一,它包含了设备树中所有设备节点的基本属性和引用关系,在设备树的编译过程中会被包含到其他dts文件中,以便于其他dts文件引用和重用其中的节点信息。

以ARM架构的设备树为例,一个SoC的设备树一般由三个dts文件组成:SoC的dts文件、板级的dts文件和机器的dts文件。其中,SoC的dts文件包含了SoC内部的各种设备节点;板级的dts文件包含了与硬件相关的信息,如板级支持的硬件设备;机器的dts文件包含了与具体机器相关的信息,如内存大小、Flash大小等。

在这三个dts文件中,SoC的dts文件是一个虚拟的文件,它不会被直接使用,而板级的dts文件和机器的dts文件则会使用相同的SoC的dtsi文件。这种方式可以有效地避免重复定义和管理繁琐的问题。

二、dtsi文件的写法

dtsi文件的写法与普通的dts文件类似,但需要遵循一些规则。

首先,dtsi文件名的后缀必须是“.dtsi”,表示这是一个设备树源文件的包含文件。

其次,dtsi文件中只负责定义和引用设备节点,不能包含实际的设备节点信息。例如,不能在dtsi文件中定义一个完整的设备节点,而只能定义用于其他dts文件引用的基本节点信息和属性。

下面是一个简单的dtsi文件的示例代码:

/* dtsi文件的示例代码 */
/ {
    model = "Example SoC";
    compatible = "example,soc-v1.0";

    gpio: gpio@80010000 {
        compatible = "example,gpio";
        reg = <0x80010000 0x10000>;
        interrupts = <0 1 2>; /* GPIO IRQ */
        gpio-controller;
        #gpio-cells = <2>;
        interrupt-controller;
        #interrupt-cells = <2>;
    };
};

上述代码中,定义了一个名为gpio的设备节点,并定义了该节点的属性,包括compatible、reg、interrupts等。该节点也被声明为一个gpio控制器和中断控制器,供其他dts文件引用。

三、dtsi文件的引用

在其他dts文件中,通过include语句引用dtsi文件。include语句格式为“#include <文件名>”。

在引用dtsi文件时,需要注意文件的相对路径问题。相对路径的起点是当前dts文件所在的目录。

下面是一个包含了上述dtsi文件的示例dts文件的代码:

/* 示例如何在dts文件中引用dtsi文件 */
/dts-v1/;
/ {
    model = "Example Board";
    compatible = "example,board-v1.0";

    memory@80000000 {
        device_type = "memory";
        reg = <0x80000000 0x10000000>;
    };

    gpio-keys {
        compatible = "example,gpio-keys";
        #address-cells = <1>;
        #size-cells = <0>;
        status = "okay";
        pinctrl-names = "default";
        pinctrl-0 = <&soc_gpio_keys>;
        gpios = <&gpio 10 0 1>; /* KEY0 */
        debounce-interval = <10>;

        soc_gpio_keys: gpio-keys {
            compatible = "example,gpio-keys-pins";
            /* GPIO pin number, pin name, pin direction */
            gpio-pin0 = <&gpio 2 0>;
            gpio-pin1 = <&gpio 2 1>;
            gpio-pin2 = <&gpio 2 2>;
            gpio-pin3 = <&gpio 2 3>;
            gpio-pin4 = <&gpio 2 4>;
            gpio-pin5 = <&gpio 2 5>;
        };
    };

    /* 引用gpio节点 */
    #include <"example-soc.dtsi">>;
};

上述代码中,include语句引用了上述示例dtsi文件中定义的gpio节点。include语句中使用的相对路径是从示例dts文件所在目录开始计算的。

四、总结

dtsi文件是设备树中的一个重要组成部分,它定义了设备树节点的基本属性和引用关系,可以有效地避免重复定义和管理繁琐的问题。dtsi文件的写法需要遵循一些规则,例如不能定义完整的设备节点,只能定义基本节点信息和属性。在其他dts文件中引用dtsi文件时,需要注意文件的相对路径问题。