1. 外部中断框架
-
中断号:通过中断号即可区分不同的中断
- 申请中断号 step 3
request_irq 函数,申请中断并使能,可能导致睡眠,不能在中断上下文或者其他禁止睡眠的代码段中使用。
/* 函数原型 */ /* * irq: 申请的中断号 * handler: 中断处理函数 * flags: 中断标志 * name: 中断名 * dev: 一般情况下将 dev 设置为设备结构体 */ int request_irq(unsigned int irq, irq_handler_t handler, unsigned long flags, const char *name, void *dev);
flags:在文件 include/linux/interrupt.h 里面查看所有的中断标志
- IRQF_SHARED # 共享中断线,dev 参数作为唯一区分他们的标志 - IRQF_ONESHOT - IRQF_TRIGGER_NONE - IRQF_TRIGGER_RISING # 上升沿触发 - IRQF_TRIGGER_FALLING # 下降沿触发 - IRQF_TRIGGER_HIGH # 高电平触发 - IRQF_TRIGGER_LOW # 低电平触发
name:设置中断后,
cat /proc/interrupts
查看对应的中断名字return:
0
-> 申请成功;-EBUSY
-> 已被申请;other negative value
-> 申请失败- 释放中断号 step 5
free_irq 函数,释放相应的中断,删除中断处理函数并且禁止中断。
void free_irq(unsigned int irq, void *dev);
- 中断处理函数 step 4
使用 request_irq 函数申请中断的时候需要设置中断处理函数。
/* * int: 相应的中断号 * void *: 通用指针,要求与 request_irq 函数的 dev 参数保持一致 * return: irqreturn_t 类型 */ irqreturn_t (*irq_handler_t) (int, void *); /* 示例 */ static irqreturn_t xxx_irq_handler(int irq_num, void *dev){ ...