USBHID Notes for Rapoo VT0Pro Mouse
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 1
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 0 [unknown]
bInterfaceProtocol 0
iInterface 5 Rapoo Gaming Device
HID Report Descriptor:
# 0x05, 0x01, // Usage Page (Generic Desktop) 0
# 0x09, 0x06, // Usage (Keyboard) 2
Report 0x02:
# 0xa1, 0x01, // Collection (Application) 4
# 0x85, 0x02, // Report ID (2) 6
Keyboard:
# 0x05, 0x07, // Usage Page (Keyboard) 8
8 Special keys (Shift, ctrl, etc):
# 0x19, 0xe0, // Usage Minimum (224) 10
# 0x29, 0xe7, // Usage Maximum (231) 12
# 0x15, 0x00, // Logical Minimum (0) 14
# 0x25, 0x01, // Logical Maximum (1) 16
# 0x75, 0x01, // Report Size (1) 18
# 0x95, 0x08, // Report Count (8) 20
# 0x81, 0x02, // Input (Data,Var,Abs) 22
1 byte Padding:
# 0x95, 0x01, // Report Count (1) 24
# 0x75, 0x08, // Report Size (8) 26
# 0x81, 0x03, // Input (Cnst,Var,Abs) 28
LEDs (Num Lock, etc):
# 0x95, 0x05, // Report Count (5) 30
# 0x75, 0x01, // Report Size (1) 32
# 0x05, 0x08, // Usage Page (LEDs) 34
# 0x19, 0x01, // Usage Minimum (1) 36
# 0x29, 0x05, // Usage Maximum (5) 38
# 0x91, 0x02, // Output (Data,Var,Abs) 40
3 bits padding:
# 0x95, 0x01, // Report Count (1) 42
# 0x75, 0x03, // Report Size (3) 44
# 0x91, 0x03, // Output (Cnst,Var,Abs) 46
6 byte array of pressed keys:
# 0x95, 0x06, // Report Count (6) 48
# 0x75, 0x08, // Report Size (8) 50
# 0x15, 0x00, // Logical Minimum (0) 52
# 0x26, 0xff, 0x00, // Logical Maximum (255) 54
# 0x05, 0x07, // Usage Page (Keyboard) 57
# 0x19, 0x00, // Usage Minimum (0) 59
# 0x2a, 0xff, 0x00, // Usage Maximum (255) 61
# 0x81, 0x00, // Input (Data,Arr,Abs) 64
# 0xc0, // End Collection 66
Report 0x04 - special keys, 16-bit value (0-896)
# 0x05, 0x0c, // Usage Page (Consumer Devices) 67
# 0x09, 0x01, // Usage (Consumer Control) 69
# 0xa1, 0x01, // Collection (Application) 71
# 0x85, 0x04, // Report ID (4) 73
# 0x19, 0x00, // Usage Minimum (0) 75
# 0x2a, 0x80, 0x03, // Usage Maximum (896) 77
# 0x15, 0x00, // Logical Minimum (0) 80
# 0x26, 0x80, 0x03, // Logical Maximum (896) 82
# 0x95, 0x01, // Report Count (1) 85
# 0x75, 0x10, // Report Size (16) 87
# 0x81, 0x00, // Input (Data,Arr,Abs) 89
# 0xc0, // End Collection 91
Report 0x03 - special keys 0x81 Power, Sleep, Wake:
# 0x05, 0x01, // Usage Page (Generic Desktop) 92
# 0x09, 0x80, // Usage (System Control) 94
# 0xa1, 0x01, // Collection (Application) 96
# 0x85, 0x03, // Report ID (3) 98
# 0x19, 0x81, // Usage Minimum (129) 100
# 0x29, 0x83, // Usage Maximum (131) 102
# 0x15, 0x00, // Logical Minimum (0) 104
# 0x25, 0x01, // Logical Maximum (1) 106
# 0x75, 0x01, // Report Size (1) 108
# 0x95, 0x03, // Report Count (3) 110
# 0x81, 0x02, // Input (Data,Var,Abs) 112
padding (5 bits):
# 0x95, 0x05, // Report Count (5) 114
# 0x81, 0x01, // Input (Cnst,Arr,Abs) 116
# 0xc0, // End Collection 118
- vendor 0x01 (31 bytes)
- vendor usage 1, page 1, 31 bytes
SET_REPORT
- Set value or request value
- B1 = ba (report ID)
- B2 = a5, ff (a5 for dongle, ff for usb)
- B3 = a3, a4, a5, ad (a3 = firmware, a4 = get, a5 = set)
- B4 = 04, 52, 18 ( ??? )
- B5 = c0, c4, 84, 98 (setting id)
- B6 = 08
1 3 5 7 9 11 13
SET_REPORT ba-- ---- ---- 0000 --00 ---- 0000 ....
GET_REPORT
- first byte is status: 2 = in progress, 1 = ready
Get mouse (dongle) fw: (byte 2 = 222):
SET_REPORT 2 RID 186 I1 baa5 a300
GET_REPORT 1 RID 186 I1 01de 0000 00
Get mouse (USB) fw:
SET_REPORT 2 RID 186 I1 baff a300
Get dongle firmware version (byte 2 = 213):
SET_REPORT 2 RID 186 I1 bab0 GET_REPORT 1 RID 186 I1 01d5
Using dongle, Mouse is 0x4455
SET_REPORT 2 RID 186 I1 baa5 a404 0400 GET_REPORT 1 RID 186 I1 0100 0000 2544
- B5 = c0
- B11 = sleep time (60s = 3c)
SET_REPORT 2 RID 186 I1 baff a504 c008 0000 0000 3c03 0000 (60s sleep)
- B3 = ad523d
SET_REPORT 2 RID 186 I1 baff ad52 3d00 0000 0000 0000 0000 (reset)
SET_REPORT 2 RID 186 I1 baff a300
GET_REPORT 1 RID 186 I1 01de 0000 00
GET_REPORT 1 RID 186 I1 01de 0000 00
- B5 = DPI
SET_REPORT 2 RID 186 I1 baff a418 9808
GET_REPORT 1 RID 186 I1 0100 0000 [ DPI ] 00 0201
GET_REPORT 1 RID 186 I1 0100 0000 0400 0201 50ff 00ff 0700 0000 0001 0203 0405 0607 0001 0001
Get current value:
SET_REPORT 2 RID 186 I1 baff a404 9808 0000 (98 = DPI)
GET_REPORT 1 RID 186 I1 0100 0000 0200 0201 (B5 = DPI)
GET_REPORT 1 RID 186 I1 0100 0000 0400 0201
# dongle
SET_REPORT 2 RID 186 I1 baa5 a404 9808 0000
GET_REPORT 1 RID 186 I1 0100 0000 0400 0201
Set:
- B5 = 98
- B9 = 01-06 (500, 1000, 1500, 2000, 3000, 8000, 19000)
- B11 = 0201
SET_REPORT 2 RID 186 I1 baff a504 9808 0000 0000 0201
SET_REPORT 2 RID 186 I1 baff a504 9808 0000 0200 0201
SET_REPORT 2 RID 186 I1 baff a504 9808 0000 0400 0201
# dongle
SET_REPORT 2 RID 186 I1 baa5 a504 9808 0000 0600 0201
SET_REPORT 2 RID 186 I1 baa5 a504 9808 0000 0100 0201
SET_REPORT 2 RID 186 I1 baff a404 c408 0000
GET_REPORT 1 RID 186 I1 0100 0000 fd00 0100
and something else (84):
SET_REPORT 2 RID 186 I1 baff a404 8408 0000
GET_REPORT 1 RID 186 I1 0100 0000 0100 0100
GET_REPORT 1 RID 186 I1 0100 0000 0101 0100
Get:
SET_REPORT 2 RID 186 I1 baff a404 8008 0000
GET_REPORT 1 RID 186 I1 0100 0000 01ff 08ff
GET_REPORT 1 RID 186 I1 0100 0000 01ff 04ff
GET_REPORT 1 RID 186 I1 0100 0000 01ff 81ff
# dongle
SET_REPORT 2 RID 186 I1 baa5 a404 8008
GET_REPORT 1 RID 186 I1 0100 0000 01ff 84ff
Set
- B9 = 01ff xxff
- xx = 08 (125), 04 (250), 02 (500), 01 (1000), 84 (2k), 82 (4k), 81 (8kHz)
SET_REPORT 2 RID 186 I1 baff a504 8008 0000 01ff 08ff
SET_REPORT 2 RID 186 I1 baff a504 8008 0000 01ff 04ff
SET_REPORT 2 RID 186 I1 baff a504 8008 0000 01ff 01ff
SET_REPORT 2 RID 186 I1 baff a504 8008 0000 01ff 81ff
# dongle
SET_REPORT 2 RID 186 I1 baa5 a504 8008 0000 08ff 84ff
SET_REPORT 2 RID 186 I1 baff a404 c408
- B5 = 84
- B9 = 00-0b
SET_REPORT 2 RID 186 I1 baff a504 8408 0000 0b00
SET_REPORT 2 RID 186 I1 baff a504 8408 0000 0100
SET_REPORT 2 RID 186 I1 baff a504 8408 0000 0100 0100
SET_REPORT 2 RID 186 I1 baff a404 8408 0000 0000 0000
- B5 = c4
- B9 = 00,f1
- B11 = 0100
SET_REPORT 2 RID 186 I1 baff a504 c408 0000 f100 0100 (-15)
SET_REPORT 2 RID 186 I1 baff a504 c408 0000 0000 0100 (0)
- B5 = c0
- B9 = 01-20 (1ms - 32ms)
- B11 = 3c03
SET_REPORT 2 RID 186 I1 baff a504 c008 0000 0100 3c03
SET_REPORT 2 RID 186 I1 baff a504 c008 0000 0200 3c03
SET_REPORT 2 RID 186 I1 baff a504 c008 0000 2000 3c03
- vendor 0x02 (6 bytes)
- R/W
- EP4 I1 RID 187 b051 e803 0160
- EP4 I1 RID 187 b051 b80b 0160
- bytes 2-3: 0x03e8 - 0x07d0 - DPI LE
- Vendor page 1, usage 2
- vendor 0x02 (9 bytes) - R/W:
byte 8: polling rate (Hz)
- 0x01 = 1000, 0x02 = 500, 0x04-0x08 = 250, 0x82= 2k, 0x84 = 1.5k
- vendor page 1, usage 2, 9 bytes
# 0x06, 0x0b, 0xff, // Usage Page (Vendor Usage Page 0xff0b) 200
# 0x0a, 0x04, 0x01, // Usage (Vendor Usage 0x104) 203
# 0xa1, 0x01, // Collection (Application) 206
# 0x15, 0x00, // Logical Minimum (0) 208
# 0x26, 0xff, 0x00, // Logical Maximum (255) 210
# 0x75, 0x08, // Report Size (8) 213
# 0x95, 0x3c, // Report Count (60) 215
# 0x85, 0x2a, // Report ID (42) 217
vendor 0x60 - read buffer:
# 0x09, 0x60, // Usage (Vendor Usage 0x60) 219
# 0x82, 0x02, 0x01, // Input (Data,Var,Abs,Buff) 221
vendor 0x61 - write buffer:
# 0x09, 0x61, // Usage (Vendor Usage 0x61) 224
# 0x92, 0x02, 0x01, // Output (Data,Var,Abs,Buff) 226
vendor 0x62 - feature buffer:
# 0x09, 0x62, // Usage (Vendor Usage 0x62) 229
# 0xb2, 0x02, 0x01, // Feature (Data,Var,Abs,Buff) 231
# 0x85, 0x2b, // Report ID (43) 234
# 0x09, 0x65, // Usage (Vendor Usage 0x65) 236
# 0xb2, 0x02, 0x01, // Feature (Data,Var,Abs,Buff) 238
# 0x17, 0x00, 0x00, 0x00, 0x80, // Logical Minimum (-2147483648) 241
# 0x27, 0xff, 0xff, 0xff, 0x7f, // Logical Maximum (2147483647) 246
# 0x75, 0x20, // Report Size (32) 251
# 0x95, 0x04, // Report Count (4) 253
# 0x85, 0x2c, // Report ID (44) 255
# 0x19, 0x66, // Usage Minimum (102) 257
# 0x29, 0x69, // Usage Maximum (105) 259
# 0x81, 0x02, // Input (Data,Var,Abs) 261
usage 138-141, 32-byte values, read:
# 0x85, 0x2d, // Report ID (45) 263
# 0x19, 0x8a, // Usage Minimum (138) 265
# 0x29, 0x8d, // Usage Maximum (141) 267
# 0x81, 0x02, // Input (Data,Var,Abs) 269
usage 142-145, 32 bytes values, write:
# 0x19, 0x8e, // Usage Minimum (142) 271
# 0x29, 0x91, // Usage Maximum (145) 273
# 0x91, 0x02, // Output (Data,Var,Abs) 275
# 0xc0, // End Collection 277
bLength 7
bDescriptorType 5
bEndpointAddress 0x84 EP 4 IN
bmAttributes 3
Transfer Type Interrupt
Synch Type None
Usage Type Data
wMaxPacketSize 0x0040 1x 64 bytes
bInterval 1
Interface Descriptor:
bLength 9
bDescriptorType 4
bInterfaceNumber 0
bAlternateSetting 0
bNumEndpoints 1
bInterfaceClass 3 Human Interface Device
bInterfaceSubClass 1 Boot Interface Subclass
bInterfaceProtocol 2 Mouse
iInterface 2 Rapoo Gaming Device
HID Device Descriptor:
# Rapoo Rapoo Gaming Device
# 0x05, 0x01, // Usage Page (Generic Desktop) 0
# 0x09, 0x02, // Usage (Mouse) 2
# 0xa1, 0x01, // Collection (Application) 4
# 0x09, 0x01, // Usage (Pointer) 6
# 0xa1, 0x00, // Collection (Physical) 8
# 0x05, 0x09, // Usage Page (Button) 10
# 0x19, 0x01, // Usage Minimum (1) 12
# 0x29, 0x05, // Usage Maximum (5) 14
# 0x15, 0x00, // Logical Minimum (0) 16
# 0x25, 0x01, // Logical Maximum (1) 18
# 0x95, 0x05, // Report Count (5) 20
# 0x75, 0x01, // Report Size (1) 22
# 0x81, 0x02, // Input (Data,Var,Abs) 24
# 0x95, 0x01, // Report Count (1) 26
# 0x75, 0x03, // Report Size (3) 28
# 0x81, 0x01, // Input (Cnst,Arr,Abs) 30
# 0x05, 0x01, // Usage Page (Generic Desktop) 32
# 0x09, 0x30, // Usage (X) 34
# 0x09, 0x31, // Usage (Y) 36
# 0x16, 0x01, 0x80, // Logical Minimum (-32767) 38
# 0x26, 0xff, 0x7f, // Logical Maximum (32767) 41
# 0x75, 0x10, // Report Size (16) 44
# 0x95, 0x02, // Report Count (2) 46
# 0x81, 0x06, // Input (Data,Var,Rel) 48
# 0x09, 0x38, // Usage (Wheel) 50
# 0x15, 0x81, // Logical Minimum (-127) 52
# 0x25, 0x7f, // Logical Maximum (127) 54
# 0x75, 0x08, // Report Size (8) 56
# 0x95, 0x01, // Report Count (1) 58
# 0x81, 0x06, // Input (Data,Var,Rel) 60
# 0x05, 0x0c, // Usage Page (Consumer Devices) 62
# 0x0a, 0x38, 0x02, // Usage (AC Pan) 64
# 0x15, 0x81, // Logical Minimum (-127) 67
# 0x25, 0x7f, // Logical Maximum (127) 69
# 0x75, 0x08, // Report Size (8) 71
# 0x95, 0x01, // Report Count (1) 73
# 0x81, 0x06, // Input (Data,Var,Rel) 75
# 0xc0, // End Collection 77
# 0xc0, // End Collection 78