2

私は新しい USB デバイスに取り組んでおり、データの切り替えを追跡/管理する方法を理解しようとしています。Web 上には相反する情報がありますが、ほとんどの意見/経験では、特定のセットアップ転送を除いて、デバイスは列挙後にデータの切り替えを決して変更しないというものです。

これは、仕様の私の読みと矛盾しているようです。

バルク転送に関して、USB2.0 仕様のセクション 8.5.2 には、「ホストは常に構成イベントを使用して DATA0 PID へのバス転送の最初のトランザクションを初期化します。2 番目のトランザクションは DATA1 PID を使用し、後続のデータ転送は残りのデータ転送を交互に行います。一括転送。」

私がここで得ていないのは (おそらく私が誤解していたのかもしれません)、バルク転送のようなものはないように思われることです。少なくとも、このレベルのプロトコルでは何もありません。バルク トランザクションのみがあります --> IN/OUT-DATA0/1-HANDSHAKE ...もしそうなら、セクション 8.5.2 に従ってデータ トグルがトグルするのはいつですか?

さらに、セクション 8.5.3 では、「SETUP は常に、SETUP トランザクションのデータ フィールドに DATA0 PID を使用する」と述べています。

さらに同じセクションで、「ステータス ステージは、前のステージからのデータ フローの方向の変更によって線引きされ、常に DATA1 PID を使用する」と述べられています。

ここで、開始されるセットアップ転送で応答していると仮定します。

SETUPTOKEN|DATA0|ハンドシェイク、

次に、で始まる一連のトランザクション

IN|DATA1|HANDSHAKE であり、ステータス フェーズの前に IN|DATA1|HANDSHAKE で終了します。

この時点で、データのトグルが 0 になることを期待しています (DATA1 を送信して ACK を受信した後、次のパケットの DATA0 を見越して、トグルが 1 から 0 に切り替わりました...わかっています。ステータス フェーズを期待する必要がありますが、ポイントを示そうとしています)。

現在、ステータス フェーズは USB 2.0 仕様に準拠しています。

OUT|DATA1| しかし、私のデータトグルは0です。

しかし、トグルに干渉しないと、DATA1 を無視して応答しない必要があり、ホストが何度も再送信する必要があるため、行き詰まります。

したがって、トグルの不一致を無視し、ACK を送信し、トグルを 0 のままにする (つまり、データ トグルが Data1 と一致したふりをして、次の非 SETUP 転送/トランザクションを見越してそれを反転させる) ことによって、ここで介入する必要がありますか?

私が読んだ意見に従うと、デバイスが STALL を返す以外に解決策はありません。

この問題に関するいくつかの助けをいただければ幸いです。事前に感謝します。

編集:

たぶん私は質問を言い換える必要があります - 私は setion 8.5.2 を誤解していますか? 「バス転送」の代わりにコントロール転送を意味していますか? 直前のトランザクションで使用されたデータ パケット タイプ (Data0 または Data1) に関係なく、コントロール転送のリセット フェーズ中に主要な OS (存在する場合) が Data1 トランザクションを強制するかどうかを確認できますか?

4

2 に答える 2