Two chipsFlash each separately

The REBOOT target byte picks the chip.

ChipRebootFlashed over
Device chiptarget = 0The same CH343 serial link, with esptool.
Host chiptarget = 1USB3. The device chip relays the reboot over the inter-chip link.

Version schememajor.minor.patch

Both chips carry the same firmware version, stamped into their app descriptors from one source. Binary and tag can't drift.

The protocol version is a separate byte that a host checks for compatibility. The firmware version identifies the build. QUERY(VERSION) returns both.

Notes

A run reboot (target = 2 or 3) is the only software cold-reboot. DTR/RTS aren't wired to reset on this board.

After a download reboot the port stays in the ROM bootloader (plain ASCII the frame decoder ignores) until flashing finishes or the box is power-cycled. Persisted per-box data survives an app reflash.

REBOOT needs working firmware to receive the frame. For a chip with no firmware or a bad image, hold its BOOT button while resetting or powering on the box.

From Rust, the crate's firmware update calls write both chips over the open connection.