BLE provisioning used protocomm Security1 with the device serial number as proof-of-possession, on the reasoning that pairing should require reading something off the physical unit. In practice the companion app has no easy way to read that serial without a manual step, so it was deriving the PoP from the BLE advertising name instead (DigiRadio-XXXX -> XXXX) -- but that name is broadcast openly to any scanner, so it was never actually secret. The PoP added app/firmware coupling (an exact-match string derived independently on both sides) without adding real secrecy, and a mismatch there was silently blocking provisioning entirely. Switched to Security0 (no PoP, no encryption) -- the same trust level as the SoftAP setup path this runs alongside, which is already an open network. Separately, bumped the nvs partition from 24 KiB to 64 KiB. The small original size was a suspected contributor to intermittent NvsAudioProfileStore::saveProfile() store_failed under this project's accumulated write traffic (wifi creds, station_list, audio_profile_json, last_preset) -- flagged but not applied in an earlier commit today. otadata/nvs_keys/phy_init shift forward to make room; they still fit before ota_0's existing 64 KiB alignment boundary, so ota_0/ota_1/dsp stay at their original offsets. Applied via idf.py erase-flash flash (required whenever partition offsets move) and verified: fresh boot enters SoftAP + BLE setup mode with no partition-table warnings, and the previously-saved FM ANTCAP calibration (stored in the 24AA025E48 EEPROM, unaffected by the NVS partition change) still applies automatically after re-provisioning Wi-Fi. Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_0178rASQ6ZETPMUamvpoR2KR
1.1 KiB
1.1 KiB
| 1 | # DigiRadio partition table (16 MB flash — ESP32-S3-WROOM-1) |
|---|---|
| 2 | # ota_0 + ota_1: dual OTA app slots (equal size, 64 KiB aligned). |
| 3 | # dsp: updatable ADAU1701 program blob (task 3.1). |
| 4 | # nvs_keys: NVS encryption keys (secure-store slice). |
| 5 | # First flash after this layout: idf.py erase-flash flash (wired), not OTA. |
| 6 | # nvs: bumped 24 KiB -> 64 KiB (2026-08-19) — the small original size was a |
| 7 | # suspected contributor to intermittent NvsAudioProfileStore::saveProfile() |
| 8 | # store_failed under this project's accumulated write traffic (wifi creds, |
| 9 | # station_list, audio_profile_json, last_preset). otadata/nvs_keys/phy_init |
| 10 | # shift forward to make room; they still fit before ota_0's existing 64 KiB |
| 11 | # alignment boundary (0x20000), so ota_0/ota_1/dsp offsets are unchanged. |
| 12 | # Name, Type, SubType, Offset, Size, Flags |
| 13 | nvs, data, nvs, 0x9000, 0x10000, |
| 14 | otadata, data, ota, 0x19000, 0x2000, |
| 15 | nvs_keys, data, nvs_keys, 0x1b000, 0x1000, |
| 16 | phy_init, data, phy, 0x1c000, 0x1000, |
| 17 | ota_0, app, ota_0, 0x20000, 0x400000, |
| 18 | ota_1, app, ota_1, 0x420000, 0x400000, |
| 19 | dsp, data, 0x40, 0x820000, 0x40000, |