Skip to content

Latest commit

 

History

3 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Stadia Controller Bluetooth Flasher (Windows)

A Windows-friendly guide and wrapper script for flashing Google Stadia Controllers from Wi-Fi mode to Bluetooth mode, now that Google's official tool has been taken offline.

This project wraps GaryOderNichts' stadiatool with Windows-specific fixes and a step-by-step guided script.

Why This Exists

Google shut down the official Stadia Controller Bluetooth conversion tool in early 2026. The community-built stadiatool by GaryOderNichts works great but was only tested on Linux. On Windows, two issues block it from working out of the box:

  1. USB driver conflicts — Windows assigns its own drivers to the controller in bootloader mode, preventing libusb from communicating with it. You need Zadig to swap the driver to WinUSB.
  2. Linux-only API calls — The script calls is_kernel_driver_active(), which is not implemented on Windows and crashes with NotImplementedError.

This project patches issue #2 automatically and walks you through issue #1.

Prerequisites

  • Windows 10 or 11
  • Python 3.8+ — Download from python.org. Tick "Add Python to PATH" during installation.
  • Zadig — Download from zadig.akeo.ie
  • A USB-C data cable — Not a charge-only cable. The one that came with your Stadia Controller works best.
  • A Stadia Controller currently in Wi-Fi mode

Setup

1. Clone or download this repo

git clone https://github.com/mroberts19vibe/stadia-bt-windows.git
cd stadia-bt-windows

Or click Code → Download ZIP and extract it.

2. Install Python dependencies

pip install pyusb

3. Install libusb

Download the latest release from libusb/libusb releases (the .7z or .zip file, e.g. libusb-1.0.27.7z).

Extract it and copy the DLL to your system:

  • 64-bit Windows (most systems): Copy VS2022\MS64\dll\libusb-1.0.dll to C:\Windows\System32\
  • 32-bit Windows: Copy VS2022\MS32\dll\libusb-1.0.dll to C:\Windows\System32\

You may need to run your file explorer as Administrator to copy into System32.

4. Download stadiatool

Download or clone GaryOderNichts/StadiaController and place the stadiatool folder contents alongside this project's files, or note the path for later.

5. Download firmware files

Download the firmware .bin files from one of these repos:

You need at minimum:

File Purpose
restricted_ivt_flashloader.bin Bootloader payload
bruce_pvt_a_prod_signed.bin Bluetooth firmware

Place these in a data folder inside the stadiatool directory.

Flashing — Step by Step

⚠️ This is a one-way process. Once flashed, your controller cannot be reverted to Wi-Fi mode. The 3.5mm headphone jack will only work when the controller is connected via USB-C, not over Bluetooth., and the Google Assistant and Capture buttons will lose their default function (they can be remapped via Steam Input or similar tools).

Step 1 — Enter bootloader mode

  1. Unplug the controller if it's connected.
  2. Hold the three-dot (Options/⋯) button while plugging the USB-C cable into your computer.
  3. The status light should stay off. If it lights up, unplug and try again.
  4. Press all four buttons at the same time: Options (⋯) + Assistant + A + Y
  5. Nothing visible will happen — that's expected.

The controller should now appear in Device Manager as "SP Blank RT Family" under Universal Serial Bus devices.

Step 2 — Swap the USB driver with Zadig

  1. Open Zadig (run as Administrator if needed).
  2. Go to Options → List All Devices.
  3. In the dropdown, find "SP Blank RT Family" (Vendor ID: 1FC9, Product ID: 0135).
  4. Set the target driver to WinUSB and click Replace Driver.
  5. Keep Zadig open — you'll need it again in a moment.

Step 3 — Load the flashloader

Open a Command Prompt (or PowerShell) in the stadiatool directory and run:

python flash_windows.py flashloader

Or if using the original stadiatool (with the manual patch described below):

python stadiatool.py flashloader

Expected output:

Found: 1fc9:0135 (NXP SemiConductors Inc SP Blank RT Family)
flashloader image is 100672 bytes
SDP load result: 0x88888888

The result 0x88888888 means the flashloader was loaded successfully.

Step 4 — Swap the USB driver again

