1、中断处理函数的注册
中断处理函数的注册使用request_irq,该原型定义在linux/interrupt.h中,函数原型如下:
int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
irq为申请的中断号。
handler为中断处理函数指针,该函数指针定义如下:typedef irqreturn_t (*irq_handler_t)(int, void *);
flags有0或以下几种取值,定义在linux/interrupt.h中:
IRQ_DISABLED:用于中断处理函数运行时禁止所有中断。
IRQ_SHARED:用于共享中断。
IRQ_TIMER:用于处理特殊的system timer中断。
name为ASCII文本。
dev参数用于共享中断。
如果request_irq函数调用成功将返回0,否则返回错误码,例子如下(来自s3c2410_wdt.c):
ret = request_irq(wdt_irq->start, s3c2410wdt_irq, 0, pdev->name, pdev);
if (ret != 0) {
dev_err(dev, "failed to install irq (%d)\n", ret);
goto err_map;
}
中断处理函数定义在这里:
/* interrupt handler code */
static irqreturn_t s3c2410wdt_irq(int irqno, void *param)
{
dev_info(wdt_dev, "watchdog timer expired (irq)\n");
s3c2410wdt_keepalive();
return IRQ_HANDLED;
}
释放一个中断处理函数使用free_irq,函数原型如下:
void free_irq(unsigned int irq, void *dev);
3、禁止和启用中断
禁止中断使用disable_irq函数,启用中断使用enable_irq函数,原型如下:
void disable_irq(unsigned int irq);
void enable_irq(unsigned int irq);
// 2015.08.28 add
注意disable_irq和enable_irq必须成对出现,即只有调用了disable_irq函数,才能调用enable_irq函数,否则调用enable_irq会出现一个warning信息,信息内容大致如下:
Unbalanced enable for IRQ ...
// 2015.07.25 add
4. 中断唤醒
如果要使能中断具有唤醒系统功能,那么应该怎么做呢,这里有两个函数。
int enable_irq_wake(unsigned int irq);
int disable_irq_wake(unsigned int irq);
这两个函数通常应该分别在suspend、resume中被调用,同时,在request_irq时需要加上IRQF_NO_SUSPEND标志。