1、什么是设备树,设备树的引入
以
LED
驱动为例,如果你要更换
LED
所用的
GPIO
引脚,需要修改驱动程序源码、重新编译驱动、重新加载驱动,为了避免这种复杂的工序问题之一,我们可以通过设备树解决,这样可以避免每次都需要修改.c文件以及相关驱动文件进行重新的代码逻辑梳理之类的问题。
设备树
(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
语法规则。
从以前(无设备树)的ARM架构去分析:
在没有设备树的时候
Linux
是如何描述
ARM
架构中的板级信息呢?在
Linux
内核源码中 大量的 arch/arm/mach-xxx
和
arch/arm/plat-xxx
文件夹,这些文件夹里面的文件就是对应平台下的板级信息。比如在 arch/arm/mach-smdk2440.c
中有如下内容
(
有缩减
)
:
也就是在没有设备树的引入,我们还是利用相关的.c文件来描述设备信息以及资源
static struct s3c2410fb_display smdk2440_lcd_cfg __initdata = {
.lcdcon5 = S3C2410_LCDCON5_FRM565 |
S3C2410_LCDCON5_INVVLINE |
S3C2410_LCDCON5_INVVFRAME |
S3C2410_LCDCON5_PWREN |
S3C2410_LCDCON5_HWSWP,
......
};
static struct s3c2410fb_mach_info smdk2440_fb_info __initdata = {
.displays = &smdk2440_lcd_cfg,
.num_displays = 1,
.default_display = 0,
......
};
static struct platform_device *smdk2440_devices[] __initdata = {
&s3c_device_ohci,
&s3c_device_lcd,
&s3c_device_wdt,
&s3c_device_i2c0,
&s3c_device_iis,
};
上述代码中的结构体变量
smdk2440_fb_info
就是描述
SMDK2440
这个开发板上的
LCD
信
息的,结构体指针数组
smdk2440_devices
描述的
SMDK2440
这个开发板上的所有平台相关信
息。这个仅仅是使用
2440
这个芯片的
SMDK2440
开发板下的
LCD
信息。
从现有(有设备树)的ARM架构去分析:
综上,从此以 后 ARM 社区就引入了 PowerPC 等架构已经采用的设备树(Flattened Device Tree),将这些描述板级硬件信息的内容都从 Linux 内中分离开来,用一个专属的文件格式来描述,这个专属的文件就叫做设备树,文件扩展名为.dts。一个 SOC 可以作出很多不同的板子,这些不同的板子肯定是有共同的信息,将这些共同的信息提取出来作为一个通用的文件,其他的.dts 文件直接引用这个通用文件即可,这个通用文件就是.dtsi 文件,类似于 C 语言中的头文件。一般.dts 描述板级信息(也就是开发板上有哪些 IIC 设备、SPI 设备等),.dtsi 描述 SOC 级信息(也就是 SOC 有几个 CPU、主频是多少、各个外设控制器信息等)。
待更新。。。。。2024-06-21