Repository navigation
Commit 65138d5
espressif/audiopwmio: keep all ISR state in internal RAM
gptimer_register_event_callbacks() returned ESP_ERR_INVALID_ARG on the
FunHouse, so the alarm callback was never installed: the timer ran, no
alarm was ever delivered, nothing consumed samples, and play() left
`playing` true forever.
The driver is built with CONFIG_GPTIMER_ISR_CACHE_SAFE (selected by
CONFIG_GPTIMER_ISR_HANDLER_IN_IRAM, which defaults on), so
gptimer_register_event_callbacks() requires the callback in IRAM and its
user context in internal RAM. The callback was fine; the user context was
not. It was `self`, a MicroPython heap object, and port_malloc() takes
MALLOC_CAP_SPIRAM first, so on any board with PSRAM the whole object is
external.
Clearing that check alone would not be enough. A cache-safe ISR can run
while the flash cache is disabled, which happens during any flash write,
including the user saving code.py, so everything it dereferences has to be
in internal RAM. Follow the pattern common-hal/frequencyio already uses:
put the ISR-reachable state in an audiopwmio_internal_data_t allocated
with MALLOC_CAP_INTERNAL and pass that as the user context. The LEDC
channel numbers are copied in too, so the ISR no longer reaches into the
pwmio objects. The audio buffers move to heap_caps_malloc(MALLOC_CAP_
INTERNAL) for the same reason, capped so a large sample fails with
ESP_ERR_NO_MEM rather than exhausting internal RAM. The refill path still
runs in task context and reaches the object as before.
Buffers now hold one value per output channel rather than always a stereo
pair, which halves the internal RAM a mono output needs.
play() asserts esp_ptr_in_iram() for the callback and esp_ptr_internal()
for the control block and both buffers, so a regression surfaces there
instead of as a fault at a random later moment. Error paths report the
underlying esp_err_t through raise_esp_error() instead of a generic
message.
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>1 parent a2338c9 commit 65138d5
2 files changed
Lines changed: 177 additions & 109 deletions
0 commit comments