After loading the flashloader, the controller changes identity and shows up as a new USB device: "USB COMPOSITE DEVICE" (Vendor ID: 15A2, Product ID: 0073).

Windows will assign its own driver to this new device, so you need to use Zadig again:

  1. In Zadig (still open from Step 2), refresh the device list or reselect from the dropdown.
  2. Find "USB COMPOSITE DEVICE" (VID: 15A2, PID: 0073).
  3. Replace the driver with WinUSB again.

⚠️ Do this quickly. The flashloader may time out if you wait too long. If the device disappears, start over from Step 1.

Step 5 — Flash the Bluetooth firmware

Immediately after swapping the driver, run:

python flash_windows.py flash_firmware

Or with the original stadiatool:

python stadiatool.py flash_firmware data/bruce_pvt_a_prod_signed.bin

Expected output:

Found: 15a2:0073 (FREESCALE SEMICONDUCTOR INC. USB COMPOSITE DEVICE)
Detecting MCU type...
MCU: 6c0000 (106XA0)
Detecting Flash type...
Flash: 17c8 (Giga-16m)
Setting up flash
Clearing GPR flags
Flashing to Application A at 0x60040000...
Resetting device
Done!

That's it — your controller is now in Bluetooth mode!

Step 6 — Pair via Bluetooth

  1. Unplug the USB-C cable.
  2. Turn on the controller by pressing the Stadia button.
  3. Hold Y + Stadia button for 2 seconds — the status light will flash orange.
  4. On your PC/phone/tablet, open Bluetooth settings and pair with "Stadia Controller".

Manual Patch (if using the original stadiatool without the wrapper)

The original stadiatool.py calls is_kernel_driver_active() which is Linux-only. Find every instance of:

if dev.is_kernel_driver_active(0):
    dev.detach_kernel_driver(0)

And replace with:

try:
    if dev.is_kernel_driver_active(0):
        dev.detach_kernel_driver(0)
except NotImplementedError:
    pass

Troubleshooting

"No backend available"

libusb is not installed. Make sure you copied libusb-1.0.dll to C:\Windows\System32\ (see Setup step 3).

"Device not found"

  • Make sure the controller is in the correct mode (bootloader for flashloader, flashloader for flash_firmware).
  • Check Device Manager to confirm the device appears.
  • Make sure you swapped the driver with Zadig for the current device identity.

"Input/Output Error" during flash_firmware

You need to use Zadig to replace the driver on the USB COMPOSITE DEVICE (15A2:0073) that appears after loading the flashloader. See Step 4.

The controller has reset / timed out

If you took too long between steps, the controller may have timed out and reset. Start over from Step 1. Having Zadig already open and ready helps speed things up.

Controller doesn't turn on after flashing

Charge it for at least 30 minutes via USB-C, then try pressing the Stadia button again. If it still doesn't respond, hold the Google Assistant + Capture buttons for 6 seconds to factory reset.

Controller won't pair via Bluetooth

  • Make sure you're holding Y + Stadia (not just Stadia) to enter pairing mode.
  • The status light should flash orange when in pairing mode.
  • Try forgetting the device in your Bluetooth settings and pairing again.
  • Ensure your device supports Bluetooth Low Energy (BLE).

Analogue triggers registering as digital (on/off only)

This is a known Windows issue. Apply the registry fix from ChristopherKlay/StadiaEnhanced.

Credits

  • GaryOderNichts — Original stadiatool and reverse engineering of the flashing process. Blog post.
  • uchks and Scyne — Firmware file preservation.
  • ChristopherKlay — Backup of Google's original web-based tool.
  • Google — Original Bluetooth firmware for the Stadia Controller.

License

This wrapper script and documentation are provided as-is. The underlying stadiatool is by GaryOderNichts — refer to their repo for licensing. Firmware files are the property of Google.

Disclaimer

This tool can put your controller into a non-usable state. Use at your own risk. Switching to Bluetooth mode is permanent and irreversible (unless using stadiatool's advanced features to reflash the original firmware). The author is not responsible for bricked controllers.

About

Windows tool for flashing Stadia Controllers to Bluetooth mode

Topics

Resources

Stars

0 stars

Watchers

1 watching

Forks

Releases

Packages

Contributors

Languages