gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:44:03 39 4
gpt4 key购买 nike

我正在尝试在由 gpio 中断触发的内核模块中设置中断处理程序,但我似乎没有使用 request_irq() 函数正确的...我正在通过 gpio_to_irq() 获取我的 irq-number,这似乎有效。那我打电话

request_irq(irqNumber, handler, 0, "GPIO_Test", NULL);

但它返回 -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;
}

»irq_handler_t« expected, but argument has type »enum irqreturn_t (* (*)(int, void *))(int, void *)«

...以及使用时:

void handler (int irq, void *dev_id, struct pt_regs *regs){/*interrupt-handling*/}

»irq_handler_t« expected, but argument has type »void (*)(int, void *, struct pt_regs *)«

感谢您的支持;)

最佳答案

问题 (-EINVAL) 不是由 handler 引起的,因为内核无法在运行时确定其签名。

此外,在通过request_irq() 请求 IRQ 时,永远不会调用 handler(除非定义了 CONFIG_DEBUG_SHIRQ_FIXME,并且 [使用错误的签名] 这只会在参数验证之后导致未定义的行为,而不是之前,因此此时返回 -EINVAL 的可能性很小。

在正确设置 IRQ 之前需要验证 4 个关键点:

  • irqflags - 你没有设置,通过检查。
  • irq_to_desc() - 将通过 irq_desc_tree 查找 irq。如果没有找到,将返回 -EINVAL。否则,返回一个指向 irq 描述符结构的指针 (struct irq_desc *)
  • irq_settings_can_request() - 检查是否可以请求 IRQ。您可以通过调用 int can_request_irq(unsigned int irq, unsigned long irqflags) before request_irq() 轻松排除这种情况。
  • handler - 将检查 handler 是否为 NULL。在你的情况下,它不是。

所以基本上你只有两个可能导致问题的检查,其中一个你可以在调用 request_irq() 之前使用 can_request_irq() 排除, 但不幸的是,这在模块下是不可能的,因为 can_request_irq 符号没有导出。

但如果您有耐心和时间,您可以使用内置代码构建一个新镜像,只需查看 can_request_irq() 检查是否通过即可。如果是,则导致问题的唯一检查是 irq_to_desc(),这意味着 irq 无效。

无法进一步扩展此答案,因为我无法从您的问题中获得更多信息,但我希望它能帮助您走上正轨。

顺便说一下,指出 irq_handler_ttypedef 可能会有用:

include/linux/interrupt.h:92(在 4.5 树上):

typedef irqreturn_t (*irq_handler_t)(int, void *);

关于c - 内核模块 : request_irq() returns -22, 中的中断处理无效参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38853849/

39 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com