From 8953e65e404a6d44e59b06a95f89a80d89414174 Mon Sep 17 00:00:00 2001 From: Szabolcs Szekelyi Date: Tue, 4 Apr 2023 04:34:07 +0200 Subject: [PATCH] Fix I2S driver not starting --- components/esp8266/driver/i2s.c | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/components/esp8266/driver/i2s.c b/components/esp8266/driver/i2s.c index 15be3d6ae..28d7f061f 100644 --- a/components/esp8266/driver/i2s.c +++ b/components/esp8266/driver/i2s.c @@ -54,6 +54,21 @@ static const char *I2S_TAG = "i2s"; #define I2S_FULL_DUPLEX_SLAVE_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_SLAVE) #define I2S_FULL_DUPLEX_MASTER_MODE_MASK (I2S_MODE_TX | I2S_MODE_RX | I2S_MODE_MASTER) +void rom_i2c_writeReg_Mask(int, int, int, int, int, int); + +#define i2c_bbpll 0x67 +#define i2c_bbpll_en_audio_clock_out 4 +#define i2c_bbpll_en_audio_clock_out_msb 7 +#define i2c_bbpll_en_audio_clock_out_lsb 7 +#define i2c_bbpll_hostid 4 + +#define i2c_writeReg_Mask(block, host_id, reg_add, Msb, Lsb, indata) rom_i2c_writeReg_Mask(block, host_id, reg_add, Msb, Lsb, indata) +#define i2c_readReg_Mask(block, host_id, reg_add, Msb, Lsb) rom_i2c_readReg_Mask(block, host_id, reg_add, Msb, Lsb) +#define i2c_writeReg_Mask_def(block, reg_add, indata) \ + i2c_writeReg_Mask(block, block##_hostid, reg_add, reg_add##_msb, reg_add##_lsb, indata) +#define i2c_readReg_Mask_def(block, reg_add) \ + i2c_readReg_Mask(block, block##_hostid, reg_add, reg_add##_msb, reg_add##_lsb) + typedef struct lldesc { uint32_t blocksize : 12; uint32_t datalen : 12; @@ -821,6 +836,8 @@ esp_err_t i2s_driver_uninstall(i2s_port_t i2s_num) i2s_stop(i2s_num); dma_intr_register(NULL, NULL); + i2c_writeReg_Mask_def(i2c_bbpll, i2c_bbpll_en_audio_clock_out, 0); + if (p_i2s_obj[i2s_num]->tx != NULL && p_i2s_obj[i2s_num]->mode & I2S_MODE_TX) { i2s_destroy_dma_queue(i2s_num, p_i2s_obj[i2s_num]->tx); p_i2s_obj[i2s_num]->tx = NULL; @@ -884,10 +901,13 @@ esp_err_t i2s_driver_install(i2s_port_t i2s_num, const i2s_config_t *i2s_config, p_i2s_obj[i2s_num]->i2s_queue = NULL; } + // enable clock generation for peripheral + i2c_writeReg_Mask_def(i2c_bbpll, i2c_bbpll_en_audio_clock_out, 1); + // set clock and start return i2s_set_clk(i2s_num, i2s_config->sample_rate, i2s_config->bits_per_sample, p_i2s_obj[i2s_num]->channel_num); } ESP_LOGW(I2S_TAG, "I2S driver already installed"); return ESP_OK; -} \ No newline at end of file +}