Skip to content

Instantly share code, notes, and snippets.

@barraIhsan
Last active May 14, 2026 00:22
Show Gist options
  • Select an option

  • Save barraIhsan/783a82bcf32bed896c85d27dbb8018a5 to your computer and use it in GitHub Desktop.

Select an option

Save barraIhsan/783a82bcf32bed896c85d27dbb8018a5 to your computer and use it in GitHub Desktop.
8BitDo Ultimate 2 Wireless on GNU/Linux, SteamOS, and Windows

Most of the source comes from: Steam Beta Forum

Thank you so much to everyone in the forum for contributing, for reaching out to 8BitDo to request switching between XInput/DInput/Switch mode on the dongle, to Valve for adding support on DInput mode, to the SDL developers (and 8bitdo) for adding support on DInput mode, and finally, to the Linux kernel developers for adding support on XInput mode.

This gist summarizes everything from that forum.

Switching Mode

So after the latest firmware update (as the time of writing: Controller 1.06, Adapter 1.04), its now possible to switch to DInput and Switch mode by holding B (DInput) or Y (Switch) while turning on the controller.

Note: If you try holding B or Y while in the dock and pick that up, it will not change the mode. You have to manually turn off the controller undocked (hold the home/guide button for 3 second) and turn it back (press home/guide button) while holding either B or Y

Wired         - XInput only
Dongle/2.4Ghz - XInput, DInput (B), Switch (Y)
Bluetooth     - DInput only

Hopefully, a future firmware update will allow switching between modes when using wired or Bluetooth.

On windows, all three modes is supported ootb. Games could properly detect XInput and Switch mode. However, you should use Steam Input for translating DInput mode into XInput

XInput Mode

8bitdo Ultimate 2 Wireless on XInput mode work ootb now on kernel 6.15+ (using built-in xpad driver)
https://github.com/torvalds/linux/commit/22cd66a5db56a07d9e621367cb4d16ff0f6baf56

In this mode, just like with other XInput controller, will not register gyro and additional button.

Nintendo Switch (Pro Controller) Mode

Hold Y while turning on your controller

Switch mode works ootb since kernel 5.16 by hid_nintendo driver. Switch mode supports native gyro but no additional button and no capture button. Thus, you can use it with a Switch emulator or the actual device.

Do note that your XYAB will be swapped (so the bottom button is now B not A, just like a Switch/Pro Controller).

image

Works great if you use Switch emulator, rumble and gyro works ootb and you don't need to configure it manually. Except if you want to swap the XYAB

Battery Reporting

Oh, for battery reporting on Switch mode, yeah it doesn't work and it's always at 55% image

If you want an actual battery percentage, you have to use bluetooth. image

Direct Input (DInput) Mode

Hold B while turning on your controller

The DInput mode will register the 4 additional button (R4, L4, PL, PR) and native gyro after using udev, see below. Thus, you can map those with steam input and be translated into XInput for games.

Note: If you map any of the additional buttons using the Ultimate Software or the square button, it will register the mapped button instead of the original one. For example, if you map PL to LB, pressing PL will register as LB, not PL.

It will show the correct icon for the controller and with the additional button, as well the gyro on Steam

Additional button

image

Gyro

image

udev rule for DInput

If you use SteamOS/Bazzite, it seems that it's already configured by default.

To get the additional button, gyro, and rumble working on DInput. You need to specify a udev rule.

# 2.4GHz/Dongle
KERNEL=="hidraw*", ATTRS{idProduct}=="6012", ATTRS{idVendor}=="2dc8", MODE="0660", TAG+="uaccess"
# Bluetooth
KERNEL=="hidraw*", KERNELS=="*2DC8:6012*", MODE="0660", TAG+="uaccess"

