Linux设备树语法详解( 二 )


compatible设备节点中对应的节点信息已经被内核构造成struct platform_device 。驱动可以通过相应的函数从中提取信息 。compatible属性是用来查找节点的方法之一 , 另外还可以通过节点名或节点路径查找指定节点 。dm9000驱动中就是使用下面这个函数通过设备节点中的"compatible"属性提取相应的信息 , 所以二者的字符串需要严格匹配 。

Linux设备树语法详解

文章插图
 

Linux设备树语法详解

文章插图
 
address(几乎)所有的设备都需要与CPU的IO口相连 , 所以其IO端口信息就需要在设备节点节点中说明 。常用的属性有
  • #address-cells , 用来描述子节点"reg"属性的地址表中用来描述首地址的cell的数量 , 
  • #size-cells , 用来描述子节点"reg"属性的地址表中用来描述地址长度的cell的数量
有了这两个属性 , 子节点中的"reg"就可以描述一块连续的地址区域 。下例中 , 父节点中指定了"#address-cells = <2>" "#size-cells = <1>" , 则子节点dev-bootscs0中的reg中的前两个数表示一个地址 , 最后的0x4表示地址跨度是0x4
Linux设备树语法详解

文章插图
 
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] 。
Linux设备树语法详解

文章插图
 

Linux设备树语法详解

文章插图
 
gpiogpio也是最常见的IO口 , 常用的属性有
  • "gpio-controller" , 用来说明该节点描述的是一个gpio控制器
  • "#gpio-cells" , 用来描述gpio使用节点的属性一个cell的内容 , 即 属性 = <&引用GPIO节点别名 GPIO标号 工作模式>

Linux设备树语法详解

文章插图
 
驱动自定义key针对具体的设备 , 有部分属性很难做到通用 , 需要驱动自己定义好 , 通过内核的属性提取解析函数进行值的获取 , 比如dm9000节点中的下面这句就是自定义的节点属性 , 用以表示配置EEPROM不可用 。
Linux设备树语法详解

文章插图
 
VALUEdts描述一个键的值有多种方式 , 当然 , 一个键也可以没有值
字符串信息
Linux设备树语法详解

文章插图
 
32bit无符号整型数组信息
Linux设备树语法详解

文章插图
 
二进制数数组
Linux设备树语法详解

文章插图
 
字符串哈希表


推荐阅读