1. /* *****************************************************************************  
  2.      多个设备共享一根中断线的情况在实际的硬件中广泛存在,PCI设备即是如此。中断共享的使用方法如下:  
  3.  (1)共享中断的多个设备在申请中断的时候都应该使用SA_SHIRQ标志,而且一个设备以SA_SHIRQ申请中断成功的前提是之前申请该中断的所有设备都以SA_SHIRQ标志申请该中断。  
  4.  (2)尽管内核模块可访问的全局地址都可以作为request_irq(...,void *dev_id)的最后一个参数dev_id,但是  
  5.   设备结构体指针是可传入的最佳参数。  
  6.  (3)中断到来时所有共享中断的中断处理程序都被执行,在中断处理程序的顶半部中,应迅速地根据硬件寄存器中的  
  7.   信息比照传入的dev_id参数做出判断是否是本设备的中断,若不是应该迅速返回。  
  8.      共享中断编程模板如下:  
  9.    
  10.    ***************************************************************************** */ 
  11. /*中断处理顶半部*/ 
  12. irqreturn_t xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)  
  13. {  
  14.  ...  
  15.  int status = read_int_status();//获知中断源  
  16.  if(!is_myint(dev_id,status))/*判断是否是本设备的中断*/ 
  17.  {  
  18.   return IRQ_NONE;//立即返回  
  19.  }  
  20.  ...  
  21.  return IRQ_HANDLED;  
  22.  
  23. }  
  24. /*设备驱动加载模块*/ 
  25. int xxx_init(void)  
  26. {  
  27.  ...  
  28.  //申请共享中断  
  29.  result = request_irq(sh_irq,xxx_interrupt,SA_SHIRQ,"xxx",xxx_dev);  
  30.  ...  
  31.  
  32. }  
  33. /*设备驱动卸载模块*/ 
  34. int xxx_exit(void)  
  35. {  
  36.  ...  
  37.  //释放中断  
  38.  free_irq(sh_irq,xxx_dev);  
  39.  ...  
  40.  
  41. }