steam-controller-dsu 0.3.0

DSU (CemuHook) server for the Gyro on Steam Controller (2026)
steam-controller-dsu-0.3.0 is not a library.

steam-controller-dsu

Crates.io Version Crates.io License

This is a DSU (CemuHook) UDP server for supplying the input data (including gyro) from Steam devices.

Supported Devices

  • Steam Controller 2026 (codename Triton)
  • Steam Conteroller Legacy (2015)

Install

Cargo

  1. Install Rust and Cargo
  2. Ensure you have development files for libudev (libudev-dev on Debian, systemd-devel on Fedora, systemd on Arch, eudev-libudev-devel on Void)
  3. cargo install steam-controller-dsu

Manual

  1. Ensure you have libudev (it should be already present on systemd distros, it is eudev-libudev on Void)
  2. Download the latest release binary from here, make sure it's executable, and stick it somewhere in $PATH.

From source

  1. Download the latest stable versions of Rust and Cargo
  2. Ensure you have development files for libudev (libudev-dev on Debian, systemd-devel on Fedora, systemd on Arch, eudev-libudev-devel on Void)
  3. Clone and build with cargo build --release

Usage

Examples

Start a server with the default options:

steam-controller-dsu

Start a server with the gyro only enabled when the gyro grips are activated, with a 20 deg/s deadzone:

steam-controller-dsu -b left_grip,right_grip --gyro-activation-mode all --gyro-deadzone 20

Steam launch option example

/path/to/steam-controller-dsu -L & env MANGOHUD=1 %command%; pgrep -f steam-controller-dsu | xargs kill

Example with both the 2026 and 2015 Steam Controllers connected simultaneously:

/path/to/steam-controller-dsu --device triton --port 26760 -L & /path/to/steam-controller-dsu --device legacy --port 26761 -L & %command%; pgrep -f steam-controller-dsu | xargs kill

Full usage

Usage: steam-controller-dsu [OPTIONS]

Options:
      --debug
          Run in debug mode: open the controller and dump raw IMU frames

      --bind-addr <BIND_ADDR>
          UDP bind address for the CemuHook server

          [default: 0.0.0.0]

      --port <PORT>
          UDP port for the CemuHook server

          [default: 26760]

      --device <DEVICE>
          Device family to open.

          Possible values: triton, legacy

          [default: triton]

      --invert-pitch
          When set invert the motion controls pitch axis

      --slot <SLOT>
          CemuHook controller slot to report on (0-3 for Controllers 1 through 4). Controller number is slot + 1

          [default: 0]

      --device-path <DEVICE_PATH>
          Specific device path to open. Example: /dev/hidraw11

  -L, --no-enable-lizard-mode-on-close
          Don't enable lizard mode when the device is closed (such as on program exit)

  -h, --help
          Print help (see a summary with '-h')

  -V, --version
          Print version

Gyro Options:
  -b, --gyro-activation-buttons <GYRO_ACTIVATION_BUTTONS>
          Comma-separated list of buttons/sensors that activate gyro reporting.

          Depending on the emulated game, turning the gyro on/off might not work how you expect!

          Example value: left_grip,right_grip

          Possible values to include in the list: dpad_left, dpad_down, dpad_right, dpad_up, start, select, guide, quaternary, a, b, x, y, l1, r1, l2, r2, l3, r3, l4, l5, r4, r5, left_stick_touch, right_stick_touch, left_pad_touch, right_pad_touch, left_grip, right_grip

      --gyro-activation-mode <GYRO_ACTIVATION_MODE>
          Gyro activation mode

          Possible values: any, all

          When any is specified, at least one gyro activation button must be pressed. When all is specified, all gyro activation buttons must be pressed.

          [default: any]

      --gyro-deadzone <GYRO_DEADZONE>
          Gyro deadzone in degrees per second. Values below this threshold are reported as zero

          [default: 0]

      --gyro-pitch-scale <GYRO_PITCH_SCALE>
          Scale factor for the pitch gyro axis

          [default: 1]

      --gyro-yaw-scale <GYRO_YAW_SCALE>
          Scale factor for the yaw gyro axis

          [default: 1]

      --gyro-roll-scale <GYRO_ROLL_SCALE>
          Scale factor for the roll gyro axis

          [default: 1]

Tested Emulators

  • Cemu
    • Quirk: Through Steam input, make sure the controller has no bindings. You need to map controls in Cemu settings through the DSU server, existing bindings can mess up the process.
  • Ryujinx
  • Eden
  • Azahar
    • Quirk: If the server is stopped while the emulator is running motion controls might not work until the emulator is started.

Wishlist

  • Support more devices (Steam Deck, 2015 Steam Controller, future Steam Devices, non-Steam devices?)

AI Usage

AI assistance from open models (Kimi K2.6, GLM-5) is used in the development of this application. AI is used for quick research and prototyping of new features and boilerplate, not for architectural decisions or complex logic. No generated code is currently used in the project without complete understanding by the human involved.