Skip to content

Instantly share code, notes, and snippets.

@ammuench
Last active July 12, 2025 08:43
Show Gist options
  • Save ammuench/0dcf14faf4e3b000020992612a2711e2 to your computer and use it in GitHub Desktop.
Save ammuench/0dcf14faf4e3b000020992612a2711e2 to your computer and use it in GitHub Desktop.
8BitDo Ultimate 2.4GHz wifi working in linux

FROM https://www.reddit.com/r/Fedora/comments/zmvkdj/8bitdo_ultimate_bluetooth_controller_working_in/


I've bought this new controller from 8BitDo and wished to use on linux, to my sadness the controller didn't work out of the box, neither by cable, the 2.4G dongle or bluetooth.

So I've tried a number of solutions and this one from u/GodOfEmus over in the 8bitdo community was the one to work for me:

  1. Create a new file /etc/udev/rules.d/99-8bitdo-xinput.rules
  2. Paste this udev rule in there, then save and exit the file:
  ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3106", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 3106 > /sys/bus/usb/drivers/xpad/new_id'"
  1. Run the following command in a terminal: sudo udevadm control --reload
  2. Unplug and replug the controller if it was already plugged in, it might take a second if you have the bluetooth version

It will basically "cheat" the OS to see the controller as an generic xbox device, so sadly no bluetooth nor gyro control if you care about that, but the rumbling is working for me.

Link to the original post: https://www.reddit.com/r/8bitdo/comments/ykdsmv/ultimate_24_ghz_model_right_analog_not_working_in/

And link to the comment of u/GodOfEmus with the solution: https://www.reddit.com/r/8bitdo/comments/ykdsmv/comment/iv48s4k/?utm_source=share&utm_medium=web2x&context=3

Sharing this solution here to spread the word in our community

@porschemad911
Copy link

porschemad911 commented Jan 29, 2025

Just to add ... on my Debian 12 install with kernel 6.1.0-30-amd64, for an 8bitdo Ultimate 2C wireless controller connected via the 2.4G dongle I created /etc/udev/rules.d/99-8bitdo-xinput.rules with content:

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="310a", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 310a > /sys/bus/usb/drivers/xpad/new_id'"
ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="310a", MODE="0666"

Then did:

sudo udevadm control --reload-rules

Controller is now picked up in evtest and responds to input.

On my other Debian 12 machine with kernel 6.12.9-1-amd64 installed from backports the 8bitdo Ultimate 2C wireless controllers connected via the 2.4G dongle worked out of the box.

@BeardSpike
Copy link

BeardSpike commented Jan 29, 2025

With the help of /r/linux_gaming about CachyOS not picking up the 3mode, one of the users there has pinpointed the issue to the charging dock. Not CachyOS problem at all.

The dongle should be plugged into the charging dock at all times. I didn't read the manual that thoroughly, I use external charger for that one and I have the WiFi dongle plugged in directly into the PC, but thanks to this GitHub post my method works now too!

@mercster
Copy link

With the help of /r/linux_gaming about CachyOS not picking up the 3mode, one of the users there has pinpointed the issue to the charging dock. Not CachyOS problem at all.

The dongle should be plugged into the charging dock at all times.

So issue was PEBKAC, not with the charging dock.

I keep steam running in the background at all times (Steam is set to autostart on my desktop), and I never have problems with this controller. Steam keeps it alive.

@teklynk
Copy link

teklynk commented Jan 30, 2025

I could never get this to work using 8BitDo Ultimate 3mode Xbox (Vendor: 2dc8 Product: 201b) over 2.4 wireless or plugged in. JSTest shows that the right stick moves up and down when I physically move the stick right/left. LT shows that it controls the right stick. It's a mess. Strangely, the controller works fine with SteamOS on the SteamDeck. It also works fine in Steam. Which leads me to wonder if Steam has its own input drivers that can not be used outside of Steam? It's frustrating becuase I use my laptop to play cloud based games streamed through a web browser and this controller does not work with that.
I have a cheap $12 controller that is 2.4 wireless and it works with everything. But this expensive controler only works with Steam. If only I could take out the guts of the cheap controller and put them inside of the 8BitDo controller. I could, but I should not have to. Gamepads should be standardized by this point with xinput.
BTW: I am using kernel 6.8.0-51-generic and Linux Mint 22.1

