adc_hal.c 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586
  1. /*
  2. * SPDX-FileCopyrightText: 2020-2021 Espressif Systems (Shanghai) CO LTD
  3. *
  4. * SPDX-License-Identifier: Apache-2.0
  5. */
  6. // The HAL layer for ADC (ESP32-C3 specific part)
  7. #include <string.h>
  8. #include "soc/soc_caps.h"
  9. #include "hal/adc_hal.h"
  10. #include "hal/adc_types.h"
  11. #include "soc/soc.h"
  12. //Currently we don't have context for the ADC HAL. So HAL variables are temporarily put here. But
  13. //please don't follow this code. Create a context for your own HAL!
  14. static bool s_filter_enabled[SOC_ADC_DIGI_FILTER_NUM] = {};
  15. static adc_digi_filter_t s_filter[SOC_ADC_DIGI_FILTER_NUM] = {};
  16. static bool s_monitor_enabled[SOC_ADC_DIGI_MONITOR_NUM] = {};
  17. static adc_digi_monitor_t s_monitor_config[SOC_ADC_DIGI_MONITOR_NUM] = {};
  18. /*---------------------------------------------------------------
  19. Digital controller setting
  20. ---------------------------------------------------------------*/
  21. static void filter_update(adc_digi_filter_idx_t idx)
  22. {
  23. //ESP32-C3 has no enable bit, the filter will be enabled when the filter channel is configured
  24. if (s_filter_enabled[idx]) {
  25. adc_ll_digi_filter_set_factor(idx, &s_filter[idx]);
  26. } else {
  27. adc_ll_digi_filter_disable(idx);
  28. }
  29. }
  30. /**
  31. * Set adc digital controller filter factor.
  32. *
  33. * @param idx ADC filter unit.
  34. * @param filter Filter config. Expression: filter_data = (k-1)/k * last_data + new_data / k. Set values: (2, 4, 8, 16, 64).
  35. */
  36. void adc_hal_digi_filter_set_factor(adc_digi_filter_idx_t idx, adc_digi_filter_t *filter)
  37. {
  38. s_filter[idx] = *filter;
  39. filter_update(idx);
  40. }
  41. /**
  42. * Get adc digital controller filter factor.
  43. *
  44. * @param adc_n ADC unit.
  45. * @param factor Expression: filter_data = (k-1)/k * last_data + new_data / k. Set values: (2, 4, 8, 16, 64).
  46. */
  47. void adc_hal_digi_filter_get_factor(adc_digi_filter_idx_t idx, adc_digi_filter_t *filter)
  48. {
  49. *filter = s_filter[idx];
  50. }
  51. void adc_hal_digi_filter_enable(adc_digi_filter_idx_t filter_idx, bool enable)
  52. {
  53. s_filter_enabled[filter_idx] = enable;
  54. filter_update(filter_idx);
  55. }
  56. static void update_monitor(adc_digi_monitor_idx_t idx)
  57. {
  58. //ESP32-C3 has no enable bit, the monitor will be enabled when the monitor channel is configured
  59. if (s_monitor_enabled[idx]) {
  60. adc_ll_digi_monitor_set_mode(idx, &s_monitor_config[idx]);
  61. } else {
  62. adc_ll_digi_monitor_disable(idx);
  63. }
  64. }
  65. void adc_hal_digi_monitor_config(adc_digi_monitor_idx_t idx, adc_digi_monitor_t *config)
  66. {
  67. s_monitor_config[idx] = *config;
  68. update_monitor(idx);
  69. }
  70. void adc_hal_digi_monitor_enable(adc_digi_monitor_idx_t mon_idx, bool enable)
  71. {
  72. s_monitor_enabled[mon_idx] = enable;
  73. update_monitor(mon_idx);
  74. }