Linux设备树的引入

【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权) 

Linux设备树的引入

   在过去的Linux中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的板级细节代码(如platform设备、resource、i2c_board_info、spi_board_info以及各种硬件的platform_data),而这些板级细节对于内核来讲,不过是垃圾! 为了改变这种局面,Linux社区的大牛们参考了PowerPC等体系架构中使用的Flattened Device Tree(FDT),也采用了Device Tree结构,许多硬件的细节可以直接透过它传递给Linux,而不再需要在kernel中进行大量的冗余编码。

1. 设备树的基础概念

   Device Tree是一种描述硬件的数据结构,设备树源(Device Tree Source)文件(以.dts结尾)就是用来描述目标板硬件信息的。

   Device Tree由一系列的结点(node)和属性(property)组成,而结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。

2. 设备树的基本类型

所有的设备树文件都在Linux源代码下的arch/arm/boot/dts, 选择和自己板子匹配的设备树文件进行试验.

/dts-v1/;
#include "xxxxx.dtsi"	/* 含义与C一样 */

/ {	/* '/'设备树的根节点 */
	model = "xxxxx DEMO Board";
	compatible = "xxxxx,yyyyyy";	
	
	memory {	/* 子节点: memory */
		device_type = "memory";
		reg = <0x82000000 0x20000000>;
	};

	led {	/* 子节点: led */
		compatible = "ybk_led";
		reg = <0x120D6100 1>;
	};
};

可见, 设备树是一个简单的节点和属性树,属性是键值对,节点可以包含属性和子节点。
   其中led是我加进去的子结点, 节点中的compatible是驱动程序用于匹配时用到的值, 而reg就是相关的寄存器资源.

3. 将上面的设备树编进kernel后的效果

# 可见, 我们找到了我们在设备树文件定义的led
/sys/firmware/devicetree/base # ls
	led
	....................................

/sys/firmware/devicetree/base/led # ls
compatible  name        reg
/sys/firmware/devicetree/base/led # cat compatible
ybk_led
/sys/firmware/devicetree/base/led # cat name
led
/sys/firmware/devicetree/base/led # cat reg 
a
/sys/firmware/devicetree/base/led # hexdump -C reg 
00000000  12 0d 61 00 00 00 00 01                           |..a.....|
00000008

此时可见我们的设备信息已经加载到了kernel中了, 后面我们编写驱动将设备信息用起来即可!

4. 设备树 与 设备驱动总线平台 的关系

在这里插入图片描述

写得很不错的文章:

Linux 设备树(DTS)的深入理解

Exynos4412 内核移植(六)—— 设备树解析

Linux 设备驱动开发 —— 设备树在platform设备驱动中的使用

发布了68 篇原创文章 · 获赞 22 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/MACMACip/article/details/105289260