小编Doc*_*lle的帖子

内核模块中的中断处理:request_irq() 返回 -22,无效参数

我正在尝试在由 gpio 中断触发的内核模块中设置一个中断处理程序,但似乎我没有request_irq()正确使用-function...我正在通过以下方式获取我的 irq-numbergpio_to_irq()这似乎有效。然后我打电话

request_irq(irqNumber, handler, 0, "GPIO_Test", NULL);
Run Code Online (Sandbox Code Playgroud)

但它返回-22,无效参数。我认为它可能是处理程序函数,因为我不确定它的签名 - 有时它被定义为void handler (int irq, void *dev_id, struct pt_regs *regs),有时被定义为static irqreturn_t handler(int irq, void *data)- 在这种情况下使用哪个是正确的,为什么有这两种完全不同的变体?我都试过,但总是得到相同的无效参数错误。

编译器给我一个关于我的处理程序函数的返回类型的警告:使用时:

static irqreturn_t handler(int irq, void *data)
{
    /*interrupt-handling*/

    return IRQ_HANDLED;
}
Run Code Online (Sandbox Code Playgroud)

»irq_handler_t« 预期,但参数类型 »enum irqreturn_t (* (*)(int, void *))(int, void *)«

...当使用:

void handler (int irq, void *dev_id, struct pt_regs *regs){/*interrupt-handling*/}
Run Code Online (Sandbox Code Playgroud)

»irq_handler_t« 预期,但参数类型 »void (*)(int, void *, struct pt_regs *)«

感谢您的支持 ;)

c interrupt linux-kernel

6
推荐指数
1
解决办法
3448
查看次数

标签 统计

c ×1

interrupt ×1

linux-kernel ×1