我正在尝试编写一个内核模块,我可以使用它来服务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设置为pin 0(保留中断已禁用),那么dev->irq会指向我的MSI中断@ 576吗?
发布于 2014-06-17 14:41:50
对于MSI,您需要首先使用pci_enable_msi在设备上启用MSI中断。MSI中断与“标准PCI”中断不一样。调用pci_enable_msi后,中断号应该从pci_dev->irq获得,用于调用request_irq。在内核源代码树中寻找一个示例。
更多信息见文档/PCI/MSI-HOWTO.txt
https://stackoverflow.com/questions/24264030
复制相似问题