Skip to content

Releases: LouisHitchcock/FPVGateC5MK

C5MK 1.2.3: fast USB signals and browser timing

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 19 Oct 16:22

C5MK 1.2.3: fast USB signals and browser timing

This release puts the browser USB RSSI stream on the short hop-and-capture
path already used for FPVGate's eight-pilot timing. The UART link,
RotorHazard endpoint and partition layout are unchanged from 1.2.2.

Firmware

  • USB scanning defaults to scanmode fast, using noden (256 samples)
    and nodeskip, instead of the slower diagnostic scan settings.
  • Fast mode measures clipping and gain diagnostics every sixteenth cycle.
    Other records contain power only: clear diagnostic flags between those
    cycles do not prove clipping has stopped.
  • Fast mode does not wait for USB buffer space. Slow-host losses increment
    the existing drop counter instead of slowing the RF scan.
  • scanmode full restores the original USB scan, using n, settle
    and tune, with full diagnostics on every reading. status shows the mode.

Older firmware can connect to the browser tools; install 1.2.3 for the fast
USB path. Roughly 1000 readings per pilot per second was measured on the
node scan, not guaranteed for every browser: delivery depends on the USB
host, settings and pilot count.

Browser tools

  • Dashboard: eight-pilot traces and peak hold,
    one large waterfall, expandable RSSI history and optional full-band sweeps.
    Sweeps pause pilot history and restore channels afterwards; the default
    live view uses incoming pilot readings without retuning the receiver.
  • Lap timer: practice/race modes for
    1-4 pilots, voice, CSV results, optional RSSI graphs and help, and advanced
    entry/exit levels that can be typed or dragged on touch screens.
  • Mobile-first controls, wider desktop layouts, FPVGate branding and
    self-hosted fonts, plus connection and troubleshooting guidance.
  • Desktop Chrome/Edge uses Web Serial; Android Chrome uses WebUSB.
    Physical Android testing is pending. iPhone/iPad USB is not supported.

Website updates deploy separately through GitHub Pages. Until deployment
finishes, the public site can still show an older interface.

Installing

Choose c5zero for Waveshare ESP32-C5-Zero or xiaoc5 for Seeed XIAO
ESP32-C5. Use the web flasher, selecting
Multi Pilot, or download the matching board-prefixed assets below.
The boards have different UART pins: do not interchange their images.

For a complete USB flash, rename the four files to these unprefixed names
(or use release/<board>/ at this tag):

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

Close RotorHazard, serial monitors and browser USB connections first, then
unplug/reconnect afterwards. Do not use RotorHazard's STM32 node updater.
A C5 on 1.1.0 or later can receive firmware.bin through FPVGate's C5
Receiver Firmware page. A C5 on 1.0 or earlier needs the complete USB flash.
Application-only updates do not update the bootloader: use a complete USB
flash when upgrading from before 1.2.2 for Linux/Raspberry Pi RotorHazard.

See flashing instructions
and RotorHazard USB setup.

Validation and limitations

Portable tests pass: 60 meter/framing checks, 1201 node checks, 48 host
checks, 305 RotorHazard USB checks and eleven USB parser scenarios.
Browser lap detection, graph, spectrum and transport tests pass. Browser
layouts were checked from 320 to 1920 pixels with simulated receiver data.
Both board images build with pinned ESP-IDF 5.5.1 and pass the SRAM guard.
Release assets include SHA-256 checksums.

No new physical-device flash or race test was performed for this release.
Previous Waveshare USB and XIAO UART validation is recorded in the
1.2.2 notes;
it is not hardware validation of these binaries. Physical XIAO USB, Android
USB and multi-pilot race validation remain pending. Check reception,
thresholds and lap detection before using this release at a race.

C5MK V1.2.2: direct USB to RotorHazard, Raspberry Pi included

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 18 Oct 18:29

C5MK V1.2.2: direct USB to RotorHazard, Raspberry Pi included

