Skip to content

USB_HID_Class

askn37 edited this page Oct 27, 2026 · 17 revisions

USB HIDクラス記述子

標準要求で装置を初期化・認識し、HIDクラス要求 で入出力情報交換を行う。

代表的な階層構造

Configuration descriptor
  Interface descriptor (specifying HID Class)
    HID descriptor (associated with above Interface)
      Endpoint descriptor (for HID Interrupt In Endpoint)
      Optional Endpoint descriptor (for HID Interrupt Out Endpoint)

HID記述子 Human Interface Device Descriptor

この記述子は、HID 装置で必要な 複数の従属クラス記述子 をグループ化するために定義される。bDescriptorType は 0x21。bLengthは 少なくとも 9バイト。

Device Request

Device Request bmRequestType bRequest wValue wIndex wLength Data
GET_DESCRIPTOR 1 00 00000 0x06 記述子種別/指標番号 0または言語ID * 以下を返却

Descriptor Format

Ofs Size Field Type Description
0 1 bLength 数値 記述子全体長(最短 0x09)
1 1 bDescriptorType 定数 記述子種別値(0x21)HID
2 2 bcdHID BCD BCD表現の HID版番号
4 1 bCountryCode 数値 地域固有デバイスのための国識別番号
5 1 bNumDescriptors 数値 従属クラス記述子 の個数 (n)
6 1 bDescriptorType[0] 従属クラス符号 従属クラス記述子[0]の種別
7 2 wDescriptorLength[0] 数値 従属クラス記述子[0]の長さ(バイト数)
(n回の繰り返し)

bcdHID

この項は BCD表現の HID版番号 を表す。規約では 1.11 しか知られていないので、慣習的に 0x0111 と書く。

  • "Boot(Legacy) Protocol" HID装置では最大の互換性を得るために 0x0100 と書くべきかもしれない。

bCountryCode

この項は 地域固有デバイスのための国識別番号 を表す。wLANGID とは別物。国際電話局番号でもない。通常は 0x00(Not Supported)を書けば良い。

  • Device Class Definition for HID 1.11
  • この項は現在では一般的ではなく、OS側のキーマッピングが自動的に同調したりすることもない。せいぜい装置外装に何語が印字されているかをデバイスプロパティに示す程度である。
bCountryCode Description
0x00 Not Supported(特定国向けではない)
0x0D 国際標準 (International - ISO)
0x0F 日本 / カタカナ (Japan - Katakana)
0x21 米国 (US)
0x24-0xFF (予約)

bNumDescriptors

この記述子に連なる従属クラス記述子の個数を示す。少なくとも 0x01。それ以上なら bLength は bNumDescriptors x 3 + 6 バイトとする。

  • とはいえ従属クラス記述子は 報告記述子(HID_REPORT)と 物理記述子(HID_PHYSICAL)の 2種類しかないので、普通 bLength は 0x09 か 0x0C のどちらかになるだろう。
  • しかし HID_PHYSICAL は現在では滅多に使われておらず、定義する理由もない。

bDescriptorType

この項は従属クラス記述子の種別を表す。報告記述子(HID_REPORT)なら 0x22、物理記述子(HID_PHYSICAL)なら 0x23 と書く。wDescriptorLength とペアで bNumDescriptors 回数ぶん繰り返すことができる。

wDescriptorLength

この項は従属クラス記述子の長さをバイト数で表す。bDescriptorType とペアで bNumDescriptors 回数ぶん繰り返すことができる。

HID報告記述子 HID Report Descriptor

この記述子(HID_REPORT)は、HID記述子 の従属クラス記述子で、通常の記述子(Descriptor)とは全く様式が異なる。

  • ヘッダが存在しない。全長と従属クラス符号(0x22)は HID記述子 で指定される。

  • この記述子内容は、HIDドライバで実装している "HIDレポートパーサー"に丸ごと渡される。つまりスクリプト言語の一種。"Report Protocol"入出力(バイナリ)フォーマットを決定する。

  • 複数の "アイテム" を列挙しただけの平坦な構造。最初はかならず "Usage Page" アイテムから始める。

  • "アイテム" は 1,2,3,5バイト長で、1バイト目(Prefix Byte)には bTag、bType、bSize(後続バイト数)を含んでいる。これを "Short Item" と言う。後続バイト数は char、int、long 型変数に対応する。リトルエンディアン。符号の有無はアイテムに依存する。

  • "Short Item" の bType は、0=Main、1=Global、2=Local 3=Reserved の区別。"Global Item" の効果は、それが打ち消されるまで有効。

  • "Long Item" は 255バイトまでの ペイロードを持つことができる。

  • 最終的に生成される 入出力レポート(Report Protocolを構成する)は、固定長変数の集合となる。可変長変数は定義できない。

  • Waratah - New HID Descriptor Tool from Microsoft

Interface Request

Intreface Request bmRequestType bRequest wValue wIndex wLength Data
GET_DESCRIPTOR 1 00 00001 0x06 0x22:00 0 * 以下を返却

Descriptor Format

Item 0 Item 1 Item N
Usage Page Collection Items... End Collection

Prefix Byte

"アイテム"の先頭バイト(Prefix Byte)は、以下の 4+2+2 ビットフィールドを持つ。

Bit[7-4] [3,2] [1,0]
bTag bType bSize
  • bTag は "アイテム" の種類を示す。以下で説明されない設定値は予約値(未定義)である。
  • bType は "アイテム" の種別を示す。"Main"、"Global"、"Local"、"Reserved" の 4種類がある。
  • bSize は "Prefix Byte" に続く後続データバイト長を表す。後続バイト長 "0,1,2,4" を、"0,1,2,3" で表す。
bSize Description
00 後続データなし
01 1バイト後続(char)
10 2バイト後続(int)
11 4バイト後続(long)

Main Items

"Main Item"には「データ型」と「非データ型」がある。

bTag bType Item Type Description
1000 00 Input Data 装置⇨ホスト入力
1001 00 Output Data ホスト⇨装置出力
1010 00 Collection Non-Data グループ化開始
1011 00 Feature Data 機能
1100 00 End Collection Non-Data グループ化終了
  • "Collection" と "End Collection" アイテムの組は、必ず(必然的に)記述されなければならない。
  • かつその中に "Input" または "Output" アイテムのいずれかひとつ以上は、必ず(必然的に)記述されなければならない。
  • "Input"アイテムは、キー入力や タッチパネル座標等を ホストに通知するデータ形式を定義する。
  • "Output"アイテムは、キーボードLED の点灯状態などを 装置に通知するデータ形式を定義する。
  • "Feature"アイテムは、装置に送信可能な装置設定に関するデータ形式を定義する。使用は任意。

Data Type Bit Fields

データ型アイテムは、後続バイトの各ビットに以下の意味を持つ。

