05-申请和释放中断
10.3.1 申请和释放中断
在Linux设备驱动中,使用中断的设备需要申请和释放对应的中断,分别使用内核提供的request_irq()和free_irq()函数。
1.申请IRQ
int request_irq(unsigned int irq, irq_handler_t handler,
unsigned long irqflags, const char devname, void dev_id)
irq是要申请的硬件中断号。
handler是向系统登记的中断处理函数(顶半部),是一个回调函数,中断发生时,系统调用这个函数,dev_id参数将被传递给它。
irqflags是中断处理的属性,可以指定中断的触发方式以及处理方式。在触发方式方面,可以是IRQF_TRIGGER_RISING、IRQF_TRIGGER_FALLING、IRQF_TRIGGER_HIGH、IRQFTRIGGER LOW等。在处理方式方面,若设置了IRQF_DISABLED,表明中断处理程序是快速处理程序,快速处理程序被调用时屏蔽所有中断,慢速处理程序则不会屏蔽其他设备的驱动;若设置了IRQF_SHARED,则表示多个设备共享中断,dev_id在中断共享时会用到,一般设置为这个设备的设备结构体或者NULL。
request_irq()返回0表示成功,返回-EINVAL表示中断号无效或处理函数指针为NULL,返回-EBUSY表示中断已经被占用且不能共享。
顶半部handler的类型irq_handler_t定义为:
typedef irqreturn_t (irq_handler_t)(int, void );
typedef int irqreturn_t;
2.释放IRQ
与request_irq()相对应的函数为free_irq(),free_irq()的原型为:
void free_irq(unsigned int irq,void *dev_id);
free_irq()中参数的定义与request_irq()相同。