这是我的问题。我当前正在更新Arm嵌入式Linux机器的内核,从 4.1 更改为 4.14.73 。
我正遇到司机的问题。对于内核4.1,在向request_irq
注册irq之前,IRQF_VALID
将为驱动程序设置标志set_irq_flags
。
如here所述,
set_irq_flags是特定于ARM的,带有具有genirq的自定义标志 等价物。转换驱动程序以直接使用genirq接口,因此 我们可以杀死set_irq_flags。标志的翻译如下:
IRQF_VALID
->!IRQ_NOREQUEST
IRQF_PROBE
->!IRQ_NOPROBE
IRQF_NOAUTOEN
->IRQ_NOAUTOEN
因此,我将set_irq_flags
替换为irq_clear_status_flags(irq, IRQ_NOREQUEST)
。
问题是,现在request_irq
调用返回-16
(-EBUSY
),我不知道为什么。我检查了每个被请求的irq(在运行时),它们都与此驱动程序所请求的不一样。
我还注意到了日志中的这一行:
genirq:标记irq 40不匹配。00000004(digitalGPIO)与00000000((null))
我对(null)
设备名称感到困惑。
我在做什么错了?
我希望我提供了足够的上下文信息。
答案 0 :(得分:0)
最后,很明显,在我的模块加载之前,IRQ确实已经以not shared
的方式注册。
这是由于我使用的内核发生了变化,这是基于Linux内核的基于 的Altera修订版。他们在以前的内核更新中更改了与此IRQ相关的驱动程序的行为。
我无法理解的是为什么以前的请求被记录为(null)
而不是正确的名称。要显示有关谁先前请求过IRQ的正确信息的唯一方法是直接在Altera内核中将其设置为shared
。