Every change is in direct USB timing with RotorHazard; the UART link to
FPVGate is unchanged from 1.2.1. Direct USB now works on Linux and the
Raspberry Pi, where RotorHazard could not find the C5. Thanks to SanderPuh,
Hazard and pigodfpv for the reports behind these fixes.

What's changed

  • RotorHazard finds the C5 on Linux and the Raspberry Pi. On Linux,
    opening the C5's USB port resets the C5, and RotorHazard then waits 2 s
    without reading before asking for the revision code. The scanner output the
    C5 sent in that time was held by the computer's USB serial driver and
    reached RotorHazard ahead of the reply, so it reported "Unable to fetch
    revision code for serial node" or found one node with API level 254. Each
    retry reopened the port and reset the C5 again. After a reset the C5 now
    sends nothing on USB until the computer sends something, scanner output
    still queued when RotorHazard takes the port is dropped, and the bootloader
    logs only warnings. Windows does not reset the C5 when the port opens,
    which is why discovery worked there.
  • Stray serial input no longer blocks discovery. An unfinished or
    overflowed console line could stop the C5 recognising RotorHazard's revision
    request, even across RotorHazard restarts.
  • RotorHazard keeps its USB session. 1.2.1 handed USB back to the console
    after 5 s without a command, but RotorHazard only starts polling once a
    browser connects, so a quiet start lost the node. The session now lasts until
    a console command line (status, scan, node, ...) asks for USB back.
  • Node API 36 and seats turned off. RotorHazard 4.5 no longer shows its
    "update your node firmware" notice, its frequency check passes, and a seat
    it turns off (frequency 1111) really stops being scanned.
  • Peaks on the live graph at their true height. The RSSI RotorHazard shows
    is the highest sample of about the last 250 ms, and its history and Marshal
    page get the peak or nadir since each poll at its own sample time.
  • No blips after a frequency change. No crossing starts for 100 ms after
    any frequency change, while the scan's filters restart.
  • VTX start-up and channel-change bursts are ignored. A jump straight off
    the noise floor is hidden from RotorHazard for 90 ms and dropped if it falls
    back sooner; anything that lasts counts as usual, timed from its peak. node reject on the console tunes it; node reject 0 turns it off.
  • Fast passes show as crossings. The crossing flag RotorHazard reads stays
    set for 250 ms after a pass. Lap counts and times are unchanged.

The C5 dashboard and mp.py send a command when they connect, so they are
unaffected by the C5 staying quiet after a reset; mp.py console shows nothing
until a line is typed.

No recalibration is needed after 1.2.1: crossings use the same readings.

Installing

Choose c5zero for Waveshare ESP32-C5-Zero or xiaoc5 for Seeed XIAO ESP32-C5.
The files below are prefixed with those board names. Each board needs its
matching firmware; the UART pins differ. Or use
the web flasher.

A C5 already on 1.1.0 or later can update through FPVGate's C5 Receiver
Firmware page over the UART link: 1.2.2 keeps the 1.1.0 partition layout. That
updates the firmware but not the bootloader, so a C5 used directly with
RotorHazard on Linux should get the USB flash below.

A C5 on 1.0 or earlier needs the full USB flash because 1.1.0 changed the
partition layout. Rename the downloaded board-prefixed files to the names
below, or use the unprefixed files in release/<board>/ at the release tag:

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

Close any RotorHazard or browser serial connection before a USB flash, then
unplug and reconnect the C5. Do not use RotorHazard's STM32 node updater on the
C5.

Flashing instructions
and USB setup for RotorHazard.

