我在 Freescale MPC8308 处理器(基于 PowerPC 架构)上使用 PCI-e 端口,在尝试使用它时遇到一些问题。端点 PCI-e 设备的内存空间等于 256 MB。我可以使用“pciutils”包轻松读取和写入端点设备的配置空间。
在配置寄存器中写入正确的值并获得访问内存空间的权限后;我尝试使用 C 中的“mmap()”函数访问内存空间,并使用位于以下位置的文件描述符:
“/sys/devices/pci0000:00/0000:00:00.0/resource0”
这正好是 256 MB(等于端点设备的内存空间),所以看来我正在使用正确的文件描述符路径。在这里您可以使用“mmap()”找到我的代码,如中所述https://github.com/billfarrow/pciem https://github.com/billfarrow/pcimem:
https://github.com/billfarrow/pcimem/blob/master/pcimem.c https://github.com/billfarrow/pcimem/blob/master/pcimem.c
但不幸的是,当我尝试使用“mmap()”函数的返回地址来使用内存空间时;我无法正确读取端点设备的只读寄存器。另外,当我读取大于“0x7FFFFFC”的地址时,MPC8308 会重新启动。
考虑到上述情况,我是否错过了初始化 PCI-e 接口的任何步骤?我应该更改 Linux 内核映像或 U-Boot 代码中的任何内容吗?将 PowerPC PCI-e 与 mmap() 一起使用有什么不同吗?你有任何示例代码可以帮助我读取 PCI-e 内存空间吗?
Thanks
mmap() 是一种从用户空间访问 PCIe 设备的非常有用但随意的方法。
我注意到您将 0 作为第一个参数传递给 mmap。在将 FPGA 卡插入 x86 计算机的情况下,我调用 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
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)