一、注册中断处理函数
使用request_threaded_irq( )函数来处理,函数声明如下:
int request_threaded_irq(unsigned int irq, irq_handler_t handler,
irq_handler_t thread_fn, unsigned long irqflags,
const char *devname, void *dev_id)
此函数做了如下的工作:
1、分配了一个irqaction结构空间
action = kzalloc(sizeof(struct irqaction), GFP_KERNEL);
2、初始化该结构的成员
action->handler = handler;
action->thread_fn = thread_fn;
action->flags = irqflags;
action->name = devname;
action->dev_id = dev_id;
3、设置中断
retval = __setup_irq(irq, desc, action);
该函数完成以下几项内容
(1)根据中断号找到irq_desc数据项,在链表内加入action结构。
(2)设置irq_desc[irq]结构中还没有设置的指针,让他们指向一些默认函数
irq_chip_set_defaults(desc->chip);
(3)设置中断触发方式
ret = __irq_set_trigger(desc, irq, new->flags & IRQF_TRIGGER_MASK);
(4)启动中断
__enable_irq(desc, irq, false);
二、注销中断处理函数
函数声明如下:
void free_irq(unsigned int irq, void *dev_id)
使用中断号irq定位action链表,再使用dev_id在action链表中找到要卸载的表项。