内核的中断机制
内核本身是一个裸机程序,所以在驱动中使用中断与裸机中没有大的区别。但是在2.6.35之后的内核中,为了避免竞态,默认取消了中断的嵌套,这点值得我们注意。
有关驱动中的中断实例,详见基于input子系统的驱动分析
1.中断号
内核通过中断号来识别中断
- 对于一些经典的soc,比如s5pv210,中断号定义在arch/arm/mach-s5pv210/include/mach/irqs.h
- 而对于一些比较新的soc,比如imx6,则通常在设备节点中以下方式表示中断,假设现在有一个gpio中断
/*先确定中断所在的组*/
interrupt-parent = <&gpio6>;
/*表示中断,GPIO6中的第8个IO,2为触发类型,下降沿触发*/
interrupts = <8 2>;
- 而在驱动中使用
中断号 =irq_of_parse_and_map(node, index)
函数返回值来得到中断号,详见设备树详解
2.申请中断
- 驱动中,使用中断资源需要申请和释放,分别使用内核提供的request_irq()和 free_irq()函数。例如:
/*申请中断*/
if (request_irq(IRQ_EINT2, button_interrupt, IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING, "button", S5PV210_GPH0(2))) {
printk(KERN_ERR "button-s5pv210.c: Can't