Skip to content

Instantly share code, notes, and snippets.

@barraIhsan
Last active December 6, 2025 01:59
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 shows 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"
@falk4243
Copy link

it bugs out in Dinput mode quite a lot with huge input latency and often needs to be restarted after waking it up because of that.

This used to happen to me, but I haven't experienced it anytime lately. It's possible it was fixed in the update from the 1.06beta controller firmware to 1.06 stable, so you might try updating if you're still on the beta firmware.

Unfortunately still happening in my case, but it could be because I always put the machine to sleep. Using the controller from dock without that usually works fine.

@churuz-fyi
Copy link

Actually, check your settings. In controller settings there should be an option for "use Steam Input on games that support it" or something similar. If it's on it'll use the Steam Input binding and ignore the controller being in DInput. From the two main games I tried: Death Stranding for motion controls, and Hollow Knight for XInput only; entering a game that only supports XInput with DInput on and Steam Input off will result in weird bindings being all over the place. So make sure that you're in the mode that is supported by your game. Most games only support XInput since it's a game engine limitation not the platform.

@renatounai
Copy link

Not sure if this was already mentioned here, but I will leave it for anybody with a Steam Deck.

I just wanted to let people know that for SteamOS, there doesn't seem to be a way to edit the udev file in rootfs. So the only way to get full control over the extra buttons and gyro in D-input on a dongle connection for SteamOS so far is to boot the U2W controller to D-input mode, then attach the 2.4ghz dongle to the handheld (or restart the handheld).

Steam will then recognize the controller as "8bitdo Ultimate 2 Wireless Controller for PC", complete with extra button and gyro access on 2.4ghz. Rumble also works this way.

Though, this workaround is only temporary, as anytime the controller sleeps or turns off, it resets the D-input recognition and will not see the extra buttons or gyro. So you will need to do the above procedure anytime you want those again with a dongle connection to Steam Deck or such.

https://steamcommunity.com/app/1675200/discussions/1/597406481786140484/

If I understood this right, first we need to turn on the controller without the dongle connected to the Steam Deck, and just after that connect the dongle? I'm not home right now so I can't test it, but that will be very useful if so.

@ErifEci0
Copy link

If I understood this right, first we need to turn on the controller without the dongle connected to the Steam Deck, and just after that connect the dongle? I'm not home right now so I can't test it, but that will be very useful if so.

Correct. Just be sure to hold down the B button while turning on the controller for D-input mode.

I'm hoping complete access of the controller in D-input over 2.4ghz wireless gets officially supported on SteamOS in the future, since I'm sure the new Steam Hardware will bring even more interest in Linux down the line. Even though I'll definitely get the new Steam Controller, I think 8bitdo can still carve a good niche for themselves in the upcoming Steam ecosystem.

@ItsPercent
Copy link

Hello! I was going to get the Pro 3, is anyone able to verify that the firmware the same? If not I'll opt for the Ultimate 2, but I prefer the hot-swappable buttons and playstation layout.

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