A while ago I got myself an 8bitdo-nes30-controller. I was about to upgrade my controller to a recent firmware version, because the firmware versions >=4.00 offered much better stability on the wireless layer. Unfortunately the lvfs-firmware-updater fwupdmgr did not let me patch fe066b57c69265f4cce8a999a5f8ab90d1c13b24-8Bitdo-SFC30_NES30_SFC30_SNES30-4.01.cab from https://fwupd.org/lvfs/component/289/all (old link. New firmware is available under https://fwupd.org/lvfs/devices/com.8bitdo.nes30.firmware) to it, because of firmware is not for this hw:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$> fwupdmgr get-devices 8Bitdo DeviceId: c8f10424d49ca041c8ceeac09d746f3fb0dcc8e2 [...] Version: 2.70 [...] $> wget https://fwupd.org/downloads/fe066b57c69265f4cce8a999a5f8ab90d1c13b24-8Bitdo-SFC30_NES30_SFC30_SNES30-4.01.cab $> fwupdmgr install fe066b57c69265f4cce8a999a5f8ab90d1c13b24-8Bitdo-SFC30_NES30_SFC30_SNES30-4.01.cab c8f10424d49ca041c8ceeac09d746f3fb0dcc8e2 Decompressing… [***************************************] firmware is not for this hw: required 043c7673-bd45-5e2e-b8b9-c22df2dfec2a got 5421cca2-e2e8-5082-b5ad-1f873660ab28,0f540624-1414-50bb-9fa6-c724b4fa4464,7a81a9eb-0922-5774-8803-fbce3ccbcb9e,7934f46a-77cb-5ade-af34-2bd2842ced3d,a7fcfbaf-e9e8-59f4-920d-7691dc6c8699,f94d3231-f6e1-5ef3-a4a0-dc819d74ae54,4cb172ce-9849-5603-8814-a3d455932012,8baed357-638e-5b54-b582-0476bf7d6348 $> |
Anyhow, i decided to take the risk to flash the default-firmware for this controller, even if it says, it is not supported, because I suspected, that 8bitdo just keeps using the available Controllers, and was kinda sure, they just don’t documented all of the used IDs, so I digged into the cab-file to make this update work for me (Spoiler: The firmware works just fine).
Prerequisities
First of all: get the new Firmware, create a folder and extract the firmware to there. On Ubuntu, you additionally need the tools cabextract and lcab to handle cabinet-files:
1 2 3 |
$> sudo apt install lcab cabextract # depending on your distribution $> mkdir firmware && cd firmware $> cabextract ../fe066b57c69265f4cce8a999a5f8ab90d1c13b24-8Bitdo-SFC30_NES30_SFC30_SNES30-4.01.cab |
After that, edit the defining XML-file nes30.metainfo.xml and add or replace your device-id inside of <provides>, so that it looks like this:
1 2 3 4 |
<provides> <!-- USB\VID_1235&PID_AB12--> <firmware type="flashed">043c7673-bd45-5e2e-b8b9-c22df2dfec2a</firmware> </provides> |
The USB-V(endor)ID and the Device ID can differ from mine, but can be easily determined. fwupdmgr told us already in the first try which ID it expects, and the VID can be found with dmesg. Don’t let yourself be fooled, the 8bitdo-Controllers are reporting different VIDs and USB-IDs, dependant on if they have been booted in normal mode or in firmware-flash mode (see attached logs). But the VID is not important here anyways.
Now that we have edited the xml, we can pack the archive together again and verify (especially verify that the folder structure matches the original cab-file!).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$> lcab * new-firmware.cab $> cabextract -l new-firmware.cab Viewing cabinet: new-firmware.cab File size | Date Time | Name -----------+---------------------+------------- 46620 | 30.11.2107 00:00:00 | bluetooth_firmware_v4.01.dat 490 | 30.11.2107 00:00:00 | bluetooth_firmware_v4.01.dat.asc 1700 | 30.11.2107 00:00:00 | fc30.metainfo.xml 1706 | 30.11.2107 00:00:00 | nes30.metainfo.xml 906 | 30.11.2107 00:00:00 | README.txt 1706 | 30.11.2107 00:00:00 | sfc30.metainfo.xml 1712 | 30.11.2107 00:00:00 | snes30.metainfo.xml All done, no errors. |
Flashing
Now that we have our new cab-file to feed fwupdmgr with, we can put our controller into flashmode as the Firmware suggests („Unplug the controller, hold down L+R+START for 3 seconds until both LEDs are flashing then reconnect the controller.“) and give it a try:
1 2 3 |
$> fwupdmgr --allow-older install new-firmware.cab c8f10424d49ca041c8ceeac09d746f3fb0dcc8e2 [...] 01:42:24:0816 GLib g_atomic_ref_count_dec: assertion 'g_atomic_int_get (arc) > 0' failed |
Very likely you will get this g_atomic_int_get error. This is normal, because after the update the controller boots in normal mode instead of flashmode, and thus, from the perspective of fwupdmgr, it does not came back after flashing, resulting in this error, but the controller is just fine. You can verify this with fwupdmgr:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
$> fwupdmgr get-devices 8Bitdo DeviceId: c8f10424d49ca041c8ceeac09d746f3fb0dcc8e2 Guid: 043c7673-bd45-5e2e-b8b9-c22df2dfec2a Guid: ba7f0ecd-1972-5bc0-b474-ffdc5fa17645 Summary: A redesigned classic game controller Plugin: ebitdo Flags: updatable|registered Vendor: 8Bitdo VendorId: USB:0x0483 Version: 4,01 Icon: input-gaming Created: 2018-11-30 [...] |
i needed the –allow-older option because the updater complained about
version-handling-flaws between „.“ and „,“ (which is really annoying):
1 |
Specified firmware is older than installed '4.01 < 2,70' |
This is not a localization issue, because the firmware-version is read from the device, and this is how it reports it (and calling fwupdmgr with „LANG=c“ or something would not make a difference here). After the first Update this should be fixed anyways for further ones.
Installing .dat files
Additionally to the method descibed above, you also have the possibillity to flash firmware-files directly onto a device, if you know what you are doing. In my case I flashed my 8bitdo NES-Retroreceivers (wireless dongles, which plug into the controller port of a good old NES, representing the counterpart of the controllers).
I had to flash those, because i was about to use a DIY-Module from 8bitdo (new PCB, which goes into an original controller-case, staying with the original haptic feedback). The Retroreceivers support them only upwards a specific firmware-version, so I had to patch these, and – at the time – there have been no lvfs cabinet-files for them. I downloaded a firmware from the vendor-website and used the fwupdtool:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 |
$> fwupdmgr get-devices 8Bitdo DeviceId: 71413822e87deae707da948bd4b7e537af463c19 Guid: 6c1f10fc-1878-500a-939f-7db26c827953 Guid: bc1739b5-313d-5a82-a123-95e5dc4a5702 Summary: A redesigned classic game controller Plugin: ebitdo Flags: updatable|registered|is-bootloader Vendor: 8Bitdo VendorId: USB:0x0483 Version: 1.31 # <!--- old version VersionFormat: pair Icon: input-gaming InstallDuration: 120 Created: 2019-08-28 $> sudo /usr/lib/fwupd/fwupdtool install-blob 8Bitdo_NES_SNES_RR_Firmware_V1.34.dat 71413822e87deae707da948bd4b7e537af463c19 Loading … [***************************************] Version: 1,34 Destination Address: 8003400 Destination Length: 63488 Installing on 8Bitdo … ] Writing … [***************************************]failed to get ACK for mark firmware as successful: unexpected device response 01:42:24:0816 GLib g_atomic_ref_count_dec: assertion 'g_atomic_int_get (arc) > 0' failed $> fwupdmgr get-devices 8Bitdo DeviceId: 71413822e87deae707da948bd4b7e537af463c19 Guid: 6c1f10fc-1878-500a-939f-7db26c827953 Guid: bc1739b5-313d-5a82-a123-95e5dc4a5702 Summary: A redesigned classic game controller Plugin: ebitdo Flags: updatable|registered|is-bootloader Vendor: 8Bitdo VendorId: USB:0x0483 Version: 1.34 # <!--- new version after update VersionFormat: pair Icon: input-gaming InstallDuration: 120 Created: 2019-08-28 |
If you are willing to take the risk, you are greeted by the new version. All in all this topic is not a big deal at all, because it happend to me that i accidentally flashed a retroreceiver firmware to a controller (or vice versa? did not remember…); and this happend to me using the vendors windows-gui-tool, so there is no protection against flashing the wrong image whatsoever. But even with the wrong firmware, the devices were able to enter the flashmode again, and a second try has baked the proper firmware to it.
Other 8bitdo Controllers
Nevertheless you should keep you eyes open for the correct files, because it also happend to me, that while flashing 2 controllers for the Sega Mega Drive (or Genesis or however you call this in your region) i bricked a device, because there was no way to determine if one should use the „V1“ or the „V2“ firmware for the controllers (and i still don’t know). Even thou it is easier for the 2.4gHz-Controllers for the Mega Drive to be flashed (they act as a mass-storage device, on which you put the file onto), they are also easier to brick, because after putting a file onto them, they will flash it. If the device does not like the firmware, they’re bricked…and they will not come back to the flash mode…
Logs
If you find this useful, i added some logs, specs and details to the devices, if you can get any benefit out of it:
device informations (before upgrade):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#> fwupdmgr get-devices 8Bitdo DeviceId: c8f10424d49ca041c8ceeac09d746f3fb0dcc8e2 Guid: 043c7673-bd45-5e2e-b8b9-c22df2dfec2a Guid: ba7f0ecd-1972-5bc0-b474-ffdc5fa17645 Summary: A redesigned classic game controller Plugin: ebitdo Flags: updatable|registered Vendor: 8Bitdo VendorId: USB:0x0483 Version: 2,70 Icon: input-gaming Created: 2018-11-30 |
device informations (after upgrade):
1 2 3 4 5 6 7 8 9 10 11 12 13 |
$> fwupdmgr get-devices 8Bitdo DeviceId: c8f10424d49ca041c8ceeac09d746f3fb0dcc8e2 Guid: 043c7673-bd45-5e2e-b8b9-c22df2dfec2a Guid: ba7f0ecd-1972-5bc0-b474-ffdc5fa17645 Summary: A redesigned classic game controller Plugin: ebitdo Flags: updatable|registered Vendor: 8Bitdo VendorId: USB:0x0483 Version: 4,01 Icon: input-gaming Created: 2018-11-30 |
relevant dmesg tail (normal mode):
1 2 3 4 5 6 7 8 |
[ 7760.154506] usb 3-4: new full-speed USB device number 7 using ohci-pci [ 7760.382949] usb 3-4: New USB device found, idVendor=1235, idProduct=ab12 [ 7760.382953] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=0 [ 7760.382956] usb 3-4: Product: NES30 Joystick [ 7760.382958] usb 3-4: Manufacturer: NES30 [ 7760.389630] input: NES30 NES30 Joystick as /devices/pci0000:00/0000:00:12.0/usb3/3-4/3-4:1.0/0003:1235:AB12.0009/input/input23 [ 7760.389895] hid-generic 0003:1235:AB12.0009: input,hidraw4: USB HID v1.10 Joystick [NES30 NES30 Joystick] on usb-0000:00:12.0-4/input0 0 |
relevant dmesg tail (flash mode):
1 2 3 4 5 6 7 |
[ 7516.996001] usb 3-4: new full-speed USB device number 6 using ohci-pci [ 7517.198865] usb 3-4: New USB device found, idVendor=0483, idProduct=5750 [ 7517.198869] usb 3-4: New USB device strings: Mfr=1, Product=2, SerialNumber=3 [ 7517.198872] usb 3-4: Product: 8Bitdo [ 7517.198874] usb 3-4: Manufacturer: 8BitdoHid [ 7517.198876] usb 3-4: SerialNumber: 8Bitdo [ 7517.207478] hid-generic 0003:0483:5750.0008: hiddev0,hidraw4: USB HID v1.10 Device [8BitdoHid 8Bitdo ] on usb-0000:00:12.0-4/input0 |
lsusb-details (flash mode):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 |
$> lsusb -v -s 003:008 Bus 003 Device 008: ID 0483:5750 STMicroelectronics Couldn't open device, some information will be missing Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 2.00 bDeviceClass 0 (Defined at Interface level) bDeviceSubClass 0 bDeviceProtocol 0 bMaxPacketSize0 64 idVendor 0x0483 STMicroelectronics idProduct 0x5750 bcdDevice 2.00 iManufacturer 1 iProduct 2 iSerial 3 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 41 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0xc0 Self Powered MaxPower 480mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 2 bInterfaceClass 3 Human Interface Device bInterfaceSubClass 0 No Subclass bInterfaceProtocol 0 None iInterface 0 HID Device Descriptor: bLength 9 bDescriptorType 33 bcdHID 1.10 bCountryCode 0 Not supported bNumDescriptors 1 bDescriptorType 34 Report wDescriptorLength 33 Report Descriptors: ** UNAVAILABLE ** Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x82 EP 2 IN bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 32 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x01 EP 1 OUT bmAttributes 3 Transfer Type Interrupt Synch Type None Usage Type Data wMaxPacketSize 0x0040 1x 64 bytes bInterval 16 |
A user reported to me, that he was also able fo flash his controller using this method, so this seems to work okay for him. Obviously my commentary function was broken by an addon and i did not noticed it, so here’s the comment.
quote:
Hello.
Thank you *so much* for your page https://blog.tastatursport.de/2019/12/updating-unsupported-8bitdo-devices-with-fwupdmgr/
I was able to upgrade my 8bitdo controller with the official 4.02 firmware with no problem.
Have a good day !
—
Sébastien [redactedForPrivacy]