From b22964cc4f7680e7ce84cadd361fa1155ea30b35 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Tue, 18 Mar 2025 16:20:15 +0800 Subject: [PATCH 1/2] fix(i2s): fixed mismatch of the i2s and gdma iram-safe config Closes https://github.com/espressif/esp-idf/issues/15533 --- components/esp_driver_i2s/Kconfig | 1 + components/esp_driver_i2s/i2s_private.h | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/components/esp_driver_i2s/Kconfig b/components/esp_driver_i2s/Kconfig index 72628d820e..919b6ec143 100644 --- a/components/esp_driver_i2s/Kconfig +++ b/components/esp_driver_i2s/Kconfig @@ -3,6 +3,7 @@ menu "ESP-Driver:I2S Configurations" config I2S_ISR_IRAM_SAFE bool "I2S ISR IRAM-Safe" default n + select GDMA_ISR_IRAM_SAFE if SOC_GDMA_SUPPORTED help Ensure the I2S interrupt is IRAM-Safe by allowing the interrupt handler to be executable when the cache is disabled (e.g. SPI Flash write). diff --git a/components/esp_driver_i2s/i2s_private.h b/components/esp_driver_i2s/i2s_private.h index b875c08f0b..e87032b47f 100644 --- a/components/esp_driver_i2s/i2s_private.h +++ b/components/esp_driver_i2s/i2s_private.h @@ -40,7 +40,7 @@ extern "C" { // If ISR handler is allowed to run whilst cache is disabled, // Make sure all the code and related variables used by the handler are in the SRAM -#if CONFIG_I2S_ISR_IRAM_SAFE +#if CONFIG_I2S_ISR_IRAM_SAFE || CONFIG_GDMA_ISR_IRAM_SAFE #define I2S_INTR_ALLOC_FLAGS (ESP_INTR_FLAG_IRAM | ESP_INTR_FLAG_INTRDISABLED | ESP_INTR_FLAG_SHARED) #define I2S_MEM_ALLOC_CAPS (MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT) #else From 5bc5fd34d674b88ed2ea1f548121ad80b55231da Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Thu, 20 Mar 2025 16:55:17 +0800 Subject: [PATCH 2/2] fix(i2s): add check for i2s DMA buffer array allocation Closes https://github.com/espressif/esp-idf/issues/15607 --- components/esp_driver_i2s/i2s_common.c | 1 + 1 file changed, 1 insertion(+) diff --git a/components/esp_driver_i2s/i2s_common.c b/components/esp_driver_i2s/i2s_common.c index 5d23e1ef12..7d2950aa1d 100644 --- a/components/esp_driver_i2s/i2s_common.c +++ b/components/esp_driver_i2s/i2s_common.c @@ -493,6 +493,7 @@ esp_err_t i2s_alloc_dma_desc(i2s_chan_handle_t handle, uint32_t num, uint32_t bu handle->dma.desc = (lldesc_t **)heap_caps_calloc(num, sizeof(lldesc_t *), I2S_MEM_ALLOC_CAPS); ESP_GOTO_ON_FALSE(handle->dma.desc, ESP_ERR_NO_MEM, err, TAG, "create I2S DMA descriptor array failed"); handle->dma.bufs = (uint8_t **)heap_caps_calloc(num, sizeof(uint8_t *), I2S_MEM_ALLOC_CAPS); + ESP_GOTO_ON_FALSE(handle->dma.bufs, ESP_ERR_NO_MEM, err, TAG, "create I2S DMA buffer array failed"); for (int i = 0; i < num; i++) { /* Allocate DMA descriptor */ handle->dma.desc[i] = (lldesc_t *) i2s_dma_calloc(handle, 1, sizeof(lldesc_t));