HID Usage Tables là gì?

Giải thích Usage Page và Usage trong HID. Bảng tra đầy đủ Keyboard/Keypad Page 0x07 (chữ, số, dấu câu, numpad, phím khoá, F-key).

Cập nhật 7 phút đọc
USB cover

HID Usage Tables là tài liệu chuẩn của USB-IF định nghĩa ý nghĩa của từng giá trị trong HID report. Không có Usage Tables, host biết firmware gửi một byte có giá trị 0x04 nhưng không biết byte đó nghĩa là gì, phím a, trục X của mouse, hay nút số 4 của gamepad.

Usage Page + Usage tạo thành cặp định danh duy nhất cho từng control. Nói cách khác, một con số trong HID report chỉ có ý nghĩa khi đi kèm Usage Page, cùng là 0x30, nhưng ở Generic Desktop có thể là trục X, còn ở page khác lại mang nghĩa hoàn toàn khác.

1. Usage Page và Usage

Usage Page là nhóm lớn: Generic Desktop, Keyboard, Mouse, Consumer, Game Controls…

Usage là control cụ thể trong nhóm đó: X Axis, Y Axis, Left Button, Key A, Volume Up…

Usage Page 0x01 (Generic Desktop)
  Usage 0x30 = X
  Usage 0x31 = Y
  Usage 0x38 = Wheel

Usage Page 0x07 (Keyboard/Keypad)
  Usage 0x04 = Keyboard a and A
  Usage 0x28 = Keyboard Return (Enter)
  Usage 0xE0 = Keyboard Left Control

Usage Page 0x0C (Consumer)
  Usage 0xE9 = Volume Increment
  Usage 0xEA = Volume Decrement
  Usage 0xCD = Play/Pause

Trong HID Report Descriptor, Usage PageUsage item khai báo ý nghĩa cho các field Input/Output tiếp theo.

2. Keyboard/Keypad Page (0x07): bảng tra đầy đủ

Đây là Usage Page dùng nhiều nhất khi viết firmware keyboard. Bảng dưới đây gom theo từng nhóm phím, đủ dùng cho phần lớn layout thực tế.

Chữ, số, phím điều khiển cơ bản

Mục Giá trị Ghi chú
0x00 No event (slot trống)
0x04-0x1D a-z (xem bảng tách riêng ở mục 3)
0x1E-0x27 1-9, 0
0x28 Enter
0x29 Escape
0x2A Backspace
0x2B Tab
0x2C Space

Dấu câu và ký tự đặc biệt

