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.
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:
- USB driver conflicts — Windows assigns its own drivers to the controller in bootloader mode, preventing
libusbfrom communicating with it. You need Zadig to swap the driver to WinUSB. - Linux-only API calls — The script calls
is_kernel_driver_active(), which is not implemented on Windows and crashes withNotImplementedError.
This project patches issue #2 automatically and walks you through issue #1.
- 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
git clone https://github.com/mroberts19vibe/stadia-bt-windows.git
cd stadia-bt-windows
Or click Code → Download ZIP and extract it.
pip install pyusb
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.dlltoC:\Windows\System32\ - 32-bit Windows: Copy
VS2022\MS32\dll\libusb-1.0.dlltoC:\Windows\System32\
You may need to run your file explorer as Administrator to copy into System32.
Download or clone GaryOderNichts/StadiaController and place the stadiatool folder contents alongside this project's files, or note the path for later.
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.
⚠️ 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).
- Unplug the controller if it's connected.
- Hold the three-dot (Options/⋯) button while plugging the USB-C cable into your computer.
- The status light should stay off. If it lights up, unplug and try again.
- Press all four buttons at the same time: Options (⋯) + Assistant + A + Y
- 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.
- Open Zadig (run as Administrator if needed).
- Go to Options → List All Devices.
- In the dropdown, find "SP Blank RT Family" (Vendor ID:
1FC9, Product ID:0135). - Set the target driver to WinUSB and click Replace Driver.
- Keep Zadig open — you'll need it again in a moment.
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.
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:
- In Zadig (still open from Step 2), refresh the device list or reselect from the dropdown.
- Find "USB COMPOSITE DEVICE" (VID:
15A2, PID:0073). - 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.
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!
- Unplug the USB-C cable.
- Turn on the controller by pressing the Stadia button.
- Hold Y + Stadia button for 2 seconds — the status light will flash orange.
- On your PC/phone/tablet, open Bluetooth settings and pair with "Stadia Controller".
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:
passlibusb is not installed. Make sure you copied libusb-1.0.dll to C:\Windows\System32\ (see Setup step 3).
- 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.
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.
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.
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.
- 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).
This is a known Windows issue. Apply the registry fix from ChristopherKlay/StadiaEnhanced.
- 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.
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.
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.