From b1fac57687e8b26b271f88b64ce7aebe7c160b74 Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Tue, 12 Oct 2021 13:17:09 -0700 Subject: [PATCH] Esp32 i2s cleanup (#521) * ESP32 I2s deallocation * NULL pointers --- src/internal/DotStarEsp32DmaSpiMethod.h | 2 +- src/internal/Esp32_i2s.c | 23 ++++++++++++++++++++++- src/internal/Esp32_i2s.h | 2 ++ src/internal/NeoEsp32I2sMethod.h | 4 ++-- 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/src/internal/DotStarEsp32DmaSpiMethod.h b/src/internal/DotStarEsp32DmaSpiMethod.h index a9d149b..1b6f3de 100644 --- a/src/internal/DotStarEsp32DmaSpiMethod.h +++ b/src/internal/DotStarEsp32DmaSpiMethod.h @@ -127,7 +127,7 @@ public: ESP_ERROR_CHECK(ret); } free(_data); - free(_dmadata); + heap_caps_free(_dmadata); _spiHandle = NULL; } diff --git a/src/internal/Esp32_i2s.c b/src/internal/Esp32_i2s.c index 7c15b06..3662a45 100644 --- a/src/internal/Esp32_i2s.c +++ b/src/internal/Esp32_i2s.c @@ -126,6 +126,7 @@ static i2s_bus_t I2S[I2S_NUM_MAX] = { void IRAM_ATTR i2sDmaISR(void* arg); + bool i2sInitDmaItems(uint8_t bus_num) { if (bus_num >= I2S_NUM_MAX) { return false; @@ -170,13 +171,29 @@ bool i2sInitDmaItems(uint8_t bus_num) { I2S[bus_num].tx_queue = xQueueCreate(I2S_DMA_QUEUE_COUNT, sizeof(i2s_dma_item_t*)); if (I2S[bus_num].tx_queue == NULL) {// memory error log_e("MEM ERROR!"); - free(I2S[bus_num].dma_items); + heap_caps_free(I2S[bus_num].dma_items); I2S[bus_num].dma_items = NULL; return false; } return true; } +bool i2sDeinitDmaItems(uint8_t bus_num) { + if (bus_num >= I2S_NUM_MAX) { + return false; + } + if (!I2S[bus_num].tx_queue) { + return false; // nothing to deinit + } + + vQueueDelete(I2S[bus_num].tx_queue); + I2S[bus_num].tx_queue = NULL; + heap_caps_free(I2S[bus_num].dma_items); + I2S[bus_num].dma_items = NULL; + + return true; +} + esp_err_t i2sSetClock(uint8_t bus_num, uint8_t div_num, uint8_t div_b, uint8_t div_a, uint8_t bck, uint8_t bits) { if (bus_num >= I2S_NUM_MAX || div_a > 63 || div_b > 63 || bck > 63) { return ESP_FAIL; @@ -381,6 +398,10 @@ void i2sInit(uint8_t bus_num, esp_intr_enable(I2S[bus_num].isr_handle); } +void i2sDeinit(uint8_t bus_num) { + i2sDeinitDmaItems(bus_num); +} + esp_err_t i2sSetSampleRate(uint8_t bus_num, uint32_t rate, uint8_t bits) { if (bus_num >= I2S_NUM_MAX) { return ESP_FAIL; diff --git a/src/internal/Esp32_i2s.h b/src/internal/Esp32_i2s.h index 1249d2e..6907bcf 100644 --- a/src/internal/Esp32_i2s.h +++ b/src/internal/Esp32_i2s.h @@ -27,6 +27,8 @@ void i2sInit(uint8_t bus_num, size_t dma_count, size_t dma_len); +void i2sDeinit(uint8_t bus_num); + void i2sSetPins(uint8_t bus_num, int8_t out, bool invert); esp_err_t i2sSetClock(uint8_t bus_num, uint8_t div_num, uint8_t div_b, uint8_t div_a, uint8_t bck, uint8_t bits_per_sample); diff --git a/src/internal/NeoEsp32I2sMethod.h b/src/internal/NeoEsp32I2sMethod.h index 65645e0..f7bc5ab 100644 --- a/src/internal/NeoEsp32I2sMethod.h +++ b/src/internal/NeoEsp32I2sMethod.h @@ -170,9 +170,9 @@ public: } i2sSetPins(_bus.I2sBusNumber, -1, false); - + i2sDeinit(_bus.I2sBusNumber); free(_data); - free(_i2sBuffer); + heap_caps_free(_i2sBuffer); } bool IsReadyToUpdate() const