1.1.0
Acts on the first round of user feedback against 1.0.1.
Download x20ctl.exe and run it. No install, no Python needed.
Added
- Taskbar tray icon showing battery, with Show and Quit
- Swap left and right sticks, on the Sticks page
- Swap L2 and R2, on the Triggers page
- Home button in the Test page, via XInputGetStateEx
- Macros now load from the controller on connect, all four at once
Changed
- Power moved out of Advanced: a sleep timer needs no warning
- Power page says it is reading, instead of showing a value it has not read
- Battery readings carry the raw status byte, and
report.pyprints it
Fixed
- Idle shutdown showed 10 minutes regardless of what the controller held
- Chunked
HOST_MENUrecords silently truncated: continuations were sent as a
bare index byte, which that opcode answers with silence tools/ble_enum.pyread an OTA characteristic while claiming to skip OTA
Protocol
HOST_MENUkind 6 is macro step data; this pad reports 42 steps per slot- Kind 7 is the device can-change list, and this pad does not answer it
- The full
SET_MODEpage table,05 DF AB 00 <a> <b>, including which pair
enters firmware update SET_MODE 03 DF AB 0A–0Fare a 5 ms uptime counter, not six features- The USB bootloader's command set: opcode
0xF1reads the same GUID as
HOST_GUIDdoes over BLE, and there is no bulk read at all - Lighting writes are chunkable and do land; the LEDs ignore them regardless
Known limitations
- Colour, brightness and RGB mode are on-pad only (
C+R3,C+L3).
caps.lightingis zero and KeyLinker cannot change them either. - Battery has four steps because the controller reports four; the intermediate
decode is unconfirmed against a discharging pad. - Rear buttons cannot appear to Steam Input as their own buttons: the firmware
replays them as existing buttons. - The 2.4 GHz receiver carries no configuration channel.