Linux内核中断:request_irq,free_irq



Linux内核中断

 

步骤一:打开内核源代码,在里面搜索interrupt.h文件

        Linux内核中断:request_irq,free_irq

     打开文件后我们可以在里面看到这样的函数

typedef irqreturn_t (*irq_handler_t)(int,void *);

申请中断号

request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags,

           const char *name, void *dev);

irq:中断号,是request_irq函数传递给handler中断函数的int参数。

handler:中断处理函数

flags:如果是外部中断,可以设置为上下降沿触发或电平触发

name:随便取的名字

dev:是request_irq函数传递给handler中断函数的void *参数。

注销中断号

extern void free_irq(unsigned int, void *);

void *:是注册中断request_irq函数传递给handler中断函数的void *参数的

那么中断号在哪里定义了?

搜索irqs.h文件

Linux内核中断:request_irq,free_irq

首先我们看到手册里中断号,外部中断4-7,8-23都是共用一个中断

Linux内核中断:request_irq,free_irq

但是在irqs.h里我们看到,内核重新定义了中断号,把中断号4-7,8-23分开来了,这样不用我们再编写驱动的时候去特别处理判断中断源

#define IRQ_EINT4     S3C2410_IRQ(32)  /* 48 */

#define IRQ_EINT5     S3C2410_IRQ(33)

#define IRQ_EINT6     S3C2410_IRQ(34)

#define IRQ_EINT7     S3C2410_IRQ(35)

#define IRQ_EINT8     S3C2410_IRQ(36)

#define IRQ_EINT9     S3C2410_IRQ(37)

#define IRQ_EINT10    S3C2410_IRQ(38)

#define IRQ_EINT11    S3C2410_IRQ(39)

#define IRQ_EINT12    S3C2410_IRQ(40)

#define IRQ_EINT13    S3C2410_IRQ(41)

#define IRQ_EINT14    S3C2410_IRQ(42)

#define IRQ_EINT15    S3C2410_IRQ(43)

#define IRQ_EINT16    S3C2410_IRQ(44)

#define IRQ_EINT17    S3C2410_IRQ(45)

#define IRQ_EINT18    S3C2410_IRQ(46)

#define IRQ_EINT19    S3C2410_IRQ(47)

#define IRQ_EINT20    S3C2410_IRQ(48)  /* 64 */

#define IRQ_EINT21    S3C2410_IRQ(49)

#define IRQ_EINT22    S3C2410_IRQ(50)

#define IRQ_EINT23    S3C2410_IRQ(51)