linux DTS介绍
一. 设备树的由来
1.1. 什么是设备树
1.1.1. Device Tree 可以描述的信息包括CPU的数量和类别,内存基地址和大小,总线和桥,外设连接,中断控制器和中断使用情况,Clock控制器和Clock使用情况。
1.1.2. 设备树信息被保持在一个ASCII文本文件中,适合人类阅读习惯。类似于XML文件,在ARM linux中,一个.dts文件对应一个arm的machine放置在内核的arch/arm/boot/dts/ 目录中
1.1.3. 设备树是一种数据结构,用于描述设备信息的语言,具体而言,是用于操作系统中描述硬件,使得不需要对设备进行硬编码
1.1.4. Devices Tree是由一系列被命名的节点(node)和属性(property)组成, 而节点本身可包含子节点。所谓属性,其实就是成对出现的name和value
1.1.5. 设备树源文件dts被编译成dtb二进制,在bootloader运行时传递给操作系统,操作系统对其进行解析展开,从而产生一个硬件设备的拓扑图,有了这个拓扑图,在编成过程可以直接通过系统提供的接口获取到设备树的节点和属性信息
1.2. 为什么需要设备树
1.2.1 在linux 2.6中,arch/arm/plat-xxx和arch/arm/mach-xxx中充斥着大量的垃圾代码,相当于多数的代码只是在描述板级信息,而这些细节对于内核来说不过是垃圾。如板上的platform设备、resource、i2c_board_info、spi_board_info以及各种硬件platform_data。常见的s3c2410、s3c6410等板级目录,代码量在数万行。
1.2.2. linus Torvalds对于此种情况大发雷霆,在2011年的ARM Linux邮件列表宣称this whole ARM thing is a f*cking pain in the ass”。所以Linux开发社区就开始整改,设备树最早用于PowerPC等其他体系架构,ARM架构开发社区就开始采用设备树来描述设备的信息
1.3. 相关名称缩写
<1>. DT :Device Tree
<2>. FDT : Flattened Device Tree
<3>. OF :Open Firmware
<4>. DTS :device tree source
<5>. DTSI:device tree source include
<6>. DTB :device tree blob
<7>. DTC :device tree compiler
二. 设备树基本语法
2.1. 基本数据格式
<1>. 设备树是节点和属性的简单树型结构。属性是键-值对,节点可以包含属性和子节点。
以下是.dts格式的简单树:
/ DTS-V1 /; / { node1 { a-string-property =“A string”; a-string-list-property =“first string”,“second string”; //十六进制隐含在字节数组中。不需要'0x'前缀. a-byte-data-property = [01 23 34 56]; child-node1 { //boolean,first-child-property定义为true,不定义为false. first-child-boolean-property; second-child-cell-property = <1>; a-string-property =“Hello,world”; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property = <1 2 3 4>; }; };
<2>. 这棵树显然没用,因为它没有描述任何东西,但它确实显示了节点和属性的结构。既:
- 单个根节点:“ / ”
- 几个子节点:“ node1 ”和“ node2 ”
- node1的几个孩子:“ child-node1 ”和“ child-node2 ”
- 一堆散落在树上的属性。
<3>属性是简单的键值对,其中值可以为空或包含任意字节流。虽然数据类型未编码到数据结构中,但有一些基本数据表示可以在设备树源文件中表示。
- 文本字符串用双引号表示:
string-property = “a string”;
‘Cells’是由尖括号分隔的32位无符号整数:
cell-property = <0xbeef 123 0xabcd1234>;
二进制数据用方括号分隔:
binary-property = [0x01 0x23 0x45 0x67];
可以使用逗号将不同表示的数据连接在一起:
mixed-property = “a string”, [0x01 0x23 0x45 0x67], <0x12345678>;
逗号还用于创建字符串列表:
string-list = “red fish”, “blue fish”