在我的项目中,我想开发一个具有32位MSI处理程序的pcie linux设备驱动程序。为此,我编写了这样的代码:
if((pci_resource_flags(dev,i)&IORESOURCE_TYPE_BITS)==IORESOURCE_MEM)
{
printk(KERN_INFO "memmap1");
devInfo->resource[i].type=IORESOURCE_MEM;
devInfo->resource[i].flag=pci_resource_flags(dev,i);
devInfo->resource[i].RegsLength=(u32)pci_resource_len(dev,i);
devInfo->resource[i].RegsBase=ioremap_nocache(pci_resource_start(dev,i),pci_resource_len(dev,i));
devInfo->resource[i].PhysBase.QuadPart=(u64)pci_resource_start(dev,i);
if(devInfo->resource[i].RegsBase==NULL)
{
printk(KERN_ERR "pci_ioremap_bar da hata olustu!n");
return -ENOMEM;
}
printk(KERN_INFO "Birinci bar icin type:%d",devInfo->resource[0].type);
printk(KERN_INFO "Birinci bar icin register length:%d",devInfo->resource[0].RegsLength);
}
if(pci_enable_msi(dev))
{
printk(KERN_WARNING "MSI enable basarisiz oldun");
return -1;
}
if(request_irq(dev->irq, irq_handler, 0,"bbn_fpga", NULL))
{
printk(KERN_WARNING "MSI register edilemiyorn");
return -ENODEV;
}
devInfo->flag=0;
printk(KERN_INFO "iowrite icerisine giriyorum");
iowrite32((u32) 0x80000000,&devInfo->resource[0].RegsBase);
if(devInfo->flag==0)
{
printk(KERN_ERR "Interruptn");
return -1;
}
static irqreturn_t irq_handler(int irq, void *dev_id)
{
printk(KERN_INFO "(irq_handler): Calledn");
return IRQ_HANDLED;
}
在这里,我写了 80000000 到寄存器基础以创建一个 MSI 中断,尽管它不起作用。从这里如何获取 32 位 MSI 中断?
MSI 中断由 - 生成
PCIe endpoint generating a memory write transaction to the specified
address in MSI capability register
因此,从CPU到MSI地址的内存写入不会做任何事情。它必须是来自 PCIe 端点的内存写入事务。