Firmware update SN30pro on Linux

This has been a small nightmare šŸ™‚

So, I own an SN30pro gamepad mostly used to play Nintendo Switch. It works wonders, EXCEPT when running in multiplayer mode alongside other controllers, where I get a totally noticeable input lag

The Update Path

Updating the firmware is performed officially via the 8bitdo firmware updater, which has versions for Windows and Mac, but not for us, the “always a minority” Linux users.

So, we’ll go the LVFS fwupd tool path, since 8bit do is listed there , with a nice official statement of:

All game pads are supported

Fair enough, looking for the SN30pro Firmware list, the lag is something that has received a set of fixes since 2018 (when I bought this controller). So, let’s see which version I do have installed, and where can I update to.

Connecting to Linux

First I need the fwupdmgr tool to be able to list this damned controller. Which does not seem to work by default, since fwupdmgr get-devices does not list it.

The controller supports 4 different modes: Switch, Android, Mac and Windows. I tried using Android since it seemed the closer one to Linux :-D, it was a good choice. The manual describes the different modes and how to enable them, for Android mode:

  • press START+B at the same time
  • Led1 starts to blink

Since I’m doing this wired, this is the only thing needed. While the led is blinking I plug the controller via USB to the laptop and run fwupdmgr get-devices.

And here it is:

8Bitdo SF30 Pro
  DeviceId:             73ef80b60058b4f18549921520bfd94eaf18710a
  Summary:              A redesigned classic game controller
  Plugin:               ebitdo
  Flags:                updatable|needs-bootloader|registered
  Vendor:               8Bitdo
  VendorId:             USB:0x2DC8
  Version:              1,28
  Icon:                 input-gaming
  Created:              2020-01-22

It’s at version 1,28. Which is not even listed in the firmware list of LVFS šŸ˜€

Getting the update

fwupdmgr is an easy-to-use tool, to get the latest list of updates you only have to type fwupdmgr get-updates, and that should be it…

> sudo fwupdmgr get-updates
Not compatible with org.freedesktop.fwupd
version 1.1.2, requires >= 1.1.3
cannot handle firmware requirement not-child

Apparently, not for me. I should update the fwupdmgr tool to a newer version. Since I don’t know what other parts of ubuntu might be using this I’m not to keen on going through that hassle right now. So what I’ll do is simply download the firmware file manually from the LVFS website and feed it directly to fwupdmgr.


With the file downloaded, and a quick look at fwupdmgr -h, is clear that we can perform the installation from a cabinet file (which is already downloaded).

> fwupdmgr install <deviceID>
Unknown                  [***************************************]
Specified firmware is older than installed '1.33 < 1,28'

What a beautiful way of failing, probably because of the comma. Need to signal fwupdmgr that we don’t care about versions. The flag to use for this case is --allow-older

> fwupdmgr install <deviceID> --allow-older
Decompressingā€¦         [***************************************]
Authenticatingā€¦        [***************************************]
Device 8Bitdo SF30 Pro needs to manually be put in update mode: 
Unplug the controller, hold down L1 + R1 + START until the red 
LED on top of the controller is flashing and then reconnect 
the controller.

Ok, another stone in the road. The controller needs to be in update mode. On the first couple of tries it seems impossible to follow the provided advice. Pressing L1+R1+START simply turns off all lights after a while.

The trick is to do L1 then L2 then START then hold. Note the thens in between, meaning do it in succession, not at the same time.

After that, the SN30pro flashes the top led, and finally, accepts the firmware.

> sudo fwupdmgr install <deviceID> --allow-older
Decompressingā€¦         [***************************************]
Authenticatingā€¦        [***************************************]
Installing on 8Bitdo  ā€¦[ -                                     ]
Restarting deviceā€¦     [***************************************]
failed to wait for replug after update: 
device <deviceID> did not come back

And I’m not surprised it finished with a failure. But exit code was 0 so it’s not too scary.
Checking the version again shows the newest and shiniest firmware version 1.33.

8Bitdo SF30 Pro
  DeviceId:             73ef80b60058b4f18549921520bfd94eaf18710a
  Serial:               SF30 Pro    
  Summary:              A redesigned classic game controller
  Plugin:               ebitdo
  Flags:                updatable|needs-bootloader|registered
  Vendor:               8Bitdo
  VendorId:             USB:0x2DC8
  Version:              1,33
  Icon:                 input-gaming
  Created:              2020-01-22

And with this, it is done. Now to test it.

The testing

To test it I simply boot the worst offender in my Nintendo Switch (Rocket league) and start a local multiplayer with 2 joycons and the new firmware of the SN30pro.

After some battling the sync of the controller beacause SN30pro refused to connect, the three controllers were online and the match started, noticing no lag at all.

So, yes. The firmware update seems to fix my main issue with it! šŸ˜€ Never expected to be updating a controller though.



Leave a comment

Filed under curious, tools

Leave a Reply

Fill in your details below or click an icon to log in: Logo

You are commenting using your account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

Connecting to %s

This site uses Akismet to reduce spam. Learn how your comment data is processed.