USB

イントロダクション

USB(Universal Serial Bus)を考えるに当たって、 次のような目標を掲げたそうで、すべてその目標はクリアされています。 規格は次のようになっています。 USBの帯域幅は1.5Mビット/秒と12Mビット/秒と480Mビット/秒の3種類があります。 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つのパケットに相当します。まずはトランザクションを分類してみます。 コントロール転送は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バイトです。また、バルク転送と違って転送は 多少複雑になりますので、 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をクリアする要求が受け付けられるまでは通信を再開 してはなりません。
ハンドシェークフェーズでハンドシェークを受け取らなかった時 ホストはタイムアウトを検出します。何回かの再実行はしなければ なりませんが、その後は別のアクションを取る必要があります。