linux - 通过 sysfs-pci 驱动程序映射 CompactPCI 设备

标签 linux embedded mmap pci sysfs

因此,问题可以描述如下:

  1. 我们得到了 11 个完全相同的 PCI 设备,通过两条 CompactPCI 总线连接,一条连接 6 个,另一条连接 5 个。
  2. 我们正在尝试通过 sysfs 文件系统访问设备的资源,例如: /sys/class/pci_bus/0000:04/device/0000:04:0d.0/resource1。前 4 个设备允许对其资源进行读/写访问而不会出现问题,但是:
  3. 两条总线的第 5 和第 6 个设备不工作:所有文件都存在,但是所有读取操作都返回一堆 FF,无论写入值如何,所以我不能说写入是否成功.当前 4 个中的一个被物理移除时,第 5 个设备开始照常工作,总线上的 6 个设备也是如此,有 6 个设备。看起来每条总线只能处理 4 个设备,不能更多。应该注意的是,根据规范,CompactPCI 允许一次在总线上使用 7 个 PCI 设备。
  4. 这不可能真的是硬件问题,因为 Windows 驱动程序(很久以前由我们无权访问的人开发的)就可以正常工作。

lspci:

03:0b.0 Multimedia controller: Device 6472:8001 (rev 01)
03:0c.0 Multimedia controller: Device 6472:8001 (rev 01)
03:0d.0 Multimedia controller: Device 6472:8001 (rev 01)
03:0e.0 Multimedia controller: Device 6472:8001 (rev 01)
03:0f.0 Multimedia controller: Device 6472:8001 (rev 01)
04:09.0 Multimedia controller: Device 6472:8001 (rev 01)
04:0a.0 Multimedia controller: Device 6472:8001 (rev 01)
04:0b.0 Multimedia controller: Device 6472:8001 (rev 01)
04:0c.0 Multimedia controller: Device 6472:8001 (rev 01)
04:0d.0 Multimedia controller: Device 6472:8001 (rev 01)
04:0f.0 Multimedia controller: Device 6472:8001 (rev 01)

lspci -vv(除了所有 11 个设备的总线编号外都相等):

04:0f.0 Multimedia controller: Device 6472:8001 (rev 01)
Control: I/O+ Mem+ BusMaster- SpecCycle- MemWINV- VGASnoop- ParErr Stepping- SERR- FastB2B- DisINTx-
Status: Cap- 66MHz- UDF- FastB2B- ParErr- DEVSEL=medium >TAbort- <TAbort- <MAbort- >SERR- <PERR- INTx+
Interrupt: pin A routed to IRQ 11
Region 0: I/O ports at d800 [size=128]
Region 1: Memory at febfe800 (32-bit, non-prefetchable) [size=128]

不知道我是否真的需要向您展示代码,因为它尽可能简单 - 打开文件,然后映射,然后使用生成的指针写入和读取该文件。

fd = open ( (device_ + "resource" + std::to_string (i)).c_str(), O_RDWR);
ptr = (u_int32_t*) mmap (NULL, 0x7f, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);

所有路径都恢复正确,这是我首先检查的。

dmesg 没有关于 PCI 的错误。

最佳答案

经过很长一段时间,我决定回答这个问题。自己没有解决问题,给linux kernel中PCI相关代码的maintainer写了一封邮件。经过数十次尝试找出问题所在后,我们才停下来——我不得不切换到另一个项目,空闲时间结束了。唯一被发现的是,在这样的配置中,您不能使用 mmap(这是通过 sysfs 文件系统访问 BAR 的主要方式)。因此,相反,我开发了一个简单的 PCI 驱动程序,它做的事情完全相同,但使用读/写操作,而且它工作正常。

基本上,

kernel -> userspace - result

ioremap -> read/write - works
ioremap -> mmap - doesn't work
sysfs -> mmap - doesn't work

关于linux - 通过 sysfs-pci 驱动程序映射 CompactPCI 设备,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28232135/

相关文章:

c - ELF - 更改入口点时出现 SEGFAULT

python - python 中的 mmap 稀疏向量

linux-device-driver - GPIO如何映射到内存中?

linux - Linux下如何获取并口打印机的状态?

c - Maikefile错误make : *** [prepare] Error 127

azure - Azure上的云架构,用于物联网

c - STM32调试器遇到断点后继续运行

c# - 将 Windows 文件格式转换为 Linux 格式

linux - 用于备份我的 "home"文件夹的 Bash 脚本

android - AOSP repo 同步时间过长