设备树
<p>在Linux3.x版本后,arch/arm/plat-xxx和arch/arm/mach-xxx中,描述板级细节的代码被大量取消,取而代之的是设备树,其目录位于arch/arm/boot/dts</p>
<h3>组成</h3>
<p>1个dts文件+n个dtsi文件,它们编译而成的dtb文件就是真正的设备树</p>
<ul>
<li>
<p>soc厂商会把soc公共的特性和多块开发板公用的特性提炼为dtsi,而dts则负责描述某个具体的产品(开发板)的特性。dts直接或间接的包含多个dtsi(类似于c语言的头文件),就体现了一个完整的产品(开发板)所有的特性。以solidrun公司的hummingboard为例,其组成为
<img src="https://www.showdoc.cc/server/api/common/visitfile/sign/e937c202d1a39368d28379b383334578?showdoc=.jpg" alt="" /></p>
</li>
<li>此外,dts/dtsi兼容c语言的一些语法,能使用宏定义,也能包含.h文件</li>
</ul>
<h3>例子</h3>
<p>下不难发现dts文件内容很少,只有一些板级的特征,大部分公共的硬件描述都在dtsi文件中</p>
<ul>
<li>
<p>imx6dl-hummingboard.dts 文件节选</p>
<pre><code>/dts-v1/;
#include "imx6dl.dtsi"
#include "imx6qdl-microsom.dtsi"
#include "imx6qdl-microsom-ar8035.dtsi"
/ {
model = "SolidRun HummingBoard DL/Solo";
compatible = "solidrun,hummingboard", "fsl,imx6dl";
ir_recv: ir-receiver {
compatible = "gpio-ir-receiver";
gpios = <&gpio1 2 1>;
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hummingboard_gpio1_2>;
};
regulators {
compatible = "simple-bus";
reg_3p3v: 3p3v {
compatible = "regulator-fixed";
regulator-name = "3P3V";
regulator-min-microvolt = <3300000>;
regulator-max-microvolt = <3300000>;
regulator-always-on;
};
}
&i2c1 {
pinctrl-names = "default";
pinctrl-0 = <&pinctrl_hummingboard_i2c1>;
rtc: pcf8523@68 {
compatible = "nxp,pcf8523";
reg = <0x68>;
};
};</code></pre>
</li>
<li>
<p>imx6dl.dtsi文件节选</p>
<pre><code>/ {
aliases {
/*省略无关代码*/
}
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
interrupt-parent = <&intc>;
ranges;
/*省略无关代码*/
timer@00a00600 {
compatible = "arm,cortex-a9-twd-timer";
reg = <0x00a00600 0x20>;
interrupts = <1 13 0xf01>;
clocks = <&clks IMX6QDL_CLK_TWD>;
};
aips-bus@02000000 { /* AIPS1 */
compatible = "fsl,aips-bus", "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
reg = <0x02000000 0x100000>;
ranges;
/*省略无关代码*/
gpio1: gpio@0209c000 {
compatible = "fsl,imx6q-gpio", "fsl,imx35-gpio";
reg = <0x0209c000 0x4000>;
interrupts = <0 66 IRQ_TYPE_LEVEL_HIGH>,
<0 67 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
/*省略无关代码*/
i2c1: i2c@021a0000 {
#address-cells = <1>;
#size-cells = <0>;
compatible = "fsl,imx6q-i2c", "fsl,imx21-i2c";
reg = <0x021a0000 0x4000>;
interrupts = <0 36 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6QDL_CLK_I2C1>;
status = "disabled";
};
};
/*省略无关代码*/
};
};</code></pre>
</li>
</ul>