Skip to main content

Module usb_toggle

Module usb_toggle 

Source
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)。