Hi,

I managed to extract device ID while pairing the dongle on Win10 and dual-booting to CachyOS for 8BitDo Ultimate 3mode in 2.4Ghz - lucky strike I guess.

It did show up in lsusb as

Bus 001 Device 007: ID 2dc8:200f 8BitDo 8BitDo Ultimate 3mode Xbox

sudo nano /etc/udev/rules.d/99-8bitdo-xinput.rules

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="200f", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 200f > /sys/bus/usb/drivers/xpad/new_id'"

sudo udevadm control --reload

Seems to work well so far.

A newbie here, mostly on Windows my whole life, been distro hopping a bit till I settled for CachyOS for now.

Hope that helps as a fellow user of 3mode!

I've been scratching my brain for this one, since it has been connecting on and off on my CachyOS and I couldn't pin point why it is connecting and why it is not ;).

This seems to get it to work over bluetooth and jstest-gtk now shows that the buttons and joysticks are mapped correctly. However, the mapping is off when using xbox cloud gaming. My guess is that it only works with xbox controllers or controllers that use the xbox drivers.

@BeardSpike
Copy link

BeardSpike commented Feb 3, 2025

With the help of /r/linux_gaming about CachyOS not picking up the 3mode, one of the users there has pinpointed the issue to the charging dock. Not CachyOS problem at all.
The dongle should be plugged into the charging dock at all times.

So issue was PEBKAC, not with the charging dock.

I keep steam running in the background at all times (Steam is set to autostart on my desktop), and I never have problems with this controller. Steam keeps it alive.

Hmm,

Riddle me this, I removed the 99-8bitdo-xinput.rules, plugged it in as manual states.

The controller now connects but only when games are turned off, this is regardless if I have xinput.rules files or not - oddly enough Discord, CoreCtrl, Steam, Heroic Games Launcher don't interfere with it.

Or if I use any recording software whatsoever in the background it won't connect, like GPU Screen Recorder - if Replay Buffer is turned on it won't connect, nor through the dongle, nor wired - when I turn Replay Buffer off it connects then I can turn RB on, turn any game on and it works both wired and through the dongle.

The only mode I can turn it on when it disconnects and I have any game on or Replay Buffer on is through 8BitDo USB Wireless Adapter 2 in Android BT Mode... It always connects.

This is so weird for me, I guess I could keep it alive like you with Steam and have it always on in the background but I Just wanted to point this out and also ask if any user who has 3-mode has the same issues? Should it be like this?

I now know more about this controller than ever before - it has it quirks on Linux for sure.

@BeardSpike
Copy link

I just wanted to share.

I bought a second 8BitDo controller 2,4Ghz which is 2C like a two weeks ago.

This one always connects regardless of open apps and games through 2,4Ghz dongle.

I guess 3-Mode is just that weird, at least for me.

I might sell 2C in a while since 8BitDo just released Ultimate 2 controller with 1000Hz TMR joysticks and gyro - and I don't quite like vibrations on 2c plus feel of the grip/shell.

If I buy this new controller I will gladly share how it behaves under Linux for me.

@YogSottot
Copy link

YogSottot commented Mar 13, 2025

You can also try using this drivers instead of xpad
https://github.com/atar-axis/xpadneo or
https://github.com/medusalix/xone/

@Axlefublr
Copy link

@ammuench, thank you so much for making this guide! I just bought 8bitdo ultimate 2c, and was kinda hoping it'd just work out of the box, so I got scared when it didn't :c found this gist and got hope!... but it didn't work anyway... \ but that's where @gemantzu came in! I just blindly copy pasted the udev rule, but didn't think to check my model number! mine was 81HD (it's on the back of the controller). changed 3106 in both places in the udev rule to that, reloaded, and the controller worked!! :D thank you both!!

@asoltesz
Copy link

On OpenSUSE Tumbleweed, KDE Plasma, Wayland (2025-MAR-26 update level), the 8bitdo Ultimate (2.4 Ghz+BT) worked out of the box with the 2.4 Ghz USB dongle in Steam, no extra configuration was needed.

When switching the Controller to Bluetooth mode and paired, it is recognized as a keyboard and it doesn't work at all in Steam or elsewhere.

@barraIhsan
Copy link

