设备树是一种描述硬件的数据结构。
设备树由一系列节点(Node)和属性(Property)组成,而节点本身可以包含子节点;属性,其实就是成对出现的名称和值。在设备树中,可描述的信息包括:
1)CPU的数量和类别
2)内存基地址和大小
3)总线和桥
4)外设连接
5)中断控制器和中断使用情况
6)GPIO控制器和GPIO使用情况
7)时钟控制器和时钟使用情况
Bootloader会将设备树传递给Linux内核,然后由内核解析设备树,据此展开出Linux内核中的platform_device、i2c_client、spi_device等设备,而这些设备用到的内存、中断等资源信息也被传递到内核,内核会将相应的资源绑定给展开的这些设备。
(一)dts文件
dts文件是一种适合人类阅读的ASCII文本格式文件。
通常情况下,把SOC公用的部分、多个设备共同的部分提炼为.dtsi文件,.dtsi文件被.dts文件包含,类似于C语言的头文件使用方式:
/dts-v1/;
#include "arm-som-p0.dtsi"
#include <dt-bindings/gpio/gpio.h>
dts文件中的基本元素就是上述的节点和属性,如以下设备树内容:
/ {
node1 {
a-string-property = "A string";
child-node1 {
first-child-property;
second-child-property = <1>;
a-string-property = "Hello World";
};
child-node2 {
};
};
node2 {
an-empty-property;
};
};
它表征了一个设备树文件的结构:
1)一个root节点 “/”
2)root节点下面包含了若干个子节点,上述示例中为node1和node2
3)节点node1和node2又可以包含若干个子节点,例如:child-node1和child-node2
4)每个节点都有一系列的属性,这些属性可能为空,例如an-empty-property;可能为字符串,例如a-string-property;还有可能为Cells(由uint32整数组成);还有可能为二进制数 ...
再看一个设备树文件,它描述的是一个双核ARM Cortex-A9 32位处理器、ARM本地总线上的内存映射区域分布着2个串口:串口1位于0x101F1000、串口2位于0x101F2000,中断控制器(位于0x10140000)