Chinaunix首页 | 论坛 | 博客
  • 博客访问: 323196
  • 博文数量: 61
  • 博客积分: 1400
  • 博客等级: 上尉
  • 技术积分: 789
  • 用 户 组: 普通用户
  • 注册时间: 2009-08-05 22:48
文章分类
文章存档

2012年(1)

2011年(2)

2010年(22)

2009年(36)

我的朋友

分类: LINUX

2009-09-20 22:13:29

今天在些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)

/********************************/
阅读(2540) | 评论(1) | 转发(1) |
给主人留下些什么吧!~~

fensryper2009-09-22 13:29:27

中国移动将大力推广OPhone 手机操作系统和手机,先进的平台和人性化的操作界面,将得到广大手机用户的追捧,为手机软件市场带来巨大商机。欢迎程序员访问。http://www.ophonesdn.com/