Skip to content

Update ADC and I2S APIs for 5.1 #8435

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Sep 27, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 0 additions & 3 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -147,9 +147,6 @@
[submodule "ports/espressif/esp-protocols"]
path = ports/espressif/esp-protocols
url = https://github.com/espressif/esp-protocols.git
[submodule "ports/espressif/esp-iot-solution"]
path = ports/espressif/esp-iot-solution
url = https://github.com/espressif/esp-iot-solution.git
[submodule "ports/espressif/esp-camera"]
path = ports/espressif/esp-camera
url = https://github.com/adafruit/esp32-camera.git
Expand Down
26 changes: 2 additions & 24 deletions locale/circuitpython.pot
Original file line number Diff line number Diff line change
Expand Up @@ -447,10 +447,6 @@ msgstr ""
msgid "A hardware interrupt channel is already in use"
msgstr ""

#: ports/espressif/common-hal/analogio/AnalogIn.c
msgid "ADC2 is being used by WiFi"
msgstr ""

#: ports/raspberrypi/common-hal/wifi/Radio.c
msgid "AP could not be started"
msgstr ""
Expand Down Expand Up @@ -2156,11 +2152,6 @@ msgstr ""
msgid "Unable to allocate the heap."
msgstr ""

#: ports/espressif/common-hal/analogbufio/BufferedIn.c
#, c-format
msgid "Unable to configure ADC DMA controller, ErrorCode:%d"
msgstr ""

#: ports/espressif/common-hal/busio/I2C.c
msgid "Unable to create lock"
msgstr ""
Expand All @@ -2179,20 +2170,10 @@ msgstr ""
msgid "Unable to init parser"
msgstr ""

#: ports/espressif/common-hal/analogbufio/BufferedIn.c
#, c-format
msgid "Unable to initialize ADC DMA controller, ErrorCode:%d"
msgstr ""

#: shared-module/displayio/OnDiskBitmap.c
msgid "Unable to read color palette data"
msgstr ""

#: ports/espressif/common-hal/analogbufio/BufferedIn.c
#, c-format
msgid "Unable to start ADC DMA controller, ErrorCode:%d"
msgstr ""

#: ports/espressif/common-hal/mdns/Server.c
#: ports/raspberrypi/common-hal/mdns/Server.c
msgid "Unable to start mDNS query"
Expand Down Expand Up @@ -4207,7 +4188,8 @@ msgstr ""
msgid "unexpected keyword argument"
msgstr ""

#: py/bc.c py/objnamedtuple.c shared-bindings/traceback/__init__.c
#: py/argcheck.c py/bc.c py/objnamedtuple.c
#: shared-bindings/traceback/__init__.c
msgid "unexpected keyword argument '%q'"
msgstr ""

Expand Down Expand Up @@ -4364,10 +4346,6 @@ msgstr ""
msgid "wrong output type"
msgstr ""

#: ports/espressif/common-hal/audiobusio/__init__.c
msgid "xTaskCreate failed"
msgstr ""

