Skip to content

Instantly share code, notes, and snippets.

@archeYR
Last active October 20, 2025 15:29
Show Gist options
  • Save archeYR/d687de5e484ce7b45d6a94415a04f3dc to your computer and use it in GitHub Desktop.
Save archeYR/d687de5e484ce7b45d6a94415a04f3dc to your computer and use it in GitHub Desktop.
8BitDo Firmware Updater in Wine

This is about running 8BitDo's Firmware Update tool for Windows in Wine. It can be used for updating newer 8BitDo devices that may not be supported by fwupd on Linux. This tool uses .NET Framework, so it will need Wine Mono to be installed (dotnet48 wintericks verb was tested to work as well).

This tool needs Segoe UI Symbol font, on Arch this font is provided by ttf-ms-win10-auto package. For other distributions there is install script.

You will have to let Wine access device's HID interface for updating the firmware. Most importantly it should be a boot HID interface (exposed when device is in bootloader mode, often referred to as "manual update mode" or "advanced mode"). It is also worth adding the Product IDs for HID interfaces that are exposed under different conditions (for example, Ultimate Bluetooth Controller's receiver exposes a HID interface when controller is not connected), so the upgrade tool can detect it and automatically put it in bootloader mode for upgrading the firmware. You can use lsusb tool to get the Vendor and Product IDs. Here's an example for 8BitDo Ultimate Bluetooth Controller and its USB receiver, which you can adapt for your devices by modifying the Product IDs as needed:

sudo nano /etc/udev/rules.d/71-8bitdo-boot.rules

# 8BitDo Ultimate Bluetooth Controller's boot HID interface (seems to be shared by multiple 8BitDo devices)
# Change it only if lsusb prints different Product ID when device is in bootloader mode.
SUBSYSTEM=="hidraw", ATTRS{idProduct}=="3208", ATTRS{idVendor}=="2dc8", TAG+="uaccess"

# 8BitDo Ultimate Bluetooth Controller receiver's HID interface (exposed when the controller is not connected)
# When it is exposed, the upgrade tool can detect the receiver and automatically put in in bootloader mode.
SUBSYSTEM=="hidraw", ATTRS{idProduct}=="3109", ATTRS{idVendor}=="2dc8", TAG+="uaccess"

Now it is needed to reload the udev rules.

sudo udevadm control --reload-rules && sudo udevadm trigger

Disable SDL mode in winebus because it prevents firmware updater from accessing the device, can be done through Wine registry (seems like it is not needed to be done on recent Wine versions).

wine regedit

add DWORD value of 0 named "Enable SDL" at HKLM\System\CurrentControlSet\Services\winebus

Can be re-enabled after updating firmware (set the "Enable SDL" value to 1 or just remove it).

Shutdown wine server to save and apply registry changes: wineserver -k

Updating the Ultimate Bluetooth Controller works only in manual mode (press LB+RB and connect the controller through USB cable, then select appropriate device). This is (probably) because the Linux xpad driver doesn't expose additional HID interface that could be used by upgrade tool to detect the device (unlike Windows' XUSB driver, which does).

USB wireless dongle should be detected by the tool when controller is not connected.

@archeYR
Copy link
Author

archeYR commented Aug 14, 2025

I had tried enabling some Wine debug and got to where it was resolving the host, but wasn't familiar enough with the debug output to understand what might be wrong.

Feel free to put the log from recent Wine here if the problem persists.

I'll try a newer Wine version (I just realised I said I was on Ubuntu 22.04 -- I'm actually on 24.04, so Wine 9.0 from the Ubuntu repo, but I'll try a 10.x version), thanks for the suggestion and I appreciate your original post and followup help!

Unfortunately I can't exactly reproduce that problem and I don't have any Ubuntu system either, so I can only guess at best. However, another Ubuntu (24.04 as well, perhaps?) user left a detailed post with getting it to work with Lutris runner, maybe that's also something worth looking into. You can also try version 2.48 of the tool that was known to work on Ubuntu with 8BitDo Pro 2.

@arghness
Copy link

Thanks, Wine 9 was the issue for me. I updated to 10 and it worked immediately.

@algtan
Copy link

algtan commented Sep 6, 2025

I have an SN30 Pro +, and this is what worked for me using Ubuntu 24.04.3 LTS and Wine 10.0

  1. Follow the instructions above, but I used a product ID of 5750. This is what my /etc/udev/rules.d/71-8bitdo-boot.rules looks like:
    # 8BitDo SN30 Pro Plus Controller's boot HID interface
    # Change it only if lsusb prints different Product ID when device is in bootloader mode.
    SUBSYSTEM=="hidraw", ATTRS{idProduct}=="5750", ATTRS{idVendor}=="2dc8", TAG+="uaccess"
    
  2. Restart my computer
  3. Plug in the USB cable into the controller, but do not plug it into the PC yet
  4. Start the firmware updater in wine: wine <filename>.exe
  5. Hold L1 + R1 on the controller for 3 seconds, and continue holding while plugging in the USB cable into the PC
  6. A list of controllers should show up once your controller is detected. If not, you may need to go to "Update Manually" from the menu
  7. Select the controller, select the firmware, then click the "Update" button
  8. I was able to monitor the progress through the terminal, and the UI said it was complete/successful once it was done

