1

我正在尝试编写一个可用于服务 PCIe MSI 中断的内核模块。现在我在尝试配置我的中断时遇到了麻烦,我正在尝试遵循“Linux Device Drivers Ed. 3”这本书指出:

“驱动程序不需要检查中断号,因为PCI_INTERRUPT_LINE可以保证找到的值是正确的。”

所以当然这似乎是设置我的中断的合乎逻辑的方式:

err = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &myirq);
if(err)
{
    printk(KERN_WARNING "Could not get IRQ number\n");
    return err;
}
err = request_irq(myirq, fpga_isr, IRQF_SHARED, fpga_driver.name, dev);

现在这为我注册了中断 60。然后我开始使用 jTag 手动触发中断,我收到一条内核消息,指出该中断没有附加处理程序(中断 576)。如果我将 irq_line 硬编码为 576,那么 request_irq 就会失败。

找出我的中断线的最佳方法是什么?为什么我不能得到我需要的 IRQ?

还有一件事,在启动过程中,我的设备自动设置为 IRQ 引脚 1(传统中断 A),它对应于 irq 行 572,这也是存储在 dev->irq 中的值。如果引导顺序自动将 IRQ 设置为引脚 0(禁用传统中断),dev->irq 是否会指向我的 MSI 中断@576?

4

1 回答 1

2

对于 MSI,您需要先使用 pci_enable_msi 在您的设备上启用 MSI 中断。MSI 中断与“标准 PCI”中断不同。调用 pci_enable_msi 后,需要从 pci_dev->irq 获取中断号,用于调用 request_irq。在内核源代码树中查找示例。

文档/PCI/MSI-HOWTO.txt 中的更多信息

于 2014-06-17T14:41:50.053 回答