我想在arm64 linux内核模块中注册一个IRQ处理程序,内核版本是5.4.0,我使用
request_irq
并且可以注册。但是当 IRQ 发生时,linux 会报告 Unexpected interrupt received!
。所以我不知道如何解决。
我正在尝试使用
request_irq
在 arm64 Linux 中注册 IRQ 处理程序 ko:
err = request_irq(40, irq_handler, IRQF_SHARED, "hvisor", &hvisor_misc_dev);
一切正常,没有错误。但是当我从 el2 向 el1 注入 IRQ
40
时,Linux 会报告一条消息:
[ 87.294702] Unexpected interrupt received!
[ 87.295733] WARNING: CPU: 0 PID: 0 at drivers/irqchip/irq-gic-v3.c:650 gic_handle_irq+0x124/0x158
为什么会发生这种情况以及如何解决?谁能帮帮我,万分感谢!
我已经找到解决办法了。必须在 dtb 中添加一个假设备,如下所示:
xxx {
compatible = "xxx";
interrupts = <0x00 0x?? 0x01>;
};
哪里?是减去 32 后的 irq 号。然后在 linux ko 中我们必须使用函数
of_find_node_by_path
和 of_irq_get
来检索 irq 号,如下所示:
struct device_node *node = NULL;
node = of_find_node_by_path("/xxx");
int irq = of_irq_get(node, 0);
request_irq(irq, ....);
那么一切就OK了!