@soaresluciano
Copy link

I have an SN30 Pro +, and this is what worked for me using Ubuntu 24.04.3 LTS and Wine 10.0

1. Follow the instructions above, but I used a product ID of `5750`. This is what my `/etc/udev/rules.d/71-8bitdo-boot.rules` looks like:
   ```
   # 8BitDo SN30 Pro Plus Controller's boot HID interface
   # Change it only if lsusb prints different Product ID when device is in bootloader mode.
   SUBSYSTEM=="hidraw", ATTRS{idProduct}=="5750", ATTRS{idVendor}=="2dc8", TAG+="uaccess"
   ```

2. Restart my computer

3. Plug in the USB cable into the controller, but do not plug it into the PC yet

4. Start the firmware updater in wine: `wine <filename>.exe`

5. Hold L1 + R1 on the controller for 3 seconds, and continue holding while plugging in the USB cable into the PC

6. A list of controllers should show up once your controller is detected. If not, you may need to go to "Update Manually" from the menu

7. Select the controller, select the firmware, then click the "Update" button

8. I was able to monitor the progress through the terminal, and the UI said it was complete/successful once it was done

Thank you very much! After many days I managed to make it work following your steps.
My problem was the .NET installed on the prefix. It only works with Mono.

@purplebar0
Copy link

purplebar0 commented Sep 30, 2025

I was able to update my Retro Receiver for NGC (PID 3208) with this method, but had no luck with Mod Kit for Original NGC Controller (PID 5750).

I appended the same udev rule with the product ID changed to 5750 (same vendor ID) to no avail. Neither "Firmware Updater" or an updater provided with beta firmware specifically for the NGC Mod Kit detected the device. I made sure that it is in bootloader mode (hold Z while powering on), and that's where I got the PID from.

Also, I didn't fully test with Mono because the error message felt like using it in that state would be risky, so instead I used dotnet48 and it worked fine. (Pro tip, do winetricks -q -f dotnet48 to avoid installer dialogues and let it install automatically. Might be faster too!)

@archeYR
Copy link
Author

archeYR commented Oct 2, 2025

I appended the same udev rule with the product ID changed to 5750 (same vendor ID) to no avail. Neither "Firmware Updater" or an updater provided with beta firmware specifically for the NGC Mod Kit detected the device. I made sure that it is in bootloader mode (hold Z while powering on), and that's where I got the PID from.

Did you reload udev rules and restart the Wine server afterwards? If so, does this device bring up a HID interface in bootloader mode?

@purplebar0
Copy link

I appended the same udev rule with the product ID changed to 5750 (same vendor ID) to no avail. Neither "Firmware Updater" or an updater provided with beta firmware specifically for the NGC Mod Kit detected the device. I made sure that it is in bootloader mode (hold Z while powering on), and that's where I got the PID from.

Did you reload udev rules and restart the Wine server afterwards? If so, does this device bring up a HID interface in bootloader mode?

I reloaded udev rules. I had to restart Wine server as reloading udev rules crashed Wine anyway, though I can make sure the next time I test. As for whether a HID interface appears, where do I check that? lsusb -v?

@archeYR
Copy link
Author

archeYR commented Oct 2, 2025

As for whether a HID interface appears, where do I check that? lsusb -v?

A dmesg fragment that appears after connecting the device in bootloader mode would be interesting.

@ngmoviedo
Copy link

Has anybody managed to run this inside a Flatpak? I can run it using system Wine, with no major problem, but I wanted to install it as a program using Bottles, which I installed using Flatpak. The updater runs, but is unable to detect the controller in boot mode or the receiver. I suppose it might be related with some access restrictions to the devices.
Has anybody experimented with this option?

@nickalcock
Copy link

Looks like this doesn't work for the Ultimate 3-mode :( the updater simply doesn't appear to support it at all, insofar as I can tell from their horrific naming schemes. The only thing that does support it is only available on the Microsoft Store, so I guess I'm still totally out of luck.

@archeYR
Copy link
Author

archeYR commented Oct 20, 2025

Looks like this doesn't work for the Ultimate 3-mode :( the updater simply doesn't appear to support it at all, insofar as I can tell from their horrific naming schemes.

That seems to be a case indeed.

The only thing that does support it is only available on the Microsoft Store, so I guess I'm still totally out of luck.

Unfortunately Wine's support for WinRT/UWP applications is still poor. From my testing the Ultimate Software X just crashes on startup.

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