linux-kernel – 实现PCIe Linux设备驱动程序(想从内核驱动程序
我正在编写一个设备驱动程序来访问PCIe卡上FPGA中的内存.
卡片启动并被探测/发现: – 的/ proc / IOMEM 80000000-840fffff : PCI Bus #03 80000000-83ffffff : 0000:03:00.0 84000000-840fffff : 0000:03:00.0 所以读取ldd / etc我在80000000编写了对request_mem_region的调用,并通过ioremap_nocache请求指向它的指针 1)我是否需要request_mem_region以及ioremap_nocache,我不能只使用后者? / proc / iomem insmod我的设备驱动程序后: – 80000000-840fffff : PCI Bus #03 80000000-83ffffff : 0000:03:00.0 80000000-8003ffff : fp2 84000000-840fffff : 0000:03:00.0 2)对我来说看起来不太合适……? 无论如何,读取不起作用(它没有编码如下,它有检查等): – #define BAR_ADDR 0x80000000 void *base = ioremap_nocache(BAR_ADDR,0x40000); void *address = base + KNOWN_REG_LOCATION; int data = ioread32(address); printk("fp2: address:0x%08x,data:0x%08xn",address,data); 产出: – address:0xfd500000,data:0xffffffff 我可以从mmap用户空间读取x80000000 KNOWN_REG_LOCATION. 3)我已经尝试了__raw_readl / readl也没有运气. 4)我可以只读取当前映射的地址x80000000吗? 解决方法
伊恩
我为设备编写了一个PCI驱动程序(full source).寄存器空间的映射应该是相同的.我就是这样做的. dm7820_device->pci[region].virt_addr = ioremap_nocache(address,length); if (dm7820_device->pci[region].virt_addr == NULL) { printk(KERN_ERR "%s: ERROR: BAR%u remapping FAILEDn",&((dm7820_device->device_name)[0]),region); dm7820_release_resources(); return -ENOMEM; } if (request_mem_region(address,length,&((dm7820_device->device_name)[0])) == NULL) { printk(KERN_ERR "%s: ERROR: I/O memory range %#lx-%#lx allocation FAILEDn",(address + length - 1)); dm7820_release_resources(); return -EBUSY; } 地址和长度值从pci_resource_start()和pci_resource_length()调用返回. 然后你可以使用imad32()使用dm7820_device-> pci [region] .virt_addr< register offset>来访问它. 如果您有任何疑问,请告诉我. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |