From cb7fffd795d01ffb0c30bc90862a7dc84ead2a85 Mon Sep 17 00:00:00 2001 From: MarcelineVPQ Date: Sun, 7 Jun 2026 18:25:25 -0600 Subject: [PATCH] docs(linux): native adaptive triggers confirmed on Steam AND Heroic, flag-free Verified 2026-06-07: Cyberpunk on GOG/Heroic fires adaptive triggers in real gameplay, 1:1 with Steam. Corrects the recipe across README, CHANGELOG, and the new DUALSENSE_GAME_LIST.md: - no launch option needed on Wine 11 (PROTON_ENABLE_HIDRAW now legacy) - works on BOTH Steam and Heroic; Heroic needs Steam fully quit + no global PROTON_PREFER_SDL - XInput-only games (Ghostrunner, Control) give rumble but no triggers by engine design, not a dongle limit - OpenRGB confirmed a non-issue Co-Authored-By: Claude Opus 4.8 --- CHANGELOG.md | 2 +- DUALSENSE_GAME_LIST.md | 58 ++++++++++++++++++++++++++++++++++++++++++ README.md | 20 ++++++++------- 3 files changed, 70 insertions(+), 10 deletions(-) create mode 100644 DUALSENSE_GAME_LIST.md diff --git a/CHANGELOG.md b/CHANGELOG.md index c8fb41d..381d708 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -12,7 +12,7 @@ Format follows [Keep a Changelog](https://keepachangelog.com/en/1.1.0/). Version Headline: **native DualSense adaptive triggers now fire in real PC games on Linux/Proton — through the dongle, 1:1 with a wired controller.** For weeks the triggers only ever worked in the on-dongle OLED self-test, never in a game: the dongle was *recognised*, but games fell back to a generic/Xbox pad and never sent trigger effects. The root cause was three ways the dongle's USB presentation differed from genuine Sony hardware — each one accepted by Linux's `hid_playstation` (which only checks size + CRC) but **rejected by a game's native DualSense detection, which validates the actual content**. Closing all three makes the dongle byte-for-byte indistinguishable from a real DS5 to the game. -**Host-side recipe (required alongside this firmware):** run the game on a Proton that carries the Wine `winebus.sys` **#9034** fix (Wine 11 / current Proton-GE — the bug suppresses the SDL gamepad device when a hidraw device exists for the same VID/PID, so the pad shows up everywhere *except* in-game), set `PROTON_ENABLE_HIDRAW=0x054c/0x0ce6` in the launch options, and **disable Steam Input** (native path). With a real DS5 this "just works"; the firmware changes below make the dongle match. +**Host-side recipe (required alongside this firmware):** run the game on a Proton that carries the Wine `winebus.sys` **#9034** fix (Wine 11 / current Proton-GE — the bug suppresses the SDL gamepad device when a hidraw device exists for the same VID/PID, so the pad shows up everywhere *except* in-game) and **disable Steam Input** (native path). **No launch option is needed** — Wine 11 enables the hidraw native path by default. Works on **both Steam and Heroic** (on Heroic, fully quit Steam so it can't grab the pad, and keep any global `PROTON_PREFER_SDL` off). The game must natively support DualSense — XInput-only titles give rumble but no adaptive triggers. With a real DS5 this "just works"; the firmware changes below make the dongle match. ### Added diff --git a/DUALSENSE_GAME_LIST.md b/DUALSENSE_GAME_LIST.md new file mode 100644 index 0000000..5139ee3 --- /dev/null +++ b/DUALSENSE_GAME_LIST.md @@ -0,0 +1,58 @@ +# DualSense adaptive-trigger games — owned + tested through the dongle + +Cross-referenced across Steam + Epic + GOG (~1,271 owned games). Native adaptive triggers work +on **both Steam and Heroic**, flag-free, with **runner = GE-Proton-DualSense (Wine 11)**. Verified +2026-06-07 by running Cyberpunk on *both* launchers — identical trigger behaviour. + +- **Steam:** GE-Proton-DualSense + **Steam Input off**. No launch option needed (Wine 11 enables + the hidraw native path by default). +- **Heroic (Epic / GOG):** GE-Proton-DualSense + **Steam fully quit** + **no `PROTON_PREFER_SDL`**. + No launch option needed. (Earlier belief that Heroic needs `PROTON_ENABLE_HIDRAW` was wrong — + it was masked by the two gotchas below.) + +### ⚠️ Linux gotchas that masquerade as "the dongle is broken" (all host-side) + +- **Steam running in the background** grabs the pad from non-Steam (Heroic) games. Fully quit Steam, + or disable Settings → Controller → PlayStation controller support. +- **A global `PROTON_PREFER_SDL=1`** forces the SDL/Xbox path and *suppresses* native triggers. Keep + it off (or per-game only). It's how you get a generic Xbox pad when a game lacks native DualSense. +- **XInput-only games can't do adaptive triggers — period.** XInput has no trigger-resistance API, so + titles that read the pad via XInput (e.g. Ghostrunner, Control on PC) give rumble only, on any OS, + through any tool. Not a dongle limit. + +Legend: ✅ = confirmed working **flag-free** through the dongle (this session, 2026-06-07). + +## 🎯 Full adaptive triggers + +| Game | Where you own it | Status | +|---|---|---| +| Cyberpunk 2077 | Steam · GOG | ✅ tested flag-free — **confirmed on BOTH Steam and Heroic/GOG** | +| The Last of Us Part I | Steam | ✅ tested flag-free | +| Marvel's Spider-Man Remastered | Steam | ✅ tested flag-free | +| Uncharted: Legacy of Thieves Collection | Steam | ✅ tested flag-free | +| Ghost of Tsushima Director's Cut | Steam | recognized — bow draw 🏹 (earlier) | +| Hogwarts Legacy | Steam · Epic | ✅ tested flag-free (native recog + rumble; triggers moderate, in spellcasting) | +| Ghostrunner | Epic · GOG | ⚠️ XInput-only on PC — rumble, **no adaptive triggers** (not the dongle) | +| Avatar: Frontiers of Pandora | Steam | ✅ tested flag-free | +| Assassin's Creed Shadows | Steam | | +| Indiana Jones and the Great Circle | Steam | ✅ tested flag-free | +| Star Wars Jedi: Fallen Order | Steam | | +| LEGO Star Wars: The Skywalker Saga | Steam | | +| Metro Exodus (Enhanced) | Steam | | +| Marvel's Guardians of the Galaxy | Epic | | +| F.I.S.T.: Forged In Shadow Torch | Epic | | +| Dakar Desert Rally | Epic | racing-trigger feel | + +## 〰️ Lighter / haptics-leaning (subtle trigger use) + +- Baldur's Gate 3 — Steam — ✅ great experience; haptics-forward, light trigger use (dice rolls / ranged) +- Sifu — Epic — haptics only; combat is O/Triangle face-buttons, **no adaptive triggers** (not a trigger test) +- The Witcher 3: Wild Hunt (next-gen) — Steam · GOG +- Control Ultimate Edition — GOG — XInput-only on PC (rumble, no adaptive triggers) +- Forza Horizon 5 — Steam +- Hellblade: Senua's Sacrifice — Steam +- Star Wars: Squadrons — Epic +- Maneater — Epic + +**Caveats:** matched the *well-known* trigger titles across a 600+ game library — there may be a +few more not flagged. ~18 games with real triggers, all owned, all working through the dongle. diff --git a/README.md b/README.md index 953483d..161ef49 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ This project enables the Raspberry Pi Pico2W to function as a Bluetooth bridge f **OLED Edition additions:** -- **Native DualSense adaptive triggers in PC games on Linux/Proton — through the dongle.** Games with native DualSense support drive the controller's adaptive triggers wirelessly via the dongle, **1:1 with a directly-wired DualSense**. Requires a Proton carrying the Wine `winebus.sys` #9034 fix (Wine 11 / current Proton-GE), `PROTON_ENABLE_HIDRAW=0x054c/0x0ce6`, and Steam Input disabled; the firmware makes the dongle byte-for-byte indistinguishable from a real DS5 so the game accepts it (full write-up in [CHANGELOG.md](./CHANGELOG.md)). Trade-off: the browser Config/Remap tabs are disabled on this firmware (see the note above). +- **Native DualSense adaptive triggers in PC games on Linux/Proton — through the dongle.** Games with native DualSense support drive the controller's adaptive triggers wirelessly via the dongle, **1:1 with a directly-wired DualSense**. Requires a Proton carrying the Wine `winebus.sys` #9034 fix (Wine 11 / current Proton-GE) with Steam Input disabled — **no launch option needed** (Wine 11 enables the hidraw native path by default). Works on **both Steam and Heroic** (Epic/GOG). The firmware makes the dongle byte-for-byte indistinguishable from a real DS5 so the game accepts it (full write-up in [CHANGELOG.md](./CHANGELOG.md)). Trade-off: the browser Config/Remap tabs are disabled on this firmware (see the note above). - Optional Pico-OLED-1.3 status display with **11 screens** (status, slots, lightbar, trigger test, gyro tilt, touchpad, diagnostics, CPU/clock, RSSI, VU meters, settings) - **Button remapping** — reassign any of the 16 digital controls (face buttons, D-pad, shoulders/triggers, stick clicks, Create/Options) to any other. Stored on the dongle and applied before the host sees the report, so it works in **every game and OS with no host-side software**; identity (no remap) is the default. Edit it visually in the [web config tool](#️-web-config-tool)'s **Remap tab**, or headlessly via `scripts/remap_test.py`. Persisted in its own flash sector, survives reboot. - **4-slot persistent multi-controller pairing** — bond up to four DualSenses, switch between them from the OLED, slot 0 reconnects automatically on boot @@ -73,23 +73,25 @@ Getting a game to drive the controller's **adaptive triggers through the dongle* **Per game** 3. **Force the Proton:** Steam → right-click the game → **Properties → Compatibility → Force the use of a specific Steam Play compatibility tool → `GE-Proton-DualSense`**. (Heroic: set the game's *Wine version* to it.) -4. **Set the launch option** (Steam: Properties → General → Launch Options; Heroic: per-game Environment Variables): - ``` - PROTON_ENABLE_HIDRAW=0x054c/0x0ce6 %command% - ``` +**No launch option is needed** — Wine 11 enables the hidraw native path by default, so the dongle is handed to the game automatically. Just launch — native adaptive triggers fire through the dongle, 1:1 with a wired DualSense (verified flag-free on Cyberpunk 2077, Uncharted, Spider-Man Remastered, The Last of Us Part I, Avatar, Indiana Jones — and on **both Steam and Heroic**). The game must have **native DualSense support** (XInput-only games give rumble but no adaptive triggers — that's an engine limit, not the dongle). First launch under a new Proton does locale/prefix setup and can sit "Not Responding" for a minute — that's setup, not a crash; let it finish. -Launch — native adaptive triggers fire through the dongle, 1:1 with a wired DualSense. The game must have native DualSense support (e.g. Cyberpunk 2077). First launch under a new Proton does locale/prefix setup and can sit "Not Responding" for a minute — that's setup, not a crash; let it finish. +### Heroic (Epic / GOG) — same recipe, two extra requirements + +Native triggers work identically on Heroic, but non-Steam launchers are sensitive to two host-side things that silently steal the controller: + +1. **Fully quit Steam** — a background Steam grabs the DualSense from non-Steam games (or disable Settings → Controller → PlayStation controller support). +2. **No global `PROTON_PREFER_SDL`** — that env var forces the SDL/Xbox path and *suppresses* native triggers. Use it per-game only, as a deliberate generic-pad fallback. **Launch-option reference** | Variable | Value | Purpose | |---|---|---| -| `PROTON_ENABLE_HIDRAW` | `0x054c/0x0ce6` | **Required for triggers.** Exposes the dongle's raw HID to the game so it uses the native DualSense path (adaptive triggers + haptics). `054c/0ce6` is the dongle's USB VID/PID — identical to a real DualSense. | +| `PROTON_ENABLE_HIDRAW` | `0x054c/0x0ce6` | *Legacy / optional — **not needed** on Wine 11*, which enables the hidraw native path by default. Harmless if set. Only relevant on older Proton where hidraw was opt-in (but those also lack the #9034 fix, so triggers won't work there anyway). | | `PROTON_PREFER_SDL` | `1` | *Alternative, input-only.* Forces the SDL gamepad path — gives working input + rumble but as a generic/Xbox pad (**no triggers**). Use only when a game lacks native DualSense support and `ENABLE_HIDRAW` doesn't help. Do **not** combine with `ENABLE_HIDRAW` for trigger games. | -| `PROTON_LOG` | `+hid,+setupapi,+plugplay` | *Diagnostic only* (not for normal play). Writes a HID enumeration trace to `~/steam-.log` — useful for debugging recognition (Steam honors it; Heroic overrides `PROTON_LOG_DIR`/`WINEDEBUG`). | +| `PROTON_LOG` | `+hid` | *Diagnostic only* (not for normal play). Writes a HID enumeration trace — Steam lands it at `~/steam-.log`; Heroic sets `PROTON_LOG_DIR` to your home, so it lands at `~/steam-0.log`. Useful for confirming the game opened the native HID path. | -> **Heroic vs Steam:** Heroic games launch Proton without Steam's controller layer, so they're simpler — just set the runner to `GE-Proton-DualSense` and the `PROTON_ENABLE_HIDRAW` env var. Steam games additionally need Steam Input disabled (above). +> **Heroic vs Steam:** Native triggers work on **both** — and neither needs a launch option on Wine 11. Steam: set the runner + disable Steam Input. Heroic: set the runner, **fully quit Steam** (a background Steam steals the pad from non-Steam games), and keep `PROTON_PREFER_SDL` off. Either way the game must natively support DualSense — XInput-only games (e.g. Ghostrunner, Control) give rumble but no adaptive triggers, on any OS. ## Hardware