-
Notifications
You must be signed in to change notification settings - Fork 3
Firmware Dongle v14
| Released | 2026-05 |
| Status | Superseded by v15 |
| Pairs with receiver | v15+ |
| Predecessor | v10 |
| Notable | OTA reliability overhaul — flash_recover escalation + hardware WDT. |
| File | Purpose | Download |
|---|---|---|
os4_dongle_v14.bin |
App partition. | Download |
os4_dongle_v14.bootloader.bin |
Chip bootloader. | Download |
os4_dongle_v14.partitions.bin |
Partition table. | Download |
os4_dongle_v14.boot_app0.bin |
OTA "next-app" pointer. | Download |
OTA dongle lockup recovery / link-fail mitigation.
-
Per-second status JSON is no longer emitted during OTA. The full status frame is ~400–500 B; with a 256 B USB-CDC TX ring buffer + the per-byte
setTxTimeoutMs(50)backstop, a single status print while the host was slow to drain could block the main loop for 20+ seconds, manifesting as "dongle locked up". We now emit a ~30 B compact heartbeat (OS att acked retries last\n) instead. -
Every
radio.write()andSerial.print()inside the OTA hot path now callsyield(), which releases the CPU to FreeRTOS so the USB-CDC service task can drain the TX ring buffer between operations. -
flash_recover <idx> [<level>]accepts an escalating recovery level:- 0 = stored-frame replay (current behavior)
- 1 = soft radio recovery (flush FIFOs + reapply config) + replay
- 2 = full
radio.begin()restart + reapply + 250 kbps probe
Host-side
OtaFlashDrivernow escalates 0 → 1 → 2 across host attempts 4 / 6 / 8. -
flash_recoveris idempotent: if the requested chunk is already<= otaLastAckedChunkit acks from cached state with no radio work. -
flash_pingliveness command emitsOP <millis> <att> <acked>\nimmediately so the host can detect a wedged dongle without consuming a chunk-retry slot. -
Hardware task watchdog (
esp_task_wdt) at 20 s as last-resort safety net. If the OTA path ever truly wedges, the dongle resets cleanly instead of staying mute. -
Tightened per-chunk recovery budget:
OTA_PER_CHUNK_RETRIES6 → 4,OTA_RECOVERY_ROUNDS4 → 2. Worst-case wall time per failed chunk drops from ~2.1 s to ~600 ms, so a transient burst of interference no longer chokes the serial pipe for seconds at a time — the host gets the NACK and decides whether to retry or recover.
- Strongly recommended if you do OTA in any kind of RF-noisy environment. Pre-v14 dongles could deadlock the host pipe under prolonged interference.
- No wire-protocol break.
Getting started
- Overview
- Desktop installers (macOS / Windows)
- macOS
- Linux
- Windows
- Production vs Development
- Connecting the dongle
- Flash a receiver
- Flash a dongle
- OTA flashing
Raspberry Pi
System overview
Subsystems
Hardware
- Receiver firmware
- Dongle firmware
- RF protocol
- Contributor Portal — BOMs, schematics, and board resources
UI walkthrough
Reference
Downloads
- Firmware
- Installers
Module Build & User Guides
- Cue
- Receiver
- Dongle