首页 > 解决方案 > request_irq 返回 -16 (-EBUSY)

问题描述

这是我的问题。我目前正在更新 arm 嵌入式 Linux 机器的内核,从4.14.14.73

我遇到了一个司机的问题。在内核 4.1 中,在使用 注册 irq 之前,将为驱动程序设置request_irq标志。IRQF_VALIDset_irq_flags

如此处所述

set_irq_flags 是 ARM 特定的,具有与 genirq 等效的自定义标志。将驱动程序转换为直接使用 genirq 接口,这样我们就可以杀死 set_irq_flags。flags的翻译如下:

IRQF_VALID->!IRQ_NOREQUEST

IRQF_PROBE->!IRQ_NOPROBE

IRQF_NOAUTOEN->IRQ_NOAUTOEN

因此,我set_irq_flagsirq_clear_status_flags(irq, IRQ_NOREQUEST).

问题是,现在request_irq调用返回-16( -EBUSY),我不知道为什么。我检查了每个请求的 irq(在运行时),它们都与该驱动程序请求的不同。

我还注意到日志上的这一行:

genirq:标志不匹配 irq 40. 00000004 (digitalGPIO) vs. 00000000 ((null))

我对(null)设备名称感到非常困惑。

我究竟做错了什么?

我希望我包含了足够的上下文信息。

标签: linuxkerneldriverirq

解决方案


最后,很明显,IRQ 确实not shared在我的模块被加载之前就已经注册了。

这是由于我使用的内核发生了变化,这是基于linux 内核的 Altera 版本。他们在之前的内核更新中更改了与此 IRQ 关联的驱动程序的行为。

我无法理解的是为什么先前的请求被记录为(null)而不是正确的名称。显示先前请求 IRQ 的正确信息的唯一方法是将其设置为shared直接在 Altera 内核中。


推荐阅读