Skip to content
redbeard edited this page Jan 22, 2019 · 5 revisions

About

Your 8BitDo controller can be detected in different modes (Windows, MacOS, Android, Switch, etc) with different key combinations. Check its manual on the support site to learn how yours work.

If you have issues with the directions, begin by consulting the existing 8bitdo issues.

SN30 Pro/SF30 Pro controller

You need to connect your controller via USB cable (not just Bluetooth). In my case, the controller was detected correctly in Android mode (turn it on with B + Start):

$ fwupdmgr get-devices
8Bitdo SN30 Pro
  DeviceId:             71413822e87deae707da948bd4b7e537af463c19
  Guid:                 1bf5ac96-99ce-54f2-abf4-7eabe6802533
  Guid:                 81becceb-f87b-5c66-b30a-b0958043d65d
  Guid:                 5bc60e62-f461-58bd-91b6-7de3392f8bd6
  Guid:                 043c7673-bd45-5e2e-b8b9-c22df2dfec2a
  Guid:                 b02f1319-c1c4-54f4-b7f2-5bb3552f6a9e
  Summary:              A redesigned classic game controller
  Plugin:               ebitdo
  Flags:                updatable|supported|needs-bootloader|registered
  Vendor:               8Bitdo
  VendorId:             USB:0x2DC8
  Version:              1.26
  Icon:                 input-gaming
  Created:              2018-09-27

To update to the latest firmware version, run fwupdmgr get-updates. This will tell you about new firmware versions which you can install by running fwupdmgr update.

The command line will give you instructions to start your controller in "Update mode". You need to turn the controller off (usually press Start for a few seconds), then press L + R + Start for a few seconds until the red led on top of the controller starts blinking.

fwupdmgr begins a countdown when it prompts you to restart your controller in update mode, and then it'll stop. So you need to plug your controller in update mode before the delay is over. It used to be 20 seconds, but was recently bumped to 40 seconds. So it depends on which version of fwupdmgr you're running, but try to take less than 20 seconds to be sure.

You can either do this via the command line with fwupdmgr or if its available in your system, use the GNOME Software application too.

The SN30 Pro enumerates as the following USB VID/PID values:

Mode Number Power On Combination Mode VID:PID Notes USB Info
N/A L + R + START Boot loader 2DC8:5750 Used to update firmware. Manufacturer: 8BitdoJoy
Product: 8Bitdo
Serial Number: BootMod
1 B + START D-Input 2DC8:6001 Also known as "Android" mode. Manufacturer: 8Bitdo SN30 Pro
Product: 8Bitdo SN30 Pro
2 X + START Windows 045E:028E Boot controller in Windows (Xbox) mode. Device will use xpad driver and emulate an Xbox 360 controller. Manufacturer: 8Bitdo SF30 Pro
Product: Controller
Serial Number: 157F8F8
3 A + START Mac 054C:05C4 Also known as "Mac OS" mode. Manufacturer: Sony Computer Entertainment
Product: Wireless Controller
4 Y + START WiiMote 057E:2009 Boot controller in mode compatible with Nintendo Wii and Switch. Manufacturer: Nintendo Co., Ltd.
Product: Pro Controller
SerialNumber: 000000000001

SNES30/NES30 Controller notes

The SNES30 is based on the GigaDevice GD32F103C8T6 microcontroller and is "compatible" with the STM32 series of microcontrollers. This is the same microcontroller also used in the 8Bitdo "Retro Receiver".

The SNES30 controller can operate in one of two states, the "normal" state or the boot loader. When booted in the "normal" state the SNES30 can enter a number of operational modes, presenting various configurations for compatibility with different gaming platforms. It is in the "normal" state where fwupdmgr can detect the SNES30 as an 8bitdo device and seek out available updates. In firmware versions 4.0 and below, updates can only be detected in some operational modes.

For fwupdmgr to correctly identify the device and seek out available updates, the USB vendor id/product id (VID/PID) must be recognized by fwupdmgr as an 8bitdo device (2DC8:AB20). When SNES30 has entered the boot loader it's VID/PID is changed to 0483:5750 (STMicroelectronics) and it will be operating as an hiddev type device. Thus, the update process requires fwupdmgr first detecting the 8bitdo device then entering the 8bitdo device's boot loader to allow fwupdmgr to upgrade the firmware.

