应用程序提取驱动数据时,只要不使用轮询的方式,就需要驱动提供同步手段(比如发送信号或者使用工作队列),而同步信号往往是在中断中发出的。
在设备树中,中断和外设资源一样,也可以通过定义节点的方式来描述使用的硬件资源,实例如下:
sii902x: sii902x@39 {
compatible = "SiI,sii902x";
pinctrl-names = "default";
reset-names="sii902x";
pinctrl-0 = <&pinctrl_sii902x>;
resets = <&sii902x_reset>;
interrupt-parent = <&gpio1>;
interrupts = <18 IRQ_TYPE_EDGE_FALLING>;
mode_str ="1280x720M@60";
bits-per-pixel = <16>;
reg = <0x39>;
status = "okay";
};
其中interrupt-parent和interrupts定义了中断信息。interrupt-parent定义了使用哪一个中断控制器。而interrupts则定义了使用这个控制器中的哪一个中断以及什么特征会触发中断。
上述节点的定义可以解析为,使用gpio1控制器中的第18号中断,下降沿触发。
至于为什么要使用这种结构定义中断信息,还要从中断的结构说起。
对于IMX6ULL这种芯片,中断控制器分为几个级别,首先是是GIC,也就是通用控制器,这个控制器发出的中断有三种类型,SPI、PPI、SGI。所以他的下一级需要使用三个属性来定义。IMX6uLL使用GPC定义了一级虚拟中断控制器,这一级控制器使用的是GIC第89号SPI中断。而gpio1中断则是gpc的自中断。
intc: interrupt-controller@00a01000 {
compatible = "arm,cortex-a9-gic";
#interrupt-cells = <3>;
interrupt-controller;
reg = <0x00a01000 0x1000>,
<0x00a00100 0x100>;
interrupt-parent = <&intc>;
};
gpc: gpc@020dc000 {
compatible = "fsl,imx6sll-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 = <0x7c00000 0x7d00 0x0 0x1400640>;
};
gpio1: gpio@0209c000 {
compatible = "fsl,imx6sll-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>;
};