Linux驱动设计编译错误信息集锦

时间:2023-03-09 13:11:19
Linux驱动设计编译错误信息集锦

1、warning: passing argument 2 of 'request_irq' from incompatible pointer type

http://blog.sina.com.cn/s/blog_7321be1101012gek.html

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

问题出在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)//正确写法

原因从内核源码入手。。。
在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才是正确的!

2、WARNING: "__bad_udelay" undefined!

原因:udelay()的参数过大。

内核中对udelay()的定义:

......

#define MAX_UDELAY_MS 2

#define udelay(n)

  (__builtin_constant_p(n)?                \

    ( (n)>(MAX_UDELAY_MS *1000)?__bad_udelay() : __const_udelay((n)*((2199023U*HZ)>>11)) ): \

    __udelay(n) )

......

3、