Skip to content

Instantly share code, notes, and snippets.

@barraIhsan
Last active September 5, 2025 14:20
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 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 Jul 1, 2025

It even shows 8bitdo icons.

Huh, so it's DInput and it's just that the additional button is not registering. Maybe there's something wrong with the udev. Maybe try restart the os?

I think the switch from xpad to xone might have done it.

Weird, xone and xpad is a XInput drier so it should not do anything. But if it works for you then, it works ig.

@rilpires
Copy link

rilpires commented Jul 2, 2025

One note, if you try holding B or Y while in the dock and pick that up, it will not change the mode.

SO THAT'S what it was. I was trying everything. Turning it off manually and holding Y it now works. Thanks!

Even then I can't make steam recognize as DInput :( , it appears as "Generic X-Box pad"

Am I missing something?

jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: USB disconnect, device number 33
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: new full-speed USB device number 34 using xhci_hcd
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: not running at top speed; connect to a high speed hub
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: New USB device found, idVendor=2dc8, idProduct=310b, bcdDevice= 1.14
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: Product: 8BitDo Ultimate 2 Wireless Controller for PC
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: Manufacturer: 8BitDo
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: usb 1-2.4: SerialNumber: D4FB9E24AB
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: input: Generic X-Box pad as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.4/1-2.4:1.0/input/input73
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: input: 8BitDo 8BitDo Ultimate 2 Wireless Controller for PC Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.4/1-2.4:1.1/0003:2DC8:310B.002D/input/input74
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: input: 8BitDo 8BitDo Ultimate 2 Wireless Controller for PC Mouse as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.4/1-2.4:1.1/0003:2DC8:310B.002D/input/input75
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: hid-generic 0003:2DC8:310B.002D: input,hidraw4: USB HID v1.11 Keyboard [8BitDo 8BitDo Ultimate 2 Wireless Controller for PC] on usb-0000:00:14.0-2.4/input1
jul 01 21:34:49 rilpires-desktop-kubuntu kernel: hid-generic 0003:2DC8:310B.002E: hiddev2,hidraw5: USB HID v1.11 Device [8BitDo 8BitDo Ultimate 2 Wireless Controller for PC] on usb-0000:00:14.0-2.4/input2
jul 01 21:34:51 rilpires-desktop-kubuntu kernel: input: Microsoft X-Box 360 pad 0 as /devices/virtual/input/input76

@barraIhsan
Copy link
Author

barraIhsan commented Jul 2, 2025

301b... yeah that's XInput mode.
Are you sure you're in the latest firmware? You should update to the latest one with their software (exclusive windows app unfortunately)
https://app.8bitdo.com/Ultimate-Software-V2/

@Dark-Thoughts
Copy link

exclusive windows app unfortunately

