From f69b30d6ffb26fdc8b0c63c482d57c732e3b9976 Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 7 Apr 2023 10:05:11 +0800 Subject: [PATCH 1/2] i2s: fix interrupt flag of pdm rx mode Forgot to update in PR https://github.com/espressif/esp-idf/pull/10997 --- components/driver/i2s/i2s_pdm.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/components/driver/i2s/i2s_pdm.c b/components/driver/i2s/i2s_pdm.c index 03f2ff6ee908..655666373e3d 100644 --- a/components/driver/i2s/i2s_pdm.c +++ b/components/driver/i2s/i2s_pdm.c @@ -456,7 +456,7 @@ esp_err_t i2s_channel_init_pdm_rx_mode(i2s_chan_handle_t handle, const i2s_pdm_r } #endif ESP_GOTO_ON_ERROR(i2s_pdm_rx_set_clock(handle, &pdm_rx_cfg->clk_cfg), err, TAG, "initialize channel failed while setting clock"); - ESP_GOTO_ON_ERROR(i2s_init_dma_intr(handle, ESP_INTR_FLAG_LEVEL1), err, TAG, "initialize dma interrupt failed"); + ESP_GOTO_ON_ERROR(i2s_init_dma_intr(handle, I2S_INTR_ALLOC_FLAGS), err, TAG, "initialize dma interrupt failed"); i2s_ll_rx_enable_pdm(handle->controller->hal.dev); #if SOC_I2S_HW_VERSION_2 From 3e294f7ede76c0b1e0f949ae3ba30de491a56beb Mon Sep 17 00:00:00 2001 From: laokaiyao Date: Fri, 7 Apr 2023 14:28:49 +0800 Subject: [PATCH 2/2] i2s: fixed the test case I2S_thread_concurrent_safety_test --- components/driver/i2s/i2s_common.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/components/driver/i2s/i2s_common.c b/components/driver/i2s/i2s_common.c index e4399b44926d..3f5d887ba267 100644 --- a/components/driver/i2s/i2s_common.c +++ b/components/driver/i2s/i2s_common.c @@ -1030,11 +1030,13 @@ esp_err_t i2s_channel_disable(i2s_chan_handle_t handle) ESP_GOTO_ON_FALSE(handle->state > I2S_CHAN_STATE_READY, ESP_ERR_INVALID_STATE, err, TAG, "the channel has not been enabled yet"); /* Update the state to force quit the current reading/writing operation */ handle->state = I2S_CHAN_STATE_READY; + /* Waiting for reading/wrinting operation quit + * It should be acquired before assigning the pointer to NULL, + * otherwise may cause NULL pointer panic while reading/writing threads haven't release the lock */ + xSemaphoreTake(handle->binary, portMAX_DELAY); /* Reset the descriptor pointer */ handle->dma.curr_ptr = NULL; handle->dma.rw_pos = 0; - /* Waiting for reading/wrinting operation quit */ - xSemaphoreTake(handle->binary, portMAX_DELAY); handle->stop(handle); #if CONFIG_PM_ENABLE esp_pm_lock_release(handle->pm_lock);