Linux设备树的用法

设备树是一个由节点及属性组成的简单树结构。属性是基于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>]

尖括号是必须的,方括号是可选的。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/6c0fc219b0ea511bacee7c6ba4b1058e.html