arduino-audio-tools
Loading...
Searching...
No Matches
AnalogConfigESP32V1.h
1#pragma once
2
3#include "AudioToolsConfig.h"
4#if (defined(ESP32) && defined(USE_ANALOG) && !USE_LEGACY_I2S) || defined(DOXYGEN)
5
6#include "AudioTools/CoreAudio/AudioTypes.h"
7#include "esp_adc/adc_cali_scheme.h"
8#include "esp_adc/adc_continuous.h"
9#ifdef ARDUINO
10#include "esp32-hal-periman.h"
11#endif
12
13#if CONFIG_IDF_TARGET_ESP32
14#define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
15#define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE1
16#define ADC_CHANNELS \
17 {ADC_CHANNEL_0, ADC_CHANNEL_3, ADC_CHANNEL_4, \
18 ADC_CHANNEL_5, ADC_CHANNEL_6, ADC_CHANNEL_7}
19#define NUM_ADC_CHANNELS 6
20#define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type1.channel)
21#define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type1.data)
22#define HAS_ESP32_DAC
23#define ADC_CHANNEL_TYPE uint16_t
24#define ADC_DATA_TYPE uint16_t
25#elif CONFIG_IDF_TARGET_ESP32S2
26#define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
27#define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
28#define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
29#define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
30#define ADC_CHANNELS \
31 {ADC_CHANNEL_0, ADC_CHANNEL_1, ADC_CHANNEL_2, ADC_CHANNEL_3, ADC_CHANNEL_4, \
32 ADC_CHANNEL_5, ADC_CHANNEL_6, ADC_CHANNEL_7, ADC_CHANNEL_8, ADC_CHANNEL_9}
33#define NUM_ADC_CHANNELS 10
34#define HAS_ESP32_DAC
35#define ADC_CHANNEL_TYPE uint16_t
36#define ADC_DATA_TYPE uint16_t
37#elif CONFIG_IDF_TARGET_ESP32C3 || CONFIG_IDF_TARGET_ESP32H2 || \
38 CONFIG_IDF_TARGET_ESP32C2
39#define ADC_CONV_MODE ADC_CONV_ALTER_UNIT // ESP32C3 only supports alter mode
40#define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
41#define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
42#define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
43#define ADC_CHANNELS \
44 {ADC_CHANNEL_0, ADC_CHANNEL_1, ADC_CHANNEL_2, ADC_CHANNEL_3, ADC_CHANNEL_4}
45#define NUM_ADC_CHANNELS 5
46#define ADC_CHANNEL_TYPE uint32_t
47#define ADC_DATA_TYPE uint32_t
48#elif CONFIG_IDF_TARGET_ESP32C5 || CONFIG_IDF_TARGET_ESP32C6
49#define ADC_CONV_MODE ADC_CONV_ALTER_UNIT
50#define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
51#define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
52#define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
53#define ADC_CHANNELS \
54 {ADC_CHANNEL_0, ADC_CHANNEL_1, ADC_CHANNEL_2, ADC_CHANNEL_3, \
55 ADC_CHANNEL_4, ADC_CHANNEL_5, ADC_CHANNEL_6}
56#define NUM_ADC_CHANNELS 7
57#define ADC_CHANNEL_TYPE uint32_t
58#define ADC_DATA_TYPE uint32_t
59#elif CONFIG_IDF_TARGET_ESP32S3
60#define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
61#define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
62#define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
63#define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
64#define ADC_CHANNELS \
65 {ADC_CHANNEL_0, ADC_CHANNEL_1, ADC_CHANNEL_2, ADC_CHANNEL_3, ADC_CHANNEL_4, \
66 ADC_CHANNEL_5, ADC_CHANNEL_6, ADC_CHANNEL_7, ADC_CHANNEL_8, ADC_CHANNEL_9}
67#define NUM_ADC_CHANNELS 10
68#define ADC_CHANNEL_TYPE uint32_t
69#define ADC_DATA_TYPE uint32_t
70#elif CONFIG_IDF_TARGET_ESP32P4
71#define ADC_CONV_MODE ADC_CONV_SINGLE_UNIT_1
72#define ADC_OUTPUT_TYPE ADC_DIGI_OUTPUT_FORMAT_TYPE2
73#define AUDIO_ADC_GET_CHANNEL(p_data) ((p_data)->type2.channel)
74#define AUDIO_ADC_GET_DATA(p_data) ((p_data)->type2.data)
75#define ADC_CHANNELS \
76 {ADC_CHANNEL_0, ADC_CHANNEL_1, ADC_CHANNEL_2, ADC_CHANNEL_3, \
77 ADC_CHANNEL_4, ADC_CHANNEL_5, ADC_CHANNEL_6, ADC_CHANNEL_7}
78#define NUM_ADC_CHANNELS 8
79#define ADC_CHANNEL_TYPE uint32_t
80#define ADC_DATA_TYPE uint32_t
81#endif
82
83// continuous ADC API should run on ADC1
84
85#define ADC_UNIT ADC_UNIT_1
86#if defined(HAS_ESP32_DAC) && !USE_LEGACY_I2S
87#include "driver/dac_continuous.h"
88#endif
89
90namespace audio_tools {
91
92#if defined(SOC_ADC_DIGI_DATA_BYTES_PER_CONV) && \
93 defined(SOC_ADC_DIGI_RESULT_BYTES)
94#if defined(SOC_ADC_DIGI_MAX_BYTES_PER_CONV_FRAME)
95constexpr uint32_t ADC_CONTINUOUS_RX_MAX_CONV_FRAME_BYTES =
96 SOC_ADC_DIGI_MAX_BYTES_PER_CONV_FRAME;
97#else
98constexpr uint32_t ADC_CONTINUOUS_RX_MAX_CONV_FRAME_BYTES = 4092;
99#endif
100
101inline uint32_t adcContinuousAlignFrameSize(uint32_t frame_size_bytes) {
102 uint32_t alignment = SOC_ADC_DIGI_DATA_BYTES_PER_CONV;
103 if (alignment == 0) return frame_size_bytes;
104 uint32_t remainder = frame_size_bytes % alignment;
105 if (remainder == 0) return frame_size_bytes;
106 return frame_size_bytes + (alignment - remainder);
107}
108
109inline uint32_t adcContinuousMaxConvFrameBytes() {
110 return ADC_CONTINUOUS_RX_MAX_CONV_FRAME_BYTES;
111}
112
113inline uint32_t adcContinuousMaxResultsPerFrame() {
114 return adcContinuousMaxConvFrameBytes() / SOC_ADC_DIGI_RESULT_BYTES;
115}
116#endif
117
126 // allow ADC to access the protected methods
127 friend class AnalogDriverESP32;
128
129 public:
130 // RX: number of DMA conversion frames retained in the driver's internal pool.
131 // This does not change the size of a single application read block.
132 int buffer_count = ANALOG_BUFFER_COUNT;
133 // RX: number of ADC conversion results per DMA conversion frame. This is not
134 // the application measurement block size. With N channels, one frame holds
135 // buffer_size / N samples per channel.
136 int buffer_size = ANALOG_BUFFER_SIZE;
137 RxTxMode rx_tx_mode;
138 TickType_t timeout = portMAX_DELAY;
139
140#ifdef HAS_ESP32_DAC
141 bool is_blocking_write = true;
142 bool use_apll = false;
144 dac_channel_mask_t dac_mono_channel = DAC_CHANNEL_MASK_CH0;
145#endif
146
147 // ADC config parameters
148 bool adc_calibration_active = false;
149 bool is_auto_center_read = false;
150 adc_digi_convert_mode_t adc_conversion_mode = ADC_CONV_MODE;
151 adc_digi_output_format_t adc_output_type = ADC_OUTPUT_TYPE;
152 uint8_t adc_attenuation = ADC_ATTEN_DB_12; // full voltage range of 3.9V
153 uint8_t adc_bit_width = SOC_ADC_DIGI_MAX_BITWIDTH;
154
155 adc_unit_t adc_unit = ADC_UNIT;
156 adc_channel_t adc_channels[NUM_ADC_CHANNELS] = ADC_CHANNELS;
157
159 AnalogConfigESP32V1(RxTxMode rxtxMode = TX_MODE) {
160 sample_rate = 44100;
161 channels = 2;
162 bits_per_sample = 16;
163 rx_tx_mode = rxtxMode;
164 switch (rx_tx_mode) {
165 case RX_MODE: {
166 // make sure that the proposed sample rate is valid
167 if (sample_rate * channels > SOC_ADC_SAMPLE_FREQ_THRES_HIGH) {
168 sample_rate = SOC_ADC_SAMPLE_FREQ_THRES_HIGH / channels;
169 }
170 LOGI("I2S_MODE_ADC_BUILT_IN");
171 break;
172 }
173#ifdef HAS_ESP32_DAC
174 case TX_MODE:
175 use_apll = true;
176 LOGI("I2S_MODE_DAC_BUILT_IN");
177 break;
178#endif
179
180 default:
181 LOGE("RxTxMode not supported: %d", rx_tx_mode);
182 break;
183 }
184 }
185
188
189 void logInfo() {
190 AudioInfo::logInfo();
191#if !defined(ESP32X)
192 if (rx_tx_mode == TX_MODE) {
193 LOGI("analog left output pin: %d", 25);
194 LOGI("analog right output pin: %d", 26);
195 }
196#endif
197#ifdef HAS_ESP32_DAC
198 LOGI("use_apll: %d", use_apll);
199#endif
200 }
201};
202
203#ifndef ANALOG_CONFIG
204#define ANALOG_CONFIG
205using AnalogConfig = AnalogConfigESP32V1;
206#endif
207
208} // namespace audio_tools
209
210#endif
ESP32 specific configuration for i2s input via adc using the adc_continuous API.
Definition AnalogConfigESP32V1.h:125
AnalogConfigESP32V1(RxTxMode rxtxMode=TX_MODE)
Default constructor.
Definition AnalogConfigESP32V1.h:159
AnalogConfigESP32V1(const AnalogConfigESP32V1 &cfg)=default
Copy constructor.
Please use AnalogAudioStream: A very fast ADC and DAC using the ESP32 I2S interface.
Definition AnalogDriverESP32.h:35
RxTxMode
The Microcontroller is the Audio Source (TX_MODE) or Audio Sink (RX_MODE). RXTX_MODE is Source and Si...
Definition AudioTypes.h:30
Generic Implementation of sound input and output for desktop environments using portaudio.
Definition AudioCodecsBase.h:10
Basic Audio information which drives e.g. I2S.
Definition AudioTypes.h:55
sample_rate_t sample_rate
Sample Rate: e.g 44100.
Definition AudioTypes.h:57
uint16_t channels
Number of channels: 2=stereo, 1=mono.
Definition AudioTypes.h:59
uint8_t bits_per_sample
Number of bits per sample (int16_t = 16 bits)
Definition AudioTypes.h:61