Linux内核中断
步骤一:打开内核源代码,在里面搜索interrupt.h文件
打开文件后我们可以在里面看到这样的函数
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文件
首先我们看到手册里中断号,外部中断4-7,8-23都是共用一个中断
但是在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)