Descriptor table (HID)

Descriptor table とは

USB 機器を PC に刺したときにまず PC によって読み取られる、その USB 機器の全ての情報を書いたデータ列です。

一応 USB 仕様書に書式が載っていますが、それで全てではありません。独自のデバイスを造るならこれだけでも問題ありませんが、キーボードだのマウスだの CD ドライブだの、標準のドライバで機能するようなモノを造るときには、またそれぞれ追加の書式が決まっています。面倒ですね !

そしてここでは HID に限ってその仕様書の所在と、具体例を紹介いたします ... とは言っても私もまだまだわからないことはたくさんありますが。

HID とは Human Interface Device の略で、まあ人間から PC への入力機器と思って多分間違いありません。マウスとか、キーボードとか、ジョイスティックとか、タブレットも含まれるのでしょうか ?

それで HID の descriptor table を書くにあたって必要なドキュメントは現在こちらにあります。この中の
Device Class Definition for Human Interface Devices (HID)
とゆーのと
HID Usage Tables
とゆーのが必須です。

ちなみに EZ-USB には descriptor table の初期設定値があります。その内容は EZ-USB Technical Reference Manual の Appendix A, B にありますが、長いので詳細は省略。

Report descriptor 以外の共通部分

さて共通部分の descriptor table の書式ですが、こんな感じです。

device descriptor。最初に処理される descriptor table です。書式は以下の通り。

データ番号
(各 1 バイト)
固定値 意味
0x000x12device descriptor データ長、18 バイト固定。
0x010x01descriptor type、0x01 は device descriptor の番号。下で一覧を表示。
0x02-USB 規格番号 (Low)。例えばバージョン 1.10 ならコンマ以下の 2 桁を 10 進っぽく 0x10 と書く。
0x03-USB 規格番号 (High)。例えばバージョン 1.10 ならコンマより上 2 桁を 10 進っぽく 0x01 と書く。
0x04-Device Class。下の方で一覧を表示。(HID なら 0x00 推奨)
0x05-Device Sub-Class。下の方で一覧を表示。
0x06-Device Protocol。下の方で一覧を表示。
0x07-EP0 の最大パケット長。EZ-USB なら 0x40 (64 バイト)。
0x08-Vender ID (Low)
0x09-Vender ID (High)
0x0A-Product ID (Low)
0x0B-Product ID (High)
0x0C-Device Release Number (Low)、これも 10 進っぽく書く。
0x0D-Device Release Number (High)、これも 10 進っぽく書く。
0x0E-String descriptor (製造元) への index。String descriptor 用意しなければ 0x00 でいいと思われる。
0x0F-String descriptor (製品名) への index。String descriptor 用意しなければ 0x00 でいいと思われる。
0x10-String descriptor (シリアル番号) への index。String descriptor 用意しなければ 0x00 でいいと思われる。
0x11-Configuration の総数。

更に configuration descriptor です、が、これは interface 部分、endpoint 部分、HID 部分など全部を含みます。HID 部分は後から説明することにします。

データ番号
(各 1 バイト)
固定値 意味
0x000x09configuration descriptor データ長、9 バイト固定。
0x010x02descriptor type、0x02 は configuration descriptor の番号。下で一覧を表示。
0x02-全 descriptor (config + interface + endpoint + class- or vendor-specific descriptor) のデータ長、の Low 部分。(16 進の下 2 桁)
0x03-全 descriptor (config + interface + endpoint + class- or vendor-specific descriptor) のデータ長、の High 部分。(16 進の上 2 桁)
0x04-この configuration の持つ interface の数。
0x05-この configuration の番号。(非ゼロ)
0x06-String descriptor (configuration) への index。String descriptor 用意しなければ 0x00 でいいと思われる。
0x07-Attributes bitmap describing configuration characteristics (謎、0x00 でいいと思う)
0x08-最大電流 (mA/2)
以下続けて interface 毎の設定
0x090x09interface descriptor データ長、9 バイト固定。
0x0A0x04descriptor type、0x04 は interface descriptor の番号。下で一覧を表示。
0x0B-interface 番号。
0x0C-この interface 設定を使うときの、alternate setting 番号。
0x0D-String descriptor (interface) への index。String descriptor 用意しなければ 0x00 でいいと思われる。
0x0E-この interface が使う endpoint の数。
0x0F-Class code。下で一覧を表示。(HID なら 0x03)
0x10-Subclass code。下で一覧を表示。
0x11-Protocol code。下で一覧を表示。
0x12-Index of string describing this interface (謎、0x00 でも多分良し)
以下続けて HID descriptor
0x130x09HID descriptor データ長、9 バイト固定。
0x140x21descriptor type、0x21 は HID descriptor の番号。下で一覧を表示。
0x15-HID Class Specification release (HID 仕様番号) の Low 部分。(小数点以下を 10 進っぽく書く)
0x16-HID Class Specification release (HID 仕様番号) の High 部分。(小数点より上を 10 進っぽく書く)
0x17-Country code。通常は使わない (0x00) が、どおしても使いたい場合は下の表参照。
0x18-class descriptor (HID の場合は report descriptor) の数。
0x190x22class descriptor (HID の場合は report descriptor) の descriptor type。
0x1A-report descriptor のデータ長 (Low)
0x1B-report descriptor のデータ長 (High)
以下続けて endpoint descriptor
0x1C0x07endpoint descriptor のデータ長、7 バイト固定。
0x1D0x05descriptor type、0x05 は endpoint descriptor の番号。下で一覧を表示。
0x1E-endpoint address、下で説明。
0x1F-endpoint attribute、下で説明。
0x20-Maximum packet size (Low)
0x21-Maximum packet size (High)
0x22-interrupt の場合、polling 時間間隔 (ms)
以下これを全ての設定について繰り返し書く。
0x23-...

