refactor(esp_hal_regi2c): move regi2c implementation from esp_rom to esp_hal_regi2c

This commit is contained in:
Song Ruo Jing
2026-02-05 21:07:45 +08:00
parent 17133fbc0e
commit 600bf5b6d7
176 changed files with 1975 additions and 1825 deletions
+1 -1
View File
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2019-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
+32 -3
View File
@@ -1,14 +1,14 @@
/*
* SPDX-FileCopyrightText: 2019-2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2019-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
#include <sys/param.h>
#include "soc/soc_caps.h"
#include "hal/adc_hal_common.h"
#include "hal/adc_ll.h"
#include "hal/assert.h"
#include "hal/regi2c_ctrl.h"
#include "esp_attr.h"
/*---------------------------------------------------------------
Controller Setting
@@ -197,3 +197,32 @@ uint32_t adc_hal_self_calibration(adc_unit_t adc_n, adc_atten_t atten, bool inte
}
#endif //#if SOC_ADC_SELF_HW_CALI_SUPPORTED
#endif //SOC_ADC_CALIBRATION_V1_SUPPORTED
/*---------------------------------------------------------------
I2C SAR ADC register backup/restore
---------------------------------------------------------------*/
#if ADC_LL_ANA_CALI_REG_PD_WORKAROUND
static DRAM_ATTR uint8_t s_adc_i2c_reg_val[ADC_LL_ANA_CALI_REG_BYTE_NUM];
void IRAM_ATTR adc_hal_i2c_saradc_reg_backup(void)
{
REGI2C_CLOCK_ENABLE();
REGI2C_ENTER_CRITICAL();
for (int i = 0; i < ADC_LL_ANA_CALI_REG_BYTE_NUM; i++) {
s_adc_i2c_reg_val[i] = regi2c_impl_read(I2C_SAR_ADC, I2C_SAR_ADC_HOSTID, i);
}
REGI2C_EXIT_CRITICAL();
REGI2C_CLOCK_DISABLE();
}
void IRAM_ATTR adc_hal_i2c_saradc_reg_restore(void)
{
REGI2C_CLOCK_ENABLE();
REGI2C_ENTER_CRITICAL();
for (int i = 0; i < ADC_LL_ANA_CALI_REG_BYTE_NUM; i++) {
regi2c_impl_write(I2C_SAR_ADC, I2C_SAR_ADC_HOSTID, i, s_adc_i2c_reg_val[i]);
}
REGI2C_EXIT_CRITICAL();
REGI2C_CLOCK_DISABLE();
}
#endif // ADC_LL_ANA_CALI_REG_PD_WORKAROUND
@@ -57,6 +57,12 @@ extern "C" {
---------------------------------------------------------------*/
#define ADC_LL_PWDET_CCT_DEFAULT (4)
/*---------------------------------------------------------------
I2C SAR ADC REG PD workaround
---------------------------------------------------------------*/
#define ADC_LL_ANA_CALI_REG_PD_WORKAROUND 1
#define ADC_LL_ANA_CALI_REG_BYTE_NUM 8
typedef enum {
ADC_LL_POWER_BY_FSM, /*!< ADC XPD controlled by FSM. Used for polling mode */
ADC_LL_POWER_SW_ON, /*!< ADC XPD controlled by SW. power on. Used for DMA mode */
@@ -104,6 +104,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -126,6 +127,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -76,6 +76,12 @@ extern "C" {
---------------------------------------------------------------*/
#define ADC_LL_PWDET_CCT_DEFAULT (4)
/*---------------------------------------------------------------
I2C SAR ADC REG PD workaround
---------------------------------------------------------------*/
#define ADC_LL_ANA_CALI_REG_PD_WORKAROUND 1
#define ADC_LL_ANA_CALI_REG_BYTE_NUM 8
typedef enum {
ADC_LL_POWER_BY_FSM, /*!< ADC XPD controlled by FSM. Used for polling mode */
ADC_LL_POWER_SW_ON, /*!< ADC XPD controlled by SW. power on. Used for DMA mode */
@@ -104,6 +104,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -126,6 +127,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -118,6 +118,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -141,6 +142,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -118,6 +118,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -141,6 +142,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -118,6 +118,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -141,6 +142,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -70,6 +70,12 @@ extern "C" {
---------------------------------------------------------------*/
#define ADC_LL_PWDET_CCT_DEFAULT (4)
/*---------------------------------------------------------------
I2C SAR ADC REG PD workaround
---------------------------------------------------------------*/
#define ADC_LL_ANA_CALI_REG_PD_WORKAROUND 1
#define ADC_LL_ANA_CALI_REG_BYTE_NUM 8
typedef enum {
ADC_LL_POWER_BY_FSM = SAR_CTRL_LL_POWER_FSM, /*!< ADC XPD controlled by FSM. Used for polling mode */
ADC_LL_POWER_SW_ON = SAR_CTRL_LL_POWER_ON, /*!< ADC XPD controlled by SW. power on. Used for DMA mode */
@@ -117,6 +117,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -140,6 +141,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -112,6 +112,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
@@ -135,6 +136,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -68,6 +68,12 @@ extern "C" {
---------------------------------------------------------------*/
#define ADC_LL_PWDET_CCT_DEFAULT (4)
/*---------------------------------------------------------------
I2C SAR ADC REG PD workaround
---------------------------------------------------------------*/
#define ADC_LL_ANA_CALI_REG_PD_WORKAROUND 1
#define ADC_LL_ANA_CALI_REG_BYTE_NUM 8
typedef enum {
ADC_LL_POWER_BY_FSM, /*!< ADC XPD controlled by FSM. Used for polling mode */
ADC_LL_POWER_SW_ON, /*!< ADC XPD controlled by SW. power on. Used for DMA mode */
@@ -89,6 +89,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t tsens_dac)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, tsens_dac);
@@ -115,6 +116,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -70,6 +70,12 @@ extern "C" {
---------------------------------------------------------------*/
#define ADC_LL_PWDET_CCT_DEFAULT (4)
/*---------------------------------------------------------------
I2C SAR ADC REG PD workaround
---------------------------------------------------------------*/
#define ADC_LL_ANA_CALI_REG_PD_WORKAROUND 1
#define ADC_LL_ANA_CALI_REG_BYTE_NUM 8
typedef enum {
ADC_LL_POWER_BY_FSM, /*!< ADC XPD controlled by FSM. Used for polling mode */
ADC_LL_POWER_SW_ON, /*!< ADC XPD controlled by SW. power on. Used for DMA mode */
@@ -89,6 +89,7 @@ static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t cl
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_set_range(uint32_t tsens_dac)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, tsens_dac);
@@ -115,6 +116,7 @@ static inline uint32_t temperature_sensor_ll_get_raw_value(void)
*
* @return uint32_t offset value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2024 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2021-2022 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2021-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -8,6 +8,10 @@
#include "hal/adc_types.h"
#include "hal/adc_types_private.h"
#include "soc/soc_caps.h"
#if SOC_ADC_SUPPORTED
#include "hal/adc_ll.h"
#endif
#ifdef __cplusplus
extern "C" {
@@ -91,6 +95,21 @@ uint32_t adc_hal_self_calibration(adc_unit_t adc_n, adc_atten_t atten, bool inte
#endif //SOC_ADC_CALIBRATION_V1_SUPPORTED
/*---------------------------------------------------------------
I2C SAR ADC register backup/restore
---------------------------------------------------------------*/
#if ADC_LL_ANA_CALI_REG_PD_WORKAROUND
/**
* @brief Backup I2C SAR ADC analog calibration related register values
*/
void adc_hal_i2c_saradc_reg_backup(void);
/**
* @brief Restore I2C SAR ADC analog calibration related register values
*/
void adc_hal_i2c_saradc_reg_restore(void);
#endif // ADC_LL_ANA_CALI_REG_PD_WORKAROUND
#ifdef __cplusplus
}
#endif
@@ -37,6 +37,11 @@ void temperature_sensor_hal_init(void);
*/
void temperature_sensor_hal_sync_tsens_idx(uint8_t tsens_idx);
#if SOC_TEMPERATURE_SENSOR_SUPPORT_SLEEP_RETENTION
void temperature_sensor_hal_i2c_saradc_reg_backup(void);
void temperature_sensor_hal_i2c_saradc_reg_restore(void);
#endif
#endif // SOC_TEMP_SENSOR_SUPPORTED
#ifdef __cplusplus
@@ -1,5 +1,5 @@
/*
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
* SPDX-FileCopyrightText: 2025-2026 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/
@@ -9,6 +9,7 @@
#include "hal/temperature_sensor_periph.h"
#include "hal/log.h"
#include "esp_rom_sys.h"
#include "esp_attr.h"
__attribute__((unused)) static const char *TAG_TSENS = "temperature_sensor_hal";
@@ -19,6 +20,20 @@ static int s_hal_record_min = INT_NOT_USED;
static int s_hal_record_max = INT_NOT_USED;
static uint8_t s_hal_tsens_idx = 2; // Index for temperature attribute, set 2(middle) as default value
#if SOC_TEMPERATURE_SENSOR_SUPPORT_SLEEP_RETENTION
static uint8_t dac_offset_regi2c;
void temperature_sensor_hal_i2c_saradc_reg_backup(void)
{
dac_offset_regi2c = temperature_sensor_ll_get_offset();
}
void temperature_sensor_hal_i2c_saradc_reg_restore(void)
{
temperature_sensor_ll_set_range(dac_offset_regi2c);
}
#endif
int temperature_sensor_hal_get_raw_value(void)
{
int raw_value = temperature_sensor_ll_get_raw_value();