Expand description
L1: USB トランザクション完了判定(純粋ロジック)。
§なぜ純粋モジュールにするか
usb_transfer は HCINT のビットを見て「成功/再試行/失敗」を決めるが、
この判断を誤ると
- NAK を失敗と誤判定 → 正常な「今はデータ無し」で転送を諦める
- 失敗を成功と誤判定 → 送っていないデータを送信済み扱いし、 データトグルとシーケンス番号がずれる(静かに壊れる)
- STALL を再試行 → 永久ループ
のいずれかになる。受信側 (
usb_rx_state.rs) で同種の欠陥 (NAK 誤分類でチャネル永久停止)を実際に踏んでいるので、 送信側も同じ形で保証する。
§典拠
USB 2.0 §8.5(Transaction packet sequences)、 DWC2 の HCINT ビット定義。
Enums§
- TxnOutcome
- トランザクションの判定結果。
Constants§
Functions§
- classify
- HCINT からトランザクションの結末を判定する。
- should_
advance_ toggle - この結末でデータトグルを進めてよいか。
- should_
retry - この結末で再試行してよいか。
- transferred_
len - 転送済みバイト数を求める。
requestedは要求長、remainingは HCTSIZ の残り。