Context
FastLED/FastLED#3836 requires RP2040/RP2350/Pico W USB identity and port selection to live exclusively in fbuild/FastLED/boards. fbuild 2.5.18 consumes the registry, but its Raspberry Pi deploy special case selects by generation only:
let expected_generation = rp_generation_for(board);
partition_rp_candidates(devices, |vid, pid| {
rp_profiles_match_generation(&profiles_for(vid, pid), expected_generation)
})
This treats Pico 2 (rpipico2, runtime 2E8A:000F) and Pico 2 W (rpipico2w, runtime 2E8A:F00F) as equivalent RP2350 candidates. With one of each connected, fbuild fails ambiguous instead of selecting the requested board profile; with only the wrong variant connected, it can select that wrong board. The same problem exists for Pico vs Pico W in the RP2040 generation.
The generic non-RP path already has board_runtime_identity_matches(board_id, vid, pid), backed by the published board profile, but the RP special case bypasses it.
FastLED currently compensates with a duplicate literal table in ci/util/port_utils.py. Removing that table safely requires fbuild to honor the exact requested RP board profile.
Acceptance criteria
- RED: focused unit tests connect both non-W and W runtime CDC identities and show the requested
rpipico/rpipicow/rpipico2/rpipico2w board selects only its exact runtime profile.
- RED: with only the wrong W/non-W variant connected, selection returns no port; it must never fall back to generation-only matching when an exact board profile exists.
- GREEN: use the requested FastLED/boards
BoardUsbProfile.identities.runtime for RP application CDC selection.
- Preserve the generation fallback only when no exact board profile is available and keep it registry-backed; do not add VID/PID literals.
- Preserve explicit
-p/--port, known-unhealthy exclusion, BOOTSEL-with-no-CDC deployment, and fail-closed multiple-exact-device ambiguity.
- Run focused daemon tests, broader affected-crate tests, clippy/rustfmt, and pre-push review.
- Coordinate the consumer cleanup PR that deletes FastLED's RP literals and lets
fbuild deploy return the healthy application port.
Decisions
- Board-exact runtime selection is distinct from generation matching used for shared ROM BOOTSEL/recovery classification.
- No FastLED-local USB catalogue or text parsing of
fbuild port scan should be introduced.
Coordinated with FastLED/FastLED#3836.
Context
FastLED/FastLED#3836 requires RP2040/RP2350/Pico W USB identity and port selection to live exclusively in fbuild/FastLED/boards. fbuild 2.5.18 consumes the registry, but its Raspberry Pi deploy special case selects by generation only:
This treats Pico 2 (
rpipico2, runtime2E8A:000F) and Pico 2 W (rpipico2w, runtime2E8A:F00F) as equivalent RP2350 candidates. With one of each connected, fbuild fails ambiguous instead of selecting the requested board profile; with only the wrong variant connected, it can select that wrong board. The same problem exists for Pico vs Pico W in the RP2040 generation.The generic non-RP path already has
board_runtime_identity_matches(board_id, vid, pid), backed by the published board profile, but the RP special case bypasses it.FastLED currently compensates with a duplicate literal table in
ci/util/port_utils.py. Removing that table safely requires fbuild to honor the exact requested RP board profile.Acceptance criteria
rpipico/rpipicow/rpipico2/rpipico2wboard selects only its exact runtime profile.BoardUsbProfile.identities.runtimefor RP application CDC selection.-p/--port, known-unhealthy exclusion, BOOTSEL-with-no-CDC deployment, and fail-closed multiple-exact-device ambiguity.fbuild deployreturn the healthy application port.Decisions
fbuild port scanshould be introduced.Coordinated with FastLED/FastLED#3836.