Skip to content

Instantly share code, notes, and snippets.

@akvadrako
Last active June 5, 2025 13:35
Show Gist options
  • Select an option

  • Save akvadrako/f334d36099802da2f80cb2b8b150b892 to your computer and use it in GitHub Desktop.

Select an option

Save akvadrako/f334d36099802da2f80cb2b8b150b892 to your computer and use it in GitHub Desktop.
Rapoo Mice Device Notes

USBHID Notes for Rapoo VT0Pro Mouse

Interface 1 - Keyboard

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

Standard Reports

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

Input / Output Report 186

  • 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

Firmware

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

Get mouse product ID (04)

Using dongle, Mouse is 0x4455

SET_REPORT 2 RID 186 I1 baa5 a404 0400 GET_REPORT 1 RID 186 I1 0100 0000 2544

Sleep

  • B5 = c0
  • B11 = sleep time (60s = 3c)
SET_REPORT 2 RID 186 I1 baff a504 c008 0000 0000 3c03 0000 (60s sleep)

Reset

  • B3 = ad523d
SET_REPORT 2 RID 186 I1 baff ad52 3d00 0000 0000 0000 0000 (reset)

Init (a300)

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

Get summary (a418 9808)

  • 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

DPI (0x98)

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

Motion sync (0xc4)

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

Polling rate (0x80):

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

Sleep time

SET_REPORT 2 RID 186 I1 baff a404 c408

Lift-Off

  • 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

Sensor Angle

  • 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)

Debounce

  • 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

report 187 - DPI

  • 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

report 188 - Rate

  • 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

Report 42: vendor 0x104 (60 bytes) - R/W:

# 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

Report 43: vendor 0x65 - feature buffer:

# 0x85, 0x2b,                    //  Report ID (43)                     234
# 0x09, 0x65,                    //  Usage (Vendor Usage 0x65)          236
# 0xb2, 0x02, 0x01,              //  Feature (Data,Var,Abs,Buff)        238

Report 44: usage 102-105, 32-byte values, read:

# 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

Report 45

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

Endpoint Descriptor:

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 0 - Mouse

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
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment