Skip to content

Instantly share code, notes, and snippets.

@barraIhsan
Last active September 20, 2025 08:23
Show Gist options
  • Save barraIhsan/783a82bcf32bed896c85d27dbb8018a5 to your computer and use it in GitHub Desktop.
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. 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. For the Switch mode, it's supported ootb by hid_nintendo driver.

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"
@barraIhsan
Copy link
Author

barraIhsan commented Sep 4, 2025

image

Update: 2 Valve employee confirmed the bug on the steam forum and they're trying to get 8bitdo to fix them

@Roosta078
Copy link

Apparently for the last week, Rumble was disabled in libSDL when using the dongle, due to some 8bitdo issue (see 065fdca). According to a562e40, this was resolved by 8bitdo in controller FW V1.05 and thus has been re-enabled. This was included in Steam Client Update on Sep 2. Resolution is to just update/restart Steam. Unfortunately, this took me many hours to figure out.

@bcomnes
Copy link

bcomnes commented Sep 4, 2025

Really boggles my mind how difficult it is to have controllers add extra buttons and gyro over standard stock console controllers and everything actually works.

@barraIhsan
Copy link
Author

Blame Microsoft for having XInput standard that doesn't accept gyro and additional button

@meristo
Copy link

meristo commented Sep 5, 2025

Has anyone noticed an issue with this controller not working in games at all in XInput mode using any version of Proton-GE newer than 10-10?

Base wine works fine, GE-Proton10-10 or earlier is fine, anything newer than that is a no-go. I can replicate this behavior across multiple games, using new prefixes. I'm also seeing it in newer versions of proton-experimental as well. DInput mode still works.

@LiveLM
Copy link

LiveLM commented Sep 9, 2025

Thanks for everyone who contributed to this thread!
Just ran into the Dongle Firmware 1.05 "can't add hid device: -71" issue myself, thought I had bricked the dongle during the update somehow. Happy to learn 8BitDo is looking into this.

@meristo
Copy link

meristo commented Sep 9, 2025

Just ran into the Dongle Firmware 1.05 "can't add hid device: -71" issue myself, thought I had bricked the dongle during the update somehow. Happy to learn 8BitDo is looking into this.

It is already fixed in the dongle's 1.06 beta firmware. Enable beta firmware in the Ultimate software v2 settings and you should be able to update to it.

@bcomnes
Copy link

bcomnes commented Sep 9, 2025

With 1.06 and running main steam os channel, extra buttons and gryro show up reliably in DInput mode between reconnects. Now if only they let you make that the default the dongle would pretty much be perfect.

@LiveLM
Copy link

LiveLM commented Sep 9, 2025

Interesting, just updated the dongle to the 1.06 Beta, and although the connection issues did get fixed, Steam no longer shows the extra buttons and Gyro when booting into D-Input mode...
Screenshot_20250908_222439
image

Edit: My apologies, this was fixed after applying the Udev rule from the top post. Though curiously I never needed it until now.
Can confirm the Extra Buttons, Gyro and Rumble are all working on Steam via the dongle.

@bcomnes
Copy link

bcomnes commented Sep 9, 2025

The extra buttons and gyro work in dinput mode across reconnects in the SteamOS main channel with dongle 1.06 beta and no additional udev rules other than stock steamOS. No idea about stable, beta or preview.

@barraIhsan
Copy link
Author

barraIhsan commented Sep 10, 2025

The extra buttons and gyro work in dinput mode across reconnects

It has been that way since the beginning. What people are talking about is the controller will forgot what mode they're on when the dock is unplugged from power

Imma update the firmware now

@bcomnes
Copy link

bcomnes commented Sep 10, 2025

No that’s not what I’m talking about. Buttons and gyro would only show up on first boot with stock SteamOS in dinput mode and not show up on subsequent reconnect in dinput mode on some previous permutation of older versions. This is fixed now.

@barraIhsan
Copy link
Author

Ahh ok. Yea either way, I'm on 1.06 beta 1 and for me everything's good so far.

@xzandaa
Copy link

xzandaa commented Sep 10, 2025

Did you just update the dongle, or the controller as well? I have the Wireless 2 Ultimate Wuchang, with the dongle on 1.06 beta 1 and the controller on 1.06, and its still acting wonky for me in Rocket League at least. D Input works but only through steam input which is being an absolute pain, X Input doesn't work at all. Weirdly, Switch mode works perfectly fine, although the flip flopped buttons are weird so I don't use it. I'm going to try and rollback the controller a version or two and see I guess.

Edit: Rolled back to dongle version 1.04, and controller version 1.05. Same thing. Must be the kernel or something. Started happening after I updated to 6.16.5. And Steam Input just won't go away, disabled it in overall steam settings, disabled it in game specific settings. Just creates tons of input lag and messes up all my controls.

@barraIhsan
Copy link
Author

barraIhsan commented Sep 11, 2025

Yes, I've been using 1.06 Controller firmware for a while now. And recently I'm using 1.06beta1 firmware for the usb.

Just a suggestion, if Switch mode works for you, just use that. Then create a profile within the app that switches the ABXY (I have them on Profile 1)
Screenshot 2025-09-11 103811

@bcomnes
Copy link

bcomnes commented Sep 11, 2025

Switch mode lacks analog triggers and defaults to Nintendo layout unfortunately.

@thingsiplay
Copy link

Strange. There are controllers for the Switch which support analog triggers, don't they? So clearly the Switch supports it, just not the joycons. I feel like the Switch mode on this controller should support that too.

@xzandaa
Copy link

xzandaa commented Sep 14, 2025

I tested it in Rocket League, and the analog triggers do not work. It's all or nothing unfortunately.

@xzandaa
Copy link

xzandaa commented Sep 17, 2025

Updated my controller back to 1.06 and dongle back to 1.06beta1. Previously my Proton version was GE-Proton10-15, changed it to GE-Proton10-10 like @meristo mentioned and it works perfectly in X input mode.

@meristo
Copy link

meristo commented Sep 17, 2025

Updated my controller back to 1.06 and dongle back to 1.06beta1. Previously my Proton version was GE-Proton10-15, changed it to GE-Proton10-10 like @meristo mentioned and it works perfectly in X input mode.

Ah, so that confirms the behavior I was seeing then. There seems to have been some kind of regression in proton-GE that made this controller nonfunctional in XInput mode on all proton-GE versions after 10-10. Whatever the change was, it was also merged into proton-experimental, since it's broken for me there too.

@xzandaa
Copy link

xzandaa commented Sep 17, 2025

Yea I also tried proton-experimental and that didn't work for me either. Glad it works now though.

@Dark-Thoughts
Copy link

Try Experimental bleeding-edge maybe?
In your Library, enter Proton, go to Proton Experimental, right click, go to Betas, select bleeding-edge.

@xzandaa
Copy link

xzandaa commented Sep 17, 2025

Did not know that was a thing, honestly thought proton experimental was bleeding edge. I'll have to try it when I get home later.

@xzandaa
Copy link

xzandaa commented Sep 18, 2025

Try Experimental bleeding-edge maybe? In your Library, enter Proton, go to Proton Experimental, right click, go to Betas, select bleeding-edge.

Selected the bleeding-edge version and my controller did not work.

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