request_irq返回-22(-EINVAL)

时间:2016-05-31 13:43:49

标签: c module linux-kernel interrupt

request_irq的原型是:

int request_irq (   unsigned int    irq,
    irq_handler_t   handler,
    unsigned long   irqflags,
    const char *    devname,
    void *      dev_id);

我注意到了一个类似的问题"Simple interrupt handler: request_irq returns error code -22",但我没有使用IRQF_SHARED标志,因此没有理由认为它可能与dev_id为NULL冲突。但它仍然无法注册测试irq,而errno始终是-22(-EINVAL)

这是我简单的irq测试模块:

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/types.h>
#include <linux/interrupt.h>

static irqreturn_t irq_handle(int irq, void *dev_id)
{
        printk("irq happened\n");
        return IRQ_HANDLED;
}
static int irq_test_init(void)
{
        int rc = request_irq(50, irq_handle, IRQF_DISABLED, "irq_test", NULL);
        if(rc!=0){
                printk(KERN_INFO "fail to register test irq, errno:%d\n",rc);
                return -1;
        }
        printk(KERN_INFO "success request irq\n");
        return 0;
}
static void irq_test_exit(void)
{
        free_irq(50, NULL);
        printk(KERN_INFO "irq module removed!\n");
        return;
}


module_init(irq_test_init);
module_exit(irq_test_exit);
MODULE_LICENSE("GPL");

0 个答案:

没有答案