アドレスの設定

USBの世界では、ホスト・コントローラと呼ばれるチップがすべてを決定・支配しており、すべての転送はホストから開始され、周辺機器は転送要求は行えません。つまり、USBの世界では、周辺機器同士の直接的なデータ転送は行えないのです。唯一周辺機器に許されている、ホストへの積極的なアクションはシステムがサスペンドしているときに目覚まし時計のようにシステムを起こすことで、リモート・ウェイク・アップと呼ばれている機能です。
ホスト・コントローラはバスに転送開始を伝えるトークンと呼ばれるパケットをブロードキャストで発行します。USBに接続された周辺機器は接続時にアドレスを割り当てられるので、トークンに含まれるアドレスが自分を示していない限り、自分とは関係ない転送としてこれから行われる転送を無視します。唯一、対応するアドレスをもつデバイスだけが応答します。USB2.0についてもこの点は変わりません。また、定義できるアドレス数も増加しません。

ホスト・コントローラについて

 

Hubのダウンストリーム・ポート

 

アドレスの割り当てはHubのダウンストリーム・ポートがHubとしてPCに正しく認識されるまで無効になっていることを利用して行います。Hubを含めたすべての周辺機器は設定され、固有のアドレスを割り当てられるまで、デフォルトアドレス"00h"に反応することが決められています。まず、PCはひとつめの装置が何であるかを理解し、周辺装置のアドレス設定などの実行や対応するドライバのロードを行います。これをUSBではEnumerationと呼びます。PCはひとつめの周辺装置がHubであることを認識すると、Hubのダウンストリーム・ポートを順番に有効にして、接続されている装置が何であるかを理解し、周辺装置のアドレス設定などの実行や対応するドライバのロードを繰り返し行っていきます。

次にUSB FDDを一例に必要な構成について説明します。USB FDDはUSB環境下での設定のためにControl転送とデータのためのBulk転送、FDの着脱などを通知するInterrupt転送(それぞれの転送の詳細は後述します)が必要になります。周辺機器のアドレスはひとつですから、ホストからどの転送方式で転送を行うかをトークンに載せます。また、周辺機器側では各転送に対してバッファ(FIFO)を持つので、バッファに番号をつけます。各バッファ番号と転送方式の関連づけができれば、トークンにその番号を載せて送るだけで周辺機器側で転送方式を理解できます。USBではこの転送方法と関連づけされたバッファをエンドポイントと呼びます。
Control転送はUSB環境下での設定のために必ず使うので、どのデバイスにも必要です。そのため、Endpoint 0は必ずControl転送に割り当てられます。Control転送は双方向通信ですが、エンドポイントの番号はひとつだけを使います。FDDの場合、Bulk転送では受信用と送信用それぞれにエンドポイントの番号の割り当てが必要になります。これはControl転送が必ず双方向通信になるのに対してBulk転送が受信、送信、双方向の3つのパターンが存在するからです。
Endpointをまとめて考えるのがInterfaceという思想です。Interface毎にPC上のドライバをロードできるので、複数の機能をひとつの装置で比較的容易に実現することができます。

 

インタフェースという思想

ホスト・コントローラ

USB1.xではホスト・コントローラに対して2種類の仕様が定義されています。
ひとつはUniversal Controller Interface(UHCI)と呼ばれているものでIntelが仕様を策定しました。Intelのチップセットを使ったPCにはこの仕様のホストが搭載されています。
もうひとつはOpen Host Controller Interface(OHCI)と呼ばれているもので、Microsoft、Compaq、National Semiconductorが仕様を策定しました。この仕様のチップは数社から発売されています。NECもこの仕様のチップを開発しており、数社からカスタム対応のNEC製チップを使用した製品が販売されています。
USB2.0ではホスト・コントローラに対して1種類の仕様が定義されています。Enhanced Host Controller Interface(EHCI)と呼ばれているもので、Intelが仕様を策定しています。実際のUSB2.0ホスト・コントローラは、EHCIとUSB1.x用のホスト・コントローラをワンチップに搭載して実現されます。NECではOHCIとEHCIを1つのチップに収めたものを開発し、製品化しました。

USB2.0 ホスト・コントローラの仕様

  • USB Host controller:2 OHCI Controller + 1 EHCI Controller
  • USB Interface:2 - 5ダウンストリームポート
  • PCI Interface:32 bit 33 MHz
  • PCI Interface:CLKRUN#サポート
  • PCI ACPI:サポート
  • Legacy function:サポート
  • Package:160 L-QFP, 176 FPBGA

USB 2.0 Controller

本チップを使用した周辺機器開発用のキットがUSB I/Fより発売されています。

 

Peripheral device development kits

データ転送方式

USBは単一形状のコネクタに統合しているので、すべてのUSB機器のデータ転送は同一のプロトコルバスをタイムシェアリングすることで行います。すべてのUSB周辺機器で基本プロトコルは同じになりますから、データの中身に対して異なった意味をもたせるためには、アプリケーションに近い上位のソフトウェアスタックで処理することと時間に対する概念を追加する必要があります。

USBでは転送の種類をInterrupt、Bulk、Isochronous、Controlの4つに分類することで、この2つの仕組みを導入しており、各周辺装置は自分に合った転送方式を選択することで、最適な通信を実現できます。データレートとしては、USB1.xでは12Mbpsのfull-Speedと1.5Mbpsのlow-Speedの2種類をサポートし、USB2.0ではさらに、より高速な480Mbpsのhigh-Speedもサポートするようになりました。

 

  Control転送 Bulk転送 Interrupt転送 Isochronous転送
特徴 周辺機器の制御などに必要な情報のやりとりに使用される転送方式 非周期的に大量データを扱う転送方式 周期的でバンド幅が低いデータ転送方式 リアルタイム性が要求される転送方式
high-Speed 480Mbps 64 byte/packet 512 byte/packet 1-1024 byte/packet 1-1024 byte/packet
full-Speed 12Mbps 8,16,32,64 byte/packet 8,16,32,64 byte/packet 1-64 byte/packet 1-1023 byte/packet
low-Speed 1.5Mbps 8 byte/packet 1-8 byte/packet
転送の優先順位 3 3 2 1
主な用途 すべてのデバイス プリンタ、スキャナ、DSC、FDD、CD-ROMなど(データ転送に高信頼性が必要なもの) マウス、キーボード、ジョイスティックなど スピーカ、マイク、電話など

 

USB1.xでは一つのエンドポイントに対するInterruptまたはIsochronous転送は1 フレーム(後述)に1回以上は行えませんでしたが、USB2.0では一つのエンドポイントに対するInterruptまたはIsochronous転送は1 マイクロフレーム(後述)に3回まのでの転送が許されます。このため、USB1.xではIsochronous転送でも1つのエンドポイントに対して最大1023K byte/sの転送レートでしたがUSB2.0ではInterruptまたはIsochronous転送で1つのエンドポイントに対して最大8 X 3 X 1024K byte/sの転送レートを実現できます。

 

4種類のデータ転送方式について

Interrupt転送

マウス、キーボード、ジョイスティックなどのようなヒューマン・インタフェースに期待される能力は、遅いなどの違和感を感じない一定時間内に、入力されたデータを処理することです。従来は入力の検出によりシステムに割りこみ要求をかけて処理していましたが、USBではすべてのデータ転送の要求はホストから発行され、マウスやキーボードからの割りこみによって処理を開始することはできません。例えば、キーボードによる文字の入力から画面表示までに10msかかったとしても、人間の感覚では遅いと感じることはありませんから、USBでは不都合にならない一定周期ごとにホストがマウスやキーボードからデータを引き取るによって、割り込みによる処理の代替えをしています。この一定周期ごとにホストがデータ送信または受信を行う転送方式をInterrupt転送と定義しています。

1.5Mbpsのlow-SpeedデバイスはInterrupt転送を使う装置でのみ許された特権で、マウス、キーボード、ジョイスティックなどを安価で作るための仕様です。マウス、キーボードを実現するためにはさらにControl転送も利用します。

Bulk転送

プリンタ、スキャナ、デジタル・スチル・カメラ、メモリカード・リーダー、FDD、CD-ROM、CD-R、ZIPなどのように画像入力、印字、ストレージ系の装置に期待されることは、大規模なデータを正確に(データの欠落のないように)転送することです。例えば、プリンタでデータの欠落がおこって印字異常になっては困ります。高いデータ転送の信頼性を実現できますが、バス全体の利用効率を上げるためにデータ転送に対しての時間的制約を設けることのできないデータ送信/受信を行う転送方式をBulk転送と定義しています。
画像入力、印字、ストレージ系の装置の転送レートはバスの利用状況によって大きく変動するため、転送レートに対して厳しいスペックを期待する装置はBulk転送には向きません。なお、画像入力、印字、ストレージ系の装置を実現するためにはさらにControl転送も利用します。

Isochronous転送

スピーカ、マイク、電話、ビデオカンファレンスなどのように、音や動画を扱う装置に期待されることは時間の概念を正しく反映させること、つまりある周期の間に一定量のデータを送らなければなりません。USBでは時間をフレーム(USB2.0ではマイクロ・フレームと定義)という単位で分割し、その中で各転送を割り振ります。
Isochronous転送で最も重要なことは、ある決まった周期に、一定量のデータを転送することです。そのため、転送失敗によるリトライは時間の概念の維持を困難にするので、USBでは行わないようになっています。なお、スピーカなどを実現するためには、さらにControl転送も利用します。

Control転送

このControl転送は、Interrupt、Bulk、Isochronousの各転送方式とは異なり、転送されるデータ自身についても規定がある転送方式です。
デバイスの情報のやり取りやUSB環境下でのアドレス設定、デバイスの設定などに利用されるので、どんなデバイスでも、この転送方式は必ず利用します。

USBでは、これらの転送方法とInterfaceと言う概念を併用することで、いろいろな種類の装置を実現できます。

時間の概念

アドレスの設定が完了すると、実際のPCと周辺機器の間の転送が時分割で実行されます。このとき、ホストは決まったルールに基づき、転送を順番に行っていきます。4つの転送のうち、最も高い優先順位をもつ転送は時間の 概念を維持し続ける必要のあるIsochronousであり、その次は周期的にデバイスへのアクセスを行うInterruptになります。例えば、Hubはホットプラグ対応のため、いつデバイスの着脱がおこるかわからないので、ポートの情報をInterrupt転送によりホストに定期的に通知します。BulkとControlの優先順位もPCによって規定されます。また、全くBulkとControlが発行できない場合が起こらないように(マイクロ)フレームのある時間は必ずBulkとControlに割り当てられるようになっています。

4つの転送について

 

Control転送はUSB環境下での設定のために使うので、この転送で送られるデータは基本的にすべてのUSB周辺機器において同じように理解される必要があります。つまり、 Format、データ内容についてきちんと規定されることになります。一方、Bulk/Interrupt/Isochronous転送はいろいろな周辺機器のデータ転送に使いますから、転送で送るデータの中身に対して定義することはできません。つまり、中身はUSBに取っては特に意味を持ちません。

Format、データ内容について

 

Control / Bulk転送にとってはその転送の性質上、特に時間について検討する必要はありませんが、Isochronous / Interrupt転送では何らかの方法で時間の管理を行う必要があります。USBでは管理している時間の単位をフレーム(USB2.0ではさらにマイクロフレームと言う単位が追加されました)と呼び、(マイクロ)フレーム単位で各転送要求をマネージメントすることで、時間の概念を実現しています。フレームは1ms単位、マイクロフレームは125μs単位です。Non-Periodic(Bulk転送とControl転送)はPeriodic(Interrupt転送とIsochronous転送)の占める時間によって変わります。

フレーム

 

Isochronous / Interrupt転送が(マイクロ)フレーム内の大半を占めてしまうような状況になってしまった場合、時間に対して特に検討しなくても良いとはいえ、全くControl/Bulk転送が行えなくなってしまう可能性があるので、(マイクロ)フレームある範囲は必ずControl / Bulk転送が処理される期間として予約されています。

1. 1Frame内のPeriodic/Non-Periodic

1Frame内のPeriodic/Non-Periodic

2. 各アプリケーションに割り当て

各アプリケーションに割り当て

