3131#include "driver/i2s.h"
3232#include "driver/rtc_io.h"
3333#include "driver/dac.h"
34+ #include "adc1_i2s_private.h"
3435
3536#include "esp_intr.h"
3637#include "esp_err.h"
@@ -83,12 +84,14 @@ typedef struct {
8384 int bits_per_sample ; /*!< Bits per sample*/
8485 i2s_mode_t mode ; /*!< I2S Working mode*/
8586 int use_apll ; /*!< I2S use APLL clock */
87+ uint32_t sample_rate ; /*!< I2S sample rate */
8688} i2s_obj_t ;
8789
8890static i2s_obj_t * p_i2s_obj [I2S_NUM_MAX ] = {0 };
8991static i2s_dev_t * I2S [I2S_NUM_MAX ] = {& I2S0 , & I2S1 };
9092static portMUX_TYPE i2s_spinlock [I2S_NUM_MAX ] = {portMUX_INITIALIZER_UNLOCKED , portMUX_INITIALIZER_UNLOCKED };
91-
93+ static int _i2s_adc_unit = -1 ;
94+ static int _i2s_adc_channel = -1 ;
9295/**
9396 * @brief Pre define APLL parameters, save compute time
9497 * | bits_per_sample | rate | sdm0 | sdm1 | sdm2 | odir
@@ -321,12 +324,11 @@ esp_err_t i2s_set_clk(i2s_port_t i2s_num, uint32_t rate, i2s_bits_per_sample_t b
321324 return ESP_ERR_INVALID_ARG ;
322325 }
323326
324-
325327 if (p_i2s_obj [i2s_num ] == NULL ) {
326328 ESP_LOGE (I2S_TAG , "Not initialized yet" );
327329 return ESP_FAIL ;
328330 }
329-
331+ p_i2s_obj [ i2s_num ] -> sample_rate = rate ;
330332 double clkmdiv = (double )I2S_BASE_CLK / (rate * factor );
331333
332334 if (clkmdiv > 256 ) {
@@ -645,6 +647,18 @@ esp_err_t i2s_start(i2s_port_t i2s_num)
645647{
646648 //start DMA link
647649 I2S_ENTER_CRITICAL ();
650+ i2s_reset_fifo (i2s_num );
651+ //reset dma
652+ I2S [i2s_num ]-> lc_conf .in_rst = 1 ;
653+ I2S [i2s_num ]-> lc_conf .in_rst = 0 ;
654+ I2S [i2s_num ]-> lc_conf .out_rst = 1 ;
655+ I2S [i2s_num ]-> lc_conf .out_rst = 0 ;
656+
657+ I2S [i2s_num ]-> conf .tx_reset = 1 ;
658+ I2S [i2s_num ]-> conf .tx_reset = 0 ;
659+ I2S [i2s_num ]-> conf .rx_reset = 1 ;
660+ I2S [i2s_num ]-> conf .rx_reset = 0 ;
661+
648662 esp_intr_disable (p_i2s_obj [i2s_num ]-> i2s_isr_handle );
649663 I2S [i2s_num ]-> int_clr .val = 0xFFFFFFFF ;
650664 if (p_i2s_obj [i2s_num ]-> mode & I2S_MODE_TX ) {
@@ -677,17 +691,6 @@ esp_err_t i2s_stop(i2s_port_t i2s_num)
677691 i2s_disable_rx_intr (i2s_num );
678692 }
679693 I2S [i2s_num ]-> int_clr .val = I2S [i2s_num ]-> int_st .val ; //clear pending interrupt
680- i2s_reset_fifo (i2s_num );
681- //reset dma
682- I2S [i2s_num ]-> lc_conf .in_rst = 1 ;
683- I2S [i2s_num ]-> lc_conf .in_rst = 0 ;
684- I2S [i2s_num ]-> lc_conf .out_rst = 1 ;
685- I2S [i2s_num ]-> lc_conf .out_rst = 0 ;
686-
687- I2S [i2s_num ]-> conf .tx_reset = 1 ;
688- I2S [i2s_num ]-> conf .tx_reset = 0 ;
689- I2S [i2s_num ]-> conf .rx_reset = 1 ;
690- I2S [i2s_num ]-> conf .rx_reset = 0 ;
691694 I2S_EXIT_CRITICAL ();
692695 return 0 ;
693696}
@@ -714,10 +717,18 @@ esp_err_t i2s_set_dac_mode(i2s_dac_mode_t dac_mode)
714717 return ESP_OK ;
715718}
716719
720+ static esp_err_t _i2s_adc_mode_recover ()
721+ {
722+ I2S_CHECK (((_i2s_adc_unit != -1 ) && (_i2s_adc_channel != -1 )), "i2s ADC recover error, not initialized..." , ESP_ERR_INVALID_ARG );
723+ return adc_i2s_mode_init (_i2s_adc_unit , _i2s_adc_channel );
724+ }
725+
717726esp_err_t i2s_set_adc_mode (adc_unit_t adc_unit , adc1_channel_t adc_channel )
718727{
719728 I2S_CHECK ((adc_unit < ADC_UNIT_2 ), "i2s ADC unit error, only support ADC1 for now" , ESP_ERR_INVALID_ARG );
720729 // For now, we only support SAR ADC1.
730+ _i2s_adc_unit = adc_unit ;
731+ _i2s_adc_channel = adc_channel ;
721732 return adc_i2s_mode_init (adc_unit , adc_channel );
722733}
723734
@@ -856,7 +867,7 @@ static esp_err_t i2s_param_config(i2s_port_t i2s_num, const i2s_config_t *i2s_co
856867 //initialize the specific ADC channel.
857868 //in the current stage, we only support ADC1 and single channel mode.
858869 //In default data mode, the ADC data is in 12-bit resolution mode.
859- adc_power_on ();
870+ adc_power_always_on ();
860871 }
861872 // configure I2S data port interface.
862873 i2s_reset_fifo (i2s_num );
@@ -1144,6 +1155,27 @@ int i2s_write_bytes(i2s_port_t i2s_num, const char *src, size_t size, TickType_t
11441155 return bytes_writen ;
11451156}
11461157
1158+ esp_err_t i2s_adc_enable (i2s_port_t i2s_num )
1159+ {
1160+ I2S_CHECK ((i2s_num < I2S_NUM_MAX ), "i2s_num error" , ESP_ERR_INVALID_ARG );
1161+ I2S_CHECK ((p_i2s_obj [i2s_num ] != NULL ), "Not initialized yet" , ESP_ERR_INVALID_STATE );
1162+ I2S_CHECK ((p_i2s_obj [i2s_num ]-> mode & I2S_MODE_ADC_BUILT_IN ), "i2s built-in adc not enabled" , ESP_ERR_INVALID_STATE );
1163+
1164+ adc1_i2s_mode_acquire ();
1165+ _i2s_adc_mode_recover ();
1166+ return i2s_set_clk (i2s_num , p_i2s_obj [i2s_num ]-> sample_rate , p_i2s_obj [i2s_num ]-> bits_per_sample , p_i2s_obj [i2s_num ]-> channel_num );
1167+ }
1168+
1169+ esp_err_t i2s_adc_disable (i2s_port_t i2s_num )
1170+ {
1171+ I2S_CHECK ((i2s_num < I2S_NUM_MAX ), "i2s_num error" , ESP_ERR_INVALID_ARG );
1172+ I2S_CHECK ((p_i2s_obj [i2s_num ] != NULL ), "Not initialized yet" , ESP_ERR_INVALID_STATE );
1173+ I2S_CHECK ((p_i2s_obj [i2s_num ]-> mode & I2S_MODE_ADC_BUILT_IN ), "i2s built-in adc not enabled" , ESP_ERR_INVALID_STATE );
1174+
1175+ adc1_lock_release ();
1176+ return ESP_OK ;
1177+ }
1178+
11471179int i2s_read_bytes (i2s_port_t i2s_num , char * dest , size_t size , TickType_t ticks_to_wait )
11481180{
11491181 char * data_ptr ;
0 commit comments