参考文献:http://www.cnblogs.com/xiaojiang1025/p/6131381.html

目的:实现驱动代码与设备信息相分离

框架:

1.           基本框架:

             /{                                  //根节点

                   node1{                          //node1是节点名,是/的子节点

                                       key=value;                  //node1的属性

                                        ...

                                      node2{                      //node2是node1的子节点

                                                            key=value;              //node2的属性

                                                            ...

                                       }

                               }                               //node1的描述到此为止

                 node3{

                                       key=value;

                                       ...

                              }

}

/表示板子,子节点node1表示SoC上的某个控制器,控制器中的子节点node2表示挂接在这个控制器上的设备们

 

设备的内容:

例子

linux 设备树解析

1.节点名:① 不超过31个字符的ASCII字符串

                   ② 形式:  <name>[@<unit_address>]  name为设备名 unit_address为设备地址,用来唯一标识一个节点。

                   ③ 节点信息 会被 内核构造成 struct platform_device

   例如: [email protected]

   注: Linux设备树还包括几个特殊的节点,比如chosen,其不描述一个真实设备,而是用于firmware传递一些数据给OS,比如bootloader传递内核启动参数给内核

linux 设备树解析

2.引用:

                     ① 节点引用另一个节点:

  linux 设备树解析

                         demo节点引用node节点

                   ② 直接引用节点,向其中填加属性信息

   linux 设备树解析

                         向cpu0节点填加属性

3. 属性

    1>compatible 查找节点

                  ①“<manufacturer>,<model>” 格式”<供应商>,<型号>”

                  ②该信息必须与对应的驱动部分相匹配, 如下数组最后一个成员一定是空,因为相关的操作API会读取这个数组直到遇到一个空

 linux 设备树解析   

   2>address IO端口信息需要在设备节点中说明

                   #address-cells  描述子节点”reg”属性的地址表中用来描述 首地址 的cell数量

                   #size-cells     描述子节点”reg”属性的地址表中用来描述 地址长度 的cell数量

  3>interrupts 中断号需要在设备节点中说明

                  interrupt-controller  空属性用来声明这个node接收中断信号(中断控制器)

                  #interrupt-cells 中断控制器节点的属性,用来描述子节点中”interrupts”属性使用了父节点中的interrupts属性的具体哪个值①父节点该属性值为3,则子节点interrupts一个cell的三个32bits整数值分别为<中断域  中断  触发方式> ② 父节点属性为2  则子节点<中断 触发方式>

                 interrupt-parent标识此设备节点属于哪一个中断控制器

                interrupts 中断标识符列表,表示每一个中断输出信号

例如:

linux 设备树解析

linux 设备树解析

                   ethernet的interrupt-parent为gpx0,gpx0的#interrupt-cells为2,所以ethoernet中的interrupts为<6   4>

   4> gpio 常见IO口

                   gpio-controller  说明该节点描述的是一个gpio控制器

                   #gpio-cells 描述gpio使用节点的属性一个cell的内容 <&引用GPIO节点别名  GPIO标号工作模式>

   5> 编址

                 可编址的设备使用下列属性将地址信息编码进设备树

                 reg = <address1  length1 [address2  length2] [address3  length3]...>

4. VALUE

     一个键的值有多种方式

                1> 字符串信息 

                linux 设备树解析

                2> 32bit无符号整型数组信息 

                linux 设备树解析

                3> 二进制数组

                linux 设备树解析

               4> 字符串哈希表

                linux 设备树解析 



相关文章: