【版权申明】未经博主同意,谢绝转载!(请尊重原创,博主保留追究权)
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. 设备树 与 设备驱动总线平台 的关系
写得很不错的文章: