原创 “passing argument 2 0f “request_irq” from incompat

2010-4-8 19:33 3043 9 9 分类: MCU/ 嵌入式

今天在些keydriver的时候。。。写完了编译出现一个warmming如下:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


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_idstruct pt_regs *regs)


 


报警的提示意思是第二个参数指针类型不匹配。本来觉得不匹配也就是一个warning没关系,不过后来还是想找到为什么。。。


 


于是乎。。。经过网络的一阵搜索。。。


结果出来了。。。


问题出在


key_eint_handler函数的原型,


应该由:


static void key_eint_handler(int irq, void *dev_idstruct 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才是正确的!


 


以上是个人理解。。。


参考文章链接:http://topic.csdn.net/u/20090309/14/70503922<?xml:namespace prefix = st1 ns = "urn:schemas-microsoft-com:office:smarttags" />-791a-42c3-abd0-529ec808d7d3.html


 


据网上资料摘录如下:


 


request_irq() 函数原型的变化


 


Linux-2.6.22request_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)


 


/********************************/


 


 


 


转自:http://www.cublog.cn/u3/102839/showart_2056392.html

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
9
关闭 站长推荐上一条 /3 下一条