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");