我正在修改 Linux PCIe 驱动程序以与 altera FPGA PCIe 内核配合使用。在我的驱动程序代码中, 我执行 pci_set_master(dev) 以使 PCIe 读写工作正常。
我使用 altera SG-DMA 进行 PCIe 传输,而不是使用 ARM DMA。 我需要向 FPGA DMA 写入启用位以启动传输。通过对启用位寄存器执行 pcie write(barx,offset,data) 可以完美地工作。
问题是,我需要我的系统在 I/O 中断发生时启动 PCIe FPGA DMA,但是当中断发生时,在 ISR 内部我放置了 pcie write(barx,offset,data),这导致整个 linux 卡在那里。
有人遇到过这种情况吗?请帮我。 提前致谢。
最佳答案
根据我的说法,你的问题不是FPGA,而是你的中断处理方式。您可能想要隔离此问题并使用适当的标签进行询问。不要包括 PCIe 或 FPGA,因为它们很可能不是您当前问题的一部分。
对于不同的 FPGA,您用于 SGDMA 的 PCIe 驱动程序是不同的。由于您手动调用读取和写入 PCIe-FPGA 接口(interface)的函数,看起来这部分(PCIe 驱动程序)也可能没有问题。您使用的功能不会被其他人知道,因此在您的问题中也没有必要分享该功能。
我建议您阅读有关 IO 中断处理的更多信息。尝试除轮询中断事件之外的其他操作。
关于linux - ISR 内的 PCIe 读写,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16909120/