[笔记分享] [DT] device tree之属性

Platform: MSM8X39
OS: Android4.4

标准properties是规范里就有对它的定义,然后有对应的接口可以读取解析。当然
你也可以自己添加自定义的properties.


compatible

Property: compatible
Value type: <stringlist>
Des:

该属性被系统用来选择哪个driver来驱动device。 Value可以是字符串列表。
推荐的格式是: “manufacturer, model”, 前者用来描述厂商,后者用来描述model number(后面会讲到)。

例子:
[msm8939-camera.dtsi]
这里写图片描述

系统会找支持”qcom,csiphy-v3.1”的driver,如果没找到才找”qcom,csiphy”的driver.


model

Property: model
Value type: <string>
Des:

Model指明了设备属于哪一个厂商的哪一个model。

例子:
[msm8939-pinctrl.dtsi]

这里写图片描述

说明是Qualcomm公司,用的chipset是msm8939.


phandle

Property: phandle
Value type: <u32>
Des:

说白了,phandle其实就是类似于C++的句柄,在这里就是表示一个node。
如果另外一个node要引用此node,那么就使用期phandle, 它的value是u32.

为了方便表示,DT也提供了名字描述,解析时,系统会默认将名字转换成唯一的一个U32值。

例子1(整数表示):

这里写图片描述

Pic对应的phandle值是1, interrupt的parent就是<1>,也就是pic。

例子1(名字表示):
[msm8939-pinctrl.dtsi]

这里写图片描述

:左边的是可选项,只是一个lable,表示gp这个node,效果和用phandle=<number>一样。
Pmx-uartconsole引用了gp用&gp表示就可以了。


status

Property: status
Value type: <string>
Des:

表示当前device的操作状态,可定义的值如下,如果要可使用,必须定义成”okay”。

这里写图片描述


#address-cells/#size-cells

Property: #address-cells/#size-cells
Value type: <u32>
Des:

DT的node是可嵌套和继承的,因此需要定义它的子node应该如何寻址。
#address-cells用来定义reg property中的address 域,而#size-cells用来定义reg property中的size域。

Note:
1. 这两个值不会从它的祖先集成,所以需要明确定义。
2. 如果没有定义,默认情况下,#address-cells是2, #size-cells是1.

例子1:
这里写图片描述

#address-cells为1表明只有1个元素,address是0x4600.
#size-cells为为1表明只有1个元素。size是0x100.

例子2:
[msm8939-pm.dtsi]
这里写图片描述

#address-cells为1表明只有1个元素,#size-cells为0表示size没有。


reg

Property:reg
Value type: <prop-encoded-array>
Des:

Reg property主要是用来描述寄存器的资源,一般情况下都是值寄存器地址以及map的长度。有些情况下也有不同的意义,如表示cpu的时候,它的意思只是表明cpu的编号,而且也没有长度。
<prop-encoded-array> 表示<address length> 这样可以有多组。如:
< 0x100 0x10>,
< 0x200 0x20>;

例子:
这里写图片描述


ranges

Property:ranges
Value type: <empty> or <prop-encoded-array>
Des:

Root node的子节点以及使用的是CPU的地址域,所以他们不需要任何直接映射。如[email protected]就是直接分配的0x120000地址。

但是那些非root node的直接子节点的节点就没有使用CPU地址域,为了得到一个内存映射地址,DT必须制定从一个域到另一个域地址的转换方法,ranges的意义就在此。

Ranges提供了当前node和parent node之间的地址转换。
Ranges 格式:

(child-bus-address, parent-bus-address, length)

Child-bus-address的cells由当前node的#address-cells决定。
Parent-bus-address的cells由parent node的#address-cells决定。
length的cells由当前 node的#size-cells决定。

当ranges被定义为<empty>时,表明parent和child node的地址空间是一致的,不必要做转换。
如果没有定义ranges时,DT认为parent和child node之前没有映射关系。

例子:

这里写图片描述

Child node的物理地址0映射到Parent node的0xe000000, 长度是0x100000.
Serical的0x4600实际地址就是0xe0004600.


device_type

Property:device_type
Value type: <string>
Des:

它只用于描述cpu和memory nodes。

例子:
[msm8939-cpu.dtsi]

这里写图片描述