Highlights
SPI flash cache crash fixed. ESP32-S3 nodes were crashing in cache_ll_l1_resume_icache / wDev_ProcessFiq after ~2400 CSI callbacks under high promiscuous-mode load. Validated on COM7: 3000 callbacks, 0 crashes during 4-min soak.
Fixes
- MGMT-only promiscuous filter — narrows to
WIFI_PROMIS_FILTER_MASK_MGMT(~10 Hz beacons, was 100–500 Hz with DATA frames included) - 50 Hz callback rate gate —
CSI_MIN_PROCESS_INTERVAL_USearly-drops excess callbacks before any work happens CONFIG_ESP_WIFI_EXTRA_IRAM_OPT=y— defense-in-depth against cache pressure- Defensive
node_idcapture — moved beforewifi_init_sta();g_nvs_configwas being clobbered by WiFi driver init on some devices, revertingnode_idto Kconfig default - Defensive
filter_maccopy — module-local statics insulate the CSI callback from the same clobber path provision.pyesptool v5 compat — reverts towrite_flash(works with both esptool 4.x bundled with ESP-IDF v5.4 and standalone esptool 5.x)
Closes #232 #375 #385 #386 #390 #396, supersedes #397.
Binaries
| File | Variant | Size |
|---|---|---|
esp32-csi-node.bin
| 8 MB flash | 866 KB |
bootloader.bin
| bootloader | 18 KB |
partition-table.bin
| 8 MB layout | 3 KB |
ota_data_initial.bin
| OTA boot data | 8 KB |
esp32-csi-node-4mb.bin
| 4 MB flash (SuperMini) | 872 KB |
partition-table-4mb.bin
| 4 MB layout | 3 KB |
Flash via esptool
python -m esptool --chip esp32s3 -b 460800 \
--before default_reset --after hard_reset \
write_flash --flash_mode dio --flash_size 8MB --flash_freq 80m \
0x0 bootloader.bin \
0x8000 partition-table.bin \
0xf000 ota_data_initial.bin \
0x20000 esp32-csi-node.binFor 4 MB SuperMini, swap --flash_size 4MB and use the -4mb files.
Validation
Tested on real ESP32-S3 (COM7, MAC 3c:0f:02:e9:b5:f8):
- Build clean: 866 KB, 54 % flash free
- Flash: 5.7 s @ 1221 kbit/s, hash verified
- Soak: 3000 callbacks across 240 s, breathing rate 9.2 br/min, 0 crashes, 0 drops