一、基础介绍

     Linux在3.x版本之后引入了dts,使许多硬件的细节信息可以直接透过dts传递给Linux,而不再需要在Kernel中进行大量的冗余编码。

     设备树可以描述的信息包括CPU的数量和类别,内存基地址和大小,总线和桥,外设连接,中断控制器和中断使用情况等。


(1)常见名词解释:

     DTS:device tree source  一个.dts文件相对于一个ARM的machine

 一些通用设备的描述,通常一个.dts文件包含多个.dtsi文件

     DTC:device tree compiler 设备树编译器

     DTB:device tree blob (.blob是.dts通过dtc编译生成的文件)


(2)dts文件目录:

     MTK:kernel-*.*\arch\arm(64)\boot\dts\mediatek\

     QCOM:kernel\msm-*.*\arch\arm(64)\boot\dts\qcom\


(3)dts编译命令:

     MTK:make odmdtboimage  最终会生成 out\target\product\$(TARGET_PRODUCT)\odmdtbo.img文件,所以修改dts后只需要更新这个文件即可。

     QCOM:make dtboimage     最终会生成 out\target\product\$(TARGET_PRODUCT)\dtbo.img文件。



二、组成结构

     设备树的结构由一系列被命名的节点(node)和属性(property)组成,支持C/C++方式的注释。

(1)组成结构如下:

     一个根节点“ \ ”

     根节点下面有若干个子节点,例如:node1,node2....

     node1下又含有一系列子节点,例如:child-node1,child-node2....

     每个节点都会有一系列属性,例如:compatible, reg, pintrl-names...


(2)常见符号的含义:

      / -----------根节点

     @------------如果设备有地址,则由此符号指定。按照惯例,如果一个节点有reg 属性,那么该节点的名字就必须包含设备地址,这个设备地址需要和reg 属性中的地址一样。

     & -----------引用节点

     :------------冒号前的标签是我们为了方便引用给节点起的别名,例如引用label时用&label

     , -----------属性名称中可以包含逗号。如compatible属性的名字,一般来说组成方式为"[厂商], [模型]"

     #------------并不表示注释。如 #address-cells ,#size-cells用来决定reg属性的格式。

                        #address-cells = <0x1>; //代表该节点下的子节点使用1个u32来代表address。

                        #size-cells = <0x0>; //代表该节点下的子节点使用0个u32来代表size。

        ---------空属性并不一定表示没有赋值。如non-removable 一个空属性来判断是非需要打开sd卡的热插拔功能

     “”----------引号中的为字符串,字符串数组:”strint1”,”string2”,”string3”

     < > ---------尖括号中的为32位整形数字,整形数组<12 3 4>

     [ ] ---------方括号中的为32位十六进制数,十六机制数据[0x11 0x12 0x13]其中0x可省略