[PR #325] ReversePuck firmware: show as a Steam Controller through a puck, fix trackpad haptics #290

Open
opened 2026-10-26 11:09:47 +00:00 by roman · 0 comments
Owner

📋 Pull Request Information

Original PR: https://github.com/safijari/openpuck/pull/325
Author: @MisterAnderson91
Created: 10/25/2026
Status: 🔄 Open

Base: main ← Head: reversepuck-firmware-fixes


📝 Commits (2)

  • 663224b ReversePuck firmware: enumerate as a Steam Controller through a puck, per-pad trackpad haptics
  • c8db85b ReversePuck firmware: report a far-future firmware build so Steam stops offering updates

📊 Changes

4 files changed (+89 additions, -24 deletions)

View changed files

📝 ReversePuckFirmware/ctrl_link.cpp (+8 -3)
📝 ReversePuckFirmware/deck_input.cpp (+68 -17)
📝 ReversePuckFirmware/deck_input.h (+4 -1)
📝 ReversePuckFirmware/identity.cpp (+9 -3)

📄 Description

ReversePuck firmware fixes: the Deck shows up on the host as a proper Steam Controller (not a generic Xbox pad), Steam no longer demands a firmware update before pairing (issue 299), and trackpad haptics reach the right pad.

One of three independent ReversePuck PRs (firmware fixes, pairing commands, Deck app + AppImage). They touch separate files and can be merged in any order.

Summary

  • 663224b Firmware: show as Steam Controller, no forced update, haptics fixed
  • c8db85b Optional: far-future firmware version stops Steam's update offers

Commits in detail

1. ReversePuck firmware: enumerate as a Steam Controller through a puck, per-pad trackpad haptics (ctrl_link.cpp, identity.cpp, deck_input.cpp/.h)

  • Enumeration bug: relayed 0x83/0xAE GETs arrive as [cmd][len][payload], but the parameters were read starting at the length byte. So 0xAE answered string index 0x15 ("NA") instead of the serial, Steam re-asked forever, and the host showed a generic Xbox pad.
  • Firmware build 0x6AA43B55: the previous 0x6A18D057 is exactly MUST_UPDATE_TRITON_FW_TS in Steam's hardwareupdater.cfg, so Steam demanded a firmware update before pairing (issue 299).
  • Haptics: the Deck ignores the 0xEB rumble that relayed trackpad haptics were flattened into. They're now passed to the Deck app as a new PULSE frame ([side][on_us][off_us][repeat], type 0x12) and played with the Deck's 0x8F pulse. Steam's 0x82 clicks ([pad][type][gain], pad 0 = left) become a short pulse on that pad, flipped to the Deck's 0 = right numbering. 0x81 pulses pass through as-is. Playing them needs the Deck app from the Deck app PR; the current app just ignores the new frame.

2. ReversePuck firmware: report a far-future firmware build so Steam stops offering updates (identity.cpp), optional
With commit 1, Steam pairs, but it keeps offering an update while it ships a newer build (TRITON_FW_TS, currently 0x6ACFF323). This reports 2035-01-01 (0x7A432B80), which stays below 0x80000000 so it can't read as ancient if compared as signed. If you'd rather not fake a future version, say so and I'll drop this commit; nothing else depends on it.

Testing

Hardware: Steam Deck OLED with a ReversePuck (Pro Micro nRF52840), an OpenPuck on 0.9.51, and the host running Steam on macOS.

  • Steam identifies the Deck as a Steam Controller (Controller Info: HWID: 72, FWTimestamp: 0x7A432B80), with no update offered, on the host and on the Deck's own Steam.
  • Trackpad haptics arrive within ~0.4 s of connecting and tick on the correct pad (with the updated Deck app).
  • make check (clang-format 18) passes, and make reversepuck builds.

Not tested: Linux and Windows hosts, and a real Valve puck.

🤖 Generated with Claude Code


🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.

## 📋 Pull Request Information **Original PR:** https://github.com/safijari/openpuck/pull/325 **Author:** [@MisterAnderson91](https://github.com/MisterAnderson91) **Created:** 10/25/2026 **Status:** 🔄 Open **Base:** `main` ← **Head:** `reversepuck-firmware-fixes` --- ### 📝 Commits (2) - [`663224b`](https://github.com/safijari/openpuck/commit/663224b4826b179eb1e7ab8540d4a8f25a564364) ReversePuck firmware: enumerate as a Steam Controller through a puck, per-pad trackpad haptics - [`c8db85b`](https://github.com/safijari/openpuck/commit/c8db85bb7a8a3ded5ce3f787f7a14e5b2746d6b8) ReversePuck firmware: report a far-future firmware build so Steam stops offering updates ### 📊 Changes **4 files changed** (+89 additions, -24 deletions) <details> <summary>View changed files</summary> 📝 `ReversePuckFirmware/ctrl_link.cpp` (+8 -3) 📝 `ReversePuckFirmware/deck_input.cpp` (+68 -17) 📝 `ReversePuckFirmware/deck_input.h` (+4 -1) 📝 `ReversePuckFirmware/identity.cpp` (+9 -3) </details> ### 📄 Description ReversePuck firmware fixes: the Deck shows up on the host as a proper Steam Controller (not a generic Xbox pad), Steam no longer demands a firmware update before pairing (issue 299), and trackpad haptics reach the right pad. One of three independent ReversePuck PRs (firmware fixes, pairing commands, Deck app + AppImage). They touch separate files and can be merged in any order. ## Summary - 663224b Firmware: show as Steam Controller, no forced update, haptics fixed - c8db85b Optional: far-future firmware version stops Steam's update offers ## Commits in detail **1. ReversePuck firmware: enumerate as a Steam Controller through a puck, per-pad trackpad haptics** (`ctrl_link.cpp`, `identity.cpp`, `deck_input.cpp/.h`) - **Enumeration bug:** relayed `0x83`/`0xAE` GETs arrive as `[cmd][len][payload]`, but the parameters were read starting at the length byte. So `0xAE` answered string index `0x15` (`"NA"`) instead of the serial, Steam re-asked forever, and the host showed a generic Xbox pad. - **Firmware build `0x6AA43B55`:** the previous `0x6A18D057` is exactly `MUST_UPDATE_TRITON_FW_TS` in Steam's `hardwareupdater.cfg`, so Steam demanded a firmware update before pairing (issue 299). - **Haptics:** the Deck ignores the `0xEB` rumble that relayed trackpad haptics were flattened into. They're now passed to the Deck app as a new `PULSE` frame (`[side][on_us][off_us][repeat]`, type `0x12`) and played with the Deck's `0x8F` pulse. Steam's `0x82` clicks (`[pad][type][gain]`, pad 0 = left) become a short pulse on that pad, flipped to the Deck's 0 = right numbering. `0x81` pulses pass through as-is. Playing them needs the Deck app from the Deck app PR; the current app just ignores the new frame. **2. ReversePuck firmware: report a far-future firmware build so Steam stops offering updates** (`identity.cpp`), **optional** With commit 1, Steam pairs, but it keeps *offering* an update while it ships a newer build (`TRITON_FW_TS`, currently `0x6ACFF323`). This reports 2035-01-01 (`0x7A432B80`), which stays below `0x80000000` so it can't read as ancient if compared as signed. If you'd rather not fake a future version, say so and I'll drop this commit; nothing else depends on it. ## Testing Hardware: Steam Deck OLED with a ReversePuck (Pro Micro nRF52840), an OpenPuck on 0.9.51, and the host running Steam on macOS. - Steam identifies the Deck as a Steam Controller (`Controller Info: HWID: 72, FWTimestamp: 0x7A432B80`), with no update offered, on the host and on the Deck's own Steam. - Trackpad haptics arrive within ~0.4 s of connecting and tick on the correct pad (with the updated Deck app). - `make check` (clang-format 18) passes, and `make reversepuck` builds. Not tested: Linux and Windows hosts, and a real Valve puck. 🤖 Generated with [Claude Code](https://claude.com/claude-code) --- <sub>🔄 This issue represents a GitHub Pull Request. It cannot be merged through Gitea due to API limitations.</sub>
Sign in to join this conversation.
No labels
pull-request
wontfix
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set

Reference
safijari/openpuck#290
No description provided.