Skip to content

Instantly share code, notes, and snippets.

@ammuench
Last active February 28, 2025 11:07
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

@BigBoyBarney
Copy link

BigBoyBarney commented Jan 4, 2024

Wow, that's very interesting!
Which mode are you using it in? The controller reports itself as 8BitDo Pro 2 Wired Controller in jstest with only 10 buttons
How does yours report itself?

EDIT: I just tried what @ammuench mentioned, set what I wanted to the paddles in a Windows VM, and now the paddles work as expected, as do the profiles / profile switching. Amazing stuff, thank you so much!

@davcri
Copy link

davcri commented Jan 27, 2024

JFYI: it works out of the box on latest Linux Mint 21.3 with 6.5 kernel. Also it works out of the box on Steam Deck.

@holotone
Copy link

This was a big help, thanks!

@aragubas
Copy link

aragubas commented May 3, 2024

Works out of the box in Fedora 40 now! I just bought the controller, plugged the 2.4GHz dongle in and it just works! also works via cable. Tho I only tested X input mode

@Hatsune-Cthulhu
Copy link

Hatsune-Cthulhu commented May 9, 2024

Annoyingly the wireless dongle doesn't seem to have power/wakeup support, also, controller just doesn't work in general for me on Kernel 6.8

@justinnichols
Copy link

Annoyingly the wireless dongle doesn't seem to have power/wakeup support, also, controller just doesn't work in general for me on Kernel 6.8

I concur. I'm having issues where sometimes Garuda Linux will see it connected, and sometimes it won't. The udev rule in this gist also didn't help fix it.

@Edwardius
Copy link

For anyone who is looking to just make the controller work but not make it "cheat" the OS. You can use udev to give its input files read/write permissions.

  1. create a /etc/udev/rules.d/99-8bitdo-xinput.rules with your favorite editor
  2. inside the file, add the following:
    1. ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3016", MODE="0666"
    2. This gives the input file of any 8bitdo controller R/W permissions automatically when connected.
  3. reload udev with sudo udevadm control --reload-rules or just reboot your computer.

This is helpful when you want to just read the controller's input according to SDL, not remapping to an xbox controller. Example use case is when you want it to work with ROS (https://answers.ros.org/question/384456/ros2-joy_node-debugging/)

@gemantzu
Copy link

gemantzu commented Jun 16, 2024

FYI always check your model. the new ultimate 2.4ghz w/ the hall effect joysticks have id of 3109.

@Hatsune-Cthulhu
Copy link

Hatsune-Cthulhu commented Jun 25, 2024

FYI always check your model. the new ultimate 2.4ghz w/ the hall effect joysticks have id of 3109.

Yeah, I haven't actually been using any of the udev rules here, been writing my own. I updated to kernel 6.9.5 and haven't had any issues with the controller not working since, but still not seeing power/wakeup support. Wondering if they shipped the new hall effect ultimate controllers with a worse dongle.

cat "${${$(grep 3109 /sys/bus/usb/devices/*/idProduct):0:-5}/idProduct/power/wake}"
cat: /sys/bus/usb/devices/1-3/power/wake: No such file or directory

Certainly seems like they shipped the new ones with a crappier dongle, if this does turn out to be the case, they've definitely lost a customer in me, given they marketed this controller around the steam deck, knowing full well that the steam deck community wants a controller that can wake the system remotely.

@chronically-late
Copy link

I bought the Bluetooth/dongle version earlier this year, while the dongle is still causing problems with constant disconnects when using Bluetooth it works out of the box and can be tested with evtest.

@zeus134Dev
Copy link

I worked for me on Lubuntu 22.04 for the "8Bitdo Ultimate C 2.4g".
Thank you!

Just as described:

1️⃣ I ran: sudo nano /etc/udev/rules.d/99-8bitdo-xinput.rules and typed my computer password

2️⃣ I pasted the following line:
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'"

3️⃣ I pressed: CTRL + X

4️⃣ I typed "y" and then "ENTER" to save the buffer

5️⃣ I pressed "ENTER" one again

6️⃣ I ran: sudo udevadm control --reload

7️⃣ Disconnected the 2.4g receiver

8️⃣ Connected the 2.4g receiver

9️⃣ I pressed and held the "X button + 8bitdo button" in the controller until it did a small vibration

