Skip to content

Commit 44d27cb

Browse files
authored
Merge pull request #8435 from tannewt/fix_esp32_with5.1
Update ADC and I2S APIs for 5.1
2 parents 1c0155c + 3fdfb9b commit 44d27cb

23 files changed

+177
-285
lines changed

.gitmodules

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -147,9 +147,6 @@
147147
[submodule "ports/espressif/esp-protocols"]
148148
path = ports/espressif/esp-protocols
149149
url = https://github.com/espressif/esp-protocols.git
150-
[submodule "ports/espressif/esp-iot-solution"]
151-
path = ports/espressif/esp-iot-solution
152-
url = https://github.com/espressif/esp-iot-solution.git
153150
[submodule "ports/espressif/esp-camera"]
154151
path = ports/espressif/esp-camera
155152
url = https://github.com/adafruit/esp32-camera.git

locale/circuitpython.pot

Lines changed: 2 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -447,10 +447,6 @@ msgstr ""
447447
msgid "A hardware interrupt channel is already in use"
448448
msgstr ""
449449

450-
#: ports/espressif/common-hal/analogio/AnalogIn.c
451-
msgid "ADC2 is being used by WiFi"
452-
msgstr ""
453-
454450
#: ports/raspberrypi/common-hal/wifi/Radio.c
455451
msgid "AP could not be started"
456452
msgstr ""
@@ -2156,11 +2152,6 @@ msgstr ""
21562152
msgid "Unable to allocate the heap."
21572153
msgstr ""
21582154

2159-
#: ports/espressif/common-hal/analogbufio/BufferedIn.c
2160-
#, c-format
2161-
msgid "Unable to configure ADC DMA controller, ErrorCode:%d"
2162-
msgstr ""
2163-
21642155
#: ports/espressif/common-hal/busio/I2C.c
21652156
msgid "Unable to create lock"
21662157
msgstr ""
@@ -2179,20 +2170,10 @@ msgstr ""
21792170
msgid "Unable to init parser"
21802171
msgstr ""
21812172

2182-
#: ports/espressif/common-hal/analogbufio/BufferedIn.c
2183-
#, c-format
2184-
msgid "Unable to initialize ADC DMA controller, ErrorCode:%d"
2185-
msgstr ""
2186-
21872173
#: shared-module/displayio/OnDiskBitmap.c
21882174
msgid "Unable to read color palette data"
21892175
msgstr ""
21902176

2191-
#: ports/espressif/common-hal/analogbufio/BufferedIn.c
2192-
#, c-format
2193-
msgid "Unable to start ADC DMA controller, ErrorCode:%d"
2194-
msgstr ""
2195-
21962177
#: ports/espressif/common-hal/mdns/Server.c
21972178
#: ports/raspberrypi/common-hal/mdns/Server.c
21982179
msgid "Unable to start mDNS query"
@@ -4207,7 +4188,8 @@ msgstr ""
42074188
msgid "unexpected keyword argument"
42084189
msgstr ""
42094190

4210-
#: py/bc.c py/objnamedtuple.c shared-bindings/traceback/__init__.c
4191+
#: py/argcheck.c py/bc.c py/objnamedtuple.c
4192+
#: shared-bindings/traceback/__init__.c
42114193
msgid "unexpected keyword argument '%q'"
42124194
msgstr ""
42134195

@@ -4364,10 +4346,6 @@ msgstr ""
43644346
msgid "wrong output type"
43654347
msgstr ""
43664348

4367-
#: ports/espressif/common-hal/audiobusio/__init__.c
4368-
msgid "xTaskCreate failed"
4369-
msgstr ""
4370-
43714349
#: extmod/ulab/code/scipy/signal/signal.c
43724350
msgid "zi must be an ndarray"
43734351
msgstr ""

