1 /*
2 * SPDX-FileCopyrightText: 2019-2022 Espressif Systems (Shanghai) CO LTD
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7 #include <zephyr/kernel.h>
8 #include <zephyr/drivers/gpio.h>
9 #include <zephyr/logging/log.h>
10 #include <esp_types.h>
11 #include <stdlib.h>
12 #include <ctype.h>
13 #include "sdkconfig.h"
14 #include "esp_log.h"
15 #include "esp_check.h"
16 #include "esp_pm.h"
17 #include "soc/rtc.h"
18 #include "driver/rtc_io.h"
19 #include "sys/lock.h"
20 #include "driver/gpio.h"
21 #include "esp_private/adc_share_hw_ctrl.h"
22 #include "esp_private/sar_periph_ctrl.h"
23 #include "adc1_private.h"
24 #include "hal/adc_types.h"
25 #include "hal/adc_hal.h"
26 #include "hal/adc_hal_common.h"
27 #include "esp_private/periph_ctrl.h"
28 #include "driver/adc_types_legacy.h"
29 #include "esp_clk_tree.h"
30
31 #if SOC_DAC_SUPPORTED
32 #include "hal/dac_types.h"
33 #include "hal/dac_ll.h"
34 #endif
35
36 #if CONFIG_IDF_TARGET_ESP32S3
37 #include "esp_efuse_rtc_calib.h"
38 #endif
39
40
41 static const char *ADC_TAG = "ADC";
42
43 #define ADC_GET_IO_NUM(periph, channel) (adc_channel_io_map[periph][channel])
44
45 //////////////////////// Locks ///////////////////////////////////////////
46 LOG_MODULE_REGISTER(adc_legacy, CONFIG_ADC_LOG_LEVEL);
47
48 extern int rtc_spinlock;
49
50 #define RTC_ENTER_CRITICAL() do { rtc_spinlock = irq_lock(); } while(0)
51 #define RTC_EXIT_CRITICAL() irq_unlock(rtc_spinlock);
52
53 #define DIGI_ENTER_CRITICAL()
54 #define DIGI_EXIT_CRITICAL()
55
56 #define ADC_POWER_ENTER() RTC_ENTER_CRITICAL()
57 #define ADC_POWER_EXIT() RTC_EXIT_CRITICAL()
58
59 #define DIGI_CONTROLLER_ENTER() DIGI_ENTER_CRITICAL()
60 #define DIGI_CONTROLLER_EXIT() DIGI_EXIT_CRITICAL()
61
62 #define SARADC1_ENTER() RTC_ENTER_CRITICAL()
63 #define SARADC1_EXIT() RTC_EXIT_CRITICAL()
64
65 #define SARADC2_ENTER() RTC_ENTER_CRITICAL()
66 #define SARADC2_EXIT() RTC_EXIT_CRITICAL()
67
68 //n stands for ADC unit: 1 for ADC1 and 2 for ADC2. Currently both unit touches the same registers
69 #define VREF_ENTER(n) RTC_ENTER_CRITICAL()
70 #define VREF_EXIT(n) RTC_EXIT_CRITICAL()
71
72 #define FSM_ENTER() RTC_ENTER_CRITICAL()
73 #define FSM_EXIT() RTC_EXIT_CRITICAL()
74
75 #if CONFIG_IDF_TARGET_ESP32 || CONFIG_IDF_TARGET_ESP32S2 || CONFIG_IDF_TARGET_ESP32S3
76 //prevent ADC1 being used by I2S dma and other tasks at the same time.
77 K_MUTEX_DEFINE(adc1_dma_lock);
78 #define SARADC1_ACQUIRE() do { k_mutex_lock(&adc1_dma_lock, K_FOREVER); } while(0)
79 #define SARADC1_RELEASE() do { k_mutex_unlock(&adc1_dma_lock); } while(0)
80 #endif
81 /*
82 In ADC2, there're two locks used for different cases:
83 1. lock shared with app and Wi-Fi:
84 ESP32:
85 When Wi-Fi using the ADC2, we assume it will never stop, so app checks the lock and returns immediately if failed.
86 ESP32S2:
87 The controller's control over the ADC is determined by the arbiter. There is no need to control by lock.
88
89 2. lock shared between tasks:
90 when several tasks sharing the ADC2, we want to guarantee
91 all the requests will be handled.
92 Since conversions are short (about 31us), app returns the lock very soon,
93 we use a spinlock to stand there waiting to do conversions one by one.
94
95 adc2_spinlock should be acquired first, then call `adc_lock_release(ADC_UNIT_2)` or rtc_spinlock.
96 */
97
98 #if CONFIG_IDF_TARGET_ESP32S2
99 #ifdef CONFIG_PM_ENABLE
100 static esp_pm_lock_handle_t s_adc2_arbiter_lock;
101 #endif //CONFIG_PM_ENABLE
102 #endif // !CONFIG_IDF_TARGET_ESP32
103
104 static uint32_t clk_src_freq_hz;
105
106 static esp_err_t adc_hal_convert(adc_unit_t adc_n, int channel, uint32_t clk_src_freq_hz, int *out_raw);
107
108 /*---------------------------------------------------------------
109 ADC Common
110 ---------------------------------------------------------------*/
adc1_pad_get_io_num(adc1_channel_t channel,gpio_num_t * gpio_num)111 esp_err_t adc1_pad_get_io_num(adc1_channel_t channel, gpio_num_t *gpio_num)
112 {
113 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_1), ESP_ERR_INVALID_ARG, ADC_TAG, "invalid channel");
114
115 int io = ADC_GET_IO_NUM(ADC_UNIT_1, channel);
116 if (io < 0) {
117 return ESP_ERR_INVALID_ARG;
118 } else {
119 *gpio_num = (gpio_num_t)io;
120 }
121
122 return ESP_OK;
123 }
124
125 #if (SOC_ADC_PERIPH_NUM >= 2)
adc2_pad_get_io_num(adc2_channel_t channel,gpio_num_t * gpio_num)126 esp_err_t adc2_pad_get_io_num(adc2_channel_t channel, gpio_num_t *gpio_num)
127 {
128 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_2), ESP_ERR_INVALID_ARG, ADC_TAG, "invalid channel");
129
130 int io = ADC_GET_IO_NUM(ADC_UNIT_2, channel);
131 if (io < 0) {
132 return ESP_ERR_INVALID_ARG;
133 } else {
134 *gpio_num = (gpio_num_t)io;
135 }
136
137 return ESP_OK;
138 }
139 #endif
140
141 //------------------------------------------------------------RTC Single Read----------------------------------------------//
142 #if SOC_ADC_RTC_CTRL_SUPPORTED
adc_set_clk_div(uint8_t clk_div)143 esp_err_t adc_set_clk_div(uint8_t clk_div)
144 {
145 DIGI_CONTROLLER_ENTER();
146 adc_ll_digi_set_clk_div(clk_div);
147 DIGI_CONTROLLER_EXIT();
148 return ESP_OK;
149 }
150
adc_rtc_chan_init(adc_unit_t adc_unit)151 static void adc_rtc_chan_init(adc_unit_t adc_unit)
152 {
153 if (adc_unit == ADC_UNIT_1) {
154 /* Workaround: Disable the synchronization operation function of ADC1 and DAC.
155 If enabled(default), ADC RTC controller sampling will cause the DAC channel output voltage. */
156 #if SOC_DAC_SUPPORTED
157 dac_ll_rtc_sync_by_adc(false);
158 #endif
159 adc_oneshot_ll_output_invert(ADC_UNIT_1, ADC_LL_DATA_INVERT_DEFAULT(ADC_UNIT_1));
160 adc_ll_set_sar_clk_div(ADC_UNIT_1, ADC_LL_SAR_CLK_DIV_DEFAULT(ADC_UNIT_1));
161 #ifdef CONFIG_IDF_TARGET_ESP32
162 adc_ll_hall_disable(); //Disable other peripherals.
163 adc_ll_amp_disable(); //Currently the LNA is not open, close it by default.
164 #endif
165 }
166 if (adc_unit == ADC_UNIT_2) {
167 adc_hal_pwdet_set_cct(ADC_LL_PWDET_CCT_DEFAULT);
168 adc_oneshot_ll_output_invert(ADC_UNIT_2, ADC_LL_DATA_INVERT_DEFAULT(ADC_UNIT_2));
169 adc_ll_set_sar_clk_div(ADC_UNIT_2, ADC_LL_SAR_CLK_DIV_DEFAULT(ADC_UNIT_2));
170 }
171 }
172
adc_common_gpio_init(adc_unit_t adc_unit,adc_channel_t channel)173 esp_err_t adc_common_gpio_init(adc_unit_t adc_unit, adc_channel_t channel)
174 {
175 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(adc_unit), ESP_ERR_INVALID_ARG, ADC_TAG, "invalid channel");
176
177 gpio_num_t gpio_num = 0;
178 //If called with `ADC_UNIT_BOTH (ADC_UNIT_1 | ADC_UNIT_2)`, both if blocks will be run
179 if (adc_unit == ADC_UNIT_1) {
180 gpio_num = ADC_GET_IO_NUM(ADC_UNIT_1, channel);
181
182 } else if (adc_unit == ADC_UNIT_2) {
183 gpio_num = ADC_GET_IO_NUM(ADC_UNIT_2, channel);
184 } else {
185 return ESP_ERR_INVALID_ARG;
186 }
187
188 ESP_RETURN_ON_ERROR(rtc_gpio_init(gpio_num), ADC_TAG, "rtc_gpio_init fail");
189 ESP_RETURN_ON_ERROR(rtc_gpio_set_direction(gpio_num, RTC_GPIO_MODE_DISABLED), ADC_TAG, "rtc_gpio_set_direction fail");
190 ESP_RETURN_ON_ERROR(rtc_gpio_pulldown_dis(gpio_num), ADC_TAG, "rtc_gpio_pulldown_dis fail");
191 ESP_RETURN_ON_ERROR(rtc_gpio_pullup_dis(gpio_num), ADC_TAG, "rtc_gpio_pullup_dis fail");
192
193 return ESP_OK;
194 }
195
adc_set_data_inv(adc_unit_t adc_unit,bool inv_en)196 esp_err_t adc_set_data_inv(adc_unit_t adc_unit, bool inv_en)
197 {
198 if (adc_unit == ADC_UNIT_1) {
199 SARADC1_ENTER();
200 adc_oneshot_ll_output_invert(ADC_UNIT_1, inv_en);
201 SARADC1_EXIT();
202 }
203 if (adc_unit == ADC_UNIT_2) {
204 SARADC2_ENTER();
205 adc_oneshot_ll_output_invert(ADC_UNIT_2, inv_en);
206 SARADC2_EXIT();
207 }
208
209 return ESP_OK;
210 }
211
adc_set_data_width(adc_unit_t adc_unit,adc_bits_width_t width_bit)212 esp_err_t adc_set_data_width(adc_unit_t adc_unit, adc_bits_width_t width_bit)
213 {
214 ESP_RETURN_ON_FALSE(width_bit < ADC_WIDTH_MAX, ESP_ERR_INVALID_ARG, ADC_TAG, "unsupported bit width");
215 adc_bitwidth_t bitwidth = 0;
216 #if CONFIG_IDF_TARGET_ESP32
217 if ((uint32_t)width_bit == (uint32_t)ADC_BITWIDTH_DEFAULT) {
218 bitwidth = SOC_ADC_RTC_MAX_BITWIDTH;
219 } else {
220 switch(width_bit) {
221 case ADC_WIDTH_BIT_9:
222 bitwidth = ADC_BITWIDTH_9;
223 break;
224 case ADC_WIDTH_BIT_10:
225 bitwidth = ADC_BITWIDTH_10;
226 break;
227 case ADC_WIDTH_BIT_11:
228 bitwidth = ADC_BITWIDTH_11;
229 break;
230 case ADC_WIDTH_BIT_12:
231 bitwidth = ADC_BITWIDTH_12;
232 break;
233 default:
234 return ESP_ERR_INVALID_ARG;
235 }
236 }
237 #elif CONFIG_IDF_TARGET_ESP32S2
238 bitwidth = ADC_BITWIDTH_13;
239 #else //esp32s3
240 bitwidth = ADC_BITWIDTH_12;
241 #endif
242
243 if (adc_unit == ADC_UNIT_1) {
244 SARADC1_ENTER();
245 adc_oneshot_ll_set_output_bits(ADC_UNIT_1, bitwidth);
246 SARADC1_EXIT();
247 }
248 if (adc_unit == ADC_UNIT_2) {
249 SARADC2_ENTER();
250 adc_oneshot_ll_set_output_bits(ADC_UNIT_2, bitwidth);
251 SARADC2_EXIT();
252 }
253
254 return ESP_OK;
255 }
256
257 /**
258 * @brief Reset RTC controller FSM.
259 *
260 * @return
261 * - ESP_OK Success
262 */
263 #if !CONFIG_IDF_TARGET_ESP32
adc_rtc_reset(void)264 esp_err_t adc_rtc_reset(void)
265 {
266 FSM_ENTER();
267 adc_ll_rtc_reset();
268 FSM_EXIT();
269 return ESP_OK;
270 }
271 #endif
272
273 /*-------------------------------------------------------------------------------------
274 * ADC1
275 *------------------------------------------------------------------------------------*/
adc1_config_channel_atten(adc1_channel_t channel,adc_atten_t atten)276 esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten)
277 {
278 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_1), ESP_ERR_INVALID_ARG, ADC_TAG, "invalid channel");
279 ESP_RETURN_ON_FALSE(atten < SOC_ADC_ATTEN_NUM, ESP_ERR_INVALID_ARG, ADC_TAG, "ADC Atten Err");
280
281 #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
282 if (!clk_src_freq_hz) {
283 //should never fail
284 esp_clk_tree_src_get_freq_hz(ADC_DIGI_CLK_SRC_DEFAULT, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &clk_src_freq_hz);
285 }
286 #endif //#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
287
288 adc_common_gpio_init(ADC_UNIT_1, channel);
289 SARADC1_ENTER();
290 adc_rtc_chan_init(ADC_UNIT_1);
291 adc_oneshot_ll_set_atten(ADC_UNIT_1, channel, atten);
292 SARADC1_EXIT();
293
294 return ESP_OK;
295 }
296
adc1_config_width(adc_bits_width_t width_bit)297 esp_err_t adc1_config_width(adc_bits_width_t width_bit)
298 {
299 ESP_RETURN_ON_FALSE(width_bit < ADC_WIDTH_MAX, ESP_ERR_INVALID_ARG, ADC_TAG, "unsupported bit width");
300 adc_bitwidth_t bitwidth = 0;
301 #if CONFIG_IDF_TARGET_ESP32
302 if ((uint32_t)width_bit == (uint32_t)ADC_BITWIDTH_DEFAULT) {
303 bitwidth = SOC_ADC_RTC_MAX_BITWIDTH;
304 } else {
305 switch(width_bit) {
306 case ADC_WIDTH_BIT_9:
307 bitwidth = ADC_BITWIDTH_9;
308 break;
309 case ADC_WIDTH_BIT_10:
310 bitwidth = ADC_BITWIDTH_10;
311 break;
312 case ADC_WIDTH_BIT_11:
313 bitwidth = ADC_BITWIDTH_11;
314 break;
315 case ADC_WIDTH_BIT_12:
316 bitwidth = ADC_BITWIDTH_12;
317 break;
318 default:
319 return ESP_ERR_INVALID_ARG;
320 }
321 }
322 #elif CONFIG_IDF_TARGET_ESP32S2
323 bitwidth = ADC_BITWIDTH_13;
324 #else //esp32s3
325 bitwidth = ADC_BITWIDTH_12;
326 #endif
327
328 SARADC1_ENTER();
329 adc_oneshot_ll_set_output_bits(ADC_UNIT_1, bitwidth);
330 SARADC1_EXIT();
331
332 return ESP_OK;
333 }
334
adc1_dma_mode_acquire(void)335 esp_err_t adc1_dma_mode_acquire(void)
336 {
337 /* Use locks to avoid digtal and RTC controller conflicts.
338 for adc1, block until acquire the lock. */
339 SARADC1_ACQUIRE();
340 ESP_LOGD( ADC_TAG, "dma mode takes adc1 lock." );
341
342 sar_periph_ctrl_adc_continuous_power_acquire();
343
344 SARADC1_ENTER();
345 /* switch SARADC into DIG channel */
346 adc_ll_set_controller(ADC_UNIT_1, ADC_LL_CTRL_DIG);
347 SARADC1_EXIT();
348
349 return ESP_OK;
350 }
351
adc1_rtc_mode_acquire(void)352 esp_err_t adc1_rtc_mode_acquire(void)
353 {
354 /* Use locks to avoid digtal and RTC controller conflicts.
355 for adc1, block until acquire the lock. */
356 SARADC1_ACQUIRE();
357 sar_periph_ctrl_adc_oneshot_power_acquire();
358
359 SARADC1_ENTER();
360 /* switch SARADC into RTC channel. */
361 adc_ll_set_controller(ADC_UNIT_1, ADC_LL_CTRL_RTC);
362 SARADC1_EXIT();
363
364 return ESP_OK;
365 }
366
adc1_lock_release(void)367 esp_err_t adc1_lock_release(void)
368 {
369 ESP_RETURN_ON_FALSE(adc1_dma_lock.lock_count != 0, ESP_ERR_INVALID_STATE, ADC_TAG, "adc1 lock release called before acquire");
370
371 /* Use locks to avoid digtal and RTC controller conflicts. for adc1, block until acquire the lock. */
372
373 sar_periph_ctrl_adc_oneshot_power_release();
374 SARADC1_RELEASE();
375 return ESP_OK;
376 }
377
adc1_get_raw(adc1_channel_t channel)378 int adc1_get_raw(adc1_channel_t channel)
379 {
380 int adc_value;
381 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_1), ESP_ERR_INVALID_ARG, ADC_TAG, "invalid channel");
382 adc1_rtc_mode_acquire();
383
384 #if SOC_ADC_CALIBRATION_V1_SUPPORTED
385 adc_atten_t atten = adc_ll_get_atten(ADC_UNIT_1, channel);
386 adc_set_hw_calibration_code(ADC_UNIT_1, atten);
387 #endif //SOC_ADC_CALIBRATION_V1_SUPPORTED
388
389 SARADC1_ENTER();
390 #ifdef CONFIG_IDF_TARGET_ESP32
391 adc_ll_hall_disable(); //Disable other peripherals.
392 adc_ll_amp_disable(); //Currently the LNA is not open, close it by default.
393 #endif
394 adc_ll_set_controller(ADC_UNIT_1, ADC_LL_CTRL_RTC); //Set controller
395 adc_oneshot_ll_set_channel(ADC_UNIT_1, channel);
396 adc_hal_convert(ADC_UNIT_1, channel, clk_src_freq_hz, &adc_value); //Start conversion, For ADC1, the data always valid.
397 #if !CONFIG_IDF_TARGET_ESP32
398 adc_ll_rtc_reset(); //Reset FSM of rtc controller
399 #endif
400 SARADC1_EXIT();
401
402 adc1_lock_release();
403 return adc_value;
404 }
405
adc1_get_voltage(adc1_channel_t channel)406 int adc1_get_voltage(adc1_channel_t channel) //Deprecated. Use adc1_get_raw() instead
407 {
408 return adc1_get_raw(channel);
409 }
410
411 #if SOC_ULP_SUPPORTED
adc1_ulp_enable(void)412 void adc1_ulp_enable(void)
413 {
414 sar_periph_ctrl_adc_oneshot_power_acquire();
415
416 SARADC1_ENTER();
417 adc_ll_set_controller(ADC_UNIT_1, ADC_LL_CTRL_ULP);
418 /* since most users do not need LNA and HALL with uLP, we disable them here
419 open them in the uLP if needed. */
420 #ifdef CONFIG_IDF_TARGET_ESP32
421 /* disable other peripherals. */
422 adc_ll_hall_disable();
423 adc_ll_amp_disable();
424 #endif
425 SARADC1_EXIT();
426 }
427 #endif
428
429 #if (SOC_ADC_PERIPH_NUM >= 2)
430 /*---------------------------------------------------------------
431 ADC2
432 ---------------------------------------------------------------*/
adc2_config_channel_atten(adc2_channel_t channel,adc_atten_t atten)433 esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten)
434 {
435 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_2), ESP_ERR_INVALID_ARG, ADC_TAG, "invalid channel");
436 ESP_RETURN_ON_FALSE(atten <= SOC_ADC_ATTEN_NUM, ESP_ERR_INVALID_ARG, ADC_TAG, "ADC2 Atten Err");
437 #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
438 if (!clk_src_freq_hz) {
439 //should never fail
440 esp_clk_tree_src_get_freq_hz(ADC_DIGI_CLK_SRC_DEFAULT, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &clk_src_freq_hz);
441 }
442 #endif //#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
443
444 adc_common_gpio_init(ADC_UNIT_2, channel);
445
446 #if CONFIG_IDF_TARGET_ESP32
447 /** For ESP32S2 and S3, the right to use ADC2 is controlled by the arbiter, and there is no need to set a lock.*/
448 if (adc_lock_try_acquire(ADC_UNIT_2) != ESP_OK) {
449 //try the lock, return if failed (wifi using).
450 return ESP_ERR_TIMEOUT;
451 }
452 #endif
453
454 //avoid collision with other tasks
455 SARADC2_ENTER();
456 adc_rtc_chan_init(ADC_UNIT_2);
457 adc_oneshot_ll_set_atten(ADC_UNIT_2, channel, atten);
458 SARADC2_EXIT();
459
460 #if CONFIG_IDF_TARGET_ESP32
461 adc_lock_release(ADC_UNIT_2);
462 #endif
463
464 return ESP_OK;
465 }
466
adc2_init(void)467 static inline void adc2_init(void)
468 {
469 #if CONFIG_IDF_TARGET_ESP32S2
470 #ifdef CONFIG_PM_ENABLE
471 /* Lock APB clock. */
472 if (s_adc2_arbiter_lock == NULL) {
473 esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "adc2", &s_adc2_arbiter_lock);
474 }
475 #endif //CONFIG_PM_ENABLE
476 #endif //CONFIG_IDF_TARGET_ESP32S2
477 }
478
adc2_dac_disable(adc2_channel_t channel)479 static inline void adc2_dac_disable( adc2_channel_t channel)
480 {
481 #if SOC_DAC_SUPPORTED
482 #ifdef CONFIG_IDF_TARGET_ESP32
483 if ( channel == ADC2_CHANNEL_8 ) { // the same as DAC channel 0
484 dac_ll_power_down(DAC_CHAN_0);
485 } else if ( channel == ADC2_CHANNEL_9 ) {
486 dac_ll_power_down(DAC_CHAN_1);
487 }
488 #else
489 if ( channel == ADC2_CHANNEL_6 ) { // the same as DAC channel 0
490 dac_ll_power_down(DAC_CHAN_0);
491 } else if ( channel == ADC2_CHANNEL_7 ) {
492 dac_ll_power_down(DAC_CHAN_1);
493 }
494 #endif
495 #endif // SOC_DAC_SUPPORTED
496 }
497
498 /**
499 * @note For ESP32S2:
500 * The arbiter's working clock is APB_CLK. When the APB_CLK clock drops below 8 MHz, the arbiter must be in shield mode.
501 * Or, the RTC controller will fail when get raw data.
502 * This issue does not occur on digital controllers (DMA mode), and the hardware guarantees that there will be no errors.
503 */
adc2_get_raw(adc2_channel_t channel,adc_bits_width_t width_bit,int * raw_out)504 esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *raw_out)
505 {
506 esp_err_t ret = ESP_OK;
507 int adc_value = 0;
508 adc_bitwidth_t bitwidth = 0;
509
510 ESP_RETURN_ON_FALSE(raw_out != NULL, ESP_ERR_INVALID_ARG, ADC_TAG, "ADC out value err");
511 ESP_RETURN_ON_FALSE(channel < ADC2_CHANNEL_MAX, ESP_ERR_INVALID_ARG, ADC_TAG, "ADC Channel Err");
512 ESP_RETURN_ON_FALSE(width_bit < ADC_WIDTH_MAX, ESP_ERR_INVALID_ARG, ADC_TAG, "unsupported bit width");
513 #if CONFIG_IDF_TARGET_ESP32
514 if ((uint32_t)width_bit == (uint32_t)ADC_BITWIDTH_DEFAULT) {
515 bitwidth = SOC_ADC_RTC_MAX_BITWIDTH;
516 } else {
517 switch(width_bit) {
518 case ADC_WIDTH_BIT_9:
519 bitwidth = ADC_BITWIDTH_9;
520 break;
521 case ADC_WIDTH_BIT_10:
522 bitwidth = ADC_BITWIDTH_10;
523 break;
524 case ADC_WIDTH_BIT_11:
525 bitwidth = ADC_BITWIDTH_11;
526 break;
527 case ADC_WIDTH_BIT_12:
528 bitwidth = ADC_BITWIDTH_12;
529 break;
530 default:
531 return ESP_ERR_INVALID_ARG;
532 }
533 }
534 #elif CONFIG_IDF_TARGET_ESP32S2
535 bitwidth = ADC_BITWIDTH_13;
536 #else //esp32s3
537 bitwidth = ADC_BITWIDTH_12;
538 #endif
539
540 #if SOC_ADC_CALIBRATION_V1_SUPPORTED
541 adc_atten_t atten = adc_ll_get_atten(ADC_UNIT_2, channel);
542 adc_set_hw_calibration_code(ADC_UNIT_2, atten);
543 #endif //SOC_ADC_CALIBRATION_V1_SUPPORTED
544
545 #if CONFIG_IDF_TARGET_ESP32
546 /** For ESP32S2 and S3, the right to use ADC2 is controlled by the arbiter, and there is no need to set a lock.*/
547 if (adc_lock_try_acquire(ADC_UNIT_2) != ESP_OK) {
548 //try the lock, return if failed (wifi using).
549 return ESP_ERR_TIMEOUT;
550 }
551 #endif
552 sar_periph_ctrl_adc_oneshot_power_acquire(); //in critical section with whole rtc module
553
554 //avoid collision with other tasks
555 adc2_init(); // in critical section with whole rtc module. because the PWDET use the same registers, place it here.
556 SARADC2_ENTER();
557
558 #if SOC_ADC_ARBITER_SUPPORTED
559 adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
560 adc_hal_arbiter_config(&config);
561 #endif
562
563 #ifdef CONFIG_ADC_DISABLE_DAC
564 adc2_dac_disable(channel); //disable other peripherals
565 #endif
566 adc_oneshot_ll_set_output_bits(ADC_UNIT_2, bitwidth);
567
568 #if CONFIG_IDF_TARGET_ESP32
569 adc_ll_set_controller(ADC_UNIT_2, ADC_LL_CTRL_RTC);// set controller
570 #else
571 adc_ll_set_controller(ADC_UNIT_2, ADC_LL_CTRL_ARB);// set controller
572 #endif
573
574 #if CONFIG_IDF_TARGET_ESP32S2
575 #ifdef CONFIG_PM_ENABLE
576 if (s_adc2_arbiter_lock) {
577 esp_pm_lock_acquire(s_adc2_arbiter_lock);
578 }
579 #endif //CONFIG_PM_ENABLE
580 #endif //CONFIG_IDF_TARGET_ESP32
581
582 adc_oneshot_ll_set_channel(ADC_UNIT_2, channel);
583 ret = adc_hal_convert(ADC_UNIT_2, channel, clk_src_freq_hz, &adc_value);
584 if (ret != ESP_OK) {
585 adc_value = -1;
586 }
587
588 #if CONFIG_IDF_TARGET_ESP32S2
589 #ifdef CONFIG_PM_ENABLE
590 /* Release APB clock. */
591 if (s_adc2_arbiter_lock) {
592 esp_pm_lock_release(s_adc2_arbiter_lock);
593 }
594 #endif //CONFIG_PM_ENABLE
595 #endif //CONFIG_IDF_TARGET_ESP32
596 SARADC2_EXIT();
597
598 sar_periph_ctrl_adc_oneshot_power_release();
599 #if CONFIG_IDF_TARGET_ESP32
600 adc_lock_release(ADC_UNIT_2);
601 #endif
602
603 *raw_out = adc_value;
604 return ret;
605 }
606
adc_vref_to_gpio(adc_unit_t adc_unit,gpio_num_t gpio)607 esp_err_t adc_vref_to_gpio(adc_unit_t adc_unit, gpio_num_t gpio)
608 {
609 #ifdef CONFIG_IDF_TARGET_ESP32
610 if (adc_unit == ADC_UNIT_1) {
611 return ESP_ERR_INVALID_ARG;
612 }
613 #endif
614 adc2_channel_t ch = ADC2_CHANNEL_MAX;
615 /* Check if the GPIO supported. */
616 for (int i = 0; i < ADC2_CHANNEL_MAX; i++) {
617 if (gpio == ADC_GET_IO_NUM(ADC_UNIT_2, i)) {
618 ch = i;
619 break;
620 }
621 }
622 if (ch == ADC2_CHANNEL_MAX) {
623 return ESP_ERR_INVALID_ARG;
624 }
625
626 sar_periph_ctrl_adc_oneshot_power_acquire();
627 if (adc_unit == ADC_UNIT_1) {
628 VREF_ENTER(1);
629 adc_ll_vref_output(ADC_UNIT_1, ch, true);
630 VREF_EXIT(1);
631 } else if (adc_unit == ADC_UNIT_2) {
632 VREF_ENTER(2);
633 adc_ll_vref_output(ADC_UNIT_2, ch, true);
634 VREF_EXIT(2);
635 }
636
637 //Configure RTC gpio, Only ADC2's channels IO are supported to output reference voltage.
638 adc_common_gpio_init(ADC_UNIT_2, ch);
639 return ESP_OK;
640 }
641
642 #endif //SOC_ADC_RTC_CTRL_SUPPORTED
643 #endif //#if (SOC_ADC_PERIPH_NUM >= 2)
644
645
646 #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
647 /*---------------------------------------------------------------
648 Legacy ADC Single Read Mode
649 when RTC controller isn't supported
650 ---------------------------------------------------------------*/
651 #include "esp_check.h"
652
653 int adc_reg_lock;
654 #define ADC_REG_LOCK_ENTER() do { adc_reg_lock = irq_lock(); } while(0)
655 #define ADC_REG_LOCK_EXIT() irq_unlock(adc_reg_lock);
656
657 static adc_atten_t s_atten1_single[ADC1_CHANNEL_MAX]; //Array saving attenuate of each channel of ADC1, used by single read API
658 #if (SOC_ADC_PERIPH_NUM >= 2)
659 static adc_atten_t s_atten2_single[ADC2_CHANNEL_MAX]; //Array saving attenuate of each channel of ADC2, used by single read API
660 #endif
661
662
adc_digi_get_io_num(adc_unit_t adc_unit,uint8_t adc_channel)663 static int8_t adc_digi_get_io_num(adc_unit_t adc_unit, uint8_t adc_channel)
664 {
665 assert(adc_unit <= SOC_ADC_PERIPH_NUM);
666 uint8_t adc_n = (adc_unit == ADC_UNIT_1) ? 0 : 1;
667 return adc_channel_io_map[adc_n][adc_channel];
668 }
669
adc_digi_gpio_init(adc_unit_t adc_unit,uint16_t channel_mask)670 static esp_err_t adc_digi_gpio_init(adc_unit_t adc_unit, uint16_t channel_mask)
671 {
672 esp_err_t ret = ESP_OK;
673 uint64_t gpio_mask = 0;
674 uint32_t n = 0;
675 int8_t io = 0;
676 struct gpio_dt_spec gpio;
677
678 gpio.port = DEVICE_DT_GET(DT_NODELABEL(gpio0));
679 gpio.dt_flags = 0;
680 if (!device_is_ready(gpio.port)) {
681 LOG_ERR("gpio0 port not ready");
682 return ESP_FAIL;
683 }
684
685 while (channel_mask) {
686 if (channel_mask & 0x1) {
687 io = adc_digi_get_io_num(adc_unit, n);
688 if (io < 0) {
689 return ESP_ERR_INVALID_ARG;
690 }
691 gpio_mask |= BIT64(io);
692 gpio.pin = io;
693 gpio_pin_configure_dt(&gpio, GPIO_DISCONNECTED);
694 }
695 channel_mask = channel_mask >> 1;
696 n++;
697 }
698
699 return ret;
700 }
701
702 #if CONFIG_IDF_TARGET_ESP32C3
adc_vref_to_gpio(adc_unit_t adc_unit,gpio_num_t gpio)703 esp_err_t adc_vref_to_gpio(adc_unit_t adc_unit, gpio_num_t gpio)
704 {
705 esp_err_t ret;
706 uint32_t channel = ADC2_CHANNEL_MAX;
707 if (adc_unit == ADC_UNIT_2) {
708 for (int i = 0; i < ADC2_CHANNEL_MAX; i++) {
709 if (gpio == ADC_GET_IO_NUM(ADC_UNIT_2, i)) {
710 channel = i;
711 break;
712 }
713 }
714 if (channel == ADC2_CHANNEL_MAX) {
715 return ESP_ERR_INVALID_ARG;
716 }
717 }
718
719 sar_periph_ctrl_adc_oneshot_power_acquire();
720 if (adc_unit == ADC_UNIT_1) {
721 RTC_ENTER_CRITICAL();
722 adc_ll_vref_output(ADC_UNIT_1, channel, true);
723 RTC_EXIT_CRITICAL();
724 } else { //ADC_UNIT_2
725 RTC_ENTER_CRITICAL();
726 adc_ll_vref_output(ADC_UNIT_2, channel, true);
727 RTC_EXIT_CRITICAL();
728 }
729
730 ret = adc_digi_gpio_init(ADC_UNIT_2, BIT(channel));
731
732 return ret;
733 }
734 #endif
735
adc1_config_width(adc_bits_width_t width_bit)736 esp_err_t adc1_config_width(adc_bits_width_t width_bit)
737 {
738 //On ESP32C3, the data width is always 12-bits.
739 if (width_bit != ADC_WIDTH_BIT_12) {
740 return ESP_ERR_INVALID_ARG;
741 }
742
743 return ESP_OK;
744 }
745
adc1_config_channel_atten(adc1_channel_t channel,adc_atten_t atten)746 esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten)
747 {
748 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_1), ESP_ERR_INVALID_ARG, ADC_TAG, "ADC1 channel error");
749 ESP_RETURN_ON_FALSE((atten < SOC_ADC_ATTEN_NUM), ESP_ERR_INVALID_ARG, ADC_TAG, "ADC Atten Err");
750 #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
751 if (!clk_src_freq_hz) {
752 //should never fail
753 esp_clk_tree_src_get_freq_hz(ADC_DIGI_CLK_SRC_DEFAULT, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &clk_src_freq_hz);
754 }
755 #endif //#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
756
757 esp_err_t ret = ESP_OK;
758 s_atten1_single[channel] = atten;
759 ret = adc_digi_gpio_init(ADC_UNIT_1, BIT(channel));
760
761 return ret;
762 }
763
adc1_get_raw(adc1_channel_t channel)764 int adc1_get_raw(adc1_channel_t channel)
765 {
766 int raw_out = 0;
767
768 if (adc_lock_try_acquire(ADC_UNIT_1) != ESP_OK) {
769 return ESP_ERR_TIMEOUT;
770 }
771
772 periph_module_enable(PERIPH_SARADC_MODULE);
773 sar_periph_ctrl_adc_oneshot_power_acquire();
774 adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_DEFAULT);
775
776 adc_atten_t atten = s_atten1_single[channel];
777 #if SOC_ADC_CALIBRATION_V1_SUPPORTED
778 adc_set_hw_calibration_code(ADC_UNIT_1, atten);
779 #endif
780
781 ADC_REG_LOCK_ENTER();
782 adc_oneshot_ll_set_atten(ADC_UNIT_1, channel, atten);
783 adc_hal_convert(ADC_UNIT_1, channel, clk_src_freq_hz, &raw_out);
784 ADC_REG_LOCK_EXIT();
785
786 sar_periph_ctrl_adc_oneshot_power_release();
787 periph_module_disable(PERIPH_SARADC_MODULE);
788 adc_lock_release(ADC_UNIT_1);
789
790 return raw_out;
791 }
792
793 #if (SOC_ADC_PERIPH_NUM >= 2)
adc2_config_channel_atten(adc2_channel_t channel,adc_atten_t atten)794 esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten)
795 {
796 ESP_RETURN_ON_FALSE(channel < SOC_ADC_CHANNEL_NUM(ADC_UNIT_2), ESP_ERR_INVALID_ARG, ADC_TAG, "ADC2 channel error");
797 ESP_RETURN_ON_FALSE((atten <= ADC_ATTEN_DB_12), ESP_ERR_INVALID_ARG, ADC_TAG, "ADC2 Atten Err");
798
799 esp_err_t ret = ESP_OK;
800 s_atten2_single[channel] = atten;
801 ret = adc_digi_gpio_init(ADC_UNIT_2, BIT(channel));
802
803 return ret;
804 }
805
adc2_get_raw(adc2_channel_t channel,adc_bits_width_t width_bit,int * raw_out)806 esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *raw_out)
807 {
808 //On ESP32C3, the data width is always 12-bits.
809 if (width_bit != ADC_WIDTH_BIT_12) {
810 return ESP_ERR_INVALID_ARG;
811 }
812 #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
813 if (!clk_src_freq_hz) {
814 //should never fail
815 esp_clk_tree_src_get_freq_hz(ADC_DIGI_CLK_SRC_DEFAULT, ESP_CLK_TREE_SRC_FREQ_PRECISION_CACHED, &clk_src_freq_hz);
816 }
817 #endif //#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
818
819 esp_err_t ret = ESP_OK;
820
821 if (adc_lock_try_acquire(ADC_UNIT_2) != ESP_OK) {
822 return ESP_ERR_TIMEOUT;
823 }
824
825 periph_module_enable(PERIPH_SARADC_MODULE);
826 sar_periph_ctrl_adc_oneshot_power_acquire();
827 adc_ll_digi_clk_sel(ADC_DIGI_CLK_SRC_DEFAULT);
828
829 adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
830 adc_hal_arbiter_config(&config);
831
832 adc_atten_t atten = s_atten2_single[channel];
833 #if SOC_ADC_CALIBRATION_V1_SUPPORTED
834 adc_set_hw_calibration_code(ADC_UNIT_2, atten);
835 #endif
836
837 ADC_REG_LOCK_ENTER();
838 adc_oneshot_ll_set_atten(ADC_UNIT_2, channel, atten);
839 ret = adc_hal_convert(ADC_UNIT_2, channel, clk_src_freq_hz, raw_out);
840 ADC_REG_LOCK_EXIT();
841
842 sar_periph_ctrl_adc_oneshot_power_release();
843 periph_module_disable(PERIPH_SARADC_MODULE);
844 adc_lock_release(ADC_UNIT_2);
845
846 return ret;
847 }
848 #endif //#if (SOC_ADC_PERIPH_NUM >= 2)
849 #endif //#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
850
851
adc_hal_onetime_start(adc_unit_t adc_n,uint32_t clk_src_freq_hz)852 static void adc_hal_onetime_start(adc_unit_t adc_n, uint32_t clk_src_freq_hz)
853 {
854 #if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
855 (void)adc_n;
856 /**
857 * There is a hardware limitation. If the APB clock frequency is high, the step of this reg signal: ``onetime_start`` may not be captured by the
858 * ADC digital controller (when its clock frequency is too slow). A rough estimate for this step should be at least 3 ADC digital controller
859 * clock cycle.
860 */
861 uint32_t digi_clk = clk_src_freq_hz / (ADC_LL_CLKM_DIV_NUM_DEFAULT + ADC_LL_CLKM_DIV_A_DEFAULT / ADC_LL_CLKM_DIV_B_DEFAULT + 1);
862 //Convert frequency to time (us). Since decimals are removed by this division operation. Add 1 here in case of the fact that delay is not enough.
863 uint32_t delay = (1000 * 1000) / digi_clk + 1;
864 //3 ADC digital controller clock cycle
865 delay = delay * 3;
866 //This coefficient (8) is got from test, and verified from DT. When digi_clk is not smaller than ``APB_CLK_FREQ/8``, no delay is needed.
867 if (digi_clk >= APB_CLK_FREQ/8) {
868 delay = 0;
869 }
870
871 adc_oneshot_ll_start(false);
872 esp_rom_delay_us(delay);
873 adc_oneshot_ll_start(true);
874
875 //No need to delay here. Becuase if the start signal is not seen, there won't be a done intr.
876 #else
877 (void)clk_src_freq_hz;
878 adc_oneshot_ll_start(adc_n);
879 #endif
880 }
881
adc_hal_convert(adc_unit_t adc_n,int channel,uint32_t clk_src_freq_hz,int * out_raw)882 static esp_err_t adc_hal_convert(adc_unit_t adc_n, int channel, uint32_t clk_src_freq_hz, int *out_raw)
883 {
884
885 uint32_t event = (adc_n == ADC_UNIT_1) ? ADC_LL_EVENT_ADC1_ONESHOT_DONE : ADC_LL_EVENT_ADC2_ONESHOT_DONE;
886 adc_oneshot_ll_clear_event(event);
887 adc_oneshot_ll_disable_all_unit();
888 adc_oneshot_ll_enable(adc_n);
889 adc_oneshot_ll_set_channel(adc_n, channel);
890
891 adc_hal_onetime_start(adc_n, clk_src_freq_hz);
892
893 while (adc_oneshot_ll_get_event(event) != true) {
894 ;
895 }
896
897 *out_raw = adc_oneshot_ll_get_raw_result(adc_n);
898 if (adc_oneshot_ll_raw_check_valid(adc_n, *out_raw) == false) {
899 return ESP_ERR_INVALID_STATE;
900 }
901
902 //HW workaround: when enabling periph clock, this should be false
903 adc_oneshot_ll_disable_all_unit();
904
905 return ESP_OK;
906 }
907