Skip to content

v2.0.0 — WiFi config, plain-DualSense USB, Wake-on-LAN

Choose a tag to compare

@kungaa kungaa released this 09 Jul 15:16
· 18 commits to ds5-linux-bridge since this release

This is a major release. The configuration transport moved from a USB network device to onboard WiFi, and over USB the adapter now presents a plain DualSense by default. Wake-on-LAN, a redesigned web UI, and a large batch of Bluetooth pairing/reliability fixes land alongside it.

⚠️ Requires Decky Loader plugin v0.4.0 or newer. The plugin talks to the redesigned on-device web API; older plugin versions will not work with this firmware.

⚠️ Breaking change. The USB network config interface is gone and the on-flash config layout changed. Configuration now happens over WiFi at http://ds5.local/. Re-onboard the adapter to your network after flashing (see the User Guide).

Highlights

  • 📶 WiFi is the config transport. Configure the adapter over your own WiFi at http://ds5.local/ — no USB network device, no WebHID (which never worked in Firefox). On first boot it opens its own setup network, DS5-Setup-XXXX; join it and browse to http://10.55.55.105/ to pick your WiFi.
  • 🎮 Plain-DualSense USB face by default. Over USB the adapter presents only the controller — no keyboard, no network device — so anticheat sees a normal DualSense.
  • 🖥️ Wake-on-LAN. Press the controller's PS button to wake a sleeping or fully-off PC over the network — including S4/S5, which USB wake can't reach. Now supports a second WOL target, and Wake fires all configured targets.
  • ⌨️ USB wake keyboard is now a runtime web toggle — off unless you turn it on, instead of a compile-time build. Wake by USB and Wake-on-LAN are configured side by side.
  • 🌐 Redesigned web UI — a single tabbed page for settings, Wake, Wake-on-LAN, and paired-controller management.

Bluetooth pairing & reliability

  • Bonds persist on fresh units (#2). Fixed a first-boot failure where the BTstack link-key store never formatted, so freshly-flashed adapters reported zero bonds. Link keys are now stored flash-safely (core1 parked during the write) and the SSP key is stored by us so DualSense bonds survive.
  • Race-free incoming-connection gate + inquiry re-arm. Reworked the classic-connection accept/reject path onto a proper connection filter, fixed inquiry re-arming mid-connect, and closed a pairing-window leak that left inquiry running with a bond present.
  • Wake-wedge fix. Distinct bcdDevice per USB variant so Windows re-reads the descriptor across an S3 wake instead of reusing a stale cached one — fixes the controller-off → S3 → controller-on-to-wake path that left the gamepad and audio dead.
  • DS5 detection fix. A too-aggressive runt-frame guard was skipping the 1-byte HID handshake that identifies a non-Edge DualSense, so the watchdog killed every connection; restored.

Hardening & performance

  • BT HID input-latency path optimized; hot-path glue relocated to RAM; RP2350 overclocked to 200 MHz; HID report emitted before the audio loop.
  • Input hardening. Clamp GET_REPORT, guard out-of-bounds reads on runt HID/L2CAP frames, stop logging link keys, and throttle the tud_hid_report error log so it can't flood UART.
  • AP-mode API allowlist so only onboarding endpoints are reachable before the adapter has joined a network.
  • Config store reworked to a size-migrated, append-only 512-byte layout with retry-on-failure and a factory reset, moved off the last flash sector (which the bootrom erases on reflash).

Firmware

CI builds and attaches the UF2s for standard (Pico 2 W), verbose-diagnostics, Waveshare RP2350B-Plus-W, and Pico W automatically.