Skip to content

Commit afadb17

Browse files
committed
fix(adc): fix P4 ADC2 oneshot error and refactor apb claim macor
1 parent 2435ffd commit afadb17

File tree

12 files changed

+48
-21
lines changed

12 files changed

+48
-21
lines changed

components/esp_adc/adc_common.c

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
/*
2-
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD
2+
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
33
*
44
* SPDX-License-Identifier: Apache-2.0
55
*/
@@ -17,6 +17,7 @@
1717
#include "hal/adc_hal_common.h"
1818
#include "esp_private/regi2c_ctrl.h"
1919
#include "soc/adc_periph.h"
20+
#include "hal/adc_ll.h"
2021

2122
static const char *TAG = "adc_common";
2223

@@ -57,10 +58,13 @@ esp_err_t adc_channel_to_io(adc_unit_t unit_id, adc_channel_t channel, int * con
5758
---------------------------------------------------------------*/
5859
static __attribute__((constructor)) void adc_hw_calibration(void)
5960
{
60-
adc_apb_periph_claim();
6161
ANALOG_CLOCK_ENABLE();
6262
//Calculate all ICode
6363
for (int i = 0; i < SOC_ADC_PERIPH_NUM; i++) {
64+
if (ADC_LL_NEED_APB_PERIPH_CLAIM(i)) {
65+
adc_apb_periph_claim();
66+
}
67+
6468
adc_hal_calibration_init(i);
6569
for (int j = 0; j < SOC_ADC_ATTEN_NUM; j++) {
6670
/**
@@ -75,8 +79,10 @@ static __attribute__((constructor)) void adc_hw_calibration(void)
7579
}
7680
#endif
7781
}
82+
if (ADC_LL_NEED_APB_PERIPH_CLAIM(i)) {
83+
adc_apb_periph_free();
84+
}
7885
}
7986
ANALOG_CLOCK_DISABLE();
80-
adc_apb_periph_free();
8187
}
8288
#endif //#if SOC_ADC_CALIBRATION_V1_SUPPORTED

components/esp_adc/adc_oneshot.c

Lines changed: 19 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -143,15 +143,15 @@ esp_err_t adc_oneshot_new_unit(const adc_oneshot_unit_init_cfg_t *init_config, a
143143

144144
adc_oneshot_hal_init(&(unit->hal), &config);
145145

146-
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
147-
//To enable the APB_SARADC periph if needed
148-
_lock_acquire(&s_ctx.mutex);
149-
s_ctx.apb_periph_ref_cnts++;
150-
if (s_ctx.apb_periph_ref_cnts == 1) {
151-
adc_apb_periph_claim();
146+
if (ADC_LL_NEED_APB_PERIPH_CLAIM(unit->unit_id)) {
147+
//To enable the APB_SARADC periph if needed
148+
_lock_acquire(&s_ctx.mutex);
149+
s_ctx.apb_periph_ref_cnts++;
150+
if (s_ctx.apb_periph_ref_cnts == 1) {
151+
adc_apb_periph_claim();
152+
}
153+
_lock_release(&s_ctx.mutex);
152154
}
153-
_lock_release(&s_ctx.mutex);
154-
#endif
155155

156156
if (init_config->ulp_mode == ADC_ULP_MODE_DISABLE) {
157157
sar_periph_ctrl_adc_oneshot_power_acquire();
@@ -286,18 +286,19 @@ esp_err_t adc_oneshot_del_unit(adc_oneshot_unit_handle_t handle)
286286
#endif
287287
ESP_ERROR_CHECK(esp_clk_tree_enable_src((soc_module_clk_t)(handle->hal.clk_src), false));
288288
}
289-
free(handle);
290289

291-
#if SOC_ADC_DIG_CTRL_SUPPORTED && !SOC_ADC_RTC_CTRL_SUPPORTED
292-
//To free the APB_SARADC periph if needed
293-
_lock_acquire(&s_ctx.mutex);
294-
s_ctx.apb_periph_ref_cnts--;
295-
assert(s_ctx.apb_periph_ref_cnts >= 0);
296-
if (s_ctx.apb_periph_ref_cnts == 0) {
297-
adc_apb_periph_free();
290+
if (ADC_LL_NEED_APB_PERIPH_CLAIM(handle->unit_id)) {
291+
//To free the APB_SARADC periph if needed
292+
_lock_acquire(&s_ctx.mutex);
293+
s_ctx.apb_periph_ref_cnts--;
294+
assert(s_ctx.apb_periph_ref_cnts >= 0);
295+
if (s_ctx.apb_periph_ref_cnts == 0) {
296+
adc_apb_periph_free();
297+
}
298+
_lock_release(&s_ctx.mutex);
298299
}
299-
_lock_release(&s_ctx.mutex);
300-
#endif
300+
301+
free(handle);
301302

302303
return ESP_OK;
303304
}

components/hal/esp32/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,8 @@ extern "C" {
2525
#define ADC_LL_EVENT_ADC1_ONESHOT_DONE (1 << 0)
2626
#define ADC_LL_EVENT_ADC2_ONESHOT_DONE (1 << 1)
2727

28+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (0)
29+
2830
/*---------------------------------------------------------------
2931
Oneshot
3032
---------------------------------------------------------------*/

components/hal/esp32c2/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@ extern "C" {
3030
#define ADC_LL_EVENT_ADC1_ONESHOT_DONE BIT(31)
3131
#define ADC_LL_EVENT_ADC2_ONESHOT_DONE BIT(30)
3232

33+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
34+
3335
/*---------------------------------------------------------------
3436
Oneshot
3537
---------------------------------------------------------------*/

components/hal/esp32c3/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ extern "C" {
3838
#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)
3939
#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)
4040

41+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
42+
4143
/*---------------------------------------------------------------
4244
Oneshot
4345
---------------------------------------------------------------*/

components/hal/esp32c5/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ extern "C" {
3939
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_HIGH_INT_ST_M)
4040
#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)
4141

42+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
43+
4244
/*---------------------------------------------------------------
4345
Oneshot
4446
---------------------------------------------------------------*/

components/hal/esp32c6/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ extern "C" {
3838
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_HIGH_INT_ST_M)
3939
#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)
4040

41+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
42+
4143
/*---------------------------------------------------------------
4244
Oneshot
4345
---------------------------------------------------------------*/

components/hal/esp32c61/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,8 @@ extern "C" {
3939
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? SARADC_THRES0_HIGH_INT_ST_M : SARADC_THRES1_HIGH_INT_ST_M)
4040
#define ADC_LL_GET_LOW_THRES_MASK(monitor_id) ((monitor_id == 0) ? SARADC_THRES0_LOW_INT_ST_M : SARADC_THRES1_LOW_INT_ST_M)
4141

42+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
43+
4244
/*---------------------------------------------------------------
4345
Oneshot
4446
---------------------------------------------------------------*/

components/hal/esp32h2/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@ extern "C" {
3838
#define ADC_LL_GET_HIGH_THRES_MASK(monitor_id) ((monitor_id == 0) ? APB_SARADC_APB_SARADC_THRES0_HIGH_INT_ST_M : APB_SARADC_APB_SARADC_THRES1_HIGH_INT_ST_M)
3939
#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)
4040

41+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (1)
42+
4143
/*---------------------------------------------------------------
4244
Oneshot
4345
---------------------------------------------------------------*/

components/hal/esp32p4/include/hal/adc_ll.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,8 @@ extern "C" {
3434
#define LP_ADC_FORCE_XPD_SAR_PD 2 // Force power down
3535
#define LP_ADC_FORCE_XPD_SAR_PU 3 // Force power up
3636

37+
#define ADC_LL_NEED_APB_PERIPH_CLAIM(ADC_UNIT) (((ADC_UNIT) == ADC_UNIT_1) ? 0 : 1)
38+
3739
/*---------------------------------------------------------------
3840
Oneshot
3941
---------------------------------------------------------------*/

0 commit comments

Comments
 (0)