You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
fbuild can compile the FastLED AutoResearch firmware for the canonical rp2040 environment (rpipico, Earle Philhower Arduino-Pico), but fbuild 2.4.0 and current main have no Platform::RaspberryPi deploy dispatch. The attached Pico produces firmware.bin and firmware.elf, then fails with:
deploy failed: deployer for RaspberryPi not yet implemented
The attached Amazon-purchased Pico 1 is in its as-received state and presents as a healthy Windows USB mass-storage device:
It has no COM port, so current fbuild port scan does not report it. Windows can use its mass-storage interface, while the separate RP2 Boot vendor interface currently has a device error. The default stock-board path therefore must not assume a working libusb/vendor driver or require Zadig.
This is not a requirement to put the Pico into a non-default state. RP2040 boot ROM checks the flash second-stage CRC and automatically enters USB device boot after about 0.5 seconds when no valid image is present. A factory-blank or invalid-flash Pico can naturally enumerate as RPI-RP2 without pressing BOOTSEL. See RP2040 datasheet section 2.8.1, page 130:
The attached board automatically enters ROM USB without a physical BOOTSEL press, so BOOTSEL entry is not the problem. Merged fbuild #1072 loaded a RAM-only UF2 repeatedly through the same stock Windows mass-storage path; the volume ejected/re-enumerated and no Disk 51/153 events occurred. Flash-target UF2 alone stalls during the ROM's external-QSPI erase/program operation. This isolates a board-level QSPI fault on serial E0C9125B0D9B; it supersedes earlier hypotheses involving the hub, Windows host access, synthetic-volume corruption, copy semantics, or fltsrv.
Software implementation and deterministic coverage are complete. A known-good replacement Pico 1 now passes normal flash, application CDC, JSON-RPC, watchdog recovery, and ten consecutive subsequent-deploy cycles. The fbuild-only first deployment from an as-received blank/invalid-flash replacement remains open because the user-requested PlatformIO A/B ran first on that unit.
Proposal
Implement a Raspberry Pi deployer around the proven upstream flows rather than creating a new deploy repository or requiring host-installed tools.
Prior art to reuse
Arduino-Pico 4.5.3 generates UF2 with its managed pqt-picotool, optionally performs a 1200-bps serial reset, finds an RPI-RP2 volume by INFO_UF2.TXT, and copies NEW.UF2:
Resolve rp2040 to the existing rpipico board definition.
Build a Pico 1 UF2 artifact with the correct RP2040 family ID.
Inventory USB boot targets independently of serial ports.
If an RPI-RP2 target is already present, identify it through INFO_UF2.TXT / Board-ID and deploy without requiring -p.
Otherwise, when a compatible application CDC port exists, perform the standard 1200-bps reset and wait for the matching boot volume.
Copy the UF2 through the driverless mass-storage interface by default.
Wait for the boot volume to eject and the application CDC device to enumerate.
Return the actual post-deploy port identity in DeploymentResult; do not assume the old COM name remains valid.
Picotool may be supported as an optional direct transport after its Windows, Linux, and macOS behavior is validated, but picotool load -f must not be assumed to work identically everywhere. The zero-touch stock Windows acceptance path is standard USB mass storage.
Cross-repository development and release workflow
Use ~/dev/fbuild as the authoritative source checkout and ~/dev/fastled as the hardware consumer. Fix deploy problems in fbuild; do not copy deploy code or add a raw uploader workaround in FastLED, and do not wait for a PyPI release between milestones.
1. Link the fbuild checkout into FastLED
Start from current main in both repositories. Sync FastLED once, then replace its released wheel with an editable build of the sibling checkout:
On Linux/macOS, use .venv/bin/python. Confirm the version, editable project location, and source commit before accepting hardware evidence:
cd~/dev/fastled
FBUILD_DEV_MODE=1 UV_NO_SYNC=1 uv run fbuild --version
uv pip show fbuild
git -C ../fbuild rev-parse HEAD
Keep UV_NO_SYNC=1 set for bash autoresearch; its nested uv run would otherwise restore FastLED's released pin. FBUILD_DEV_MODE=1 isolates development daemon/cache state. Never commit a local/editable dependency path to FastLED. After fbuild Rust or Python changes, rerun the editable-install command so the native package is rebuilt before retesting.
2. Merge fbuild work at major milestones
Implement and validate these coherent fbuild milestones in order:
UF2 artifact/tooling: generate the correct Pico 1/RP2040 UF2 with managed tooling.
Stock-board discovery/deploy: discover RPI-RP2 without a serial port and deploy to the stock ROM-boot volume without -p.
Reset/CDC handoff: add 1200-bps reset, boot-volume transition, CDC reacquisition, and the actual new port in DeploymentResult.
Portability/hardening: cover Windows/Linux/macOS, typed failures, multi-device safety, and the attached-board soak.
For every milestone:
Add focused fbuild tests and run all fbuild-required lint/test gates.
Reinstall the editable fbuild checkout into FastLED.
Run the relevant attached-Pico AutoResearch command with FBUILD_DEV_MODE=1 UV_NO_SYNC=1.
Record the exact fbuild commit SHA, command, VID:PID/board identity, volume/port transition, and decisive output here.
Update ~/dev/fbuild/main, relink the merged commit, and continue.
Do not publish an interim fbuild release for each milestone.
3. Publish once, then restore FastLED to a release pin
Open the release gate only after every fbuild-owned issue/checklist linked from FastLED/FastLED#3626, including this issue, is resolved and the stock-board evidence passes.
In ~/dev/fbuild, bump the Rust workspace and Python project versions together in a release PR.
Run complete release validation, push the PR, and admin-merge it.
Let fbuild's autonomous release workflow create the tag, GitHub release, and PyPI artifacts; do not tag or publish manually.
Verify the published version and platform artifacts.
In FastLED, pin that published version, extend the pin history, and run uv sync without UV_NO_SYNC to remove the editable override and restore the release wheel.
Verify uv run fbuild --version reports the published version, then run:
The volume ejects, the program boots, application CDC appears, and DeploymentResult contains the new port.
Subsequent deployment
A FastLED/Arduino-Pico application is reset automatically through 1200-bps CDC touch.
fbuild waits for ROM USB boot, writes UF2, waits for CDC, and returns the current port.
Ten consecutive deploy -> reboot -> CDC cycles pass without a stale port, wrong device, or manual intervention.
State and error matrix
Factory-blank or invalid flash that automatically enters ROM USB boot.
Device already in ROM USB boot for any reason.
Prior FastLED/Arduino-Pico firmware with 1200-bps reset.
Compatible Pico SDK firmware with a supported reset interface.
Arbitrary or hung firmware with no software reset interface: return an explicit recovery instruction instead of misreporting a missing serial port. This physical fallback must not weaken the stock-board zero-touch test.
Device selection uses board identity/serial/topology when available and never flashes all mounted UF2 volumes indiscriminately. Covered by merged fix(rp2040): match upstream UF2 deploy semantics #1050 and FastLED/boards ingestion.
Portability and tests
Unit/integration coverage exercises USB-volume discovery, first deployment without a port, 1200-bps transition, volume disappearance, and CDC handoff.
Windows, Linux, and macOS mount/discovery behavior is covered.
The stock path has no dependency on a host-installed uploader or PATH lookup; managed tools are checksum-pinned.
Physical evidence records the board VID:PID, INFO_UF2.TXT, exact fbuild command, volume transition, returned port, and decisive output.
Context
Parent: FastLED/FastLED#3626
fbuild can compile the FastLED AutoResearch firmware for the canonical
rp2040environment (rpipico, Earle Philhower Arduino-Pico), but fbuild 2.4.0 and currentmainhave noPlatform::RaspberryPideploy dispatch. The attached Pico producesfirmware.binandfirmware.elf, then fails with:The attached Amazon-purchased Pico 1 is in its as-received state and presents as a healthy Windows USB mass-storage device:
It has no COM port, so current
fbuild port scandoes not report it. Windows can use its mass-storage interface, while the separateRP2 Bootvendor interface currently has a device error. The default stock-board path therefore must not assume a working libusb/vendor driver or require Zadig.This is not a requirement to put the Pico into a non-default state. RP2040 boot ROM checks the flash second-stage CRC and automatically enters USB device boot after about 0.5 seconds when no valid image is present. A factory-blank or invalid-flash Pico can naturally enumerate as
RPI-RP2without pressing BOOTSEL. See RP2040 datasheet section 2.8.1, page 130:https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf
Current hardware status (2026-07-15)
The attached board automatically enters ROM USB without a physical BOOTSEL press, so BOOTSEL entry is not the problem. Merged fbuild #1072 loaded a RAM-only UF2 repeatedly through the same stock Windows mass-storage path; the volume ejected/re-enumerated and no Disk 51/153 events occurred. Flash-target UF2 alone stalls during the ROM's external-QSPI erase/program operation. This isolates a board-level QSPI fault on serial
E0C9125B0D9B; it supersedes earlier hypotheses involving the hub, Windows host access, synthetic-volume corruption, copy semantics, orfltsrv.Software implementation and deterministic coverage are complete. A known-good replacement Pico 1 now passes normal flash, application CDC, JSON-RPC, watchdog recovery, and ten consecutive subsequent-deploy cycles. The fbuild-only first deployment from an as-received blank/invalid-flash replacement remains open because the user-requested PlatformIO A/B ran first on that unit.
Proposal
Implement a Raspberry Pi deployer around the proven upstream flows rather than creating a new deploy repository or requiring host-installed tools.
Prior art to reuse
Arduino-Pico 4.5.3 generates UF2 with its managed
pqt-picotool, optionally performs a 1200-bps serial reset, finds anRPI-RP2volume byINFO_UF2.TXT, and copiesNEW.UF2:maxgerhardt/platform-raspberrypialready has an already-in-ROM-USB fast path and a 1200-bps reset/wait path:Arduino-Pico's normal USB serial firmware supports the 1200-bps/DTR reset even without the optional picotool vendor interface:
Required deployment sequence
rp2040to the existingrpipicoboard definition.RPI-RP2target is already present, identify it throughINFO_UF2.TXT/Board-IDand deploy without requiring-p.DeploymentResult; do not assume the old COM name remains valid.Picotool may be supported as an optional direct transport after its Windows, Linux, and macOS behavior is validated, but
picotool load -fmust not be assumed to work identically everywhere. The zero-touch stock Windows acceptance path is standard USB mass storage.Cross-repository development and release workflow
Use
~/dev/fbuildas the authoritative source checkout and~/dev/fastledas the hardware consumer. Fix deploy problems in fbuild; do not copy deploy code or add a raw uploader workaround in FastLED, and do not wait for a PyPI release between milestones.1. Link the fbuild checkout into FastLED
Start from current
mainin both repositories. Sync FastLED once, then replace its released wheel with an editable build of the sibling checkout:On Linux/macOS, use
.venv/bin/python. Confirm the version, editable project location, and source commit before accepting hardware evidence:Keep
UV_NO_SYNC=1set forbash autoresearch; its nesteduv runwould otherwise restore FastLED's released pin.FBUILD_DEV_MODE=1isolates development daemon/cache state. Never commit a local/editable dependency path to FastLED. After fbuild Rust or Python changes, rerun the editable-install command so the native package is rebuilt before retesting.2. Merge fbuild work at major milestones
Implement and validate these coherent fbuild milestones in order:
RPI-RP2without a serial port and deploy to the stock ROM-boot volume without-p.DeploymentResult.For every milestone:
FBUILD_DEV_MODE=1 UV_NO_SYNC=1.~/dev/fbuild/main, relink the merged commit, and continue.Do not publish an interim fbuild release for each milestone.
3. Publish once, then restore FastLED to a release pin
Open the release gate only after every fbuild-owned issue/checklist linked from FastLED/FastLED#3626, including this issue, is resolved and the stock-board evidence passes.
~/dev/fbuild, bump the Rust workspace and Python project versions together in a release PR.uv syncwithoutUV_NO_SYNCto remove the editable override and restore the release wheel.uv run fbuild --versionreports the published version, then run:Final closeout must link all milestone PRs, the fbuild release, the FastLED pin-restoration PR, and the decisive stock-board hardware log.
Acceptance criteria
Stock first deployment
fbuild deploy <project> -e rp2040detects the2E8A:0003/RPI-RP2device and succeeds without-p.firmware.uf2for Pico 1/RP2040, not only BIN/ELF. Verified by merged fix(rp2040): match upstream UF2 deploy semantics #1050 and regression coverage.DeploymentResultcontains the new port.Subsequent deployment
State and error matrix
Portability and tests
PATHlookup; managed tools are checksum-pinned.INFO_UF2.TXT, exact fbuild command, volume transition, returned port, and decisive output.Related issues
serialport::available_ports()and cannot observe this attached Windows MSC-only device.