linux 中断函数返回值的分析
(2016-09-06 15:55:31)分类: LINUX |
from:http://blog.chinaunix.net/uid-25014876-id-90740.html
from:http://blog.sina.com.cn/s/blog_a6559d9201015vx9.html
注册中断处理函数:
int request_irq(unsigned int irq, irq_handler_t handler,
unsigned long irqflags, const char *devname, void *dev_id)
使用:
将中断号irq与中断处理函数handler对应
参数:
irq:指定要分配的中断号,中断号的定义在“include/mach/irqs.h”中。注意,不管是单独占有中断请求线的中断,还是共享中断请求线的每个中断,都有一个对应的中断号。,所以,调用该函数不需要考虑是哪种中断(是否共享寄存器),你想哪种中断响应,你就填对应的中断号。
handler:中断处理函数指针。
irqflags:中断处理标记,待会介绍:
devname:该字符串将显示在/proc/irq和/pro/interrupt中。
dev_id:ID
返回值:成功返回0,失败返回非0。
注册函数需要注意两件事:
1)该函数会睡眠。
2)必须判断返回值。
中断处理标志irqflags,这里先介绍几个待会要用的:
29 #define IRQF_TRIGGER_NONE 0x00000000
30 #define IRQF_TRIGGER_RISING 0x00000001 //上升沿触发中断
31 #define IRQF_TRIGGER_FALLING 0x00000002 //下降沿触发中断
32 #define IRQF_TRIGGER_HIGH 0x00000004 //高电平触发中断
33 #define IRQF_TRIGGER_LOW 0x00000008 //低电平触发中断
34 #define IRQF_TRIGGER_MASK (IRQF_TRIGGER_HIGH | IRQF_TRIGGER_LOW | \
35 IRQF_TRIGGER_RISING | IRQF_TRIGGER_FALLING)
36 #define IRQF_TRIGGER_PROBE 0x00000010
释放中断处理函数:
void free_irq(unsigned int irq, void *dev_id)
编写中断处理函数:
中断处理函数声明如下:
static irqreturn_t intr_handler(int irq, void *dev_id)
先看第一个参数irq,这是调用中断处理函数时传给它的中断号,对于新版本的内核,这个参数已经用处不大,一般只用于打印。
第二个参数dev_id,这个参数与request_irq()的参数dev_id一致,由于待会的程序我并不需要用这个参数,所以先不介绍。
再看返回值,中断处理函数的返回值有三个:
21 #define IRQ_NONE (0) //如果产生的中断并不会执行该中断处理函数时返回该值
22 #define IRQ_HANDLED (1) //中断处理函数正确调用会返回
23 #define IRQ_RETVAL(x) ((x) != 0) //指定返回的数值,如果非0,返回IRQ_HADLER,否则
26 #ifndef IRQ_NONE //返回IRQ_NONE。