#: extmod/ulab/code/scipy/signal/signal.c
msgid "zi must be an ndarray"
msgstr ""
Expand Down
2 changes: 2 additions & 0 deletions main.c
Original file line number Diff line number Diff line change
Expand Up @@ -1190,7 +1190,9 @@ void NORETURN nlr_jump_fail(void *val) {

#ifndef NDEBUG
static void NORETURN __fatal_error(const char *msg) {
#if CIRCUITPY_DEBUG == 0
reset_into_safe_mode(SAFE_MODE_HARD_FAULT);
#endif
while (true) {
}
}
Expand Down
11 changes: 0 additions & 11 deletions ports/espressif/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -304,17 +304,6 @@ ifneq ($(CIRCUITPY_BLEIO),0)
SRC_C += common-hal/_bleio/ble_events.c
endif

ifneq ($(CIRCUITPY_PARALLELDISPLAY),0)
ifeq ($(IDF_TARGET),esp32s3)
LCD_SRC = 8080_lcd_$(IDF_TARGET)
else
LCD_SRC = i2s_lcd_$(IDF_TARGET)_driver
endif
SRC_C += esp-iot-solution/components/bus/$(LCD_SRC).c
$(BUILD)/esp-iot-solution/components/bus/$(LCD_SRC).o: CFLAGS += -Wno-sign-compare
CFLAGS += -isystem esp-iot-solution/components/bus/include
endif

ifneq ($(CIRCUITPY_DOTCLOCKFRAMEBUFFER),0)
CFLAGS += -isystem esp-idf/components/esp_lcd/include
CFLAGS += -isystem esp-idf/components/esp_lcd/interface
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,9 @@ CIRCUITPY_CREATION_ID = 0x00320003
IDF_TARGET = esp32

CIRCUITPY_ESP_FLASH_SIZE = 8MB
CIRCUITPY_ESP_FLASH_MODE = dio
CIRCUITPY_ESP_FLASH_FREQ = 40m
CIRCUITPY_ESP_FLASH_MODE = qio
CIRCUITPY_ESP_FLASH_FREQ = 80m

CIRCUITPY_ESP_PSRAM_SIZE = 2MB
CIRCUITPY_ESP_PSRAM_MODE = qio
CIRCUITPY_ESP_PSRAM_FREQ = 40m
CIRCUITPY_ESP_PSRAM_FREQ = 80m
95 changes: 46 additions & 49 deletions ports/espressif/common-hal/analogbufio/BufferedIn.c
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@
*/

#include <stdio.h>
#include "bindings/espidf/__init__.h"
#include "common-hal/analogbufio/BufferedIn.h"
#include "shared-bindings/analogbufio/BufferedIn.h"
#include "shared-bindings/microcontroller/Pin.h"
Expand All @@ -39,7 +40,6 @@
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/semphr.h"
#include "driver/adc.h"

// #define DEBUG_ANALOGBUFIO

Expand Down Expand Up @@ -72,12 +72,32 @@ static void stop_dma(analogbufio_bufferedin_obj_t *self);
void common_hal_analogbufio_bufferedin_construct(analogbufio_bufferedin_obj_t *self, const mcu_pin_obj_t *pin, uint32_t sample_rate) {
self->pin = pin;
self->sample_rate = sample_rate;
if (pin->adc_index == NO_ADC || pin->adc_channel == NO_ADC_CHANNEL) {
raise_ValueError_invalid_pin();
}

#if defined(CONFIG_IDF_TARGET_ESP32)
if (pin->adc_index != ADC_UNIT_1) {
/*
* ESP32 only supports ADC1 unit
* https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
* Table 29-3
*/
raise_ValueError_invalid_pin();
}
#endif

// C3 and S3 have errata related to ADC2 and continuous mode.
#if (defined(CONFIG_IDF_TARGET_ESP32C3) || defined(CONFIG_IDF_TARGET_ESP32S3)) && !defined(CONFIG_ADC_CONTINUOUS_FORCE_USE_ADC2_ON_C3_S3)
if (pin->adc_index != ADC_UNIT_1) {
raise_ValueError_invalid_pin();
}
#endif

common_hal_mcu_pin_claim(pin);
}

static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_t *convert_mode, adc_digi_output_format_t *output_format) {
uint16_t adc1_chan_mask = 0;
uint16_t adc2_chan_mask = 0;

const mcu_pin_obj_t *pin = self->pin;
uint32_t sample_rate = self->sample_rate;

Expand All @@ -88,10 +108,6 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
*convert_mode = ADC_CONV_SINGLE_UNIT_2;
}

if (pin->adc_index == NO_ADC || pin->adc_channel == NO_ADC_CHANNEL) {
raise_ValueError_invalid_pin();
}

/*
* Chip version Conversion Mode Output Format Type
* ESP32 1 TYPE1
Expand All @@ -101,17 +117,6 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
* ESP32H3 1,2,BOTH,ALTER TYPE2
*/

#if defined(CONFIG_IDF_TARGET_ESP32)
if (pin->adc_index != ADC_UNIT_1) {
/*
* ESP32 only supports ADC1 unit
* https://www.espressif.com/sites/default/files/documentation/esp32_technical_reference_manual_en.pdf
* Table 29-3
*/
raise_ValueError_invalid_pin();
}
#endif

#if defined(CONFIG_IDF_TARGET_ESP32C3)
/* ESP32C3 only supports alter mode */
*convert_mode = ADC_CONV_ALTER_UNIT;
Expand All @@ -121,34 +126,21 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
*output_format = ADC_DIGI_OUTPUT_FORMAT_TYPE2;
#endif

common_hal_mcu_pin_claim(pin);

if (pin->adc_index == ADC_UNIT_1) {
adc1_chan_mask = 1 << pin->adc_channel;
} else {
adc2_chan_mask = 1 << pin->adc_channel;
}

adc_digi_init_config_t adc_dma_config = {
adc_continuous_handle_cfg_t adc_dma_config = {
.max_store_buf_size = DMA_BUFFER_SIZE,
.conv_num_each_intr = NUM_SAMPLES_PER_INTERRUPT,
.adc1_chan_mask = adc1_chan_mask,
.adc2_chan_mask = adc2_chan_mask,
.conv_frame_size = NUM_SAMPLES_PER_INTERRUPT * SOC_ADC_DIGI_DATA_BYTES_PER_CONV
};

#if defined(DEBUG_ANALOGBUFIO)
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);
#endif // DEBUG_ANALOGBUFIO
esp_err_t err = adc_digi_initialize(&adc_dma_config);
esp_err_t err = adc_continuous_new_handle(&adc_dma_config, &self->handle);
if (ESP_OK != err) {
stop_dma(self);
common_hal_analogbufio_bufferedin_deinit(self);
mp_raise_ValueError_varg(translate("Unable to initialize ADC DMA controller, ErrorCode:%d"), err);
CHECK_ESP_RESULT(err);
}

