forked from espressif/esp-idf
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:
@@ -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.
|
||||||
|
@@ -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
|
||||||
|
@@ -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,
|
||||||
|
@@ -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;
|
||||||
|
@@ -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;
|
||||||
|
@@ -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.
|
||||||
|
@@ -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`` 字段代替。
|
||||||
|
Reference in New Issue
Block a user