Validation and limitations

  • On a Raspberry Pi 4 (Raspberry Pi OS Bookworm, 64-bit) with stock
    RotorHazard 4.4.0 and a Waveshare C5-Zero, 1.2.2-rc.3 failed discovery five
    times and then found one node with API level 254. This fix found eight seats
    at API 36 at the first attempt in all seven server starts (as 1.2.2-rc.4 and
    as this release image), with no read or write errors.
  • Meter, UART/node, reference-host and USB protocol suites pass on Windows and
    on the Pi: 60, 1201, 48 and 305 checks, plus eleven USB parser scenarios.
    Five tests driving stock RotorHazard 4.4.0's serial-node client and six Linux
    PTY discovery tests pass on the Pi.
  • On 1.2.2-beta.3, a Waveshare C5-Zero on USB with stock RotorHazard
    4.5.0-beta.1 ran 9.5 hours overnight without a stall or reboot.
  • A XIAO ESP32-C5 behind a XIAO S3 running FPVGate held 1035-1040 readings per
    second per pilot for 7.5 hours on 1.2.2-beta.3, and updated through the gate
    to 1.2.2-rc.3.
  • Both board targets build and pass the SRAM guard.
  • Not yet tested: the XIAO ESP32-C5 over USB with RotorHazard, a race with laps
    through RotorHazard on the Pi, and a full race event.
  • A VTX that overshoots by one channel for longer than 90 ms when changing
    channel can still count once on the channel above. node reject 30 250
    holds jumps for 250 ms instead.
  • In a flight test over USB, EnterAt and ExitAt needed a much wider gap than on
    an RX5808 node: the C5 samples each seat about 1000 times a second, so fast
    fades cross a narrow gap many times. Leave at least 20-30 between them.

C5MK V1.2.2-RC.3: recover RotorHazard USB discovery

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 18 Oct 14:00

C5MK V1.2.2-RC.3: recover RotorHazard USB discovery

Release candidate for Waveshare ESP32-C5-Zero and Seeed XIAO ESP32-C5.
Includes the USB timing improvements from 1.2.2-rc.1 and fixes discovery after
unexpected serial input. The UART link and 1.1.0 partition layout are unchanged.

USB discovery fix

An unfinished console line could prevent the C5 from recognising RotorHazard's
revision request. RH then reported "Unable to fetch revision code for serial
node". Restarting RH left the partial line intact, so discovery kept failing
even though the C5 had finished booting.

The revision request can now claim USB after partial or overflowed console
input. Ordinary console commands still work, and an active S3/UART controller
still prevents USB takeover.

This fixes a reproduced failure mechanism. It does not establish what sent
unexpected bytes on the reported Raspberry Pi installations.

Included from 1.2.2-rc.1

  • RH retains its USB session while idle, until a console command requests it.
  • Node API 36, frequency verification and disabled seats are supported.
  • Live RSSI and history retain short peaks between RH polls.
  • Frequency-change settling and brief VTX start-up burst rejection reduce blips.
  • The crossing indicator stays visible for 250 ms after a short pass.

Installing

Choose xiaoc5 for the Seeed XIAO ESP32-C5 or c5zero for the Waveshare
ESP32-C5-Zero. Download that board's four prefixed binaries and rename them to
the unprefixed names below, or use the web flasher.

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

Close RH and other serial tools before flashing, then unplug and reconnect the
C5. Do not use RH's STM32 node updater. A C5 on 1.1.0 or later can also update
through FPVGate's C5 Receiver Firmware page over UART. An older partition layout
needs the full USB flash. No recalibration is needed after 1.2.2-rc.1.

For direct USB timing, leave the S3 disconnected, add the C5 serial port in RH's
Advanced Settings and restart RH. See the
USB setup guide.

Validation and limitations

  • The original parser fails the partial-input regression; the fixed parser passes.
  • Portable suites pass: 60 meter/framing checks, 1201 node/UART checks, 48 host
    checks, 305 RH protocol checks and nine USB parser scenarios.
  • Five integration tests using stock RH 4.5.0-beta.1's serial client pass.
  • Six Linux PTY tests pass with real pySerial, termios, RH delays and retries:
    clean discovery, partial input, overflow, tty echo, fragmented replies and
    repeated discovery without resetting the device process. The original
    parser fails two discovery attempts and recovers after a newline.
  • Both board targets build and pass the SRAM guard.

The Linux tests simulate device transport and radio; they do not emulate Pi
hardware, USB enumeration, CDC control lines or the cdc_acm driver. The full RH
web server is not launched. This candidate has not been flashed and tested on
the affected user's Pi or validated at a full race event.

