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
Populate the vendors orphan branch with upstream-curated vendor PID allocation registries — the tier-1+2 sources fbuild's online-data aggregator (v1) was designed to ingest, but never did because the curation pipeline outgrew "a few scripts in one workflow." Per design.md, fastled/boards is the v2 home for this data.
Today: vendors carries only README.md + _meta.json (placeholder). No sync-vendors.yml workflow exists on main. No tools/sync_vendors.py exists.
The full upstream source catalog has already been triaged at FastLED/fbuild#722 with 17 per-vendor sub-issues. Since the architecture moved here, the ingestion belongs here — fbuild should consume the resulting vendors branch data, not re-do the upstream fetches.
Known gaps (no public registry — flag in _meta.json provenance)
NXP (MCUXpresso): per-example USB descriptors only, no centralized registry.
Microchip (Harmony USB): same shape.
TI: no maintained list (energia/Energia unmaintained).
STM32 official: ST does not publish; stm32duino is community-run.
See fbuild#722 for the full per-vendor breakdown of which sub-issue covers which source.
Proposed implementation
tools/sync_vendors.py (on main) — fetcher + parser per source, modeled on the existing tools/sync_*.py pattern. Each source produces a vendors/<vendor>.json with the shape:
.github/workflows/sync-vendors.yml (on main) — nightly cron + workflow_dispatch, runs tools/sync_vendors.py, then publishes the output to the vendors orphan branch via tools/git_publish.py (force-with-lease, history pruned to ~200 commits — same machinery as the other orphan-branch workflows).
_meta.json on the vendors branch — provenance record per source: URL, commit SHA, fetch timestamp, license, parse status. Known-gap vendors (NXP/Microchip/TI) listed with explanation so consumers know the data is intentionally absent.
build_usb_ids.py (already on main) — extend to fold vendors/*.json into the aggregate so the site branch's SQLite carries per-board PID resolution.
.github/workflows/sync-vendors.yml runs nightly + on workflow_dispatch, publishes to vendors branch.
vendors/_meta.json lists every source with its commit SHA + fetch timestamp; known-gap vendors documented.
First successful run carries at least 200 per-board entries across all sources.
build_usb_ids.py ingests the per-board data; the site branch's SQLite vidpid table returns "Pico CircuitPython" for 2e8a000b (not just "Pico SDK CDC UART").
fbuild's #722 acceptance criterion ("fbuild-core::usb::resolver::pretty(0x303A, 0x4002) returns 'Unexpected Maker TinyS2 Arduino'") passes once fbuild consumes from this branch instead of doing its own fetches.
Why this belongs here (not fbuild)
Per design.md: the curation pipeline outgrew fbuild's online-data v1 — the explicit purpose of this repo is to be the v2 aggregator.
The vendors orphan branch is already set up and waiting for data.
Other consumers (the public boards portal at the site branch) need the same data and can read directly from this repo without depending on fbuild.
Single source of truth for VID:PID across the fastled organization.
Downstream coordination
Once this lands, FastLED/fbuild#722 closes — fbuild's online-data consumer simply reads vendors/*.json from this repo instead of re-fetching from the same upstream sources. The 17 per-vendor sub-issues (#723–#739) become trivially-done from fbuild's side because the data lives here.
Status update — 2026-06-29 exhaustive source catalog
A 4-agent parallel sweep across (a) vendor PID registries, (b) Arduino-core boards.txt ecosystem, (c) bootloader/flashing-tool sources, and (d) system-level USB databases catalogued every known VID/PID data store. The full list below replaces and supersedes the smaller table from the original issue body.
TIER 1 — Official vendor PID allocation registries (gold standard)
Found NEGATIVE for official registries: STMicroelectronics, NXP, Microchip/Atmel, Nordic, Silicon Labs, Texas Instruments, Renesas, Cypress/Infineon, Ambiq, WCH/openwch, DFRobot, Pimoroni. These vendors either reuse SDK-default PIDs across all boards or assign customer PIDs privately by email. Their per-board PIDs are only recoverable via tier-2 board-manifest sources.
TIER 2 — Board-manifest sources (per-board USB hwids embedded in board defs)
per-product (host-local; Apple's IORegistry table is private)
host-local
n/a
Confirmed NEGATIVE results (no per-board PID registry exists publicly)
Verified across vendor GitHub orgs + corporate sites:
STMicroelectronics, NXP, Microchip, Nordic, Silicon Labs, Texas Instruments, Renesas, Cypress/Infineon, Ambiq, WCH/openwch, DFRobot, Pimoroni, SparkFun, Atmel: NO public per-board PID registry. VIDs reused with single SDK-default PID across all examples, OR customer-assigned PIDs privately by email.
Silicon Labs: has a request form (silabs.com/interface/request-product-id) but no public manifest.
Nordic: explicitly states no customer PID assignment process.
NXP MCUXpresso / Microchip Harmony / TI SimpleLink / Renesas e2 / Cypress PSoC: per-example USB descriptors only (e.g., NXP 0x1FC9:0x00A2 reused across all examples).
VID/PID ambiguities to flag in downstream consumers
VID
Issue
0x0403 FTDI
Massive counterfeit FT232 ecosystem; FTDI historically bricked clones via PID rewrite. Some clones re-VID to 0x1A86 (WCH CH340G masquerading). Treat with suspicion.
0x10C4 SiLabs CP210x
Many ESP32/STM32 board houses use legitimate SiLabs USB-UART; some rebranders ship rewritten iManufacturer strings. VID real; product string unreliable.
0x2341 Arduino SA vs 0x2A03 Arduino.org
Both legitimate (post-split). Counterfeit Unos commonly use 0x1A86:7523 (CH340G) and present "USB-Serial CH340" — not Arduino at all.
0x303A Espressif
Shared VID; PID alone insufficient — must consult espressif/usb-pids to disambiguate vendor.
0x2E8A Raspberry Pi
Same — PID disambiguates 3rd-party board maker.
0x1A86 WCH (QinHeng)
Heavily cloned CH340/CH341/CH9102 with overlapping PIDs across product lines.
0x0483 STMicroelectronics
DFU bootloader PID 0xDF11 reused by countless 3rd-party STM32 boards that didn't apply for their own PID.
0x16C0 V-USB shared (Objective Development)
Explicitly licensed for sub-PID sharing — VID alone meaningless; consult obdev/v-usb/USB-IDs-for-free.txt.
0x1209 pid.codes
Same model — community-allocated PIDs under one VID.
0x04B4 Cypress
Post-Infineon acquisition; usb.ids still says "Cypress Semiconductor" — treat as Infineon.
Most peripheral PIDs unreleased to public DBs; usb.ids coverage is partial.
Ingestion priority for tools/sync_vendors.py
Land in this order (each is an independent commit):
Tier 1 official registries (6 sources, all PR-friendly, easily parseable): raspberrypi/usb-pid, espressif/usb-pids, pid.codes, openmoko-usb-oui, obdev/v-usb, creationid/creators.
PlatformIO hwids registry — covers everything else as a tier-2 fallback (~1500 boards).
Arduino-core ecosystem boards.txt — 22 cores total (catches boards PIO doesn't ship; especially earlephilhower/arduino-pico for its 11-VID partner-board coverage).
Linux usb.ids via vcrhonek/hwdata — last-resort vendor-name fallback for any unmatched VID.
Linux kernel quirks table — optional annotation layer for "known-weird" devices.
Skip: Tier-4 SDK example defaults (NXP/Microchip/etc.) — they generate false-positive collisions across unrelated boards. Skip the-sz.com, NirSoft, DriverPack, etc. (opaque provenance, redundant with usb.ids).
Updated acceptance criteria
tools/sync_vendors.py parses 22 Arduino-core boards.txt sources (the 7 originally listed + 15 newly catalogued).
Tier-1 PID registries: 6 sources (originally listed 2; now expanded to include pid.codes, openmoko-usb-oui, obdev/v-usb, creationid/creators).
Linux usb.ids ingested via woodruffw/usb-ids.rs (Rust-native) OR vcrhonek/hwdata (filesystem).
vendors/_meta.json documents 12 known VID ambiguities (FTDI clones, CH340 masquerade, Arduino split, etc.) so downstream pretty() can mark them with a confidence score.
Documented gaps: STM/NXP/Microchip/SiLabs/Nordic/TI/Renesas/Cypress/Ambiq/WCH have NO public per-board registry. Per-board PIDs for those vendors recoverable only via PlatformIO hwids or vendor-specific Arduino-core boards.txt.
Original 9-source acceptance criterion is superseded — the real source count is ~50+ across all tiers.
Activity
zackees commentedon Jun 30, 2026
Status update — 2026-06-29 exhaustive source catalog
A 4-agent parallel sweep across (a) vendor PID registries, (b) Arduino-core
boards.txtecosystem, (c) bootloader/flashing-tool sources, and (d) system-level USB databases catalogued every known VID/PID data store. The full list below replaces and supersedes the smaller table from the original issue body.TIER 1 — Official vendor PID allocation registries (gold standard)
raspberrypi/usb-pid0x2E8Aespressif/usb-pids0x303AVVVV:PPPP descriptionpidcodes/pidcodes.github.com0x1209openmoko/openmoko-usb-oui0x1D50usb_product_ids.psv)obdev/v-usb+ VOTI0x16C0creationid/creatorsFound NEGATIVE for official registries: STMicroelectronics, NXP, Microchip/Atmel, Nordic, Silicon Labs, Texas Instruments, Renesas, Cypress/Infineon, Ambiq, WCH/openwch, DFRobot, Pimoroni. These vendors either reuse SDK-default PIDs across all boards or assign customer PIDs privately by email. Their per-board PIDs are only recoverable via tier-2 board-manifest sources.
TIER 2 — Board-manifest sources (per-board USB hwids embedded in board defs)
PlatformIO + already cataloged
hwidsarrayarduino/ArduinoCore-avrarduino/ArduinoCore-samdespressif/arduino-esp32adafruit/Adafruit_nRF52_ArduinoSiliconLabs/arduinostm32duino/Arduino_Core_STM32Arduino-core ecosystem (NEW — not yet in #43)
arduino/ArduinoCore-mbedarduino/ArduinoCore-renesasarduino/ArduinoCore-megaavrarduino/ArduinoCore-samarduino/ArduinoCore-zephyrearlephilhower/arduino-picoadafruit/ArduinoCore-samdsparkfun/Arduino_Boards(avr+samd)Seeed-Studio/ArduinoCore-samdSeeed-Studio/Adafruit_nRF52_ArduinoSeeed-Studio/ArduinoCore-mbedSeeed-Studio/ArduinoCore-renesasRAKWireless/RAK-nRF52-ArduinoIndustruino/IndustruinoSAMDHeltec-Aaron-Lee/WiFi_Kit_seriesEmbedded firmware / runtime sources
adafruit/circuitpythonports/*/boards/*/mpconfigboard.mk)micropython/micropythonports/*/boards/*/mpconfigboard.h)PaulStoffregen/coresARMmbed/DAPLinkprobe-rs/probe-rs(/targets)particle-iot/particle-usbSeeed-Studio/platform-seeedboardsTIER 3 — Bootloader / flashing-tool sources (hard-coded VID/PID tables)
esptool/loader.py+esptool/targets/esp32*.pypicoboot_connection/picoboot_connection.cboards.txt)tcl/interface/*+src/jtag/drivers/cmsis_dap_usb_bulk.cpyocd/probe/pydapaccess/interface/common.py(KNOWN_CMSIS_DAP_IDS)src/probe/{cmsisdap,stlink,jlink,wlink,ftdi,espusbjtag}/src/dfuse.c+src/quirks.cteensy_loader_cli.cutils/uf2families.jsonsrc/platforms/hosted/bmp_libusb.csrc/avrdude.conf.insrc/mbed_os_tools/detect/platform_database.pyboards.txt99-jlink.rules(mirror: 1847123212/jlink-5.10)config/udev/rules.d/49-stlinkv*.rulesTIER 4 — System-level USB databases (aggregator backbones)
vcrhonek/hwdata(Fedora upstream)woodruffw/usb-ids.rsunusual_devs.h, scattered driver tables)/lib/modules/$(uname -r)/modules.alias(generated by depmod)usb-ids.gowdy.usHKLM\SYSTEM\CurrentControlSet\Enum\USBGet-PnpDevicesystem_profiler -json SPUSBDataType/usr/sbin/system_profilerConfirmed NEGATIVE results (no per-board PID registry exists publicly)
Verified across vendor GitHub orgs + corporate sites:
VID/PID ambiguities to flag in downstream consumers
espressif/usb-pidsto disambiguate vendor.obdev/v-usb/USB-IDs-for-free.txt.Ingestion priority for
tools/sync_vendors.pyLand in this order (each is an independent commit):
raspberrypi/usb-pid,espressif/usb-pids,pid.codes,openmoko-usb-oui,obdev/v-usb,creationid/creators.hwidsregistry — covers everything else as a tier-2 fallback (~1500 boards).boards.txt— 22 cores total (catches boards PIO doesn't ship; especiallyearlephilhower/arduino-picofor its 11-VID partner-board coverage).usb.idsviavcrhonek/hwdata— last-resort vendor-name fallback for any unmatched VID.Skip: Tier-4 SDK example defaults (NXP/Microchip/etc.) — they generate false-positive collisions across unrelated boards. Skip the-sz.com, NirSoft, DriverPack, etc. (opaque provenance, redundant with usb.ids).
Updated acceptance criteria
tools/sync_vendors.pyparses 22 Arduino-core boards.txt sources (the 7 originally listed + 15 newly catalogued).pid.codes,openmoko-usb-oui,obdev/v-usb,creationid/creators).usb.idsingested viawoodruffw/usb-ids.rs(Rust-native) ORvcrhonek/hwdata(filesystem).vendors/_meta.jsondocuments 12 known VID ambiguities (FTDI clones, CH340 masquerade, Arduino split, etc.) so downstreampretty()can mark them with a confidence score.hwidsor vendor-specific Arduino-coreboards.txt.Original 9-source acceptance criterion is superseded — the real source count is ~50+ across all tiers.