中断共享

 多个设备共享一根中断线的情况在实际的硬件中广泛存在,PCI设备即是如此。中断共享的使用方法如下:
  (1)共享中断的多个设备在申请中断的时候都应该使用SA_SHIRQ标志,而且一个设备以SA_SHIRQ申请中断成功的前提是之前申请该中断的所有设备都以SA_SHIRQ标志申请该中断。
  (2)尽管内核模块可访问的全局地址都可以作为request_irq(...,void *dev_id)的最后一个参数dev_id,但是设备结构体指针是可传入的最佳参数。
  (3)中断到来时所有共享中断的中断处理程序都被执行,在中断处理程序的顶半部中,应迅速地根据硬件寄存器中的信息比照传入的dev_id参数做出判断是否是本设备的中断,若不是应该迅速返回。
     共享中断编程模板如下:

       /*中断处理顶半部*/ 
  
  
  
  
  1. irqreturn_t xxx_interrupt(int irq,void *dev_id,struct pt_regs *regs)  
  2. {  
  3.     ...  
  4.     int status = read_int_status();//获知中断源  
  5.     if(!is_myint(dev_id,status))/*判断是否是本设备的中断*/ 
  6.     {  
  7.         return IRQ_NONE;//立即返回  
  8.     }  
  9.     ...  
  10.     return IRQ_HANDLED;  
  11.  
  12. }  
  13. /*设备驱动加载模块*/ 
  14. int xxx_init(void)  
  15. {  
  16.     ...  
  17.     //申请共享中断  
  18.     result = request_irq(sh_irq,xxx_interrupt,SA_SHIRQ,"xxx",xxx_dev);  
  19.     ...  
  20.  
  21. }  
  22. /*设备驱动卸载模块*/ 
  23. int xxx_exit(void)  
  24. {  
  25.     ...  
  26.     //释放中断  
  27.     free_irq(sh_irq,xxx_dev);  
  28.     ...  
  29.  

 

你可能感兴趣的:(职场,休闲,SA_SHIRQ)