To validate the current VID/PID perform one of the following:

Via lsusb:

Normal state

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
...
Bus 001 Device 102: ID 2dc8:ab20

Boot loader state

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
...
Bus 001 Device 062: ID 0483:5750 STMicroelectronics

Via journalctl -fk:

Normal state

Jan 22 09:48:01 leviathan kernel: usb 1-1: new full-speed USB device number 64 using xhci_hcd
Jan 22 09:48:01 leviathan kernel: usb 1-1: New USB device found, idVendor=2dc8, idProduct=ab20, bcdDevice= 0.01
Jan 22 09:48:01 leviathan kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=0
Jan 22 09:48:01 leviathan kernel: usb 1-1: Product: SNES30 Joy    
Jan 22 09:48:01 leviathan kernel: usb 1-1: Manufacturer: SNES30            
Jan 22 09:48:01 leviathan kernel: input: SNES30             SNES30 Joy     as /devices/pci0000:00/0000:00:14.0/usb1/1-1/1-1:1.0/0003:2DC8:AB20.002F/input/input58
Jan 22 09:48:01 leviathan kernel: hid-generic 0003:2DC8:AB20.002F: input,hidraw0: USB HID v1.10 Joystick [SNES30             SNES30 Joy    ] on usb-0000:00:14.0-1/input0

Boot loader state

$ journalctl -fk -n0 
Jan 22 09:47:15 leviathan kernel: usb 1-1: new full-speed USB device number 63 using xhci_hcd
Jan 22 09:47:15 leviathan kernel: usb 1-1: New USB device found, idVendor=0483, idProduct=5750, bcdDevice= 2.00
Jan 22 09:47:15 leviathan kernel: usb 1-1: New USB device strings: Mfr=1, Product=2, SerialNumber=3
Jan 22 09:47:15 leviathan kernel: usb 1-1: Product: 8Bitdo  
Jan 22 09:47:15 leviathan kernel: usb 1-1: Manufacturer: 8BitdoHid
Jan 22 09:47:15 leviathan kernel: usb 1-1: SerialNumber: 8Bitdo 
Jan 22 09:47:15 leviathan kernel: hid-generic 0003:0483:5750.002E: hiddev96,hidraw0: USB HID v1.10 Device [8BitdoHid 8Bitdo  ] on usb-0000:00:14.0-1/input0

Note: This is different from it's normal enumeration where it is operating as an input device and not hiddev.

States of Operation

Normal state

The SN30 Pro will only be detected by fwupdmgr when in certain "modes". When powered on the blue LED on the top of the device will flash once, then after a short delay will flash repeatedly denoting the mode that it is running in. The number of flashes will note the mode "number" and will repeat approximately every two seconds. To change the mode boot from a completely unpowered state as follows:

Mode Number Power On Combination Mode VID:PID Notes
1 B + START D-Input 2DC8:AB20 Also known as "Android" mode.
2 X + START Windows 045E:028E Boot controller in Windows (Xbox) mode. Device will use xpad driver and emulate an Xbox 360 controller
3 A + START Mac 2DC8:AB20 Also known as "Mac OS" mode.
4 Y + START WiiMote 2DC8:AB20 Boot controller in mode compatible with Nintendo Wii and Switch

Boot loader state

Mode Number Power On Combination Mode VID:PID Notes
N/A L + R + START Boot loader 0483:5750 Used to update firmware.

While holding the L and R buttons at the top of the controller, press the START button and continue holding these until both the green and blue LEDs at the top of the device begin flashing at approximately 1 second intervals. As soon as both LEDs are flashing release the buttons and the device will have entered the boot loader state.

Example

Begin with the device powered completely off and unplugged from the host machine.

First, ensure fwupd is running and check to see connected devices

