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; }
所以任何人都可以说出问题所在......
答案 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()。