设备节点中对应的节点信息已经被内核构造成struct platform_device。驱动可以通过相应的函数从中提取信息。compatible属性是用来查找节点的方法之一,另外还可以通过节点名或节点路径查找指定节点。dm9000驱动中就是使用下面这个函数通过设备节点中的"compatible"属性提取相应的信息,所以二者的字符串需要严格匹配。
address
(几乎)所有的设备都需要与CPU的IO口相连,所以其IO端口信息就需要在设备节点节点中说明。常用的属性有
#address-cells,用来描述子节点"reg"属性的地址表中用来描述首地址的cell的数量,
#size-cells,用来描述子节点"reg"属性的地址表中用来描述地址长度的cell的数量。
有了这两个属性,子节点中的"reg"就可以描述一块连续的地址区域。下例中,父节点中指定了"#address-cells = <2>" "#size-cells = <1>",则子节点dev-bootscs0中的reg中的前两个数表示一个地址,最后的0x4表示地址跨度是0x4
interrupts一个计算机系统中大量设备都是通过中断请求CPU服务的,所以设备节点中就需要在指定中断号。常用的属性有
interrupt-controller 一个空属性用来声明这个node接收中断信号
#interrupt-cells,是中断控制器节点的属性,用来标识这个控制器需要几个单位做中断描述符,用来描述子节点中"interrupts"属性使用了父节点中的interrupts属性的具体的哪个值。一般,如果父节点的该属性的值是3,则子节点的interrupts一个cell的三个32bits整数值分别为:<中断域 中断 触发方式>,如果父节点的该属性是2,则是<中断 触发方式>
interrupt-parent,标识此设备节点属于哪一个中断控制器,如果没有设置这个属性,会自动依附父节点的
interrupts,一个中断标识符列表,表示每一个中断输出信号
这里,在我板子上的dm9000的的设备节点中,"interrupt-parent"使用了exynos4x12-pinctrl.dtsi(被板级设备树的exynos4412.dtsi包含)中的gpx0节点的引用,而在gpx0节点中,指定了"#interrupt-cells = <2>;",所以在dm9000中的属性"interrupts = <6 4>;"表示指定gpx0中的属性"interrupts"中的"<0 22 0>",通过查阅exynos4412的手册知道,对应的中断号是EINT[6]。
gpiogpio也是最常见的IO口,常用的属性有
"gpio-controller",用来说明该节点描述的是一个gpio控制器
"#gpio-cells",用来描述gpio使用节点的属性一个cell的内容,即 属性 = <&引用GPIO节点别名 GPIO标号 工作模式>
驱动自定义key针对具体的设备,有部分属性很难做到通用,需要驱动自己定义好,通过内核的属性提取解析函数进行值的获取,比如dm9000节点中的下面这句就是自定义的节点属性,用以表示配置EEPROM不可用。
dts描述一个键的值有多种方式,当然,一个键也可以没有值
字符串信息 32bit无符号整型数组信息 二进制数数组 字符串哈希表 混合形式上述几种的混合形式
设备树/驱动移植