设备树
(Device Tree)
,将这个词分开就是“设备”和“树”,描述设备树的文件叫做
DTS(Device Tree Source),
这个
DTS
文件采用树形结构描述板级设备,也就是开发板上的设备信息,例如
CPU
数量、 内存基地址、
IIC
接口上接了哪些设备、
SPI
接口上接了哪些设备等等,如下图所示:
可以看出,
树的主干就是系统总线,
IIC
控制器、
GPIO
控制器、
SPI
控制器等都是接
到系统主线上的分支。
IIC
控制器有分为
IIC1
和
IIC2
两种,其中
IIC1
上接了
FT5206
和
AT24C02
这两个
IIC
设备,
IIC2
上只接了
MPU6050
这个设备。
DTS
文件的主要功能就是按照上图
所示的结构来描述板子上的设备信息,
DTS
文件描述设备信息是有相应的语法规则要求的,稍
后我们会详细的讲解
DTS
语法规则。
在
3.x
版本
(
具体哪个版本笔者也无从考证
)
以前的
Linux
内核中
ARM
架构并没有采用设备树。在没有设备树的时候
Linux
是如何描述
ARM
架构中的板级信息呢?在
Linux
内核源码中
大量的
arch/arm/mach-xxx
和
arch/arm/plat-xxx
文件夹,这些文件夹里面的文件就是对应平台下 的板级信息。例如,在/arch/arm/mach-s3c24xx/ mach-mini2440.c
中有如下内容(
有缩减
)
:
static struct s3c2410fb_display mini2440_lcd_cfg[] __initdata = {
[0] = { /* mini2440 + 3.5" TFT + touchscreen */
_LCD_DECLARE(
7, /* The 3.5 is quite fast */
240, 21, 38, 6, /* x timing */
320, 4, 4, 2, /* y timing */
60), /* refresh rate */
.lcdcon5 = (S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
...................................................
.lcdcon5 = (S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVDEN |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVCLK |
S3C2410_LCDCON5_HWSWP),
},
};
上面的代码描述 mini
2440
这个开发板上的
LCD
信
息的,
结构体指针数组 ?struct s3c2410fb_display
描述的 mini-2440
这个开发板上的所有平台相关信
息。这个仅仅是使用
2440
这个芯片的
mini-K2440
开发板下的
LCD
信息,
mini-2440
开发板
还有很多的其他外设硬件和平台硬件信息。使用
2440
这个芯片的板子有很多,每个板子都有描
述相应板级信息的文件,这仅仅只是一个
2440
。
这仅仅只是一个
2440
。随着智能手机的发展,每年新出的
ARM
架构芯片少说都在数十、数百款,
Linux
内核下板级信息文件将会成指数级增长!这些板级信息文件
都是
.c
或
.h
文件,都会被硬编码进
Linux
内核中,导致
Linux
内核“虚胖”。
同样的,当
Linux
之父
linus
看到
ARM
社区向
Linux
内核添加了大量“无用”、冗余的板级信息文件,不禁的发出了一句“
This whole ARM thing is a f*cking pain in the ass
”。从此以
后
ARM
社区就引入了
PowerPC
等架构已经采用的设备树
(Flattened Device Tree)
,将这些描述
板级硬件信息的内容都从
Linux
内中分离开来,用一个专属的文件格式来描述,这个专属的文
件就叫做设备树,文件扩展名为
.dts
。
三.? 总结
一个
SOC
可以作出很多不同的板子,这些不同的板子肯定是有共同的信息,将这些共同的信息提取出来作为一个通用的文件,其他的
.dts
文件直接引
用这个通用文件即可,这个通用文件是
.dtsi
文件,类似于
C
语言中的头文件。
一般
.dts文件
描述
板级信息
(
也就是开发板上有哪些
IIC
设备、
SPI
设备等
)
,
.dtsi 文件
描述
SOC
级信息
(
也就是
SOC
有
几个
CPU
、主频是多少、各个外设控制器信息等
)
。
设备树描述的是板级信息,例如,一个开发板上的
CPU
数量、 内存基地址、
IIC
接口上接了哪些设备、
SPI
接口上接了哪些设备等等,??
描述设备树的文件叫 DTS(device tree Source),以 .dts结尾的文件表示设备树源文件。