- /* *****************************************************************************
- 多个设备共享一根中断线的情况在实际的硬件中广泛存在,PCI设备即是如此。中断共享的使用方法如下:
- (1)共享中断的多个设备在申请中断的时候都应该使用SA_SHIRQ标志,而且一个设备以SA_SHIRQ申请中断成功的前提是之前申请该中断的所有设备都以SA_SHIRQ标志申请该中断。
- (2)尽管内核模块可访问的全局地址都可以作为request_irq(...,void *dev_id)的最后一个参数dev_id,但是
- 设备结构体指针是可传入的最佳参数。
- (3)中断到来时所有共享中断的中断处理程序都被执行,在中断处理程序的顶半部中,应迅速地根据硬件寄存器中的
- 信息比照传入的dev_id参数做出判断是否是本设备的中断,若不是应该迅速返回。
- 共享中断编程模板如下:
- ***************************************************************************** */
- /*中断处理顶半部*/
- irqreturn_t xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)
- {
- ...
- int status = read_int_status();//获知中断源
- if(!is_myint(dev_id,status))/*判断是否是本设备的中断*/
- {
- return IRQ_NONE;//立即返回
- }
- ...
- return IRQ_HANDLED;
- }
- /*设备驱动加载模块*/
- int xxx_init(void)
- {
- ...
- //申请共享中断
- result = request_irq(sh_irq,xxx_interrupt,SA_SHIRQ,"xxx",xxx_dev);
- ...
- }
- /*设备驱动卸载模块*/
- int xxx_exit(void)
- {
- ...
- //释放中断
- free_irq(sh_irq,xxx_dev);
- ...
- }
转载于:https://blog.51cto.com/liruibo/739593