USB On-The-Goについてのメモ
USB On-The-Goとは
1つのUSB機器がHostとDevice両方の役割を果たすために作られたUSBの規格である。
HNPとSRPについて
Host Negotiation Protcol(HNP)
OTGデバイス同士の役割を交代するときに使用される。
最初のエニュメレーションの時にはホストは通常通りにデバイスをエニュメレーションする。
OTGとして認識する手順は以下。
この時、Aコネクタ及びミニAコネクタで接続されている機器が最初はホストとして認識され、その片割れがデバイスとして認識される。
- ホストはエニュメレーションの時に、デバイスからのOTGディスクリプタからHNPをサポートしているかどうかを確認する。
- デバイスがHNPをサポートしていれば、ホストはhnp_enableというリクエストコードを使ってSet_Featureリクエストを送る。
- このリクエストを受け取れば、デバイスはバスがサスペンドしているときにホストとして機能できるようになる。
この後にデバイスがホストとして動作するには、以下の手順が必要。(元々ホストとして認識された機器を機器A、デバイスとして認識された機器を機器Bとする。)
- 機器Aがバスをサスペンドさせる
- Full Speedの場合、機器BがD+のプルアップをオフにして、バスの接続を解除。High Speedの場合は、機器Bが1-147msの間D+の抵抗をオンにしてから、抵抗をオフにする。そうするとバスがSE0ステートになる。
- 機器AがSE0ステートを検知し、D+の抵抗をオンにすることで、デバイスとして接続しなおす。そうすると、バスがJステートになる。
- 機器BがJステートを検出し、バスをリセット。
- 機器Bが機器Aをエニュメレートして通信ができるようになる。
その後、機器Bがデバイスとして戻す場合は以下の手順
- 機器Bはバスをサスペンドさせ、プルアップ抵抗をオンにする。
- 機器Aはサスペンド状態を検出して、プルアップ抵抗をオフにする、またはセッション終了のため、Vbus電源を落とす。
- ステップ1において、機器Bがプルアップ抵抗をオンにしなかった場合は、機器Bはこの段階でプルアップ抵抗をオンにして、ペリフェラルとして接続する。この時バスがJステートとなる。
- Vbusがある場合、機器AはJステートを検出し、バスをリセットする
- 機器Aは機器Bをエニュメレートし、通信ができるようになる
Session Request Protcol(SRP)
ホストがSuspend状態になっているときに、セッションの再開を要求するための通信に使われる。