8000 Merge pull request #8435 from tannewt/fix_esp32_with5.1 · tannewt/circuitpython@44d27cb · GitHub
[go: up one dir, main page]

Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Appearance settings

Commit 44d27cb

Browse files
authored
Merge pull request micropython#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)
0