DTSpec描述了一个设备结点的标准属性集合。
a、属性名:compatible
b、值的类型:<stringlist>
c、描述:compatible
属性的值由一个或多个字符串组成,这些字符串定义设备的特定编程模型。linux内核使用此字符串列表来选择匹配特定的设备驱动程序。属性值由一系列字符串组成,从最具体到最常见。它们允许设备表达其与一系列类似设备的兼容性,可能允许单个设备驱动程序匹配多个设备。
d、实例:
compatible = "fsl,mpc8641", "ns16550";
kernel将首先尝试查找支持fsl,mpc8641
属性的设备驱动程序。如果找不到具体驱动程序,它将尝试找到支持更通用的ns16550
属性设备类型的驱动程序。
a、属性名:model
b、值的类型:<string>
c、描述:model
属性值是一个描述制造商设备型号的字符串。推荐的格式是"manufacturer,model"。
d、实例:
model = "fsl,MPC8349EMITX"
a、属性名:phandle
b、值的类型:<u32>
c、描述:phandle
属性是结点在设备树中的唯一标识(id)。通常它的值被其他结点使用,来表示对它的引用。
d、实例:
pic@10000000 {
phandle = <1>;
interrupt-controller;
};
phandle的值是1。另外一个设备结点能够用phandle的值引用pic结点。
another-device-node {
interrupt-parent = <1>;
};
注意: 大多在DTS中的devicetrees不包含显式的phandle属性。DTC工具会在DTS编译为DTB时候自动插入phandle属性。
a、属性名:status
b、值的类型:<string>
c、描述:status
属性表示一个设备的操作状态。有效值如下表:
值 | 描述 |
---|---|
“okay” | 设备是可操作状态 |
“disabled” | 表明当前不可操作,但未来可能变成可操作的(例如:一些没插入或未关闭)。特定设备的disabled 情参考设备绑定 |
“reserved” | 表明设备可操作但不应该使用。典型的是设备的使用是通过其他软件组件控制的,如平台固件 |
“fail” | 表明设备不可操作。探测到设备出错并不可能修复变成可操作状态 |
“fail-sss” | 同上,并sss表明错误条件被检测到 |
a、属性名:#address-cells
和 #size-cells
b、值的类型:<u32>
c、描述:
#address-cells
和 #size-cells
属性可用于在设备树层次结构中具有子设备的任何设备节点,并描述子设备节点应如何寻址。
#address-cells
属性定义了用于对子节点的 reg
属性中的地址字段进行编码的 < u32 >
单元格的数量。
#size-cells
属性定义了用于对子节点的reg
属性中的大小字段进行编码的 < u32 >
单元格的数量。
#address-cells
,#size-cells
属性不能从祖先结点继承,他们应该显示定义。
一个DTSpec-compliant boot程序应该在所有孩子的结点提供#address-cells
和#size-cells
。
如果不设定,kernel则设置 #address-cells
的默认值为2
,#size-cells
的值为1
。
d、实例:
soc {
#address-cells = <1>;
#size-cells = <1>;
serial@4600 {
compatible = "ns16550";
reg = <0x4600 0x100>;
clock-frequency = <0>;
interrupts = <0xA 0x8>;
interrupt-parent = <&ipic>;
};
};
例子中soc结点中#address-cells
,#size-cells
都设置为1
。这代表要求用一个<32>
单元表明地址和大小。其中在soc结点中的serial设备的reg
属性必须遵守这个规定------->用一个单元0x4600
表示地址和用一个单元0x100
表示大小。
a、属性名:reg
b、值的类型:<prop-encoded-array> 把 (address, length) '键值对'编码/组成数组
c、描述:
reg
属性描述的是挂载在总线上的设备资源地址。通常表示IO寄存器块内存映射的偏移地址和长度,但在一些总线类型上可能有不同的含义。root
结点在地址空间中定义的地址是CPU实地址。它的值是<prop-encoded-array>
,由地址和长度的键值对
组成,其格式为:<address, length>
。其中address
和length
是由总线指定的以<32u>
类型为单元/位的数据,并且是由该设备结点的父结点中 #address-size
#size-cells
属性来描述。如果父结点中#size-cells
的值是0
,那么reg
属性中的length
域应该被省略。
d、实例:
假设一个设备在片上系统上有两个寄存器块,它们在SOC上的偏移地址和大小分别为(0x3000, 0x20)
, (0xFE00 0x100)
。这reg属性将被编码成如下形式假设#address-size #size-cells的值都是1
:
reg = <0x3000 0x20 0xFE00 0x100>
a、属性名:virtual-reg
b、值的类型:<u32>
c、描述:
virtual-reg
描述的是映射到设备节点reg
属性中的第一个物理地址的有效地址。这个属性使能了 boot 程序对 client 程序虚拟地址到物理地址的映射的建立。
a、属性名:range
b、值的类型:<empty> 或 <prop-encoded-array> 编码成(子总线地址、父总线地址、长度)形式的三元组
c、描述:
ranges
属性提供了一种定义总线地址空间(子地址空间)和总线节点的父节点地址空间(父地址空间)之间的映射或转换的方法。range
属性值的格式是任意数量的 (child-bus-address, parentbus-address, length)
range
属性的节点)的 #address-cells
确定。#address-cells
属性确定。ranges
属性的节点)的 #size-cells
确定。如果属性定义为 < empty>
值,则它指定父子地址空间相同,不需要地址转换。如果该属性不存在于总线节点中,则假定节点的子节点与父地址空间之间不存在映射。
d、实例:
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 = <&ipic>;
};
};
soc 节点指定了一个 range
属性
<0x0 0xe0000000 0x00100000>;
此属性值指定对于 1024KB
范围的地址空间,在物理 0x0
处寻址的子节点映射到物理 0xe0000000
的父地址。通过此映射,串行设备节点可以通过地址0xe0004600
处的加载或存储、0x4600
(在 reg 中指定)的偏移量加上范围中指定的 0xe0000000
映射来寻址。
a、属性名:dam-ranges
b、值的类型:<empty> 或 <prop-encoded-array> 编码成(child-bus-address,parent-bus-address,length)形式的三元组
c、描述:
dam-ranges属性通常是描述一个内存总线映射的DMA结构,设备书的上级能被来自总线的DMA操作访问。它提供了在总线和其父(节点)之间的物理地址转换。这个属性值的格式是一个任意数字的三元组(child-bus-address,parent-bus-address,length)。每个三元组描述了一个相邻的DMA地址范围。三元组的元素与属性ranges的功能类似。