Skip to content

schema(usb): publish typed transport roles and board identity profiles for fbuild #47

Description

@zackees

Parent consumer: FastLED/fbuild#1047
Related Pico identity audit: #46

Goal

Publish a versioned, machine-readable USB identity contract that lets fbuild remove every production VID/PID literal and consume FastLED/boards as the only source of USB identities. Test fixtures are the sole exception. This includes board runtime identities, bootloader identities, generic USB-UART bridges, debug probes, recovery transports, reset semantics, and board/environment-to-identity relationships.

Current gap

The public usb-ids.json / usb-vids.proto.zstd artifact currently publishes only:

  • VID + vendor name;
  • PID + one product name.

That is enough for display, but not enough to replace fbuild runtime tables. fbuild still embeds identity knowledge in:

  • crates/fbuild-config/assets/boards/json/** (hundreds of build.vid / build.pid rows used for firmware USB defines);
  • crates/fbuild-config/src/board/mcu_vid.rs and online-data-tools/seed_mcu_to_vid.json;
  • crates/fbuild-serial/src/boards.rs family/reset classification;
  • crates/fbuild-serial/src/bootloader_watcher.rs;
  • crates/fbuild-daemon/src/handlers/operations/deploy_port.rs;
  • crates/fbuild-deploy/src/{probe_rs,lpc_debugger_reflash}.rs and Teensy loader discovery;
  • the bundled vendor archive/runtime fallback.

Product-name heuristics are not an acceptable replacement: a single VID:PID may collide across boards, and roles such as runtime CDC, BOOTSEL MSC, HalfKay HID, DFU, CMSIS-DAP, UART bridge, or recovery probe are behavioral facts.

Required published contract

Extend the boards publication pipeline with an additive, versioned artifact (or backward-compatible fields in the protobuf plus an equivalent JSON artifact) that represents both:

  1. USB identities keyed by normalized VID:PID, with provenance and typed semantics:
    • roles: runtime serial, USB-UART bridge, bootloader MSC/HID/DFU/UF2, debug probe, recovery transport;
    • reset/transition behavior where known (for example 1200-bps touch/DTR, expected boot identity, expected runtime identity);
    • platform/family/generation constraints such as RP2040 versus RP2350;
    • interface/composite notes when a PID alone is insufficient.
  2. Board aliases/environments keyed by stable board ID, mapping the board to one or more identity profiles with priority and purpose (compile-time firmware VID/PID, upload/runtime serial, bootloader, probe).

The artifact must preserve collisions and alternates rather than collapsing them to one display product. Every semantic record must retain source URL/immutable upstream reference and source class.

Initial migration inventory

At minimum, publish provenance-backed profiles for every production identity currently consumed by fbuild, including:

  • Raspberry Pi RP2040/RP2350 BOOTSEL and runtime CDC;
  • Espressif native USB and USB-serial/JTAG;
  • Arduino and clone runtime/bootloader identities;
  • CP210x, CH340/CH9102, and FTDI USB-UART bridges;
  • SAMD UF2/DFU identities;
  • Teensy runtime serial and HalfKay loader;
  • NXP LPC-Link2/DAPLink runtime, probe, and DFU recovery identities;
  • all board JSON VID/PID pairs currently embedded in fbuild board assets.

Do not infer missing records from vendor-wide wildcard matching. Unresolved identities must be reported, not guessed.

Phases

Phase 1 — schema and deterministic builders

  • Specify schema versioning and backward compatibility.
  • Add typed identity/profile models and validation.
  • Generate compact JSON plus compressed protobuf (or an equivalently compact versioned artifact).
  • Preserve existing usb-ids.json consumers while adding the semantic artifact.
  • Add unit tests for wire compatibility, collisions, alternates, provenance, and invalid role/reset combinations.

Phase 2 — provenance-backed data

  • Curate/import the complete fbuild production inventory on the correct data branches.
  • Distinguish runtime, bootloader, bridge, probe, and recovery identities.
  • Include board alias/environment relationships and compile-time firmware identities.
  • Cover Pico 1 and Pico 2 variants from research: audit and publish Pico/Pico 2 USB identities #46 without treating BOOTSEL as runtime CDC.
  • Publish via the normal branch/build-site pipeline; no hand edits to site-src/public.

Phase 3 — consumer handoff

  • Publish the artifact and stable URL with _meta schema/version/source hashes.
  • Add a fixture/contract test consumable by fbuild.
  • Link the fbuild migration PR that removes embedded production identities.
  • Verify fbuild can build/deploy representative RP2040, NXP/LPC, Teensy, SAMD, Arduino, and ESP targets from boards-ingested metadata.

Acceptance criteria

  • FastLED/boards is sufficient to remove every production VID/PID literal and vendor-ID wildcard from fbuild.
  • No behavior depends on product-name substring heuristics when typed role data exists.
  • The published schema preserves genuine VID:PID collisions and multiple board profiles.
  • All records have provenance; unknowns are explicit.
  • Runtime consumers can validate schema/version and reject stale or malformed artifacts.
  • Test fixtures may embed IDs, but generated/release fbuild artifacts contain none outside data downloaded from FastLED/boards during the build/cache phase.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    Status
    Triage

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions