USBデバイスの基礎(組込み)
自作機器をPCに挿すだけで認識させる仕組みが腑に落ちる。列挙・ディスクリプタ・エンドポイント・転送タイプ・デバイスクラスを原理から押さえ、CDC・HID・MSCを正しく選び分けられる。
- 1.USBはホスト主導のポーリング型バス。デバイスは自発送信できず、ホストが発行するトークンに応じてのみデータを出し入れする。差動2線(D+/D-)に電源とGNDを加えた4線が土台。
- 2.接続直後の列挙でホストがディスクリプタを読み、アドレス割当とコンフィグレーション選択を行う。エンドポイントは制御・バルク・割り込み・等時の4転送タイプを持ち、用途で帯域と保証が変わる。
- 3.共通ドライバで動くデバイスクラスが要。CDCは仮想シリアル、HIDはキーボード等の低遅延小容量、MSCはUSBメモリの大容量転送に対応し、標準ドライバのおかげで独自ドライバ不要になる。
ホストが主導する非対称なバス
USBの最も本質的な性質は、通信が完全に ホスト主導 だという点です。バス上にホストは常に1つだけ存在し、すべての転送はホストが発行するトークンパケットから始まります。デバイス側(周辺機器)は、自分から勝手にデータを送り出すことができません。ホストが「送れ」「受け取れ」と指示したタイミングでのみ応答します。この非対称性が、後述する列挙・エンドポイント・転送タイプすべての設計を貫く前提です。
物理層は差動信号線の D+/D- の2本に、電源 VBUS(公称5V)と GND を加えた4線が基本です(USB 2.0まで)。ホストはアイドル時に D+/D- をプルダウンしており、デバイスを挿すとデバイス側のプルアップ抵抗が線を引き上げます。ホストはこの電圧変化で「何かが挿された」ことと、その速度種別を検知します。
Full Speed(12Mbps)デバイスは D+ を、Low Speed(1.5Mbps)デバイスは D- を1.5kΩで3.3V(終端電圧)側にプルアップします。ホストはどちらが持ち上がったかで速度を判別します。High Speed(480Mbps)はまずFull Speedとして接続し、その後チャープと呼ばれるハンドシェイクでHigh Speed対応を相互確認してから切り替えます。
列挙:挿した瞬間に起きること
デバイスを挿してからOSが使える状態にするまでの一連の手続きを 列挙(enumeration) と呼びます。これはホストが主導するステートマシンで、おおむね次の順に進みます。
- ホストがバスの電圧変化で接続を検知し、ポートを リセット する。
- リセット直後、デバイスは既定アドレス
0で応答する。ホストはまず制御転送でデバイスディスクリプタの先頭を読み、エンドポイント0の最大パケットサイズを知る。 - ホストが
SET_ADDRESSで1以上の一意なアドレスをデバイスへ割り当てる。以降デバイスはそのアドレスにのみ応答する。 - ホストがデバイス・コンフィグレーション・インタフェース・エンドポイントの各ディスクリプタを読み、デバイスの能力を把握する。
- ホストが
SET_CONFIGURATIONを発行し、デバイスを 設定済み(configured) 状態にする。ここで初めてエンドポイント0以外が有効になり、通常のデータ転送が可能になる。
この手続きが標準化されているからこそ、ベンダも製品も違うデバイスをホストが統一的に認識できます。列挙が終わるまでの制御転送はすべてエンドポイント0を通り、リセット直後の未アドレス状態でも成立するよう最小限の機能で設計されています。
ディスクリプタ:デバイスが自己申告する仕様書
ディスクリプタは、デバイスが「自分は何者で、どんなエンドポイントを持つか」をホストへ伝える構造化データです。木構造をなしており、上位から順にたどれるようになっています。
| ディスクリプタ | 役割 | 主なフィールド |
|---|---|---|
| デバイス | 機器全体の素性 | VID/PID、USBバージョン、クラス、EP0最大パケット長 |
| コンフィグレーション | 電源と構成の束 | 消費電流、セルフ/バスパワー、含むインタフェース数 |
| インタフェース | 1つの機能単位 | クラス/サブクラス/プロトコル、含むエンドポイント数 |
| エンドポイント | 通信の口 | エンドポイント番号と方向、転送タイプ、最大パケット長、ポーリング間隔 |
| ストリング | 人が読む名称 | 製造元名・製品名などのUnicode文字列 |
特に重要なのがインタフェースディスクリプタの クラスコード です。ホストのOSはこの値を見て、どの標準ドライバをロードすべきかを判断します。VID/PID(ベンダ/プロダクトID)はデバイスを一意に識別する番号で、専用ドライバの割当にも使われます。ホストはこれらを列挙時に読み取り、以降の通信方式を決定します。
エンドポイントと4つの転送タイプ
エンドポイント は、デバイス内部にある通信のバッファ端点です。それぞれ番号と方向(IN=デバイスからホストへ、OUT=ホストからデバイスへ)を持ちます。ホストとデバイスを結ぶ論理的な通信路を パイプ と呼び、パイプは特定のエンドポイントに割り当てられた転送タイプで動きます。エンドポイント0だけは特別で、IN/OUT双方向の制御専用として全デバイスが必ず備えます。
転送タイプは用途に応じて4種類あり、帯域保証・誤り訂正・遅延保証のトレードオフが異なります。
| 転送タイプ | 帯域保証 | 再送(誤り訂正) | 典型用途 |
|---|---|---|---|
| 制御(Control) | なし(優先確保) | あり | 列挙・設定・コマンド。EP0で使用 |
| バルク(Bulk) | なし(余り帯域を使う) | あり | USBメモリ・プリンタ。大容量で正確さ優先 |
| 割り込み(Interrupt) | あり(周期上限を保証) | あり | キーボード・マウス。低遅延・小容量 |
| 等時(Isochronous) | あり(帯域予約) | なし | 音声・映像。遅延一定・欠落許容 |
ここで押さえるべきは、保証の性質が二軸に分かれる ことです。バルクは「正確さ」を取り、CRCエラー時に再送するが帯域は保証されず、空いた帯域を使って流れます。等時は逆に「時間」を取り、毎フレーム一定量の帯域を予約する代わりに、誤ったデータは再送しません(音が一瞬乱れても、遅れてやり直すより流し続けるほうが良いという判断)。割り込み転送は「割り込み」という名ですが実体はポーリングで、デバイスが指定したポーリング間隔(例:10ms)ごとにホストが定期的にINトークンを送り、新データの有無を尋ねます。デバイスが自発的にホストへ割り込みをかけるわけではない点に注意が必要です。
USBはホスト主導ポーリング型なので、デバイスが好きなタイミングで信号を上げることはできません。割り込み転送はホストが短い一定周期でポーリングし、遅延の上限だけを保証する方式です。キー入力が「即座に」届くように見えるのは、この周期が人間の知覚より十分短いためです。真の非同期通知が要る場面でも、実装はポーリングの周期短縮で近似します。
このポーリング前提は、割り込みで完了を受け取る割り込みとISRや、CPUを介さず大量データを運ぶDMA転送と組み合わせて設計します。バルク転送でUSBメモリを高速化する際は、エンドポイントバッファとメモリの間をDMAで結び、パケット完了割り込みだけをCPUが処理する構成が定石です。
デバイスクラス:共通ドライバで動く仕組み
同種の機器が毎回独自ドライバを要求すると、ホスト側の負担が膨大になります。これを避けるのが デバイスクラス です。「キーボード」「シリアルポート」「ストレージ」といった機能カテゴリごとに通信手順を標準化し、OSが用意する汎用ドライバで動かせるようにします。代表的な3クラスを比較します。
| クラス | 略称の意味 | 主な転送タイプ | 見え方の例 |
|---|---|---|---|
| CDC | Communications Device Class | バルク+割り込み | 仮想COMポート(仮想シリアル) |
| HID | Human Interface Device | 割り込み | キーボード・マウス・ゲームパッド |
| MSC | Mass Storage Class | バルク | USBメモリ・外付けドライブ |
CDC(特にCDC-ACMサブクラス)は、USB上に仮想的なシリアルポートを作ります。ホストからは従来のシリアルバス(UART)と同じCOMポートに見えるため、既存のシリアル通信ソフトをそのまま使えます。データはバルクエンドポイントで運び、制御用に割り込みエンドポイントを併用します。
HID はキーボードやマウスのように、小さなデータを低遅延で頻繁にやり取りする機器向けです。割り込み転送を使い、送受信するデータの構造を レポートディスクリプタ で自己記述します。これにより、押されたキーやマウスの移動量といった意味づけをOSが解釈でき、専用ドライバなしで動きます。
MSC はUSBメモリなどのストレージで、内部でSCSIコマンドをバルク転送に載せてブロック単位の読み書きを行います。大容量を正確に運ぶバルクの性質が、ファイル転送の要求に合致します。
1つの物理デバイスが複数のインタフェースを持ち、同時に複数クラスとして振る舞うこともできます(コンポジットデバイス)。例えばマイコン開発ボードが、CDCで仮想シリアルコンソールを、同時にMSCでファーム書き込み用のドライブを提供する、といった構成です。コンフィグレーションディスクリプタの下に複数のインタフェースディスクリプタを並べることで実現します。
電源とスピードの規定
USBはデータ線だけでなく 電源供給 も規格の一部です。デバイスはコンフィグレーションディスクリプタで自分の消費電流を申告し、ホストが供給可能か判断します。VBUSから電気をもらう バスパワード デバイスは申告した上限内で動く必要があり、USB 2.0では単位負荷100mAを基準に、設定済み状態で最大500mAまで引けます。自前電源を持つ セルフパワード デバイスはこの制約を受けません。
無通信が続くと、ホストは サスペンド を要求し、デバイスはバス電流を大幅に絞った低消費状態へ移行します。この省電力遷移は、電池動作機器の低電力設計とスリープモードと同じ発想で、平均電流を抑える鍵になります。
速度は世代で拡張されてきました。Low Speed 1.5Mbps、Full Speed 12Mbps、High Speed 480Mbps(USB 2.0)、SuperSpeed 5Gbps以上(USB 3.x、追加の差動線を使用)と広がります。ただし表記上のビットレートはあくまで信号線上の速度で、プロトコルオーバーヘッドやポーリング周期により実効スループットはこれより低くなります。
第一に「USBはホスト主導のポーリング型」であること。デバイスは自発送信できず、割り込み転送も実体はポーリングです。第二に4転送タイプの対応:制御=EP0で列挙、バルク=大容量・再送あり・帯域保証なし、割り込み=低遅延・周期保証、等時=帯域予約・再送なし。第三にクラスの当てはめ:CDC=仮想シリアル、HID=キーボード/マウス、MSC=ストレージ。第四に列挙の順序(リセット→アドレス0で応答→SET_ADDRESS→ディスクリプタ読取→SET_CONFIGURATION)。この4点セットが定番です。
USBの一見複雑な仕様は、「ホストがすべてを主導する」という1つの原則から導けます。デバイスは自分をディスクリプタで申告し、ホストが列挙でそれを読み取り、エンドポイントごとに用途に合った転送タイプで通信し、クラスによって共通ドライバに接続する——この流れを押さえれば、CDC・HID・MSCのどれを選ぶべきか、なぜその転送タイプなのかを原理から判断できます。
組込み・IoT Article
USBデバイスの基礎(組込み)を実務で読む
TL;DRは入口です。実際に選ぶ・使う段階では、何を解決するか、何と比較するか、導入後にどこで詰まるかまで見る必要があります。
解決すること
USB
比較で見る軸
難易度: advanced / カテゴリ: 組込み・IoT / タグ数: 6
導入後に効く点
接続直後の列挙でホストがディスクリプタを読み、アドレス割当とコンフィグレーション選択を行う。エンドポイントは制御・バルク・割り込み・等時の4転送タイプを持ち、用途で帯域と保証が変わる。
先に潰すリスク
用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。
- 難易度
- advanced
- カテゴリ
- 組込み・IoT
- タグ数
- 6
判断チェックリスト
- 自社の用途が「USB / 組み込み」に近いか確認する。
- 強みである「USBはホスト主導のポーリング型バス。デバイスは自発送信できず、ホストが発行するトークンに応じてのみデータを出し入れする。差動2線(D+/D-)に電源とGNDを加えた4線が土台。」が本当に評価軸になるか確認する。
- 注意点の「用語だけ覚えても、設計・実装・運用でどこに効くかを確認しないと判断を誤る。」を運用で吸収できるか確認する。
- 公開値や仕様値は、対象プラン・対象機種・対象リージョンまで確認する。
- 既存システム、ID、ネットワーク、監視、バックアップとの接続方法を先に洗い出す。
- 小さく試してから、本番移行、権限設計、障害時手順、コスト監視を決める。