我正在尝试在由 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 *)«
感谢您的支持 ;)