Merge branch 'bugfix/rollback_the_breaking_change_of_i2s_cb_event_data' into 'master'

fix(i2s): rollback the breaking change of i2s cb event data

See merge request espressif/esp-idf!29896
This commit is contained in:
Kevin (Lao Kaiyao)
2024-03-29 15:55:17 +08:00
7 changed files with 39 additions and 14 deletions

View File

@@ -498,6 +498,10 @@ uint32_t i2s_get_source_clk_freq(i2s_clock_src_t clk_src, uint32_t mclk_freq_hz)
return clk_freq; return clk_freq;
} }
/* Temporary ignore the deprecated warning of i2s_event_data_t::data */
#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wdeprecated-declarations"
#if SOC_GDMA_SUPPORTED #if SOC_GDMA_SUPPORTED
static bool IRAM_ATTR i2s_dma_rx_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data) static bool IRAM_ATTR i2s_dma_rx_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data)
{ {
@@ -513,7 +517,8 @@ static bool IRAM_ATTR i2s_dma_rx_callback(gdma_channel_handle_t dma_chan, gdma_e
esp_cache_msync((void *)finish_desc->buf, handle->dma.buf_size, ESP_CACHE_MSYNC_FLAG_INVALIDATE); esp_cache_msync((void *)finish_desc->buf, handle->dma.buf_size, ESP_CACHE_MSYNC_FLAG_INVALIDATE);
#endif #endif
i2s_event_data_t evt = { i2s_event_data_t evt = {
.data = (void *)finish_desc->buf, .data = &(finish_desc->buf),
.dma_buf = (void *)finish_desc->buf,
.size = handle->dma.buf_size, .size = handle->dma.buf_size,
}; };
if (handle->callbacks.on_recv) { if (handle->callbacks.on_recv) {
@@ -543,7 +548,8 @@ static bool IRAM_ATTR i2s_dma_tx_callback(gdma_channel_handle_t dma_chan, gdma_e
finish_desc = (lldesc_t *)event_data->tx_eof_desc_addr; finish_desc = (lldesc_t *)event_data->tx_eof_desc_addr;
void *curr_buf = (void *)finish_desc->buf; void *curr_buf = (void *)finish_desc->buf;
i2s_event_data_t evt = { i2s_event_data_t evt = {
.data = curr_buf, .data = &(finish_desc->buf),
.dma_buf = curr_buf,
.size = handle->dma.buf_size, .size = handle->dma.buf_size,
}; };
if (handle->dma.auto_clear_before_cb) { if (handle->dma.auto_clear_before_cb) {
@@ -562,6 +568,7 @@ static bool IRAM_ATTR i2s_dma_tx_callback(gdma_channel_handle_t dma_chan, gdma_e
xQueueReceiveFromISR(handle->msg_queue, &dummy, &need_yield1); xQueueReceiveFromISR(handle->msg_queue, &dummy, &need_yield1);
if (handle->callbacks.on_send_q_ovf) { if (handle->callbacks.on_send_q_ovf) {
evt.data = NULL; evt.data = NULL;
evt.dma_buf = NULL;
user_need_yield |= handle->callbacks.on_send_q_ovf(handle, &evt, handle->user_data); user_need_yield |= handle->callbacks.on_send_q_ovf(handle, &evt, handle->user_data);
} }
} }
@@ -596,7 +603,8 @@ static void IRAM_ATTR i2s_dma_rx_callback(void *arg)
if (handle && (status & I2S_LL_EVENT_RX_EOF)) { if (handle && (status & I2S_LL_EVENT_RX_EOF)) {
i2s_hal_get_in_eof_des_addr(&(handle->controller->hal), (uint32_t *)&finish_desc); i2s_hal_get_in_eof_des_addr(&(handle->controller->hal), (uint32_t *)&finish_desc);
evt.data = (void *)finish_desc->buf; evt.data = &(finish_desc->buf);
evt.dma_buf = (void *)finish_desc->buf;
evt.size = handle->dma.buf_size; evt.size = handle->dma.buf_size;
if (handle->callbacks.on_recv) { if (handle->callbacks.on_recv) {
user_need_yield |= handle->callbacks.on_recv(handle, &evt, handle->user_data); user_need_yield |= handle->callbacks.on_recv(handle, &evt, handle->user_data);
@@ -605,6 +613,7 @@ static void IRAM_ATTR i2s_dma_rx_callback(void *arg)
xQueueReceiveFromISR(handle->msg_queue, &dummy, &need_yield1); xQueueReceiveFromISR(handle->msg_queue, &dummy, &need_yield1);
if (handle->callbacks.on_recv_q_ovf) { if (handle->callbacks.on_recv_q_ovf) {
evt.data = NULL; evt.data = NULL;
evt.dma_buf = NULL;
user_need_yield |= handle->callbacks.on_recv_q_ovf(handle, &evt, handle->user_data); user_need_yield |= handle->callbacks.on_recv_q_ovf(handle, &evt, handle->user_data);
} }
} }
@@ -635,7 +644,8 @@ static void IRAM_ATTR i2s_dma_tx_callback(void *arg)
if (handle && (status & I2S_LL_EVENT_TX_EOF)) { if (handle && (status & I2S_LL_EVENT_TX_EOF)) {
i2s_hal_get_out_eof_des_addr(&(handle->controller->hal), (uint32_t *)&finish_desc); i2s_hal_get_out_eof_des_addr(&(handle->controller->hal), (uint32_t *)&finish_desc);
void *curr_buf = (void *)finish_desc->buf; void *curr_buf = (void *)finish_desc->buf;
evt.data = curr_buf; evt.data = &(finish_desc->buf);
evt.dma_buf = curr_buf;
evt.size = handle->dma.buf_size; evt.size = handle->dma.buf_size;
// Auto clear the dma buffer before data sent // Auto clear the dma buffer before data sent
if (handle->dma.auto_clear_before_cb) { if (handle->dma.auto_clear_before_cb) {
@@ -664,6 +674,8 @@ static void IRAM_ATTR i2s_dma_tx_callback(void *arg)
} }
#endif #endif
#pragma GCC diagnostic pop
/** /**
* @brief I2S DMA interrupt initialization * @brief I2S DMA interrupt initialization
* @note I2S will use GDMA if chip supports, and the interrupt is triggered by GDMA. * @note I2S will use GDMA if chip supports, and the interrupt is triggered by GDMA.

View File

@@ -65,9 +65,9 @@ typedef struct {
* it should be the multiple of `3` when the data bit width is 24. * it should be the multiple of `3` when the data bit width is 24.
*/ */
union { union {
bool auto_clear; /*!< Alias of `auto_clear_after_cb` to be compatible with previous version */ bool auto_clear; /*!< Alias of `auto_clear_after_cb` */
bool auto_clear_after_cb; /*!< Set to auto clear DMA TX buffer after `on_sent` callback, I2S will always send zero automatically if no data to send. bool auto_clear_after_cb; /*!< Set to auto clear DMA TX buffer after `on_sent` callback, I2S will always send zero automatically if no data to send.
* So that user can assign the data to the DMA buffers directly in the callback, and the data won't be cleared after quitted the callback. * So that user can assign the data to the DMA buffers directly in the callback, and the data won't be cleared after quit the callback.
*/ */
}; };
bool auto_clear_before_cb; /*!< Set to auto clear DMA TX buffer before `on_sent` callback, I2S will always send zero automatically if no data to send bool auto_clear_before_cb; /*!< Set to auto clear DMA TX buffer before `on_sent` callback, I2S will always send zero automatically if no data to send

View File

@@ -63,7 +63,10 @@ typedef enum {
* @brief Event structure used in I2S event queue * @brief Event structure used in I2S event queue
*/ */
typedef struct { typedef struct {
void *data; /**< The pointer of DMA buffer that just finished sending or receiving for `on_recv` and `on_sent` callback void *data __attribute__((deprecated)); /**< (Deprecated) The secondary pointer of DMA buffer that just finished sending or receiving for `on_recv` and `on_sent` callback
* NULL for `on_recv_q_ovf` and `on_send_q_ovf` callback
*/
void *dma_buf;/**< The first level pointer of DMA buffer that just finished sending or receiving for `on_recv` and `on_sent` callback
* NULL for `on_recv_q_ovf` and `on_send_q_ovf` callback * NULL for `on_recv_q_ovf` and `on_send_q_ovf` callback
*/ */
size_t size; /**< The buffer size of DMA buffer when success to send or receive, size_t size; /**< The buffer size of DMA buffer when success to send or receive,

View File

@@ -912,10 +912,10 @@ finish:
static IRAM_ATTR bool i2s_tx_on_sent_callback(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx) static IRAM_ATTR bool i2s_tx_on_sent_callback(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx)
{ {
uint32_t *data = (uint32_t *)(event->data); uint32_t *dma_buf = (uint32_t *)(event->dma_buf);
size_t len = event->size / sizeof(uint32_t); size_t len = event->size / sizeof(uint32_t);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
data[i] = i + TEST_I2S_BUF_DATA_OFFSET; dma_buf[i] = i + TEST_I2S_BUF_DATA_OFFSET;
} }
return false; return false;
} }
@@ -923,11 +923,11 @@ static IRAM_ATTR bool i2s_tx_on_sent_callback(i2s_chan_handle_t handle, i2s_even
static IRAM_ATTR bool i2s_rx_on_recv_callback(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx) static IRAM_ATTR bool i2s_rx_on_recv_callback(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx)
{ {
bool *received = (bool *)user_ctx; bool *received = (bool *)user_ctx;
uint32_t *data = (uint32_t *)(event->data); uint32_t *dma_buf = (uint32_t *)(event->dma_buf);
size_t len = event->size / sizeof(uint32_t); size_t len = event->size / sizeof(uint32_t);
for (int i = 0; i < len; i++) { for (int i = 0; i < len; i++) {
if (data[i] == TEST_I2S_BUF_DATA_OFFSET) { if (dma_buf[i] == TEST_I2S_BUF_DATA_OFFSET) {
for (int j = 0; i < len && data[i] == (j + TEST_I2S_BUF_DATA_OFFSET); i++, j++); for (int j = 0; i < len && dma_buf[i] == (j + TEST_I2S_BUF_DATA_OFFSET); i++, j++);
if (i == len) { if (i == len) {
*received = true; *received = true;
break; break;

View File

@@ -27,7 +27,7 @@
static bool IRAM_ATTR test_i2s_tx_done_callback(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx) static bool IRAM_ATTR test_i2s_tx_done_callback(i2s_chan_handle_t handle, i2s_event_data_t *event, void *user_ctx)
{ {
int *is_triggered = (int *)user_ctx; int *is_triggered = (int *)user_ctx;
if (*(uint8_t *)(event->data) != 0) { if (event->dma_buf != 0) {
*is_triggered = 1; *is_triggered = 1;
} }
return false; return false;

View File

@@ -55,3 +55,8 @@ Secure Element
The ATECC608A secure element interfacing example has been moved to `ESP Cryptoauthlib Repository <https://github.com/espressif/esp-cryptoauthlib/tree/master/examples/atecc608_ecdsa>`_ on GitHub. The ATECC608A secure element interfacing example has been moved to `ESP Cryptoauthlib Repository <https://github.com/espressif/esp-cryptoauthlib/tree/master/examples/atecc608_ecdsa>`_ on GitHub.
This example is also part of the `esp-cryptoauthlib <https://components.espressif.com/component/espressif/esp-cryptoauthlib>`_ in the component manager registry. This example is also part of the `esp-cryptoauthlib <https://components.espressif.com/component/espressif/esp-cryptoauthlib>`_ in the component manager registry.
I2S
-------
Due to the cumbersome usage of the secondary pointer of DMA buffer, the ``data`` field in the callback event :cpp:type:`i2s_event_data_t` is deprecated, please use the newly added first-level pointer ``dma_buf`` instead.

View File

@@ -55,3 +55,8 @@
ATECC608A 安全元素接口示例现已移至 GitHub 上的 `esp-cryptoauthlib 仓库 <https://github.com/espressif/esp-cryptoauthlib/tree/master/examples/atecc608_ecdsa>`_ 中。 ATECC608A 安全元素接口示例现已移至 GitHub 上的 `esp-cryptoauthlib 仓库 <https://github.com/espressif/esp-cryptoauthlib/tree/master/examples/atecc608_ecdsa>`_ 中。
该示例也是组件管理器注册表中 `esp-cryptoauthlib <https://components.espressif.com/component/espressif/esp-cryptoauthlib>`_ 的一部分。 该示例也是组件管理器注册表中 `esp-cryptoauthlib <https://components.espressif.com/component/espressif/esp-cryptoauthlib>`_ 的一部分。
I2S
-------
回调事件 :cpp:type:`i2s_event_data_t` 中指向 DMA 数组的二级指针 ``data`` 因使用过于繁琐已被弃用,请使用新增的指向 DMA 数组的一级指针 ``dma_buf`` 字段代替。