ホスト・コントローラは(マイクロ)フレーム単位で時間を管理して転送を制御します。周辺機器でのControl / Bulk / Interrupt転送は特に(マイクロ)フレームの区切りを意識する必要はありませんが、 Isochronous転送の場合、システムとの同期を正しくとるために(マイクロ)フレームの区切りを理解する必要があるかもしれません。このため、(マイクロ)フレームの開始を示すStart of Frame(SOF) Packetをホストがバスに発行します。
Start of Frame(SOF) PacketはSYNC → PID → Frame No. → CRC5の4つの部分から構成されます。USB2.0のマイクロフレームで送られるSOF packetも基本的には同じ構成になります。
SYNCは周辺機器のクロックと転送データの同期のために使われます。このSYNCはUSB2.0においてはUSB1.xの場合と多少変わっています。
PIDはPacket Identifierで送信されているパケットが何であるかを示します。SOFを示すPIDはb0101と規定されています。PID部にエラーが発生する場合もあるので、エラー検出のためにPID+PID(1の補数)を送信します。と言うことで、この場合はPIDはA5hになります。
Frame No.はFrame No.を示すフィールド(11bit)でフレーム毎に1つインクリメントされます。USB2.0のマイクロフレームではマイクロフレーム毎に1つインクリメントされるのではなく、8マイクロフレーム毎に1つインクリメントされます(つまり、必ず1msに一回インクリメントされます)。このため、USB2.0のhigh-Speed modeでは8回同じSOFが送信されます。
CRC5はCyclic Redundancy Checkというビットエラーを検出するために付加される5bitのデータで構成されます。これはFrame No.のデータを保護するために使われ、パリティチェックより高い確率でビットエラーの検出が行えます。

USB2.0のSYNCについて

 

なお、すべてのパケットはLSBから送信されますので例えばSYNC80hは左から順番に送られるとするとb00000001のように表されます。
Control / Bulk / Interrupt / Isochronous転送はToken, Data, Handshakeのそれぞれのパケットで構成されます。

SOFパケット構成

 

Tokenは上記で述べたSOFパケットと同じ構成でFrame No.の代わりにAddressとEndpoint番号(SYNC → PID → Address → Endpoint → CRC5)を送ります。Tokenパケットはこれから開始される転送の相手、方向を記すために必ず最初に送られます。データの送受信を行うTOKEN PIDは、Set Address等のUSBリクエストを送信するためのSetup(2Dh)と、In転送の開始を示すIn(69h)、Out転送の開始を示すOut(E1h)の3つに分類されます。
Addressは7bit(127のデバイスアドレスを規定できます。00hはデフォルトアドレスのため、固有アドレスとしては使用できません。)、Endpoint番号は4bitで構成されます。CRC5はAddressとEndpoint番号のデータを保護するために使われます。

Tokenパケット

Tokenに続いてデータを載せて送るDataパケットを送ります。DataパケットはSYNC → PID → Data → CRC16で構成されます。Data パケットを示すPIDはDATA0(C3h)とDATA1(4Bh)を使用します。 この二つのData PIDを交互に利用することで、転送で発生するトラブルをリカバリーすることができます。詳細は後述します。これに続いてデータが送信されますが1つのパケットで転送できるデータ量は0~Max Packet Sizeまでです。 (周辺機器のMax Packet Sizeは規格上のMax Packet Sizeかそれ以下であるFIFOのサイズによって決まります。) CRC16はデータを保護するために使われます。
In Tokenでは返信するデータが存在しない場合にはDataパケットを送信する代わりにHandshake(NAKまたはSTALL) パケットを返信します。 Out Tokenでは受信できない状態でもDataパケットが終わってからHandshake(NAKまたはSTALL)パケットを返信します(USB2.0での追加PID PING & NYET)。
HandshakeパケットはSYNC → PIDで構成されます。Handshakeパケットを示すPIDは 正常に受信できたことを示すACK(D2h)、今は処理が完了していないので送受信を受け付けられないことを示すNAK(5Ah)とシステム的におかしくなってしまったことを示すSTALL(1Eh)の三種類が定義されています。
なお、Isochronous転送ではたとえデータの取りこぼしがあったとしても再転送を行っている暇はないので、Handshake パケットは使いません。

USB2.0での追加PID PING & NYETについて

 

Dataパケット

ホスト周辺

次に各転送におけるホストとファンクション(周辺機器)の動作を説明します。Bulk、Interrupt、Isochronous転送はそれぞれ、InまたはOut転送のいずれかを利用して転送を実現します。
一方、Control転送は他の3つの転送と異なり、Setup/In/Outの転送を組み合わせて使うことで実現されます。USBリクエストを送るSetup転送を利用するSetupステージ、返信や受信のためにIn/Out転送によってデータのやり取りを行うDataステージ、Dataステージとは逆方向の転送(Data ステージがIn転送だったら、Out転送) によってやり取りの結果を通知するStatusステージの3つのステージでControl転送は構成されます。この転送の組み合わせ方でホストからファンクションへの書き込みを行うControl Write転送、ファンクションからホストへの情報の提出を行うControl Read転送とControl Write転送の派生でホストからファンクションへのデータ書き込みのためのDataステージを持たないNo Data Stage転送の3つに分類されます。

 

Control Write転送

Control Write転送

 

Control Read転送

Control Read転送

 

No Data Stage転送

No Data Stage転送

 

Setup転送

 

Setup転送は Control転送のSetup Stageで使用される転送シーケンスで、Token、Dataはホストが発行し、Handshakeをファンクションが発行します。Setup転送ではファンクションはACK応答のみが許されています。

Setup転送

 

In転送

 

In転送は Control転送のDataまたはStatus Stage、Bulk In、Interrupt In転送で使用される転送シーケンスで、Token, Handshakeはホストが発行し、 Dataをファンクションが発行します。 Isochronous転送ではHandshakeは使いません。

In転送

 

Out転送

Out転送は Control転送のDataまたはStatus Stage、Bulk Out、Interrupt Out転送で使用される転送シーケンスで、Token、 Dataはホストが発行し、Handshakeをファンクションが発行します。Isochronous転送ではHandshakeは使いません。

Out転送

 

Handshakeパケットを使うことでデータ転送が成功したかどうかは判断できますが、 Handshakeパケットそのものが欠損した場合、同じものを2回連続で受信してしまうことが考えられます。2回目に受信したデータは不要なものですから、そのデータを処理してはいけません。このため、Data パケットを示すDATA0(C3h)とDATA1(4Bh)を交互に利用することで同じデータが複数回来ていることを認識できるようにしています。ホスト、ファンクションともにエンドポイント単位でシーケンス ビットと呼ばれる受信したDATA PIDの比較対象ビットを備えています。

SETUP

Transfer i

ファンクションが現在処理中で送受信を受け付けられないなら、シーケンスビットを維持したまま、NAKを返信します。もちろん、ホストもACKを受信していないのでシーケンスビットを維持したまま再転送を実施するので、シーケンスビットの同期は維持されます。

Transfer i : Reject Data

データ受信側は正常にデータ受信が完了した上でシーケンスビットが一致していたら、シーケンスビットを反転させた後にACKを返信します。データ受信側が返信したACKが何らかの理由で送信側で受け取れなかった場合、送信側はACKを受信していないため、シーケンスビットを維持したまま再転送を実施します。
このため、シーケンスビットの同期はずれが起こります。データ受信側は再転送時にシーケンスビットが一致していないため、再転送であると判断し、シーケンスビットを維持したまま、ACKを返信し受信データの破棄を行います。データの送信側はACKを受信した後に、シーケンスビットを反転させます。これによりシーケンスビットの復旧は行えます。

Transfer i : Accept Data

