设备树(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文件时,需要注意文件的相对路径问题。