e68909d64d
Main / Build (BookPlayer) (push) Has been cancelled
Main / Build (Brainfuck) (push) Has been cancelled
Main / Build (Breakout) (push) Has been cancelled
Main / Build (Calculator) (push) Has been cancelled
Main / Build (Diceware) (push) Has been cancelled
Main / Build (EpubReader) (push) Has been cancelled
Main / Build (GPIO) (push) Has been cancelled
Main / Build (GraphicsDemo) (push) Has been cancelled
Main / Build (HelloWorld) (push) Has been cancelled
Main / Build (M5UnitTest) (push) Has been cancelled
Main / Build (Magic8Ball) (push) Has been cancelled
Main / Build (MediaKeys) (push) Has been cancelled
Main / Build (MystifyDemo) (push) Has been cancelled
Main / Build (SerialConsole) (push) Has been cancelled
Main / Build (Snake) (push) Has been cancelled
Main / Build (TamaTac) (push) Has been cancelled
Main / Build (TodoList) (push) Has been cancelled
Main / Build (TwoEleven) (push) Has been cancelled
Main / Bundle (push) Has been cancelled
- Migrates tactility-app-development from ~/.hermes/skills/ into .claude/skills/ for repo co-location - Adds AGENTS.md with local workstation context, hardware table, board-direct build/env wrapper (PYTHONPATH fix), ELF missing-symbol triage, app patterns (immersive, QVGA rail, tutorial 2-row, GameKit bubbling, screenshot rate-limit), and skill index Refs: personal Gitea mirror
3.5 KiB
3.5 KiB
RLCD Audio Apps — Mp3Player & VoiceRecorder Fixes (2026-07-12)
Context
Waveshare RLCD 4.2" uses ES8311 DAC @0x18 + ES7210 mic ADC @0x40, MCLK=12.288MHz GPIO16, BCLK=9 WS=45 TX=8 RX=10 AMP=46 HIGH.
Working reference: MicroPython/test1/Screen/lib/audio_util.py + board_config.py WAVESHARE_RLCD profile.
Mp3Player Pitfalls
1. Task Stack & Priority
- Default
xTaskCreate(..., 4096, 5)→ stack overflow under minimp3 + SD + I2S + LVGL. - Log:
i2s_alloc_dma_desc failedsometimes masked as OOM, but also task crashes. - Fix:
6144, prio 6.
2. taskYIELD Causing Repetition
// Before: decode one MP3 frame (1152 samples @16k = 72ms) then:
taskYIELD(); // gives CPU to LVGL but DMA empties → repeats last buffer
// After: remove YIELD, loop tight, let I2S write block (250ms timeout) drive pacing
- DMA 4x120 = 30ms total, smaller than frame time → underrun → repetition. Increased driver DMA to 6x160 (~60ms) + removed YIELD.
3. Sample Rate Assumptions
- RLCD files in repo are 16k mono (faith-mysterious-garden/page001.mp3 31652 bytes, 16k 1ch).
I2S configured: 16000 Hz, 1 channels— must match ES8311 boot init that already programs 16k exact.- Reclock hook that rewrites ES8311 0x06/0x07/0x08 during I2S start causes pop. For 16k, skip entirely.
- MCLK multiple: 16k768=12.288MHz exact, 32k384, 48k*256. Default SDK 256 gives 4.096MHz for 16k → robot sound. See
tactility-firmware/references/rlcd-audio-fix.md.
VoiceRecorder Pitfalls
Mono vs Stereo for ES7210
Working MP:
i2s = I2S(1, sck=9, ws=45, sd=10, mode=I2S.RX, rate=16000, bits=16, format=I2S.STEREO)
# then mono extract: for i in 0..n step 4: mono[j]=buf[i:i+2]
- ES7210 outputs stereo (2 mics) even if you want mono file.
- VoiceRecorder previously requested
channel_right = NONE(mono slot mode) → driver expects 1 slot but codec sends 2 → low pitch mic-like. - Fix: Request
channel_right=1(STEREO), readAUDIO_BUF_SIZE(4096) stereo, downmix left channel in-place backward to avoid overwrite:
size_t mono_bytes = bytes_read/2;
for(int src=bytes_read-4, dst=mono_bytes-2; src>=0; src-=4, dst-=2){
buf[dst]=buf[src]; buf[dst+1]=buf[src+1];
}
fwrite(buf,1,mono_bytes,f);
- WAV header stays mono (1 ch, byterate 32000) – data correctly pitched.
TDM vs STD
- Other boards (m5stack-stackchan, tab5) use TDM 4-slot for ES7210 via
i2s_controller_set_rx_tdm_config. - RLCD working MP uses STD stereo, not TDM. Keep STD for RLCD. TDM path DMA also needs reduction (was 8x512 → 4x120) or OOM.
Firmware / Logging Interaction
File Lock Flood
File.cpp:getLock() logged WARN File lock function not set! on every listDirectory() – Tactility scans /sdcard every sec → 1Hz UART spam.
- UART ISR at 115200 contends with I2S GDMA ISR → jitter → small noises.
- Fix: once-only warning + listDir INFO→DEBUG.
I2S Pin Logs
esp32_i2s: Configuring I2S pins... logged INFO on every play → same jitter.
- Fix: LOG_D.
Verification Checklist
- Play 16k mono MP3: no pop at start, no robot, no repetition.
- Log after fix: no
File lock flood, noi2s_alloc_dma_desc failed. - Record WAV, download, play on PC: 16k mono correct pitch, not low/mic-like.
- Serial for voice:
I2S configured: 16000 Hz, 1 channelsfor play, stereo read for record is internal.
References
tactility-firmware/references/rlcd-audio-fix.md– GPIO5 conflict, correct pins, DMA OOM, MCLK, ES8311 reclock- MicroPython working code:
~/Projects/MicroPython/test1/Screen/lib/board_config.pyWAVESHARE_RLCD