USB HID クラス
読み:ユーエスビー-エイチアイディー-クラス
外語:HID: Human Interface Device class

 USBにおけるデバイスクラスの一つ。
目次

概要
 利用者が電子計算機に対して情報を入力するために使うクラスとして扱われ、主にキーボードマウスが該当する。
 他の対象としては、ジョイスティックタブレット等。
 キーボードとマウスに関してはHIDBPという簡易プロトコルが規定されている。
 電源装置であるUPSも、(なぜか)殆どがUSB HID クラスである。

特徴

インターフェイスディスクリプター

HIDクラス
 ホストPCに、HIDデバイスクラスのファンクションであることを通知するには、インターフェイスディスクリプターのbInterfaceClassフィールドを0x03とする。

サブクラス
 USB HID クラスの種類を表わすために、当初はサブクラスを使うことが想定されていた。しかし、現実にはその種類は膨大となり、サブクラスのプロトコル定義は非現実的と判断された。
 結果として、USB HID クラスデバイスはレポートディスクリプターでプロトコルを判別する。
 しかし、キーボードおよびマウスはBIOSがサポートするデバイス(ブートデバイス)として、シンプルな実装が求められた。そこで、ブートデバイスとして用いられるUSB HID クラスデバイス(キーボードあるいはマウス)は、ブートプロトコルに対応することを示すためにサブクラスを使用する。
 ホストPCに、デバイスがブートプロトコルに対応することを伝えるためには、インターフェイスディスクリプターのbInterfaceSubClassフィールドを0x01とする。

プロトコルコード
 デバイスがブートプロトコルに対応している(サブクラスコードが0以外)場合は、デバイスの種類を表わすためにプロトコルコードフィールドを使う。
 ホストPCに、デバイスの種類を通知するためには、インターフェイスディスクリプターのbInterfaceProtocolフィールドに値を設定する。

ディスクリプター

構成
 USB HID クラスのファンクションデバイスは、他のUSBファンクションデバイスが持つディスクリプター情報の他に、「HIDディスクリプター」「レポートディスクリプター」「フィジカルディスクリプター」(オプション)が必要である。
 次のような構成になる。
  1. デバイスディスクリプター
  2. コンフィギュレーションディスクリプター
  3. インターフェイスディスクリプター
  4. エンドポイントディスクリプター
 一部の例外を除いて、それぞれのディスクリプターは、長さ+ディスクリプタータイプに始まる定形のフォーマットを持つ。
 複数のディスクリプターが続く場合、デバイスディスクリプター、コンフィギュレーションディスクリプターの後は、「インターフェイスディスクリプターと以下一式、エンドポイントディスクリプター」を繰り返す。

HIDディスクリプター
 HIDディスクリプターは、レポートディスクリプターとフィジカルディスクリプター(オプション)を纏めるために存在する。
 次のような構造である。
 クラスディスクリプター数が複数ある場合、+6と+7の内容を、その数分繰り返すことになるが、その場合はbLengthも変更することになる。

レポートディスクリプター

ディスクリプター構造
 レポートディスクリプターは、他と構造が全く違う。HIDディスクリプターに続いて送られるもので、独自の形式を持っている。
 レポートディスクリプターは可変長で、デバイスに関する情報を提供する。
 アイテムと呼ばれる情報のまとまり(階層構造)を持つのが特徴である。
 アイテムには、短いアイテム(データ長0、1、2、4バイト)と、長いアイテム(データ長最大255バイト)がある。短いアイテムの場合、次のような構造である。
  1. 1バイト目
  2. 2バイト目以降 (短いアイテムの場合、必要に応じて、データが1、2、4バイト付く)
 アイテムタイプには「Main」「Global」「Local」の3種類がある。各アイテムタイプごとにbTagでアイテムの種類を定義するが、Main(フィールドの定義やグループ化用)が5種類、Global(データの記述に使用)は12種類、Local(特性の定義に使用)は10種類ある。これらを組み合わせて、レポートディスクリプターを構成する。
 なお、1バイト目が0xfe (1111 11 10)の場合、長いアイテムになる。
  1. 1バイト目 (1111 11 10)
  2. 2バイト目 bDataSize
  3. 3バイト目 bLongItemTag
  4. 4バイト目以降 (データ0〜255バイト)

Usage
 USBは、Usageと呼ばれる数値でデバイスの種類を定義する。これは32ビットの符号なし整数であり、USB-IFがHID Usage Tableで定義している。
 このうち、Usageの上位16ビットがUsage page、下位16ビットがUsage IDである。
 レポートディスクリプターでは、まずUsage Pageがあり大まかなデバイスの種類を選ぶ。次にUsage IDがあり、Usage Pageごとに定義される番号によって、実際のデバイスを選択することになる。

Usage Page

Usage ID
 様々なものが定義されているが、よく使われるものを抜粋する。Usage Pageごとに一意になるので、Usage Pageにぶら下げるようにして表記する。
 JoystickやGame Padは特殊なケースであり、Generic Desktop Pageで定義されている。Usage Page=0x05 Game Controls Pageではない。

マウスの例(USB 2.0の仕様書にある例)
アイテム値(HEX)
Usage Page (Generic Desktop)05 01
Usage (Mouse)09 02
Collection (Application)A1 01
 Usage (Pointer)09 01
Collection (Physical)A1 00
 Usage Page (Buttons)05 09
Usage Minimum (01)19 01
Usage Maximum (03)29 03
Logical Minimum (0)15 00
Logical Maximum (1)25 01
Report Count (3)95 03
Report Size (1)75 01
Input (Data, Variable, Absolute)81 02
Report Count (1)95 01
Report Size (5)75 05
Input (Constant)81 01
Usage Page (Generic Desktop)05 01
Usage (X)09 30
Usage (Y)09 31
Usage (Wheel)09 38
Logical Minimum (-127)15 81
Logical Maximum (127)25 7F
Report Size (8)75 08
Report Count (3)95 03
Input (Data, Variable, Relative)81 06
End CollectionC0
End CollectionC0

再検索