ESP32-S3 CSI node firmware — two field-reported sensing bugs fixed and validated on real hardware (ESP32-S3 QFN56 rev v0.2, 8MB flash / 2MB PSRAM).
Fixes
- #1000 — no CSI on a bare/display-less DevKit. The SH8601 QSPI AMOLED is write-only, so panel init "succeeds" even with no panel attached; that false-positive left
display_is_active()true and starved CSI at MGMT-only frames. Now the readable FT3168 touch controller gates it: no touch readback → run headless → CSI upgrades to MGMT+DATA. (PR #1121) - #1107 — false MR60BHA2 detection → ENOMEM. UART probe now requires a validated MR60 header (8-byte SOF + checksum + type
0x0A__/0x0F09) instead of counting bare0x01bytes, so an empty UART no longer false-detects a sensor. (PR #1119)
Hardware validation (boot log, rev v0.2 silicon)
disp_hal: SH8601 panel init OK (368x448) # write-only panel "succeeds" on bare board
disp_hal: FT3168 not found (ret=ESP_FAIL) # touch readback fails — no real panel
disp_task: ... running headless so CSI captures (#1000)
csi_collector: CSI filter upgraded to MGMT+DATA (no display, RuView#893)
mmwave: No mmWave sensor detected (CSI-only mode) # no false detect on empty UART
CSI streamed cleanly (frames len 128→384/256), 600 callbacks / 22s, zero crash or watchdog.
Flashing
ESP32-S3, esptool offsets:
esptool --chip esp32s3 -p <PORT> -b 460800 write_flash \
0x0 bootloader.bin 0x8000 partition-table.bin \
0xf000 ota_data_initial.bin 0x20000 esp32-csi-node-s3-8mb.bin
4MB (no-display) boards: use esp32-csi-node-s3-4mb.bin @ 0x20000 and partition-table-4mb.bin @ 0x8000.
SHA-256
0a66190d…36822 esp32-csi-node-s3-8mb.bin
b818e358…f6e7c2 esp32-csi-node-s3-4mb.bin
dda279df…d8a216 bootloader.bin
67222c25…4d322b partition-table.bin
4c2cc4ff…0d81f0 partition-table-4mb.bin
7d2c7ac4…82c62f ota_data_initial.bin
App version 0.7.0 · ESP-IDF v5.4 · built from main @ 65e29ef. Binaries are the exact bytes flashed during hardware validation.