ESP32 CSI Node firmware v0.6.7
Tag: v0.6.7-esp32
Date: 2026-05-23
Branch: adr-110-esp32c6 (PR #764)
ADR: ADR-110 P9 — software-only unblocks
What's new
Two software-only unblocks for items previously blocked on hardware in WITNESS-LOG-110.md §B. Both new modules default off so v0.6.6 fleets see zero behavior change after an OTA upgrade.
1. Real LP-core motion-gate program (B4 code path complete)
A real RISC-V LP-core program (firmware/esp32-csi-node/main/lp_core/main.c) replaces the v0.6.6 esp_deep_sleep_enable_gpio_wakeup ext1 fallback. When CONFIG_C6_LP_CORE_ENABLE=y the LP coprocessor polls a single LP-IO GPIO at LP-timer cadence (default 10 ms), debounces N consecutive matching samples (default 3), and wakes the HP core via ulp_lp_core_wakeup_main_processor(). HP-side deep-sleep entry uses esp_sleep_enable_ulp_wakeup so esp_sleep_get_wakeup_cause() returns ESP_SLEEP_WAKEUP_ULP.
The LP program exports motion_count and poll_count shared symbols, surfaced to the rest of the firmware as c6_lp_core_motion_count() / c6_lp_core_poll_count() for the witness harness. Once an INA226 / Joulescope is on the bench, B4 ("≤5 µA average for battery seed nodes") is one capture away from a measured number — the code path is now in place.
New Kconfig:
CONFIG_C6_LP_POLL_PERIOD_US— LP-timer cadence (default 10000)CONFIG_C6_LP_DEBOUNCE_SAMPLES— consecutive matches required (default 3)
2. Wi-Fi 6 soft-AP with TWT Responder (B1/B2 cheap unblock)
c6_softap_he.{h,c} brings up the C6 in WIFI_MODE_APSTA with WPA2-PSK and HE advertised. Pair two C6 boards — one in CONFIG_C6_SOFTAP_HE_ENABLE=y mode acting as the iTWT-capable AP, the other in default STA mode running c6_twt_setup_default() — and a real iTWT agreement can be negotiated and the resulting CSI cadence measured. No 11ax router needed.
New Kconfig:
CONFIG_C6_SOFTAP_HE_ENABLE(default n)CONFIG_C6_SOFTAP_HE_SSID(defaultruview-c6-twt)CONFIG_C6_SOFTAP_HE_PSK(defaultruviewtwt)CONFIG_C6_SOFTAP_HE_CHANNEL(default 6)
NVS overrides (namespace ruview):
softap_ssid(string)softap_psk(string, ≥8 chars)softap_chan(u8, 1–13)
Build artifacts
Both targets compile clean on ESP-IDF v5.4. Default config — LP-core off, soft-AP HE off — so no behavior change vs v0.6.6 for the shipped fleet.
| Target | Binary | Size | Partition slack |
|---|---|---|---|
esp32s3
| esp32-csi-node-s3-8mb.bin
| 1093 KB | 47 % (8 MB) |
esp32c6
| esp32-csi-node-c6-4mb.bin
| 1019 KB | 45 % (4 MB) |
SHA-256 sums recorded in SHA256SUMS.txt.
Flash
# ESP32-S3 on COM9 (8 MB)
python -m esptool --chip esp32s3 -p COM9 -b 460800 write_flash \
0x0 bootloader-s3.bin \
0x8000 partition-table-s3.bin \
0xf000 ota_data_initial-s3.bin \
0x20000 esp32-csi-node-s3-8mb.bin
# ESP32-C6 on COM6 (4 MB)
python -m esptool --chip esp32c6 -p COM6 -b 460800 write_flash \
0x0 bootloader-c6.bin \
0x8000 partition-table-c6.bin \
0xf000 ota_data_initial-c6.bin \
0x20000 esp32-csi-node-c6-4mb.binTo enable the new features
LP-core motion gate — bench with a PIR / accelerometer on a wake-capable LP-IO pin:
# In firmware/esp32-csi-node/, append to sdkconfig.defaults.esp32c6:
CONFIG_C6_LP_CORE_ENABLE=y
CONFIG_C6_LP_WAKE_GPIO=4
CONFIG_C6_LP_WAKE_ACTIVE_HIGH=y
CONFIG_C6_LP_POLL_PERIOD_US=10000
CONFIG_C6_LP_DEBOUNCE_SAMPLES=3
# Rebuild + flash, then attach an INA in series with the 3V3 rail to capture
# the average current with the HP core in deep sleep.Soft-AP HE/TWT bench — two C6 boards, one acts as the AP:
# Board #1 (AP role): append to sdkconfig.defaults.esp32c6:
CONFIG_C6_SOFTAP_HE_ENABLE=y
CONFIG_C6_SOFTAP_HE_SSID="ruview-c6-twt"
CONFIG_C6_SOFTAP_HE_PSK="ruviewtwt"
CONFIG_C6_SOFTAP_HE_CHANNEL=6
# Board #2 (STA role): provision to associate with the SSID above. The existing
# c6_twt_setup_default() runs on connect and now negotiates real iTWT against
# the cooperative C6 AP.Roll-forward path
- B4 measurement: solder INA226 between C6 dev board V_BUS and the 3V3
regulator input, log average current over a 60 s LP-core-armed cycle. - B1/B2 measurement: capture beacon from board #1 with a Wireshark-capable
card (or another C6 in sniffer mode), confirmHE CapabilitiesIE and
TWT Responder=1. Then capture iTWT setup exchange and per-frame CSI
cadence jitter against the negotiated wake interval.