Releases: hbentel/M5Stack-Unit-CamS3-5MP
Releases · hbentel/M5Stack-Unit-CamS3-5MP
Release list
v0.2.7
- Fix OTA rollback-confirmation crash (moved before Wi-Fi starts) - Fix OTA SHA-256 chunked hashing - Fix /setup POST body truncation, add XSS hardening - Fix frame_pool init leak, JPEG EOI search UB - config_mgr setter validation
v0.2.6
fix: increase frame pool from 3 to 5 slots to prevent exhaustion A concurrent GET / snapshot holds a pool ref while sending ~150KB over HTTP. Combined with a worker mid-send on the previous frame, all 3 slots could be occupied simultaneously, stalling the broadcaster for up to 5s and triggering Frigate's 20s ffmpeg watchdog. 5 slots (2.5MB PSRAM) eliminates the exhaustion window: snapshot(1) + worker(1) + broadcaster(1) still leaves 2 free slots. Also adds check_fw.sh utility script and removes stale coredump.elf. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.2.5
fix: move recovery_mgr_init before Wi-Fi, port SHA-256 to PSA Crypto - recovery_mgr_init() called nvs_commit() after Wi-Fi and MQTT were already running. nvs_commit disables the OPI PSRAM cache; concurrent PSRAM access by Wi-Fi/MQTT tasks caused ExcCause=7 crash (confirmed via coredump: wifi task crashed while main task was at recovery_mgr.c:67 nvs_set_i32). Fix: move recovery_mgr_init() to before wifi_init_sta() — no PSRAM-accessing tasks are alive at that point, making the NVS write safe. - sha256_buffer() used legacy mbedtls_sha256_* context API which was removed in mbedTLS 4.0 (IDF v6). Replaced with psa_hash_compute() from PSA Crypto API, compatible with both IDF v5 (mbedTLS 3.x) and IDF v6 (mbedTLS 4.0). Fixes CI build failure on IDF v6 job. Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.2.4
feat: OTA token auth, SHA-256 verification, and coredump Bearer auth
Security hardening for the OTA and coredump endpoints:
- OTA token auth: unitcams3/ota/set requires JSON {"url":"...","token":"..."}
when OTA token is configured; bare URL still accepted when token is empty
- OTA SHA-256: optional sha256 field verified against full PSRAM firmware
buffer before any flash write; hash stored in RTC_NOINIT_ATTR alongside URL
- Coredump Bearer auth: GET /api/coredump requires Authorization: Bearer token
when coredump token is configured; 401 with WWW-Authenticate on failure
- /setup page: OTA Token and Coredump Token fields added; values never
reflected in HTML (placeholder only); POST preserves existing token if
field left blank
- config_mgr: ota_token and cd_token fields backed by NVS + Kconfig fallbacks
- IPC task stack raised to 2048 bytes (fixes boot-time double-exception)
- esp_driver_gpio removed from mqtt_mgr; LED GPIO moved to main.c callback
- Docs: CHANGELOG v0.2.4, CLAUDE.md, ARCHITECTURE.md, SECURITY.md, README.md
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.2.3
v0.2.3: Atomic reference-counted zero-copy MJPEG and production stabi…
v0.2.2
v0.2.2: Production hardening and stable startup refinements
v0.2.1
v0.2.1: Multi-client MJPEG support and critical stability fixes Major Features: - Asynchronous multi-client MJPEG streaming (up to 5 clients). - Broadcaster idling to save PSRAM bandwidth and heat. - 'active_streams' metric via HTTP and MQTT. - Firmware version display on /setup and /health. Critical Bug Fixes: - Forced internal RAM for stacks to prevent Double Exception crashes during flash writes. - Fixed main task stack overflow during startup. - Fixed mDNS 'Service already exists' error. - Fixed race condition in MQTT telemetry task. - Fixed race condition in camera_reinit.
v0.2.0
Fix Unsupported warnings and OTA rollback race - Remove set_whitebal, set_awb_gain, set_gain_ctrl from apply_camera_settings(): all three are wired to set_dummy in mega_ccm.c (W mega_ccm: Unsupported noise) - Remove now-unused CAM_AWB and CAM_AGC defines - ota_mgr_run_pending(): call recovery_mgr_signal_planned_reboot() before the OTA-complete esp_restart() so the new firmware boots with boot_count=0; previously two crashes post-OTA would trip the boot-loop threshold Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
v0.1.3 — Code review clean-up
Changes
- Stale RTSP naming removed —
RECOVERY_ERR_RTSP_SENDrenamed toRECOVERY_ERR_STREAM_SEND; the RTSP server was removed in an earlier phase. - Build warning: CONFIG_APP_UPDATE — orphaned/unknown symbol removed from
sdkconfig.defaults. - Build warning: CAMERA_DMA_BUFFER_SIZE_MAX — Kconfig range extended to 65536 to match the value in use (was generating an out-of-range warning).
- Empty
camera_mgrcomponent — removed empty directory that was causing CMake component warnings.
v0.1.2 — Bug fixes from code review
Bug fixes
- Resolution options corrected —
/setuppage now shows QVGA/VGA/HD/UXGA (PY260-native sizes only). Previous options SVGA/XGA are not supported by the sensor and caused a boot loop. - NVS validation — invalid resolution values loaded from NVS are now detected and reset to VGA instead of causing a boot loop.
- MQTT image controls fixed — brightness (0–8), contrast (0–6), saturation (0–6) now match driver-native ranges. Previous -2..2 range silently did nothing.
- XCLK validation — invalid XCLK frequency now returns a proper error instead of relying on assert() which is disabled in production builds.
- Deinit ordering — ISR freed before queue deletion to prevent ISR writing to a deleted queue.
- Camera task stack size wired to CONFIG_CAMERA_TASK_STACK_SIZE Kconfig symbol.