Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 请求返回-22(-EINVAL)_C_Module_Linux Kernel_Interrupt - Fatal编程技术网

C 请求返回-22(-EINVAL)

C 请求返回-22(-EINVAL),c,module,linux-kernel,interrupt,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); 我注意到了一个类似的问题,但我没有使用IRQF\u SHARED标志,因此没有理由认为它可能与dev\u id为NULL冲突。但它仍然无法注册测试irq,错

request_irq的原型是:

int request_irq (   unsigned int    irq,
    irq_handler_t   handler,
    unsigned long   irqflags,
    const char *    devname,
    void *      dev_id);
我注意到了一个类似的问题,但我没有使用
IRQF\u SHARED
标志,因此没有理由认为它可能与dev\u id为NULL冲突。但它仍然无法注册测试irq,错误号总是
-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");
#包括
#包括
#包括
#包括
#包括
#包括
静态irqreturn\u t irq\u句柄(int-irq,void*dev\u id)
{
printk(“发生了irq\n”);
返回已处理的IRQ_;
}
静态int irq_test_init(void)
{
int rc=请求irq(50,irq句柄,IRQF禁用,“irq测试”,NULL);
如果(rc!=0){
printk(KERN_INFO“未能注册测试irq,错误号:%d\n”,rc);
返回-1;
}
printk(KERN_INFO“成功请求irq\n”);
返回0;
}
静态无效irq_测试_退出(无效)
{
自由irq(50,空);
printk(内核信息“irq模块已删除!\n”);
返回;
}
模块初始化(irq测试初始化);
模块退出(irq测试退出);
模块许可证(“GPL”);

你确定irq号
50
?是因为irq号吗?因为在将irq num设置为10后,我可以成功注册irq。irq编号50不在/proc/interrupts中,为什么我不能使用它?@LPs实际上我想要请求的是irq 20,这在英特尔手册中被描述为“虚拟化异常(#VE)”。这个系统保留的irq号LKM无法使用吗?大约50取决于您的平台,根据我的实际arm9目标,我在中断50处有一个ecspi。关于中断20应该可用。@如果我使用的是x86平台,在哪里可以找到可用的中断?