You can use a VM. If you use Virtual Machine Manager you have to go into the hardware details, Add Hardware and then under USB Host Device there should be the gamepad if it is on (something something 8bitdo for PC - do not use the generic "8bitdo ultimate 2" entry which I think is just the dongle and won't register in the app). I think the device ID keeps changing so you may have to remove & re-add it every time you want to do an update or use the software for the RGB settings (which are also a bit wonky but that may be not related to Linux).

This all worked fine for me on Bazzite. I think there's also an Android app that allows you to do firmware updates, if you're okay with having Chinese apps on your phone.

@mkaito
Copy link

mkaito commented Jul 3, 2025

There's also a Mac app, in case you have one of those. Use the 8bitdo Ultimate Software v2. The standalone firmware updater app won't work with this controller.

I figured out how to make the extra button mapping work. When Gamescope starts, the controller has to be already connected. Just dropping the pad on the dock and picking it back up will break the extra button mapping. Restarting Steam inside Gamescope won't fix it. Have to restart Gamescope too.

evtest shows all buttons working correctly either way, so I guess this is a Gamescope bug.

@mkaito
Copy link

mkaito commented Jul 19, 2025

I found out what my issue was. Apparently there's some steam udev rules that run at 73-xxxx.rules and my 8bitdo-xxxx.rules was running after it. Renaming the file to 70-8bitdo-xxx.rules fixed my "have to restart everything" issue completely. Which I guess you've also figured out, since you recommend putting it in 71. I really need to learn to read.

@Dark-Thoughts
Copy link

The one thing I noticed with this gamepad is that it often goes into pairing mode for a few seconds after I shut down my PC (while it sits in its docking station). Not sure if that's Linux related at all though.

@barraIhsan
Copy link
Author

The one thing I noticed with this gamepad is that it often goes into pairing mode for a few seconds after I shut down my PC (while it sits in its docking station). Not sure if that's Linux related at all though.

yes because it's lost connection to the dongle when we turn off the PC. So I think it's intended behaviour. Just like when you unplug the dongle from your PC

@barraIhsan
Copy link
Author

barraIhsan commented Jul 19, 2025

I found out what my issue was. Apparently there's some steam udev rules that run at 73-xxxx.rules and my 8bitdo-xxxx.rules was running after it. Renaming the file to 70-8bitdo-xxx.rules fixed my "have to restart everything" issue completely. Which I guess you've also figured out, since you recommend putting it in 71. I really need to learn to read.

Yea, I just followed the arch wiki guide to get the 71:
https://wiki.archlinux.org/title/Udev#Allowing_regular_users_to_use_devices

Also steam input is 60, /usr/lib/udev/rules.d/60-steam-input.rules. But yea, probably the ordering

@Klusio19
Copy link

Klusio19 commented Jul 22, 2025

On my Fedora 42, Xinput mode was working flawlessly OOTB. With Dinput mode, it recognized all of buttons including additional ones but NOT IN Steam (I was testing it on that gamepad testing website). After adding the udev rule, all additional buttons and gyro settings appeared in Steam! Thank you for that tip!

@bcomnes
Copy link

bcomnes commented Jul 24, 2025

I got it working, but then it reverts back to without the extra buttons until I restart.

@bcomnes
Copy link

bcomnes commented Jul 24, 2025

If I have the controller in DInput mode, and reboot the deck, it connects with all the buttons on stock SteamOS udev rules (beta channel as of writing). If at any point the controller turns off, and I turn it back on in DInput mode (holding B), it shows up with the right artwork, but lacks additional buttons.

@barraIhsan
Copy link
Author

If I have the controller in DInput mode, and reboot the deck, it connects with all the buttons on stock SteamOS udev rules (beta channel as of writing). If at any point the controller turns off, and I turn it back on in DInput mode (holding B), it shows up with the right artwork, but lacks additional buttons.

I'm curious, what's the udev rule on the stock SteamOS? Does adding the udev rule in this gist helps? Or is it the same one as the stock one?

@bcomnes
Copy link

bcomnes commented Jul 25, 2025

Didn’t seem to make a difference adding udev rule from here. How do I find the stock steam os rules? The rules.d folder was empty otherwise on my deck.

@barraIhsan
Copy link
Author

Did you also check on the /usr dir? /usr/lib/udev/rules.d/

Steam input udev on normal Linux pc is located on /usr/lib/udev/rules.d/60-steam-input.rules

@bcomnes
Copy link

bcomnes commented Jul 25, 2025

Will check today

@fritzrehde
Copy link

Is a similar setup also going to work for the 8bitdo Pro 2?

@barraIhsan
Copy link
Author

Is a similar setup also going to work for the 8bitdo Pro 2?

I suppose it's a similar setup, btw you can put this udev to enable all 8bitdo controller.

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

if you don't want that, just change the productId (from 6012 - Ultimate 2). You can check it on lsusb or open steam controller configuration and the id of the connected controller should appear.
In the "Device support: " (without the 0x)
IMG_20250813_182205

@xPorcusx
Copy link

Hi everyone!
I tried setting up my Ultimate 2-controller in the Dolphin emulator with Motion inputs. However, nothing that I try works.

For one, I can't switch to either Switch nor DInput mode. If I do, the light of the Guide button blinks, but I can't get it connected to the PC. Dongle doesn't work, so does Bluetooth. Bluetooth doesn't work at all for me, even with XInput. No matter what I try, Windows can't establish a connection with my controller.

Can somebody help me? I don't understand this controller and all it's quirks. Thanks in advance!

@kkslidermight
Copy link

i wrote this email to 8bitdo support i suggest others do the same if they want to see the feature

The Ultimate 2 works great for the most part, but there’s one thing that’s really annoying. When I use the 2.4 GHz dongle and the charging dock, the controller ALWAYS wakes up in XInput mode. I use DInput ONLY because that’s where the gyro, extra buttons, and all the good stuff actually work. Right now I have to undock it, turn it off, hold B, and turn it back on EVERY SINGLE TIME...

Can you PLEASE add a firmware option so it either remembers the last mode I used or lets me set a default mode for the dongle/dock so I can keep the low‑latency dongle connection AND have DInput without doing the same button‑hold song and dance every time.

It’s such a small change but it would make a HUGE difference for people who actually use all the features.

@barraIhsan
Copy link
Author

Hi everyone! I tried setting up my Ultimate 2-controller in the Dolphin emulator with Motion inputs. However, nothing that I try works.

For one, I can't switch to either Switch nor DInput mode. If I do, the light of the Guide button blinks, but I can't get it connected to the PC. Dongle doesn't work, so does Bluetooth. Bluetooth doesn't work at all for me, even with XInput. No matter what I try, Windows can't establish a connection with my controller.

Can somebody help me? I don't understand this controller and all it's quirks. Thanks in advance!

Do you use Ultimate 2 Bluetooth or Ultimate 2 Wireless? Because this mode switching only supported on the wireless model

@barraIhsan
Copy link
Author

Update: On my end, updating the usb firmware to 1.05 resulting XInput and DInput mode over 2.4GHz doesnt work and journalctl shows

Sep 03 10:51:09 arch kernel: usbhid 7-1:1.2: can't add hid device: -71
Sep 03 10:51:09 arch kernel: usbhid 7-1:1.2: probe with driver usbhid failed with error -71

on a loop. Reverting back to 1.04 works fine.

Is there anyone who face the same result after upgrading to 1.05?

@thingsiplay
Copy link

thingsiplay commented Sep 3, 2025

Edit: Greatly shortened and simplified the reply.

@barraIhsan Same problem here and solved by reverting back to older firmware. I was not sure which one of both firmware was responsible, so I went from Gamepad v1.06 + 2.4ghz dongle v1.05 to Gamepad v1.05 + 2.4ghz dongle v1.04.

@MayorMike
Copy link

Update: On my end, updating the usb firmware to 1.05 resulting XInput and DInput mode over 2.4GHz doesnt work and journalctl shows

Sep 03 10:51:09 arch kernel: usbhid 7-1:1.2: can't add hid device: -71
Sep 03 10:51:09 arch kernel: usbhid 7-1:1.2: probe with driver usbhid failed with error -71

on a loop. Reverting back to 1.04 works fine.

Is there anyone who face the same result after upgrading to 1.05?

Experienced the same problem after updating the dongle to 1.05.
Reverting back to 1.04 fixed it.

@barraIhsan
Copy link
Author

Edit: Greatly shortened and simplified the reply.

@barraIhsan Same problem here and solved by reverting back to older firmware. I was not sure which one of both firmware was responsible, so I went from Gamepad v1.06 + 2.4ghz dongle v1.05 to Gamepad v1.05 + 2.4ghz dongle v1.04.

Gamepad v1.06 is fine for me.

@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.

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