1

これはばかげた質問かもしれませんが、

組み込み Linux を実行する ARM-CortexM4 プラットフォーム (STM32F4 シリーズ) で USB ストレージ デバイスをデバッグしていました。ARM は USB ホストとして動作しており、USB のフル スピード (12Mb/s) でサム ドライブと通信しようとします。

ここに問題があります。列挙が成功し、BULK 転送を介していくつかの SCSI コマンドが実行されると、容量とすべてを正しく読み取ることができます。しかし、約 15 秒後にこれらの SCSI コマンドを (同じ条件で) 再度送信しようとすると、USB ホスト コントローラーは「トランザクション エラー」を返します。ホスト コントローラがタイムアウトします。問題は、タイムアウト後にシステムを再列挙または再プローブする必要があるような USB 大容量ストレージ クラスまたは SCSI システムのタイムアウト メカニズムがあるかどうかです。

これは、私のプログラムのばかげたエラーが原因であるか、特定のハードウェアの制限が原因である可能性があることを理解しています。しかし、PC 上の Linux で usbmon モジュールを使用してまったく同じサム ドライブで転送をキャプチャすると、オペレーティング システムが実際にシーケンス プローブ コマンド (Read-max-Lun に続いて Test-unit-ready) を 5 ごとに送信することがわかります。これが、私の PC でサム ドライブが故障しない理由である可能性があります。

ありがとう!返信をお待ちしております。

4

1 に答える 1

0

Test Unit Ready コマンドについては、正しい方向に進んでいると思います。組み込みデバイス用の大容量ストレージ デバイス ドライバを作成している最中です。OS X でテストすると、最初の SCSI クエリの後、デバイスが Test Unit Ready コマンドは、他のアクティビティが発生していないときに約 1 秒に 1 回発行されます。あなたの投稿はかなり古いので、問題を解決した場合は独自の解決策を投稿することをお勧めします。

それ以外の場合は、他にアクティビティがないときに、ホスト側から定期的なテスト ユニット準備完了コマンドを追加してみてください。タイマーが作動したら、テスト ユニット準備完了コマンドを送信できます。すすぎを繰り返します。

于 2015-03-28T04:04:15.700 に答える