1

したがって、問題は次のように説明できます。

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

本当にコードを表示する必要があるかどうかはわかりません。コードは可能な限り単純であるためです。ファイルが開かれ、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 に関するエラーはありません。

4

1 に答える 1

0

かなり長い間、私はこの質問に答えることにしました。私は自分で問題を解決できず、Linux カーネルの PCI 関連コードのメンテナに電子メールを書きました。何がうまくいかなかったのかを突き止めようと何十回も試みた後、私たちはただやめました - 私は別のプロジェクトに切り替える必要があり、余暇は終わりました。発見された唯一のことは、そのような構成では mmap を使用できないことです (これは、sysfs ファイルシステムを介して BAR にアクセスする主要な方法です)。その代わりに、まったく同じことを行う単純な PCI ドライバーを開発しましたが、読み取り/書き込み操作を使用して動作しました。

基本的、

kernel -> userspace - result

ioremap -> read/write - works
ioremap -> mmap - doesn't work
sysfs -> mmap - doesn't work
于 2016-03-28T14:36:11.743 に答える