4 How Interrupts work
与遵循树的自然结构的地址范围转换不同, 中断信号可以起源于或者终止于板卡上的任何设备。 与设备树中自然表示的设备寻址不同,中断信号的表示独立于设备树节点之间的连接。通常用下面的四个属性来描述一个中断连接:
-
interrupt-controller - 一个空属性,声明一个接收中断信号的设备节点
-
#interrupt-cells - 这是中断控制器节点的一个属性。它声明中断控制器的 interrupt specifier(中断描述符)占用多少单元格(类似于#address-cells和#size-cells)。
-
interrupt-parent - 一种包含指向中断控制器句柄指针的属性;如果没有该属性,节点也可以从其父节点继承该属性
-
interrupts - 包含一系列的interrupt specifier的属性,每一个interrupt specifier表示设备发出的一个中断信号
一个interrupt specifier包含1个或多个单元格的数据(具体多少个单元格由“#interrupt-cells”属性决定), 它指定设备连接到哪个中断输入。大多数设备只有一个中断输出,如下面的例子所示,但是在一个设备上可以有多个中断输出。 interrupt specifier的含义完全取决于中断控制器设备的绑定。每个中断控制器可以决定需要多少单元格来唯一地定义一个中断输入。
接下来的代码,在我们的 Coyote's Revenge机器上增加了中断连接:
/dts-v1/; / { 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>; }; }; };
需要注意的是:
-
本机只有一个中断控制器: interrupt-controller@10140000
-
“intc”标签, 已添加到中断控制器节点,该标签用于为根节点中的“interrupt-parent”属性分配一个phandle。这个“interrupt-parent”属性成为系统的默认值,因为所有子节点都会继承它,除非显式地重写它。
-
每个设备使用属性“interrupts”来指定一条不同的中断信号输入线
-
“ #interrupt-cells”属性等于2,所以每个interrupt specifier有2个cells, 本例使用了一种常见的模式,即使用第一个单元格对中断行号进行编码,使用第二个单元格一些flags进行编码。比如高有效、低有效或者边缘有效与敏感程度。对于任何给定的中断控制器,请参阅控制器的对应文档,以了解specifier是如何编码的。
5 Device Specific Data
在通用的属性之外,还可以在节点里添加任意的属性和子节点。任何操作系统所需的数据都可以加进来,只要遵守以下的规则:
首先, 新的特定于设备的属性名应该有一个制造商名字作为前缀,这样它们就不会与现有的标准属性名冲突。
其次,必须在 binding 中记录属性和子节点的含义,以便设备驱动程序的作者知道如何解释数据。 binding 记录了特定兼容值的含义、它应该具有的属性、它可能具有的子节点以及它表示的设