Pico W / Pico 2 W — the right UF2, BOOTSEL, and the on-board LED

Firmware targets differ three ways (pico_w / pico2_w / pico2), BOOTSEL works like every Pico, and the on-board LED is on the radio chip — code written for GP25 will not light it. Official sources for each fact.

Question this page answers: "How do I flash a Pico W or Pico 2 W, which UF2 do I download, and why won't my LED-blink code light the on-board LED?"

Step 1 — download the right UF2

The official documentation links four separate MicroPython builds; the W suffix is a different build, not a bonus feature of the same file. Each entry below is the official download page for that board — on the page, pick the latest stable `.uf2` under Releases:

For C/C++ the SDK build target carries the same distinction: PICO_BOARD=pico_w or pico2_w — never pico/pico2. A non-W build has no radio support and the wrong LED wiring; the failure is quiet.

Step 2 — BOOTSEL, same as every Pico

Hold BOOTSEL while connecting USB; release when the board appears as a mass-storage device (RPI-RP2 on Pico W, RP2350 on Pico 2 W). Drag the UF2 onto the volume; the board reboots into your firmware. The BOOTSEL code lives in mask ROM — it cannot be overwritten, so the board cannot be permanently bricked through software.

Note the trap: the volume name identifies the generation (RP2040 vs RP2350), not the wireless variant — see Pico W vs non-W.

Step 3 — the LED: it is NOT on GP25

The single most common W-board surprise. Officially:

  • On non-W boards the on-board LED connects to the MCU's GP25.
  • On Pico W / Pico 2 W it connects to the radio chip (WL_GPIO0); the SDK board headers define no `PICO_DEFAULT_LED_PIN` for these boards.

So a GP25 blink from a Pico tutorial compiles and runs — and nothing lights. The official way to drive the LED:

  • MicroPython — the connectivity guide (RP-008257-DS, section 3.4) uses Pin("LED", Pin.OUT): ```python from machine import Pin led = Pin("LED", Pin.OUT) led.toggle() ```
  • C/C++ SDK — the official pico-examples blink builds both generations from one source: for W boards it initializes the CYW43 driver and calls cyw43_arch_gpio_put(CYW43_WL_GPIO_LED_PIN, on); the plain-GPIO path (gpio_put) is compiled only for boards that define PICO_DEFAULT_LED_PIN.

Expected, and failure exits

StepExpectedIf it fails
BOOTSEL + USBvolume RPI-RP2 (Pico W) / RP2350 (Pico 2 W) appearscharge-only cable — USB board-not-detected
Drop the W-specific UF2volume ejects, board reboots into MicroPythonre-check the download page name against the board name before re-flashing
Blink "the LED"nothing on GP25 code — by designthe LED is on the radio chip; see Step 3

What this page cannot tell you

  • Radio bring-up (Wi-Fi scans, connecting) — that is the connectivity guide's territory, and licence terms for the radio libraries are summarized on the board pages.
  • Whether your particular board is a W at all — see Pico W vs non-W first if unsure.

Boards

Sources