28
28
*/
29
29
30
30
#include <stdio.h>
31
+ #include "bindings/espidf/__init__.h"
31
32
#include "common-hal/analogbufio/BufferedIn.h"
32
33
#include "shared-bindings/analogbufio/BufferedIn.h"
33
34
#include "shared-bindings/microcontroller/Pin.h"
39
40
#include "freertos/FreeRTOS.h"
40
41
#include "freertos/task.h"
41
42
#include "freertos/semphr.h"
42
- #include "driver/adc.h"
43
43
44
44
// #define DEBUG_ANALOGBUFIO
45
45
@@ -72,12 +72,32 @@ static void stop_dma(analogbufio_bufferedin_obj_t *self);
72
72
void common_hal_analogbufio_bufferedin_construct (analogbufio_bufferedin_obj_t * self , const mcu_pin_obj_t * pin , uint32_t sample_rate ) {
73
73
self -> pin = pin ;
74
74
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 );
75
98
}
76
99
77
100
static 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
-
81
101
const mcu_pin_obj_t * pin = self -> pin ;
82
102
uint32_t sample_rate = self -> sample_rate ;
83
103
@@ -88,10 +108,6 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
88
108
* convert_mode = ADC_CONV_SINGLE_UNIT_2 ;
89
109
}
90
110
91
- if (pin -> adc_index == NO_ADC || pin -> adc_channel == NO_ADC_CHANNEL ) {
92
- raise_ValueError_invalid_pin ();
93
- }
94
-
95
111
/*
96
112
* Chip version Conversion Mode Output Format Type
97
113
* ESP32 1 TYPE1
@@ -101,17 +117,6 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
101
117
* ESP32H3 1,2,BOTH,ALTER TYPE2
102
118
*/
103
119
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
-
115
120
#if defined(CONFIG_IDF_TARGET_ESP32C3 )
116
121
/* ESP32C3 only supports alter mode */
117
122
* convert_mode = ADC_CONV_ALTER_UNIT ;
@@ -121,34 +126,21 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
121
126
* output_format = ADC_DIGI_OUTPUT_FORMAT_TYPE2 ;
122
127
#endif
123
128
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 = {
133
130
.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
137
132
};
138
133
139
134
#if defined(DEBUG_ANALOGBUFIO )
140
135
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 );
141
136
#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 );
143
138
if (ESP_OK != err ) {
144
139
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 );
147
141
}
148
142
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 = {
152
144
.pattern_num = NUM_ADC_CHANNELS ,
153
145
.sample_freq_hz = sample_rate ,
154
146
.conv_mode = * convert_mode ,
@@ -174,25 +166,28 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
174
166
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 );
175
167
#endif // DEBUG_ANALOGBUFIO
176
168
177
- err = adc_digi_controller_configure ( & dig_cfg );
169
+ err = adc_continuous_config ( self -> handle , & dig_cfg );
178
170
if (ESP_OK != err ) {
179
171
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 );
182
173
}
183
- err = adc_digi_start ( );
174
+ err = adc_continuous_start ( self -> handle );
184
175
if (ESP_OK != err ) {
185
176
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 );
188
178
}
179
+ self -> started = true;
189
180
}
190
181
191
182
static 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
+ }
196
191
}
197
192
198
193
bool 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
203
198
if (common_hal_analogbufio_bufferedin_deinited (self )) {
204
199
return ;
205
200
}
201
+ // Release ADC Pin
202
+ reset_pin_number (self -> pin -> number );
206
203
self -> pin = NULL ;
207
204
}
208
205
@@ -242,7 +239,7 @@ static bool check_valid_data(const adc_digi_output_data_t *data, const mcu_pin_o
242
239
}
243
240
244
241
uint32_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 };
246
243
uint32_t captured_samples = 0 ;
247
244
uint32_t captured_bytes = 0 ;
248
245
esp_err_t ret ;
@@ -263,7 +260,7 @@ uint32_t common_hal_analogbufio_bufferedin_readinto(analogbufio_bufferedin_obj_t
263
260
264
261
while (captured_bytes < len ) {
265
262
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 );
267
264
268
265
if (ret == ESP_OK ) {
269
266
for (uint32_t i = 0 ; i < ret_num ; i += ADC_RESULT_BYTE ) {
0 commit comments