8

USB デバイスのコードを書いています。USB ホストがデバイスからデータを読み取るために制御読み取り転送を開始し、要求されたデータの量 (セットアップ パケットの wLength) がエンドポイント 0 の最大パケット サイズの倍数であるとします。次に、ホストがすべてのデータを (最大サイズのデータ​​ パケットを含むいくつかの IN トランザクションの形式で) 受信した後、別の IN トランザクションを開始して、それ以上データがない場合でも、さらにデータがあるかどうかを確認しますか?

私が疑問に思っている一連のイベントの例を次に示します。

  1. USB 列挙プロセス: エンドポイント 0 の最大パケット サイズは 64 と報告されています。
  2. SETUP-DATA-ACK トランザクションは、コントロール リード転送を開始します (wLength = 128)。
  3. IN-DATA-ACK トランザクションは、データの最初の 64 バイトをホストに配信します。
  4. IN-DATA-ACK トランザクションは、データの最後の 64 バイトをホストに配信します。
  5. 長さ 0 の DATA パケットの IN-DATA-ACK ? このトランザクションは発生しますか?
  6. OUT-DATA-ACK トランザクションは、転送のステータス フェーズを完了します。転送が終了しました。

私はこれを自分のコンピューター (問題がある場合は Windows Vista) でテストしましたが、答えは「いいえ」でした。デバイスから送信されたすべてのパケットがいっぱいだったとしても、ホストはデバイスからこれ以上データを受信できないことを十分に認識していました (エンドポイント 0 で許可される最大サイズ)。十分に賢くなく、別の IN トランザクションを実行しようとして、長さゼロのデータ パケットを受信することを期待するホストがあるかどうか疑問に思っています。

usb.org から USB 2.0 および USB 3.0 仕様の関連部分を読んだと思いますが、この問題が解決されていませんでした。どちらかのドキュメントの正しいセクションを教えていただければ幸いです。

ホストが wLength で要求したよりも少ないデータをデバイスが送信することを選択した場合、長さ 0 のパケットが必要になる可能性があることはわかっています。

どちらの場合も処理できるようにコードを柔軟にできることはわかっていますが、そうする必要がないことを願っています。

この質問に答えられる人に感謝します!

4

4 に答える 4

11

USB 仕様をよくお読みください:

エンドポイントからホストへの制御転送のデータ ステージは、エンドポイントが次のいずれかを実行したときに完了します。

  • セットアップ段階で指定された正確な量のデータを転送しました
  • ペイロード サイズが wMaxPacketSize 未満のパケットを転送するか、長さ 0 のパケットを転送します

したがって、あなたの場合、wLength == 転送サイズの場合、答えは NO です。ZLP は必要ありません。

wLength > 転送サイズ、および (転送サイズ % ep0 サイズ) == 0 の場合、答えが YES の場合、ZLP が必要です。

于 2012-04-20T05:51:14.940 に答える
5

一般に、USB は最大長未満のパケットを使用して、転送の終了を区別します。そのため、max-packet-length の整数倍の転送の場合、ZLP が境界に使用されます。

これはバルクパイプでよく見られます。たとえば、4096 バイトの転送がある場合、これは整数の最大長パケットと 1 つのゼロ長パケットに分割されます。SW ドライバーに十分な受信バッファーが設定されている場合、ZLP が発生すると、上位レベルの SW が転送全体を一度に受信します。

コントロール転送は、wLength フィールドがあるため特別なケースであり、ZLP は厳密には必要ありません。

ただし、異なる USB ホスト シリコンまたは低レベルの HCD ドライバーでバリエーションが見られる可能性があるため、SW は両方に対して柔軟であることを強くお勧めします。

于 2011-01-15T23:27:07.140 に答える
4

MBRの回答を拡張したいと思います。USB 仕様 2.0のセクション 5.5.3 には、次のように記載されています。

エンドポイントからホストへの制御転送のデータ ステージは、エンドポイントが次のいずれかを実行したときに完了します。

  • セットアップ段階で指定された量のデータを正確に転送した
  • ペイロード サイズが wMaxPacketSize 未満のパケットを転送するか、長さ 0 のパケットを転送します

データ ステージが完了すると、ホスト コントローラーは別のデータ トランザクションを続行する代わりに、ステータス ステージに進みます。 データ ステージが完了したときにホスト コントローラーがステータス ステージに進まない場合、セクション 5.3.2 で概説したように、エンドポイントはパイプを停止します。エンドポイントから予想以上のデータ ペイロードを受信した場合、コントロール転送の IRP は中止または破棄されます。

デバイスが何をすべきかを具体的に述べているように見えるため、その引用の文の1つに強調を追加しました。ホストがデータフェーズの完了後にデータフェーズを続行しようとした場合、パイプを「停止」する必要があり、すべての場合に完了します要求されたデータが送信されました (つまり、転送されたバイト数が 以上ですwLength)。停止とは、STALL パケットを送信することを指すと思います。

言い換えれば、デバイスはこの状況では長さゼロのパケットを必要とせず、実際、USB 仕様ではゼロ長のパケットを提供すべきではないと述べています。

于 2014-01-02T21:31:19.760 に答える
1

その必要はありません。(*)

wLength の要点は、ホストが読み取ろうとする最大バイト数をホストに伝えることです (ただし、読み取れるバイト数が少なくなる可能性があります!)

(*) コントロール転送中 (ホスト ソリューションのデバッグ中) に IN/OUT 要求が不適切なタイミングで行われたときにデバイスがクラッシュするのを見てきました。したがって、あなたが心配していることをしているホストは、それらのデバイスを殺してしまい、うまくいけば市場に出ません.

于 2010-09-21T12:57:29.807 に答える