我在飞思卡尔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()”函数的返回地址来使用内存空间时;我无法正确读取端点设备的只读寄存器.此外,当我读取大于“0x7FFFFFC”的地址时,MPC8308重新启动.
考虑到上述情况,我是否会错过任何初始化PCI-e接口的步骤?我应该更改Linux内核映像或U-Boot代码中的任何内容吗?使用PowerPC PCI-e与mmap()有什么不同吗?你有任何可以帮我读取PCI-e内存空间的示例代码吗?
谢谢
解决方法:
mmap()是一种非常有用但随意的方式从用户空间访问PCIe设备.
我注意到你传递0作为mmap的第一个参数.在我插入x86计算机的FPGA卡的情况下,我打电话给lspci以获取pcie插槽中卡的物理地址.然后我使用该物理地址作为mmap的第一个参数.我知道你在设备的配置空间中写了BAR,但也许用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 Reporting