Add UART BOOTSEL reboot command to the regular firmware

The bridge sends 0xAA 0xFE 0x08 0x01 'BOOTSEL' ck; the firmware verifies
checksum and magic and calls reset_usb_boot(). Exposed as
controller-uart-bridge --reboot-bootsel PORT and build.py --uart-port PORT,
which waits for the ROM loader before running picotool.
This commit is contained in:
Joey Yakimowich-Payne 2026-09-22 10:41:51 -06:00
commit 6e0676d9df
8 changed files with 161 additions and 1 deletions

View file

@ -2649,6 +2649,25 @@ The firmware acknowledges the endpoint-zero request, waits 50 ms, and then
calls the Pico ROM `reset_usb_boot()` entry point. Physical BOOTSEL remains the
fallback if the firmware or USB management path is unavailable.
The regular UART firmware has the same shortcut over its serial link. The
host sends the command frame `0xAA 0xFE 0x08 0x01 "BOOTSEL" checksum`; the
firmware verifies the checksum and magic, flushes UART TX, and calls
`reset_usb_boot()`. Line noise or a misframed report cannot trigger it. The
Pico can stay plugged into the Switch or a PC; only the UART adapter needs to
be connected to the host:
```sh
# One-off reboot, then flash the published image
uv run controller-uart-bridge --reboot-bootsel /dev/ttyUSB0
picotool load -v -x firmware/switch-pico.uf2
# Build, publish, reboot the running Pico and flash in one step
uv run python build.py --uart-port /dev/ttyUSB0
```
Firmware from before this command ignores the frame; hold BOOTSEL while
replugging once to install a build that has it.
Flash alternatives: bootsel + drag-drop or `picotool load`.
Flags:
- `SWITCH_PICO_LOG`: enable/disable UART logging on the Pico.