一个硬件中断产生以后,会经过GPIOx,SOC,GPC,GIC四层上报到CPU。下面对在设备树中的每一层级进行解析。下面的所有定义都在.dtsi文件中定义
- intc描述的是中断总开关
ARM系统的中断控制器(GIC)用于管理单核或多核系统中的中断的硬件资源。
这个单元用如下的代码来描述,intc下的中断需要用三个参数来定义(#interrupt-cells = <3>;)
intc: interrupt-controller@00a01000 {
compatible = "arm,cortex-a7-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a02000 0x100>;
};
为什么要用三个参数呢?
三个参数分别表示是哪一类中断的哪一个中断以及这个中断的触发方式。
- gpc是系统的虚拟中断控制器
中断可以有多种不同的类型:
① 软件触发中断(SGI,Software Generated Interrupt)
② 私有外设中断(PPI,Private Peripheral Interrupt),标识CPU核私有的中断源,并且独立于另一个内核上的相同中断源。
③ 共享外设中断(SPI,Shared Peripheral Interrupt)
gpc: gpc@020dc000 {
compatible = "fsl,imx6ul-gpc", "fsl,imx6q-gpc";
reg = <0x020dc000 0x4000>;
interrupt-controller;
#interrupt-cells = <3>;
interrupts = <GIC_SPI 89 IRQ_TYPE_LEVEL_HIGH>;
interrupt-parent = <&intc>;
fsl,mf-mix-wakeup-irq = <0xfc00000 0x7d00 0x0 0x1400640>;
};
-
片上系统SOC节点。 如果处理器是SOC,则此节点必须存在。顶级SOC节点包含的信息对此SOC上的所有设备可见。SOC节点还包含目标板使用的每个SOC设备子节点,应该在设备树中尽可能详细地描述此SOC上的外围设备。
soc {
#address-cells = <1>;
#size-cells = <1>;
compatible = "simple-bus";
interrupt-parent = <&gpc>;
ranges;
}
- 在SOC节点中定义GPIO节点。其中的interrupts 属性描述了此中断属于SPI类,第66,67号中断,高电平触发。上面是在.dtsi文件中定义的节点,不需要我们来实现,内核已经定义好了。
gpio1: gpio@0209c000 {
compatible = "fsl,imx6ul-gpio", "fsl,imx35-gpio";
reg = <0x0209c000 0x4000>;
interrupts = <GIC_SPI 66 IRQ_TYPE_LEVEL_HIGH>,
<GIC_SPI 67 IRQ_TYPE_LEVEL_HIGH>;
gpio-controller;
#gpio-cells = <2>;
interrupt-controller;
#interrupt-cells = <2>;
};
- 下面是我们需要在设备树中添加的代码,含义就是此节点要使用GPIO1中的第一个中断,使用双边沿触发。
gpio_keys_100ask {
compatible = "100ask,gpio_key";
interrupt-parent = <&gpio1>;
interrupts = <1 IRQ_TYPE_EDGE_BOTH>;
};
至此就可以使用中断方式来使用按键了。