Bit Value Part Value Part Description
0 0 Data 1 Constant データ/定数値
1 0 Array 1 Variable 配列/変数
2 0 Absolute 1 Relative 絶対値/相対値
3 0 No Wrap 1 Wrap 循環しない/する
4 0 Linear 1 No Linear 線形性/非線形性
5 0 Preferred State 1 No Preferred 非操作時に規定値へ戻る/戻らない
6 0 No Null position 1 Null state 無意味な値を返さない/返す
7 0 Non Volatile 1 Volatile 不揮発性/揮発性(Inputでは未定義)
8 0 Bit Field 1 Buffered Bytes データはビット列/バイト列
31-9 Reserved Reserved
  • "Input"アイテムは後続データなしもありえる。また Bit7 は未定義となる。
  • 省略されたデータの既定値は 0 と見做される。従って 80 と 83 00 00 00 00 はいずれも "Input (0)" であると解釈される。
  • アイテムの属性は、基本的に最初の 3ビットで決まる。
  • "Constant" - 要素値は決して変化しない。予約ビット等。
  • "Array" - 1個のレポート単位に複数要素が詰まっている。
  • "Variable" - 1個のレポート単位は1個の変数。
  • "Relative" - 要素値は、前回の計測値からの相対変位。
  • "Wrap" - 要素値が循環する。回転ホイールの検出角度等。
  • "No Linear" - 要素値の変化が直線的ではない。目盛りがデシベル単位の音量ノブ等。
  • "Preferred" - 操作されていないセンサーが、既定値に自動で戻るか否か。アクセルペダルは戻る。変速レバーは戻らない。
  • "Null state" - センサー故障等で欠測なら、0(Null)等の無効値を返しうる。
  • "Volatile" - 要素値が揮発性。前回の計測結果を装置自体が保持できない。
  • "Buffered Bytes" - とても大きなデータ型を示すが、"Report Size/Count" で十分表現できるので、ふつう宣言されない。

Usage Collection Type

"Collection" アイテムの後続 1バイトは、以下の意味を持つ。

Value Collection Type Description
0x00 Physical (group of axes) 物理データ集合
0x01 Application (mouse, keyboard) アプリケーション解釈
0x02 Logical (interrelated data) 相互関連データ集合
0x03 Report ReportID付きデータ集合
0x04 Named Array 名前付き配列
0x05 Usage Switch 用途変更
0x06 Usage Modifier 用途修飾子
0x07-0x7F Reserved
0x80-0xFF Vendor-defined
  • "Collection"アイテムは "End Collection"アイテムが出現するまでのアイテムを グループ化する。これは記述子内に少なくとも ひとつ以上定義される。入れ子で階層構造を作ることができる。
  • "End Collection" は後続バイトを持たない。

Global Items

bTag bType Item Description
0000 01 Usage Page Usage ID の上位16ビット(符号なし整数)
0001 01 Logical Minimum 論理単位の最小値
0010 01 Logical Maximum 論理単位の最大値
0011 01 Physical Minimum 物理範囲の最小値
0100 01 Physical Maximum 物理範囲の最大値
0101 01 Unit Exponent 10を底とする単位指数
0110 01 Unit 単位定義
0111 01 Report Size Report のビット粒度での大きさ(符号なし整数)
1000 01 Report ID Report ID(1バイトの符号なし整数)
1001 01 Report Count データ項目長を表す符号なし整数
1010 01 Push グローバルアイテム状態テーブルのコピーをスタックに積む
1011 01 Pop アイテム状態テーブルをスタックの最上位にある構造で置き換える
  • "Usage Page" アイテムは、冒頭で必ず 1回記述しなければならない。
  • "Usage Page" アイテム は、"Usage" アイテム で指定する "Usage ID"の、省略時の上位 16ビットを補完(連結)する。つまり 00 FF == 0xFF00:nnnn はベンダー定義の "Usage ID" となる。ただし "Usage"アイテムで 32ビットの完全な "Usage ID"を指定した場合はそちらを優先。
  • "Minimum / Maximum"アイテムの指定値は(以下の例外を除き)符号付き整数と見做される。なので FF は符号拡張されて -1、FF 00 は符号拡張されずに +255 と解釈される。
  • "Minimum / Maximum"アイテムがいずれも 0以上の正数であるなら(つまり 0 <= Minimum < Maximum なら)符号なし整数と見做される。この場合 FF は符号拡張されずに +255 と解釈される。
  • "Report ID"アイテムは、指定した値を前置子として "Report" の前に挿入する。ビットフィールド途中であれば次のバイト境界へ ゼロパディングされる。
  • "Report ID"は、未定義と、ゼロ指定は区別される。未定義なら "Report ID"バイト項(つまり定数)は生成されない。

分解能換算

