Skip to content

Commit fcce23e

Browse files
committed
Merge branch 'feature/add_i2s_clk_source' into 'master'
feat(esp_codec_dev): Add i2s clk source config See merge request adf/esp-adf-internal!1474
2 parents da8c82d + c67b88f commit fcce23e

File tree

7 files changed

+57
-10
lines changed

7 files changed

+57
-10
lines changed

components/esp_codec_dev/CHANGELOG.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,15 @@
11
# Changelog
22

3+
## v1.5.4
4+
5+
### Feature
6+
7+
- Added support for I2S clock source configuration, primarily for low-power applications
8+
9+
### Bug Fixed
10+
11+
- Fixed header dependency issue for compatibility with ESP-IDF v6.0
12+
313
## v1.5.3
414

515
### Bug Fixed

components/esp_codec_dev/idf_component.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
version: 1.5.3
1+
version: 1.5.4
22
description: Audio codec device support for Espressif SOC
33
url: https://github.com/espressif/esp-adf/tree/master/components/esp_codec_dev
44

components/esp_codec_dev/include/esp_codec_dev_defaults.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -67,6 +67,7 @@ typedef struct {
6767
uint8_t port; /*!< I2S port, this port need pre-installed by other modules */
6868
void *rx_handle; /*!< I2S rx handle, need provide on IDF 5.x */
6969
void *tx_handle; /*!< I2S tx handle, need provide on IDF 5.x */
70+
int clk_src; /*!< I2S clock source, need converted from `i2s_clock_src_t`. If set to 0 will use default clock source */
7071
} audio_codec_i2s_cfg_t;
7172