Save it in /etc/udev/rules.d/71-8bitdo-u2w.rules, then reload udev (# udevadm control --reload)

udev rule for other 8bitdo controllers

Simply change idProduct to the controller's idProduct. You can check them using $ lsusb

OR

You can omit idProduct to make it work for all 8bitdo controller. So it'll become:

# 2.4GHz/Dongle
KERNEL=="hidraw*", ATTRS{idVendor}=="2dc8", MODE="0660", TAG+="uaccess"
# Bluetooth
KERNEL=="hidraw*", KERNELS=="*2DC8:*", MODE="0660", TAG+="uaccess"
@AL2009man
Copy link
Copy Markdown

AL2009man commented Apr 2, 2026

Does Death Stranding 2 use SDL? Valve "convinced" developers to write SDL drivers and send them as pull request if they want to support Steam Input, so any game using a recent SDL version should be able to use the gyro without Steam Input, and Steam Input itself uses the same SDL driver. But it doesn't work with every game because it's not a kernel driver and not every game uses SDL.

I doubt they use SDL Gamepad API.

Nixxes Software (who co-dev the PC port, alongside Kojima Productions) historically relies on both XInput/Windows.Gaming.Input (but i don't know if they switched to MS GameInput since then) and libscepad (for native PlayStation controllers) APIs respectively, which is like the vast majority of Triple-A Game and Indie developers. (unless we're talking Linux version, that's a different story)

but Nixxes also has a history of using Steam Input API (Steam version only) for their own ports since Shadow of the Tomb Raider!

Given the way how Steam Input on Windows enforces 8BitDo controller to be in Steam Input mode (even if you turn it off on In-Game Properties or -nojoy launch parameter), this isn't a problem for Steam version folks, as it'll "forcefully" use Steam Input API mode regardless.

if you want Nixxes and other triple-A developers to support 8bitdo controllers natively: you'd need to convince them to use SDL Gamepad API, although: Valve/SDL should fix the hijacking problem first.

@hyperdotbat
Copy link
Copy Markdown

great stuff! on my Arch PC it works out of the box after firmware updates through Windows, but weirdly enough on Steam Deck it is in DInput over 2.4 but no extra buttons or gyro (but they work over bluetooth), do I need the udev rule? Also can you not set the default mode or enable it when taking out the dock? That would be so much nicer!

@barraIhsan
Copy link
Copy Markdown
Author

Also can you not set the default mode or enable it when taking out the dock? That would be so much nicer!

I wish.... But as long as your dock keep connected to a laptop/pc, it will remember what mode you're in when you dock&undock it. As soon as you unplug the dock however... it will be in xinput when you turn the controller back on

but weirdly enough on Steam Deck it is in DInput over 2.4 but no extra buttons or gyro (but they work over bluetooth), do I need the udev rule?

I'm not sure as I don't own a steam deck, but maybe just try? do note that it's immutable distro and likely be overwritten by the next update/restart

Just make sure you're actually on the DInput mode, you can tell by the naming. DInput has "for PC" suffix in the controller name (can be seen on steam controller setting

@linux-universe
Copy link
Copy Markdown

is this a general problem with controllers for pc? How come 8bitdo doesn't have any official docs for this

@barraIhsan
Copy link
Copy Markdown
Author

Maybe they gave us the way (like the DInput/Switch mode) but they don't want to receive any support/complaint about it since they can just say that it's "unofficial" i guess.

Also for the udev, it's on the https://web.8bitdo.com/
image

@Kittenmage42
Copy link
Copy Markdown

When using the Switch input mode, it works with Ryujinx on macOS (ryubing (Ryujinx fork since Nintendo ninjas got the original) 1.3.3, macOS 26.4.1, controller in 2.4G mode using Switch Mode). Rumble and Motion controls work really well.

@Kittenmage42
Copy link
Copy Markdown

Just tested it with dolphin, that works too. one just has to map the joysticks and buttons manually.
(macOS 26.4.1, dolphin emulator, m3 iMac, 2.4G mode with switch input, works great)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment