微星注册 pcie 设备驱动程序



在我的项目中,我想开发一个具有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 端点的内存写入事务。

相关内容

最新更新