我正在尝试编写一个可以用来为PCIe MSI中断提供服务的内核模块。现在我无法尝试配置我的中断,并试图跟随“Linux设备驱动程序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?
答案 0 :(得分:2)
对于MSI,您需要首先使用pci_enable_msi在设备上启用MSI中断。 MSI中断与“标准PCI”中断不同。在调用pci_enable_msi之后,应该从pci_dev-> irq获取中断号以调用request_irq。在内核源代码树中查找一个示例。
Documentation / PCI / MSI-HOWTO.txt
中的更多信息