节点都是具体的设备,不同的设备需要的属性不同,用户可以自定义属性。除了用户自定义属性,有很多属性是标准属性,Linux 下的很多外设驱动都会使用这些标准属性。
compatible 属性也叫做 “兼容性” 属性,这是非常重要的一个属性。compatible 属性的值是一个字符串列表,compatible 属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序,属性的值格式如下所示:
"manufacturer,model"
例如,sound 节点的compatible 属性值如下:
compatible = "fsl,imx6ul-evk-wm8960","fsl,imx-audio-wm8960"
sound 这个设备首先使用第一个兼容值在Linux 内核里面查找,看看能不能找到与之匹配的驱动文件,如果没找到的话就使用第二个兼容值查。
一般驱动程序文件都会有一个OF 匹配表,此OF匹配表保存着一些compatible 值,如果设备节点的compatible 属性值和OF 匹配表中的任何一个值相等,那么就表示设备可以使用这个驱动。
model 属性值也是一个字符串,一般model 属性描述设备模块信息,比如名字什么的。
model = "wm8960-audio"
status 属性和设备状态有关,属性值也是字符串,属性值是设备的状态信息。
这两个属性的值都是无符号32位整形,#address-cells 和#size-cells 这两个属性可以用在任何拥有子节点的设备中,用于描述子节点的地址信息。
#address-cells 和#size-cells 表明了子节点应该如何编写reg 属性值,一般reg 属性都是和地址有关的内容,和地址信息相关的信息有两种:起始地址和地址长度,reg 属性的格式为:
reg = <add1 len1 add2 len2 add3 len3...... >
每个“add len” 组合表示一个地址范围,其中 add 是起始地址,len 是地址长度。#address-cells 表明add 这个数据所占用的字长,#size-cells 表明len 这个数据所占用的字长。
alphaled {
#address-cells = <1>;
#size-cells = <1>;
compatible = "atkalpha-led";
status = "okay";
reg = < 0X020C406C 0X04 /* CCM_CCGR1_BAE */
0X020E0068 0X04 /* SW_MUX_GPIO1_IO03_BASE */
0X020E02F4 0X04 /* SW_PAD_GPIO1_IO03_BASE */
0X0209C000 0X04 /* GPIO1_DR_BASE */
0X0209C004 0X04>; /* GPIO1_GDIR_BASE */
};
reg 属性的值一般是(address,length)对,一般用于描述设备地址空间资源信息,一般都是某个外设寄存器地址范围信息。详情参照上面alphaled 节点信息。
ranges 属性值可以为空或者按照( child-bus-address , parent-bus-address ,length ) 格式编写的数字矩阵,ranges 是一个地址映射/转换表,ranges 属性每个项目由子地址、父地址和地址空间长度三部分组成:
子总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
父总线地址空间的物理地址,由父节点的#address-cells 确定此物理地址所占用的字长。
子地址空间的长度,由父节点的#size-cells 确定此地址长度所占用的字长。
如果ranges 属性值为空值,说明子地址空间和父地址空间完全相同,不需要进行地址转换,对于我们所使用的的I.MX6ULL 来说,子地址空间和父地址空间完全相同,因此会在imx6ull.dtsi 中找到大量的值为ranges 属性。
reserved-memory {
#address-cells = <1>;
#size-cells = <1>;
ranges;
linux,cma {
compatible = "shared-dma-pool";
reusable;
size = <0x14000000>;
linux,cma-default;
};
};
第5行,节点soc 定义的ranges 属性,值为<0x0 0xe0000000 0x00100000>, 此属性值指定了一个1024KB (0x00100000) 的地址范围,子空间的物理起始地址为0x0,父地址空间的物理起始地址为0xe000000 。
第10行,serial 是串口设备节点,reg 属性定义了serial 设备寄存器的起始地址为0x4600,寄存器长度为0x100。经过地址转换,serial 设备可以从0xe0004600(0x4600 + 0xe0000000) 开始进行读写操作。
name 属性值为字符串,name属性用于记录节点名字,name属性已经被弃用,不推荐使用name 属性,一些老的设备树文件会使用此属性。
device_type 属性值为字符串,IEEE1275 会用到此属性,用于描述设备的FCode,但是设备树没有FCode,所以此属性也被抛弃了。此属性只能用于cpu 节点或者memory 节点。
cpu0: cpu@0 {
compatible = "arm,cortex-a7";
**device_type** = "cpu";
reg = <0>;
clock-latency = <61036>; /* two CLK32 periods */
......
}