设备树是一个由节点及属性组成的简单树结构。属性是基于key-value对的,节点则可以包含子节点以及属性。
如,下面这个树就是一个典型结构:
/ { node1 { a-string-property = "A string"; a-string-list-property = "first string", "second string"; a-byte-data-property = [0x01 0x23 0x34 0x56]; child-node1 { first-child-property; second-child-property = <1>; a-string-property = "Hello, world"; }; child-node2 { }; }; node2 { an-empty-property; a-cell-property = <1 2 3 4>; /* each number (cell) is a uint32 */ child-node1 { }; }; };
这颗树显然没什么实际用途,因为它没有描述任何有意义的内容,但是,我们通过它可以了解什么是属性,什么是节点。这颗树可以解读如下:
一个根节点: "/"
两个子节点: "node1" 和 "node2"
node1下面又有两个子节点:"child-node1" 和 "child-node2"
一堆的属性分散与整颗树的各个节点上
译者注:可以这么简单理解:节点就是树枝,属性就是树叶;树枝上可以有再长树枝也可以长树叶,而树叶上则不会再长树枝。
属性是基于key-value结构的,value可以为空或者特定格式的字符串内容。由于数据类型并不被编码到最终的数据结构中,设备树源代码中仅能支持有限的几种基本数据类型。
text string(以null结束),以双引号括起来,如:
string-property = "a string"
cells 是32位无符号整形数,以尖括号括起来,如
cell-property = <0xbeef 123 0xabcd1234>
binary data 以方括号括起来,如:
binary-property = [0x01 0x23 0x45 0x67];
不同类型数据可以在同一个属性中存在,以逗号分格,如:
mixed-property = "a string", [0x01 0x23 0x45 0x67], <0x12345678>;
多个字符串组成的列表也使用逗号分格,如:
string-list = "red fish","blue fish";
基本概念
为了搞清楚设备树该如何使用,我们将一步一步的为一个Sample Machine建立一颗设备树。
Sample Machine
姑且想象有这么一台机器,它由"Acme"出产,名为"Coyote's Revenge", 配置如下:
32bit ARM CPU
处理器的本地内存总线连接如下设备:串口,SPI总线控制器,I2C控制器,终端控制器以及外部总线桥
256MB SDRAM 位于地址:0x0
两个串口,位于地址:0x101F1000 及 0x101F2000
GPIO控制器位于地址:0x101F3000
SPI控制器位于地址:0x10170000,在它下面连接了如下设备:
MMC卡槽,其SS脚连接了GPIO1
外部总线桥上接了如下设备:
SMC91111 以太网控制器,位于地址:0x10100000
I2C控制器,位于地址:0x10160000,在它下面连接了如下设备:
Maxim DS1338实时时钟,I2C地址为0x58
64MB NOR flash 位于地址:0x30000000
初始结构
第一步是要建立一个基本结构来使得这颗设备树能描述对应的Machine
/ { compatible = "acme,coyotes-revenge"; };
compatible这个属性用于执行系统名,通常它是以 "厂商,型号" 这样的字符串形式存在。它能准确的描述对应的设备的特征。
CPU描述
下一部就是描述每一个CPU了。在cpus节点中,每个CPU就是一个子节点。这种情况在多核的ARM Cortex A9系统中很常见。
/ { compatible = "acme,coyotes-revenge"; cpus { cpu@0 { compatible = "arm,cortex-a9"; }; cpu@1 { compatible = "arm,cortex-a9"; }; }; };
每个cpu的子节点中有个compatible属性,它描述了CPU的具体型号,形式通常也是 "厂商,型号"
当然,CPU的细节不是这么一个compatible属性能描述清楚的,后面我们会再逐步加入。
节点名
有必要为节点的命名讲几句。每个节点的名字都应该是这样的形式: <name>[@<unit-address>]
尖括号是必须的,方括号是可选的。