Is there someone who use the new 8Bitdo Ultimate 2 Wireless? Does the rumble/vibration work on linux? What about the extra button?

@asoltesz
Copy link

Is there someone who use the new 8Bitdo Ultimate 2 Wireless? Does the rumble/vibration work on linux? What about the extra button?

I believe my Ultimate 2.4 Ghz+BT is practically the same as the Ultimate Wireless (just has an extra Bluetooth mode).

@themoses
Copy link

Is there someone who use the new 8Bitdo Ultimate 2 Wireless? Does the rumble/vibration work on linux? What about the extra button?

Yes it does work with the following udev rule:

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="310a", MODE="0666", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 310a > /sys/bus/usb/drivers/xpad/new_id'"

Rumble works ootb but the additional buttons will not be recognized as it maps to a default xbox controller.

@robtor-de
Copy link

Currently I don't get the Ultimate Bluetooth Cotnroller to work with the 2.4G wireless dongle, with any of the above udev rules.
I noticed that it enumerates as 2dc8:3109 and if the controller connects as 2dc8:3106, then the xpad driver automatically binds but after a few seconds usbcore logs a disconnect and 2dc8:3109 reappears.

I already thought about usb timing problems etc. and tried out different usbcore.quirks on the device bit they all did not succeed. When debug logging usb core messages one could see that it tempporarily also appears as a nintendo controller after xpad fails and then the dongel goes back to it's 2dc8:3109 mode. This weird behaviour started only from newer kernel versions on my archlinux hosts or on debian devices. On an older kernel on my libreelec raspi (also uses other usb host controllers) the controller works very well with the wireless 2.4G dongle.

I didn't found any solution yet, maybe sb. here has the same issue ar runs into it in the future.

Connecting the controller via cable works like a charm btw.

Here are some logs in Pastebin

@Khyretos
Copy link

themoses

this worked but i had to make 310b since it was listed differently in my system

@CaptainCoward
Copy link

This one always connects regardless of open apps and games through 2,4Ghz dongle.

Hey I'm interested in that controller. Does Bluetooth also work for you? I don't actually want to use that Dongle since it is huge and i hardly have space for it on my front.

@MichaelAldrich
Copy link

I almost started down the path of custom udev rules, but updating my kernel to 6.12 gave me plug and play working for my ultimate 2 wireless without any extra steps.

@mercster
Copy link

mercster commented Jun 22, 2025

Strangely, I had a bit of trouble... 6.14.11 on Fedora 42:

Jun 17 17:42:18 fedora kernel: usb 1-2.3.4: New USB device found, idVendor=2dc8, idProduct=310b, bcdDevice= 1.14
Jun 17 17:42:18 fedora kernel: usb 1-2.3.4: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jun 17 17:42:18 fedora kernel: usb 1-2.3.4: Product: 8BitDo Ultimate 2 Wireless Controller for PC
Jun 17 17:42:18 fedora kernel: usb 1-2.3.4: Manufacturer: 8BitDo
Jun 17 17:42:18 fedora kernel: usb 1-2.3.4: SerialNumber: 99FB9EA46A
Jun 17 17:42:18 fedora kernel: input: 8BitDo Ultimate 2 Wireless Controller as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3.4/1-2.3.4:1.0/input/input34
Jun 17 17:42:18 fedora kernel: input: 8BitDo 8BitDo Ultimate 2 Wireless Controller for PC Keyboard as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3.4/1-2.3.4:1.1/0003:2DC8:310B.0007/input/input35
Jun 17 17:42:18 fedora kernel: input: 8BitDo 8BitDo Ultimate 2 Wireless Controller for PC Mouse as /devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3.4/1-2.3.4:1.1/0003:2DC8:310B.0007/input/input36
Jun 17 17:42:18 fedora kernel: hid-generic 0003:2DC8:310B.0007: input,hidraw4: USB HID v1.11 Keyboard [8BitDo 8BitDo Ultimate 2 Wireless Controller for PC] on usb-0000:00:14.0-2.3.4/input1
Jun 17 17:42:18 fedora kernel: hid-generic 0003:2DC8:310B.0008: hiddev98,hidraw5: USB HID v1.11 Device [8BitDo 8BitDo Ultimate 2 Wireless Controller for PC] on usb-0000:00:14.0-2.3.4/input2
Jun 17 17:42:18 fedora mtp-probe[9687]: checking bus 1, device 12: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3.4"
Jun 17 17:42:18 fedora mtp-probe[9687]: bus: 1, device: 12 was not an MTP device
Jun 17 17:42:18 fedora systemd-logind[987]: Watching system buttons on /dev/input/event12 (8BitDo 8BitDo Ultimate 2 Wireless Controller for PC Keyboard)
Jun 17 17:42:18 fedora mtp-probe[9713]: checking bus 1, device 12: "/sys/devices/pci0000:00/0000:00:14.0/usb1/1-2/1-2.3/1-2.3.4"
Jun 17 17:42:18 fedora mtp-probe[9713]: bus: 1, device: 12 was not an MTP device
Jun 17 17:42:19 fedora kernel: usb 1-2.3.4: USB disconnect, device number 12
Jun 17 17:42:19 fedora kernel: xpad 1-2.3.4:1.0: xpad_try_sending_next_out_packet - usb_submit_urb failed with result -19

