Device Tree Source 语法:
.dts 也可以像c语言一样包含 .dtsi 文件, 这个 .dtsi文件就像是 .h文件一样. 几乎所有的arm芯片都包含了skeleton.dtsi
root节点 "/", 子节点 "cpu" 和 "external-bus"
[label:] node-name[@unit-address] { [properties definitions] [child nodes] }
label: 在dts中要引用某个节点要写出全路径
每个节点都有属性, 属性的表示方式:
(1) text string 或者text list 属性表示方法: device_type = "memory"
(2) u32的属性表示方法: #size-cells = <1>
(3) binary-data 属性表示方法: binary-property = [0x10 0x20 0x30 0x40]
说明: # 表示数字的意思
为了说明dts是如何使用的, 我们使用样机来一步一步编写出一个dst
1个双核ARM Cortex-A9 32位处理器;生产商:"Acme" 名称:"Coyote's Revenge": local bus 串口x2 (位于0x101F1000 和 0x101F2000) GPIO控制器 (位于0x101F3000) SPI控制器 (位于0x10170000) 中断控制器 (位于0x10140000) external bus桥; SMC SMC91111 Ethernet (位于0x10100000) I2C控制器 (位于0x10160000) Maxim DS1338实时钟 (I2C地址为0x58) 64MB NOR Flash (位于0x30000000)
1 Initial structure
/ { compatible = "acme,coyotes-revenge"; };
"compatible" 是系统的名称, 格式 "厂商, 型号" , OS只根据compatible来识别machine, 所以必须保证准确性.
2 CPUs
/ { compatible = "acme,coyotes-revenge"; cpus { cpu@0 { compatible = "arm,cortex-a9"; }; cpu@1 { compatible = "arm,cortex-a9"; }; }; };
在根节点下再增加一个 cpus 子节点, cpu子节点的compatible为string, 格式为 "厂商, 型号" . 和根节点的compatible一样.
3 Node Names
节点的命名规范: <名字>[@<部件地址>] 其中名字是小于31个字符的ascii字符串(<>为必选项 []为非必选项). 名字主要用来描述设备类型, 如 3com Ethernet适配器对应的结点名字宜为ethernet,而不是3com
一般来说 部件地址 是用来描述设备的主地址. 如果一个结点描述的设备有地址,则应该给出@unit-address。多个相同类型设备结点的name可以一样,只要部件地址不同即可,如本例中含有cpu@0、cpu@1.
设备的 部件地址 也经常在结点的reg属性中给出
4 Devices
每个设备在dts中对应一个节点, 下边我们就来为每个设备填充树中的节点
/ { compatible = "acme,coyotes-revenge"; cpus { cpu@0 { compatible = "arm,cortex-a9"; }; cpu@1 { compatible = "arm,cortex-a9"; }; }; serial@101F0000 { compatible = "arm,pl011"; }; serial@101F2000 { compatible = "arm,pl011"; }; gpio@101F3000 { compatible = "arm,pl061"; }; interrupt-controller@10140000 { compatible = "arm,pl190"; }; spi@10115000 { compatible = "arm,pl022"; }; external-bus { ethernet@0,0 { compatible = "smc,smc91c111"; }; i2c@1,0 { compatible = "acme,a1234-i2c-bus"; rtc@58 { compatible = "maxim,ds1338"; }; }; flash@2,0 { compatible = "samsung,k8f1315ebm", "cfi-flash"; }; }; };
在dts中层次结构反应了硬件的从属关系, 现在这个dts中还没有设备之间连接的信息, 之后会加入, 在本dts中要注意的:
(1)每个设备节点都有一个compatible (2)flash使用两个字符串, 下一节 (3)名字就是设备类型而不是特定的编号
5 Understanding the compatible Property
compatible 是OS绑定硬件和驱动的关键, flash中第一个string 是表示支持的准确的设备, 第二个字符串表示兼容的设备.
可寻址的设备使用如下信息来在Device Tree中编码地址信息:
reg #address-cells #size-cells
reg的组织形式为reg = <address1 length1 [address2 length2] [address3 length3] ... >, 其中的每一组address length表明了设备使用的一个地址范围.
address为1个或多个cell(即32位的整型),而length则为0或多个cell(若#size-cells = 0)。address 和 length 字段是可变长的,父结点的#address-cells和#size-cells分别决定了子结点的reg属性的address和length字段的长度。
下边我们从cpu开始添加reg属性
CPU addressing
cpus { #address-cells = <1>; #size-cells = <0>; cpu@0 { compatible = "arm,cortex-a9"; reg = <0>; }; cpu@1 { compatible = "arm,cortex-a9"; reg = <1>; }; };
address用1个cell表示 length用0 个cell表示, 所以reg就是<x> , 另外注意如果节点有reg属性那么他就必须指明部件地址 name[@unit-addr]
Memory Mapped Devices
/ { #address-cells = <1>; #size-cells = <1>; ... serial@101f0000 { compatible = "arm,pl011"; reg = <0x101f0000 0x1000 >; }; serial@101f2000 { compatible = "arm,pl011"; reg = <0x101f2000 0x1000 >; }; gpio@101f3000 { compatible = "arm,pl061"; reg = <0x101f3000 0x1000 0x101f4000 0x0010>; }; interrupt-controller@10140000 { compatible = "arm,pl190"; reg = <0x10140000 0x1000 >; }; spi@10115000 { compatible = "arm,pl022"; reg = <0x10115000 0x1000 >; }; ... };