[英]Implementing PCIe Linux device driver (want to access my card registers from kernel driver)
我正在編寫一個設備驅動程序來訪問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%08x\n", address, data);
產出: -
address:0xfd500000, data:0xffffffff
我可以從mmap用戶空間讀取x80000000+KNOWN_REG_LOCATION
。
3)我已經嘗試了__raw_readl
/ readl
沒有運氣。
4)我可以只讀取當前映射的地址x80000000
嗎?
伊恩
我為設備編寫了一個PCI驅動程序( 完整源代碼 )。 寄存器空間的映射應該是相同的。 我就是這樣做的。
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 FAILED\n",
&((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 FAILED\n",
&((dm7820_device->device_name)[0]), address, (address + length - 1));
dm7820_release_resources();
return -EBUSY;
}
地址和長度值從pci_resource_start()
和pci_resource_length()
調用返回。
然后你可以使用ioread32()
使用dm7820_device->pci[region].virt_addr + <register offset>
來訪問它。
如果您有任何疑問,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.