protonscr

Steam Controller 2 (Triton/28DE:1304) shows raw text instead of button glyphs in ISteamInput games on Linux desktop

steamopen Steam controller
ValveSoftware/steam-for-linux#13198 · opened 2026-05-13 by Verdugo · updated 2026-07-07 · 3 comments · github
VVerdugo 2026-05-13 github

Summary

The Steam Controller 2 (codename Triton, puck mode 28DE:1304) shows raw action text (e.g. "Gamepad Face Button Right") instead of button glyphs in ISteamInput games on Linux desktop. The same games show proper glyphs with other controllers (GameSir G7 Pro → Xbox glyphs, PS4 → PlayStation glyphs).

Environment

  • OS: CachyOS (Arch-based), kernel 7.0.6
  • Desktop: KDE Plasma 6 (Wayland)
  • Steam client: stable (updated May 11, 2026)
  • Controller: Steam Controller 2, puck/dongle mode (28DE:1304 Valve Software Steam Controller Puck)
  • Game tested: Dune: Awakening (app 1172710) via Proton

Steps to Reproduce

  1. Connect Steam Controller 2 via USB puck
  2. Launch Steam and confirm SC2 appears in Settings → Controller
  3. Launch any ISteamInput-enabled game
  4. Observe button prompt display during gameplay

Expected Behavior

Button glyphs matching the SC2's hardware (or at minimum Steam Deck-style glyphs via shared images).

Actual Behavior

Raw text strings like "Gamepad Face Button Right" appear instead of any glyph.

Root Cause Analysis

Two related gaps:

1. Missing triton_ glyph images in Steam client

~/.local/share/Steam/controller_base/images/api/dark/ contains image sets for:
sc_ (gen-1 Steam Controller), sd_ (Steam Deck), ps4_, ps5_, xbox_, xbox360_, shared_, and others — but no triton_ prefix exists. Valve has not shipped SC2-specific glyph images.

2. Games compiled with pre-SC2 Steamworks SDK don't know SC2 action origins

The public Steamworks SDK (SteamInput001) has k_ESteamInputType_Count = 13 with no Steam Deck or Triton entry. When GetInputTypeForHandle() returns a new type value (≥13) for the SC2, games built against the old SDK call GetStringForActionOrigin() on unrecognized origins and display the raw string instead of a glyph.

3. Deck PCB serial registration error on Linux desktop

Controller log emits Deck Controller PCB Serial# invalid: NA on every SC2 connection (8+ times per session). Steam attempts to register the SC2 via the Steam Deck hardware path and fails. Configsets ARE loaded correctly afterward (configset_controller_triton.vdf and configset_controller_neptune.vdf both found on-disk), but the repeated error suggests the initialization path for SC2 on desktop Linux is following Deck-specific code that doesn't apply here.

Controller Log Excerpt

[2026-05-13 17:52:27] Deck Controller PCB Serial# invalid: NA
[2026-05-13 17:52:27] Deck Controller PCB Serial# invalid: NA
... (repeats 8+ times)
[2026-05-13 17:52:39] ConfigSet - found config set file on-disk: configset_FXA9960202025.vdf
[2026-05-13 17:52:39] ConfigSet - found config set file on-disk: configset_controller_neptune.vdf
[2026-05-13 17:52:39] ConfigSet - found ibex config set file on-disk: configset_controller_triton.vdf
[2026-05-13 17:56:45] Controller 0 mapping uses xinput : false

What Has Been Tried

  • Added 1172710controller_neptune_gamepad_joystick.vdf entry to configset_controller_triton.vdf — glyphs still show as text
  • Set UseSteamControllerConfig = "2" for app 1172710 in localconfig.vdf — no change
  • The Neptune template has controller_type = "controller_neptune", which is a type mismatch for Triton hardware

Requested Fix

  1. Ship triton_* glyph images in controller_base/images/api/ (matching the SC2's button layout, similar to how sd_* covers Steam Deck-unique buttons while shared_color_button_* covers ABXY)
  2. Push a Steamworks SDK update adding k_EInputActionOrigin_Triton_* constants so newly-compiled games can reference them directly
  3. Ensure TranslateActionOrigin(k_ESteamInputType_Unknown, triton_origin) maps SC2 origins to the nearest Neptune/shared equivalents for backward compatibility with games compiled against older SDKs
  4. Fix the Deck Controller PCB Serial# invalid: NA error for desktop Linux — SC2 should not be going through the Deck hardware registration path on a non-Deck system

Related

  • #13185 (Steam Controller 2 desktop mode on Hyprland — different symptom, same hardware)
OOver-mod 2026-05-18 github

I'm having the same issues on Arch, Kde Plasma

LLeon-Swains 2026-06-23 github

Having the same issue with Dune Awakening. Tested on Bazzite 43 with June 19th Steam Beta client & proton experimental.

Bbonzicode 2026-07-07 github

Adding a kernel-side data point that I haven't seen mentioned in the Triton/2026
threads yet: the in-kernel hid-steam driver has no device ID for the puck's
28de:1304
, so on the desktop the puck binds to hid-generic and stays in
lizard mode (it exposes Keyboard/Mouse input nodes instead of being claimed by
hid-steam).

Verified on a current kernel (Arch/CachyOS, 7.1.3-1-cachyos):

$ lsusb | grep 28de
Bus 001 Device 021: ID 28de:1304 Valve Software Steam Controller Puck

# all HID interfaces fall back to hid-generic, none claimed by hid-steam:
$ for d in /sys/bus/hid/devices/*28DE*1304*; do \
    echo "$(basename $d) -> $(basename $(readlink -f $d/driver))"; done
0003:28DE:1304.0016 -> hid-generic
0003:28DE:1304.0017 -> hid-generic
0003:28DE:1304.0018 -> hid-generic
0003:28DE:1304.0019 -> hid-generic
0003:28DE:1304.001A -> hid-generic

# resulting input nodes = lizard mode (keyboard/mouse emulation):
Valve Software Steam Controller Puck Keyboard
Valve Software Steam Controller Puck Mouse

# hid-steam only knows the old SC + Deck, not 0x1304:
$ modinfo hid_steam | grep -io '28DE[^ ]*' | sort -u
28DEp00001102
28DEp00001142
28DEp00001205

This matches mainline: drivers/hid/hid-ids.h in torvalds/linux currently only
defines USB_DEVICE_ID_STEAM_CONTROLLER (0x1102), ..._WIRELESS (0x1142) and
..._STEAM_DECK (0x1205) — there is no 0x1304.

I understand the in-game issues tracked here are largely userspace/config-side,
and that Steam talks to the device directly over hidraw regardless of the kernel
driver. But for desktop / non-Steam use, the puck being stuck in lizard mode
comes down to hid-steam not claiming 0x1304. It would be great if the 2026
controller/puck could get proper hid-steam support upstream (device ID plus
whatever report handling it needs to disable lizard mode), the same way the Deck
did. Happy to test patches — I have the hardware.

Proton versions