"Logical / Physical"アイテムは、分解能を定義する。例えば温度装置から 0〜999 が送られ、これを応用記述が 32〜212華氏度として受け取るなら "Logical Min,Max = 0,999"、"Physical Min,Max = 32,212" と表現する。

別の例:400dpi マウス

Item Value
Logical Minimum -127
Logical Maximum +127
Physical Minimum -3175
Physical Maximum +3175
Unit Exponent -4
Unit Inches
Resolution = (127-(-127)) / ((3175-(-3175)) * 10e-4) = 400 counts per inch

Unit Item

第2バイトで "単位"、省略可能な第3バイトで "精度"(Exponent) を表現する。

Nibble System 0x0_ 0x1_ 0x2_ 0x3_ 0x4_
Exponent 0 1 2 3 4
0 System None SI Linear SI Rotation English Linear English Rotation
1 Length None Centimeter Radians Inch Degrees
2 Mass None Gram Gram Slug Slug
3 Time None Seconds Seconds Seconds Seconds
4 Temperature None Kelvin Kelvin Fahrenheit Fahrenheit
5 Current None Ampere Ampere Ampere Ampere
6 Luminous intensity None Candela Candela Candela Candela
7 Reserved None None None None None
Nibble 0x5_ 0x6_ 0x7_ 0x8_ 0x9_ 0xA_ 0xB_ 0xC_ 0xD_ 0xE_ 0xF_
Exponent 5 6 7 -8 -7 -6 -5 -4 -3 -2 -1
  • 上位ニブル 0x5_から0xE_ は予約。0xF_ はベンダー定義。

Report Count

配列の場合、"Report Count" はレポートに含まれるコントロールの最大数を決定する。

/* 例えば「同時に 3つのキーが押せる」「各フィールドが 1バイト」の場合 */
Report Size  (8),
Report Count (3),

可変ビットマップの場合、"Report Count" はレポートに含まれるコントロールの絶対数を決定する。

/* 例えば「8つのボタン」「各フィールドが 1ビット」の場合 */
Report Size  (1),
Report Count (8),

Local Items

bTag bType Item Description
0000 10 Usage Usage ID(符号なし整数)
0001 10 Usage Minimum 配列/ビットマップの初期使用法
0010 10 Usage Maximum 配列/ビットマップに関連付けられた終了時の使用法
0011 10 Designator Index 指定子指標番号
0100 10 Designator Minimum 開始指定子指標
0101 10 Designator Maximum 終了指定子指標
0110 10 String Index 文字列記述指標番号
1000 10 String Minimum 文字列記述開始指標番号
1001 10 String Maximum 文字列記述終了指標番号
1010 10 Delimiter ローカル項目の開始(0)または終了(1)
  • "Local Items" の使用は、すべて任意。
  • "Usage"アイテムは、その項目の機能を説明する。指定する "Usage ID" は、補助クラス毎に決められている。
  • "Usage Minimum/Maximum" はデータ項目に番号の説明をつける。サンプルを参照。
  • "説明" は "HIDパーサー" のデバッグ出力で可読性を増すためにあるようなもの。
  • "Designator / String" はサブルーチンのようなもので、複数箇所での記述流用を支援する。しかし滅多に使われない。

Long Item

"Prefix Byte" は必ず 0xFE。

bTag bType bSize Item Description
1111 11 10 Long Item

そのあとに bDataSize、bLongitemTag、任意長のデータバイトが続く。

0 1 2 3-258
Prefix Byte bDataSize bLongitemTag data[bDataSize]
  • bLongitemTagは定義されていないが、0xF0-0xFF はベンダーが定義できる。

HID物性記述子 HID Physical Descriptor

この記述子(HID_PHYSICAL)は、HID記述子 の従属クラス記述子で、通常の記述子(Descriptor)とは全く様式が異なる。

  • ヘッダが存在しない。全長と従属クラス符号(0x23)は HID記述子 で指定される。
  • この記述子内容は、HIDドライバで実装している "HIDレポートパーサー"に丸ごと渡される。つまりスクリプト言語の一種。
  • 装置のどのセンサーが、人体のどの部位に関連付くかという情報を定義できる。正しく "人体入出力機器" らしい性質を与える。
  • この実装は完全に任意のため、滅多にお目にかかることがない。

