常见泽1 发表于 2024-4-27 20:25

《原子嵌入式Linux驱动开发详解与实战》第4章 第5章设备树相关例程学习

<p><span style="font-family:宋体;"><span style="font-size:12px;"><b>设备树DTS语法</b></span></span></p>

<p >&nbsp;</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 >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">#include &lt;dt-bindings/input/input.h&gt;</span></span></p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">#include &quot;imx6ull.dtsi&quot;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">二.设备节点</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。每个设备都有一个节点,叫做设备节点。</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用这些标准属性,本节我们就来学习一下几个常用的标准属性。</span></span></p>

<p >&nbsp;</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;"> &nbsp;</span></span></p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">&ldquo;/&rdquo;是根节点,每个设备树文件只有一个根节点。</span></span></p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">1、compatible 属性</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">compatible 属性也叫做&ldquo;兼容性&rdquo;属性,这是非常重要的一个属性!compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序, compatible 属性的值格式如下所示:</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">&quot;manufacturer,model&quot;</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;"> &nbsp;</span></span></p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;"> &nbsp;</span></span></p>

<p >&nbsp;</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 >&nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">model 属性</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">model 属性值也是一个字符串, model 属性描述设备模块信息,比如名字什么的,比如:</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">model = &quot;wm8960-audio&quot;;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">非必须的吧</span></span></p>

<p >&nbsp;</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 >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p >&nbsp;</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 >&nbsp;</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;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p >&nbsp;</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 = &lt;0x02020000 0x4000&gt;;

    interrupts = &lt;GIC_SPI 26 IRQ_TYPE_LEVEL_HIGH&gt;;

    clocks = &lt;&amp;clks IMX6UL_CLK_UART1_IPG&gt;,

             &lt;&amp;clks IMX6UL_CLK_UART1_SERIAL&gt;;

    clock-names = "ipg", "per";

    status = "disabled";

};</code></pre>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">上述代码是节点 uart1, uart1 节点描述了 I.MX6ULL 的 UART1 相关信息。其中 uart1 的父节点 aips1: aips-bus@02000000 设置了#address-cells = &lt;1&gt;、 #sizecells = &lt;1&gt;,因此 reg 属性中address=0x02020000, length=0x4000。</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">查阅《I.MX6ULL 参考手册》可知, I.MX6ULL 的 UART1 寄存器首地址为 0x02020000,但是 UART1 的地址长度(范围)并没有 0x4000 这么多,这里我们重点是获取 UART1 寄存器首地址。</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">Chosen子节点</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;"> &nbsp;</span></span></p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">Chosen节点主要是为了Uboot向Linux内核传递数据,重点是bootargs参数。一般dts文件中的chosen节点通常为空或者内容很少</span></span></p>

<p >&nbsp;</p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;">追加节点</span></span></p>

<p >&nbsp;</p>

<p ><span style="font-family:宋体;"><span style="font-size:12px;"> &nbsp;</span></span></p>

<p >&nbsp;</p>

beyond_笑谈 发表于 2024-4-29 09:18

<p>设备树分析的不错,更改过TI的设备树,内容也差不多</p>

通途科技 发表于 2024-10-1 12:29

页: [1]
查看完整版本: 《原子嵌入式Linux驱动开发详解与实战》第4章 第5章设备树相关例程学习