8bitdo SN30 Pro controller
A decent controller at least

Guys, I finally bought myself a decent game controller to use on Linux!

What did I get? The 8BitDo SF30 Pro.

This Bluetooth controller is styled after the classic SNES gamepad, but adds rumble, analog sticks, and works with Nintendo Switch, Windows, Linux macOS, and Android.

In addition to the reassurance of quality manufacturing — cheap no-brand USB controller with itchy hollow plastic you will not be missed — I also the reassurance of hassle-free firmware updates on Linux as 8BitDo distribute firmware via the LVFS.

And despite writing about 8bitdo controllers a few times in the past, didn’t own one until now to see just how seamless firmware updates are on Linux.

But first: pairing.

Pairing the 8BitDo SF30 Pro on Ubuntu

Pairing my new controller in Ubuntu 19.04

As I bought my controller used from eBay it didn’t come with a box or instructions. I had to turn to Google to find out how to pair the SF30 Pro in Ubuntu so that I could use it while playing games like stellar racer SuperTuxKart.

Pairing is easy but as this gamepad supports so many systems knowing how to activate the one that works with Linux isn’t obvious (and the tiny guide on the rear of the controller is really hard to read).

So to pair the SF30 Pro — the SN30 Pro is same device but with different coloured buttons, though a newer model with hall-effect sensors and no Linux support is on the way — you need to turn the controller on in Xinput pairing mode by pressing X + Start together.

Note: this mode works with both Windows and Linux so you may see this referred to as ‘Windows pairing mode’ in other online guides.

If pairing mode is activated the LED lights on the front-facing edge (between the analog sticks) continuously blinks. Open Ubuntu’s Bluetooth settings panel and once scanning is complete select the “8BitDo SF30 Pro” entry from the list of available devices.

No code or confirmation step is needed so pairing happens instantly.

Upgrading SF30 Pro Firmware on Ubuntu

I wasn’t sure which firmware version my controller was running (as I said, I purchased it used) so I wanted to see if the latest firmware update listed on the 8BitDo website was installed or if I could upgrade to it.

There’s no Linux firmware guide on the 8BitDo website, and firmware updating didn’t “automatically” happen when the controller was paired in Bluetooth mode or connected to my laptop via USB (the later is sort of what I was expecting).

I wasn’t convinced this was because my device was updated, so a quick Google helped me out.

1. Check for Firmware

To check for firmware updates for the 8BitDo SF30 Pro controller from Linux you must connect it to your Linux machine using a USB cable BUT with the pad put in Android pairing mode. Yup, Android.

This, apparently, is required for fwupd — the service which handles firmware updates on Linux — to ‘see’ the controller, check the LVFS site for new firmware, and then prompt you to install an update (if one is available).

To put the 8BitDo SF30 Pro in Dinput/Android pairing mode hold Start and press B at the same time. You’ll see the first two LED blocks on the front-facing section light up.

You can open the dedicated firmware tool included in Ubuntu to see if it finds new firmware.

If you don’t see any updates listed, but you know one is available, double-check that your device can be seen by fwud by running:

sudo fwupdmgr get-devices 

Your controller should appear in the list and display the current firmware version.

If it doesn’t you may need to file a bug or double-check the controller is in Android mode and/or the USB cable you’ve attached it to your computer with is working properly.

2. Install Firmware

To install firmware updates for the controller on Linux go ahead and initiate the firmware download by clicking the “update” button in app.

When the download completes you’ll see an error message — yes, an error message — stating to put put the controller into ‘Firmware Update’ mode:

Do as commanded and unplug the pad then put the 8bitDo SF30 Pro in device update mode by pressing L1, R1 and Start together. Once done, reattach via USB.

Finally, complete the firmware upgrade.

Once done, put the controller back in Android pairing mode and run fwupdmgr get-devices at the command line to check the firmware version.

Finally, put it back in Xinput mode, and reconnect to resume using the pad for gaming.

Updating hardware firmware is difficult in general so I can’t knock the way it’s handled here on Linux. The fact that it’s possible on Linux at all is a real achievement.

I look forward to hopefully racing against some of you in online SuperTuxKart sometime.

Though now that I have a proper controller I no longer have an excuse for why my driving is so bad…