USB デバイスのコードを書いています。USB ホストがデバイスからデータを読み取るために制御読み取り転送を開始し、要求されたデータの量 (セットアップ パケットの wLength) がエンドポイント 0 の最大パケット サイズの倍数であるとします。次に、ホストがすべてのデータを (最大サイズのデータ パケットを含むいくつかの IN トランザクションの形式で) 受信した後、別の IN トランザクションを開始して、それ以上データがない場合でも、さらにデータがあるかどうかを確認しますか?
私が疑問に思っている一連のイベントの例を次に示します。
- USB 列挙プロセス: エンドポイント 0 の最大パケット サイズは 64 と報告されています。
- SETUP-DATA-ACK トランザクションは、コントロール リード転送を開始します (wLength = 128)。
- IN-DATA-ACK トランザクションは、データの最初の 64 バイトをホストに配信します。
- IN-DATA-ACK トランザクションは、データの最後の 64 バイトをホストに配信します。
- 長さ 0 の DATA パケットの IN-DATA-ACK ? このトランザクションは発生しますか?
- OUT-DATA-ACK トランザクションは、転送のステータス フェーズを完了します。転送が終了しました。
私はこれを自分のコンピューター (問題がある場合は Windows Vista) でテストしましたが、答えは「いいえ」でした。デバイスから送信されたすべてのパケットがいっぱいだったとしても、ホストはデバイスからこれ以上データを受信できないことを十分に認識していました (エンドポイント 0 で許可される最大サイズ)。十分に賢くなく、別の IN トランザクションを実行しようとして、長さゼロのデータ パケットを受信することを期待するホストがあるかどうか疑問に思っています。
usb.org から USB 2.0 および USB 3.0 仕様の関連部分を読んだと思いますが、この問題が解決されていませんでした。どちらかのドキュメントの正しいセクションを教えていただければ幸いです。
ホストが wLength で要求したよりも少ないデータをデバイスが送信することを選択した場合、長さ 0 のパケットが必要になる可能性があることはわかっています。
どちらの場合も処理できるようにコードを柔軟にできることはわかっていますが、そうする必要がないことを願っています。
この質問に答えられる人に感謝します!