USB Initialization
These commands are send to the bulk endpoint (Unless specified HID) in order. Acks are laid out for your viewing pleasure.
Initialization Command 0x03
After this is sent, the controller will begin outputting over its HID endpoint at 4ms intervals with no motion inputs. This also tells the controller the MAC address of the game console.
Byte | Value | Notes |
---|---|---|
0 | 0x03 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x0D | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x01 | |
9 | 0x00 | |
10-15 | 0x00-0xFF | Console MAC Address (Little Endian) |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x03 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x0D | |
4 | 0x00 | |
5 | 0xF8 | 0xF0 |= Byte 4? |
6-7 | 0x00 | |
8 | 0x01 | |
9-11 | 0x00 |
Unknown Command 0x07
Byte | Value | Notes |
---|---|---|
0 | 0x07 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x01 | |
4-7 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x07 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x01 | |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-7 | 0x00 |
|
Unknown Command 0x16
Byte | Value | Notes |
---|---|---|
0 | 0x16 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x01 | |
4-7 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x16 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x01 | |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-31 | 0x00 |
|
Request Controller MAC Command 0x15 Arg 0x01
This seems to respond with the console’s MAC, with a bit masked off.
Controller is still reporting at 4ms interval via HID during all of this. (No motion data)
Byte | Value | Notes |
---|---|---|
0 | 0x15 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x01 | Argument |
4 | 0x00 | |
5 | 0x0E | |
6-8 | 0x00 | |
9 | 0x02 | |
10-15 | 0x00-0xFF | Console MAC Address(Little Endian) |
16 | Byte 14, with bit 0 masked off? | If byte was 0x31, it’s 0x30 here |
17-21 | 0x00-0xFF | Remainder of Console MAC Address (Little Endian) |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x15 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x01 | |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-7 | 0x00 | |
8 | 0x01 | |
9 | 0x04 | |
10 | 0x01 | |
11-16 | 0x00-0xFF | Gamepad MAC Address (Little Endian) |
LTK Request Command 0x15 Arg 0x02 (Unconfirmed)
This may be the reply with the long-term key for Bluetooth pairing
Byte | Value | Notes |
---|---|---|
0 | 0x15 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x02 | Argument |
4 | 0x00 | |
5 | 0x11 | |
6-8 | 0x00 | |
9-24 | 0x00-0xFF | LTK (?) Some 16 byte key |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x15 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x02 | Argument |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-7 | 0x00 | |
8 | 0x01 | |
9-24 | 0x00-0xFF | LTK (?) Some 16 byte key |
Unknown Command 0x15 Arg 0x03
Byte | Value | Notes |
---|---|---|
0 | 0x15 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x03 | Argument |
4 | 0x00 | |
5 | 0x01 | |
6-8 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x15 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x03 | Argument |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-7 | 0x00 | |
8 | 0x01 | Success flag? |
Unknown Command 0x09
Byte | Value | Notes |
---|---|---|
0 | 0x09 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x07 | |
4 | 0x00 | |
5 | 0x08 | |
6-15 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x09 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x07 | |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-7 | 0x00 |
IMU Command 0x0C Arg 0x02
Byte | Value | Notes |
---|---|---|
0 | 0x0C | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x02 | |
4 | 0x00 | |
5 | 0x04 | Ack not needed? |
6-7 | 0x00 | |
8 | 0x27 | |
9-11 | 0x00 |
ACK
No ACK sent back.
SPI/FLASH/DATA Read Command 0x02 (ADDR 0x00013080)
Used for reading some kind of configuration data.
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x40 | Length (64 bytes) |
9 | 0x7e | Read |
10-11 | 0x00 | |
12 | 0x80 | Address field 3 |
13 | 0x30 | Address field 2 |
14 | 0x01 | Address field 1 |
15 | 0x00 | Address field 0 (Little endian) |
Here, we finally get some input that is interesting and has a new report ID. I will have to compare this between different gamepads. This is likely the configuration information, or details on controller colors, model, etc. Unconfirmed.
Part 1 and 2 are likely the factory config, then the user config.
Pro Con 2 Example 1 (Consistent between plugs)
0000 02 01 00 04 00 f8 00 00 40 00 00 00 80 30 01 00
0010 01 ad d9 9a 55 56 65 a0 00 0a a0 00 0a e2 20 0e
0020 e2 20 0e 9a ad d9 9a ad d9 0a a5 50 0a a5 50 2f
0030 f6 62 2f f6 62 0a ff ff a3 a7 87 35 06 5f 1c c6
0040 5c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
GC NSO Example 1
0000 02 01 00 04 00 f8 00 00 40 00 00 00 80 30 01 00
0010 ff 47 79 94 b8 86 6b a0 00 0a a0 00 0a ff ff ff
0020 ff ff ff ff ff ff ff ff ff be e3 3b be e3 3b 06
0030 65 50 06 65 50 0a ff ff ef 37 7f fa f4 4c b2 54
0040 4c ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
SPI Read 2 (ADDR 0x000130C0)
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x40 | Length (64 bytes) |
9 | 0x7e | Read? |
10-11 | 0x00 | |
12 | 0xC0 | Addr |
13 | 0x30 | Addr |
14 | 0x01 | Addr |
15 | 0x00 | Addr |
Pro Con 2 Example 1 (Consistent between plugs)
0000 02 01 00 04 00 f8 00 00 40 00 00 00 c0 30 01 00
0010 01 ad d9 9a 55 56 65 a0 00 0a a0 00 0a e2 20 0e
0020 e2 20 0e 9a ad d9 9a ad d9 0a a5 50 0a a5 50 2f
0030 f6 62 2f f6 62 0a ff ff b1 a8 83 b6 35 5e 27 26
0040 64 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
GC NSO Example 1
0000 02 01 00 04 00 f8 00 00 40 00 00 00 c0 30 01 00
0010 ff 47 79 94 b8 86 6b a0 00 0a a0 00 0a ff ff ff
0020 ff ff ff ff ff ff ff ff ff 18 83 31 18 83 31 5f
0030 f4 45 5f f4 45 0a ff ff 17 08 80 4b f4 43 ab b4
0040 48 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
SPI Read 3 (ADDR 0x001FC040)
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x40 | Length (64 bytes) |
9 | 0x7e | Read? |
10-11 | 0x00 | |
12 | 0x40 | Addr |
13 | 0xC0 | Addr |
14 | 0x1F | Addr |
15 | 0x00 | Addr |
Pro Con 2 Example 1 (Consistent between plugs)
0000 02 01 00 04 00 f8 00 00 40 00 00 00 40 c0 1f 00
0010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
GC NSO Example 1
0000 02 01 00 04 00 f8 00 00 40 00 00 00 40 c0 1f 00
0010 b2 a1 f1 97 7f f8 44 4c ae f4 4d ff ff ff ff ff
0020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0030 b2 a1 13 48 80 52 04 45 a5 c4 48 ff ff ff ff ff
0040 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
SPI Read 4 (ADDR 0x00013040)
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x40 | Length (64 bytes) |
9 | 0x7e | Read? |
10-11 | 0x00 | |
12 | 0x40 | Addr |
13 | 0x30 | Addr |
14 | 0x01 | Addr |
15 | 0x00 | Addr |
Pro Con 2 Example 1 (Consistent between plugs)
0000 02 01 00 04 00 f8 00 00 10 00 00 00 40 30 01 00
0010 16 f4 d3 41 48 ce 85 ba f1 05 71 ba 1f 27 cb 3b
GC NSO Example 1
0000 02 01 00 04 00 f8 00 00 10 00 00 00 40 30 01 00
0010 4c fe c3 41 7c 11 df 3a 4b ce 41 bc 93 35 4e bc
SPI Read 5 (ADDR 0x00013100)
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x40 | Length (64 bytes) |
9 | 0x7e | Read? |
10-11 | 0x00 | |
12 | 0x00 | Addr |
13 | 0x31 | Addr |
14 | 0x01 | Addr |
15 | 0x00 | Addr |
Pro Con 2 Example 1 (Consistent between plugs)
0000 02 01 00 04 00 f8 00 00 18 00 00 00 00 31 01 00
0010 00 00 00 00 00 00 00 00 00 00 00 00 2d 10 a7 3d
0020 e7 49 35 3c a4 2d 20 41
GC NSO Example 1
0000 02 01 00 04 00 f8 00 00 18 00 00 00 00 31 01 00
0010 00 00 00 00 00 00 00 00 00 00 00 00 e3 75 ae bc
0020 5b b6 da be 1f 9f 1e 41
OUT Unknown Command 0x11
Byte | Value | Notes |
---|---|---|
0 | 0x11 | Command |
1 | 0x91 | |
2 | 0x00 | Unknown |
3 | 0x03 | Command? |
4-7 | 0x00 |
Pro Con 2 Example 1 (Consistent between plugs)
0000 11 01 00 03 00 f8 00 00 01 20 03 00 00 0a e8 1c
0010 3b 79 7d 8b 3a 0a e8 9c 42 58 a0 0b 42 0a e8 9c
0020 41 58 a0 0b 41
SPI Read 6 (ADDR 0x00013060)
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | 0x40 | Length (64 bytes) |
9 | 0x7e | Read? |
10-11 | 0x00 | |
12 | 0x60 | Addr |
13 | 0x30 | Addr |
14 | 0x01 | Addr |
15 | 0x00 | Addr |
Pro Con 2 Example 1 (Consistent between plugs)
0000 02 01 00 04 00 f8 00 00 20 00 00 00 60 30 01 00
0010 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
0020 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff
Unknown Command 0x0A
Byte | Value | Notes |
---|---|---|
0 | 0x0A | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x08 | |
4 | 0x00 | |
5 | 0x14 | |
6-7 | 0x00 | |
8 | 0x01 | |
9-16 | 0xFF | |
17 | 0x35 | |
18 | 0x00 | |
19 | 0x46 | |
20-27 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x0A | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x08 | Command (Matches) |
4 | 0x00 | Maybe unused |
5 | 0xF8 | ACK |
6-7 | 0x00 |
IMU Command 0x0C Arg 0x04
Byte | Value | Notes |
---|---|---|
0 | 0x0C | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0x04 | |
6-7 | 0x00 | |
8 | 0x27 | |
9-11 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x0C | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x04 | |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-11 | 0x00 |
From here on, the motion control data is enabled and being sent.
Enable Haptics (Probably) 0x03
Byte | Value | Notes |
---|---|---|
0 | 0x03 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x0A | |
4 | 0x00 | |
5 | 0x04 | Value |
6-7 | 0x00 | |
8 | 0x09 | |
9-11 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x03 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x0A | |
4 | 0x00 | |
5 | 0xF8 | ACK |
6-7 | 0x00 |
Haptic OUTPUT Report (HID) 0x02
Byte | Value | Notes |
---|---|---|
0 | 0x02 | Report ID |
1-5 | ?? | Haptic Data L/R |
6-16 | 0x00 | Unused |
17-22 | ?? | Haptic Data L/R |
23-63 | 0x00 |
OUT Unknown Command 0x10
Byte | Value | Notes |
---|---|---|
0 | 0x10 | Command |
1 | 0x91 | |
2 | 0x00 | |
3 | 0x01 | |
4-7 | 0x00 |
No ACK
OUT Unknown Command 0x01
Byte | Value | Notes |
---|---|---|
0 | 0x01 | Command |
1 | 0x91 | |
2 | 0x00 | Unknown |
3 | 0x0C | Command? |
4-7 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x01 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x0C | Command (Matches) |
4 | 0x00 | Maybe unused |
5 | 0xF8 | ACK |
6-7 | 0x00 | |
8 | 0x61 | |
9 | 0x12 | |
10 | 0x50 | |
11 | 0x10 |
|
OUT Unknown Command 0x03
Byte | Value | Notes |
---|---|---|
0 | 0x03 | Command |
0 | 0x91 | |
1 | 0x00 | Unknown |
2 | 0x01 | Command? |
3-6 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x03 | Command |
1 | 0x01 | |
2 | 0x00 | |
3 | 0x01 | Command (Matches) |
4 | 0x00 | Maybe unused |
5 | 0xF8 | ACK |
6-9 | 0x00 | |
10 | 0x40 | |
11 | 0xF0 | |
12-13 | 0x00 | |
14 | 0x60 | |
15 | 0x00 |
OUT Unknown Command 0x0A
Byte | Value | Notes |
---|---|---|
0 | 0x0A | Command |
0 | 0x91 | |
1 | 0x00 | Unknown |
2 | 0x02 | |
3 | 0x00 | |
4 | 0x04 | |
5-6 | 0x00 | |
7 | 0x03 | |
8-10 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x0A | Command |
0 | 0x01 | |
1 | 0x00 | |
2 | 0x02 | |
3 | 0x00 | |
4 | 0xF8 | ACK |
5-6 | 0x00 |
Set Player LED 0x09
Byte | Value | Notes |
---|---|---|
0 | 0x09 | Command |
1 | 0x91 | |
2 | 0x00 | Unknown |
3 | 0x07 | |
4 | 0x00 | |
5 | 0x08 | |
6-7 | 0x00 | |
8 | Varies | LED To Light Up (Bitfield) 0x0, 0x1, 0x3, 0x7 etc. |
9-15 | 0x00 |
ACK
Byte | Value | Notes |
---|---|---|
0 | 0x09 | Command |
0 | 0x01 | |
1 | 0x00 | |
2 | 0x07 | |
3 | 0x00 | |
4 | 0xF8 | ACK |
5-7 | 0x00 |