【USBのプラグ&プレイとは】
USBの特徴は、必要な時にパソコンの電源をONにしたまま接続切り離しが
いつでも可能な点にあります。
これをサポートするのが「プラグ&プレイ機能」となります。つまり接続された
時点で自動的に必要なドライバソフトを探し、適当なものを起動して使える
ようにしてくれます。
そして一度接続してしまえば、あとは自由にいつでも接続、切り離しが可能
となります。
このプラグ&プレイ機能に対応させるためのプログラムがデバイス側に
必要となります。
まず、このプラグ&プレイの手順を説明します。下図がその手順全体の流れ
となります。
全体が大きく2段階に分かれていて、接続検出(アタッチ)から、電源投入状態
までは、比較的ハードウェアに近いレベルの動作で行われ、そのあとはUSB
バス転送を使って、デバイス側のコンフィギュレーションを実行する段階となり
ソフトウェアですべて実行されます。
以下、各段階の動作を説明していきます。
(1) USBケーブルの接続(アタッチ)
まず、ホストとなるパソコン側からみると、USBケーブルが接続されたという
ことがきっかけになります。
この検出はD+かD-いずれかが3.3Vという状態になることで検出します。
従って、デバイス側の電源の供給方法によって、少し動作が異なり、セルフ
パワーとバスパワーの2つに区別されます。
バスパワーは、USBケーブルを通して、上位のハブかホストから電源供給を
受けるタイプで、この場合にはケーブルの接続と電源投入が一緒に行われ
ますから、接続と同時に検出されることになります。
電源投入は、バスパワーはケーブル接続と同時ですから、「Powered」状態
になるタイミングはケーブル接続時となります。
同時といっても細かく見ると、USBコネクタの形状に特徴があり、電源とグランド
のピンがD+、D-より先に出ていて、コネクタを挿入するとき、D+、D-が接続
されるより先に電源とグランドが接続されるようになています。
セルフパワーは、デバイス側が自分用の電源を内蔵しているもので、アタッチ
は電源ON状態で検知されます。
しかし、セルフパワーの時は、電源投入だけでは、Powered状態にはならず、
電源ON状態でUSBケーブルがホストに接続された時がPowered状態という
ことになります。ケーブルが先に接続されたときには、逆に電源Onにした時が
Powered状態となります。
(2) RESET
ホスト側がアタッチを検知すると、一定時間以上のRESET状態を出力します。
つまりD+,D-の両方をLowにします。
これでデバイス側はRESETと認知して内部リセットを実行し、「Default]状態
となります。
このRESET状態は、いつでも検出可能になっていて、内部リセット後は、
Default状態に戻ります。
このDefault状態では、パイプ0を使ったコントロール転送が可能な状態と
なります。
(3) コンフィギュレーション
RESETを出力したあと、ホスト側から、コンフィギュレーションを開始します。
つまり、デバイス内に保持している、「デバイスディスクリプタ」の情報の転送を
要求します。
まずホストから「Get_Configuration」を転送し、データを返送を要求します。
これに対し、デバイス側から「Configuration」のデータを返送します。
次にホストは、このデバイスに対して、使われていないアドレスにセットアップ
するよう、デバイスに「Set_Address」を転送します。これでデバイスが特定の
アドレスを持ったことになります。以降はこのデバイスアドレスで通信を行い
ます。
このあと、再度ホストからディスクリプタの詳細情報を要求し、デバイスは、
必要な情報を返送します。この中には、デバイスのリソースに関する情報が
含まれており、パイプの使い方や、IDコードが送られます。
ホスト側は、このIDコードを元にドライバを探し、適当なものを起動します。
はじめて接続検出したIDの場合には、ドライバのリンクの手順に進みます。
ドライバのリンクが完了した時点で、ホストから「Set_Configuration」を送信して
改めてデバイスのコンフィギュレーションをやり直して完了となります。
以降は、コンフィギュレートした内容に基づいて通信が行われることになります。
【ディスクリプタの構成】
プラグ&プレイの時にコンフィギュレーションを行いますが、そのときデバイスが
持っているデバイスディスクリプタ情報で、そのデバイスの動作や機能を定義
されます。
このディスクリプタの内容は、下図のようになっていて、デバイスクラスの差異に
より、何種類かの派生形式があります。
下図の中で、基本となるのは、左半分の標準デバイスの時のものです。
この中に基本的な動作モードが記述されています。
下図の右半分は、HIDデバイスと呼ばれる簡易なマンマシン操作機器のような
場合に追加されるものです。
【実際のディスクリプタの例】
実際のデバイスディスクリプタの例は下記のようなものとなります。
(1) デバイスディスクリプタ
コンフィギュレーションディスクリプタ
インターフェースディスクリプタ
(2) エンドポイントのディスクリプタ例
6個のエンドポイントを定義しています。
(3) ストリングディスクリプタ例
全体で256バイト以下にする必要があります。
また文字データはUnicodeで記述する必要があります。