Control転送以外のBulk / Interrupt転送では一つエンドポイントに対しては一つの転送方向のサポートしか許されません。このため、In転送でファンクションがACKを受信できなかったとしても、次のIn トークンを受信したときに上述の動作が起こり、シーケンスビットの同期はずれの復旧は行えます。ところがControl Read転送のData ステージでの一番最後のIn転送でファンクションがACKを受信できなかった場合は特殊なケースになります。つまりACKを受信できなかった場合、次のIn トークンを受信できる可能性はなく、Status ステージを示すOut転送が開始されます。このため、Control Read転送ではIn転送でファンクションがACKを受信できなかった場合にその直後にOutトークンを受信したら前回のInはホストによって正しく受信されたものと暗黙のうちに理解して次のシーケンスに進むことが義務づけられています。
Control/ Bulk / Interrupt転送と異なり、Isochronous転送ではバス上でCRCエラー等の問題が入り込む可能性が低いであろうということを拠り所にし、また問題が起こったとしても再転送している時間がないのでHandshakeは使いません。さらにIsochronous転送特有の概念がホスト側との同期の取り方についてです。同期の取り方はAsync/Sync/Adaptiveの3種類が定義されています。Asyncは周辺機器のサンプリング周波数が固定されていて、システムのクロックと同期をとることができないものです。データを受け取る側がAsyncの場合、レートマッチは送る側で行う必要がありますから、どの周波数で動作しているかをデータの送信側にフィードバックしてあげる必要があります。SyncはSOFと同期したクロックでサンプリングする周辺機器です。Adaptiveはレートマッチ機能を持っていて、動作しながらSourceならSinkにSinkならSourceに、つまり相手のサンプリング周波数に自分のサンプリングレートをあわせることができるもののことです。

着脱とパワーマネジメント

USBではHot Plug(活線挿抜)が可能になっています。これは物理的なコネクタの構造とシステム上の処理によって実現されています。ここでは物理的な仕様ではなく、システム側の動作を概念として説明します。USBのシステムではドライバはスタック構造を持っています。

 

USBのシステム

USBのシステム

 

デバイスが接続されていない状態では、通信対象となるファンクションが存在しないのでクライアントは存在しません。

 

デバイスが接続されていない状態

 

デバイスが接続された瞬間にUSB System S/Wが接続したものを認識するためにEnumerationを実施します。Enumerationは各装置の持っているディスクリプタ の読み込みとUSBアドレスの割り当て、コンフィグレーションの設定を行います。

デバイスドライバの読み込みはDevice Descriptorに記述するベンダID,製品IDまたはClass,Subclass かInterface Descriptorに記述するClass, Subclassを"Inf" ファイル内のドライバリストと比較して行われます。

 

デバイスが接続された状態

 

これでドライバのロードが完了して、ドライバを利用できます。ハブを介した場合 もUSBシステム S/W的にはハブのポート電源を有効にすることと、ポートを有効にする事を含めて同じです。一方デバイスが切断された場合はポートの変化がUSBシステム S/Wへ通知されますからUSBシステム S/Wは対象のクライアントS/Wを削除します。 USBの消費電流に関するスペックの特徴はBus/Self PoweredとSuspend/Resumeです。USBではある程度の大きさの消費電流までならアップストリームポートの電源線から供給することも可能です。アップストリームポートの電源線から周辺機器すべての消費電流を供給されるものをBus-Poweredと呼び、別途ACアダプタ等の別電源を持っているものをSelf-Poweredと呼びます。USB2.0でもアップストリームポートから供給できる消費電流の規格は緩和されていません。これはコネクタ、ケーブルの互換性を維持することを第一優先としたためです。
USBのSuspend/Resumeはシステムがサスペンド(一時停止)状態での周辺機器のPowerを削減させる手法として定義されています。システムがサスペンド(一時停止)状態に入ると当たり前のようにフレームの開始を示すSOFの発行も停止します。このため、USBバスが長期間Idle状態になります。USB対応の周辺機器ではUSBバスが3ms 以上Idle状態になった時点でPowerを削減させるために、システムクロック/USBのサンプリングクロックを停止させるようなことが期待されています。Suspend状態からの復帰はホストがUSBバスのIdle状態から変化させることで行うか、ファンクションがUSBバスをIdle状態から変化させることでホストを起こし(Remote wakeup)システム全体をResumeさせます。(USB2.0でのSuspend/Resumeとreset)

USBのSuspend/Resumeについて

(例)プリンタ

最後にUSB搭載製品を実現するために必要なことを、プリンタを例に説明します。従来のプリンタの概念は簡略化すれば、次のようになります。

 

従来のプリンタの概念

 

プリンタ側のシステムを変更せず、USB Interfaceに変更するためにはブリッジを開発することになります。

 

ブリッジの開発

 

USB Interfaceに変更するためのブリッジを開発する方法でも少なくともDriver、Firmware、USBEndpointとその制御回路の開発は必要になります。