一、基础介绍
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可省略