C5MK 1.2.2-rc.1: direct USB to RotorHazard, fixed and quieter

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 16 Oct 17:38

C5MK 1.2.2-rc.1: direct USB to RotorHazard, fixed and quieter

A release candidate. Every change is in direct USB timing with RotorHazard;
the UART link to FPVGate is unchanged from 1.2.1. Thanks to SanderPuh and
Hazard for the reports behind them.

What's changed

  • RotorHazard keeps its USB session. 1.2.1 handed USB back to the console
    after 5 s without a command, but RotorHazard only starts polling once a
    browser connects, so a quiet start lost the node: "Unable to fetch revision
    code" and a flood of WRITE_CURNODE_INDEX errors. The session now lasts until
    a console command line (status, scan, node, ...) asks for USB back.
  • Node API 36 and seats turned off. RotorHazard 4.5 no longer shows its
    "update your node firmware" notice, its frequency check passes, and a seat
    it turns off (frequency 1111) really stops being scanned.
  • Peaks on the live graph at their true height. The RSSI RotorHazard shows
    is the highest sample of about the last 250 ms, and its history and Marshal
    page get the peak or nadir since each poll at its own sample time. Before,
    a short pass could fall between RotorHazard's reads and never appear.
  • No blips after a frequency change. No crossing starts for 100 ms after
    any frequency change, while the scan's filters restart.
  • VTX start-up and channel-change bursts are ignored. A VTX powering on
    or changing channel sweeps through other channels for 10-200 ms, and each
    of those could count as a crossing. A jump straight off the noise floor is
    now hidden from RotorHazard for 90 ms (RSSI, history, NodePeak and
    crossing) and dropped if it falls back sooner; anything that lasts counts
    as usual, timed from its peak. A quad flying the course never sits on the
    noise floor, so passes are not affected. node reject on the console tunes
    it; node reject 0 turns it off.
  • Fast passes show as crossings. RotorHazard reads the crossing flag
    about every 100 ms and a fast pass can be over EnterAt for less, so the
    flag now stays set for 250 ms after a pass. Lap counts and times are
    unchanged.

No recalibration is needed after 1.2.1: crossings use the same readings.

Installing

Choose c5zero for Waveshare ESP32-C5-Zero or xiaoc5 for Seeed XIAO ESP32-C5.
The files below are prefixed with those board names. Each board needs its
matching firmware; the UART pins differ.

A C5 already on 1.1.0 or later can update through FPVGate's C5 Receiver
Firmware page over the UART link: 1.2.2-rc.1 keeps the 1.1.0 partition layout.

A C5 on 1.0 or earlier needs the full USB flash because 1.1.0 changed the
partition layout. Rename the downloaded board-prefixed files to the names
below, or use the unprefixed files in release/<board>/ at the release tag:

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

Close any RH or browser serial connection before a USB flash. Do not use RH's
STM32 node updater on the C5.

Flashing instructions
and USB setup for RotorHazard.

Validation and limitations

  • Meter, UART/node, reference-host and USB protocol suites passed: 60, 1201,
    48 and 305 checks, plus 5 tests driving RotorHazard 4.5.0-beta.1's own
    serial-node client.
  • On 1.2.2-beta.3 (this release less the burst rejection and crossing
    flag), a Waveshare C5-Zero on USB with stock RotorHazard 4.5.0-beta.1 ran
    9.5 hours overnight without a stall or reboot: 17 RotorHazard restarts after
    10-85 s idle all found the node, 135 channel changes and 51 seat off/on
    cycles were all accepted, and 95,000 malformed frames did no harm.
  • On the bench with a VTX: a parked VTX on any Raceband channel left the
    other seven at the noise floor; the power-on sweep and most stepping
    bursts no longer count; no pass lost in 10 swipes.
  • A XIAO ESP32-C5 behind a XIAO S3 running FPVGate held 1035-1040 readings
    per second per pilot for 7.5 hours on 1.2.2-beta.3, and updated to
    1.2.2-beta.5 over the link.
  • Not yet tested: the XIAO ESP32-C5 over USB, and a full race event.
  • A VTX that overshoots by one channel for longer than 90 ms when changing
    channel can still count once on the channel above. node reject 30 250
    holds jumps for 250 ms instead, for anyone who wants to try it.
  • Once, after RotorHazard was killed in the middle of its USB session, the
    C5 stopped answering until it was reset; it did not happen again. Unplug
    and replug the C5 if RotorHazard reports no receiver nodes.
  • In a flight test over USB, EnterAt and ExitAt needed a much wider gap than
    on an RX5808 node: the C5 samples each seat about 1000 times a second, so
    fast fades cross a narrow gap many times. Leave at least 20-30 between them.

