irq_to_desc 函数因 IRQ 号而失败

irq_to_desc function failing with IRQ number

我正在尝试为 IRQ 行 43 安装 IRQ 处理程序,如下所示:

ret2 = request_irq(irq_no, handle_interrupt, IRQF_SHARED, DEVICE_NAME, &pdev->dev);

但我一直收到 rquest_irq 失败,-22 是无效输入。查看内核代码后,我可以看到函数 request_threaded_irq() 在以下点 returning 与 -EINVAL:

desc = irq_to_desc(irq);
if (!desc) {
    printk(KERN_EMERG "%s:%d\n", __func__, __LINE__);
    return -EINVAL;
}

任何人都可以帮助我理解 irq_to_desc() 函数为 return NULL 的原因吗? 我在 mips 机器上使用内核版本 4.11。

谢谢。

如果相应的 IRQ 号未映射到任何已分配的 IRQ 描述符,则对 irq_to_desc() 的调用可能会失败。如果启用 CONFIG_SPARSE_IRQ 内核配置,IRQ 描述符将存储在基数树中。否则 IRQ 号和描述符之间存在直接转换。

IRQ 描述符通常在注册中断控制器驱动程序时分配。您可以参考中断控制器的数据表或您正在使用的平台的数据表。

您可以检查 IRQ 43 是否对您的中断控制器有效。可以从设备的设备树节点中找到中断控制器信息(在设备树节点中查找 interrupt-parent)。

希望对您有所帮助。