本章节主要是讲解设备树的基本概念
=========================================================
什么是设备树:
全名为Open Firmware Device Tree开发固件设备树
1,Device Tree可以描述的信息包括CPU的数量和类别、内存基地址和大小、总线和桥、
外设连接、中断控制器和中断使用情况、GPIO控制器和GPIO使用情况、Clock控制器和Clock使用情况。
2,设备树信息被保存在一个ASCII文本文件中,适合人类的阅读习惯,类似于xml文件,
在ARMLinux中,一个.dts文件对应一个ARM的machine放置在内核的
arch/arm/boot/dts/目录
3,设备树是一种数据结构,用于描述设备信息的语言,具体而言,是用于操作系统
中描述硬件,使得不需要对设备的信息进行硬编码(hard code)
4, Device Tree由一系列被命名的结点(node)和属性(property)组成,而结点本身
可包含子结点。所谓属性,其实就是成对出现的name和value
5, 设备树源文件dts被编译成dtb二进制文件,在bootloader运行时传递给操作系统,
操作系统对其进行解析展开(Flattened),从而产生一个硬件设备的拓扑图有了这个拓
扑图,在编程的过程中可以直接通过系统提供的接口获取到设备树中的节点和属性
信息
=========================================================
缩写名字解释
DT: Device Tree
FDT: Flattened DeviceTree
OF: Open Firmware
DTS:device tree source
DTSI : device tree source include
DTB: device tree blob
DTC (device tree compiler)
=========================================================
设备树的语法构成
节点
属性
根节点
compatible属性
reg属性
#address-cells和#address-siz属性
中断信息属性--interrupts和interrupts
=========================================================
最简单的一个设备树内容:
/ {
node1 {
a-string-property = "A string";
a-string-list-property = "first string", "second string";
a-byte-data-property = [0x01 0x23 0x34 0x56];
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello, world";
};
child-node2 {
};
};
node2 {
an-empty-property;
a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */
child-node1 {
};
};
};
==================================================================
node节点解释
节点名称:每个节点必须有一个“<名称>[@<设备地址>]”形式的名字
<名称>就是一个不超过31位的简单 ascii字符串,节点的命名应该根据它所体现的是什么样的设备。比如一个 3com以太网适配器的节点就应该命名为ethernet,而不应该是 3com509。
<设备地址>用来访问该设备的主地址,并且该地址也在节点的 reg 属性中列出,同级节点命名必须是唯一的,但只要地址不同,多个节点也可以使用一样的通用名称,当然设备地址也是可选的,可以有也可以没有
树中每个表示一个设备的节点都需要一个 compatible属性
如:
uart1: serial@48022000{
compatible = "ti,omap3-uart";
}
==================================================================
属性property:
简单的键-值对,它的值可以为空或者包含一个任意字节流。虽然数据类型并没有编码进数据
结构,但在设备树源文件中任有几个基本的数据表示形式 :
文本字符串(无结束符)可以用双引号表示:
string-property = "a string"
Cells是 32位无符号整数,用尖括号限定:
cell-property = <0xbeef 123 0xabcd1234>
二进制数据用方括号限定:
binary-property = [01 23 45 67];
不同表示形式的数据可以使用逗号连在一起:
mixed-property = "a string", [01 23 45 67], <0x12345678>;
逗号也可用于创建字符串列表:
string-list = "red fish", "blue fish";
常见属性:
compatible属性
指定了系统的名称,是一个字符串的列表,实际在代码中可以用于进行匹配,当前你选择的是哪个机器,它包含了一个“<制造商>,<型号>”形式的字符串。重要的是要指定一个确切的设备,并且包括制造商的名子,以避免命名空间冲突,
不要使用带通配符的 compatible值,比如“fsl,mpc83xx-uart”或类似情况
例如:
/ {
compatible = "acme,coyotes-revenge";
};