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).
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 Page và Usage 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 Collection5. Tra cứu nhanh
Tìm keycode cho một phím cụ thể không có trong các bảng ở trên:
- Mở HID Usage Tables (link bên dưới)
- Tìm Section 10: Keyboard/Keypad Page (0x07)
- 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 IDLinux evdev code khác HID keycode. Không dùng evdev code để điền vào HID report.
Bài liên quan
- HID Report Descriptor là gì?
- HID Keyboard Report Format là gì?
- USB Descriptor Overview là gì?
- HID Keyboard Baseline (blog)
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ị.
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.
HID Keyboard Report Format là gì?
Cấu trúc 8 byte của HID keyboard report: modifier byte, reserved byte, 6 keycode slot. Cách gửi report từ STM32 middleware.
CubeMX USB pitfalls thường gặp
Những điểm CubeMX không làm đúng khi generate USB code: HID mouse descriptor thay vì keyboard, NVIC không bật, Sof_enable DISABLE, USBD_static_malloc sai kích thước.
USB Descriptor Overview là gì?
Cấu trúc phân cấp USB descriptor: Device → Configuration → Interface → Endpoint. wTotalLength, bDescriptorType, cách host đọc từng bước và điểm dễ gây enumeration fail.
Biến note thành bài viết hoàn chỉnh
Notes là nơi ghi nhanh khái niệm.