HIDクラス要求記述子 HID Class Request Descriptor

HIDクラスは、以下の 標準インターフェース要求 を拡張する。

Intreface Request bmRequestType bRequest wValue wIndex wLength Data
GET_DESCRIPTOR 1 00 00001 0x06 記述子種別/指標番号 言語IDまたはIF番号 * 記述内容
SET_DESCRIPTOR 0 00 00001 0x07 記述子種別/指標番号 言語IDまたはIF番号 * 記述内容
  • bmRequestTypeの受取先が インターフェース である以外は、基本的に 標準装置要求 と同じ。
  • 本来この要求種別はクラス(01)であるべきだったようだがそうなっていない。USB 1.0 では規約が曖昧だったため、USB 1.1 で現状追認されたようす。
  • SET_DESCRIPTOR の実装は任意。
  • wValue は上位バイトで 記述子種別 を、下位バイトで 指標番号 を指定する。
  • 記述子種別が HIDクラス要求符号の場合は インタフェース番号が指定される。それ以外の 標準要求符号 である場合は、wIndex に 言語ID(wLANGID)が指定される。

HIDクラスは、以下の HIDクラス固有要求(Class-Specific Requests)を拡張する。すべて インターフェース要求に属する。

Interface Request bmRequestType bRequest wValue wIndex wLength Data
GET_REPORT 1 01 00001 0x01 Report Type/ID IF番号 * Report Data
GET_IDLE 1 01 00001 0x02 0/Report ID IF番号 1 Idle Rate
GET_PROTOCOL 1 01 00001 0x03 0 IF番号 1 Protocol
SET_REPORT 0 01 00001 0x09 Report Type/ID IF番号 * Report Data
SET_IDLE 0 01 00001 0x0A Duration/Report ID IF番号 0 -
SET_PROTOCOL 0 01 00001 0x0B Protocol IF番号 0 -

基本的に wValueは上位バイトで "Report Type" を、下位バイトで "Report ID" を指定する。0 ならば指定なし。

wValue.high Report Type
0x01 Input
0x02 Output
0x03 Future

"Protocol" には "Boot(Legacy) Protocol" と "Report Protocol" の種別がある。

Value Protocol
0x00 Boot
0x01 Report

SET_IDLE

この指令は、新たなイベントが発生するか、あるいは指定された時間が経過するまで、割込入力パイプ上の特定のレポートを抑制(無効化)する。

uint8_t bRequest = EP0_SETUP.bRequest;
if (bRequest == USB_REQ_HID_SetIdle) {  /* 0x09 */
  uint8_t bDuration = (uint8_t)(EP0_SETUP.wValue >> 8); /* LSB is 4ms */
  uint8_t bReportID = (uint8_t) EP0_SETUP.wValue;
  uint8_t bInterfaceNumber = (uint8_t) EP0_SETUP.wIndex;
  hid_set_idle_duration(bInterfaceNumber, bReportID, bDuration);
  EP0_IN.CNT = 0;
  EP0_IN_flush();
}

wValue の下位バイトは、特定の "Report ID" を指定する。ゼロであれば 全体設定と解釈する。

wValue の上位バイト(Duration)は、0 の場合は無制限を表し、指定された "Report" は新たな変化が現れた場合のみ、その送信が許可される。"Duration" が 0 でなければ、LSB を 4ms の分解能と解釈した時間間隔で、"Report" を(情報が変化していなくても)送信する。いわゆるキーリピートの実現。

