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