转自:http://www.pianshen.com/article/274236825/;jsessionid=D90FC6B215155680E0B89A6D060892D4
A devicetree is a data structure for describing hardware.
一个用于描述硬件的数据结构。
https://www.devicetree.org/
基本概念
Dtsi——类似于c语言的头文件
Dts——类似于c语言的源文件
Dtb——类似于c语言的编译产物、二进制文件
使用device tree,用户需要了解自己的硬件配置和系统运行参数,并把这些信息组织成device tree source file。DT是描述系统中的硬件信息,那些可以被动态探测到的硬件设备不需要描述。通过dtc(device tree compiler),可以将dts变成适合机器处理的dtb(device tree blob)。
Linux内核从3.x开始引入设备树的概念,用于实现驱动代码与设备信息相分离。在设备树出现以前,所有关于设备的具体信息都要写在驱动里,一旦外围设备变化,驱动代码就要重写。
设备树主要有三个作用:
1、识别平台单板 2、运行参数配置 3、设备构建
语法
1、设备树语法格式
DT的基本单元是node(节点),这些node被组织成树状结构。每个node包含了若干个property/value,描述node的一些特性。一个设备树只能有一个root node(根节点),其名字必须是‘/’。引用设备树某个节点,可以使用全路径,也可以使用句柄等方式。
一个Node被定义为如下形式:
[label:] node-name[@unit-address] {
[properties [= value] ]
[child nodes]
}
A.[]——表示可选项
B.label:——标签,方便dts文件的引用,通过符号‘&’进行引用
C.node-name——节点名字
D.@unit-addresss——如果node没有reg属性,不需要该选项;如果有就必须和reg第 一个地址相等(The unit-address must match the first address specified in the
reg property of the node——摘自Devicetree Specification Release v0.2,章节2.2.1 Node Names)。Unit-address具体格式和设备挂在哪个bus上相关。比如:对于cpu, 其unit-address就是从0开始编址;如果是串口控制器,其就是寄存器地址。
E.property——设备属性
非标准的属性名字应该以该公司或者组织名称开头,比如:fsl,channel-fifo-len=<?>; zrevmm,vdev = "proxy";
也定义了一些标准的属性:“compatible”,“model”,"device_type"都是用来表示 节点基本信息的,compatible = "virtio,mmio";
F.= value——属性的定义是多种多样的,可以是空值、整型或者字符串。
G.child nodes——和Node格式一样
2、常见属性实例
“compatible”属性是用来匹配驱动的,他的类型是字符串数组,每个字符串表示一种设备的类型,从具体到一般。举个例子就比较清楚了,比如某个串口控制器节点的属性”compatible = “fsl,mpc8641-uart”, “ns16550"“。第一个字符串“fsl,mpc8641-uart”前边部分是厂商(推测是frescale),后边部分是控制器具体型号,这个形式也是规范建议的标准写法。第二个字符串ns16550表示一类符合同一标准的串口控制器,比第一个字符串表示的范围更大。内核匹配驱动时首先看是否有匹配第一个字符串的驱动,如果没有的话再匹配第二个(如果有更多的,依次类推,所以优先匹配前边的)。
"model"属性用来表示设备的型号,用字符串表示,不像"compatible"用多个字符串,只需一个就够了。
"device_type"属性用来表示设备类型,用字符串表示。
@后地址和reg后第一个地址关系说明。它两数值必须得一致。
下面举一个实例节点分析:
对应的dts源码
/{
cpus{
cpu@0{
};
cpu@1{
};
};
memory@0{
};
uart@fe001000{
};
ethernet@fe002000{
};
ethernet@fe003000{
};
};