Pi Pico Driver

jumpstarter-driver-pi-pico flashes Raspberry Pi Pico (RP2040), Pico W, and Pico 2 (RP2350) by copying a UF2 file onto the BOOTSEL USB mass-storage volume.

The driver supports two methods for entering BOOTSEL mode programmatically:

  1. GPIO reset - wire the Pico’s BOOTSEL pad and RUN pin to host GPIO lines.

  2. 1200-baud serial touch - uses a USB CDC serial child. Only works when the running firmware implements the convention (Pico SDK pico_stdio_usb, CircuitPython, Arduino).

Installation

$ pip3 install --extra-index-url https://pkg.jumpstarter.dev/simple jumpstarter-driver-pi-pico

Configuration

Serial-based BOOTSEL entry

export:
  storage:
    type: jumpstarter_driver_pi_pico.driver.PiPicoFlasher
    config: {}
    children:
      serial:
        ref: serial
  serial:
    type: jumpstarter_driver_pyserial.driver.PySerial
    config:
      url: /dev/ttyACM0
      baudrate: 115200

GPIO-based BOOTSEL entry

When the firmware doesn’t support the 1200-baud reset, you can wire two host GPIO pins to the Pico:

Host GPIO

Pico pin

Notes

Pin A

BOOTSEL (TP6 on Pico)

Pull low to select bootloader on reset

Pin B

RUN

Pull low to reset the RP2040/RP2350

Both GPIO outputs should use open-drain drive and active-low polarity so that on() pulls the line LOW and off() releases to high-impedance (the Pico’s internal pull-ups keep the lines high when released).

export:
  storage:
    type: jumpstarter_driver_pi_pico.driver.PiPicoFlasher
    config: {}
    children:
      serial:
        ref: serial
      bootsel:
        ref: bootsel
      run:
        ref: run
  serial:
    type: jumpstarter_driver_pyserial.driver.PySerial
    config:
      url: /dev/ttyACM0
      baudrate: 115200
  bootsel:
    type: jumpstarter_driver_gpiod.driver.DigitalOutput
    config:
      device: "/dev/gpiochip4"   # RPi5 GPIO chip - adjust for your host
      line: 17                    # GPIO pin wired to BOOTSEL
      drive: open_drain
      active_low: true
      initial_value: inactive
  run:
    type: jumpstarter_driver_gpiod.driver.DigitalOutput
    config:
      device: "/dev/gpiochip4"
      line: 27                    # GPIO pin wired to RUN
      drive: open_drain
      active_low: true
      initial_value: inactive

When both GPIO and serial children are present, GPIO reset is preferred.

Usage

  • j storage flash ... - flash a UF2 file (auto-enters BOOTSEL if needed)

  • j storage bootloader - request BOOTSEL mode without flashing

  • j serial ... - USB CDC console (when serial child is configured)

API Reference

class jumpstarter_driver_pi_pico.driver.PiPicoFlasher

Flash UF2 firmware by copying it onto the BOOTSEL USB drive.

Works with RP2040 and RP2350. Flashing uses the mounted BOOTSEL volume.

BOOTSEL entry methods (tried in priority order by enter_bootloader):

  1. GPIO reset - bootsel + run children (DigitalOutput). Assert BOOTSEL low, pulse RUN low, release. Works regardless of firmware. Requires two GPIO lines wired to the Pico BOOTSEL pad and RUN pin.

  2. 1200-baud serial touch - serial child. Opens the USB CDC port at 1200 baud and toggles DTR. Only works when the running firmware implements the convention (Pico SDK pico_stdio_usb, CircuitPython, MicroPython, Arduino).