我正在尝试编写一个可用于服务 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?