7273
/**

components/esp_codec_dev/platform/audio_codec_ctrl_spi.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
6+
#include "esp_idf_version.h"
67
#include "audio_codec_ctrl_if.h"
78
#include "esp_codec_dev_defaults.h"
89
#include "driver/spi_common.h"

components/esp_codec_dev/platform/audio_codec_data_i2s.c

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@
99
#include "esp_codec_dev_defaults.h"
1010
#include "freertos/FreeRTOS.h"
1111
#include "esp_idf_version.h"
12+
#include "hal/i2s_types.h"
1213
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
1314
#include "driver/i2s_std.h"
1415
#include "driver/i2s_tdm.h"
@@ -38,6 +39,7 @@ typedef struct {
3839
esp_codec_dev_sample_info_t in_fs;
3940
esp_codec_dev_sample_info_t out_fs;
4041
esp_codec_dev_sample_info_t fs;
42+
i2s_clock_src_t clk_src;
4143
} i2s_data_t;
4244

4345
typedef struct i2s_data_keep_t i2s_data_keep_t;
@@ -251,6 +253,9 @@ static int set_drv_fs(i2s_chan_handle_t channel, bool playback, uint8_t slot_bit
251253
slot_cfg.slot_bit_width = slot_bits;
252254
}
253255
i2s_std_clk_config_t clk_cfg = I2S_STD_CLK_DEFAULT_CONFIG(fs->sample_rate);
256+
if (i2s_data_list->i2s_data->clk_src) {
257+
clk_cfg.clk_src = i2s_data_list->i2s_data->clk_src;
258+
}
254259
if (fs->mclk_multiple) {
255260
clk_cfg.mclk_multiple = fs->mclk_multiple;
256261
}
@@ -273,6 +278,9 @@ static int set_drv_fs(i2s_chan_handle_t channel, bool playback, uint8_t slot_bit
273278
if (playback == false) {
274279
#if SOC_I2S_SUPPORTS_PDM_RX
275280
i2s_pdm_rx_clk_config_t clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG(fs->sample_rate);
281+
if (i2s_data_list->i2s_data->clk_src) {
282+
clk_cfg.clk_src = i2s_data_list->i2s_data->clk_src;
283+
}
276284
i2s_pdm_rx_slot_config_t slot_cfg = I2S_PDM_RX_SLOT_DEFAULT_CONFIG(slot_bits, I2S_SLOT_MODE_STEREO);
277285
i2s_pdm_slot_mask_t slot_mask = fs->channel_mask ?
278286
(i2s_pdm_slot_mask_t) fs->channel_mask : I2S_PDM_SLOT_BOTH;
@@ -300,6 +308,9 @@ static int set_drv_fs(i2s_chan_handle_t channel, bool playback, uint8_t slot_bit
300308
} else {
301309
#if SOC_I2S_SUPPORTS_PDM_TX
302310
i2s_pdm_tx_clk_config_t clk_cfg = I2S_PDM_TX_CLK_DEFAULT_CONFIG(fs->sample_rate);
311+
if (i2s_data_list->i2s_data->clk_src) {
312+
clk_cfg.clk_src = i2s_data_list->i2s_data->clk_src;
313+
}
303314
clk_cfg.up_sample_fs = fs->sample_rate / 100;
304315
i2s_pdm_tx_slot_config_t slot_cfg = I2S_PDM_TX_SLOT_DEFAULT_CONFIG(slot_bits, I2S_SLOT_MODE_STEREO);
305316
// Stereo channel mask is ignored, need use mono instead
@@ -334,6 +345,9 @@ static int set_drv_fs(i2s_chan_handle_t channel, bool playback, uint8_t slot_bit
334345
#if SOC_I2S_SUPPORTS_TDM
335346
case I2S_COMM_MODE_TDM: {
336347
i2s_tdm_clk_config_t clk_cfg = I2S_TDM_CLK_DEFAULT_CONFIG(fs->sample_rate);
348+
if (i2s_data_list->i2s_data->clk_src) {
349+
clk_cfg.clk_src = i2s_data_list->i2s_data->clk_src;
350+
}
337351
if (slot_bits == 24) {
338352
clk_cfg.mclk_multiple = I2S_MCLK_MULTIPLE_384;
339353
}
@@ -468,6 +482,7 @@ static int _i2s_data_open(const audio_codec_data_if_t *h, void *data_cfg, int cf
468482
i2s_data->port = i2s_cfg->port;
469483
i2s_data->out_handle = i2s_cfg->tx_handle;
470484
i2s_data->in_handle = i2s_cfg->rx_handle;
485+
i2s_data->clk_src = (i2s_clock_src_t) i2s_cfg->clk_src;
471486
add_to_keeper(i2s_data);
472487
return ESP_CODEC_DEV_OK;
473488
}

components/esp_codec_dev/test_apps/codec_dev_test/main/test_board.c

Lines changed: 29 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
#else
1414
#include "driver/i2s.h"
1515
#endif
16+
#include "esp_private/rtc_clk.h"
1617
#include "esp_codec_dev.h"
1718
#include "esp_codec_dev_defaults.h"
1819
#include "test_board.h"
@@ -114,7 +115,7 @@ static void ut_clr_i2s_mode(void)
114115
}
115116
#endif
116117

117-
static int ut_i2s_init(uint8_t port, codec_i2s_pin_t *i2s_pin)
118+
static int ut_i2s_init(uint8_t port, codec_i2s_pin_t *i2s_pin, i2s_clock_src_t clk_src)
118119
{
119120
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
120121
if (port >= I2S_MAX_KEEP) {
@@ -132,6 +133,7 @@ static int ut_i2s_init(uint8_t port, codec_i2s_pin_t *i2s_pin)
132133
.din = i2s_pin ? i2s_pin->din : TEST_BOARD_I2S_DATA_IN_PIN,
133134
},
134135
};
136+
std_cfg.clk_cfg.clk_src = clk_src;
135137
if (i2s_keep[port] == NULL) {
136138
i2s_keep[port] = (i2s_keep_t *) calloc(1, sizeof(i2s_keep_t));
137139
if (i2s_keep[port] == NULL) {
@@ -152,6 +154,7 @@ static int ut_i2s_init(uint8_t port, codec_i2s_pin_t *i2s_pin)
152154
},
153155
};
154156
tdm_cfg.slot_cfg.total_slot = 4;
157+
tdm_cfg.clk_cfg.clk_src = clk_src;
155158
#endif
156159

157160

@@ -245,12 +248,19 @@ static void codec_max_sample(uint8_t *data, int size, int *max_value, int *min_v
245248
*min_value = min;
246249
}
247250

248-
TEST_CASE("esp codec dev test using S3 board", "[esp_codec_dev]")
251+
static void test_codec_dev_using_s3_board(bool use_xtal)
249252
{
253+
i2s_clock_src_t clk_src = I2S_CLK_SRC_DEFAULT;
254+
if (use_xtal) {
255+
#if SOC_I2S_SUPPORTS_XTAL
256+
clk_src = I2S_CLK_SRC_XTAL;
257+
rtc_clk_cpu_set_to_default_config();
258+
#endif
259+
}
250260
// Need install driver (i2c and i2s) firstly
251261
int ret = ut_i2c_init(0, NULL);
252262
TEST_ESP_OK(ret);
253-
ret = ut_i2s_init(0, NULL);
263+
ret = ut_i2s_init(0, NULL, clk_src);
254264
TEST_ESP_OK(ret);
255265
// Do initialize of related interface: data_if, ctrl_if and gpio_if
256266
audio_codec_i2s_cfg_t i2s_cfg = {
@@ -259,6 +269,9 @@ TEST_CASE("esp codec dev test using S3 board", "[esp_codec_dev]")
259269
.tx_handle = i2s_keep[0]->tx_handle,
260270
#endif
261271
};
272+
if (use_xtal) {
273+
i2s_cfg.clk_src = clk_src;
274+
}
262275
const audio_codec_data_if_t *data_if = audio_codec_new_i2s_data(&i2s_cfg);
263276
TEST_ASSERT_NOT_NULL(data_if);
264277

@@ -359,12 +372,22 @@ TEST_CASE("esp codec dev test using S3 board", "[esp_codec_dev]")
359372
ut_i2s_deinit(0);
360373
}
361374

375+
TEST_CASE("esp codec dev test using S3 board", "[esp_codec_dev]")
376+
{
377+
test_codec_dev_using_s3_board(false);
378+
}
379+
380+
TEST_CASE("esp codec dev test using S3 board with XTAL", "[esp_codec_dev]")
381+
{
382+
test_codec_dev_using_s3_board(true);
383+
}
384+
362385
TEST_CASE("Record play overlap test", "[esp_codec_dev]")
363386
{
364387
// Need install driver (i2c and i2s) firstly
365388
int ret = ut_i2c_init(0, NULL);
366389
TEST_ESP_OK(ret);
367-
ret = ut_i2s_init(0, NULL);
390+
ret = ut_i2s_init(0, NULL, I2S_CLK_SRC_DEFAULT);
368391
TEST_ESP_OK(ret);
369392
// Do initialize of related interface: data_if, ctrl_if and gpio_if
370393
audio_codec_i2s_cfg_t i2s_cfg = {
@@ -601,7 +624,7 @@ static void multiple_es8311_run(bool reuse_data_if)
601624
.dout = 8,
602625
.din = 10,
603626
};
604-
ret = ut_i2s_init(0, &i2s_pin);
627+
ret = ut_i2s_init(0, &i2s_pin, I2S_CLK_SRC_DEFAULT);
605628
TEST_ESP_OK(ret);
606629
const audio_codec_data_if_t *data_if = NULL;
607630
if (reuse_data_if) {
@@ -723,7 +746,7 @@ TEST_CASE("Playing while recording use TDM mode", "[esp_codec_dev]")
723746
// Need install driver (i2c and i2s) firstly
724747
int ret = ut_i2c_init(0, NULL);
725748
TEST_ESP_OK(ret);
726-
ret = ut_i2s_init(0, NULL);
749+
ret = ut_i2s_init(0, NULL, I2S_CLK_SRC_DEFAULT);
727750
TEST_ESP_OK(ret);
728751
// Do initialize of related interface: data_if, ctrl_if and gpio_if
729752
audio_codec_i2s_cfg_t i2s_cfg = {

components/esp_codec_dev/test_apps/codec_dev_test/sdkconfig.defaults

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,3 @@
1-
# Enable SPIRAM
2-
CONFIG_SPIRAM=y
3-
41
# Enable FreeRTOS trace
52
CONFIG_FREERTOS_HZ=1000
63

0 commit comments

Comments
 (0)