# ⬆️ Update Firmware (HOJA Controllers)

Firmware updates for Hand Held Legend controllers running HOJA (GC Ultimate, ProGCC, Super Gamepad+ and others) are done in the browser with **HHL Gamepad Config** at [hoja.handheldlegend.com](https://hoja.handheldlegend.com).

**You need:** Chrome, Edge or another Chromium browser on Windows, macOS, Linux, ChromeOS or Android, a USB **data** cable (some cables only charge), and an internet connection. iPhone and iPad browsers can't connect to USB controllers.

## Update a controller


1. Plug the controller in while holding **A** (or **B**) so it starts in a mode the app can talk to.
2. Open [hoja.handheldlegend.com](https://hoja.handheldlegend.com) and press **Connect**. The app checks for new firmware every time a controller connects. Home and the **Firmware & backup** page show **Update available**.
3. Press **Update now**. Optional but recommended: use **Save a backup first** to save your settings to a file.
4. Press **Enter update mode**. The controller restarts into update mode.

 ![Step 1: the update dialog. Enter update mode restarts the controller](https://docs.handheldlegend.com/api/files.get?sig=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1cGxvYWRzLzU5ZGZiY2Y1LTNjZGEtNGY4OC1hMDAyLWViYzFkNmQ5NjMyOS9iZmM2NDZmYS0yZmFmLTQ3ZWQtYTMyNi0yNWQ1YmU2OTNkNWQvaG9qYS11cGRhdGUtYXZhaWxhYmxlLnBuZyIsInR5cGUiOiJhdHRhY2htZW50IiwiaWF0IjoxNzkzODE3MDAwLCJleHAiOjE3OTM5MDM0MDB9.xS2TH3c18wRtttIhnvd6QwPaGcXQ3_L5ZN6JYhccIKQ " =440x283")


5. Writing starts by itself. If the app says **One more step: press Update**, press it and pick the controller in the browser's window. A controller with the HOJA bootloader is listed by its name followed by "Update" (for example **GCU 1 Update**). Other controllers show as **RP2 Boot** or **RP2350 Boot**.

 ![Step 3: writing the firmware. Keep the controller plugged in](https://docs.handheldlegend.com/api/files.get?sig=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1cGxvYWRzLzU5ZGZiY2Y1LTNjZGEtNGY4OC1hMDAyLWViYzFkNmQ5NjMyOS9hNzI0NmJjZC1kMjRkLTRiMWUtOTNiYy05MDlhYTRmZjY5YmQvaG9qYS11cGRhdGUtd3JpdGluZy5wbmciLCJ0eXBlIjoiYXR0YWNobWVudCIsImlhdCI6MTc5MzgxNzAwMCwiZXhwIjoxNzkzOTAzNDAwfQ.n62Am0I40P7HeKOowMkGBXnXyyCPjHwc56EV0IW9L8w " =440x283")


6. When it says **Update complete**, give the controller a moment to restart, then press **Connect**.

 ![Step 4: update complete](https://docs.handheldlegend.com/api/files.get?sig=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1cGxvYWRzLzU5ZGZiY2Y1LTNjZGEtNGY4OC1hMDAyLWViYzFkNmQ5NjMyOS9kNjFjN2Q2Mi0wNjFjLTRlMGEtODdkMy05NTliYjY5NWNkY2YvaG9qYS11cGRhdGUtY29tcGxldGUucG5nIiwidHlwZSI6ImF0dGFjaG1lbnQiLCJpYXQiOjE3OTM4MTcwMDAsImV4cCI6MTc5MzkwMzQwMH0.dOS6zOvJzCc8jHzGyyjC1kslcCEWmLcNfYnt24iGyX0 " =440x283")

Keep the controller plugged in until the update is complete.

A USB update also installs the **HOJA bootloader** on the controller (see **The HOJA update mode** below). Controllers that support it can also be updated over Bluetooth from the app, but a Bluetooth update doesn't install the HOJA bootloader.

### If the browser can't write to the controller directly

This is common on Windows. The app switches to copying the firmware onto the controller's update drive instead, and shows the steps:

 ![The drive step: pick the RPI-RP2 drive in the folder window](https://docs.handheldlegend.com/api/files.get?sig=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1cGxvYWRzLzU5ZGZiY2Y1LTNjZGEtNGY4OC1hMDAyLWViYzFkNmQ5NjMyOS83Mzg0ZjQ2OS1mNWQyLTQ2MDgtYjNmYy1hMGZkZjU0MWEyYTMvaG9qYS11cGRhdGUtZHJpdmUucG5nIiwidHlwZSI6ImF0dGFjaG1lbnQiLCJpYXQiOjE3OTM4MTcwMDAsImV4cCI6MTc5MzkwMzQwMH0.j4OoU7uSfTBb0AQ6xcXA32Cav175AYjQdxSnwzm-xrI " =440x428")


1. Press **Select** followed by the drive's name (for example **Select GCU 1** or **Select RPI-RP2**).
2. In the folder window, pick the controller's drive itself. With the HOJA bootloader it's named after the controller (for example **GCU 1**); otherwise it's **RPI-RP2** or **RP2350**. On Windows it's under **This PC** in the sidebar; on a Mac under **Locations**. The drive looks empty in that window. That's normal.
3. Allow the browser's "edit files" prompt if one appears. The controller restarts when the copy finishes, and the drive disappears. That's normal too.

If no folder window is available, the app offers **Download UF2**. Copy that file onto the controller's drive yourself.

### Controllers on old firmware

Controllers with firmware from before HOJA 2 can't be configured until they're updated. When you connect one, the app offers its model's current firmware. Follow the same steps.

## The HOJA update mode

Controllers with the **HOJA bootloader** have their own update mode. Any USB update from the app installs it.

* In the HOJA update mode the controller shows up as a USB drive **named after the controller** (for example **GCU 1**), and in the browser's USB window as the controller's name followed by "Update" (for example **GCU 1 Update**).
* Dragging that controller's own .uf2 file onto its drive installs it. A file made for a different board is refused, so the wrong firmware can't be installed by accident.
* Controllers without the HOJA bootloader, and any controller in the chip's own bootloader (BOOTSEL), show the drive **RPI-RP2** (RP2040 chips) or **RP2350** (RP2350 chips) instead, listed in the browser as **RP2 Boot** or **RP2350 Boot**. That bootloader accepts any file, so pick carefully.

## Enter update mode by hand

If the controller won't start normally, you can put it in update mode yourself. Hold **L + Start (+)** while you plug it in. On the GC Ultimate it's **ZL + Start** (the left Z button). See your controller's own page for its combo. The controller then shows up as its update drive: named after the controller (for example **GCU 1**) if it has the HOJA bootloader, otherwise **RPI-RP2** or **RP2350**.

While the controller is connected to the app, you can also press **Restart in update mode** under **Update mode (safe)** on the **Recovery** card (see below).

## Install on a blank board

For new builds, or a board with no firmware:


1. Unplug the controller and remove the battery if it has one.
2. Hold the **BOOTSEL** button (or bridge the boot pads) and plug it in. A drive named **RPI-RP2** or **RP2350** appears.
3. In HHL Gamepad Config, open **Firmware & backup**. On the **Install HOJA on a blank board** card, press **Select bootloader** and pick **RP2 Boot** (or **RP2350 Boot**).
4. The app asks **What are you installing?** Choose **Gamepad firmware**. It then lists only the gamepad firmware for the chip it found (RP2040 or RP2350).
5. Choose your exact controller, tick the warning box, then **Install**.

 ![The installer: choose your controller, then Install](https://docs.handheldlegend.com/api/files.get?sig=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJrZXkiOiJ1cGxvYWRzLzU5ZGZiY2Y1LTNjZGEtNGY4OC1hMDAyLWViYzFkNmQ5NjMyOS8wMjkyYmU4Yi05Nzk1LTRiY2EtYmI5MS0xZjE1MDYyMzcyZTMvaG9qYS1pbnN0YWxsLWJsYW5rLnBuZyIsInR5cGUiOiJhdHRhY2htZW50IiwiaWF0IjoxNzkzODE3MDAwLCJleHAiOjE3OTM5MDM0MDB9.FaOB1dTaX8lh2vdXcU_7NWUM-eXlX3JfnzhuWAN88lc " =440x556")

**Pick the right controller.** Firmware for different hardware can stop the controller working until it's reinstalled from BOOTSEL. Manual downloads of every build are under **Manual downloads** on the **Recovery** card, and listed in **Manual download** below.

## Recovery

The **Recovery** card on **Firmware & backup** has two restart buttons. Both need a USB cable.

* **Update mode (safe)** restarts the controller in its HOJA update mode, with the controller's own drive (on controllers without the HOJA bootloader: RPI-RP2 or RP2350). Use it to install firmware by hand.
* **Boot ROM (advanced)** restarts in the chip's own bootloader, the **RPI-RP2** or **RP2350** drive. It skips the HOJA bootloader's board checks, so firmware for another board could be written and stop the controller working. Use it only to recover a controller.

If something went wrong:

* **Stuck in update mode** after an interrupted update: on Firmware & backup press **Restart from bootloader**, or install again as above. If that fails, unplug it and plug it back in.
* **Still misbehaving after reinstalling:** press **Reinstall firmware** and choose **Start fresh: erase everything first**. It wipes all settings, calibration and pairings, then writes the firmware. With the HOJA update mode, the app erases the controller over USB itself: there's no file to copy onto a drive. Only a board in the chip's own bootloader (RPI-RP2 or RP2350) uses the "flash nuke" erase image. Recalibrate the sticks and triggers afterwards.
* **Reset the settings without reinstalling:** on the **Recovery** card, **Reset settings** offers two choices. **Settings and calibration** keeps the default mode, Switch colors and Bluetooth pairings. **Everything, including pairings** also gives the controller a new Bluetooth address, so every Switch, PC and other device has to pair again. The reset takes effect when the controller restarts: unplug it and plug it back in, or turn it off and on.

Controllers are very hard to brick permanently: BOOTSEL always works.

## Backups

The **Backup & restore** card on **Firmware & backup** keeps your settings safe:

* **Back up settings** saves them to a file, and **Restore from file** loads one back. Backups can include calibration, which you can choose to restore or not.
* **Automatic backups:** the app saves a backup in the browser every time a controller connects, and keeps the last 5 for each controller. Click **Automatic backups** to open the list and restore one. They're stored in that browser only.

## Dongles

The WLAN dongle has its own firmware, separate from the controller's. A dongle on current firmware updates from the app once it's connected, on the **Dongle** card of **Firmware & backup**.

To install or recover a dongle by hand, put it in its bootloader as below, then press **Open installer** on the **Dongle** card (or **Select bootloader** on the blank board card), and choose **Dongle firmware** when the app asks **What are you installing?**

| Dongle | Enter its bootloader | Shows up as |
|--------|----------------------|-------------|
| HOJA Dongle | Hold both buttons while plugging it in | RP2350 Boot |
| Dongle on a Raspberry Pi Pico W | Hold **BOOTSEL** while plugging it in | RP2 Boot    |
| Dongle on a Raspberry Pi Pico 2 W | Hold **BOOTSEL** while plugging it in | RP2350 Boot |
| Waveshare RP2350B-Plus-W | Hold **BOOT** while plugging it in, or while it's plugged in hold **BOOT** and press **RESET** | RP2350 Boot |

Dongles don't have the HOJA bootloader, so they always use the chip's own bootloader for installs by hand. Pick the firmware for your exact dongle.

## Manual download

The app is the easiest and safest way to install firmware: it picks the file and checks it. To open the installer with your board already chosen, use the **Open in the app** link below. If you really need the .uf2 file, for example to drag it onto the controller's drive, download the one for your exact board:

| Board | Open in the app | Download |
|-------|-----------------|----------|
| ProGCC 3 | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=progcc_3) | [progcc_3.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/progcc_3/progcc_3.uf2) |
| ProGCC 3+ | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=progcc_3p) | [progcc_3p.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/progcc_3p/progcc_3p.uf2) |
| ProGCC 3.1 | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=progcc_3.1) | [progcc_3.1.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/progcc_3.1/progcc_3.1.uf2) |
| ProGCC 3.2 (wired and wireless) | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=progcc_3.2) | [progcc_3.2.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/progcc_3.2/progcc_3.2.uf2) |
| ProGCC 3S | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=progcc_3s) | [progcc_3s.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/progcc_3s/progcc_3s.uf2) |
| Super Gamepad+ | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=super_gamepad) | [super_gamepad.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/super_gamepad/super_gamepad.uf2) |
| GC Ultimate 1 (Kickstarter Edition) | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=gcu_1) | [gcu_1.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/gcu_1/gcu_1.uf2) |
| GC Ultimate 2 | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=gcu_2) | [gcu_2.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/gcu_2/gcu_2.uf2) |
| GC Ultimate 2S | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=gcu_2s) | [gcu_2s.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/gcu_2s/gcu_2s.uf2) |
| GC Ultimate (Prototype Edition) | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=gcu_proto) | [gcu_proto.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/gcu_proto/gcu_proto.uf2) |
| Phob 2 | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=phob_2) | [phob_2.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/phob_2/phob_2.uf2) |
| HOJA Dongle | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=dongle_hoja) | [dongle_hoja.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/dongle_hoja/dongle_hoja.uf2) |
| Dongle (Pico W) | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=dongle_pico_w) | [dongle_pico_w.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/dongle_pico_w/dongle_pico_w.uf2) |
| Dongle (Pico 2 W) | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=dongle_pico2_w) | [dongle_pico2_w.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/dongle_pico2_w/dongle_pico2_w.uf2) |
| Dongle (Waveshare RP2350B-Plus-W) | [Open](https://handheldlegend.github.io/hoja3/#/firmware?build=dongle_rp2350b_plus_w) | [dongle_rp2350b_plus_w.uf2](https://raw.githubusercontent.com/HandHeldLegend/hoja-device-fw/main/builds/dongle_rp2350b_plus_w/dongle_rp2350b_plus_w.uf2) |

Older links to **gcu_r4k**, **gcu_r5** or **gcu_s1** files are out of date. Those boards are now **GC Ultimate 1** (gcu_1), **GC Ultimate 2** (gcu_2) and **GC Ultimate 2S** (gcu_2s).

## Wireless module

Controllers with an ESP32 wireless module (GC Ultimate 1, ProGCC 3+, 3.1 and 3.2, Super Gamepad+) also have separate wireless firmware. Update it from the **Wireless** page, or from the **Wireless module (ESP32)** card on **Firmware & backup**. See [Update the Wireless Module](https://docs.handheldlegend.com/doc/update-the-wireless-module-esp32-vhX2Im50kN).