Would just cycle over and over... I added:

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3106", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 3106 > /sys/bus/usb/drivers/xpad/new_id'"

as a udev rule, works fine now. I do keep Steam open in the background, which has always kept these 8BitDo devices alive for me, can't speak to what would happen if I killed Steam.

EDIT: Credit to @themoses for the udev rule, I see this thread is where I got it from. :-P
EDIT2: Wrong log.

@njanirudh
Copy link

njanirudh commented Jun 23, 2025

For future reference


📎 Gist: 8BitDo Ultimate 2C Wireless Controller on Linux (Steam + XInput Rule)

# USB Device Info
# Controller is detected via lsusb in both 2.4GHz wireless and wired USB modes.

Bus 001 Device 040: ID 2dc8:301c 8BitDo 8BitDo Ultimate 2C Wireless Controller
# Udev Rule for XInput Compatibility
# This rule sets proper permissions and ensures the xpad driver is loaded.

# File: /etc/udev/rules.d/99-8bitdo.rules

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="301c", MODE="0666", \
  RUN+="/sbin/modprobe xpad", \
  RUN+="/bin/sh -c 'echo 2dc8 301c > /sys/bus/usb/drivers/xpad/new_id'"
# Notes:
- ✅ The controller is detected in both **2.4GHz mode** (via dongle) and **wired USB**.
-**Steam** correctly identifies the controller and maps inputs using Steam Input.
- ❌ GeForce NOW does **not natively detect DInput** devices (like 301c) unless launched via Steam.

Further Debugging

# Run this in a cmd line and plug in the 2.4ghz reciever 
sudo dmesg -w

@robtor-de
Copy link

So finally I came to the conclusion that the controller worked from the beginnging with the 2.4G dongle out of the box. The only problem was that it disconnects if nothing grabbed the input.
Having steam open resolves the problem.

As I also have non-steam use-cases for the controller I used the AUR package evedev-keepalive and patched the contained udev rules to match my controller and everthing works just fine.

Hopefully the xpad driver will integrate a fix.

The issue from xpad is referenced in the original repo from the evdev-keepalive project

Hope this helps as well with other 8bitdo controllers! (mine is the Ultimate Bluetooth variant)

@mercster
Copy link

So finally I came to the conclusion that the controller worked from the beginnging with the 2.4G dongle out of the box. The only problem was that it disconnects if nothing grabbed the input. Having steam open resolves the problem.

Yep, said this way back when https://gist.github.com/ammuench/0dcf14faf4e3b000020992612a2711e2?permalink_comment_id=4756745#gistcomment-4756745 two years ago. :-)

@barraIhsan
Copy link

barraIhsan commented Jun 27, 2025

Is there someone who use the new 8Bitdo Ultimate 2 Wireless? Does the rumble/vibration work on linux? What about the extra button?

Yes it does work with the following udev rule:

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="310a", MODE="0666", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 310a > /sys/bus/usb/drivers/xpad/new_id'"

Rumble works ootb but the additional buttons will not be recognized as it maps to a default xbox controller.

update: https://gist.github.com/barraIhsan/783a82bcf32bed896c85d27dbb8018a5

I thought it would be appropriate to create a new gist for Ultimate 2 Wireless, since this is about Ultimate 2.4GHz

