我打算在Linux中编写一个PCIe基本串行I / O卡驱动程序。
据我所知,通过配置空间,它提供了中断线,通过IRQF_SHARED
标志,我们可以与相应的IRQ
线共享中断处理程序。
但我的困惑是如何知道哪一行共享或不共享?
答案 0 :(得分:1)
对于设备驱动程序,没有任何有用的方法(尤其是没有可移植方式)来确定中断线是否实际共享,并且这可以通过加载/卸载其他驱动程序随时更改。 PCI驱动程序必须始终假设它们的中断可能是共享的。
注意:PCI Express设备应支持从不共享的MSI(消息信号中断)。 如果可能,您的驱动程序应启用MSI。 但是,不保证系统支持它们。
答案 1 :(得分:1)
内核辅助探测
Linux内核提供了一个用于探测中断号的低级设施。有用
仅适用于非共享中断,但大多数硬件能够使用
共享中断模式提供了更好的方法来查找配置的中断号码
无论如何。该工具由两个函数组成,在<linux/interrupt.h>
中声明
(也描述了探测机器):
unsigned long probe_irq_on(void);
此函数返回未分配中断的位掩码。司机必须预先
提供返回的位掩码,稍后将其传递给probe_irq_off
。在这个电话之后,
驱动程序应安排其设备生成至少一个中断。
int probe_irq_off(unsigned long);
设备请求中断后,驱动程序调用此函数,通过
作为其参数的先前由probe_irq_on
返回的位掩码。 probe_irq_off
返回“probe_on”之后发出的中断号。如果没有
rupts发生,返回0(因此,IRQ 0无法被探测,但没有cus-
无论如何,tom设备可以在任何支持的架构上使用它。如果超过
发生一个中断(模糊检测),probe_irq_off
返回负数
值。
程序员在调用后应小心启用设备上的中断
probe_irq_on
并在调用probe_irq_off
之前禁用它们。另外,你
必须记住在probe_irq_off
之后为设备中的待处理中断提供服务。
答案 2 :(得分:0)
运行cat /proc/interrupt
。在输出的最右列,您应该在其中一条中断线上看到您的设备。如果它已共享,您也会看到分配给该中断的其他设备。