什么是设备树?

一. 简介

前面只是简单使用过设备树文件,接下来详细谈一谈设备树。掌握设备树是 Linux 驱动开发人员必 备的技能!

因为在新版本的 Linux 中,ARM 相关的驱动全部采用了设备树(也有支持老式驱动的,比较少),最新出的 CPU 其驱动开发也基本都是基于设备树的,比如 ST 新出的 STM32MP157NXP I.MX8 系列等。我们所使用的Linux版本为 4.1.15,其支持设备树,所以正点原子 I.MX6U-ALPHA 开发板的所有 Linux 驱动都是基于设备树的。

二.  什么是设备树?

设备树 (Device Tree) ,将这个词分开就是“设备”和“树”,描述设备树的文件叫做 DTS(Device Tree Source), 这个 DTS 文件采用树形结构描述板级设备,也就是开发板上的设备信息,例如
CPU 数量、 内存基地址、 IIC 接口上接了哪些设备、 SPI 接口上接了哪些设备等等,
如下图所示:

什么是设备树?_第1张图片

可以看出, 树的主干就是系统总线, 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结尾的文件表示设备树源文件。

你可能感兴趣的:(Linux驱动学习,linux,arm开发)