你可能会问:为什么上面会写1:1的映射关系?有些总线结构(如PCI总线)拥有自己独立的地址空间,但需要向操作系统开放。还有些设备有DMA引擎,这就需要知道总线上的实际地址。还有些时候几个设备因为使用同样的物理地址空间而需要组合在一起。在硬件设计以及操作系统的大量特性上决定了地址映射是不是1:1的映射关系。
也可能还注意到了上文中的i2c@1,0节点中没有ranges属性。原因是I2C总线不像外部总线,它的地址空间并没有映射到CPU的地址空间中去。实际上,CPU对rtc@58的访问是通过i2c@1,0这个设备来间接达成的。没有ranges属性正表明了这个设备是不能直接访问除父节点外的任何设备的特性。
中断是怎样工作的
不想地址空间映射表那样是遵循设备树的自然结构的(父传子),中断信号可以被machine中的任何设备产生或终止。终端信号独立与设备树将各个节点关联起来。描述一个中断需要4个属性:
interrupt-controller 这个属性没有值,他表示这个节点是一个接收中断信号的设备
#interrupt-cells 这个属性是一个interrupt-controller节点的属性,他说明了这个 interrupt-controller的每个中断说明符(interrupt specifier)有几个cells,类似#address-cells 与 #size-cells的作用
interrupt-parent 这是一个设备节点的属性,用于表明当前设备的中断是属于哪一个interrupt-controller的,如果没有这个属性,则继承其父节点的interrupt-parent属性
interrupts 这是一个设备节点的属性,他是 中断说明符 列表,每一个 中断说明符 表示此设备的一个中断信号输出。
中断说明符是由一个或多个cell数据(#interrupt-cells )来描述一个设备是与哪一个终端信号输入设备相连接的。多数设备都只有一个中断信号输出,如下面的例子,但也有可能存在一个设备有多个终端信号输出的情况。中断说明符的含义与具体的终端控制器( interrupt-controller)有关。每个终端控制器都可以决定它的输入信号的中断说明符有几个cell数据。
下面的代码中为我们的Coyote's Revenge添加了中断连接:
/ { 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>; }; cpu@1 { compatible = "arm,cortex-a9"; reg = <1>; }; }; serial@101f0000 { compatible = "arm,pl011"; reg = <0x101f0000 0x1000 >; interrupts = < 1 0 >; }; serial@101f2000 { compatible = "arm,pl011"; reg = <0x101f2000 0x1000 >; interrupts = < 2 0 >; }; gpio@101f3000 { compatible = "arm,pl061"; reg = <0x101f3000 0x1000 0x101f4000 0x0010>; interrupts = < 3 0 >; }; intc: interrupt-controller@10140000 { compatible = "arm,pl190"; reg = <0x10140000 0x1000 >; interrupt-controller; #interrupt-cells = <2>; }; spi@10115000 { compatible = "arm,pl022"; reg = <0x10115000 0x1000 >; interrupts = < 4 0 >; }; external-bus { #address-cells = <2> #size-cells = <1>; ranges = <0 0 0x10100000 0x10000 // Chipselect 1, Ethernet 1 0 0x10160000 0x10000 // Chipselect 2, i2c controller 2 0 0x30000000 0x1000000>; // Chipselect 3, NOR Flash ethernet@0,0 { compatible = "smc,smc91c111"; reg = <0 0 0x1000>; interrupts = < 5 2 >; }; i2c@1,0 { compatible = "acme,a1234-i2c-bus"; #address-cells = <1>; #size-cells = <0>; reg = <1 0 0x1000>; interrupts = < 6 2 >; rtc@58 { compatible = "maxim,ds1338"; reg = <58>; interrupts = < 7 3 >; }; }; flash@2,0 { compatible = "samsung,k8f1315ebm", "cfi-flash"; reg = <2 0 0x4000000>; }; }; };
有些细节需要各位注意:
此machine仅有一个中断控制器:interrupt-controller@10140000