Skip to content

Firmware Dongle v14

OneSeventyFour edited this page May 15, 2026 · 2 revisions

Dongle firmware v14

Released 2026-05
Status Superseded by v15
Pairs with receiver v15+
Predecessor v10
Notable OTA reliability overhaul — flash_recover escalation + hardware WDT.

Downloads

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

Release notes

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() and Serial.print() inside the OTA hot path now calls yield(), 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 OtaFlashDriver now escalates 0 → 1 → 2 across host attempts 4 / 6 / 8.

  • flash_recover is idempotent: if the requested chunk is already <= otaLastAckedChunk it acks from cached state with no radio work.

  • flash_ping liveness command emits OP <millis> <att> <acked>\n immediately 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_RETRIES 6 → 4, OTA_RECOVERY_ROUNDS 4 → 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.

Upgrade notes

  • 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.

How to flash

Clone this wiki locally