设备树文件中设备节点的标准属性

一.  简介

前面几篇文章学习了 设备树文件编译,调用关系,以及设备节点。本文继续学习设备树文件的语法。

节点是由一堆的属性组成,节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性, Linux 下的很多外设驱动都会使用 这些标准属性,本文我们就来学习一下几个常用的标准属性。

二.  设备树文件中设备节点的标准属性

下面就来学习一下几个常用的标准属性。

1.  compatible 属性

compatible 属性也叫做“兼容性”属性,这是非常重要的一个属性! compatible 属性的值是一个字符串列表, compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要 使用的驱动程序, compatible 属性的值格式如下所示:
"manufacturer,model"
其中 manufacturer 表示厂商, model 一般是模块对应的驱动名字。
例如, imx6ull-alientek- emmc.dts sound 节点是 I.MX6U-ALPHA 开发板的音频设备节点, I.MX6U-ALPHA 开发板上 的音频芯片采用的欧胜 (WOLFSON) 出品的 WM8960 sound 节点的 compatible 属性值如下:
compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960";
属性值有两个,分别为“ fsl,imx6ul-evk-wm8960 ”和“ fsl,imx-audio-wm8960 ”,其中 “ fsl ” 表示厂商是飞思卡尔,“ imx6ul-evk-wm8960 ”和“ imx-audio-wm8960 ”表示驱动模块名字。 sound 这个设备首先使用第一个兼容值在 Linux 内核里面查找,看看能不能找到与之匹配的驱动文件, 如果没有找到的话就使用第二个兼容值查。
一般驱动程序文件都会有一个 OF 匹配表,此 OF 匹配表保存着一些 compatible 值,如果设
备节点的 compatible 属性值和 OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个
驱动。

2.  model 属性

model 属性值也是一个字符串,一般 model 属性描述设备模块信息,比如名字什么的,比如:
model = "wm8960-audio";

3. status 属性

status 属性看名字就知道是和设备状态有关的,status 属性值也是字符串,字符串是设备的状态信息。可选的状态如下表所示 :
描述
“okay”
表明设备是可操作的。
“disabled”
表明设备当前是不可操作的,但是在未来可以变为可操作的,比如热插拔设备插入以后。至于 disabled 的具体含义还要看设备的绑定文档。
“fail”
表明设备不可操作,设备检测到了一系列的错误,而且设备也不大可能变得可
操作。
“fail-sss”
含义和“fail”相同,后面的 sss 部分是检测到的错误内容。

4. #address-cells 和#size-cells 属性

这两个属性的值都是无符号 32 位整形, #address-cells #size-cells 这两个属性可以用在任
何拥有子节点的设备中,用于描述子节点的地址信息
#address-cells 属性值决定了子节点 reg 属性中地址信息所占用的字长 (32 ) #size-cells 属性值决定了子节点 reg 属性中长度信息所占的 字长 (32 ) #address-cells #size-cells 表明了子节点应该如何编写 reg 属性值,一般 reg 属性 都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度, reg 属性的格式一为:
reg = 
每个“ address length ”组合表示一个地址范围,其中 address 是起始地址, length 是地址长度, #address-cells 表明 address 这个数据所占用的字长, #size-cells 表明 length 这个数据所占用
的字长。
例如:
spi4 {
     compatible = "spi-gpio";
     #address-cells = <1>;
     #size-cells = <0>;
 
     gpio_spi: gpio_spi@0 {
     compatible = "fairchild,74hc595";
     reg = <0>;
     };
 };

可以看出,第 3 4 行,节点 spi4 #address-cells = <1> #size-cells = <0> ,说明 spi4 的子节点 reg 性中起始地址所占用的字长为 1 ,地址长度所占用的字长为 0
8 行,子节点 gpio_spi: gpio_spi@0 reg 属性值为 <0> ,因为父节点设置了 #address-cells = <1> #size-cells = <0> ,因此 addres=0 ,没有 length 的值,相当于设置了起始地址,而没 有设置地址长度。

5.  reg 属性

reg 属性的值一般是 (address length) 对。 reg 属性一般用于描述设备地址空间资源信息,一般都是某个外设的寄存器地址范围信息。但是,有时候也可以表示器件地址。例如,在 imx6ull-alientek- emmc.dts设备树文件中,i2c节点如下:
&i2c1 {
............................	
mag3110@0e {
		compatible = "fsl,mag3110";
		reg = <0x0e>;
		position = <2>;
	};
............................
};
上面的 reg =  <0x0e> 表示 mag3110这个 i2c外设的器件地址。

6.  ranges 属性

ranges 属性值可以为空或者按照 (child-bus-address,parent-bus-address,length) 格式编写的数字矩阵, ranges 是一个地址映射 / 转换表, ranges 属性每个项目由子地址、父地址和地址空间长度 这三部分组成:
child-bus-address :子总线地址空间的物理地址,由父节点的 #address-cells 确定此物理地址 所占用的字长。
parent-bus-address 父总线地址空间的物理地址,同样由父节点的 #address-cells 确定此物理地址所占用的字长。
length 子地址空间的长度,由父节点的 #size-cells 确定此地址长度所占用的字长。

如果 ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换,对于我们所使用的 I.MX6ULL 来说,子地址空间和父地址空间完全相同 ,因此会在 imx6ull.dtsi
中找到大量的值为空的 ranges 属性。

7.  name 属性

name 属性值为字符串, name 属性用于记录节点名字, name 属性已经被弃用,不推荐使用 name 属性,一些老的设备树文件可能会使用此属性。

8. device_type 属性

device_type 属性值为字符串, IEEE 1275 会用到此属性,用于描述设备的 FCode ,但是设备树没有 FCode ,所以此属性也被抛弃了。此属性只能用于 cpu 节点或者 memory 节点。 imx6ull.dtsi 设备树文件的 cpu0 节点用到了此属性,内容如下所示:
cpu0: cpu@0 {
 compatible = "arm,cortex-a7";
 device_type = "cpu";
 reg = <0>;
......
 };

关于标准属性就讲解这么多,其他的比如中断、IICSPI 等使用的标准属性等到具体的例程再讲解。

你可能感兴趣的:(Linux驱动学习,linux,arm开发)