Oh, I also heard that Ultimate 2c after firmware update, also possible to switch to DInput and Switch mode. And thus, with DInput the additional 2 button is exposed.
But I don't have 2c, so I can't test it

@teklynk
Copy link

teklynk commented Jun 28, 2025

It still doesn't work for me. I give up messing with this controller. It's been a waste of time. How difficult is it to make a controller that uses xinput and that shows up as a xbox 360 controller? I went back to using my $12.00 2.4ghz wireless controller since it works on everything. It's not great, but it works ootb and it shows up as a xbox 360 controller device.

@BeardSpike
Copy link

BeardSpike commented Jun 28, 2025

It still doesn't work for me. I give up messing with this controller. It's been a waste of time. How difficult is it to make a controller that uses xinput and that shows up as a xbox 360 controller? I went back to using my $12.00 2.4ghz wireless controller since it works on everything. It's not great, but it works ootb and it shows up as a xbox 360 controller device.

I already ditched 8BitDo controllers for GameSir.

No additional tinkering, they can switch from Xinput to Dinput to Switch input with a simple combo of buttons.

No need to add that they hold 1000Hz polling rate almost spot on, while Ultimate 2 goes up to like 600Hz range.

They also have Hall Effect joysticks and TMR Joysticks in their controllers. And are testing something potentially even better.

Plus their CEO is very active on socials.

So you can actually ask a lot of things.

@barraIhsan
Copy link

It still doesn't work for me. I give up messing with this controller. It's been a waste of time. How difficult is it to make a controller that uses xinput and that shows up as a xbox 360 controller? I went back to using my $12.00 2.4ghz wireless controller since it works on everything. It's not great, but it works ootb and it shows up as a xbox 360 controller device.

It is XInput on dongle and wired mode. Or am I missing something here?

@Khyretos
Copy link

KERNEL=="hidraw*", SUBSYSTEM=="hidraw", ATTRS{idProduct}=="6012", ATTRS{idVendor}=="2dc8", MODE="0660", TAG+="uaccess", TAG+="udev-acl"

Hey i have a wireless ultimate 2 and i would like to try the DInput, do i just need to add this line to my rules?
for example this is my current rule for the controller:

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="310b", MODE="0666", RUN+="/sbin/modprobe xpad", RUN+="/bin/sh -c 'echo 2dc8 310b > /sys/bus/usb/drivers/xpad/new_id'"

do i just need to add that line below it?

@barraIhsan
Copy link

yes, you can add multiple rules into one file.

For example, 1st party and some of the 3rd party controller are also included in steam input. You can find it on /usr/lib/udev/rules.d/60-steam-input.rules

Huh, your udev rule is for the XInput right? I don't think it's needed anymore, but it doesn't hurt to just include that anyway.

@Khyretos
Copy link

yes, you can add multiple rules into one file.

For example, 1st party and some of the 3rd party controller are also included in steam input. You can find it on /usr/lib/udev/rules.d/60-steam-input.rules

Huh, your udev rule is for the XInput right? I don't think it's needed anymore, but it doesn't hurt to just include that anyway.

i had the controller before steam supported it and i had to add the rule.
i updated the controllers firmware and the nintendo switch mode works perfectly with Gyro but i cant make it detect gyro with the direct input mode (Power on + B). steam does detect and the additional buttons options appear but for some reason its very buggy, i turn it on and it inmeadeatly untoggles when i close it.

image

@barraIhsan
Copy link

i had the controller before steam supported it and i had to add the rule.

it was actually the linux kernel that updated to support the XInput on this controller.

steam does detect and the additional buttons options appear but for some reason its very buggy, i turn it on and it inmeadeatly untoggles when i close it.

huh, did you try clicking the edit layout instead? and assign the button manually?
Oh, for now, to correctly display 8bitdo's additional button, you have to use steam beta
image

@Khyretos
Copy link

i had the controller before steam supported it and i had to add the rule.

it was actually the linux kernel that updated to support the XInput on this controller.

steam does detect and the additional buttons options appear but for some reason its very buggy, i turn it on and it inmeadeatly untoggles when i close it.

huh, did you try clicking the edit layout instead? and assign the button manually? Oh, for now, to correctly display 8bitdo's additional button, you have to use steam beta image

Yes, i did that and unfortunatly the settings just keep resetting ill just wait until they iron out the bugs.

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