Expand description
L1: USB バルク転送のデータトグル(DATA0/DATA1)管理。
§なぜ純粋モジュールにするか
データトグルがずれると、デバイスは受け取ったパケットを「重複」とみなして 黙って捨てる。エラーも出ないまま通信が止まるため、 今回の「NAK でチャネルが張り付く」欠陥と同じく発見が難しい。 レジスタから独立した純粋ロジックにして単体試験で固定する。
§USB 2.0 の規則(§8.6 Data Toggle Synchronization)
- バルク転送は DATA0/DATA1 をトランザクションごとに交互に使う
- ACK されたときだけトグルを進める
- NAK ではトグルを進めない(デバイスは受け取っていない)
- STALL 後はエンドポイントを CLEAR_FEATURE でリセットし、DATA0 に戻す
- 送信側の複数パケット転送では、パケット数の偶奇でトグルが決まる
Enums§
- TxnResult
- トランザクションの結果。
Constants§
- PID_
DATA0 - パケット識別子(DWC2 の HCTSIZ PID フィールド表現)。
- PID_
DATA1 - PID_
DATA2 - PID_
SETUP_ MDATA
Functions§
- advance
- 1 トランザクションの結果からトグルを更新する。
- advance_
by_ packets - 複数パケットをまとめて送った場合のトグル更新。
- packet_
count - 転送長と最大パケットサイズからパケット数を求める。
- pid_
from_ toggle - トグル値を HCTSIZ に書く PID 値へ変換する。
- toggle_
from_ pid - DWC2 の HCTSIZ PID フィールドからトグル値を復元する。
Type Aliases§
- Toggle
- トグル値(0 = DATA0, 1 = DATA1)。