中断申请注册函数request_irq()
int request_irq(unsigned int irq, irq_handler_t handler,
unsigned long irqflags, const char *devname, void *dev_id)
四个参数的表示依次是:
1、注册中断号
2、中断处理函数 (申请中断的时候 ,只注册中断函数,不执行中断函数)
3、中断属性,触发中断的方式,是否是共享中断
4 设备名
5设备号,很多资料中都建议将设备结构指针作为dev_id参数,
下面解释一下dev_id参数为什么必须的,而且是必须唯一的。
当调用free_irq注销中断处理函数时(通常卸载驱动时其中断处理函数也会被注销掉),因为dev_id是唯一的,所以可以通过它来判断从共享中断线上的多个中断处理程序中删除指定的一个。如果没有这个参数,那么kernel不可能知道给定的中断线上到底要删除哪一个处理程序。
注销函数定义在Kernel/irq/manage.c中定义:
void free_irq(unsigned int irq, void *dev_id)
enable_irq(MT6589_KP_IRQ_ID);
disable_irq_nosync(MT6589_KP_IRQ_ID);
request_irq() enable_irq() 和 diable_irq_nosync()的使用模板
static irqreturn_t kpd_irq_handler(int irq, void *dev_id)
{
/* use _nosync to avoid deadlock */
disable_irq_nosync(MT6589_KP_IRQ_ID);//中断处理程序中不能使用disable_irq, 否则会导致cpu被synchronize_irq独占而发生系统崩溃.
tasklet_schedule(&kpd_keymap_tasklet);
return IRQ_HANDLED;
}
static void kpd_keymap_handler(unsigned long data)
{
-----------------------------------
----------------------------------
------------------------------------
enable_irq(MT6589_KP_IRQ_ID);
}