request_irq returns -16 (-EBUSY)
request_irq returns -16 (-EBUSY)
这是我的问题。我目前正在更新 arm 嵌入式 Linux 机器的内核,从 4.1 到 4.14.73.
我遇到了驱动程序问题。对于内核 4.1,就在使用 request_irq
注册 irq 之前,IRQF_VALID
标志将由 set_irq_flags
.
为驱动程序设置
如文档所述here、
set_irq_flags is ARM specific with custom flags which have genirq
equivalents. Convert drivers to use the genirq interfaces directly, so
we can kill off set_irq_flags. The translation of flags is as follows:
IRQF_VALID
-> !IRQ_NOREQUEST
IRQF_PROBE
-> !IRQ_NOPROBE
IRQF_NOAUTOEN
-> IRQ_NOAUTOEN
因此,我将 set_irq_flags
替换为 irq_clear_status_flags(irq, IRQ_NOREQUEST)
。
事情是,现在 request_irq
调用 returns -16
(-EBUSY
),我不知道为什么。我检查了每个请求的 irq(在运行时),它们都与该驱动程序请求的不同。
我也注意到日志中的这一行:
genirq: Flags mismatch irq 40. 00000004 (digitalGPIO) vs. 00000000 ((null))
我对(null)
设备名称很疑惑
我做错了什么?
我希望我包含了足够的上下文信息。
最后,很明显,在加载我的模块之前,IRQ 确实已经注册为 not shared
。
这是由于我使用的内核发生了变化,它是基于 linux 内核的 Altera 修订 。他们在之前的内核更新中更改了与此 IRQ 关联的驱动程序的行为。
我不明白的是为什么之前的请求被记录为 (null)
而不是正确的名称。显示有关谁先前请求 IRQ 的正确信息的唯一方法是直接在 Altera 内核中将其设置为 shared
。
这是我的问题。我目前正在更新 arm 嵌入式 Linux 机器的内核,从 4.1 到 4.14.73.
我遇到了驱动程序问题。对于内核 4.1,就在使用 request_irq
注册 irq 之前,IRQF_VALID
标志将由 set_irq_flags
.
如文档所述here、
set_irq_flags is ARM specific with custom flags which have genirq equivalents. Convert drivers to use the genirq interfaces directly, so we can kill off set_irq_flags. The translation of flags is as follows:
IRQF_VALID
->!IRQ_NOREQUEST
IRQF_PROBE
->!IRQ_NOPROBE
IRQF_NOAUTOEN
->IRQ_NOAUTOEN
因此,我将 set_irq_flags
替换为 irq_clear_status_flags(irq, IRQ_NOREQUEST)
。
事情是,现在 request_irq
调用 returns -16
(-EBUSY
),我不知道为什么。我检查了每个请求的 irq(在运行时),它们都与该驱动程序请求的不同。
我也注意到日志中的这一行:
genirq: Flags mismatch irq 40. 00000004 (digitalGPIO) vs. 00000000 ((null))
我对(null)
设备名称很疑惑
我做错了什么?
我希望我包含了足够的上下文信息。
最后,很明显,在加载我的模块之前,IRQ 确实已经注册为 not shared
。
这是由于我使用的内核发生了变化,它是基于 linux 内核的 Altera 修订 。他们在之前的内核更新中更改了与此 IRQ 关联的驱动程序的行为。
我不明白的是为什么之前的请求被记录为 (null)
而不是正确的名称。显示有关谁先前请求 IRQ 的正确信息的唯一方法是直接在 Altera 内核中将其设置为 shared
。