设备树之标准属性

DTSpec描述了一个设备结点的标准属性集合。

1、compatible属性:

a、属性名:compatible
b、值的类型:
c、描述:compatible属性的值由一个或多个字符串组成,这些字符串定义设备的特定编程模型。linux内核使用此字符串列表来选择匹配特定的设备驱动程序。属性值由一系列字符串组成,从最具体到最常见。它们允许设备表达其与一系列类似设备的兼容性,可能允许单个设备驱动程序匹配多个设备。
d、实例:

compatible = "fsl,mpc8641", "ns16550";

kernel将首先尝试查找支持fsl,mpc8641属性的设备驱动程序。如果找不到具体驱动程序,它将尝试找到支持更通用的ns16550属性设备类型的驱动程序。

2、model属性:

a、属性名:model
b、值的类型:
c、描述:model属性值是一个描述制造商设备型号的字符串。推荐的格式是"manufacturer,model"。
d、实例:

model = "fsl,MPC8349EMITX"

3、phandle属性:

a、属性名:phandle
b、值的类型:
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属性。

4、status属性:

a、属性名:status
b、值的类型:
c、描述:status属性表示一个设备的操作状态。有效值如下表:

描述
“okay” 设备是可操作状态
“disabled” 表明当前不可操作,但未来可能变成可操作的(例如:一些没插入或未关闭)。特定设备的disabled 情参考设备绑定
“reserved” 表明设备可操作但不应该使用。典型的是设备的使用是通过其他软件组件控制的,如平台固件
“fail” 表明设备不可操作。探测到设备出错并不可能修复变成可操作状态
“fail-sss” 同上,并sss表明错误条件被检测到

5、#address-cells 和 #size-cells属性:

a、属性名:#address-cells#size-cells
b、值的类型:
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表示大小。

6、reg属性:

a、属性名:reg
b、值的类型: 把 (address, length) '键值对'编码/组成数组
c、描述:
reg属性描述的是挂载在总线上的设备资源地址。通常表示IO寄存器块内存映射的偏移地址和长度,但在一些总线类型上可能有不同的含义。root结点在地址空间中定义的地址是CPU实地址。它的值是,由地址和长度的键值对组成,其格式为:。其中addresslength是由总线指定的以<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>

7、virtual-reg属性:

a、属性名:virtual-reg
b、值的类型:
c、描述:
virtual-reg描述的是映射到设备节点reg属性中的第一个物理地址的有效地址。这个属性使能了 boot 程序对 client 程序虚拟地址到物理地址的映射的建立。

8、range属性:

a、属性名:range
b、值的类型: 编码成(子总线地址、父总线地址、长度)形式的三元组
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 映射来寻址。

9、dma-ranges属性:

a、属性名:dam-ranges
b、值的类型: 编码成(child-bus-address,parent-bus-address,length)形式的三元组
c、描述:
dam-ranges属性通常是描述一个内存总线映射的DMA结构,设备书的上级能被来自总线的DMA操作访问。它提供了在总线和其父(节点)之间的物理地址转换。这个属性值的格式是一个任意数字的三元组(child-bus-address,parent-bus-address,length)。每个三元组描述了一个相邻的DMA地址范围。三元组的元素与属性ranges的功能类似。

你可能感兴趣的:(设备树学习,linux,嵌入式硬件)