compatible属性
节点下的compatible属性
compatible
属性也叫做”兼容性”属性,这是非常重要的一个属性。compatible
属性的值是一个字符串列表,compatible
属性用于将设备和驱动绑定起来。字符串列表用于选择设备所要使用的驱动程序,compatible
属性的值格式如下所示:
"manufacturer,model"
其中 manufacturer 表示厂商,model 一般是模块对应的驱动名字。
例如:
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
内核里面查找,看看能不能找到与之匹配的驱动文件,如果没有找到的话就使用第二个兼容值查。
根文件下的compatible属性
每个节点都有compatible
属性,根节点/
也不例外。例如:
/ {
model = "Freescale i.MX6 ULL 14x14 EVK Board";
compatible = "fsl,imx6ull-14x14-evk", "fsl,imx6ull";
}
可以看出,compatible
有两个值:fsl,imx6ull-14x14-evk
和fsl,imx6ull
。前面我们说了,设备节点的compatible
属性值是为了匹配 Linux内核中的驱动程序,那么根节点中的compatible
属性是为了做什么工作的? 通过根节点的compatible
属性可以知道我们所使用的设备,一般第一个值描述了所使用的硬件设备名字,比如这里使用的是imx6ull-14x14-evk
这个设备,第二个值描述了设备所使用的 SOC,比如这里使用的是imx6ull
这颗 SOC。Linux 内核会通过根节点的compoatible
属性查看是否支持此设备,如果支持的话设备就会启动Linux内核。
model属性
属性值: model属性值
也是一个字符串,一般model属性
描述设备模块信息,比如名字什么的,比如:
model = "wm8960-audio";
phandle属性
值的类型: <u32>
phandle
属性为节点指定了一个在设备树中独一无二的数字标识符。
pic@10000000 {
phandle = <1>;
interrupt-controller;
};
another-device-node {
interrupt-parent = <1>;
};
使用phandle
属性值定义设备pic@10000000
,这样在其他设备中就可以直接使用<1>
直接引用设备pic@10000000
。
status属性
值类型: <string>
描述了设备当前的状态,可以取以下是可选的值:
okay
: 指明该设备是可操作的disable
: 指明该设备当前是不可操作的,但是之后可以被操作reserved
: 指明该设备是可操作的,但是不应该被使用。通常用在被其他驱动软件控制的设备fail
: 指明该设备是不可操作的,设备被检测到有严重问题,不修复的话没法使用fail-sss
: 与fail属性类似,sss
指明了错误的情况#address-cells和#size-cells属性
值类型:
<u32>
这两个属性可以用在device tree层次结构中具有子级的任何设备节点中,用来描述应如何寻址子级设备节点。#address-cells
属性用来在子节点的reg
属性中编码地址区域。#size-cells
属性用来在子节点的reg
属性中编码大小区域。
#address-cells
和#size-cells
表明了子节点应该如何编写reg
属性值,一般reg
属性都是和地址有关的内容,和地址相关的信息有两种:起始地址和地址长度,reg
属性的格式一为:
reg = <address1 length1 address2 length2 address3 length3……>
每个address length
组合表示一个地址范围,其中address
是起始地址,length
是地址长度,#address-cells
表明address
这个数据所占用的字长,#size-cells
表明length
这个数据所占用的字长。并且这两个属性并不会从父级设备中继承,每个设备都需要指定该值。如果没有指定的话,#address-cells
的默认值是2,#size-cells
的默认值是1。
例如:
spi4 {
compatible = "spi-gpio";
#address-cells = <1>;
#size-cells = <0>;
gpio_spi: gpio_spi@0 {
compatible = "fairchild,74hc595"; 8 reg = <0>;
};
};
aips3: aips-bus@02200000 {
compatible = "fsl,aips-bus", "simple-bus";
#address-cells = <1>;
#size-cells = <2>;
dcp: dcp@02280000 {
compatible = "fsl,imx6sl-dcp";
reg = <0x02280000 0x4000 0x3000>;
};
};
reg属性
属性类型:<prop-encoded-array>
编码方式是任意数量的地址、长度对。
该属性描述了被父级总线定义的设备资源的地址,通常来该属性表示了设备资源在总线上的偏移量和大小,但是在一些特定的总线类型上可能有所不同。
假设一个soc上的设备具有两块寄存器组,一个在soc地址偏移0x3000的32字节的块和一个偏移0xFE00的256字节的块。reg的编码如下(前提是#address-cells
和#size-cells
都为1):
reg = <0x3000 0x20 0xFE00 0x100>
virtual-reg属性
值的类型:<u32>
virtual-reg
属性指定一个有效地址,该地址映射到设备节点的reg
属性中指定的第一个物理地址,该属性使能启动程序在初始化的过程中为用户程序提供虚拟地址到物理地址的映射。
ranges属性
值的类型:空值
或者prop-encoded-array
描述:该属性是提供了一种。ranges
值的格式是任意数量的三元组(child-bus-address,parent-bus-address,length)。
child-bus-address
是子总线地址空间的物理地址(真实的映射需要加上子设备相对于父设备的地址偏移)parent-bus-address
是父总线地址空间的物理地址length
是指定了range
中子地址空间的大小soc {
compatible = "simple-bus";
#address-cells = <1>;
#size-cells = <1>;
ranges = <0x0 0xe0000000 0x00100000>;
serial@4600 {
device_type = "serial";
compatible = "ns16550";
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <0xA 0x8>;
interrupt-parent = <&pic>;
};
};
ranges
属性指定了1024KB大小的地址空间,把子总线soc的物理地址0x0处的内存映射到父总线的物理地址0xe0000000的内存。在这种映射关系中,serial设备的起始地址实际上被映射到总线物理地址为0xe0004600的地址空间。dma-ranges属性
值的类型:空值
或prop-encoded-array
该属性的使用与ranges
属性类似,该属性是用来描述DMA结构的内存映射关系。name属性(过时的)
属性值:name
属性用于记录节点名字,name
属性已经被弃用,不推荐使用name
属性,一些老的设备树文件可能会使用此属性。device_type属性(过时的)
device_type
属性值为字符串,IEEE 1275
会用到此属性,用于描述设备的FCode
,但是设备树没有FCode
,所以此属性也被抛弃了。此属性只能用于cpu
节点或者memory
节点。