"Report" を割込エンドポイントで実装している場合は、"Duration=0" かつ返すべき "Report" に変化がなければ、NAKで応答を拒否する。"Duration" が非ゼロなら、指定時間が経過していない間は、NAKで応答を拒否する。

  • 割込エンドポイントの既定の割込間隔は、装置要求段階でホストに通知する。それは SET_DESCRIPTOR や SET_INTERFACE でないと更新できないので、それらを実装しない場合は 既定の割り込み間隔を 4ms としおき、実装で割込発生回数をカウントして ACK/NAK応答を使い分けると良い。

GET_IDLE

この要求には、特定の入力レポートの現在の "Duration" アイドル値を返却する。

uint8_t bRequest = EP0_SETUP.bRequest;
if (bRequest == USB_REQ_HID_GetIdle) {  /* 0x02 */
  uint8_t bInterfaceNumber = (uint8_t) EP0_SETUP.wIndex;
  uint8_t bReportID = (uint8_t) EP0_SETUP.wValue;
  EP0_IN_BUFF[0] = (uint8_t) hid_get_idle_rate(bInterfaceNumber, bReportID);
  EP0_IN.CNT = 1;
  EP0_IN_flush();
}

SET_PROTOCOL

この指令は、HID装置が "Report Protocol" と "Boot Protocol" どちらの補助クラス動作で動作すべきかを通知する。

uint8_t bRequest = EP0_SETUP.bRequest;
if (bRequest == USB_REQ_HID_SetProtocol) {  /* 0x0B */
  uint8_t bInterfaceNumber = (uint8_t) EP0_SETUP.wIndex;
  uint8_t bProtocol = (uint8_t) EP0_SETUP.wValue;
  hid_change_protocol(bInterfaceNumber, bProtocol);
  EP0_IN.CNT = 0;
  EP0_IN_flush();
}
  • "Report Protocol" は 一般的な意味での 標準動作。"Boot Protocol" HID装置は、この SET_PROTOCOL を必ず実装しなければならない。
  • "Boot Protocol" は ホストPC 起動時の BIOS/UEFI 操作に対応した、いわゆるレガシーで制限のある挙動。DFU のような "Bootstrap Loader" 動作と混同しないこと。
  • "Boot Protocol" は エンドポイントペイロード長が 8バイト固定に制限される。このためキーボードの同時押しは 6個までしか対応できない。いわゆる "無制限Nキーロールオーバー" は "Report Protocol" が使用できなければならない。

GET_PROTOCOL

この要求には、HID装置の現在の "Protocol" 動作モードを返却する。

uint8_t bRequest = EP0_SETUP.bRequest;
if (bRequest == USB_REQ_HID_GetProtocol) {  /* 0x03 */
  uint8_t bInterfaceNumber = (uint8_t) EP0_SETUP.wIndex;
  EP0_IN_BUFF[0] = (uint8_t) hid_current_protpcol(bInterfaceNumber);
  EP0_IN.CNT = 1;
  EP0_IN_flush();
}
  • "Boot Protocol" HID装置は、この GET_PROTOCOL を必ず実装しなければならない。

SET_REPORT

この指令は、ホストから HID装置へ 制御エンドポイント経由で "Output/Future Report" を送る。

  • HID装置用に 出力エンドポイント を指定していれば、そちらに直接 "Report Protocol" 形式でデータが送られる。
  • Low-Speed 専用の低速 HID装置は、SET_REPORT で "Ouput Report" を受信する実装が多い。
uint8_t bRequest = EP0_SETUP.bRequest;
if (bRequest == USB_REQ_HID_SetReport) {  /* 0x09 */
  uint8_t bReportType = (uint8_t)(EP0_SETUP.wValue >> 8);
  uint8_t bReportID = (uint8_t) EP0_SETUP.wValue;
  uint8_t bInterfaceNumber = (uint8_t) EP0_SETUP.wIndex;
  EP0_IN.CNT = 0;
  EP0_IN_flush();
}

GET_REPORT

この要求には、HID装置から 制御エンドポイント経由で "Input Report" を返却する。

  • HID装置用に 入力エンドポイント を指定していれば、そちらで直接 "Report Protocol" 形式のデータを送る。
  • "Future Report" のような送受信頻度の少ないデータは、専用のエンドポイントを用意せずに、GET_REPORT を使うことができる。
  • Low-Speed 専用の低速 HID装置は、GET_REPORT で "Input Report" を送信する実装が多い。
uint8_t bRequest = EP0_SETUP.bRequest;
if (bRequest == USB_REQ_HID_GetReport) {  /* 0x01 */
  uint8_t bReportType = (uint8_t)(EP0_SETUP.wValue >> 8);
  uint8_t bReportID = (uint8_t) EP0_SETUP.wValue;
  uint8_t bInterfaceNumber = (uint8_t) EP0_SETUP.wIndex;
  EP0_IN.CNT = (uint16_t)memcpy_report(&EP0_IN_BUFF, EP0_SETUP.wLength, bInterfaceNumber, bReportID, bReportType);
  EP0_IN_flush();
}

付録A:HID報告記述子サンプル

こういうのは実例を見た方が早い。

3-button Mouse

標準HID装置なので、"Usage ID" が文字列でデバッグ表示されている。(なくてもよい)"Usage Minimum/Maximum" の用法に注目。

05 01  G Usage Page (Generic Desktop),        ;Use the Generic Desktop Usage Page
09 02  L Usage (Mouse),  
A1 01  M Collection (Application),            ;Start Mouse collection
09 01  L  Usage (Pointer),  
A1 00  M  Collection (Physical),              ;Start Pointer collection
05 09  G   Usage Page (Buttons), 
19 01  L   Usage Minimum (1), 
29 03  L   Usage Maximum (3),                 ;3 Button
15 00  G   Logical Minimum (0),  
25 01  G   Logical Maximum (1),               ;Fields return values from 0 to 1
95 03  G   Report Count (3),                  ;Create three 1 bit fields (button 1, 2, & 3)
75 01  G   Report Size (1), 
81 02  M   Input (Data, Variable, Absolute),  ;3 button bits 
95 01  G   Report Count (1), 
75 05  G   Report Size (5),                   ;Create 5 bit constant field
81 01  M   Input (Constant),                  ;5 bit padding 
05 01  G   Usage Page (Generic Desktop), 
09 30  L   Usage (X),  
09 31  L   Usage (Y), 
15 81  G   Logical Minimum (-127),  
25 7F  G   Logical Maximum (127),             ;Fields return values from -127 to 127
75 08  G   Report Size (8),  
95 02  G   Report Count (2),                  ;Create two 8 bit fields (X & Y position)
81 06  M   Input (Data, Variable, Relative),  ;2 position bytes (X & Y) 
C0     M  End Collection,                     ;Close Pointer collection
C0     M End Collection                       ;Close Mouse collection

Input Report (3 byte)

Byte Bits Description
0 0 Button 1
1 Button 2
2 Button 3
1 X displacement
2 Y displacement

101-Keyboard

標準HID装置なので、"Usage ID" が文字列でデバッグ表示されている。(なくてもよい)"Usage Minimum/Maximum" の用法に注目。

