gpt4 book ai didi

linux-kernel - 实现 PCIe Linux 设备驱动程序(想要从内核驱动程序访问我的卡寄存器)

转载 作者:行者123 更新时间:2023-12-02 04:25:16 27 4
gpt4 key购买 nike

我正在编写一个设备驱动程序来访问 PCIe 卡上 FPGA 中的内存。
卡启动并被探测/发现:-

/proc/iomem

80000000-840fffff : PCI Bus #03
80000000-83ffffff : 0000:03:00.0
84000000-840fffff : 0000:03:00.0

因此,阅读 ldd/etc 后,我编写了对 request_mem_region 的调用在80000000 ,并通过 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

我可以阅读x80000000+KNOWN_REG_LOCATION来自 mmap 用户空间。

3) 我已经尝试过__raw_readl/readl也没有运气。

4) 我可以只读取当前映射的地址 x80000000

最佳答案

伊恩,

我为设备 ( full source ) 编写了一个 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>

如果您有任何疑问,请告诉我。

关于linux-kernel - 实现 PCIe Linux 设备驱动程序(想要从内核驱动程序访问我的卡寄存器),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5185397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com