PCI Express中断驱动程序

时间:2016-10-16 07:52:57

标签: linux-device-driver kernel-module pci-e

Hello iam开发Xilinx FPGA与Intel PC之间的PCIe通信... 我写了一个内核模块(linux驱动程序),我正在使用INTx中断。 我正面临中断处理的问题......

在加载内核模块之前:

来自lspci:INT A - > 11;

从配置读取:INT A - > 11;

来自/ proc / interrupts的

:没有因为irq没有注册

加载内核模块后:

来自lspci:INT A - > 16;

从配置读取:INT A - > 11;

来自/ proc / interrupts的

:INT 11已注册

当我在FPGA中运行程序时,它正在向IRQ-16发送中断并且说没有人关心并且它已被禁用。

我的module_init中的

request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev));

我的irq处理程序:

static irqreturn_t XPCIe_IRQHandler(int irq, void *dev_id, struct pt_regs *regs)
{    return IRQ_HANDLED; }

所以任何人都可以说出问题所在......

2 个答案:

答案 0 :(得分:0)

您没有显示dev->gIrq的设置位置,但您的内核模块应该从与您的设备关联的struct pci_dev中获取中断号码。在include/linux/pci.h中查看此评论:

struct pci_dev {
    ...
    /*
     * Instead of touching interrupt line and base address registers
     * directly, use the values stored here. They might be different!
     */
    unsigned int    irq;

答案 1 :(得分:0)

是的吉尔, 感谢您的回复.. 在代码中

 request_irq(dev->gIrq, XPCIe_IRQHandler, IRQF_SHARED, gDrvrName, gDev));

dev-> gIrq只是我从pci_dev结构中获取的内容。

Andy iam没有使用任何MSI或MSI-X中断来使用pci_alloc_irq_vectors()。