2828 */
2929
3030#include <stdio.h>
31+ #include "bindings/espidf/__init__.h"
3132#include "common-hal/analogbufio/BufferedIn.h"
3233#include "shared-bindings/analogbufio/BufferedIn.h"
3334#include "shared-bindings/microcontroller/Pin.h"
3940#include "freertos/FreeRTOS.h"
4041#include "freertos/task.h"
4142#include "freertos/semphr.h"
42- #include "driver/adc.h"
4343
4444// #define DEBUG_ANALOGBUFIO
4545
@@ -72,12 +72,32 @@ static void stop_dma(analogbufio_bufferedin_obj_t *self);
7272void common_hal_analogbufio_bufferedin_construct (analogbufio_bufferedin_obj_t * self , const mcu_pin_obj_t * pin , uint32_t sample_rate ) {
7373 self -> pin = pin ;
7474 self -> sample_rate = sample_rate ;
75+ if (pin -> adc_index == NO_ADC || pin -> adc_channel == NO_ADC_CHANNEL ) {
76+ raise_ValueError_invalid_pin ();
77+ }
78+
79+ #if defined(CONFIG_IDF_TARGET_ESP32 )
80+ if (pin -> adc_index != ADC_UNIT_1 ) {
81+ /*
82+ * ESP32 only supports ADC1 unit
83+ * https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
84+ * Table 29-3
85+ */
86+ raise_ValueError_invalid_pin ();
87+ }
88+ #endif
89+
90+ // C3 and S3 have errata related to ADC2 and continuous mode.
91+ #if (defined(CONFIG_IDF_TARGET_ESP32C3 ) || defined(CONFIG_IDF_TARGET_ESP32S3 )) && !defined(CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3 )
92+ if (pin -> adc_index != ADC_UNIT_1 ) {
93+ raise_ValueError_invalid_pin ();
94+ }
95+ #endif
96+
97+ common_hal_mcu_pin_claim (pin );
7598}
7699
77100static void start_dma (analogbufio_bufferedin_obj_t * self , adc_digi_convert_mode_t * convert_mode , adc_digi_output_format_t * output_format ) {
78- uint16_t adc1_chan_mask = 0 ;
79- uint16_t adc2_chan_mask = 0 ;
80-
81101 const mcu_pin_obj_t * pin = self -> pin ;
82102 uint32_t sample_rate = self -> sample_rate ;
83103
@@ -88,10 +108,6 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
88108 * convert_mode = ADC_CONV_SINGLE_UNIT_2 ;
89109 }
90110
91- if (pin -> adc_index == NO_ADC || pin -> adc_channel == NO_ADC_CHANNEL ) {
92- raise_ValueError_invalid_pin ();
93- }
94-
95111 /*
96112 * Chip version Conversion Mode Output Format Type
97113 * ESP32 1 TYPE1
@@ -101,17 +117,6 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
101117 * ESP32H3 1,2,BOTH,ALTER TYPE2
102118 */
103119
104- #if defined(CONFIG_IDF_TARGET_ESP32 )
105- if (pin -> adc_index != ADC_UNIT_1 ) {
106- /*
107- * ESP32 only supports ADC1 unit
108- * https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
109- * Table 29-3
110- */
111- raise_ValueError_invalid_pin ();
112- }
113- #endif
114-
115120 #if defined(CONFIG_IDF_TARGET_ESP32C3 )
116121 /* ESP32C3 only supports alter mode */
117122 * convert_mode = ADC_CONV_ALTER_UNIT ;
@@ -121,34 +126,21 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
121126 * output_format = ADC_DIGI_OUTPUT_FORMAT_TYPE2 ;
122127 #endif
123128
124- common_hal_mcu_pin_claim (pin );
125-
126- if (pin -> adc_index == ADC_UNIT_1 ) {
127- adc1_chan_mask = 1 << pin -> adc_channel ;
128- } else {
129- adc2_chan_mask = 1 << pin -> adc_channel ;
130- }
131-
132- adc_digi_init_config_t adc_dma_config = {
129+ adc_continuous_handle_cfg_t adc_dma_config = {
133130 .max_store_buf_size = DMA_BUFFER_SIZE ,
134- .conv_num_each_intr = NUM_SAMPLES_PER_INTERRUPT ,
135- .adc1_chan_mask = adc1_chan_mask ,
136- .adc2_chan_mask = adc2_chan_mask ,
131+ .conv_frame_size = NUM_SAMPLES_PER_INTERRUPT * SOC_ADC_DIGI_DATA_BYTES_PER_CONV
137132 };
138133
139134 #if defined(DEBUG_ANALOGBUFIO )
140135 mp_printf (& mp_plat_print , "pin:%d, ADC channel:%d, ADC index:%d, adc1_chan_mask:0x%x, adc2_chan_mask:0x%x\n" , pin -> number , pin -> adc_channel , pin -> adc_index , adc1_chan_mask , adc2_chan_mask );
141136 #endif // DEBUG_ANALOGBUFIO
142- esp_err_t err = adc_digi_initialize (& adc_dma_config );
137+ esp_err_t err = adc_continuous_new_handle (& adc_dma_config , & self -> handle );
143138 if (ESP_OK != err ) {
144139 stop_dma (self );
145- common_hal_analogbufio_bufferedin_deinit (self );
146- mp_raise_ValueError_varg (translate ("Unable to initialize ADC DMA controller, ErrorCode:%d" ), err );
140+ CHECK_ESP_RESULT (err );
147141 }
148142
149- adc_digi_configuration_t dig_cfg = {
150- .conv_limit_en = ADC_CONV_LIMIT_EN ,
151- .conv_limit_num = 250 ,
143+ adc_continuous_config_t dig_cfg = {
152144 .pattern_num = NUM_ADC_CHANNELS ,
153145 .sample_freq_hz = sample_rate ,
154146 .conv_mode = * convert_mode ,
@@ -174,25 +166,28 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
174166 mp_printf (& mp_plat_print , "adc_pattern[0].channel:%d, adc_pattern[0].unit:%d, adc_pattern[0].atten:%d\n" , adc_pattern [0 ].channel , adc_pattern [0 ].unit , adc_pattern [0 ].atten );
175167 #endif // DEBUG_ANALOGBUFIO
176168
177- err = adc_digi_controller_configure ( & dig_cfg );
169+ err = adc_continuous_config ( self -> handle , & dig_cfg );
178170 if (ESP_OK != err ) {
179171 stop_dma (self );
180- common_hal_analogbufio_bufferedin_deinit (self );
181- mp_raise_ValueError_varg (translate ("Unable to configure ADC DMA controller, ErrorCode:%d" ), err );
172+ CHECK_ESP_RESULT (err );
182173 }
183- err = adc_digi_start ( );
174+ err = adc_continuous_start ( self -> handle );
184175 if (ESP_OK != err ) {
185176 stop_dma (self );
186- common_hal_analogbufio_bufferedin_deinit (self );
187- mp_raise_ValueError_varg (translate ("Unable to start ADC DMA controller, ErrorCode:%d" ), err );
177+ CHECK_ESP_RESULT (err );
188178 }
179+ self -> started = true;
189180}
190181
191182static void stop_dma (analogbufio_bufferedin_obj_t * self ) {
192- adc_digi_stop ();
193- adc_digi_deinitialize ();
194- // Release ADC Pin
195- reset_pin_number (self -> pin -> number );
183+ if (self -> started ) {
184+ adc_continuous_stop (self -> handle );
185+ self -> started = false;
186+ }
187+ if (self -> handle != NULL ) {
188+ adc_continuous_deinit (self -> handle );
189+ self -> handle = NULL ;
190+ }
196191}
197192
198193bool common_hal_analogbufio_bufferedin_deinited (analogbufio_bufferedin_obj_t * self ) {
@@ -203,6 +198,8 @@ void common_hal_analogbufio_bufferedin_deinit(analogbufio_bufferedin_obj_t *self
203198 if (common_hal_analogbufio_bufferedin_deinited (self )) {
204199 return ;
205200 }
201+ // Release ADC Pin
202+ reset_pin_number (self -> pin -> number );
206203 self -> pin = NULL ;
207204}
208205
@@ -242,7 +239,7 @@ static bool check_valid_data(const adc_digi_output_data_t *data, const mcu_pin_o
242239}
243240
244241uint32_t common_hal_analogbufio_bufferedin_readinto (analogbufio_bufferedin_obj_t * self , uint8_t * buffer , uint32_t len , uint8_t bytes_per_sample ) {
245- uint8_t result [NUM_SAMPLES_PER_INTERRUPT ] __attribute__ ((aligned (4 ))) = {0 };
242+ uint8_t result [NUM_SAMPLES_PER_INTERRUPT * SOC_ADC_DIGI_DATA_BYTES_PER_CONV ] __attribute__ ((aligned (4 ))) = {0 };
246243 uint32_t captured_samples = 0 ;
247244 uint32_t captured_bytes = 0 ;
248245 esp_err_t ret ;
@@ -263,7 +260,7 @@ uint32_t common_hal_analogbufio_bufferedin_readinto(analogbufio_bufferedin_obj_t
263260
264261 while (captured_bytes < len ) {
265262 ret_num = 0 ;
266- ret = adc_digi_read_bytes ( result , NUM_SAMPLES_PER_INTERRUPT , & ret_num , ADC_READ_TIMEOUT_MS );
263+ ret = adc_continuous_read ( self -> handle , result , NUM_SAMPLES_PER_INTERRUPT * SOC_ADC_DIGI_DATA_BYTES_PER_CONV , & ret_num , ADC_READ_TIMEOUT_MS );
267264
268265 if (ret == ESP_OK ) {
269266 for (uint32_t i = 0 ; i < ret_num ; i += ADC_RESULT_BYTE ) {
0 commit comments