Root cause of FM/DAB "stonata" audio: xtalCtun=31/nominal XTAL_FREQ defaults were never measured against this board's actual crystal (Abracon ABM8-19.200MHZ-10-1-U-T, CL=10pF, two external 15pF load caps). Fixed via CTUN trim by ear (31->0) plus a new live calibration loop that reads the Si4684's own FM_RSQ FREQOFF field (broadcast carriers are GPS-locked, so it's a free precision frequency reference) to trim XTAL_FREQ with no lab equipment. Converged to CTUN=0, XTAL_FREQ=19199750 Hz, residual -3/-4 ppm cross-checked on two stations. New tools/infrastructure (kept, not one-off): - Si4684Driver::recalibrateXtal() + POST /api/tuner/xtal-calibrate: live crystal re-trim without an ESP32 reflash. - FM_RSQ FREQOFF exposed as "freqoff_ppm" in GET /api/tuner/status. - tools/si4684_xtal_calibration.py: automates the trim loop. - tools/si4684_antenna_calibration.py: AN851 Appendix A ANTCAP/VARM/VARB sweep tool (same session, separate calibration). - CONFIG_ESP32_I2S_TEST_TONE (off by default): isolates Si4684-specific audio issues from shared-downstream ones by writing a tone directly over the I2S bus the Si4684 also uses. - SIGMA_WRITE_REGISTER_BLOCK/sigma_safeload_block now retry on NACK and verify via read-back instead of firing I2C writes blind. - FM de-emphasis set to European 50us (was left at the US 75us default). - DAB_ACF_ENABLE restored to its previous 0x0000 with a citation explaining why (tested the datasheet default of 0x0003, made things audibly worse). See docs/si4684-rf-investigation-report.md's 2026-08-23 entry for the full elimination chain and docs/TODO.md for follow-up work (persisting calibration results to EEPROM instead of requiring a firmware edit). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
DigiRadio — companion-chip firmware assets
Binary and SigmaStudio exports loaded by the ESP32 at every boot (fw 0.8.3).
| Directory | Chip | In git? | Loaded by |
|---|---|---|---|
ADAU1701-Firmware/ |
ADAU1701 SigmaDSP | Yes (headers) | Adau1701Driver — RAM program every boot |
Si4684-Firmware/ |
Si4684 DAB+/FM | README only | Si4684Driver — HOST_LOAD embedded blobs |
Before first device build
Si4684 application images are proprietary and gitignored. Populate locally:
cd Software
python3 tools/fetch_si4684_firmware.py --dab-only
python3 tools/fetch_si4684_firmware.py --si46xx-dir /path/to/si46xx_firmware
python3 tools/check_si4684_blobs.py
ls Firmware/Si4684-Firmware/*.bin # expect 3 files
Without blobs, idf.py build fails at embed/link time.
Full procurement and legal notes: Si4684-Firmware/README.md.
Si4684 blobs
| File | Role |
|---|---|
rom_patch_016.bin |
ROM patch (HOST_LOAD before main image) |
dab_firmware.bin |
DAB+ application (PE5PVB / Skyworks) |
fm_firmware.bin |
FM application (Skyworks eval or community source) |
Boot sequence: AN649 — POWER_UP → LOAD_INIT → HOST_LOAD(patch) → LOAD_INIT → HOST_LOAD(image) → BOOT.
ADAU1701 export
SigmaStudio project DigiRadio — exported headers replayed over I2C on every
boot (no self-boot EEPROM). Runtime EQ/mixer/enhancements via safeload and the
Web UI Audio tab (/api/audio/*).
Details: ADAU1701-Firmware/README.md · manual:
docs/manual/ch-adau1701.tex, docs/manual/ch-sigmastudio.tex.
Security note
User settings (Wi-Fi, presets, audio profiles) live in encrypted NVS, not in
this folder. See docs/security-flash-nvs.md.