mirror of
https://github.com/espressif/esp-idf.git
synced 2024-10-05 20:47:46 -04:00
fix(i2s): add check to gdma callback register
This commit is contained in:
parent
67f0bfa8bc
commit
ab81888705
@ -696,6 +696,7 @@ static void IRAM_ATTR i2s_dma_tx_callback(void *arg)
|
|||||||
*/
|
*/
|
||||||
esp_err_t i2s_init_dma_intr(i2s_chan_handle_t handle, int intr_flag)
|
esp_err_t i2s_init_dma_intr(i2s_chan_handle_t handle, int intr_flag)
|
||||||
{
|
{
|
||||||
|
esp_err_t ret = ESP_OK;
|
||||||
i2s_port_t port_id = handle->controller->id;
|
i2s_port_t port_id = handle->controller->id;
|
||||||
ESP_RETURN_ON_FALSE((port_id >= 0) && (port_id < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "invalid handle");
|
ESP_RETURN_ON_FALSE((port_id >= 0) && (port_id < SOC_I2S_NUM), ESP_ERR_INVALID_ARG, TAG, "invalid handle");
|
||||||
#if SOC_GDMA_SUPPORTED
|
#if SOC_GDMA_SUPPORTED
|
||||||
@ -719,18 +720,18 @@ esp_err_t i2s_init_dma_intr(i2s_chan_handle_t handle, int intr_flag)
|
|||||||
dma_cfg.direction = GDMA_CHANNEL_DIRECTION_TX;
|
dma_cfg.direction = GDMA_CHANNEL_DIRECTION_TX;
|
||||||
/* Register a new GDMA tx channel */
|
/* Register a new GDMA tx channel */
|
||||||
ESP_RETURN_ON_ERROR(gdma_new_channel(&dma_cfg, &handle->dma.dma_chan), TAG, "Register tx dma channel error");
|
ESP_RETURN_ON_ERROR(gdma_new_channel(&dma_cfg, &handle->dma.dma_chan), TAG, "Register tx dma channel error");
|
||||||
ESP_RETURN_ON_ERROR(gdma_connect(handle->dma.dma_chan, trig), TAG, "Connect tx dma channel error");
|
ESP_GOTO_ON_ERROR(gdma_connect(handle->dma.dma_chan, trig), err1, TAG, "Connect tx dma channel error");
|
||||||
gdma_tx_event_callbacks_t cb = {.on_trans_eof = i2s_dma_tx_callback};
|
gdma_tx_event_callbacks_t cb = {.on_trans_eof = i2s_dma_tx_callback};
|
||||||
/* Set callback function for GDMA, the interrupt is triggered by GDMA, then the GDMA ISR will call the callback function */
|
/* Set callback function for GDMA, the interrupt is triggered by GDMA, then the GDMA ISR will call the callback function */
|
||||||
gdma_register_tx_event_callbacks(handle->dma.dma_chan, &cb, handle);
|
ESP_GOTO_ON_ERROR(gdma_register_tx_event_callbacks(handle->dma.dma_chan, &cb, handle), err2, TAG, "Register tx callback failed");
|
||||||
} else {
|
} else {
|
||||||
dma_cfg.direction = GDMA_CHANNEL_DIRECTION_RX;
|
dma_cfg.direction = GDMA_CHANNEL_DIRECTION_RX;
|
||||||
/* Register a new GDMA rx channel */
|
/* Register a new GDMA rx channel */
|
||||||
ESP_RETURN_ON_ERROR(gdma_new_channel(&dma_cfg, &handle->dma.dma_chan), TAG, "Register rx dma channel error");
|
ESP_RETURN_ON_ERROR(gdma_new_channel(&dma_cfg, &handle->dma.dma_chan), TAG, "Register rx dma channel error");
|
||||||
ESP_RETURN_ON_ERROR(gdma_connect(handle->dma.dma_chan, trig), TAG, "Connect rx dma channel error");
|
ESP_GOTO_ON_ERROR(gdma_connect(handle->dma.dma_chan, trig), err1, TAG, "Connect rx dma channel error");
|
||||||
gdma_rx_event_callbacks_t cb = {.on_recv_eof = i2s_dma_rx_callback};
|
gdma_rx_event_callbacks_t cb = {.on_recv_eof = i2s_dma_rx_callback};
|
||||||
/* Set callback function for GDMA, the interrupt is triggered by GDMA, then the GDMA ISR will call the callback function */
|
/* Set callback function for GDMA, the interrupt is triggered by GDMA, then the GDMA ISR will call the callback function */
|
||||||
gdma_register_rx_event_callbacks(handle->dma.dma_chan, &cb, handle);
|
ESP_GOTO_ON_ERROR(gdma_register_rx_event_callbacks(handle->dma.dma_chan, &cb, handle), err2, TAG, "Register rx callback failed");
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
intr_flag |= handle->intr_prio_flags;
|
intr_flag |= handle->intr_prio_flags;
|
||||||
@ -747,7 +748,15 @@ esp_err_t i2s_init_dma_intr(i2s_chan_handle_t handle, int intr_flag)
|
|||||||
/* Start DMA */
|
/* Start DMA */
|
||||||
i2s_ll_enable_dma(handle->controller->hal.dev, true);
|
i2s_ll_enable_dma(handle->controller->hal.dev, true);
|
||||||
#endif // SOC_GDMA_SUPPORTED
|
#endif // SOC_GDMA_SUPPORTED
|
||||||
return ESP_OK;
|
return ret;
|
||||||
|
#if SOC_GDMA_SUPPORTED
|
||||||
|
err2:
|
||||||
|
gdma_disconnect(handle->dma.dma_chan);
|
||||||
|
err1:
|
||||||
|
gdma_del_channel(handle->dma.dma_chan);
|
||||||
|
handle->dma.dma_chan = NULL;
|
||||||
|
return ret;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static uint64_t s_i2s_get_pair_chan_gpio_mask(i2s_chan_handle_t handle)
|
static uint64_t s_i2s_get_pair_chan_gpio_mask(i2s_chan_handle_t handle)
|
||||||
|
Loading…
Reference in New Issue
Block a user