《原子嵌入式Linux驱动开发详解与实战》第4章 第5章设备树相关例程学习
<p><span style="font-family:宋体;"><span style="font-size:12px;"><b>设备树DTS语法</b></span></span></p><p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">一.dtsi 头文件</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">和 C 语言一样,设备树也支持头文件,设备树的头文件扩展名为.dtsi。在 imx6ull-alientekemmc.dts 中有如下所示内容:</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">#include <dt-bindings/input/input.h></span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">#include "imx6ull.dtsi"</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">二.设备节点</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。每个设备都有一个节点,叫做设备节点。</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用这些标准属性,本节我们就来学习一下几个常用的标准属性。</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">打开dtsi文件</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">“/”是根节点,每个设备树文件只有一个根节点。</span></span></p>
<p > </p>
<p > </p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">1、compatible 属性</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性!compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">"manufacturer,model"</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">Led这个设备首先使用第一个兼容值在linux内核中查找,如果没有再用第二个值查找。一般驱动文件都有一个of匹配表,此OF匹配表保存一些compatible值,如果设备节点的任一个compatible值与之匹配,那么表示这个设备可以使用这个驱动。</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">设备树里有的话应该也一样吧,个人理解</span></span></p>
<p > </p>
<p > </p>
<p > </p>
<p > </p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">model 属性</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">model 属性值也是一个字符串, model 属性描述设备模块信息,比如名字什么的,比如:</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">model = "wm8960-audio";</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">非必须的吧</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">status 属性</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">status 属性是和设备状态有关的, status 属性值也是字符串,字符串是设备的状态信息,可选的状态如表</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p > </p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">#address-cells 和#size-cells 属性</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">这两个属性的值都是无符号 32 位整形, #address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长(32 位)</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">#size-cells 属性值决定了子节点 reg 属性中长度信息所占的字长(32 位)。</span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p > </p>
<p > </p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"><b>reg 属性</b></span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">reg 属性的值一般是(address, length)对。 **reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息,**比如在 imx6ull.dtsi 中有如下内容:</span></span></p>
<pre>
<code>uart1: serial@02020000 {
compatible = "fsl,imx6ul-uart",
"fsl,imx6q-uart", "fsl,imx21-uart";
reg = <0x02020000 0x4000>;
interrupts = <GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH>;
clocks = <&clks IMX6UL_CLK_UART1_IPG>,
<&clks IMX6UL_CLK_UART1_SERIAL>;
clock-names = "ipg", "per";
status = "disabled";
};</code></pre>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">上述代码是节点 uart1, uart1 节点描述了 I.MX6ULL 的 UART1 相关信息。其中 uart1 的父节点 aips1: aips-bus@02000000 设置了#address-cells = <1>、 #sizecells = <1>,因此 reg 属性中address=0x02020000, length=0x4000。</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">查阅《I.MX6ULL 参考手册》可知, I.MX6ULL 的 UART1 寄存器首地址为 0x02020000,但是 UART1 的地址长度(范围)并没有 0x4000 这么多,这里我们重点是获取 UART1 寄存器首地址。</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">Chosen子节点</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">Chosen节点主要是为了Uboot向Linux内核传递数据,重点是bootargs参数。一般dts文件中的chosen节点通常为空或者内容很少</span></span></p>
<p > </p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;">追加节点</span></span></p>
<p > </p>
<p ><span style="font-family:宋体;"><span style="font-size:12px;"> </span></span></p>
<p > </p>
<p>设备树分析的不错,更改过TI的设备树,内容也差不多</p>
页:
[1]