fix(adc): fix P4 ADC2 oneshot error and refactor apb claim macor

This commit is contained in:
gaoxu
2025-11-25 15:58:29 +08:00
committed by BOT
parent 340d7655ad
commit 286d9b2091
12 changed files with 48 additions and 31 deletions
+9 -3
View File
@@ -1,5 +1,5 @@
/* /*
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD * SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* *
* SPDX-License-Identifier: Apache-2.0 * SPDX-License-Identifier: Apache-2.0
*/ */
@@ -17,6 +17,7 @@
#include "hal/adc_hal_common.h" #include "hal/adc_hal_common.h"
#include "esp_private/regi2c_ctrl.h" #include "esp_private/regi2c_ctrl.h"
#include "soc/adc_periph.h" #include "soc/adc_periph.h"
#include "hal/adc_ll.h"
static const char *TAG = "adc_common"; static const char *TAG = "adc_common";
@@ -57,10 +58,13 @@ esp_err_t adc_channel_to_io(adc_unit_t unit_id, adc_channel_t channel, int * con
---------------------------------------------------------------*/ ---------------------------------------------------------------*/
static __attribute__((constructor)) void adc_hw_calibration(void) static __attribute__((constructor)) void adc_hw_calibration(void)
{ {
adc_apb_periph_claim();
ANALOG_CLOCK_ENABLE(); ANALOG_CLOCK_ENABLE();
//Calculate all ICode //Calculate all ICode
for (int i = 0; i < SOC_ADC_PERIPH_NUM; i++) { for (int i = 0; i < SOC_ADC_PERIPH_NUM; i++) {
if (ADC_LL_NEED_APB_PERIPH_CLAIM(i)) {
adc_apb_periph_claim();
}
adc_hal_calibration_init(i); adc_hal_calibration_init(i);
for (int j = 0; j < SOC_ADC_ATTEN_NUM; j++) { for (int j = 0; j < SOC_ADC_ATTEN_NUM; j++) {
/** /**
@@ -75,8 +79,10 @@ static __attribute__((constructor)) void adc_hw_calibration(void)
} }
#endif #endif
} }
if (ADC_LL_NEED_APB_PERIPH_CLAIM(i)) {
adc_apb_periph_free();
}
} }
ANALOG_CLOCK_DISABLE(); ANALOG_CLOCK_DISABLE();
adc_apb_periph_free();
} }
#endif //#if SOC_ADC_CALIBRATION_V1_SUPPORTED #endif //#if SOC_ADC_CALIBRATION_V1_SUPPORTED
+20 -18
View File
@@ -144,15 +144,15 @@ esp_err_t adc_oneshot_new_unit(const adc_oneshot_unit_init_cfg_t *init_config, a
adc_oneshot_hal_init(&(unit->hal), &config); adc_oneshot_hal_init(&(unit->hal), &config);
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED if (ADC_LL_NEED_APB_PERIPH_CLAIM(unit->unit_id)) {
//To enable the APB_SARADC periph if needed //To enable the APB_SARADC periph if needed
_lock_acquire(&s_ctx.mutex); _lock_acquire(&s_ctx.mutex);
s_ctx.apb_periph_ref_cnts++; s_ctx.apb_periph_ref_cnts++;
if (s_ctx.apb_periph_ref_cnts == 1) { if (s_ctx.apb_periph_ref_cnts == 1) {
adc_apb_periph_claim(); adc_apb_periph_claim();
}
_lock_release(&s_ctx.mutex);
} }
_lock_release(&s_ctx.mutex);
#endif
if (init_config->ulp_mode == ADC_ULP_MODE_DISABLE) { if (init_config->ulp_mode == ADC_ULP_MODE_DISABLE) {
sar_periph_ctrl_adc_oneshot_power_acquire(); sar_periph_ctrl_adc_oneshot_power_acquire();
@@ -297,18 +297,20 @@ esp_err_t adc_oneshot_del_unit(adc_oneshot_unit_handle_t handle)
#endif #endif
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), false)); ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), false));
} }
free(handle);
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED if (ADC_LL_NEED_APB_PERIPH_CLAIM(handle->unit_id)) {
//To free the APB_SARADC periph if needed //To free the APB_SARADC periph if needed
_lock_acquire(&s_ctx.mutex); _lock_acquire(&s_ctx.mutex);
s_ctx.apb_periph_ref_cnts--; s_ctx.apb_periph_ref_cnts--;
assert(s_ctx.apb_periph_ref_cnts >= 0); assert(s_ctx.apb_periph_ref_cnts >= 0);
if (s_ctx.apb_periph_ref_cnts == 0) { if (s_ctx.apb_periph_ref_cnts == 0) {
adc_apb_periph_free(); adc_apb_periph_free();
}
_lock_release(&s_ctx.mutex);
} }
_lock_release(&s_ctx.mutex);
#endif ESP_LOGD(TAG, "adc unit%"PRId32" is deleted", handle->unit_id);
free(handle);
#if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP #if CONFIG_PM_POWER_DOWN_PERIPHERAL_IN_LIGHT_SLEEP
//TODO: IDF-8475: Depends to SLEEP_RETENTION_MODULE_CLOCK_MODEM retention module after ADC retention supported. //TODO: IDF-8475: Depends to SLEEP_RETENTION_MODULE_CLOCK_MODEM retention module after ADC retention supported.
+2 -1
View File
@@ -26,7 +26,8 @@ extern "C" {
#define ADC_LL_EVENT_ADC1_ONESHOT_DONE (1 << 0) #define ADC_LL_EVENT_ADC1_ONESHOT_DONE (1 << 0)
#define ADC_LL_EVENT_ADC2_ONESHOT_DONE (1 << 1) #define ADC_LL_EVENT_ADC2_ONESHOT_DONE (1 << 1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0 #define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (0)
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
@@ -30,6 +30,8 @@ extern "C" {
#define ADC_LL_EVENT_ADC1_ONESHOT_DONE BIT(31) #define ADC_LL_EVENT_ADC1_ONESHOT_DONE BIT(31)
#define ADC_LL_EVENT_ADC2_ONESHOT_DONE BIT(30) #define ADC_LL_EVENT_ADC2_ONESHOT_DONE BIT(30)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
---------------------------------------------------------------*/ ---------------------------------------------------------------*/
+2 -1
View File
@@ -38,7 +38,8 @@ extern "C" {
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_THRES1_HIGH_INT_ST_M) #define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_THRES1_HIGH_INT_ST_M)
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_THRES1_LOW_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_THRES1_LOW_INT_ST_M)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0 #define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
+2 -1
View File
@@ -40,8 +40,9 @@ extern "C" {
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M)
#define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1) #define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
---------------------------------------------------------------*/ ---------------------------------------------------------------*/
+2 -1
View File
@@ -39,8 +39,9 @@ extern "C" {
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M)
#define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1) #define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
---------------------------------------------------------------*/ ---------------------------------------------------------------*/
+2 -1
View File
@@ -40,8 +40,9 @@ extern "C" {
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? SARADC_THRES0_LOW_INT_ST_M : SARADC_THRES1_LOW_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? SARADC_THRES0_LOW_INT_ST_M : SARADC_THRES1_LOW_INT_ST_M)
#define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1) #define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
---------------------------------------------------------------*/ ---------------------------------------------------------------*/
+2 -1
View File
@@ -39,8 +39,9 @@ extern "C" {
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_LOW_INT_ST_M)
#define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1) #define ADC_LL_ADC_FE_ON_MODEM_DOMAIN (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
---------------------------------------------------------------*/ ---------------------------------------------------------------*/
+1 -2
View File
@@ -35,8 +35,7 @@ extern "C" {
#define LP_ADC_FORCE_XPD_SAR_PU 3 // Force power up #define LP_ADC_FORCE_XPD_SAR_PU 3 // Force power up
// ESP32P4 ADC2 channel is 2-7, so we need to subtract 2 to get the correct channel // ESP32P4 ADC2 channel is 2-7, so we need to subtract 2 to get the correct channel
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 2 #define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (2)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (((ADC_UNIT) == ADC_UNIT_1) ? 0 : 1) #define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (((ADC_UNIT) == ADC_UNIT_1) ? 0 : 1)
/*--------------------------------------------------------------- /*---------------------------------------------------------------
+2 -1
View File
@@ -36,7 +36,8 @@ extern "C" {
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_ADC1_THRES_INT_ST_M : APB_SARADC_ADC2_THRES_INT_ST_M) #define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_ADC1_THRES_INT_ST_M : APB_SARADC_ADC2_THRES_INT_ST_M)
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_ADC1_THRES_INT_ST_M : APB_SARADC_ADC2_THRES_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_ADC1_THRES_INT_ST_M : APB_SARADC_ADC2_THRES_INT_ST_M)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0 #define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (0)
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot
+2 -1
View File
@@ -38,7 +38,8 @@ extern "C" {
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_THRES1_HIGH_INT_ST_M) #define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_THRES1_HIGH_INT_ST_M)
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_THRES1_LOW_INT_ST_M) #define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_THRES0_LOW_INT_ST_M : APB_SARADC_THRES1_LOW_INT_ST_M)
#define ADC_LL_UNIT2_CHANNEL_SUBSTRATION 0 #define ADC_LL_UNIT2_CHANNEL_SUBSTRATION (0)
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (0)
/*--------------------------------------------------------------- /*---------------------------------------------------------------
Oneshot Oneshot