adc_digi_configuration_t dig_cfg = {
.conv_limit_en = ADC_CONV_LIMIT_EN,
.conv_limit_num = 250,
adc_continuous_config_t dig_cfg = {
.pattern_num = NUM_ADC_CHANNELS,
.sample_freq_hz = sample_rate,
.conv_mode = *convert_mode,
Expand All @@ -174,25 +166,28 @@ static void start_dma(analogbufio_bufferedin_obj_t *self, adc_digi_convert_mode_
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);
#endif // DEBUG_ANALOGBUFIO

err = adc_digi_controller_configure(&dig_cfg);
err = adc_continuous_config(self->handle, &dig_cfg);
if (ESP_OK != err) {
stop_dma(self);
common_hal_analogbufio_bufferedin_deinit(self);
mp_raise_ValueError_varg(translate("Unable to configure ADC DMA controller, ErrorCode:%d"), err);
CHECK_ESP_RESULT(err);
}
err = adc_digi_start();
err = adc_continuous_start(self->handle);
if (ESP_OK != err) {
stop_dma(self);
common_hal_analogbufio_bufferedin_deinit(self);
mp_raise_ValueError_varg(translate("Unable to start ADC DMA controller, ErrorCode:%d"), err);
CHECK_ESP_RESULT(err);
}
self->started = true;
}

static void stop_dma(analogbufio_bufferedin_obj_t *self) {
adc_digi_stop();
adc_digi_deinitialize();
// Release ADC Pin
reset_pin_number(self->pin->number);
if (self->started) {
adc_continuous_stop(self->handle);
self->started = false;
}
if (self->handle != NULL) {
adc_continuous_deinit(self->handle);
self->handle = NULL;
}
}

bool common_hal_analogbufio_bufferedin_deinited(analogbufio_bufferedin_obj_t *self) {
Expand All @@ -203,6 +198,8 @@ void common_hal_analogbufio_bufferedin_deinit(analogbufio_bufferedin_obj_t *self
if (common_hal_analogbufio_bufferedin_deinited(self)) {
return;
}
// Release ADC Pin
reset_pin_number(self->pin->number);
self->pin = NULL;
}

Expand Down Expand Up @@ -242,7 +239,7 @@ static bool check_valid_data(const adc_digi_output_data_t *data, const mcu_pin_o
}

uint32_t common_hal_analogbufio_bufferedin_readinto(analogbufio_bufferedin_obj_t *self, uint8_t *buffer, uint32_t len, uint8_t bytes_per_sample) {
uint8_t result[NUM_SAMPLES_PER_INTERRUPT] __attribute__ ((aligned(4))) = {0};
uint8_t result[NUM_SAMPLES_PER_INTERRUPT * SOC_ADC_DIGI_DATA_BYTES_PER_CONV] __attribute__ ((aligned(4))) = {0};
uint32_t captured_samples = 0;
uint32_t captured_bytes = 0;
esp_err_t ret;
Expand All @@ -263,7 +260,7 @@ uint32_t common_hal_analogbufio_bufferedin_readinto(analogbufio_bufferedin_obj_t

while (captured_bytes < len) {
ret_num = 0;
ret = adc_digi_read_bytes(result, NUM_SAMPLES_PER_INTERRUPT, &ret_num, ADC_READ_TIMEOUT_MS);
ret = adc_continuous_read(self->handle, result, NUM_SAMPLES_PER_INTERRUPT * SOC_ADC_DIGI_DATA_BYTES_PER_CONV, &ret_num, ADC_READ_TIMEOUT_MS);

if (ret == ESP_OK) {
for (uint32_t i = 0; i < ret_num; i += ADC_RESULT_BYTE) {
Expand Down
4 changes: 4 additions & 0 deletions ports/espressif/common-hal/analogbufio/BufferedIn.h
Original file line number Diff line number Diff line change
Expand Up @@ -32,11 +32,15 @@
#include "common-hal/microcontroller/Pin.h"
#include "py/obj.h"

#include "components/esp_adc/include/esp_adc/adc_continuous.h"

// This is the analogbufio object
typedef struct {
mp_obj_base_t base;
const mcu_pin_obj_t *pin;
uint32_t sample_rate;
adc_continuous_handle_t handle;
bool started;
} analogbufio_bufferedin_obj_t;

#endif // MICROPY_INCLUDED_ESP32_COMMON_HAL_ANALOGBUFIO_BUFFEREDIN_H
4 changes: 3 additions & 1 deletion ports/espressif/common-hal/analogio/AnalogOut.c
Original file line number Diff line number Diff line change
Expand Up @@ -96,7 +96,9 @@ void common_hal_analogio_analogout_set_value(analogio_analogout_obj_t *self,
void analogout_reset(void) {
#ifdef SOC_DAC_SUPPORTED
for (uint8_t c = 0; c < SOC_DAC_CHAN_NUM; c++) {
dac_oneshot_del_channel(_active_handles[c]);
if (_active_handles[c] != NULL) {
dac_oneshot_del_channel(_active_handles[c]);
}
_active_handles[c] = NULL;
}
#endif
Expand Down
Loading