【发布时间】:2015-01-30 08:43:20
【问题描述】:
所以,问题可以描述如下:
- 我们有 11 个完全相等的 PCI 设备,通过两条 CompactPCI 总线连接,一个上 6 个,另一个上 5 个。
- 我们正在尝试通过 sysfs 文件系统访问设备的资源,例如:
/sys/class/pci_bus/0000:04/device/0000:04:0d.0/resource1。前 4 台设备允许对其资源进行读/写访问而没有问题,但是: - 两条总线的第5个和第6个设备都不工作:所有文件都存在,但是所有读取操作都返回一堆FF,无论写入的值如何,所以我不能说写入是否成功.当前 4 个设备中的一个被物理移除时,第 5 个设备开始照常工作,总线上的 6 个设备与 6 个设备相同。看起来它每条总线只能与 4 个设备一起使用,而不是更多。需要注意的是,根据规范,CompactPCI 允许在总线上同时使用 7 个 PCI 设备。
- 这不可能是硬件问题,因为 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 embedded mmap pci sysfs