USB
イントロダクション
USB(Universal Serial Bus)を考えるに当たって、
次のような目標を掲げたそうで、すべてその目標はクリアされています。
- ユーザにボードや装置のスイッチ、ジャンパーの設定をさせない。
- 新入出力装置のインストールのために、ユーザにケースを開かせない。
- ケーブルの種類は、すべての装置に適した1種類でなければならない。
- 入出力装置は、ケーブルから自分用に電源を取得できる。
- 1つのコンピュータに127個以下の装置を接続できる。
- システムはリアルタイム装置(例えば、サウンド、電話)をサポート
しなければならい。
- 装置は、コンピュータが動作している間でも、インストールできなければ
ならない。
- 新装置を挿入した後、リブートを要求しない。
- 新しいバスと入出力装置は、メーカにとって安価なものでなければならい。
規格は次のようになっています。
- USB1.0 - 1996年1月
- USB1.1 - 1998年9月
- USB2.0 - 2000年4月
USBの帯域幅は1.5Mビット/秒と12Mビット/秒と480Mビット/秒の3種類があります。
- ロースピード(LS): 1.5Mbps
- フルスピード(FS): 12 Mbps
- ハイスピード(HS):480 Mbps
1つのホストと最大127台のターゲットないしハブから構成されます。
ケーブルはハブ側と装置側で異なるコネクタを持ち、
4ピンから成るコネクタは、
2本のデータ線、1本の電源線(+5ボルト)、1本のグランド線の
合計4本から成っています。
USBの転送方式には制御(control)転送あるいはコントロール転送、
等時(isochronous)転送あるいはアイソクロナス転送、
大量(bulk)転送あるいはバルク転送、割り込み(interrupt)転送あるいは
インタラプト転送の4種類があります。
コントロール転送は、装置の設定、装置へのコマンド送付、装置の状態の
問い合わせなどに使われます。アイソクロナス転送は、サウンド、電話など
正確なタイミングでデータを送受信しなければならない装置のための
転送です。1ミリ秒の周期でデータを正確に転送できるものの、エラーが
起きても再送はしません。バルク転送は、正確なタイミングを必要としない
装置のための転送で、エラー時に再送が行なわれます。インタラプト転送は
USBが計算機への割り込み機構をサポートしないため、
OSが装置に対して周期的にポーリングを行なえるための転送です。
USBは、物理層におけるデータ通信方式にNRZI(Non Return to Zero Invert)
というコード化方式を採用しています。NRZIは、データが1の場合、
ビットを変化させず、データが0の場合にのみ、ビットを反転させます。
転送のメカニズム
4つの転送(トランスファー)はいくつかのトランザクションから成っています。
また、1つのトランザクションは
いくつかのパケットから構成されます。パケットはUSBの時間を確保する単位
です。つまり、パケットは同期パターンに続きパケット識別子(PID)とその
PIDに関連するデータ、最後に5ビットのCRCから成っています。
トランザクションはまた、複数のフェーズから成り、1つのフェーズは
1つのパケットに相当します。まずはトランザクションを分類してみます。
- INトランザクション
- トークンフェーズ:ホストからINトークンパケットを発行する。
- データフェーズ:指定されたターゲットはDATA0またはDATA1データパケットを発行する。
- ハンドシェークフェーズ:ホストはデータパケットを正常に受信すると、ACKを発行する。
- OUTトランザクション
- トークンフェーズ:ホストからOUTトークンパケットを発行する。
- データフェーズ:ホストはDATA0またはDATA1データパケットを発行する。
- ハンドシェークフェーズ:ターゲットはデータパケットを正常に受信すると、ACKを発行する。
- SETUPトランザクション
- トークンフェーズ:ホストからSETUPトークンパケットを発行する。
- データフェーズ:ホストはDATA0データパケット(8バイト)を発行する。
- ハンドシェークフェーズ:ターゲットはデータパケットを受信し、必ずACKを発行する。
- isochronous IN トランザクション
- トークンフェーズ:ホストからINトークンパケットを発行する。
- データフェーズ:指定されたターゲットはDATA0データパケットを発行する。
- isochronous OUT トランザクション
- トークンフェーズ:ホストからOUTトークンパケットを発行する。
- データフェーズ:ホストはDATA0データパケットを発行する。
コントロール転送はSETUPトランザクション、IN/OUTトランザクションを
利用し、セットアップステージ、(データステージ、)ステータスステージを
構成します。セットアップステージは1つのSETUPトランザクションを利用し、
データステージは1つ以上のIN/OUTトランザクションを、ステータスステージは
1つのIN/OUTトランザクションを利用します。バルク転送は1つ以上の
IN/OUTトランザクションを利用します。アイソクロナス転送は
1つ以上のisochronous IN/OUT トランザクションを利用します。
割り込み転送はIN/OUTトランザクションを利用します。
さて、複数のトランザクションは実際にはフレームと呼ばれる単位で
USB上に送られます。つまり、スケジュールの単位は
フルスピードのクラシックフレームにおいては1ミリ秒、ハイスピードの
マイクロフレームにおいては125マイクロ秒です。
1つのフレームはSOFと呼ばれるパケットを先頭にそれぞれ1ミリ秒、125マイクロ
秒の中に複数のトランザクションを入れることができます。
USBの転送スピード
コントロール転送、バルク転送、インタラプト転送、アイソクロナス転送、
4つの転送について最大データサイズ、最大トランザクション数を
リストすると、
- コントロール転送ではハイスピードで最大64バイト、フルスピードで64バイト
- バルク転送ではハイスピードで最大512バイト、フルスピードで64バイト
- インタラプト転送ではハイスピードで最大1024バイト、
フルスピードで64バイト、1フレーム当たりのトランザクション数はハイスピードで最大1マイクロフレームに3回、フルスピードで最大1フレームに1回
- アイソクロナス転送ではハイスピードで最大1024バイト、
フルスピードで1024バイト、1フレーム当たりのトランザクション数はハイスピードで最大1マイクロフレームに3回、フルスピードで最大1フレームに1回
コントロール転送とバルク転送における最大転送スピードを
他に利用されていないと仮定し試算してみましょう。
フルスピードにおいては、コントロール転送のトランザクションの
最大データサイズが64バイトです。また、バルク転送と違って転送は
多少複雑になりますので、
1ミリ秒のフレームに入るコントロールメッセージは13個の
トランザクション(IN/OUT)までなので、コントロール転送の最大転送スピードは
832バイト(64 x 13)、つまり1ミリ秒に832バイト、832KB/sに
なります。
バルク転送のトランザクションの
最大データサイズは、フルスピードにおいては64バイトです。1ミリ秒のフレームに
19個のトランザクション(IN/OUT)を詰め込むことが可能なので、
バルク転送の最大転送スピードは
1216バイト(64 x 19)、つまり1ミリ秒に1216バイト、1。216MB/sの
転送が可能となります。
PC/Linux上でのUSBデバイスドライバ
1つのデバイスドライバは最大16個までのUSBデバイスを操作できます。
USBのデバイスドライバのメジャー番号はすべて180と決まっています。
そのデバイスドライバのマイナー番号は16の倍数からスタートします。
1つのデバイスは1つのデバイス記述子を持ちます。1つのデバイス記述子は
複数のコンフィギュレーション記述子を持つことができ、消費電力とか
以下に示すインターフェースに共通な性質の構成を、コンフィギュレーション記述子
で区別します。1つのコンフィギュレーション記述子は複数の
インターフェース記述子を持つことができます。インターフェースは例えば
ビデオカメラの場合、カメラとマイクロフォンに対応し、
カメラのみ、マイクロフォンのみ、カメラとマイクロフォン両方をアクティブに
するという3つのインターフェース記述子を持つことができます。
1つのインターフェース記述子は複数のエンドポイント記述子を持つことが
できます。エンドポイントはUSBデバイスのデータのソースであったり
データのシンクであったり、つまり終端です。
エンドポイント番号0はすべてのコントロール転送に使われますので、
エンドポイント番号0のための記述子はありません。
エラー処理
コントロール転送、バルク転送、割り込み転送、アイソクロナス転送、
4つの転送に関するエラー処理について記述します。
ハンドシェークフェーズにおいて, ACK, NAK, STALLなどのパケットが
発行されます。ACKはエラーなしにデータの送受信が行なわれたことを
意味します。また、SETUPトランザクションにおいてはデバイスは
必ずACKを返さなければなりません。INトランザクションにおいては
ホストが、OUTトランザクションにおいてはデバイスが発行します。
NAKはデバイスがビジーか返すべきデータがないときに返します。
デバイスが大変ビジーの時、ホストがデータを送って来た時は
デバイスはNAKを返します。ホストがデータを要求した時も
同様に、デバイスはNAKを返します。いずれの場合も、ホストは
後でその処理を再実行します。
STALLはサポートされていないコントロール要求、コントロール要求の
失敗、エンドポイントのフェールを意味します。
エンドポイントがサポートしないコントロール要求があれば、デバイスは
STALLを返します。STALLパケットを受け取ったホストはそのデバイスに
対するあらゆるペンディング要求をキャンセルし、デバイスに
Halt featureをクリアする要求が受け付けられるまでは通信を再開
してはなりません。
ハンドシェークフェーズでハンドシェークを受け取らなかった時
ホストはタイムアウトを検出します。何回かの再実行はしなければ
なりませんが、その後は別のアクションを取る必要があります。