mirror of
https://github.com/espressif/esp-idf
synced 2025-03-09 17:19:09 -04:00
Merge branch 'bugfix/fix_i2s_reconfig_slot_issue_v5.0' into 'release/v5.0'
fix(i2s): fixed incorrect logic in slot reconfig (v5.0) See merge request espressif/esp-idf!36645
This commit is contained in:
commit
dc58edb50d
@ -101,16 +101,19 @@ static esp_err_t i2s_pdm_tx_set_slot(i2s_chan_handle_t handle, const i2s_pdm_tx_
|
|||||||
/* Share bck and ws signal in full-duplex mode */
|
/* Share bck and ws signal in full-duplex mode */
|
||||||
i2s_ll_share_bck_ws(handle->controller->hal.dev, handle->controller->full_duplex);
|
i2s_ll_share_bck_ws(handle->controller->hal.dev, handle->controller->full_duplex);
|
||||||
|
|
||||||
|
/* Update the mode info: slot configuration */
|
||||||
|
i2s_pdm_tx_config_t *pdm_tx_cfg = (i2s_pdm_tx_config_t *)handle->mode_info;
|
||||||
|
memcpy(&(pdm_tx_cfg->slot_cfg), slot_cfg, sizeof(i2s_pdm_tx_slot_config_t));
|
||||||
|
/* Update the slot bit width to the actual slot bit width */
|
||||||
|
pdm_tx_cfg->slot_cfg.slot_bit_width = (int)pdm_tx_cfg->slot_cfg.slot_bit_width < (int)pdm_tx_cfg->slot_cfg.data_bit_width ?
|
||||||
|
pdm_tx_cfg->slot_cfg.data_bit_width : pdm_tx_cfg->slot_cfg.slot_bit_width;
|
||||||
|
|
||||||
portENTER_CRITICAL(&g_i2s.spinlock);
|
portENTER_CRITICAL(&g_i2s.spinlock);
|
||||||
/* Configure the hardware to apply PDM format */
|
/* Configure the hardware to apply PDM format */
|
||||||
bool is_slave = handle->role == I2S_ROLE_SLAVE;
|
bool is_slave = handle->role == I2S_ROLE_SLAVE;
|
||||||
i2s_hal_pdm_set_tx_slot(&(handle->controller->hal), is_slave, (i2s_hal_slot_config_t *)slot_cfg);
|
i2s_hal_pdm_set_tx_slot(&(handle->controller->hal), is_slave, (i2s_hal_slot_config_t *)slot_cfg);
|
||||||
portEXIT_CRITICAL(&g_i2s.spinlock);
|
portEXIT_CRITICAL(&g_i2s.spinlock);
|
||||||
|
|
||||||
/* Update the mode info: slot configuration */
|
|
||||||
i2s_pdm_tx_config_t *pdm_tx_cfg = (i2s_pdm_tx_config_t *)handle->mode_info;
|
|
||||||
memcpy(&(pdm_tx_cfg->slot_cfg), slot_cfg, sizeof(i2s_pdm_tx_slot_config_t));
|
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -281,7 +284,7 @@ esp_err_t i2s_channel_reconfig_pdm_tx_slot(i2s_chan_handle_t handle, const i2s_p
|
|||||||
|
|
||||||
/* If the slot bit width changed, then need to update the clock */
|
/* If the slot bit width changed, then need to update the clock */
|
||||||
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
||||||
if (pdm_tx_cfg->slot_cfg.slot_bit_width == slot_bits) {
|
if (pdm_tx_cfg->slot_cfg.slot_bit_width != slot_bits) {
|
||||||
ESP_GOTO_ON_ERROR(i2s_pdm_tx_set_clock(handle, &pdm_tx_cfg->clk_cfg), err, TAG, "update clock failed");
|
ESP_GOTO_ON_ERROR(i2s_pdm_tx_set_clock(handle, &pdm_tx_cfg->clk_cfg), err, TAG, "update clock failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -383,16 +386,19 @@ static esp_err_t i2s_pdm_rx_set_slot(i2s_chan_handle_t handle, const i2s_pdm_rx_
|
|||||||
/* Share bck and ws signal in full-duplex mode */
|
/* Share bck and ws signal in full-duplex mode */
|
||||||
i2s_ll_share_bck_ws(handle->controller->hal.dev, handle->controller->full_duplex);
|
i2s_ll_share_bck_ws(handle->controller->hal.dev, handle->controller->full_duplex);
|
||||||
|
|
||||||
|
/* Update the mode info: slot configuration */
|
||||||
|
i2s_pdm_rx_config_t *pdm_rx_cfg = (i2s_pdm_rx_config_t *)handle->mode_info;
|
||||||
|
memcpy(&(pdm_rx_cfg->slot_cfg), slot_cfg, sizeof(i2s_pdm_rx_slot_config_t));
|
||||||
|
/* Update the slot bit width to the actual slot bit width */
|
||||||
|
pdm_rx_cfg->slot_cfg.slot_bit_width = (int)pdm_rx_cfg->slot_cfg.slot_bit_width < (int)pdm_rx_cfg->slot_cfg.data_bit_width ?
|
||||||
|
pdm_rx_cfg->slot_cfg.data_bit_width : pdm_rx_cfg->slot_cfg.slot_bit_width;
|
||||||
|
|
||||||
portENTER_CRITICAL(&g_i2s.spinlock);
|
portENTER_CRITICAL(&g_i2s.spinlock);
|
||||||
/* Configure the hardware to apply PDM format */
|
/* Configure the hardware to apply PDM format */
|
||||||
bool is_slave = (handle->role == I2S_ROLE_SLAVE) | handle->controller->full_duplex;
|
bool is_slave = (handle->role == I2S_ROLE_SLAVE) | handle->controller->full_duplex;
|
||||||
i2s_hal_pdm_set_rx_slot(&(handle->controller->hal), is_slave, (i2s_hal_slot_config_t *)slot_cfg);
|
i2s_hal_pdm_set_rx_slot(&(handle->controller->hal), is_slave, (i2s_hal_slot_config_t *)slot_cfg);
|
||||||
portEXIT_CRITICAL(&g_i2s.spinlock);
|
portEXIT_CRITICAL(&g_i2s.spinlock);
|
||||||
|
|
||||||
/* Update the mode info: slot configuration */
|
|
||||||
i2s_pdm_rx_config_t *pdm_rx_cfg = (i2s_pdm_rx_config_t *)handle->mode_info;
|
|
||||||
memcpy(&(pdm_rx_cfg->slot_cfg), slot_cfg, sizeof(i2s_pdm_rx_slot_config_t));
|
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -553,7 +559,7 @@ esp_err_t i2s_channel_reconfig_pdm_rx_slot(i2s_chan_handle_t handle, const i2s_p
|
|||||||
|
|
||||||
/* If the slot bit width changed, then need to update the clock */
|
/* If the slot bit width changed, then need to update the clock */
|
||||||
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
||||||
if (pdm_rx_cfg->slot_cfg.slot_bit_width == slot_bits) {
|
if (pdm_rx_cfg->slot_cfg.slot_bit_width != slot_bits) {
|
||||||
ESP_GOTO_ON_ERROR(i2s_pdm_rx_set_clock(handle, &pdm_rx_cfg->clk_cfg), err, TAG, "update clock failed");
|
ESP_GOTO_ON_ERROR(i2s_pdm_rx_set_clock(handle, &pdm_rx_cfg->clk_cfg), err, TAG, "update clock failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -128,6 +128,9 @@ static esp_err_t i2s_std_set_slot(i2s_chan_handle_t handle, const i2s_std_slot_c
|
|||||||
/* Update the mode info: slot configuration */
|
/* Update the mode info: slot configuration */
|
||||||
i2s_std_config_t *std_cfg = (i2s_std_config_t *)(handle->mode_info);
|
i2s_std_config_t *std_cfg = (i2s_std_config_t *)(handle->mode_info);
|
||||||
memcpy(&(std_cfg->slot_cfg), slot_cfg, sizeof(i2s_std_slot_config_t));
|
memcpy(&(std_cfg->slot_cfg), slot_cfg, sizeof(i2s_std_slot_config_t));
|
||||||
|
/* Update the slot bit width to the actual slot bit width */
|
||||||
|
std_cfg->slot_cfg.slot_bit_width = (int)std_cfg->slot_cfg.slot_bit_width < (int)std_cfg->slot_cfg.data_bit_width ?
|
||||||
|
std_cfg->slot_cfg.data_bit_width : std_cfg->slot_cfg.slot_bit_width;
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
@ -325,7 +328,7 @@ esp_err_t i2s_channel_reconfig_std_slot(i2s_chan_handle_t handle, const i2s_std_
|
|||||||
|
|
||||||
/* If the slot bit width changed, then need to update the clock */
|
/* If the slot bit width changed, then need to update the clock */
|
||||||
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
||||||
if (std_cfg->slot_cfg.slot_bit_width == slot_bits) {
|
if (std_cfg->slot_cfg.slot_bit_width != slot_bits) {
|
||||||
ESP_GOTO_ON_ERROR(i2s_std_set_clock(handle, &std_cfg->clk_cfg), err, TAG, "update clock failed");
|
ESP_GOTO_ON_ERROR(i2s_std_set_clock(handle, &std_cfg->clk_cfg), err, TAG, "update clock failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -138,6 +138,9 @@ static esp_err_t i2s_tdm_set_slot(i2s_chan_handle_t handle, const i2s_tdm_slot_c
|
|||||||
/* Update the mode info: slot configuration */
|
/* Update the mode info: slot configuration */
|
||||||
i2s_tdm_config_t *tdm_cfg = (i2s_tdm_config_t *)(handle->mode_info);
|
i2s_tdm_config_t *tdm_cfg = (i2s_tdm_config_t *)(handle->mode_info);
|
||||||
memcpy(&(tdm_cfg->slot_cfg), slot_cfg, sizeof(i2s_tdm_slot_config_t));
|
memcpy(&(tdm_cfg->slot_cfg), slot_cfg, sizeof(i2s_tdm_slot_config_t));
|
||||||
|
/* Update the slot bit width to the actual slot bit width */
|
||||||
|
tdm_cfg->slot_cfg.slot_bit_width = (int)tdm_cfg->slot_cfg.slot_bit_width < (int)tdm_cfg->slot_cfg.data_bit_width ?
|
||||||
|
tdm_cfg->slot_cfg.data_bit_width : tdm_cfg->slot_cfg.slot_bit_width;
|
||||||
|
|
||||||
return ESP_OK;
|
return ESP_OK;
|
||||||
}
|
}
|
||||||
@ -330,7 +333,7 @@ esp_err_t i2s_channel_reconfig_tdm_slot(i2s_chan_handle_t handle, const i2s_tdm_
|
|||||||
|
|
||||||
/* If the slot bit width changed, then need to update the clock */
|
/* If the slot bit width changed, then need to update the clock */
|
||||||
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
uint32_t slot_bits = slot_cfg->slot_bit_width == I2S_SLOT_BIT_WIDTH_AUTO ? slot_cfg->data_bit_width : slot_cfg->slot_bit_width;
|
||||||
if (tdm_cfg->slot_cfg.slot_bit_width == slot_bits) {
|
if (tdm_cfg->slot_cfg.slot_bit_width != slot_bits) {
|
||||||
ESP_GOTO_ON_ERROR(i2s_tdm_set_clock(handle, &tdm_cfg->clk_cfg), err, TAG, "update clock failed");
|
ESP_GOTO_ON_ERROR(i2s_tdm_set_clock(handle, &tdm_cfg->clk_cfg), err, TAG, "update clock failed");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user