deck-as-controller README

The project's README from github.com/jmedina21/deck-as-controller. As one markdown file: README.md.

Deck as Controller. (beta build)

https://github.com/user-attachments/assets/07d785e7-5d3b-4eb8-ae28-92e55b4d503f

A Decky Loader plugin that turns your Steam Deck into a controller for your Mac, iPad or PC, wirelessly over Bluetooth or wired over a USB cable. Nothing needs to be installed on the other device: the Deck shows up as a PS5, Xbox or Steam Controller.

This is still a very early build, expect latency and connection issues, specially with untested devices.

Developed on a Steam Deck OLED (Decky Loader 3.2.9 and SteamOs 3.8.28) with a Mac M4 running macOS 27. See Tested devices for what others have tried.

Independent project. Deck as Controller is developed independently and is free. It isn't affiliated with, endorsed by, or sponsored by Valve Corporation.

Features

Requested Features (under development/research, not all will happen)

Install

  1. Install Decky Loader on your Deck.
  2. Download deck-as-controller.zip from the releases page.
  3. Do not download the source code or any other file, you just need deck-as-controller.zip
  4. In Game Mode, open ⋯ → Decky → ⚙ Settings → General, turn on Developer mode, then go to Developer → Install Plugin from ZIP File and pick the zip.

Use

  1. First make sure you forget the connection between the steamdeck and the device you will be connecting, if the devices have the connection saved the controller won't work.
  2. Open ⋯ → Decky → Deck as Controller, choose a controller type, and turn on Use as controller. Connect with is Wireless (Bluetooth) by default; for a cable, see Wired (USB).
  3. The first time, the Deck is ready to pair. On your Device(Mac, Windows, Linux computer, also works on Ipad and iphone), open Bluetooth settings and connect to the controller that appears (e.g. "DualSense Edge Wireless Controller") it can take from 30 seconds to 1 minutes to show.
  4. After that, turning the plugin on reconnects to the device automatically.

While connected, the Deck's controls go to your device:

On the Deck Does
Tap ⋯ (or the screen) Turn the Deck screen on or off
Hold ⋯ for 2 seconds Stop and give the Deck its controls back

Switching controller types: your device remembers the Deck as the type it was paired as. To switch, remove the Deck from your device's Bluetooth settings, choose the new type, tap Pair a new device, and pair again.

Wired (USB)

Over a USB-C cable the Deck is a wired PS5 or PS5 Edge controller: no pairing, and input arrives much more steadily. On a Mac, the longest gap between updates was 14 ms over USB, against 80-140 ms over Bluetooth, and tested games felt lag-free.

  1. Set Connect with to Wired (USB cable).
  2. The first time, tap Turn on USB mode and confirm. The Deck restarts. USB mode lets the Deck's USB-C port act as a device; it's the BIOS option USB Dual Role Device.
  3. Turn on Use as controller and connect the Deck to your computer with a USB-C cable. It connects within a second, and again whenever you replug the cable.

While USB mode is on, USB drives, hubs and docks plugged into the Deck may not work, the Deck can't boot from USB, Windows installed on the Deck loses USB, and the Deck charges slowly from a computer. To go back, tap Turn off USB mode in the wired view (the Deck restarts again).

Switching USB mode from the plugin works on the Deck OLED with BIOS F7G0114. On other BIOS versions the plugin shows how to turn it on in the BIOS instead: with the Deck off, hold Volume + and press Power, open Setup Utility, then Advanced → USB Configuration → USB Dual Role Device → DRD.

Which type to pick

On a Mac, PS5 Edge is the best all-round choice. Tested results:

