您的位置:首页 > 其它

device tree source(dts)

2015-05-19 11:15 405 查看
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 >;
};

...

};
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: