linux中断申请和释放函数

中断信号线是非常珍贵且有限的资源。内核维护了一个中断信号线的注册表,该表类似于I/O端口的注册表。模块在使用使用中断前要先求请一个中断通道(或者中断请求IRQ),在使用后还要记得释放该中断通道。在很多情况下,模块也希望可以和其它驱动程序共享中断信号线。

1. 中断函数要包含的头文件

    #include 

1. 中断申请函数

    int  request_irq(         unsigned int irq,

                                  irqreturn_t (*handler)(int , void * , struct pt_regs *) ,

                                  unsigned long flags,

                                  const char *dev_name,

                                  void *dev_id

                        );

   通常情况下,request_irq()返回给请求函数的值为0时表示申请成功,为负时表示错误码。函数返回-EBUSY表示已经有另外一个驱动程序占用了你要申请的中断信号线。

   函数参数:

   unsigned int irq - 这是要申请的中断号

   irqreturn_t (*handler)(int , void * , struct pt_regs *)  - 这是要安装的中断处理函数指针。

   unsigned long flags - 与中断管理有关的位俺码。取值:SA_INTERRUPT(快速中断),SA_SHIRQ(中断共享),SA_SAMPLE_RANDOM(随机中断,可用于产生随机数)

   const char *dev_name - 传递给request_irq()的字符串,用来在/proc/interrupts中显示中断的拥有者

    void *dev_id - 这个指针用于共享的中断信号线。它是唯一的标识符,在中断信号线空闲时可以使用它,驱动程序也可以使用它指向它指向驱动程序自己的私有数据区(用来识别哪个设备产生了中断)。在没有强制使用共享方式时,dev_id可以被设置成NULL。总这用这来指向设备的数据结构是比较好的思路。

2.中断释放函数

    void free_irq( unsigned int irq, void *dev_id );

3. 中断使用注意事项

    中断处理例程可以在驱动程序初始化时或者设备第一次打开时安装。但实际上并不会这样用。因为中断信号线的数量是很有限的,我们不想肆意浪费。如果一个模块在初始化时请求了一个IRQ,那么即使驱动程序只是占用它而未使用,也将会阻止任意一个其它的驱动程序使用该中断。而设备打开的时候申请中断,则可以共享这些有限的资源。 

你可能感兴趣的:(linux学习,linux中断)