Skip to content

Instantly share code, notes, and snippets.

@barraIhsan
Last active April 5, 2026 01:18
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"
@falk4243
Copy link
Copy Markdown

So, when starting the is controller in d-input mode, with the 2.4Ghz dongle, Steam sees the extra buttons and gyro, and lets me configure them, but when I start a game it sees the controller as, what seems like an x-input controller. Anyone know how to fix that?

If you start the game via Steam it should use the controller in the same mode. If not, bring up the Steam overlay, turn off the controller, press and hold the B button and turn on the controller again. Confirm that the enhanced layout is being loaded and map the buttons as necessary.

@falk4243
Copy link
Copy Markdown

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.

@ruzfyi
Copy link
Copy Markdown

ruzfyi commented Nov 12, 2025

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
Copy Markdown

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
Copy Markdown

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
Copy Markdown

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.

@ErifEci0
Copy link
Copy Markdown

ErifEci0 commented Dec 7, 2025

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.

I don't believe it's the same. For example, when using the Ultimate 2 wired, it shows up as an X-input controller no matter what mode I boot it up with. Where as with the Pro 3, I can get it to be recognized in D-input or Switch mode when wired.

They both don't get their firmware updates within a similar timeframe either, plus both firmware updates so far tend to be different in what 8bitdo patched.

@ItsPercent
Copy link
Copy Markdown

They both don't get their firmware updates within a similar timeframe either, plus both firmware updates so far tend to be different in what 8bitdo patched.

Noted! Thank You! So if I heard you correctly, as far as using a controller with D-Input and 2.4Ghz, you’d opt for the Ultimate 2? Again thank you for your help :D

@ErifEci0
Copy link
Copy Markdown

ErifEci0 commented Dec 7, 2025

Noted! Thank You! So if I heard you correctly, as far as using a controller with D-Input and 2.4Ghz, you’d opt for the Ultimate 2? Again thank you for your help :D

Yes, I would get the Ultimate 2, if you're going for all the extra buttons and gyro of D-input in 2.4ghz mode.

So far, I only managed to get X-input out of the Pro 3 when using 2.4ghz mode. It's a big downside for me and why I only use that for 2D games.

@ItsPercent
Copy link
Copy Markdown

So far, I only managed to get X-input out of the Pro 3 when using 2.4ghz mode. It's a big downside for me and why I only use that for 2D games.

I’ll be sure to get the Ultimate 2! Thank you!

@mateogs01
Copy link
Copy Markdown

mateogs01 commented Dec 12, 2025

Hi, first, thanks for such useful thread. Second, i have an ultimate 2c wireless connected trough dongle but I cant pair it in D-input mode. I already update the firmware with a windows pc that I have but didnt worked. I turn off the controller and then turn it on again while pressing B but it keeps detecting it as Xinput. What else can i try?

Also, I'm in linux mint. Thanks!

@Maegima
Copy link
Copy Markdown

Maegima commented Dec 13, 2025

Hello @mateogs01, have you tried to update the dongle firmware too? I was having the same issue with my 8bitdo ultimate 2 because I have only updated the controller firmware.

@mateogs01
Copy link
Copy Markdown

Hi @Maegima, Thanks for the reply. I did update the dongle firmware, but actually realized that I'm not sure what the difference between XInput and Dinput should be. Like, the r4 and l4 buttons should be detectable by steam on DInput? Or these buttons are only mappable from the controller?

@ruzfyi
Copy link
Copy Markdown

ruzfyi commented Dec 15, 2025

@mateogs01 XInput is limited to the Xbox controller layout which means 10 face buttons, 2 bumpers, 2 triggers, and 2 joysticks. The format doesn't support the bandwidth to support everything else unlike DInput which directly links to every function that the controller supports. This means that in DInput the controller's extra bumpers, back buttons, and gyro are all detected individually with the caveat of only working on any game that officially supports it.

When I play Hollow Knight with the DInput mode, all the buttons are swapped around for whatever reason so you can either switch to XInput or you should be able to mask it with Steam Input as XInput controls which I haven't tested.

@mateogs01
Copy link
Copy Markdown

@churuz-fyi Thanks for the answer. So well, that means I was right in DInput not working. I'll try updating the firmware again and check a few more things and if I can get it to work I'll update. Thanks again

@ruzfyi
Copy link
Copy Markdown

ruzfyi commented Dec 15, 2025

@mateogs01 Easiest way i found to test whether its working is to go into the Steam Big Picture controller settings. The 4 additional buttons should appear on there and you can test whether they're working and the UI should now be using the 8BitDo controller instead of the Xbox logo.

