今天在些key的driver的时候。。。写完了编译出现一个warmming如下:
warning: passing argument 2 of 'request_irq' from incompatible pointer type
我的request_irq函数调用如下:
if(request_irq(key_info->irq_no, key_eint_handler, IRQF_DISABLED,"Mini2440_Key", &i))
{
return -1;
}
key_eint_handler函数的原型如下:
static void key_eint_handler(int irq, void *dev_id,struct pt_regs *regs)
报警的提示意思是第二个参数指针类型不匹配。本来觉得不匹配也就是一个warning没关系,不过后来还是想找到为什么。。。
于是乎。。。经过网络的一阵搜索。。。
结果出来了。。。
问题出在
key_eint_handler函数的原型,
应该由:
static void key_eint_handler(int irq, void *dev_id,struct pt_regs *regs)//错误的写法
改为:
static irqreturn_t key_eint_handler(int irq, void *dev_id)//正确写法
为什么呢?
按照宋宝华老师书上写的是3个参数的那种写法呀。。。
于是从内核源码入手。。。
在
linux/include/linux/interrupt.h, line 60 左右有这么一个定义
typedef irqreturn_t (*irq_handler_t)(int, void *);
这个定义是什么意思呢?
它是指:定义一种函数指针类型irq_handler_t, 这种函数的返回类型为irqreturn_t,参数列表为int, void*
再来看request_irq的函数声明部分
kernel/irq/manage.c:
int request_irq(
unsigned int irq,
irq_handler_t handler,
unsigned long irqflags,
const char *devname,
void *dev_id)
request_irq的第二个参数是handler函数,类型是irq_handler_t,
也就是说:我定义的handler函数返回类型为irq_handler_t,
结合最上面说的
typedef irqreturn_t (*irq_handler_t)(int, void *);
那么。。。
handler函数应该是写成:
static irqreturn_t key_eint_handler(int irq, void *dev_id)//正确写法
2个参数。。。返回类型为irqreturn_t才是正确的!
以上是个人理解。。。
参考文章链接:
据网上资料摘录如下:
request_irq() 函数原型的变化
Linux-2.6.22 中request_irq() 函数原型与之前版本略有改动:
/********************************/
Linux-2.6.22.6
include/linux/irqreturn.h:typedef int irqreturn_t;
include/linux/interrupt.h:typedef irqreturn_t (*irq_handler_t)(int, void *);
kernel/irq/manage.c:int request_irq(
unsigned int irq,
irq_handler_t handler,
unsigned long irqflags,
const char *devname,
void *dev_id)
/********************************/
Linux-2.6.13
include/linux/interrupt.h:typedef int irqreturn_t;
kernel/irq/manage.c:int request_irq(
unsigned int irq,
irqreturn_t (*handler)(int, void *, struct pt_regs *),
unsigned long irqflags,
const char * devname,
void *dev_id)
/********************************/
阅读(2627) | 评论(1) | 转发(1) |