From ad38b97f8b839427a72bf681c10eb3da5610ec03 Mon Sep 17 00:00:00 2001 From: Michael Miller Date: Wed, 17 Jun 2020 15:11:34 -0700 Subject: [PATCH] Esp32 s2 i2s (#358) * More Init Cleanup * cleanup --- src/internal/Esp32_i2s.c | 144 +++++++++---------------------- src/internal/Esp32_i2s.h | 4 +- src/internal/NeoEsp32I2sMethod.h | 2 +- 3 files changed, 44 insertions(+), 106 deletions(-) diff --git a/src/internal/Esp32_i2s.c b/src/internal/Esp32_i2s.c index bbfc571..3638568 100644 --- a/src/internal/Esp32_i2s.c +++ b/src/internal/Esp32_i2s.c @@ -181,31 +181,30 @@ esp_err_t i2sSetClock(uint8_t bus_num, uint8_t div_num, uint8_t div_b, uint8_t d } i2s_dev_t* i2s = I2S[bus_num].bus; + typeof(i2s->clkm_conf) clkm_conf; + + clkm_conf.val = 0; #if !defined(CONFIG_IDF_TARGET_ESP32S2) - i2s->clkm_conf.clka_en = 0; + clkm_conf.clka_en = 0; #else - i2s->clkm_conf.clk_sel = 2; + clkm_conf.clk_sel = 2; #endif - i2s->clkm_conf.clkm_div_a = div_a; - i2s->clkm_conf.clkm_div_b = div_b; - i2s->clkm_conf.clkm_div_num = div_num; - i2s->sample_rate_conf.tx_bck_div_num = bck; - i2s->sample_rate_conf.rx_bck_div_num = bck; - i2s->sample_rate_conf.tx_bits_mod = bits; - i2s->sample_rate_conf.rx_bits_mod = bits; + clkm_conf.clkm_div_a = div_a; + clkm_conf.clkm_div_b = div_b; + clkm_conf.clkm_div_num = div_num; + i2s->clkm_conf.val = clkm_conf.val; + + typeof(i2s->sample_rate_conf) sample_rate_conf; + sample_rate_conf.val = 0; + sample_rate_conf.tx_bck_div_num = bck; + sample_rate_conf.rx_bck_div_num = bck; + sample_rate_conf.tx_bits_mod = bits; + sample_rate_conf.rx_bits_mod = bits; + i2s->sample_rate_conf.val = sample_rate_conf.val; return ESP_OK; } -void i2sSetTxDataMode(uint8_t bus_num, i2s_tx_chan_mod_t chan_mod, i2s_tx_fifo_mod_t fifo_mod) { - if (bus_num >= I2S_NUM_MAX) { - return; - } - - I2S[bus_num].bus->conf_chan.tx_chan_mod = chan_mod; // 0:dual channel; 1:right channel; 2:left channel; 3:left channel constant; 4:right channel constant; (channels flipped if tx_msb_right == 1) - I2S[bus_num].bus->fifo_conf.tx_fifo_mod = fifo_mod; // 0:16-bit dual channel; 1:16-bit single channel; 2:32-bit dual channel; 3:32-bit single channel data -} - void i2sSetDac(uint8_t bus_num, bool right, bool left) { if (bus_num >= I2S_NUM_MAX) { return; @@ -222,7 +221,7 @@ void i2sSetDac(uint8_t bus_num, bool right, bool left) { return; } - i2sSetPins(bus_num, -1, -1, -1, -1, false); + i2sSetPins(bus_num, -1, false); I2S[bus_num].bus->conf2.lcd_en = 1; I2S[bus_num].bus->conf.tx_right_first = 0; I2S[bus_num].bus->conf2.camera_en = 0; @@ -237,69 +236,11 @@ void i2sSetDac(uint8_t bus_num, bool right, bool left) { } } -void i2sSetPins(uint8_t bus_num, int8_t out, int8_t ws, int8_t bck, int8_t in, bool invert) { +void i2sSetPins(uint8_t bus_num, int8_t out, bool invert) { if (bus_num >= I2S_NUM_MAX) { return; } - if ((ws >= 0 && I2S[bus_num].ws == -1) || (bck >= 0 && I2S[bus_num].bck == -1) || (out >= 0 && I2S[bus_num].out == -1)) { - i2sSetDac(bus_num, false, false); - } - - if (ws >= 0) { - if (I2S[bus_num].ws != ws) { - if (I2S[bus_num].ws >= 0) { - gpio_matrix_out(I2S[bus_num].ws, 0x100, invert, false); - } - I2S[bus_num].ws = ws; - pinMode(ws, OUTPUT); - - uint32_t i2sSignal; -#if !defined(CONFIG_IDF_TARGET_ESP32S2) -// (I2S_NUM_MAX == 2) - if (bus_num == 1) { - i2sSignal = I2S1O_WS_OUT_IDX; - } - else -#else - { - i2sSignal = I2S0O_WS_OUT_IDX; - } -#endif - gpio_matrix_out(ws, i2sSignal, invert, false); - } - } else if (I2S[bus_num].ws >= 0) { - gpio_matrix_out(I2S[bus_num].ws, 0x100, invert, false); - I2S[bus_num].ws = -1; - } - - if (bck >= 0) { - if (I2S[bus_num].bck != bck) { - if (I2S[bus_num].bck >= 0) { - gpio_matrix_out(I2S[bus_num].bck, 0x100, invert, false); - } - I2S[bus_num].bck = bck; - pinMode(bck, OUTPUT); - - int i2sSignal; -#if !defined(CONFIG_IDF_TARGET_ESP32S2) -// (I2S_NUM_MAX == 2) - if (bus_num == 1) { - i2sSignal = I2S1O_BCK_OUT_IDX; - } - else -#else - { - i2sSignal = I2S0O_BCK_OUT_IDX; - } -#endif - gpio_matrix_out(bck, i2sSignal, invert, false); - } - } else if (I2S[bus_num].bck >= 0) { - gpio_matrix_out(I2S[bus_num].bck, 0x100, invert, false); - I2S[bus_num].bck = -1; - } - if (out >= 0) { if (I2S[bus_num].out != out) { if (I2S[bus_num].out >= 0) { @@ -385,38 +326,37 @@ void i2sInit(uint8_t bus_num, uint32_t bits_per_sample, uint32_t sample_rate, i2 i2s->lc_conf.out_rst = 0; // Enable and configure DMA - typeof(i2s->lc_conf) temp_conf; - temp_conf.val = 0; - temp_conf.out_eof_mode = 1; - i2s->lc_conf.val = temp_conf.val; + typeof(i2s->lc_conf) lc_conf; + lc_conf.val = 0; + lc_conf.out_eof_mode = 1; + i2s->lc_conf.val = lc_conf.val; i2s->pdm_conf.pcm2pdm_conv_en = 0; i2s->pdm_conf.pdm2pcm_conv_en = 0; // SET_PERI_REG_BITS(RTC_CNTL_CLK_CONF_REG, RTC_CNTL_SOC_CLK_SEL, 0x1, RTC_CNTL_SOC_CLK_SEL_S); + typeof(i2s->conf_chan) conf_chan; + conf_chan.val = 0; + conf_chan.tx_chan_mod = chan_mod; // 0-two channel;1-right;2-left;3-righ;4-left + conf_chan.rx_chan_mod = chan_mod; // 0-two channel;1-right;2-left;3-righ;4-left + i2s->conf_chan.val = conf_chan.val; - i2s->conf_chan.tx_chan_mod = chan_mod; // 0-two channel;1-right;2-left;3-righ;4-left - i2s->conf_chan.rx_chan_mod = chan_mod; // 0-two channel;1-right;2-left;3-righ;4-left - i2s->fifo_conf.tx_fifo_mod = fifo_mod; // 0-right&left channel;1-one channel - i2s->fifo_conf.rx_fifo_mod = fifo_mod; // 0-right&left channel;1-one channel + typeof(i2s->fifo_conf) fifo_conf; + fifo_conf.val = 0; + fifo_conf.tx_fifo_mod = fifo_mod; // 0-right&left channel;1-one channel + fifo_conf.rx_fifo_mod = fifo_mod; // 0-right&left channel;1-one channel + i2s->fifo_conf.val = fifo_conf.val; - i2s->conf.tx_mono = 0; - i2s->conf.rx_mono = 0; + typeof(i2s->conf) conf; + conf.val = 0; + conf.tx_msb_shift = (bits_per_sample != 8);// 0:DAC/PCM, 1:I2S + conf.tx_right_first = (bits_per_sample == 8); + i2s->conf.val = conf.val; - i2s->conf.tx_start = 0; - i2s->conf.rx_start = 0; - - i2s->conf.tx_short_sync = 0; - i2s->conf.rx_short_sync = 0; - i2s->conf.tx_msb_shift = (bits_per_sample != 8);// 0:DAC/PCM, 1:I2S - i2s->conf.rx_msb_shift = 0; - - i2s->conf.tx_slave_mod = 0; // Master - - i2s->conf.tx_msb_right = 0; - i2s->conf.tx_right_first = (bits_per_sample == 8); - i2s->conf2.lcd_en = (bits_per_sample == 8); - i2s->conf2.camera_en = 0; + typeof(i2s->conf2) conf2; + conf2.val = 0; + conf2.lcd_en = (bits_per_sample == 8); + i2s->conf2.val = conf2.val; i2s->fifo_conf.tx_fifo_mod_force_en = 1; diff --git a/src/internal/Esp32_i2s.h b/src/internal/Esp32_i2s.h index 589f234..a95e7c5 100644 --- a/src/internal/Esp32_i2s.h +++ b/src/internal/Esp32_i2s.h @@ -20,14 +20,12 @@ typedef enum { void i2sInit(uint8_t bus_num, uint32_t bits_per_sample, uint32_t sample_rate, i2s_tx_chan_mod_t chan_mod, i2s_tx_fifo_mod_t fifo_mod, size_t dma_count, size_t dma_len); -void i2sSetPins(uint8_t bus_num, int8_t out, int8_t ws, int8_t bck, int8_t in, bool invert); +void i2sSetPins(uint8_t bus_num, int8_t out, bool invert); void i2sSetDac(uint8_t bus_num, bool right, bool left); esp_err_t i2sSetClock(uint8_t bus_num, uint8_t div_num, uint8_t div_b, uint8_t div_a, uint8_t bck, uint8_t bits_per_sample); esp_err_t i2sSetSampleRate(uint8_t bus_num, uint32_t sample_rate, uint8_t bits_per_sample); -void i2sSetTxDataMode(uint8_t bus_num, i2s_tx_chan_mod_t chan_mod, i2s_tx_fifo_mod_t fifo_mod); - void i2sSetSilenceBuf(uint8_t bus_num, uint8_t* data, size_t len); size_t i2sWrite(uint8_t bus_num, uint8_t* data, size_t len, bool copy, bool free_when_sent); diff --git a/src/internal/NeoEsp32I2sMethod.h b/src/internal/NeoEsp32I2sMethod.h index 6bcc2a4..2f1839b 100644 --- a/src/internal/NeoEsp32I2sMethod.h +++ b/src/internal/NeoEsp32I2sMethod.h @@ -157,7 +157,7 @@ public: { size_t dmaCount = (_i2sBufferSize + I2S_DMA_MAX_DATA_LEN - 1) / I2S_DMA_MAX_DATA_LEN; i2sInit(T_BUS::I2sBusNumber, 16, T_SPEED::I2sSampleRate, I2S_CHAN_STEREO, I2S_FIFO_16BIT_DUAL, dmaCount, 0); - i2sSetPins(T_BUS::I2sBusNumber, _pin, -1, -1, -1, T_INVERT::Inverted); + i2sSetPins(T_BUS::I2sBusNumber, _pin, T_INVERT::Inverted); } void Update(bool)