mirror of
https://github.com/espressif/esp-idf.git
synced 2026-04-27 19:13:21 +00:00
refactor(esp_hal_regi2c): move regi2c implementation from esp_rom to esp_hal_regi2c
This commit is contained in:
@@ -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
|
||||
*/
|
||||
|
||||
@@ -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();
|
||||
|
||||
Reference in New Issue
Block a user