USBに関しての雑多なメモ。
#ホストとデバイス
- USBの世界においてはホストが絶対的
- すべての通信は基本的にホストから通信を開始する
- デバイスはホストからの要求にこたえる形で自身の情報を送ったり、データを送ったりしている
#デバイス接続時の動作
- デバイスがD+/-のどちらかをプルアップ(+5V)する
- D-がプルアップされたときはLow Speed接続
- D+がプルアップされたときはHigh SpeedまたはFull Speed接続となる
- デバイスがHigh Speed接続に対応しているときはUSBリセットの期間中にホストからのChirpパケットに対して反応する
- ホストはChirpパケットに対してデバイスから反応がなかったらFull Speed接続で接続するようになる
#USBの転送について
大まかな流れとしては、エニュメレーション通信をして、ホストがデバイスの情報を取得し、そのあとにデータのやり取りを実施する。
###転送の種類
- コントロール転送
- デバイスの能力に関する情報をやりとりする転送
- エニュメレーション通信はコントロール転送により実現している
- セットアップステージ、データステージ、ステータスステージという一定の構造を持っている
- クラスまたはベンダが独自に定義したリクエストも送ることが可能
- バルク転送
- 時間に制約のないデータの転送に利用される
- 大量のデータ転送に向いている
- ホストからプリンタにデータを送る、スキャナからホストへデータを送る場合などに使われている
- 優先度が低く、バスがビジー状態の場合はバルク転送は転送を待たされる
- インタラプト転送
- 指定された時間内にデータを転送する必要がある場合に使用
- マウスやキーボードなど
- ホストは常にポーリングでリクエストを出し、デバイスが素早くデータを返すことにより、割り込みのようなかたちに見える転送である
- アイソクロナス転送
- データが一定速度、かつ特定の時間内に送られなければならない転送に使われる
- リアルタイムに動画や音声をストリーミングで流す場合に有用
###IN転送とOUT転送について
#USBの状態遷移
以下の状態を遷移する。
- Attached
- USBデバイスがホストに接続された状態
- Powered
- USBデバイスがホストに接続され、デバイスにVbus電力を供給開始した状態
- Default
- バスリセットが行われ、通信ができるようになった状態
- Adress
- USBデバイスにアドレスを割り当てた状態
- Configured
- USBデバイスのConfigurationが終了し、利用可能な状態
- Suspended
- バス上に3ms以上の状態変化がなかった場合に、電力を制限するモード
###エニュメレーション通信
- ホストがデバイスの情報を取得するときの通信。
- ホストからデバイスへ、デバイスに関する情報(どういう機能のデバイスか等)が書かれているディスクリプタという構造体を要求し、デバイスはそのディスクリプタをホストへ送る。
- エニュメレーションの間、ホスト、デバイスはPowered、Default、Adress、Configuredの4つの状態を遷移する。
####エニュメレーション通信のステップ
- ユーザーがデバイスをUSBポートに接続
- ハブはデバイスを検出
- ホストは新しいデバイスについて知る
- デバイスがLow SpeedかFull Speedかをハブが検出
- ハブはデバイスをリセット
- Full SpeedデバイスがHigh Speedをサポートしているかをホストが知る
- ハブがデバイスとバスの間に信号バスを確立
- ホストはGet_Descriptorリクエストを送り、デフォルトパイプの最大パケット長を知る
- ホストのアドレス割り当て
- ホストがデバイスの性能について把握
- ホストはデバイスドライバを割り振り、ロードを行う
- ホストのデバイスドライバがコンフィギュレーションを選択する