main.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1190,7 +1190,9 @@ void NORETURN nlr_jump_fail(void *val) {
11901190

11911191
#ifndef NDEBUG
11921192
static void NORETURN __fatal_error(const char *msg) {
1193+
#if CIRCUITPY_DEBUG == 0
11931194
reset_into_safe_mode(SAFE_MODE_HARD_FAULT);
1195+
#endif
11941196
while (true) {
11951197
}
11961198
}

ports/espressif/Makefile

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -304,17 +304,6 @@ ifneq ($(CIRCUITPY_BLEIO),0)
304304
SRC_C += common-hal/_bleio/ble_events.c
305305
endif
306306

307-
ifneq ($(CIRCUITPY_PARALLELDISPLAY),0)
308-
ifeq ($(IDF_TARGET),esp32s3)
309-
LCD_SRC = 8080_lcd_$(IDF_TARGET)
310-
else
311-
LCD_SRC = i2s_lcd_$(IDF_TARGET)_driver
312-
endif
313-
SRC_C += esp-iot-solution/components/bus/$(LCD_SRC).c
314-
$(BUILD)/esp-iot-solution/components/bus/$(LCD_SRC).o: CFLAGS += -Wno-sign-compare
315-
CFLAGS += -isystem esp-iot-solution/components/bus/include
316-
endif
317-
318307
ifneq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),0)
319308
CFLAGS += -isystem esp-idf/components/esp_lcd/include
320309
CFLAGS += -isystem esp-idf/components/esp_lcd/interface

ports/espressif/boards/adafruit_qtpy_esp32_pico/mpconfigboard.mk

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ CIRCUITPY_CREATION_ID = 0x00320003
44
IDF_TARGET = esp32
55

66
CIRCUITPY_ESP_FLASH_SIZE = 8MB
7-
CIRCUITPY_ESP_FLASH_MODE = dio
8-
CIRCUITPY_ESP_FLASH_FREQ = 40m
7+
CIRCUITPY_ESP_FLASH_MODE = qio
8+
CIRCUITPY_ESP_FLASH_FREQ = 80m
99

1010
CIRCUITPY_ESP_PSRAM_SIZE = 2MB
1111
CIRCUITPY_ESP_PSRAM_MODE = qio
12-
CIRCUITPY_ESP_PSRAM_FREQ = 40m
12+
CIRCUITPY_ESP_PSRAM_FREQ = 80m

ports/espressif/common-hal/analogbufio/BufferedIn.c

Lines changed: 46 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
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"
@@ -39,7 +40,6 @@
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);
7272
void 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

77100
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-
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

191182
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+
}
196191
}
197192

198193
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
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

244241
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};
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) {

ports/espressif/common-hal/analogbufio/BufferedIn.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,11 +32,15 @@
3232
#include "common-hal/microcontroller/Pin.h"
3333
#include "py/obj.h"
3434

35+
#include "components/esp_adc/include/esp_adc/adc_continuous.h"
36+
3537
// This is the analogbufio object
3638
typedef struct {
3739
mp_obj_base_t base;
3840
const mcu_pin_obj_t *pin;
3941
uint32_t sample_rate;
42+
adc_continuous_handle_t handle;
43+
bool started;
4044
} analogbufio_bufferedin_obj_t;
4145

4246
#endif // MICROPY_INCLUDED_ESP32_COMMON_HAL_ANALOGBUFIO_BUFFEREDIN_H

ports/espressif/common-hal/analogio/AnalogOut.c

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -96,7 +96,9 @@ void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self,
9696
void analogout_reset(void) {
9797
#ifdef SOC_DAC_SUPPORTED
9898
for (uint8_t c = 0; c < SOC_DAC_CHAN_NUM; c++) {
99-
dac_oneshot_del_channel(_active_handles[c]);
99+
if (_active_handles[c] != NULL) {
100+
dac_oneshot_del_channel(_active_handles[c]);
101+
}
100102
_active_handles[c] = NULL;
101103
}
102104
#endif

0 commit comments

Comments
 (0)