device tree source(dts)

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]

说明: # 表示数字的意思

Basic Data Format

为了说明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 是表示支持的准确的设备, 第二个字符串表示兼容的设备. 

How Addressing Works

可寻址的设备使用如下信息来在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 >;
    };

    ...

};



















































































































































你可能感兴趣的:(device tree source(dts))