組み込み開発者から見るUSBの仕組み(1)

数年前まで組み込み用のUSBのデバイスドライバの開発をしていたのですが、最近はめっきり使わなくなっているので自分の備忘録も兼ねてわかりやすくまとめようかと思い書かせていただきます。

これから組み込み開発などでUSBの通信を使う事になった人や、デバイスドライバの開発を始めるが、そもそもUSBの仕組みってどうなっているのかと思っている人あたりの参考になれば幸いです。

# USBの通信方法

まず、USBの転送の仕方について説明します。

分かりやすいように、例としてPCにUSBメモリをつなげた状況で説明します。(USBハブを間に挟んだ場合はちょっとややこしくなるので、今回の記事では説明しません。)

![USB簡易接続図.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/bd2868f9-c84e-4ef6-d99e-ae977bb1b07b.png)

繋がっている二つのデバイスは、USB HOSTとUSB DEVICEという役割のどちらかを持ちます。この場合はPCがUSB HOSTでUSBメモリがUSB DEVICEとなります。(人によってはDEVICEを「FUNCTION」と言ったりする方がいるかもしれません。FUNCTIONという言葉の捉え方次第なのですが、概ね同じ意味ととらえてもらって問題ないと思います)

通信はUSB HOSTから開始され、USB DEVICEはUSB HOSTから送られてきた通信内容に沿って処理を行います。要はマスタースレーブ方式のような通信を行っており、マスターとなるのがUSB HOSTと考えていただければと思います。

![USB簡易接続図2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/e9e13b3e-f501-26fe-100e-166f31f6b226.png)

先ほど挙げたUSBメモリとPCを接続した場合を例に挙げれば、PC(USB HOST)からデータの読み込みや書き込みの指示をUSBメモリ(USB DEVICE)に送り、USBメモリはそれに沿ってデータの転送・書き込みを行います。

# USBの規格

ご存じの方も多いと思いますが、USBにはUSB 1.～、USB2.0、USB3.〜等といった規格があります。USB4.0という規格もここ最近で発表されたのですが、こちらは対応デバイスが現状少ないため、この記事では割愛させてください。

まず、先ほど挙げた規格の違いを表にまとめてみました。表に示す以外にも細かな違いはあるので注意していただきたいですが、大枠として理解するには下記に示したスピードと給電能力の違いで十分ではないかと思います。
またUSB Tyoe-Cに関しては、ここで示すものとは別の規格として制定されたものです。例えば、「USB2.0のUSB Tpe-Cデバイス」、「USB3.0のUSB Type-Cデバイス」のような形でオプションとして追加されているもの、というイメージを持っていただければ問題ないと思います。

| 規格 | 対応Speed | 主な前バージョンからの更新情報 |
| ---- | ---- | ---- |
| USB 1.0 | Low Speed/Full Speed |  |
| USB 1.1 | Low Speed/Full Speed | USB1.0から電源管理の規格が更新 |
| USB 2.0 | Low Speed/Full Speed/Hi Speed | Hi Speedに対応可能 |
| USB 3.0 | Low Speed/Full Speed/Hi Speed/Super Speed | USB Power Deliveryに対応し、給電能力が改善。Super Speedに対応可能 |
| USB 3.1 | Low Speed/Full Speed/Hi Speed/Super Speed/Super Speed Plus | Super Speed Plusに対応可能 |
| USB 3.2 | Low Speed/Full Speed/Hi Speed/Super Speed/Super Speed Plus/Enhanced Super Speed | Enhanced Super Speedに対応可能 |

ここで示した対応スピードの列の「～Speed」というのは、理論上の最大転送速度の違いによって名前が分けられています。各Speedでは下記のような最大転送速度となっています。

 | スピード名称 | 最大転送速度(理論値) |
 | ---- | ---- |
 | Low Speed | 1.5Mbps |
 | Full Speed | 12 Mbps |
 | Hi Speed | 480 Mbps |
 | Super Speed | 5 Gbps |
 | Super Speed Plus | 10 Gbps |
 | Enhanced Super Speed | 20 Gbps |

加えて上記の規格の表にも示した通り、USBは後方互換性を持っています。例えば、Super SpeedのデバイスとHi Speedのデバイスを接続した場合、Hi Speedの通信が行われます。この場合だとSuper Speedのデバイスにとってはパフォーマンスがうまく発揮できていないことになると思いますので、このあたりは注意が必要です。

さらに、この後方互換性があることから、「USB2.0対応と示しているものの、Hi SpeedではなくFull Speedでのみ動作するデバイス」が存在する可能性もあります。デバイスの対応している転送速度を調べる場合は～Speedという表記を探したほうが良いでしょう。

また、パフォーマンスの面で言えばもちろんUSB3.～のデバイスを使ったほうがいいのですが、これに対応したハードウェアとなるとお値段が張ります。また、通信が速ければ速いほど消費電力も大きくなる傾向にあります。
よって、このデメリットを補うため、Super Speedのようなスピードを必要としない、一部の組み込み開発で扱われるシステムでは、Full SpeedやHi Speedに対応して消費電力を抑えたりしています。

# USB DEVICEの認識方法とクラス

次にUSBで接続された際に、USB HOSTはどのようにして接続したUSB DEVICEを認識するのかという話をいたします。
Windows10やMAC OSで動いているPCは、過去に接続したことのない不明なデバイスでも、大抵のUSBメモリを接続したらストレージと認識し、大抵のUSBマイクを接続したらオーディオデバイスとして認識してくれます。

![USB簡易接続図3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/266944/e2a85b0c-7de5-263c-3c02-de67d49c8638.png)


これは、USBにあるクラスという概念のおかげです。USBにおけるクラスとは、そのデバイスがどんな機能を持つかを示すものです。USB HOSTとなるPCは、接続されたデバイスがどのクラスのデバイスなのかを確認し、対応するデバイスドライバで初期設定を行うようになっています。これによりUSBメモリを接続するとストレージとして、USBマイクを接続するとオーディオデバイスとして認識します。

USBのクラスの一覧を下記の表に示します。この表にあるクラスの機能を持つデバイスであれば、大抵のPCは接続するだけで、適切なデバイスドライバを割り当ててくれます。

| クラス名 | 対応デバイス例 |
 | ---- | ---- |
 | Audio | マイクやイヤホン、ヘッドフォンなどのオーディオデバイス |
 | Hub | USB Hub |
 | Mass Storage | USB メモリや、USBで接続するSSDなどの大容量記憶装置 |
 | HID(Human Interface Device) | マウス、キーボード、ゲームパッドなどのユーザが直接操作する入力装置 |
 | Printer | プリンター |
 | Wireless Controller | 無線LANアダプタ |

また、先ほど少し説明したように、USB HOSTとなるPCは接続されたデバイス(USB DEVICE)に対して、どのクラスのデバイスかを認識するための通信（USB エニュメレーション）を行います。このあたりは次の記事にて書かせていただこうかと思います。

# 参考文献

各規格の仕様について  
https://jp.transcend-info.com/Support/FAQ-1285
https://www.hagisol.co.jp/techblog/?p=2062
https://www.pro.logitec.co.jp/column/u20200313.html

クラスについて
https://www.usb.org/defined-class-codes