$ systemctl status fwupd
● fwupd.service - Firmware update daemon
   Loaded: loaded (/usr/lib/systemd/system/fwupd.service; static; vendor preset>
   Active: active (running) since Tue 2019-01-22 11:40:05 PST; 1min 56s ago
     Docs: https://fwupd.org/
 Main PID: 25922 (fwupd)
    Tasks: 5 (limit: 4915)
   Memory: 5.0M
   CGroup: /system.slice/fwupd.service
           └─25922 /usr/libexec/fwupd/fwupd

Jan 22 11:40:04 leviathan systemd[1]: Starting Firmware update daemon...
Jan 22 11:40:05 leviathan systemd[1]: Started Firmware update daemon.
$ fwupdmgr get-devices
$

Boot the device into D-input mode (hold B then press START). Other modes may work, this is the "default" mode and will place us in a known good state. Once started, connect the 8bitdo device via USB cable to the host then ensure you see the device enumerated by the host.

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 104: ID 2dc8:ab20 
$ fwupdmgr get-devices 
SNES30 Joy    
  DeviceId:             672c087de09848d9e7ee32aa1dea2fbeb8b81e6b
  Guid:                 62368573-ff78-54b5-b297-f6316abd7eba
  Guid:                 4cb172ce-9849-5603-8814-a3d455932012
  Guid:                 5bc60e62-f461-58bd-91b6-7de3392f8bd6
  Guid:                 afa5518d-7c55-51cb-8e1c-bf3b11b67dfa
  Guid:                 cee9c5bc-aa12-51eb-a220-d0ef588d7cb2
  Guid:                 571229d5-caed-5cbc-91c1-5c216601a194
  Guid:                 043c7673-bd45-5e2e-b8b9-c22df2dfec2a
  Guid:                 b02f1319-c1c4-54f4-b7f2-5bb3552f6a9e
  Summary:              A redesigned classic game controller
  Plugin:               ebitdo
  Flags:                updatable|supported|needs-bootloader|registered
  Vendor:               8Bitdo
  VendorId:             USB:0x2DC8
  Version:              4.00
  Icon:                 input-gaming
  InstallDuration:      120
  Created:              2019-01-22

Check for available updates.

$ fwupdmgr get-updates
SNES30 Joy     has firmware updates:
GUID:                    62368573-ff78-54b5-b297-f6316abd7eba
GUID:                    4cb172ce-9849-5603-8814-a3d455932012
GUID:                    5bc60e62-f461-58bd-91b6-7de3392f8bd6
GUID:                    afa5518d-7c55-51cb-8e1c-bf3b11b67dfa
GUID:                    cee9c5bc-aa12-51eb-a220-d0ef588d7cb2
GUID:                    571229d5-caed-5cbc-91c1-5c216601a194
GUID:                    043c7673-bd45-5e2e-b8b9-c22df2dfec2a
GUID:                    b02f1319-c1c4-54f4-b7f2-5bb3552f6a9e
ID:                      com.8bitdo.snes30.firmware
Update Version:          4.10
Update Name:             SNES30
Update Summary:          Firmware for the 8Bitdo SNES30 Game Controller
Update Remote ID:        lvfs
Update Duration:         2 minutes
Update Checksum:         SHA1(a60593fd1dbb40d7174c99f34b5536f45392bf6c)
Update Location:         https://fwupd.org/downloads/2999ee63c0cff96893c1614955f505cb4f0fa406-8Bitdo-SFC30_NES30_SFC30_SNES30-4.10.cab
Update Description:      Enhanced the stability of the Bluetooth pairing.
                         
ID:                      com.8bitdo.snes30.firmware
Update Version:          4.01
Update Name:             SNES30
Update Summary:          Firmware for the 8Bitdo SNES30 Game Controller
Update Remote ID:        lvfs
Update Duration:         2 minutes
Update Checksum:         SHA1(78ef2663beaa952415c3719447b0d2ff43e837d8)
Update Location:         https://fwupd.org/downloads/fe066b57c69265f4cce8a999a5f8ab90d1c13b24-8Bitdo-SFC30_NES30_SFC30_SNES30-4.01.cab
Update Description:      Fixed input lag problem when used with other controllers.

Completely power off the device and start it in the boot loader. Verify that you see the device in the boot loader state, then run the update.

$ lsusb
Bus 002 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub
Bus 001 Device 107: ID 0483:5750 STMicroelectronics 
$ fwupdmgr update 
Downloading 4.10 for 8Bitdo  ...
Decompressing…           [***************************************]
Authenticating…          [***************************************]
Updating 8Bitdo  …       [ -                                     ]
Restarting device…       [***************************************] Less than one minute remaining…

Check the device firmware after completion

$ fwupdmgr get-devices
SNES30 Joy    
  DeviceId:             672c087de09848d9e7ee32aa1dea2fbeb8b81e6b
  Guid:                 62368573-ff78-54b5-b297-f6316abd7eba
  Guid:                 4cb172ce-9849-5603-8814-a3d455932012
  Guid:                 5bc60e62-f461-58bd-91b6-7de3392f8bd6
  Guid:                 afa5518d-7c55-51cb-8e1c-bf3b11b67dfa
  Guid:                 cee9c5bc-aa12-51eb-a220-d0ef588d7cb2
  Guid:                 571229d5-caed-5cbc-91c1-5c216601a194
  Guid:                 043c7673-bd45-5e2e-b8b9-c22df2dfec2a
  Guid:                 b02f1319-c1c4-54f4-b7f2-5bb3552f6a9e
  Guid:                 ba7f0ecd-1972-5bc0-b474-ffdc5fa17645
  Guid:                 644ec4d7-3fcf-56b7-89d3-b569cb91edab
  Summary:              A redesigned classic game controller
  Plugin:               ebitdo
  Flags:                updatable|supported|needs-bootloader|registered
  Vendor:               8Bitdo
  VendorId:             USB:0x2DC8
  Version:              4.10
  Icon:                 input-gaming
  InstallDuration:      120
  Created:              2019-01-22

________________________________________________

Devices that have been updated successfully:

 • 8Bitdo   (4.00 → 4.10)

Uploading firmware reports helps hardware vendors to quickly identify failing and successful updates on real devices.
Upload report now? (Requires internet connection) [Y|n]: Y
...
Target:                  https://fwupd.org/lvfs/firmware/report
Payload:                 {
                           "ReportVersion" : 2,
                           "MachineId" : "3ba812242e854337353b5fd6a569e2cc71caca02cdf77d2e6a20b0354cc6df47",
                           "Metadata" : {
                             "DistroId" : "fedora",
                             "DistroVersion" : "29",
                             "DistroVariant" : "workstation"
                           },
                           "Reports" : [
                             {
                               "Checksum" : "a60593fd1dbb40d7174c99f34b5536f45392bf6c",
                               "UpdateState" : 2,
                               "Guid" : "ba7f0ecd-1972-5bc0-b474-ffdc5fa17645",
                               "Plugin" : "ebitdo",
                               "VersionOld" : "4.00",
                               "VersionNew" : "4.10",
                               "Flags" : 98,
                               "Created" : 1548186524,
                               "Modified" : 1548186528,
                               "Metadata" : {
                                 "CpuArchitecture" : "x86_64",
                                 "RuntimeVersion(org.freedesktop.fwupd)" : "1.2.3",
                                 "DistroId" : "fedora",
                                 "CompileVersion(org.freedesktop.fwupd)" : "1.2.3",
                                 "CompileVersion(com.redhat.fwupdate)" : "12",
                                 "DistroVariant" : "workstation",
                                 "CompileVersion(org.freedesktop.gusb)" : "0.3.0",
                                 "RuntimeVersion(org.freedesktop.appstream-glib)" : "0.7.14",
                                 "KernelVersion" : "4.19.15-300.fc29.x86_64",
                                 "DistroVersion" : "29",
                                 "CompileVersion(com.redhat.efivar)" : "37",
                                 "RuntimeVersion(com.dell.libsmbios)" : "2.4",
                                 "BootTime" : "1548026945",
                                 "RuntimeVersion(com.redhat.fwupdate)" : "12"
                               }
                             }
                           ]
                         }
Proceed with upload? [Y|n]: Y

If you have not successfully entered the boot loader (but fwupdmgr detects the device) and attempt to run the update you will see the following output from fwupdmgr:

$ fwupdmgr update 
Downloading 4.10 for SNES30 Joy    ...
Decompressing…           [***************************************]
Authenticating…          [***************************************]
Device SNES30 Joy     needs to manually be put in update mode: Unplug the controller, hold down L+R+START for 3 seconds until both LEDs are flashing then reconnect the controller.

If this occurs, completely power off the device and repeat the process of entering the boot loader and performing the update.

Clone this wiki locally