C5MK 1.2.1: steadier RSSI

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 14 Oct 13:04

C5MK 1.2.1: steadier RSSI

A receiver fix: readings no longer spike after hops, and a steady signal
holds still instead of wandering. Thanks to RaceFPV, who found the cause
(#1).

What's changed

  • The C5 used to rewrite its fixed receive gain after every hop, even when it
    was already set, and each rewrite briefly disturbed the receiver. It now
    checks the gain first and writes it only if it has changed or been cleared.
  • Through FPVGate at about 1030 readings per second per pilot (XIAO
    ESP32-C5, 8 Raceband pilots, VTX off): R1's largest false bump fell from
    224 to 13.5 RSSI counts, and its spread from 24 to 3.9, the same as the
    other seven channels.
  • A VTX on R6 read about 5 dB stronger and about three times steadier
    (spread 14.1 to 5.2 counts).
  • On the C5-Zero's USB scanner, raw readings more than 6 dB over the noise
    floor fell from 61 to 3 in about 97,000.
  • No change in rate, timing, gaps or the noise floor.
  • The build is pinned to pioarduino platform 55.03.35 (ESP-IDF 5.5.1)
    instead of the moving "stable" release.

Recalibrate after updating

A steady signal now reads about 3-6 dB higher than on 1.2.0 and earlier.
EnterAt/ExitAt thresholds and gate calibrations made on older firmware will
sit low: run auto-calibrate in FPVGate, or Sensor Tuning in RotorHazard,
again after updating.

Installing

Choose c5zero for Waveshare ESP32-C5-Zero or xiaoc5 for Seeed XIAO ESP32-C5.
The files below are prefixed with those board names. Each board needs its
matching firmware; the UART pins differ.

A C5 already on 1.1.0 or 1.2.0 can update through FPVGate's C5 Receiver
Firmware page over the UART link: 1.2.1 keeps the 1.1.0 partition layout.

A C5 on 1.0 or earlier needs the full USB flash because 1.1.0 changed the
partition layout. Rename the downloaded board-prefixed files to the names
below, or use the unprefixed files in release/<board>/ at the release tag:

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

Close any RH or browser serial connection before a USB flash. Do not use RH's
STM32 node updater on the C5.

Flashing instructions,
USB setup for RotorHazard
and the measurements.

Validation and limitations

  • Meter, UART/node, reference-host and USB protocol suites passed: 60, 1201,
    48 and 160 checks.
  • Both board firmware builds passed their SRAM guard checks.
  • Tested on a Waveshare C5-Zero (gain 30) and on a XIAO ESP32-C5 behind a
    XIAO S3 running FPVGate (gain 31), with and without a VTX on R6; updated
    over the link and back.
  • Tested at gains 30 and 31 only. Direct USB to RotorHazard runs with the
    change but the RSSI comparison there was inconclusive and is being
    repeated.

C5MK 1.2.0: direct USB timing with RotorHazard

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 13 Oct 19:26

C5MK 1.2.0: direct USB timing with RotorHazard

C5MK can now connect directly to the computer running RotorHazard over USB,
without an ESP32-S3, Wi-Fi connection, FPVGate plugin or RH core changes.

What's new

  • One C5 exposes eight native RH serial receivers with independent frequency
    and EnterAt/ExitAt controls, live RSSI and standard Sensor Tuning capture.
  • RH's revision request selects USB timing mode automatically. The same
    board-specific firmware retains the existing S3/UART receiver connection;
    there is no separate USB-only image.
  • Crossing detection uses every successful scan sample. Passes are timed at
    the midpoint of their highest RSSI plateau on the C5 clock and reported
    through RH's API 35 serial-node protocol.
  • USB ownership does not take the radio from an active S3. Five seconds
    without valid RH requests releases it. Invalid frames and stale samples
    cannot complete an old crossing.

Installing

Choose c5zero for Waveshare ESP32-C5-Zero or xiaoc5 for Seeed XIAO ESP32-C5.
The files below are prefixed with those board names. Each board needs its
matching firmware; the UART pins differ.

A C5 on 1.0 or earlier needs the full USB flash because 1.1.0 changed the
partition layout. Rename the downloaded board-prefixed files to the names
below, or use the unprefixed files in release/<board>/ at the release tag:

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

1.2.0 retains the 1.1.0 partition layout. Existing 1.1.0 receivers can update
through FPVGate's C5 Receiver Firmware page over the UART link. Close any RH
or browser serial connection before a USB flash. Do not use RH's STM32 node
updater on the C5.

For direct USB, add the C5's port under Advanced Settings > Hardware > Serial
Ports
in RH and restart RH. Calibrate each enabled receiver in Sensor Tuning.
The port is configured once; this release does not add automatic OS port
registration or change RH's unplug/replug recovery. Don't use USB RH and an
S3 to control the same receiver simultaneously.

USB setup and limitations
and flashing instructions.

Validation and limitations

  • 160 USB protocol checks and four integration tests using stock RH's actual
    serial-node client passed.
  • Existing meter, UART/node and reference-host suites passed: 60, 1201 and 48
    checks respectively.
  • Both board firmware builds passed their SRAM guard checks.
  • Waveshare C5-Zero was flashed with the development version of this code:
    eight R1-R8 receivers and live RSSI were verified through RH. The tester
    then reported timing working in the local RH setup.
  • Physical XIAO USB testing is still pending. Eight-pilot RF detection,
    unplug/replug behaviour and timing accuracy against video are not validated
    by these checks.

USB reports the existing C5 filtered RSSI, scaled to RH's valid 1-254 range.
It does not add Widscan58's 255 ms median filter or send the full 1 kHz trace
to Marshal. Only the latest pass per receiver is retained between host reads.
Recalibrate thresholds for your receiver position and test before an event.

C5MK 1.1.0: firmware updates over the link

Choose a tag to compare

@LouisHitchcock LouisHitchcock released this 12 Oct 11:34

C5MK 1.1.0 can be updated through FPVGate, over the existing link, with no USB cable on the C5.

What's new

  • Firmware updates over the link. FPVGate 1.9.0-Multi-Alpha-3 and later can send new C5 firmware from Settings > System > C5 Receiver Firmware. The gate checks the image is for the C5's board, and the new firmware runs on trial: if it can't reach the gate within 60 s, the C5 goes back to its previous firmware.
  • The status line now reports the firmware version and board (1.1.0, c5zero or xiaoc5). Hosts that read only the first four fields keep working.

Installing

1.1.0 changes the flash layout to make room for updates, so a C5 on 1.0 or earlier needs one USB flash with all four files for its board:

esptool --chip esp32c5 --port <port> --baud 921600 write_flash --flash_mode dio --flash_freq 80m --flash_size 4MB 0x2000 bootloader.bin 0x8000 partitions.bin 0xf000 ota_data_initial.bin 0x20000 firmware.bin

The files are attached below, prefixed with the board (c5zero- for the Waveshare ESP32-C5-Zero, xiaoc5- for the Seeed XIAO ESP32-C5). They are also in the repository under release/<board>/, with full instructions in release/README.md. After that, later updates go through the gate.

The update protocol is documented in docs/LINK_PROTOCOL.md.