05 01  G Usage Page (Generic Desktop),
09 06  L Usage (Keyboard),
A1 01  M Collection (Application),            ;Start Keyboard collection
05 07  G  Usage Page (Key Codes),
19 E0  L  Usage Minimum (224),
29 E7  L  Usage Maximum (231),                ;Fields convert values from 224 to 231
15 00  G  Logical Minimum (0),
25 01  G  Logical Maximum (1),                ;Fields return values from 0 or 1
75 01  G  Report Size (1),                    ;Create eight 1 bit fields
95 08  G  Report Count (8),
81 02  M  Input (Data, Variable, Absolute),   ;Modifier byte (8 bits)
95 01  G  Report Count (1),
75 08  G  Report Size (8),
81 01  M  Input (Constant),                   ;Reserved byte (8 bits)
95 05  G  Report Count (5),
75 01  G  Report Size (1),
05 08  G  Usage Page (Page# for LEDs),
19 01  G  Usage Minimum (1),
29 05  G  Usage Maximum (5),                  ;Fields return values from 1 to 5
91 02  M  Output (Data, Variable, Absolute),  ;LED report (5 bits)
95 01  G  Report Count (1),
75 03  G  Report Size (3),
91 01  M  Output (Constant),                  ;LED report padding (3 bits)
95 06  G  Report Count (6),
75 08  G  Report Size (8),
15 00  G  Logical Minimum (0),
25 65  G  Logical Maximum(101),               ;Fields return values from 0 to 101
05 07  G  Usage Page (Key Codes),
19 00  G  Usage Minimum (0),
29 65  G  Usage Maximum (101),                ;Fields return values from 0 to 101
81 00  M  Input (Data, Array),                ;Key arrays (6 bytes)
C0     M End Collection                       ;Close Keyboard collection

Input Report (8 byte)

Byte Bits Description Key Top Name
0 Modifier keys
0 Key Code 224 Left Control
1 Key Code 225 Left Shift
2 Key Code 226 Left Alternate
3 Key Code 227 Left GUI
4 Key Code 228 Right Control
5 Key Code 229 Right Shift
6 Key Code 230 Right Alternate
7 Key Code 231 Right GUI
1 Reserved
2 Keycode 1
3 Keycode 2
4 Keycode 3
5 Keycode 4
6 Keycode 5
7 Keycode 6
  • Alternate - win/Alt, mac/Option
  • GUI - win/Windows, mac/Command

Output Report (LED's 1 byte)

Bit Description
0 NUM LOCK
1 CAPS LOCK
2 SCROLL LOCK
3 COMPOSE
4 KANA

CMSIS-DAP/EDBG (Full-Speed)

HIDクラスベンダー固有定義の、非常に単純な HID_REPORT の例。

06 00 FF  G Usage Page (Page# for Vendor-Specific),
09 01     L Usage (unknown),
A1 01     M Collection (Application),             ;Start collection
15 00     G  Logical Minimum (0),
25 FF     G  Logical Maximum (255),               ;Fields return values from 0 to 255
75 08     G  Report Size (8),                     ;Create 8 bit fields
95 40     G  Report Count (64),
09 01     L  Usage (unknown),
81 02     M  Input (Data, Variable, Absolute),    ;64 bytes input report
09 01     L  Usage (unknown),
91 02     M  Output (Data, Variable, Absolute),   ;64 bytes output report
95 04     G  Report Count (4),                    ;(optional)
09 01     L  Usage (unknown),                     ;(optional)
B1 02     M  Feature (Data, Variable, Absolute),  ;(optional) 4 bytes feature report
C0        M End Collection                        ;Close collection
  • 4回出てくる "Usage"アイテムは、(Local Itemなので)macosでは省略できるが、Windows(hidusb.sys)では省略できないようだ。
  • "Logical Minimum"アイテムは、引数が 0なので 14とだけ書くこともできる。

Input or Output Report is Binary Byte Array (64 byte)

  • 入出力とも 64バイトの固定長バイナリデータ。応用記述は冒頭に識別子とデータ長を書くことで、可変長データを編成する設計。
  • High/Super-Speed 装置では、512バイトペイロード版の HID_REPORT を返す。(OTHER_SPEED_CONFIGURATION で速度を変更し、SET_FUTURE でインターフェースを切り返る)

Feature Report is Binary Byte Array (4 byte)

  • OCD 割込等で使われる。使わないならこの3個のアイテムは省略できる。

関連リンク

LINKS

multix.jp/てくにかるむ(休眠中)
Multix Zinnia Product SDK [*AVR]
AVR.JP(日本語訳)
AVR-LIBC(日本語訳)

Clone this wiki locally