我在飞思卡尔MPC8308处理器(基于PowerPC架构)上使用PCI-e端口,在尝试使用它时我遇到了一些问题。端点PCI-e设备的内存空间等于256 MB.通过使用"pciutils“包,我可以轻松地读写端点设备的配置空间。
在配置寄存器中写入正确的值并获得访问内存空间的权限之后,我尝试使用C中的"mmap()“函数访问内存空间,并使用位于以下位置的文件描述符:
"/sys/devices/pci0000:00/0000:00:00.0/resource0“
这正好是256 MB (等于端点设备的内存空间),所以我似乎使用了正确的路径作为文件描述符。在这里,您可以使用https://github.com/billfarrow/pcimem中提到的"mmap()“找到我的代码
https://github.com/billfarrow/pcimem/blob/master/pcimem.c
但不幸的是,当我试图使用"mmap()“函数的返回地址来使用内存空间时,我无法正确读取端点设备的只读寄存器。另外,当我读取大于“0x7FFFFC”的地址时,MPC8308将重新启动。考虑到上述情况,我是否错过了初始化PCI-e接口的任何步骤?我是否应该更改Linux内核映像或U代码中的任何内容?在mmap()中使用PowerPC PCI-e有什么不同吗?您有任何示例代码可以帮助我读取PCI-e内存空间吗?
谢谢
发布于 2017-05-31 17:47:43
mmap()是从用户空间访问PCIe设备的一种非常有用但随意的方式。
我注意到您将0作为mmap的第一个参数传递。在我的x86卡插入到一台x86计算机的情况下,我打电话给lspci,以获取pcie插槽中卡的物理地址。然后,我使用这个物理地址作为mmap的第一个参数。我知道你在写设备配置空间中的条形图,但可能会用lspci进行二次检查。
$ sudo lspci -s 02:00 -v
02:00.0 Memory controller: Xilinx Corporation Device 8028
Subsystem: Xilinx Corporation Device 0007
Flags: bus master, fast devsel, latency 0, IRQ 11
Memory at f7e00000 (32-bit, non-prefetchable) [size=1M]
Capabilities: [80] Power Management version 3
Capabilities: [90] MSI: Enable- Count=1/1 Maskable- 64bit+
Capabilities: [c0] Express Endpoint, MSI 00
Capabilities: [100] Advanced Error Reportinghttps://stackoverflow.com/questions/40395221
复制相似问题