【问题标题】:PCI Express interrupts in driver驱动程序中的 PCI Express 中断
【发布时间】:2017-02-25 08:37:51
【问题描述】:

您好,我正在开发 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));

我的中断处理程序:

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

所以任何人都可以说出问题可能是什么......

【问题讨论】:

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


    【解决方案1】:

    您没有显示您的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;
    

    【讨论】:

    • 在最新的内核中你甚至不应该这样做,而是使用pci_alloc_irq_vectors() & Co。
    【解决方案2】:

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

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

    dev->gIrq 只不过是我从 pci_dev 结构中获取的而已。

    和

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

    【讨论】:

      猜你喜欢
      • 2020-10-17
      • 1970-01-01
      • 2013-03-02
      • 2016-04-26
      • 2012-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多