Also for my use case, both the dongle and controller on 1.06 has been working with switching between each mode with no problems if its a version issue.

@nift4
Copy link
Copy Markdown

nift4 commented Dec 25, 2025

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

In DInput mode the SDL driver can read the battery level (it works both via bluetooth, where it offers less delay for updated data, and via 2.4G where we currently don't have any other way to read it).

You can test it like this after cloning SDL repository:

diff --git a/test/gamepadutils.c b/test/gamepadutils.c
index dbfa98c1f..51b6fd90e 100644
--- a/test/gamepadutils.c
+++ b/test/gamepadutils.c
@@ -725,6 +725,7 @@ void UpdateGamepadImageFromGamepad(GamepadImage *ctx, SDL_Gamepad *gamepad)
 
     ctx->connection_state = SDL_GetGamepadConnectionState(gamepad);
     ctx->battery_state = SDL_GetGamepadPowerInfo(gamepad, &ctx->battery_percent);
+    SDL_Log("battery:%d\n", ctx->battery_percent);
 
     if (SDL_GetNumGamepadTouchpads(gamepad) > 0) {
         int num_fingers = SDL_GetNumGamepadTouchpadFingers(gamepad, 0);
cmake .
make testcontroller
./test/testcontroller

It does behave a bit oddly, like jumping from 100% to 88% when I unplug power cable, however, Bluetooth has the same issue, albeit with more delay (it only seems to update every minute or so), hence it's less obvious.

Sadly it seems someone would have to write a kernel driver (as UPower does not seem to allow userland drivers) doing what the SDL driver does in order to have proper integration in DEs in 2.4G mode.

@spillner
Copy link
Copy Markdown

spillner commented Feb 14, 2026

Thanks for this! However, for some reason I'm not seeing the extra buttons in the Steam configurator, even in DInput mode (see attached). Interestingly, when I check the inputs manually with my own SDL program, I do see unique button IDs (2/5/16/17 for PR/PL/R4/L4). I can start the controller in DInput mode, open the Steam configuration tool, not see the unique buttons, close the config tool, run my SDL program, see unique button IDs reported, reopen the Steam configuration tool, and still see the extra buttons being ignored, all without ever turning off the controller.

ultimate_wireless_2_config

Other notes:

  • RetroArch works with the controller in DInput mode if and only if you select the linuxraw input and controller drivers. With udev, I was getting phantom up-arrow inputs, and with sdl2 the extra buttons are not detectable/mappable. With linuxraw, things mostly work as expected.
  • You will need to remap inputs in RetroArch after switching the input driver, as the button and axis numberings change.
  • On one occasion, my controller showed up with product ID 0613 instead of 0612. That hasn't happened again, but I duplicated the udev rules for 0613 just to make sure.
  • I set up a rule in /etc/modprobe.d to manually blacklist the xpad driver; before doing that I would get a second dummy input device every time the controller connects.

@octoturt
Copy link
Copy Markdown

thank you for sharing this, made my life much easier. just reporting that on Fedora 43 (Plasma Desktop Edition) i was able to connect my Ultimate 2 with Dinput over 2.4ghz, and Steam immediately identified it correctly and recognized the extra inputs with no need to add the udev rules, suggesting that they came preconfigured like is the case for SteamOS and Bazzite

@barraIhsan
Copy link
Copy Markdown
Author

barraIhsan commented Feb 18, 2026

I can start the controller in DInput mode, open the Steam configuration tool, not see the unique buttons, close the config tool, run my SDL program, see unique button IDs reported, reopen the Steam configuration tool, and still see the extra buttons being ignored, all without ever turning off the controller.

ok that's weird, are you running steam flatpak (idk if that changes anything but just to make sure ig? cuz flatpak apps require some extra permission thingy) that's surely steam's fault because your sdl apps can pick the input just fine

RetroArch works with the controller in DInput mode if and only if you select the linuxraw input and controller drivers. With udev, I was getting phantom up-arrow inputs, and with sdl2 the extra buttons are not detectable/mappable. With linuxraw, things mostly work as expected.

yea, and gyro isn't supported either. That's why I use the switch mode for retroarch. ig we just need to wait for retroarch to use sdl3 or update their controller database/list to the current one (sdl supported it since 8bitdo and valve contribute to it)

On one occasion, my controller showed up with product ID 0613 instead of 0612. That hasn't happened again, but I duplicated the udev rules for 0613 just to make sure.

Did you mean 6013 and 6012 respectively?
6012: D-Input mode
6013: Connected but controller is off (either with dongle or dock)
310B: X-Input mode
057e:2009: Switch mode (they're just disguised as switch pro's actual vendor & product id)

@zloymalefic
Copy link
Copy Markdown

zloymalefic commented Mar 13, 2026

I have the Ultimate 2 bluetooth controller and I can't switch it to the Switch mode intensely. I know it's possible, cause one time I was able to see it as a Switch pro controller on my Cachyos. But I cant repeat this, I tried to holing all the buttons while turning it on (

@barraIhsan
Copy link
Copy Markdown
Author

barraIhsan commented Mar 13, 2026

This is for Ultimate 2 Wireless, and you have the Ultimate 2 Bluetooth model. The Bluetooth model will connect as a Switch Pro controller under Bluetooth mode (yea it's a confusing name ik)
image

Compared to Ultimate 2 Wireless:
image

Windows basically means XInput (no gyro and additional button, you have to map additional button using the square button or the 8bitdo software, but the de facto cuz windows uses it, thus games use it, so more "plug and play")

Android means DInput (support for gyro and additional button on supported apps e.g. Steam. You can map them to whatever you want. With steam, it converts the DInput back to XInput for games, so it's also mostly plug and play.)

Switch means Switch... (support for gyro but you have to map additional button just like XInput, there should be a separate profile on the 8bitdo app if you use the Bluetooth model, and of course, it can connect to switch)

@zloymalefic
Copy link
Copy Markdown

zloymalefic commented Mar 13, 2026

I know, but this thread is closest to the problem I am trying to solve 😞.
How can I switch between these mods, while I connect via dongle?
As I mentioned, I managed to do it once, but Idk how.
The giro was detected in the Eden emulator, basically that's what I need the most 😁
One more thing. I have only Mac (I used it to update firmware for dongle and gamepad) and BC-250(Mining bord) with Catchy OS handheld version(just a steam big picture mode as a default UI and some optimization).

@barraIhsan
Copy link
Copy Markdown
Author

barraIhsan commented Mar 13, 2026

How can I switch between these mods, while I connect via dongle?

Does Home + Y or Home + B work? (turn it off first, hold Home) Sorry I can't help a lot because I don't have one. But from what I heard it cant(?). But surely it can cuz you can connect a dongle to an actual switch (registered as wired pro controller)

The giro was detected in the Eden emulator, basically that's what I need the most 😁

But yes, this is so good lmao. I do agree with that.

But if you're stuck, just use the bluetooth mode....

@falk4243
Copy link
Copy Markdown

I know, but this thread is closest to the problem I am trying to solve 😞. How can I switch between these mods, while I connect via dongle? As I mentioned, I managed to do it once, but Idk how. The giro was detected in the Eden emulator, basically that's what I need the most 😁 One more thing. I have only Mac (I used it to update firmware for dongle and gamepad) and BC-250(Mining bord) with Catchy OS handheld version(just a steam big picture mode as a default UI and some optimization).

Turn the controller off holding the Home button, then turn it on holding the B-Button while you press Home once. The controller doesn't remember this mode if you turn it off, but putting it in the cradle should work.

@m1neral-rocks
Copy link
Copy Markdown

My friend's been trying to figure out how to use the native gyro on games without the switch mode. For example: Death Stranding 2 on windows can be played with the game's native gyro implementation using d-input, we've been trying a bunch of different things and on a freak accident it actually worked with Death Stranding 2 but it's not working anywhere else. Pragmata's demo which has native gyro didn't work and Eden doesn't see gyro unless the controller is in Switch mode. Steaminput can see the gyro and without steaminput Death Stranding 2 somehow worked out of nowhere while trying but it doesn't work in any other context. Does anyone know the reason or a potential fix?

@Oregive
Copy link
Copy Markdown

Oregive commented Apr 1, 2026

My friend's been trying to figure out how to use the native gyro on games without the switch mode. For example: Death Stranding 2 on windows can be played with the game's native gyro implementation using d-input, we've been trying a bunch of different things and on a freak accident it actually worked with Death Stranding 2 but it's not working anywhere else. Pragmata's demo which has native gyro didn't work and Eden doesn't see gyro unless the controller is in Switch mode. Steaminput can see the gyro and without steaminput Death Stranding 2 somehow worked out of nowhere while trying but it doesn't work in any other context. Does anyone know the reason or a potential fix?

kojima magic

@nift4
Copy link
Copy Markdown

nift4 commented Apr 1, 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.

@m1neral-rocks
Copy link
Copy Markdown

@nift4 Not sure but it makes sense. Pragmata demo apparently doesn't support this controller on windows either. It's sad that this isn't a direct drop-in replacement for a ds5 but it's fine. Thanks for the reply.

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

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