USB Offset | Bluetooth Offset | Common offset | Name | Values | Example Value | Notes | |
---|---|---|---|---|---|---|---|
0 | 0 | - | Report ID | Bluetooth: 49 USB: 2 |
49 = 0x31 2 |
Field is always present and set for Bluetooth Dualsense Field does not exist in USB Dualsense (Offset by -1) |
|
- | 1 | - | (Bluetooth) Sequence Tag |
2 | 2 | On Bluetooth, this field increments to 0xF then resets, in the 4 most significant bits: 0bXXXX_0000 |
|
- | - | Bluetooth Magic Tag | 0x10 | 0x10 | Dualsense-Explorer: Required, otherwise controller ignores packet DSX: This value does not exist Android: This value exists (https://github.com/nondebug/dualsense/blob/8652ab7b8f4bd00f0f98636ca96b404d0a3afd9b/dualsense-explorer.html#L903) ??? Why doesnt DSX use this magic tag? |
||
1 | 2 | 0 | (Flag0): Compatibility? | Compatible Vibration: 0bX1 Haptics Select: 0b1X |
0b1100 | Defined as feature select https://github.com/Ohjurot/DualSense-Windows/blob/0b869f4e34e4a6b608023a2f1e19bc28c037b64f/VS19_Solution/DualSenseWindows/src/DualSenseWindows/DS5_Output.cpp#L4 DSX sets 0b11 if USB haptic rumble mode, but audio is not actively playing. This likely avoids audio issues if mode changes. |
|
2 | 3 | 1 | (Flag1): Feature Controls | Mic Mute LED Control: 0bXXXX_XXX1 Power Save Control: 0bXXXX_XX1X Lightbar Control: 0bXXXX_X1XX (Changes the current color) Release LED's: 0bXXXX_1XXX (Turns off all LED's) Player Indicator Control: 0bXXX1_XXXX ? Disable Rumble: 0bX1XX_XXXX ?: 0b11XX_XXXX |
0b0101_0101 | This mask likely exists for power optimizing? DSX Enables Mic Mute LED, Lightbar, and Player LED's (0bXXX1_0101) The 0b11XX_XXXX flag is unknown, but is always set, on both DSX and Dualsense-Explorer Context clues lead me to believe that 0bX1XX_XXXX is Rumble Control Proof: DSX enables this bit when Left/Right motor have non-zero values, otherwise unsets it. |
|
3 | 4 | 2 | Right motor | [0, 255] | 0 | ||
4 | 5 | 3 | Left motor | [0, 255] | 0 | ||
5 | 6 | 4 | Audio | Headset Volume | 0 or [30, 127] | 0 | (Audio Haptics USB Only) |
6 | 7 | 5 | Speaker Volume | 0 or [61, 100] | 0 | ||
7 | 8 | 6 | ? | 64 | 0 | ||
8 | 9 | 7 | ? | 108 | 0 | ||
9 | 10 | 8 | Mic Mute LED | 0: Off, 1: On, 2: Breathing | 0 | Breathing is slow sinusoidal pulsing. | |
10 | 11 | 9 | Power Save Control | Hardware MIC Mute: 0bXXX1_XXXX | 0 | https://android.googlesource.com/kernel/msm.git/+/9882769164efdf1f2e1673bce4be1d1092ed89b2%5E%21/ | |
11 | 12 | 10 | Right Haptic Trigger | Effect Mode | 1: Simple Resistance {1, start, force} 2: Trigger {2, start, end, force} 5: Reset {5} 6: Repeat Trigger {6, freq, strength, start} 17: Limited Resistance {17, start, force} 18: Limited Trigger {18, start, end, force} 33: Resistance {33, } 34: Bow {34, } 35: Galloping {35, } 37: Semi Automatic {37, } 38: Automatic {38, } 39: Machine {39, } |
0 | https://github.com/Etaash-mathamsetty/trigger-control/blob/18b1b8f31f4c8dc0c6aeb20d69cd7f475a479017/libtrigger-control/ds-trigger-control.h#L16 DSX(Steam) has even more trigger values defined. |
12 | 13 | 11 | Effect Parameter 1 | 0 | Unused parameters are zero | ||
13 | 14 | 12 | Effect Parameter 2 | 0 | |||
14 | 15 | 13 | Effect Parameter 3 | 0 | |||
15 | 16 | 14 | Effect Parameter 4 | 0 | |||
16 | 17 | 15 | Effect Parameter 5 | 0 | |||
17 | 18 | 16 | Effect Parameter 6 | 0 | |||
18 | 19 | 17 | Effect Parameter 7 | 0 | |||
19 | 20 | 18 | Effect Parameter 8 | 0 | |||
20 | 21 | 19 | Effect Parameter 9 | 0 | |||
21 | 22 | 20 | Effect Parameter 10 | 0 | |||
22 | 23 | 21 | Left Haptic Trigger | Effect Mode | (same) | 0 | (same) |
23 | 24 | 22 | Effect Parameter 1 | 0 | |||
24 | 25 | 23 | Effect Parameter 2 | 0 | |||
25 | 26 | 24 | Effect Parameter 3 | 0 | |||
26 | 27 | 25 | Effect Parameter 4 | 0 | |||
27 | 28 | 26 | Effect Parameter 5 | 0 | |||
28 | 29 | 27 | Effect Parameter 6 | 0 | |||
29 | 30 | 28 | Effect Parameter 7 | 0 | |||
30 | 31 | 29 | Effect Parameter 8 | 0 | |||
31 | 32 | 30 | Effect Parameter 9 | 0 | |||
32 | 33 | 31 | Effect Parameter 10 | 0 | |||
33 | 34 | 32 | ? | ||||
34 | 35 | 33 | ? | ||||
35 | 36 | 34 | ? | ||||
36 | 37 | 35 | ? | ||||
37 | 38 | 36 | Rumble Intensity | [0, 7]: Reversed; 7 is low strength, 0 is high strength | |||
38 | 39 | 37 | ? | ||||
39 | 40 | 38 | (Flag2) Player LED Brightness, Enhanced Rumble |
? 0bXX1: Enable LED 0bX1X: Lightbar setup ? 0b1XX: Enhanced Rumble |
0bX11 Is always set on DSX; Enhanced Rumble (0b1XX) is optional Set to 0bX1X for startup breathing animation. Lightbar will be blue if lightbar setup is not set. If this happens, lightbar must be reset by disabling LED's (Flag1 : set Release LED's), then reenabling (Flag1 : unset Release LED's) |
||
40 | 41 | 39 | ? | ||||
41 | 42 | 40 | ? | ||||
42 | 43 | 41 | Lightbar Setup | 0b01: Disable, 0b10: Enable | Set to 0bX1X for startup breathing animation. DSX disables lightbar (1) until three seconds after connecting. Then set to 2. TODO test if these states are strictly exclusive; i.e., whether 0b10 is required for enabled, vs the lack of 0b01 to explicitly disable. |
||
43 | 44 | 42 | Player Mute LED Brightness | Low: 2, Medium: 1, High: 0 | |||
44 | 45 | 43 | Players LED Mask | [0b00000, 0b11111] | |||
45 | 46 | 44 | Touchpad Red Color | [0, 255] | DSX sets lights to full intensity (ds4) or varied intensity (ds5). | ||
46 | 47 | 45 | Touchpad Green Color | [0, 255] | |||
47 | 48 | 46 | Touchpad Blue Color | [0, 255] | |||
48 | 49 | 47 | Dualsense Edge | ? | If Dualsense Edge: 1 | ||
49 | 50 | 48 | ? Profile | 0b1X: Is internal profile switching haptics toggled? 0bX1: Is internal profile switching LED toggled? |
|||
50 | 51 | 49 | |||||
51 | 52 | 50 | |||||
52 | 53 | ||||||
53 | 54 | ||||||
54 | 55 |