adc.c 23 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720
  1. /*
  2. * SPDX-FileCopyrightText: 2016-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. #include <esp_types.h>
  7. #include <stdlib.h>
  8. #include <ctype.h>
  9. #include <string.h>
  10. #include "sdkconfig.h"
  11. #include "esp_intr_alloc.h"
  12. #include "esp_log.h"
  13. #include "esp_pm.h"
  14. #include "sys/lock.h"
  15. #include "freertos/FreeRTOS.h"
  16. #include "freertos/semphr.h"
  17. #include "freertos/timers.h"
  18. #include "freertos/ringbuf.h"
  19. #include "esp32c3/rom/ets_sys.h"
  20. #include "driver/periph_ctrl.h"
  21. #include "driver/gpio.h"
  22. #include "driver/adc.h"
  23. #include "hal/adc_types.h"
  24. #include "hal/adc_hal.h"
  25. #include "hal/dma_types.h"
  26. #include "esp_efuse_rtc_calib.h"
  27. #include "esp_private/gdma.h"
  28. #define ADC_CHECK_RET(fun_ret) ({ \
  29. if (fun_ret != ESP_OK) { \
  30. ESP_LOGE(ADC_TAG,"%s(%d)",__FUNCTION__,__LINE__); \
  31. return ESP_FAIL; \
  32. } \
  33. })
  34. static const char *ADC_TAG = "ADC";
  35. #define ADC_CHECK(a, str, ret_val) ({ \
  36. if (!(a)) { \
  37. ESP_LOGE(ADC_TAG,"%s(%d) :%s", __FUNCTION__, __LINE__, str); \
  38. return (ret_val); \
  39. } \
  40. })
  41. #define ADC_GET_IO_NUM(periph, channel) (adc_channel_io_map[periph][channel])
  42. #define ADC_CHANNEL_CHECK(periph, channel) ADC_CHECK(channel < SOC_ADC_CHANNEL_NUM(periph), "ADC"#periph" channel error", ESP_ERR_INVALID_ARG)
  43. extern portMUX_TYPE rtc_spinlock; //TODO: Will be placed in the appropriate position after the rtc module is finished.
  44. #define ADC_ENTER_CRITICAL() portENTER_CRITICAL(&rtc_spinlock)
  45. #define ADC_EXIT_CRITICAL() portEXIT_CRITICAL(&rtc_spinlock)
  46. /**
  47. * 1. sar_adc1_lock: this mutex lock is to protect the SARADC1 module.
  48. * 2. sar_adc2_lock: this mutex lock is to protect the SARADC2 module. On C3, it is controlled by the digital controller
  49. * and PWDET controller.
  50. * 3. adc_reg_lock: this spin lock is to protect the shared registers used by ADC1 / ADC2 single read mode.
  51. */
  52. static _lock_t sar_adc1_lock;
  53. #define SAR_ADC1_LOCK_ACQUIRE() _lock_acquire(&sar_adc1_lock)
  54. #define SAR_ADC1_LOCK_RELEASE() _lock_release(&sar_adc1_lock)
  55. static _lock_t sar_adc2_lock;
  56. #define SAR_ADC2_LOCK_ACQUIRE() _lock_acquire(&sar_adc2_lock)
  57. #define SAR_ADC2_LOCK_RELEASE() _lock_release(&sar_adc2_lock)
  58. portMUX_TYPE adc_reg_lock = portMUX_INITIALIZER_UNLOCKED;
  59. #define ADC_REG_LOCK_ENTER() portENTER_CRITICAL(&adc_reg_lock)
  60. #define ADC_REG_LOCK_EXIT() portEXIT_CRITICAL(&adc_reg_lock)
  61. #define INTERNAL_BUF_NUM 5
  62. #define IN_SUC_EOF_BIT GDMA_LL_EVENT_RX_SUC_EOF
  63. /*---------------------------------------------------------------
  64. Digital Controller Context
  65. ---------------------------------------------------------------*/
  66. typedef struct adc_digi_context_t {
  67. uint8_t *rx_dma_buf; //dma buffer
  68. adc_hal_context_t hal; //hal context
  69. gdma_channel_handle_t rx_dma_channel; //dma rx channel handle
  70. RingbufHandle_t ringbuf_hdl; //RX ringbuffer handler
  71. intptr_t rx_eof_desc_addr; //eof descriptor address of RX channel
  72. bool ringbuf_overflow_flag; //1: ringbuffer overflow
  73. bool driver_start_flag; //1: driver is started; 0: driver is stoped
  74. bool use_adc1; //1: ADC unit1 will be used; 0: ADC unit1 won't be used.
  75. bool use_adc2; //1: ADC unit2 will be used; 0: ADC unit2 won't be used. This determines whether to acquire sar_adc2_mutex lock or not.
  76. adc_atten_t adc1_atten; //Attenuation for ADC1. On this chip each ADC can only support one attenuation.
  77. adc_atten_t adc2_atten; //Attenuation for ADC2. On this chip each ADC can only support one attenuation.
  78. adc_digi_config_t digi_controller_config; //Digital Controller Configuration
  79. esp_pm_lock_handle_t pm_lock; //For power management
  80. } adc_digi_context_t;
  81. static adc_digi_context_t *s_adc_digi_ctx = NULL;
  82. static uint32_t adc_get_calibration_offset(adc_ll_num_t adc_n, adc_channel_t chan, adc_atten_t atten);
  83. /*---------------------------------------------------------------
  84. ADC Continuous Read Mode (via DMA)
  85. ---------------------------------------------------------------*/
  86. static IRAM_ATTR bool adc_dma_in_suc_eof_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data);
  87. static int8_t adc_digi_get_io_num(uint8_t adc_unit, uint8_t adc_channel)
  88. {
  89. return adc_channel_io_map[adc_unit][adc_channel];
  90. }
  91. static esp_err_t adc_digi_gpio_init(adc_unit_t adc_unit, uint16_t channel_mask)
  92. {
  93. esp_err_t ret = ESP_OK;
  94. uint64_t gpio_mask = 0;
  95. uint32_t n = 0;
  96. int8_t io = 0;
  97. while (channel_mask) {
  98. if (channel_mask & 0x1) {
  99. io = adc_digi_get_io_num(adc_unit, n);
  100. if (io < 0) {
  101. return ESP_ERR_INVALID_ARG;
  102. }
  103. gpio_mask |= BIT64(io);
  104. }
  105. channel_mask = channel_mask >> 1;
  106. n++;
  107. }
  108. gpio_config_t cfg = {
  109. .pin_bit_mask = gpio_mask,
  110. .mode = GPIO_MODE_DISABLE,
  111. };
  112. ret = gpio_config(&cfg);
  113. return ret;
  114. }
  115. esp_err_t adc_digi_initialize(const adc_digi_init_config_t *init_config)
  116. {
  117. esp_err_t ret = ESP_OK;
  118. s_adc_digi_ctx = calloc(1, sizeof(adc_digi_context_t));
  119. if (s_adc_digi_ctx == NULL) {
  120. ret = ESP_ERR_NO_MEM;
  121. goto cleanup;
  122. }
  123. //ringbuffer
  124. s_adc_digi_ctx->ringbuf_hdl = xRingbufferCreate(init_config->max_store_buf_size, RINGBUF_TYPE_BYTEBUF);
  125. if (!s_adc_digi_ctx->ringbuf_hdl) {
  126. ret = ESP_ERR_NO_MEM;
  127. goto cleanup;
  128. }
  129. //malloc internal buffer used by DMA
  130. s_adc_digi_ctx->rx_dma_buf = heap_caps_calloc(1, init_config->conv_num_each_intr * INTERNAL_BUF_NUM, MALLOC_CAP_INTERNAL);
  131. if (!s_adc_digi_ctx->rx_dma_buf) {
  132. ret = ESP_ERR_NO_MEM;
  133. goto cleanup;
  134. }
  135. //malloc dma descriptor
  136. s_adc_digi_ctx->hal.rx_desc = heap_caps_calloc(1, (sizeof(dma_descriptor_t)) * INTERNAL_BUF_NUM, MALLOC_CAP_DMA);
  137. if (!s_adc_digi_ctx->hal.rx_desc) {
  138. ret = ESP_ERR_NO_MEM;
  139. goto cleanup;
  140. }
  141. //malloc pattern table
  142. s_adc_digi_ctx->digi_controller_config.adc_pattern = calloc(1, SOC_ADC_PATT_LEN_MAX * sizeof(adc_digi_pattern_table_t));
  143. if (!s_adc_digi_ctx->digi_controller_config.adc_pattern) {
  144. ret = ESP_ERR_NO_MEM;
  145. goto cleanup;
  146. }
  147. #if CONFIG_PM_ENABLE
  148. ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "adc_dma", &s_adc_digi_ctx->pm_lock);
  149. if (ret != ESP_OK) {
  150. goto cleanup;
  151. }
  152. #endif //CONFIG_PM_ENABLE
  153. //init gpio pins
  154. if (init_config->adc1_chan_mask) {
  155. ret = adc_digi_gpio_init(ADC_NUM_1, init_config->adc1_chan_mask);
  156. if (ret != ESP_OK) {
  157. goto cleanup;
  158. }
  159. }
  160. if (init_config->adc2_chan_mask) {
  161. ret = adc_digi_gpio_init(ADC_NUM_2, init_config->adc2_chan_mask);
  162. if (ret != ESP_OK) {
  163. goto cleanup;
  164. }
  165. }
  166. //alloc rx gdma channel
  167. gdma_channel_alloc_config_t rx_alloc_config = {
  168. .direction = GDMA_CHANNEL_DIRECTION_RX,
  169. };
  170. ret = gdma_new_channel(&rx_alloc_config, &s_adc_digi_ctx->rx_dma_channel);
  171. if (ret != ESP_OK) {
  172. goto cleanup;
  173. }
  174. gdma_connect(s_adc_digi_ctx->rx_dma_channel, GDMA_MAKE_TRIGGER(GDMA_TRIG_PERIPH_ADC, 0));
  175. gdma_strategy_config_t strategy_config = {
  176. .auto_update_desc = true,
  177. .owner_check = true
  178. };
  179. gdma_apply_strategy(s_adc_digi_ctx->rx_dma_channel, &strategy_config);
  180. gdma_rx_event_callbacks_t cbs = {
  181. .on_recv_eof = adc_dma_in_suc_eof_callback
  182. };
  183. gdma_register_rx_event_callbacks(s_adc_digi_ctx->rx_dma_channel, &cbs, s_adc_digi_ctx);
  184. int dma_chan;
  185. gdma_get_channel_id(s_adc_digi_ctx->rx_dma_channel, &dma_chan);
  186. adc_hal_config_t config = {
  187. .desc_max_num = INTERNAL_BUF_NUM,
  188. .dma_chan = dma_chan,
  189. .eof_num = init_config->conv_num_each_intr / ADC_HAL_DATA_LEN_PER_CONV
  190. };
  191. adc_hal_context_config(&s_adc_digi_ctx->hal, &config);
  192. //enable SARADC module clock
  193. periph_module_enable(PERIPH_SARADC_MODULE);
  194. adc_hal_calibration_init(ADC_NUM_1);
  195. adc_hal_calibration_init(ADC_NUM_2);
  196. return ret;
  197. cleanup:
  198. adc_digi_deinitialize();
  199. return ret;
  200. }
  201. static IRAM_ATTR bool adc_dma_intr(adc_digi_context_t *adc_digi_ctx);
  202. static IRAM_ATTR bool adc_dma_in_suc_eof_callback(gdma_channel_handle_t dma_chan, gdma_event_data_t *event_data, void *user_data)
  203. {
  204. assert(event_data);
  205. adc_digi_context_t *adc_digi_ctx = (adc_digi_context_t *)user_data;
  206. adc_digi_ctx->rx_eof_desc_addr = event_data->rx_eof_desc_addr;
  207. return adc_dma_intr(adc_digi_ctx);
  208. }
  209. static IRAM_ATTR bool adc_dma_intr(adc_digi_context_t *adc_digi_ctx)
  210. {
  211. portBASE_TYPE taskAwoken = 0;
  212. BaseType_t ret;
  213. adc_hal_dma_desc_status_t status = false;
  214. dma_descriptor_t *current_desc = NULL;
  215. while (1) {
  216. status = adc_hal_get_reading_result(&adc_digi_ctx->hal, adc_digi_ctx->rx_eof_desc_addr, &current_desc);
  217. if (status != ADC_HAL_DMA_DESC_VALID) {
  218. break;
  219. }
  220. ret = xRingbufferSendFromISR(adc_digi_ctx->ringbuf_hdl, current_desc->buffer, current_desc->dw0.length, &taskAwoken);
  221. if (ret == pdFALSE) {
  222. //ringbuffer overflow
  223. adc_digi_ctx->ringbuf_overflow_flag = 1;
  224. }
  225. }
  226. if (status == ADC_HAL_DMA_DESC_NULL) {
  227. //start next turns of dma operation
  228. adc_hal_digi_rxdma_start(&adc_digi_ctx->hal, adc_digi_ctx->rx_dma_buf);
  229. }
  230. return (taskAwoken == pdTRUE);
  231. }
  232. esp_err_t adc_digi_start(void)
  233. {
  234. if (s_adc_digi_ctx->driver_start_flag != 0) {
  235. ESP_LOGE(ADC_TAG, "The driver is already started");
  236. return ESP_ERR_INVALID_STATE;
  237. }
  238. adc_power_acquire();
  239. //reset flags
  240. s_adc_digi_ctx->ringbuf_overflow_flag = 0;
  241. s_adc_digi_ctx->driver_start_flag = 1;
  242. if (s_adc_digi_ctx->use_adc1) {
  243. SAR_ADC1_LOCK_ACQUIRE();
  244. }
  245. if (s_adc_digi_ctx->use_adc2) {
  246. SAR_ADC2_LOCK_ACQUIRE();
  247. }
  248. #if CONFIG_PM_ENABLE
  249. // Lock APB frequency while ADC driver is in use
  250. esp_pm_lock_acquire(s_adc_digi_ctx->pm_lock);
  251. #endif
  252. adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
  253. if (s_adc_digi_ctx->use_adc1) {
  254. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_1, ADC_CHANNEL_MAX, s_adc_digi_ctx->adc1_atten);
  255. adc_hal_set_calibration_param(ADC_NUM_1, cal_val);
  256. }
  257. if (s_adc_digi_ctx->use_adc2) {
  258. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_2, ADC_CHANNEL_MAX, s_adc_digi_ctx->adc2_atten);
  259. adc_hal_set_calibration_param(ADC_NUM_2, cal_val);
  260. }
  261. adc_hal_init();
  262. adc_hal_arbiter_config(&config);
  263. adc_hal_digi_init(&s_adc_digi_ctx->hal);
  264. adc_hal_digi_controller_config(&s_adc_digi_ctx->digi_controller_config);
  265. //reset ADC and DMA
  266. adc_hal_fifo_reset(&s_adc_digi_ctx->hal);
  267. //start DMA
  268. adc_hal_digi_rxdma_start(&s_adc_digi_ctx->hal, s_adc_digi_ctx->rx_dma_buf);
  269. //start ADC
  270. adc_hal_digi_start(&s_adc_digi_ctx->hal);
  271. return ESP_OK;
  272. }
  273. esp_err_t adc_digi_stop(void)
  274. {
  275. if (s_adc_digi_ctx->driver_start_flag != 1) {
  276. ESP_LOGE(ADC_TAG, "The driver is already stopped");
  277. return ESP_ERR_INVALID_STATE;
  278. }
  279. s_adc_digi_ctx->driver_start_flag = 0;
  280. //disable the in suc eof intrrupt
  281. adc_hal_digi_dis_intr(&s_adc_digi_ctx->hal, IN_SUC_EOF_BIT);
  282. //clear the in suc eof interrupt
  283. adc_hal_digi_clr_intr(&s_adc_digi_ctx->hal, IN_SUC_EOF_BIT);
  284. //stop ADC
  285. adc_hal_digi_stop(&s_adc_digi_ctx->hal);
  286. //stop DMA
  287. adc_hal_digi_rxdma_stop(&s_adc_digi_ctx->hal);
  288. adc_hal_digi_deinit();
  289. #if CONFIG_PM_ENABLE
  290. if (s_adc_digi_ctx->pm_lock) {
  291. esp_pm_lock_release(s_adc_digi_ctx->pm_lock);
  292. }
  293. #endif //CONFIG_PM_ENABLE
  294. if (s_adc_digi_ctx->use_adc1) {
  295. SAR_ADC1_LOCK_RELEASE();
  296. }
  297. if (s_adc_digi_ctx->use_adc2) {
  298. SAR_ADC2_LOCK_RELEASE();
  299. }
  300. adc_power_release();
  301. return ESP_OK;
  302. }
  303. esp_err_t adc_digi_read_bytes(uint8_t *buf, uint32_t length_max, uint32_t *out_length, uint32_t timeout_ms)
  304. {
  305. TickType_t ticks_to_wait;
  306. esp_err_t ret = ESP_OK;
  307. uint8_t *data = NULL;
  308. size_t size = 0;
  309. ticks_to_wait = timeout_ms / portTICK_RATE_MS;
  310. if (timeout_ms == ADC_MAX_DELAY) {
  311. ticks_to_wait = portMAX_DELAY;
  312. }
  313. data = xRingbufferReceiveUpTo(s_adc_digi_ctx->ringbuf_hdl, &size, ticks_to_wait, length_max);
  314. if (!data) {
  315. ESP_LOGV(ADC_TAG, "No data, increase timeout or reduce conv_num_each_intr");
  316. ret = ESP_ERR_TIMEOUT;
  317. *out_length = 0;
  318. return ret;
  319. }
  320. memcpy(buf, data, size);
  321. vRingbufferReturnItem(s_adc_digi_ctx->ringbuf_hdl, data);
  322. assert((size % 4) == 0);
  323. *out_length = size;
  324. if (s_adc_digi_ctx->ringbuf_overflow_flag) {
  325. ret = ESP_ERR_INVALID_STATE;
  326. }
  327. return ret;
  328. }
  329. esp_err_t adc_digi_deinitialize(void)
  330. {
  331. if (!s_adc_digi_ctx) {
  332. return ESP_ERR_INVALID_STATE;
  333. }
  334. if (s_adc_digi_ctx->driver_start_flag != 0) {
  335. ESP_LOGE(ADC_TAG, "The driver is not stopped");
  336. return ESP_ERR_INVALID_STATE;
  337. }
  338. if (s_adc_digi_ctx->ringbuf_hdl) {
  339. vRingbufferDelete(s_adc_digi_ctx->ringbuf_hdl);
  340. s_adc_digi_ctx->ringbuf_hdl = NULL;
  341. }
  342. #if CONFIG_PM_ENABLE
  343. if (s_adc_digi_ctx->pm_lock) {
  344. esp_pm_lock_delete(s_adc_digi_ctx->pm_lock);
  345. }
  346. #endif //CONFIG_PM_ENABLE
  347. free(s_adc_digi_ctx->rx_dma_buf);
  348. free(s_adc_digi_ctx->hal.rx_desc);
  349. free(s_adc_digi_ctx->digi_controller_config.adc_pattern);
  350. gdma_disconnect(s_adc_digi_ctx->rx_dma_channel);
  351. gdma_del_channel(s_adc_digi_ctx->rx_dma_channel);
  352. free(s_adc_digi_ctx);
  353. s_adc_digi_ctx = NULL;
  354. periph_module_disable(PERIPH_SARADC_MODULE);
  355. return ESP_OK;
  356. }
  357. /*---------------------------------------------------------------
  358. ADC Single Read Mode
  359. ---------------------------------------------------------------*/
  360. static adc_atten_t s_atten1_single[ADC1_CHANNEL_MAX]; //Array saving attenuate of each channel of ADC1, used by single read API
  361. static adc_atten_t s_atten2_single[ADC2_CHANNEL_MAX]; //Array saving attenuate of each channel of ADC2, used by single read API
  362. esp_err_t adc_vref_to_gpio(adc_unit_t adc_unit, gpio_num_t gpio)
  363. {
  364. esp_err_t ret;
  365. uint32_t channel = ADC2_CHANNEL_MAX;
  366. if (adc_unit == ADC_UNIT_2) {
  367. for (int i = 0; i < ADC2_CHANNEL_MAX; i++) {
  368. if (gpio == ADC_GET_IO_NUM(ADC_NUM_2, i)) {
  369. channel = i;
  370. break;
  371. }
  372. }
  373. if (channel == ADC2_CHANNEL_MAX) {
  374. return ESP_ERR_INVALID_ARG;
  375. }
  376. }
  377. adc_power_acquire();
  378. if (adc_unit & ADC_UNIT_1) {
  379. ADC_ENTER_CRITICAL();
  380. adc_hal_vref_output(ADC_NUM_1, channel, true);
  381. ADC_EXIT_CRITICAL();
  382. } else if (adc_unit & ADC_UNIT_2) {
  383. ADC_ENTER_CRITICAL();
  384. adc_hal_vref_output(ADC_NUM_2, channel, true);
  385. ADC_EXIT_CRITICAL();
  386. }
  387. ret = adc_digi_gpio_init(ADC_NUM_2, BIT(channel));
  388. return ret;
  389. }
  390. esp_err_t adc1_config_width(adc_bits_width_t width_bit)
  391. {
  392. //On ESP32C3, the data width is always 12-bits.
  393. if (width_bit != ADC_WIDTH_BIT_12) {
  394. return ESP_ERR_INVALID_ARG;
  395. }
  396. return ESP_OK;
  397. }
  398. esp_err_t adc1_config_channel_atten(adc1_channel_t channel, adc_atten_t atten)
  399. {
  400. ADC_CHANNEL_CHECK(ADC_NUM_1, channel);
  401. ADC_CHECK(atten < ADC_ATTEN_MAX, "ADC Atten Err", ESP_ERR_INVALID_ARG);
  402. esp_err_t ret = ESP_OK;
  403. s_atten1_single[channel] = atten;
  404. ret = adc_digi_gpio_init(ADC_NUM_1, BIT(channel));
  405. adc_hal_calibration_init(ADC_NUM_1);
  406. return ret;
  407. }
  408. int adc1_get_raw(adc1_channel_t channel)
  409. {
  410. int raw_out = 0;
  411. periph_module_enable(PERIPH_SARADC_MODULE);
  412. adc_power_acquire();
  413. SAR_ADC1_LOCK_ACQUIRE();
  414. adc_atten_t atten = s_atten1_single[channel];
  415. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_1, channel, atten);
  416. adc_hal_set_calibration_param(ADC_NUM_1, cal_val);
  417. ADC_REG_LOCK_ENTER();
  418. adc_hal_set_atten(ADC_NUM_2, channel, atten);
  419. adc_hal_convert(ADC_NUM_1, channel, &raw_out);
  420. ADC_REG_LOCK_EXIT();
  421. SAR_ADC1_LOCK_RELEASE();
  422. adc_power_release();
  423. periph_module_disable(PERIPH_SARADC_MODULE);
  424. return raw_out;
  425. }
  426. esp_err_t adc2_config_channel_atten(adc2_channel_t channel, adc_atten_t atten)
  427. {
  428. ADC_CHANNEL_CHECK(ADC_NUM_2, channel);
  429. ADC_CHECK(atten <= ADC_ATTEN_11db, "ADC2 Atten Err", ESP_ERR_INVALID_ARG);
  430. esp_err_t ret = ESP_OK;
  431. s_atten2_single[channel] = atten;
  432. ret = adc_digi_gpio_init(ADC_NUM_2, BIT(channel));
  433. adc_hal_calibration_init(ADC_NUM_2);
  434. return ret;
  435. }
  436. esp_err_t adc2_get_raw(adc2_channel_t channel, adc_bits_width_t width_bit, int *raw_out)
  437. {
  438. //On ESP32C3, the data width is always 12-bits.
  439. if (width_bit != ADC_WIDTH_BIT_12) {
  440. return ESP_ERR_INVALID_ARG;
  441. }
  442. esp_err_t ret = ESP_OK;
  443. periph_module_enable(PERIPH_SARADC_MODULE);
  444. adc_power_acquire();
  445. SAR_ADC2_LOCK_ACQUIRE();
  446. adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT();
  447. adc_hal_arbiter_config(&config);
  448. adc_atten_t atten = s_atten2_single[channel];
  449. uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_2, channel, atten);
  450. adc_hal_set_calibration_param(ADC_NUM_2, cal_val);
  451. ADC_REG_LOCK_ENTER();
  452. adc_hal_set_atten(ADC_NUM_2, channel, atten);
  453. ret = adc_hal_convert(ADC_NUM_2, channel, raw_out);
  454. ADC_REG_LOCK_EXIT();
  455. SAR_ADC2_LOCK_RELEASE();
  456. adc_power_release();
  457. periph_module_disable(PERIPH_SARADC_MODULE);
  458. return ret;
  459. }
  460. /*---------------------------------------------------------------
  461. Digital controller setting
  462. ---------------------------------------------------------------*/
  463. esp_err_t adc_digi_controller_config(const adc_digi_config_t *config)
  464. {
  465. if (!s_adc_digi_ctx) {
  466. return ESP_ERR_INVALID_STATE;
  467. }
  468. ADC_CHECK(config->sample_freq_hz <= SOC_ADC_SAMPLE_FREQ_THRES_HIGH && config->sample_freq_hz >= SOC_ADC_SAMPLE_FREQ_THRES_LOW, "ADC sampling frequency out of range", ESP_ERR_INVALID_ARG);
  469. s_adc_digi_ctx->digi_controller_config.conv_limit_en = config->conv_limit_en;
  470. s_adc_digi_ctx->digi_controller_config.conv_limit_num = config->conv_limit_num;
  471. s_adc_digi_ctx->digi_controller_config.adc_pattern_len = config->adc_pattern_len;
  472. s_adc_digi_ctx->digi_controller_config.sample_freq_hz = config->sample_freq_hz;
  473. memcpy(s_adc_digi_ctx->digi_controller_config.adc_pattern, config->adc_pattern, config->adc_pattern_len * sizeof(adc_digi_pattern_table_t));
  474. const int atten_uninitialised = 999;
  475. s_adc_digi_ctx->adc1_atten = atten_uninitialised;
  476. s_adc_digi_ctx->adc2_atten = atten_uninitialised;
  477. s_adc_digi_ctx->use_adc1 = 0;
  478. s_adc_digi_ctx->use_adc2 = 0;
  479. for (int i = 0; i < config->adc_pattern_len; i++) {
  480. const adc_digi_pattern_table_t *pat = &config->adc_pattern[i];
  481. if (pat->unit == ADC_NUM_1) {
  482. s_adc_digi_ctx->use_adc1 = 1;
  483. if (s_adc_digi_ctx->adc1_atten == atten_uninitialised) {
  484. s_adc_digi_ctx->adc1_atten = pat->atten;
  485. } else if (s_adc_digi_ctx->adc1_atten != pat->atten) {
  486. return ESP_ERR_INVALID_ARG;
  487. }
  488. } else if (pat->unit == ADC_NUM_2) {
  489. //See whether ADC2 will be used or not. If yes, the ``sar_adc2_mutex`` should be acquired in the continuous read driver
  490. s_adc_digi_ctx->use_adc2 = 1;
  491. if (s_adc_digi_ctx->adc2_atten == atten_uninitialised) {
  492. s_adc_digi_ctx->adc2_atten = pat->atten;
  493. } else if (s_adc_digi_ctx->adc2_atten != pat->atten) {
  494. return ESP_ERR_INVALID_ARG;
  495. }
  496. }
  497. }
  498. return ESP_OK;
  499. }
  500. /*************************************/
  501. /* Digital controller filter setting */
  502. /*************************************/
  503. esp_err_t adc_digi_filter_reset(adc_digi_filter_idx_t idx)
  504. {
  505. ADC_ENTER_CRITICAL();
  506. adc_hal_digi_filter_reset(idx);
  507. ADC_EXIT_CRITICAL();
  508. return ESP_OK;
  509. }
  510. esp_err_t adc_digi_filter_set_config(adc_digi_filter_idx_t idx, adc_digi_filter_t *config)
  511. {
  512. ADC_ENTER_CRITICAL();
  513. adc_hal_digi_filter_set_factor(idx, config);
  514. ADC_EXIT_CRITICAL();
  515. return ESP_OK;
  516. }
  517. esp_err_t adc_digi_filter_get_config(adc_digi_filter_idx_t idx, adc_digi_filter_t *config)
  518. {
  519. ADC_ENTER_CRITICAL();
  520. adc_hal_digi_filter_get_factor(idx, config);
  521. ADC_EXIT_CRITICAL();
  522. return ESP_OK;
  523. }
  524. esp_err_t adc_digi_filter_enable(adc_digi_filter_idx_t idx, bool enable)
  525. {
  526. ADC_ENTER_CRITICAL();
  527. adc_hal_digi_filter_enable(idx, enable);
  528. ADC_EXIT_CRITICAL();
  529. return ESP_OK;
  530. }
  531. /**************************************/
  532. /* Digital controller monitor setting */
  533. /**************************************/
  534. esp_err_t adc_digi_monitor_set_config(adc_digi_monitor_idx_t idx, adc_digi_monitor_t *config)
  535. {
  536. ADC_ENTER_CRITICAL();
  537. adc_hal_digi_monitor_config(idx, config);
  538. ADC_EXIT_CRITICAL();
  539. return ESP_OK;
  540. }
  541. esp_err_t adc_digi_monitor_enable(adc_digi_monitor_idx_t idx, bool enable)
  542. {
  543. ADC_ENTER_CRITICAL();
  544. adc_hal_digi_monitor_enable(idx, enable);
  545. ADC_EXIT_CRITICAL();
  546. return ESP_OK;
  547. }
  548. /*---------------------------------------------------------------
  549. RTC controller setting
  550. ---------------------------------------------------------------*/
  551. static uint16_t s_adc_cali_param[ADC_UNIT_MAX][ADC_ATTEN_MAX] = {};
  552. //NOTE: according to calibration version, different types of lock may be taken during the process:
  553. // 1. Semaphore when reading efuse
  554. // 2. Lock (Spinlock, or Mutex) if we actually do ADC calibration in the future
  555. //This function shoudn't be called inside critical section or ISR
  556. static uint32_t adc_get_calibration_offset(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten)
  557. {
  558. const bool no_cal = false;
  559. if (s_adc_cali_param[adc_n][atten]) {
  560. return (uint32_t)s_adc_cali_param[adc_n][atten];
  561. }
  562. if (no_cal) {
  563. return 0; //indicating failure
  564. }
  565. // check if we can fetch the values from eFuse.
  566. int version = esp_efuse_rtc_calib_get_ver();
  567. uint32_t init_code = 0;
  568. if (version == 1) {
  569. //for calibration v1, both ADC units use the same init code (calibrated by ADC1)
  570. init_code = esp_efuse_rtc_calib_get_init_code(version, atten);
  571. ESP_LOGD(ADC_TAG, "Calib(V%d) ADC0, 1 atten=%d: %04X", version, atten, init_code);
  572. s_adc_cali_param[0][atten] = init_code;
  573. s_adc_cali_param[1][atten] = init_code;
  574. } else {
  575. adc_power_acquire();
  576. ADC_ENTER_CRITICAL();
  577. const bool internal_gnd = true;
  578. init_code = adc_hal_self_calibration(adc_n, channel, atten, internal_gnd);
  579. ADC_EXIT_CRITICAL();
  580. adc_power_release();
  581. ESP_LOGD(ADC_TAG, "Calib(V%d) ADC%d atten=%d: %04X", version, adc_n, atten, init_code);
  582. s_adc_cali_param[adc_n][atten] = init_code;
  583. }
  584. return init_code;
  585. }
  586. // Internal function to calibrate PWDET for WiFi
  587. esp_err_t adc_cal_offset(adc_ll_num_t adc_n, adc_channel_t channel, adc_atten_t atten)
  588. {
  589. adc_hal_calibration_init(adc_n);
  590. uint32_t cal_val = adc_get_calibration_offset(adc_n, channel, atten);
  591. ADC_ENTER_CRITICAL();
  592. adc_hal_set_calibration_param(adc_n, cal_val);
  593. ADC_EXIT_CRITICAL();
  594. return ESP_OK;
  595. }