以对应多个产品和电路板),势必这些.dts 文件需包含许多共同的部分,Linux 内核为了简
化,把 SoC 公用的部分或者多个 machine 共同的部分一般提炼为.dtsi,类似于 C 语言的头
文件。其他的 machine 对应的.dts 就 include 这个.dtsi。譬如,对于 VEXPRESS 而言,
vexpress-v2m.dtsi 就被 vexpress-v2p-ca9.dts 所引用, vexpress-v2p-ca9.dts 有如下一行:
/include/ "vexpress-v2m.dtsi"
当然,和 C 语言的头文件类似,.dtsi 也可以 include 其他的.dtsi,譬如几乎所有的 ARM
SoC 的.dtsi 都引用了 skeleton.dtsi。
.dts(或者其 include 的.dtsi)基本元素即为前文所述的结点和属性:
/ {
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 {
};
};
};
上述.dts 文件并没有什么真实的用途,但它基本表征了一个 Device Tree 源文件的结构:
1 个 root 结点"/";
root 结点下面含一系列子结点,本例中为"node1" 和 "node2";
结点"node1"下又含有一系列子结点,本例中为"child-node1" 和 "child-node2";
各结点都有一系列属性。这些属性可能为空,如" an-empty-property";可能为字符串,
如"a-string-property";可能为字符串数组,如"a-string-list-property";可能为 Cells(由 u32
整数组成),如"second-child-property",可能为二进制数,如"a-byte-data-property"。
下面以一个最简单的 machine 为例来看如何写一个.dts 文件。假设此 machine 的配置如
下:
1 个双核 ARM Cortex-A9 32 位处理器;
ARM 的 local bus 上的内存映射区域分布了 2 个串口(分别位于 0x101F1000 和
0x101F2000)、GPIO 控制器(位于 0x101F3000)、SPI 控制器(位于 0x10170000)、中
断控制器(位于 0x10140000)和一个 external bus 桥;
External bus 桥上又连接了 SMC SMC91111 Ethernet(位于 0x10100000)、I
2
C 控制器
(位于 0x10160000)、64MB NOR Flash(位于 0x30000000);
External bus 桥上连接的 I
2
C 控制器所对应的 I
2
C 总线上又连接了 Maxim DS1338 实时
钟(I
2
C 地址为 0x58)。
其对应的.dts 文件为:
/ {
compatible = "acme,coyotes-revenge";
#address-cells = <1>;
#size-cells = <1>;
interrupt-parent = <&intc>;
cpus {
#address-cells = <1>;
#size-cells = <0>;
cpu@0 {
compatible = "arm,cortex-a9";
reg = <0>;
};
评论0
最新资源