From 1509264f2e2d7384217754190ed623697aa1bf59 Mon Sep 17 00:00:00 2001 From: Armando Date: Wed, 10 Mar 2021 12:01:00 +0800 Subject: [PATCH] adc: add pm_lock to adc driver on esp32c3 --- components/driver/esp32c3/adc.c | 31 +++++++++++++++++-- components/driver/include/driver/adc_common.h | 2 +- components/hal/adc_hal.c | 4 +-- 3 files changed, 31 insertions(+), 6 deletions(-) diff --git a/components/driver/esp32c3/adc.c b/components/driver/esp32c3/adc.c index 491a5608ff..fc76c78703 100644 --- a/components/driver/esp32c3/adc.c +++ b/components/driver/esp32c3/adc.c @@ -19,6 +19,7 @@ #include "sdkconfig.h" #include "esp_intr_alloc.h" #include "esp_log.h" +#include "esp_pm.h" #include "sys/lock.h" #include "freertos/FreeRTOS.h" #include "freertos/semphr.h" @@ -96,6 +97,7 @@ typedef struct adc_digi_context_t { adc_atten_t adc1_atten; //Attenuation for ADC1. On this chip each ADC can only support one attenuation. adc_atten_t adc2_atten; //Attenuation for ADC2. On this chip each ADC can only support one attenuation. adc_digi_config_t digi_controller_config; //Digital Controller Configuration + esp_pm_lock_handle_t pm_lock; //For power management } adc_digi_context_t; static adc_digi_context_t *s_adc_digi_ctx = NULL; @@ -179,6 +181,13 @@ esp_err_t adc_digi_initialize(const adc_digi_init_config_t *init_config) goto cleanup; } +#if CONFIG_PM_ENABLE + ret = esp_pm_lock_create(ESP_PM_APB_FREQ_MAX, 0, "adc_dma", &s_adc_digi_ctx->pm_lock); + if (ret != ESP_OK) { + goto cleanup; + } +#endif //CONFIG_PM_ENABLE + //init gpio pins if (init_config->adc1_chan_mask) { ret = adc_digi_gpio_init(ADC_NUM_1, init_config->adc1_chan_mask); @@ -272,7 +281,7 @@ static IRAM_ATTR bool adc_dma_intr(adc_digi_context_t *adc_digi_ctx) adc_hal_digi_rxdma_start(&adc_digi_ctx->hal, adc_digi_ctx->rx_dma_buf, adc_digi_ctx->bytes_between_intr); } - if(taskAwoken == pdTRUE) { + if (taskAwoken == pdTRUE) { return true; } else { return false; @@ -295,6 +304,11 @@ esp_err_t adc_digi_start(void) } ADC_DIGI_LOCK_ACQUIRE(); +#if CONFIG_PM_ENABLE + // Lock APB frequency while ADC driver is in use + esp_pm_lock_acquire(s_adc_digi_ctx->pm_lock); +#endif + adc_arbiter_t config = ADC_ARBITER_CONFIG_DEFAULT(); if (s_adc_digi_ctx->use_adc1) { uint32_t cal_val = adc_get_calibration_offset(ADC_NUM_1, ADC_CHANNEL_MAX, s_adc_digi_ctx->adc1_atten); @@ -337,6 +351,11 @@ esp_err_t adc_digi_stop(void) //stop DMA adc_hal_digi_rxdma_stop(&s_adc_digi_ctx->hal); adc_hal_digi_deinit(); +#if CONFIG_PM_ENABLE + if (s_adc_digi_ctx->pm_lock) { + esp_pm_lock_release(s_adc_digi_ctx->pm_lock); + } +#endif //CONFIG_PM_ENABLE ADC_DIGI_LOCK_RELEASE(); //When using SARADC2 module, this task needs to be protected from WIFI @@ -390,11 +409,17 @@ esp_err_t adc_digi_deinitialize(void) return ESP_ERR_INVALID_STATE; } - if(s_adc_digi_ctx->ringbuf_hdl) { + if (s_adc_digi_ctx->ringbuf_hdl) { vRingbufferDelete(s_adc_digi_ctx->ringbuf_hdl); s_adc_digi_ctx->ringbuf_hdl = NULL; } +#if CONFIG_PM_ENABLE + if (s_adc_digi_ctx->pm_lock) { + esp_pm_lock_delete(s_adc_digi_ctx->pm_lock); + } +#endif //CONFIG_PM_ENABLE + free(s_adc_digi_ctx->rx_dma_buf); free(s_adc_digi_ctx->hal.rx_desc); free(s_adc_digi_ctx->digi_controller_config.adc_pattern); @@ -527,7 +552,7 @@ esp_err_t adc_digi_controller_config(const adc_digi_config_t *config) s_adc_digi_ctx->use_adc1 = 0; s_adc_digi_ctx->use_adc2 = 0; for (int i = 0; i < config->adc_pattern_len; i++) { - const adc_digi_pattern_table_t* pat = &config->adc_pattern[i]; + const adc_digi_pattern_table_t *pat = &config->adc_pattern[i]; if (pat->unit == ADC_NUM_1) { s_adc_digi_ctx->use_adc1 = 1; diff --git a/components/driver/include/driver/adc_common.h b/components/driver/include/driver/adc_common.h index d2a13b6073..b50dd9f21f 100644 --- a/components/driver/include/driver/adc_common.h +++ b/components/driver/include/driver/adc_common.h @@ -495,7 +495,7 @@ esp_err_t adc_digi_controller_config(const adc_digi_config_t *config); /** * @brief Initialize the Digital ADC. * - * @param init_config Pointer to Digital ADC initilisation config. Refer to ``adc_digi_init_config_t``. + * @param init_config Pointer to Digital ADC initilization config. Refer to ``adc_digi_init_config_t``. * * @return * - ESP_ERR_INVALID_ARG If the combination of arguments is invalid. diff --git a/components/hal/adc_hal.c b/components/hal/adc_hal.c index 70cd4772d5..9dc5e87fff 100644 --- a/components/hal/adc_hal.c +++ b/components/hal/adc_hal.c @@ -393,8 +393,8 @@ esp_err_t adc_hal_convert(adc_ll_num_t adc_n, int channel, int *out_raw) if ((int)adc_ll_rtc_analysis_raw_data(adc_n, (uint16_t)(*out_raw))) { return ESP_ERR_INVALID_STATE; - } else { - return ESP_OK; } + + return ESP_OK; } #endif //#if !CONFIG_IDF_TARGET_ESP32C3