したがって、問題は次のように説明できます。
- 2 つの CompactPCI バス (一方に 6 つ、他方に 5 つ) を介して接続された 11 個の完全に等しい PCI デバイスを取得しました。
- sysfs ファイルシステムを介してデバイスのリソースにアクセスしようとしています (例:
/sys/class/pci_bus/0000:04/device/0000:04:0d.0/resource1
. 最初の 4 つのデバイスは、リソースへの読み取り/書き込みアクセスを問題なく許可しますが、次のようになります。 - 両方のバスの 5 番目と 6 番目のデバイスは機能しません。すべてのファイルが存在しますが、書き込まれた値に関係なく、すべての読み取り操作で大量の FF が返されるため、書き込みが成功したかどうかはわかりません。最初の 4 つのうちの 1 つが物理的に取り外されると、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]
本当にコードを表示する必要があるかどうかはわかりません。コードは可能な限り単純であるためです。ファイルが開かれ、mmap され、結果のポインターがそのファイルへの書き込みと読み取りに使用されます。
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 に関するエラーはありません。