Skip to content

Instantly share code, notes, and snippets.

@archeYR
Last active August 21, 2026 14:48
Show Gist options
  • Select an option

  • Save archeYR/d687de5e484ce7b45d6a94415a04f3dc to your computer and use it in GitHub Desktop.

Select an option

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

archeYR commented Dec 16, 2025

Copy link
Copy Markdown
Author

The software was working for me very well on CachyOS and wine (I believe it was wine 10.18 but not 100% sure). I was able to flash firmware and do all the configurations I needed to the controller.

I recently did a system update and now the software just crashes. I tested wine with a different windows app and that still works. Not sure if anyone might be able to point me to the right direction. The error message is below.

Does disabling icu, icuin and icuuc libraries in winecfg help?

@herd-the-cats

Copy link
Copy Markdown

For anyone running Gentoo that's struggling with the Ultimate v2 software (for the newer controllers, like the 8BitDo Pro 3) crashing in wine, make sure that you've installed media-fonts/corefonts or it won't work. That also requires accepting the license masking it: echo 'media-fonts/corefonts MSttfEULA' >> /etc/portage/package.license/media-fonts_corefonts. It also requires the winetricks dotnet48 install on the prefix as described in other guides. Hope this saves someone some time.

@giminici

giminici commented May 27, 2026

Copy link
Copy Markdown

I try run 8bitdo ultimate software V2 . app works fine after installing other stuff but it failes on kernel driver 003c:err:service:scmdatabase_load_services Error 1804 reading registry key for service L"EPMVolFl" - skipping
i give up on that and use virtualbox..

@hoppyhopps

hoppyhopps commented Aug 21, 2026

Copy link
Copy Markdown

RESOLVED: I used Faugus launcher to create a prefix using the latest cachy proton version, applied the same regedit to that prefix, started the app, connected the controller, and everything resolved within a matter of seconds. It seems to potentially be a problem with Arch Linux's wine-staging problem.

Thank you so much for the guide, you're incredible.


Following this guide, it seems to work with basically no issue, as far as connecting controllers, opening the software, and attempting to update the firmware goes. However, updating the firmware seems to take aaaaages and has no progress bar with the newest version of the software, and I can't really tell if it's working.

Attempting to update 8BitDo 8BitDo 64 Bluetooth Controller with ID 3019. It has the same bootloader ID of 3208 as the other controllers so far as I can tell.

Is it taking a long time pretty normal, or is there something I'm missing. If I can provide any logs or any other information for you I'd be more than happy to.

EDIT: I did verify with dmesg and with lsusb that the device is still in boot mode, I see a ton of spam in dmesg about my other 8bitdo controller, x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1, but I purposefully did not add that device or its USB adapter to my udev rule to avoid it being detected in the application. Maybe it being connected at all is the issue.|

EDIT 2: After fully disconnecting the other controller, I attempted a firmware update again, and the same message still keeps getting spammed.

[  956.858026] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.858031] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.858034] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.858521] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.858525] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.858527] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.858650] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.859251] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  956.859255] x86/split lock detection: #DB: 8BitDo Ultimate/2779 took a bus_lock trap at address: 0x79274cd1
[  968.662982] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.662988] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.662990] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.699846] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.699850] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.699861] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.979798] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.979804] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  968.979824] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  969.024098] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.630745] handle_bus_lock: 50515 callbacks suppressed
[  978.630749] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.630753] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.630765] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.630794] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.630796] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.630797] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.634218] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.634222] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.634225] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1
[  978.725503] x86/split lock detection: #DB: 8BitDo Ultimate/3868 took a bus_lock trap at address: 0x79274cd1

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