Mục Giá trị Ghi chú
0x2D - (Minus)
0x2E = (Equal)
0x2F [ (Left Bracket)
0x30 ] (Right Bracket)
0x31 \ (Backslash)
0x33 ; (Semicolon)
0x34 ' (Apostrophe)
0x35 ` (Grave Accent)
0x36 , (Comma)
0x37 . (Period)
0x38 / (Slash)

Phím khoá (Lock key)

Mục Giá trị Ghi chú
0x39 Caps Lock
0x47 Scroll Lock
0x53 Num Lock

Ba usage này là chiều Input (device gửi lên khi nhấn phím khoá) - tách biệt hoàn toàn với Output report mang trạng thái LED tương ứng, dù cùng chung một Report Descriptor. Chi tiết phân biệt hai chiều này nằm ở bài 5 HID Keyboard Baseline.

Function key và cụm điều hướng

Mục Giá trị Ghi chú
0x3A-0x45 F1-F12
0x68-0x73 F13-F24 (hiếm gặp trên keyboard phổ thông)
0x46 Print Screen
0x48 Pause
0x49 Insert
0x4A Home
0x4B Page Up
0x4C Delete
0x4D End
0x4E Page Down
0x4F Right Arrow
0x50 Left Arrow
0x51 Down Arrow
0x52 Up Arrow

Numpad (Keypad)

Mục Giá trị Ghi chú
0x54 Keypad /
0x55 Keypad *
0x56 Keypad -
0x57 Keypad +
0x58 Keypad Enter
0x59-0x61 Keypad 1-9
0x62 Keypad 0
0x63 Keypad . (Delete trên keypad)

Modifier

Mục Giá trị Ghi chú
0xE0 Left Ctrl
0xE1 Left Shift
0xE2 Left Alt
0xE3 Left GUI
0xE4 Right Ctrl
0xE5 Right Shift
0xE6 Right Alt
0xE7 Right GUI

Modifier không đi vào mảng keycode[6] như các phím khác - chúng đi vào riêng byte modifier dạng bitmask, đã giải thích ở HID Keyboard Report Format là gì?.

3. Bảng a-z nhanh

a = 0x04    n = 0x11
b = 0x05    o = 0x12
c = 0x06    p = 0x13
d = 0x07    q = 0x14
e = 0x08    r = 0x15
f = 0x09    s = 0x16
g = 0x0A    t = 0x17
h = 0x0B    u = 0x18
i = 0x0C    v = 0x19
j = 0x0D    w = 0x1A
k = 0x0E    x = 0x1B
l = 0x0F    y = 0x1C
m = 0x10    z = 0x1D

Pattern: a = 0x04, mỗi chữ cái tiếp theo tăng 1. Không theo ASCII.

4. Consumer Control, Usage Page 0x0C

Consumer Usage Page dùng cho media keys như volume, play/pause, next/prev track. Những control này thường cần một report format riêng. Nếu đặt chung trong cùng HID interface với keyboard report, firmware thường dùng Report ID để phân biệt keyboard report và consumer report.

Mục Giá trị Ghi chú
0xB5 Scan Next Track
0xB6 Scan Previous Track
0xB7 Stop
0xCD Play/Pause
0xE2 Mute
0xE9 Volume Increment
0xEA Volume Decrement
/* Consumer Control Report Descriptor snippet */0x05, 0x0C,        // Usage Page (Consumer)0x09, 0x01,        // Usage (Consumer Control)0xA1, 0x01,        // Collection (Application)0x85, 0x02,        //   Report ID (2)0x15, 0x00,        //   Logical Minimum (0)0x25, 0x01,        //   Logical Maximum (1)0x75, 0x01,        //   Report Size (1 bit)0x95, 0x04,        //   Report Count (4)0x09, 0xE9,        //   Usage (Volume Increment)0x09, 0xEA,        //   Usage (Volume Decrement)0x09, 0xCD,        //   Usage (Play/Pause)0x09, 0xB5,        //   Usage (Scan Next Track)0x81, 0x02,        //   Input (Variable)/* ... padding ... */0xC0,              // End Collection

5. Tra cứu nhanh

Tìm keycode cho một phím cụ thể không có trong các bảng ở trên:

  1. Mở HID Usage Tables (link bên dưới)
  2. Tìm Section 10: Keyboard/Keypad Page (0x07)
  3. Tra cột Usage ID

Trên Linux có thể xem keycode OS nhận được:

sudo evtest# Nhấn phím và xem output# KEY_A = 30, đây là Linux evdev code, khác với HID Usage ID

Linux evdev code khác HID keycode. Không dùng evdev code để điền vào HID report.

Bài liên quan

Nguồn tham khảo public

  • HID Usage Tables 1.5, USB-IF, Section 10: Keyboard/Keypad Page (0x07), Section 15: Consumer Page (0x0C)

Bài viết này hữu ích với bạn?

Chia sẻ, góp ý, hoặc ủng hộ nếu bạn thấy nội dung này có giá trị.

Góp ý

Nội dung liên quan

Một số bài viết, ghi chú hoặc project có liên quan đến nội dung bạn vừa đọc.

Biến note thành bài viết hoàn chỉnh

Notes là nơi ghi nhanh khái niệm.