🔟 DONE!

@zelf
Copy link

zelf commented Sep 2, 2024

Anyone managed to get the gyro working?

@mercster
Copy link

mercster commented Sep 2, 2024

Anyone managed to get the gyro working?

There is no gyro on the 8bitdo Ultimate 2.4Ghz.

@zelf
Copy link

zelf commented Sep 2, 2024

@mercster i see. I bought the wrong one. There's another one with gyro. Thanks!

@mercster
Copy link

mercster commented Sep 2, 2024

@mercster i see. I bought the wrong one. There's another one with gyro. Thanks!

I wouldn't expect the gyro to work under Linux at any rate. Good luck?

@zelf
Copy link

zelf commented Sep 2, 2024

Yeah, I realize now. I wanted the 8bitdo because of the 2.4 dongle.

The ps5 controller has gyro, but I get weird delays (which is a problem on eldenring and wukong)
It went away with the 8bitdo.

i guess I'll use both controllers and change depending on the game.

@YusefOuda
Copy link

this also works for the new Ultimate 2C, except the product id is 310a instead of 3106

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'"

@kody-oneill
Copy link

@YusefOuda This is awesome I was looking for this exactly! My question is how do you find this ID of the product to know that it was 310a vs 3106?

@YusefOuda
Copy link

@kody-oneill you can use lsusb

@d-t-o
Copy link

d-t-o commented Oct 26, 2024

@kody-oneill you also see it in your syslog as soon as you power the controller on:

input: 8BitDo 8BitDo Ultimate 2C Wireless Controller Keyboard as /devices/pci0000:00/0000:00:01.2/0000:02:00.0/usb1/1-4/1-4:1.1/0003:2DC8:310A.000B/input/input38

Does anyone know how extra buttons work with xpad though? I expected to see R4/L4 as additional joystick buttons, same with the mapping and star button, but they are not, there's only 11 buttons listed, those 4 seem to be missing.

Edit: L4/R4 can be remapped via the controller itself to other buttons, then they work, but of course acting as these other buttons. I was hoping to see two additional buttons for custom stuff like next/previous song.

@855579762735
Copy link

855579762735 commented Nov 13, 2024

For anyone who is looking to just make the controller work but not make it "cheat" the OS. You can use udev to give its input files read/write permissions.

1. create a `/etc/udev/rules.d/99-8bitdo-xinput.rules` with your favorite editor

2. inside the file, add the following:
   
   1. `ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3016", MODE="0666"`
   2. This gives the input file of any 8bitdo controller R/W permissions automatically when connected.

3. reload udev with `sudo udevadm control --reload-rules` or just reboot your computer.

This is helpful when you want to just read the controller's input according to SDL, not remapping to an xbox controller. Example use case is when you want it to work with ROS (https://answers.ros.org/question/384456/ros2-joy_node-debugging/)

Debian 12 Bookworm
I am using the 8BitDo Ultimate C 2.4G Wireless Controller
working file: /etc/udev/rules.d/99-8bitdo-xinput.rules

So I tried to blindly use the original post code shown below to see if I could get this working ..

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'"

and then trying to either reboot or running udevadm control --reload with disconnecting and reconnecting the device, and that worked ..
however what I really want is this to work without hacky stuff .. so I tried what @Edwardius suggested, like so;

ACTION=="add", ATTRS{idVendor}=="2dc8", ATTRS{idProduct}=="3016", MODE="0666"

then I did a reboot and the whole udevadm control --reload with disconnecting and reconnecting the device .. didn't work .. so I did more research and after trying lsusb I found that my device is actually called out as 2dc8:3016. So how is it that the original setup works with the hacky stuff and the wrong idProduct but the controller is not recognized in MODE="0666" with the correct idProduct ? Any assistant is greatly appreciated :)

side note: is it possible that by doing the hacky version first I've screwed up the native support ? how would I reverse that ?

@laughtrey
Copy link

adding the rule to the file for arch linux isn't working. lsusb can see the dock when the controller is docked, but picking it up removes it and the controller can never be detected while wireless.

It works while plugged directly in with a cord however.

@teklynk
Copy link

teklynk commented Jan 22, 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

@BeardSpike
Copy link

BeardSpike commented Jan 28, 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 ;).

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

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