PS5 / PS5 Edge Xbox Elite Steam Controller
Steam and games played through it (e.g. Baldur's Gate 3, Hades) ✅ ✅ ✅
Mac games that read controllers directly (e.g. Hollow Knight: Silksong) ✅ ❌ not detected ❌ not detected
Rumble from Steam (Steam's test page, Steam Input games) ❌ ✅ ✅
Rumble from Mac games using Apple's controller support ✅ ✅ –
Back buttons PS5 Edge Steam only ✅

Steam Controller is for playing through Steam (including Steam on a Linux or Windows PC). The Deck has the same controls as the 2026 Steam Controller, so Steam sees both sticks, both trackpads as separate pads, the four back buttons, gyro and stick touch, and you configure them with Steam Input like a real one. Rumble and trackpad haptics come from Steam. Games that don't run through Steam won't recognize it: on a Mac that includes native games like Hollow Knight and Silksong, because macOS has no support for the Steam Controller and Steam can't pass it on to them. Tested with Steam on a Mac and on a Linux PC.

Button mapping

Deck PS5 / PS5 Edge Xbox Elite
A B X Y ✕ ○ □ △ A B X Y
View / Menu Create / Options View / Menu
Steam PS Xbox
Trackpad click Touchpad click –
L4 / R4 Edge left / right Fn Paddles P3 / P1
L5 / R5 Edge left / right paddle Paddles P4 / P2
⋯ reserved for the plugin reserved for the plugin

As a Steam Controller every control keeps its own name (A B X Y, View / Menu, Steam, L4 / R4, L5 / R5, both trackpads); only ⋯ stays reserved for the plugin.

Options

Known limitations

Tested devices

Reports from the developer and from users. Something missing or different for you? Open an issue.

Deck Connected to Controller type Result Source
OLED Mac (macOS 27), Steam all four ✅ Works, see Which type to pick @jmedina21
OLED Mac (macOS 27), native games PS5 / PS5 Edge ✅ Works @jmedina21
OLED iPad Mini 7 (iOS 27) Xbox Elite ✅ Works @jmedina21
OLED Mac (macOS 27), USB cable PS5 / PS5 Edge ✅ Works in Steam and native games, including back buttons, rumble and replugging @jmedina21
– Steam Frame all ✅ Works #3
LCD Linux PC (NixOS) PS5 Edge ✅ Works, including trackpads and back buttons. Remove any old pairing on both sides first. #4
– Linux PC (CachyOS), Steam Steam Controller ⚠️ Works for one user; another's pairing failed with an authentication error @SrStylus, #2

How it works

The plugin's backend runs a small daemon with the Deck's system Python:

Development

pnpm install
scripts/deploy.sh deck@<deck-ip>   # build and install over SSH (needs passwordless sudo on the Deck)
scripts/package.sh                 # build out/deck-as-controller.zip

To log what the host sends (rumble, setup requests), run sudo touch /run/sdcd-debug on the Deck before turning the plugin on; the output appears in Decky's plugin log.

Mapping USB mode on another BIOS

The plugin switches USB mode by changing one byte in the AmdSetup UEFI variable, and that byte's position can differ between BIOS versions. To find it on yours (Desktop Mode, Konsole):

  1. Note the version: cat /sys/class/dmi/id/bios_version.
  2. In the BIOS, set USB Dual Role Device to XHCI, boot, and save a copy: sudo cp /sys/firmware/efi/efivars/AmdSetup-3a997502-647a-4c82-998e-52ef9486a247 ~/amdsetup-xhci
  3. Set it to DRD, boot, check that ls /sys/class/udc shows dwc3.1.auto, and save another copy as ~/amdsetup-drd.
  4. Compare them: cmp -l ~/amdsetup-xhci ~/amdsetup-drd. It should print a single line such as 229 0 1. The offset is that first number minus 5 (cmp counts from 1, and the file starts with 4 attribute bytes), so 229 means 224. Also note the file size (ls -l).
  5. Add "<version>": <offset> to DRD_OFFSETS in py_modules/sdcd/usb.py, or open an issue with the version, the cmp output and the file size. If the size isn't 1474 bytes, mention it: the plugin checks the size before writing.

Only map a version when exactly one byte differs. The menu itself is the Setup variable, which the firmware doesn't let the OS write, so its offset alone isn't enough. You can still use it to cross-check: the firmware images in /usr/share/jupiter_bios/ contain the BIOS menus, and running UEFIExtract and IFRExtractor-RS on the SetupUtility module shows "USB Dual Role Device" and its Setup offset (0x227 on F7G0114).

Contributing

Contributions are welcome: bug reports, pull requests, and test results on devices we haven't tried yet (Windows, Android, other Linux distributions, other macOS and iPadOS versions).

When reporting a problem, please include your Deck model, the controller type you picked, the device you connected to, and the plugin log from ~/homebrew/logs/deck-as-controller/ on the Deck. To capture what your device sends to the Deck, see the debug tip under Development.

Contributors

License

Released under the MIT License.

Disclaimer

Steam and Steam Deck are trademarks of Valve Corporation. PlayStation, DualSense and PS5 are trademarks of Sony Interactive Entertainment. Xbox and Xbox Elite are trademarks of Microsoft. Mac and iPad are trademarks of Apple. These names are used only to describe compatibility; this project isn't affiliated with or endorsed by any of these companies.

The plugin changes the Deck's Bluetooth setup and takes over its built-in controller while it runs. Both are restored when you turn it off or reboot. Turning on USB mode changes a firmware setting, which stays until you turn it off in the plugin or change it in the BIOS. Use it at your own risk.

deck-as-controller (jmedina21/deck-as-controller)

Searching Database…

这是什么?Deck as Controller 是一个 Decky Loader 插件,把你的 Steam Deck 变成 Mac、iPad 或 PC 的无线或有线游戏手柄,可以呈现为 PS5、Xbox 或 Steam 手柄,而无需在另一台设备上安装任何东西。
它是独立应用,还是 Steam Deck 插件?它是一个通过 Decky Loader 直接在 Steam Deck 本机上运行的插件;你要连接的 Mac、iPad 或 PC 上什么都不用装。
怎么安装并开始使用它?在 Deck 上安装 Decky Loader,从发布页面下载 deck-as-controller.zip,然后在游戏模式里进入 Decky Settings > General,启用 Developer mode,再用 Developer > Install Plugin from ZIP File 选中那个 zip。
我需要事先装好 Decky Loader 吗?需要,必须先在 Steam Deck 上安装 Decky Loader,因为这个插件是在它里面运行的,而不是独立的软件包。
手柄模拟真的开箱即用吗?目前还谈不上可靠:它是非常早期的 beta,在未经测试的设备上会有预料之中的延迟和连接问题;Steam 通过蓝牙从不向 PS5 类型发送震动;一些 Mac 游戏无法识别 Steam 手柄或 Xbox Elite 类型;而且无线连接期间 Deck 自己的蓝牙设备会变得不可用。
它支持哪些设备和手柄类型?它可以通过蓝牙与 Mac、iPad、iPhone 或 Windows/Linux PC 配对,或通过 USB-C 连接 PC,模拟 PS5 DualSense、PS5 Edge、Xbox Elite Series 2 或 2026 款 Steam 手柄。
为什么有线 USB 模式比蓝牙好?USB 的延迟低得多也更稳定(间隔 14ms,而蓝牙是 80-140ms),测试中感觉不到延迟,但它需要在 BIOS 里开启“USB Dual Role Device”,这会在启用期间禁用 Deck 上的其他 USB 端口,并且无法再从 USB 启动。
在 Mac 上我该选哪种手柄类型?推荐 PS5 Edge 作为 Mac 上最全面的选择,因为它既能在 Steam 里使用,也能在原生 macOS 游戏中使用,并且通过 Apple 的手柄 API 支持震动。
我能在多台设备之间切换吗?可以,插件会记住多个已配对的设备(例如一台 Mac 和一台 iPad),并在你开启时自动重连到最后使用的那一台。
这个插件实际上是怎么伪装成游戏手柄的?蓝牙方面,它通过运行时 HID profile 重启 BlueZ,赋予 Deck 手柄身份;USB 方面,它暴露一个呈现 DualSense 描述符的 Linux USB gadget,把 Deck 自身的手柄输入转换成所选手柄的格式。
Creator
jmedina21
Size
4.8 MB
Stars
216
Age
18d
Commits · 90 Days