ruview @ v0.6.7-esp32
integrity
- size
- 59.4 MiB
- downloaded
- last checked
release notes
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.bin
To 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), confirm
HE CapabilitiesIE andTWT Responder=1. Then capture iTWT setup exchange and per-frame CSI cadence jitter against the negotiated wake interval.
download
curl -fL -o v0.6.7-esp32.zip https://ratatoskr.space/pkg/ruview/v0.6.7-esp32.zip
printf '%s %s\n' '380fba983620724ef23a8bc0a1cabb9d40818ab620797893a66124a53446605a' 'v0.6.7-esp32.zip' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.6.7-esp32.zip"
$out = "v0.6.7-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "380fba983620724ef23a8bc0a1cabb9d40818ab620797893a66124a53446605a") { throw "sha256 mismatch" }
curl -fL -o v0.6.7-esp32.tar.gz https://ratatoskr.space/pkg/ruview/v0.6.7-esp32.tar.gz
printf '%s %s\n' '9c3d1ba5699703293a5ff01f57a627efc394abbe4725ec2af65e37a5afee989c' 'v0.6.7-esp32.tar.gz' | sha256sum -c -
$url = "https://ratatoskr.space/pkg/ruview/v0.6.7-esp32.tar.gz"
$out = "v0.6.7-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "9c3d1ba5699703293a5ff01f57a627efc394abbe4725ec2af65e37a5afee989c") { throw "sha256 mismatch" }
download via yggdrasil mesh
curl -fL -o v0.6.7-esp32.zip http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.7-esp32.zip
printf '%s %s\n' '380fba983620724ef23a8bc0a1cabb9d40818ab620797893a66124a53446605a' 'v0.6.7-esp32.zip' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.7-esp32.zip"
$out = "v0.6.7-esp32.zip"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "380fba983620724ef23a8bc0a1cabb9d40818ab620797893a66124a53446605a") { throw "sha256 mismatch" }
curl -fL -o v0.6.7-esp32.tar.gz http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.7-esp32.tar.gz
printf '%s %s\n' '9c3d1ba5699703293a5ff01f57a627efc394abbe4725ec2af65e37a5afee989c' 'v0.6.7-esp32.tar.gz' | sha256sum -c -
$url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.7-esp32.tar.gz"
$out = "v0.6.7-esp32.tar.gz"
Invoke-WebRequest -Uri $url -OutFile $out
if ((Get-FileHash $out -Algorithm SHA256).Hash.ToLowerInvariant() -ne "9c3d1ba5699703293a5ff01f57a627efc394abbe4725ec2af65e37a5afee989c") { throw "sha256 mismatch" }
| artifact | format | size | hashes |
|---|---|---|---|
| v0.6.7-esp32.zip | zip | 59.4 MiB |
blake3-24 82216a4de44d2dac694b9d5ea2db2865b14f9dedef2aa7fd
sha256 380fba983620724ef23a8bc0a1cabb9d40818ab620797893a66124a53446605a
sha1 f7636b089e0e1d440624f73b824568d2d3a8a3be
|
| v0.6.7-esp32.tar.gz | tar.gz | 57.9 MiB |
blake3-24 fde95845dcb2146a34cf907929746f7dfd46ff2ba0eb0980
sha256 9c3d1ba5699703293a5ff01f57a627efc394abbe4725ec2af65e37a5afee989c
sha1 b19d17a6151c3466e103905974afe08a445e1303
|
install
http_archive(
name = "ruview",
urls = ["https://ratatoskr.space/pkg/ruview/v0.6.7-esp32.tar.gz"],
integrity = "sha256-nD0bpWmXAyk6X/AfV6Yn78OUq75HJewq9l43pa/umJw=",
strip_prefix = "ruview-v0.6.7-esp32",
)
.url = "https://ratatoskr.space/pkg/ruview/v0.6.7-esp32.tar.gz",
install via yggdrasil mesh
http_archive(
name = "ruview",
urls = ["http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.7-esp32.tar.gz"],
integrity = "sha256-nD0bpWmXAyk6X/AfV6Yn78OUq75HJewq9l43pa/umJw=",
strip_prefix = "ruview-v0.6.7-esp32",
)
.url = "http://14cc7d57b5e70f679b851fe5b272ce17c70632ff4beb5b35ab64bc706b2485af.pk.ygg/pkg/ruview/v0.6.7-esp32.tar.gz",