一个双核ARMCortex-A9 32位处理器;
ARM的local bus上的内存映射区域分布了2个串口(分别位于0x101F1000 和0x101F2000)、GPIO控制器(位于0x101F3000)、SPI控制器(位于0x10170000)、中断控制器(位于0x10140000)和一个external bus桥;
External bus桥上又连接了SMCSMC91111 Ethernet(位于0x10100000)、I2C控制器(位于0x10160000)、64MBNOR Flash(位于0x30000000);
External bus桥上连接的I2C控制器所对应的I2C总线上又连接了MaximDS1338实时钟(I2C地址为0x58)。
其对应的.dts文件为:
[plain] view plaincopy
1. / {
2. compatible = "acme,coyotes-revenge";
4. #size-cells = <1>;
5. interrupt-parent = <&intc>;
6.
7. cpus {
8. #address-cells = <1>;
9. #size-cells = <0>;
10. cpu@0 {
11. compatible = "arm,cortex-a9";
12. reg = <0>;
13. };
14. cpu@1 {
15. compatible = "arm,cortex-a9";
16. reg = <1>;
17. };
18. };
19.
20. serial@101f0000 {
21. compatible = "arm,pl011";
22. reg = <0x101f0000 0x1000 >;
23. interrupts = < 1 0 >;
24. };
25.
26. serial@101f2000 {
27. compatible = "arm,pl011";
28. reg = <0x101f2000 0x1000 >;
29. interrupts = < 2 0 >;
30. };
31.
32. gpio@101f3000 {
33. compatible = "arm,pl061";
34. reg = <0x101f3000 0x1000
35. 0x101f4000 0x0010>;
36. interrupts = < 3 0 >;
37. };
38.
39. intc: interrupt-controller@10140000 {
40. compatible = "arm,pl190";
41. reg = <0x10140000 0x1000 >;
42. interrupt-controller;
43. #interrupt-cells = <2>;
44. };
45.
46. spi@10115000 {
47. compatible = "arm,pl022";
48. reg = <0x10115000 0x1000 >;
49. interrupts = < 4 0 >;
50. };
51.
52. external-bus {
53. #address-cells = <2>
54. #size-cells = <1>;
55. ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
56. 1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
57. 2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
58.
59. ethernet@0,0 {
60. compatible = "smc,smc91c111";
61. reg = <0 0 0x1000>;
62. interrupts = < 5 2 >;
63. };
64.
65. i2c@1,0 {
66. compatible = "acme,a1234-i2c-bus";
67. #address-cells = <1>;
68. #size-cells = <0>;
69. reg = <1 0 0x1000>;
70. interrupts = < 6 2 >;
71. rtc@58 {
72. compatible = "maxim,ds1338";
73. reg = <58>;
74. interrupts = < 7 3 >;
75. };
76. };
77.
78. flash@2,0 {
79. compatible = "samsung,k8f1315ebm", "cfi-flash";
80. reg = <2 0 0x4000000>;
81. };
82. };
83. };
可寻址的设备使用如下信息来在DeviceTree中编码地址信息:
l reg
l #address-cells
l #size-cells
其中reg的组织形式为reg = <address1 length1 [address2 length2] [address3 length3] ...>,其中的每一组address length表明了设备使用的一个地址范围。
Ø address为n个32位的整型所定义的一个地址,n值由#address-cells定义。
Ø length 为m个32位的整型所定义的一个长度,m值由#size-cells定义。
address 和 length 字段是可变长的,父结点的#address-cells和#size-cells分别决定了子结点的reg属性的address和length字段的长度。在本例中,父节点是root节点,
root结点的#address-cells= <1>;和#size-cells = <1>;决定了serial、gpio、spi等结点的address和length字段长度分别为1。
cpus 结点的#address-cells= <1>;和#size-cells = <0>;决定了2个cpu子结点的address为1,而length为空,于是形成了2个cpu的reg = <0>;和reg = <1>;。
external-bus结点的#address-cells = <2>和#size-cells =<1>;决定了其下的ethernet、i2c、flash的reg字段形如reg =<0 0 0x1000>;、reg = <1 0 0x1000>;和reg = <2 0 0x4000000>;
注意:external-bus的父节点是root节点,所有external-bus本身的reg属性还是遵守root节点的address-cells和#size-cells,而external-bus结点定义的#address-cells = <2>和#size-cells =<1>则是作用于其下的三个子节点ethernet、i2c、flash的reg字段
其中,address字段长度为2,ethernet、i2c、flash三个设备开始的第一个cell(0、1、2)是对应的片选,第2个cell(0,0,0)是相对该片选的基地址,第3个cell(0x1000、0x1000、0x4000000)为length。(这个是对地址本身的解析,与语法无关,这个需要配合下面关于ranges的描述来理解。)
特别要留意的是i2c结点中定义的 #address-cells = <1>;和#size-cells = <0>;又作用到了I2C总线上连接的RTC,它的address字段为0x58,是设备的I2C地址。
root结点的子结点描述的是CPU的视图,因此root子结点的address区域就直接位于CPU的memory区域。但是,经过总线桥后的address往往需要经过转换才能对应的CPU的memory映射。external-bus的ranges属性定义了经过external-bus桥后的地址范围如何映射到CPU的memory区域。
- ranges = < 0 0 0x10100000 0x10000 // Chipselect 1, Ethernet
- 1 0 0x10160000 0x10000 // Chipselect 2, i2c controller
- 2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash
ranges是地址转换表,其中的每个项目是一个子地址、父地址以及在子地址空间的大小的映射。映射表中的子地址、父地址分别采用子地址空间的#address-cells和父地址空间的#address-cells大小。对于本例而言,子地址空间的#address-cells为2,父地址空间的#address-cells值为1,因此00 0x10100000 0x10000的前2个cell为子地址external-bus后片选0上偏移0,第3个cell表示external-bus后片选0上偏移0的地址空间被映射到CPU的0x10100000位置,第4个cell表示映射的大小为0x10000。ranges的后面2个项目的含义可以类推。
intc:interrupt-controller@10140000 : 这里intc相当于是interrupt-controller@10140000的名称,别的设备可以直接引用intc来替代interrupt-controller@10140000
Device Tree中还可以中断连接信息,对于中断控制器而言,它提供如下属性:
interrupt-controller – 这个属性为空,中断控制器应该加上此属性表明自己的身份;
#interrupt-cells – 与#address-cells 和 #size-cells相似,它表明连接此中断控制器的设备的interrupts属性的cell大小。