前言:使用设备树描述中断时,我们需要在设备树节点里面描述设备使用哪个硬件中断,如下所示是对按键中断的硬件中断的描述(只是起来开门见山的作用),对于理解按键按键中断的硬件中断的描述信息,我会在下面详细介绍,
buttons {
compatible = "jz2440_button";
eint-pins = <&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>;
interrupts-extended = <&intc 0 0 0 3>,
<&intc 0 0 2 3>,
<&gpg 3 3>,
<&gpg 11 3>;
};
设备树节点里面描述中断可以参考下面的文档
参考文档:linux-4.19-rc3\Documentation\devicetree\bindings\interrupt-controller\samsung,s3c24xx-irq.txt
linux-4.19-rc3\Documentation\devicetree\bindings\pinctrl\samsung-pinctrl.txt
在中断系统中的设备树(三)__S3C2440上使用设备树描述中断我们知道对于s3c2440芯片,硬件上有三个中断控制器,一个主中断控制器和两个子中断控制器(gpf、gpg),如下图所示:
在JZ2440板子原理图上EINT11按键连接gpg3引脚,EINT19按键连接gpg11引脚,当我们在设备树中描述中断时,需要指定中断发给哪个中断控制器,属于 这个中断控制器里面的哪个中断,从上图我们可以看到有四个中断,属于两个中断控制器,当分别按下按键时,分别就会向两个中断控制器发送中断信号,下面是描述中断的格式:
interrupts-extended = <&pic 0xA 8>, <&gic 0xda>
<&pic 0xA 8>:发给pic中断控制器的,0xA 8这两个数据用来描述pic控制器中的中断;
<&gic 0xda>:发给gic中断控制器的,0xda这个数据用来描述gic控制器中的中断;
从这里我们可以知道每个中断控制器用多少个32位的数据描述里面的中断是不一定的(用多少个32位的数据描述中断控制器里面的中断是由中断控制器决定的)
&intc:表示是哪个中断控制器;
0 0 0 3:表示描述是哪个中断;
interrupt-controller@4a000000 {
compatible = "samsung,s3c2410-irq";
reg = <0x4a000000 0x100>;
interrupt-controller;
#interrupt-cells = <0x4>; //表示用4个32bit的数据描述这个中断控制器里面的每一个中断
phandle = <0x1>;
};
在硬件上有两个中断控制器,在软件上只用intc一个中断控制器来描述,怎么知道中断是发给主中断控制器还是发给子中断控制器呢? 可以用下面的格式来区分中断是发给主中断控制器还是子中断控制器的;
<&intc 0 0 0 3>
第一个表示是发给主控制器还是子控制器;
第二个表示子中断控制器发给主控制器的哪一个;
第三个表示是这个中断控制器里的哪一个中断;
第四个表示中断的触发方式;
gpg {
gpio-controller;
#gpio-cells = <0x2>;
interrupt-controller; //表示该节点是个中断控制器
#interrupt-cells = <0x2>; //该中断控制器里面的中断用0x02个32bit的数据表示;
phandle = <0xe>;
};
<&gpg 3 3>,
<&gpg 11 3>;
参考下面的描述信息:
参考下面的描述信息:
- First Cell: represents the external gpio interrupt number local to the
external gpio interrupt space of the controller.
- Second Cell: flags to identify the type of the interrupt
- 1 = rising edge triggered
- 2 = falling edge triggered
- 3 = rising and falling edge triggered
- 4 = high level triggered
不能用了,那么我们怎么设置引脚呢?
答:我们需要在设备树里面指定:
eint-pins = <&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>;
<&gpf 0 0>:gpf里面第0个引脚;
<&gpf 2 0>:gpf里面第2个引脚;
<&gpg 3 0>:gpg里面第3个引脚;
<&gpg 11 0>:gpg里面第11个引脚;
<&gpf 0 0>, <&gpf 2 0>, <&gpg 3 0>, <&gpg 11 0>这些值要转化为一个整数,
到此:设备树里面的描述中断的属性已经解释清楚了刚开始提的问题也回答了,我们的linux驱动程序需要使用中断号,
中断号是个软件的概念,问题来了:设备树中的中断信息怎样转化为中断号呢?
现在我们知道,我们只需要在设备树里面描述中断的硬件信息就可以了, 我们的驱动程序只需要从platform_device中获取IRQ资源(中断号) 就可以用来申请中断了。最后的处理如下图所示:
实验测试:
程序烧写到板子启动之后,执行测试程序,
cat /proc/interrupts
CPU0
1: 0 s3c 0 Edge S2
2: 0 s3c 2 Edge S3
3: 0 s3c-eint 3 Edge S4
7: 964 s3c-eint 7 Edge eth0
8: 0 s3c 8 Edge s3c2410-rtc tick
13: 73676 s3c 13 Edge samsung_time_irq
15: 0 s3c-eint 11 Edge S5
30: 0 s3c 30 Edge s3c2410-rtc alarm
32: 114 s3c-level 32 Level 50000000.serial
33: 487 s3c-level 33 Level 50000000.serial
59: 0 s3c-level 59 Edge 53000000.watchdog