とは言うものの ... 私は基本的に configuration も interface も endpoint 設定も一つのモノしか書いたことがありませんので、複数あったときにどういう順番で並べるのかは、あまりよくわかりません。大変無責任で申し訳ないですが !

endpoint address

以下、2 進数を用いて説明。例えば
0x80 = 10000000
において、右端を第 0 ビットとする。

ここで言う endpoint address とはマイコン内部のアドレスの事では無く、endpoint 番号と IN/OUT のフラグを組み合わせたものです。

まず第 0-3 ビットが endpoint 番号です。第 0 ビットが 1 の位に相当します。

第 7 ビットが IN/OUT のフラグです。IN/OUT の区別は私も良く忘れるのですが ... OUT が PC から USB への output、IN が USB から PC への input です。
そして OUT = 0、IN = 1 とします。

具体例としては、endpoint 1 の OUT ならば 0x01。endpoint 15 の IN ならば、0x8F となります。

endpoint attribute

ここでは transaction 種類を指定します。上の endpoint address で用いた「2 進数表記で右端を第 0 ビットとする」の規則にしたがって説明します。

第 0-1 ビットが transaction 種別です。

transaction値 (2 進)
Control00
Isochronous01
Bulk10
Interrupt11

第 2-3 ビットは isochronous の場合のオプションです。私もよく知りませんが。

意味値 (2 進)
No synchronization00
Asynchronous01
Adaptive10
Synchronous11

第 4-5 ビットは Usage type とかいうものらしいです。... 誰か私に教えてください ? 多分通常は 00 でいいと思いますが。

意味値 (2 進)
Data endpoint00
Feedback endpoint01
Implicit feedback data endpoint10
Reserved11

モロモロの一覧

こんなの、pdf 見ていただいた方が正確なんですが、まあそんな事言わずに一応載せておきます。

Descriptor type

Descriptor type
Device0x01
Configuration0x02
String0x03
Interface0x04
Endpoint0x05
Device_Qualifier0x06
Other_Speed_Configuration0x07
Interface_Power0x08
HID0x21
report0x22

Device class

HID は device descriptor では 0x00、interface descriptor では 0x03。

意味
Interface descriptor の class code 参照0x00
Audio0x01
Communications and CDC Control0x02
HID0x03
Physical0x05
Image0x06
Printer0x07
Mass storage0x08
Hub0x09
CDC-Data0x0A
Smart Card0x0B
Content Security0x0D
Video0x0E
Personal Healthcare0x0F
Diagnostic Device0xDC
Wireless Controller0xE0
Miscellaneous0xEF
Application Specific0xFE
Vendor Specific0xFF

Device subclass

HID のみ記載。キーボードとマウスの場合は boot interface subclass を選択。

意味
No subclass0x00
Boot interface subclass0x01

Device protocol

HID のみ記載、usbclass で boot interface を指定したときのみ有効、それ以外は 0x00。

意味
None0x00
キーボード0x01
マウス0x02

Country code

HID のみ記載、通常は 0x00 で良し。

意味
Not supported0x00
Arabic0x01
Belgian0x02
Canadian-Bilingual0x03
Canadian-French0x04
Czech Republic0x05
Danish0x06
Finnish0x07
French0x08
German0x09
Greek0x0A
Hebrew0x0B
Hungary0x0C
International (ISO)0x0D
Italian0x0E
Japan (Katakana)0x0F
Korean0x10
Latin American0x11
inserted by FC2 system