Skip to content

Commit

Permalink
Merge branch 'feat/tsens_support_c61' into 'master'
Browse files Browse the repository at this point in the history
feat(temperature_sensor): Add temperature sensor support on esp32c61

Closes IDF-9322

See merge request espressif/esp-idf!34326
  • Loading branch information
mythbuster5 committed Nov 14, 2024
2 parents 7fcbdb9 + bff20b5 commit 38b7375
Show file tree
Hide file tree
Showing 18 changed files with 377 additions and 21 deletions.
4 changes: 2 additions & 2 deletions components/driver/test_apps/legacy_rtc_temp_driver/README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 |
| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 |
| ----------------- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- |
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@
@pytest.mark.esp32h2
@pytest.mark.esp32p4
@pytest.mark.esp32c5
@pytest.mark.esp32c61
@pytest.mark.generic
@pytest.mark.parametrize('config', [
'release',
Expand Down
17 changes: 13 additions & 4 deletions components/efuse/esp32c61/esp_efuse_rtc_calib.c
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,18 @@ esp_err_t esp_efuse_rtc_calib_get_cal_voltage(int version, uint32_t adc_unit, in

esp_err_t esp_efuse_rtc_calib_get_tsens_val(float* tsens_cal)
{
// TODO: [ESP32C61] IDF-9303
abort();
// Currently calibration is not supported on ESP32-C61
*tsens_cal = 0;
const esp_efuse_desc_t** cal_temp_efuse;
cal_temp_efuse = ESP_EFUSE_TEMPERATURE_SENSOR;
int cal_temp_size = esp_efuse_get_field_size(cal_temp_efuse);
assert(cal_temp_size == 9);

uint32_t cal_temp = 0;
esp_err_t err = esp_efuse_read_field_blob(cal_temp_efuse, &cal_temp, cal_temp_size);
if (err != ESP_OK) {
*tsens_cal = 0.0;
return err;
}
// BIT(8) stands for sign: 1: negative, 0: positive
*tsens_cal = ((cal_temp & BIT(8)) != 0)? -(uint8_t)cal_temp: (uint8_t)cal_temp;
return ESP_OK;
}
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 |
| ----------------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- | -------- |
| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C5 | ESP32-C6 | ESP32-C61 | ESP32-H2 | ESP32-P4 | ESP32-S2 | ESP32-S3 |
| ----------------- | -------- | -------- | -------- | -------- | --------- | -------- | -------- | -------- | -------- |
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@
@pytest.mark.esp32h2
@pytest.mark.esp32p4
@pytest.mark.esp32c5
@pytest.mark.esp32c61
@pytest.mark.generic
@pytest.mark.parametrize('config', [
'release',
Expand All @@ -25,6 +26,7 @@ def test_temperature_sensor_driver(dut: Dut) -> None:
@pytest.mark.esp32h2
@pytest.mark.esp32p4
@pytest.mark.esp32c5
@pytest.mark.esp32c61
@pytest.mark.generic
@pytest.mark.parametrize('config', [
'iram_safe',
Expand All @@ -38,6 +40,7 @@ def test_temperature_sensor_cbs(dut: Dut) -> None:
@pytest.mark.esp32s3
@pytest.mark.esp32c2
@pytest.mark.esp32c6
@pytest.mark.esp32c61
@pytest.mark.wifi_two_dut
@pytest.mark.parametrize('count', [2], indirect=True)
def test_temperature_phy_cases(case_tester: CaseTester) -> None: # type: ignore
Expand Down
271 changes: 271 additions & 0 deletions components/hal/esp32c61/include/hal/temperature_sensor_ll.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,271 @@
/*
* SPDX-FileCopyrightText: 2024 Espressif Systems (Shanghai) CO LTD
*
* SPDX-License-Identifier: Apache-2.0
*/

/*******************************************************************************
* NOTICE
* The hal is not public api, don't use in application code.
* See readme.md in component/hal/readme.md
******************************************************************************/

// The LL for temperature sensor

#pragma once

#include <stdbool.h>
#include <stdlib.h>
#include "hal/regi2c_ctrl.h"
#include "soc/regi2c_saradc.h"
#include "soc/apb_saradc_struct.h"
#include "soc/apb_saradc_reg.h"
#include "soc/pcr_struct.h"
#include "soc/soc.h"
#include "soc/soc_caps.h"
#include "soc/pcr_struct.h"
#include "soc/interrupts.h"
#include "soc/soc_etm_source.h"
#include "hal/temperature_sensor_types.h"
#include "hal/assert.h"
#include "hal/misc.h"

#ifdef __cplusplus
extern "C" {
#endif

#define TEMPERATURE_SENSOR_LL_ADC_FACTOR (0.4386)
#define TEMPERATURE_SENSOR_LL_DAC_FACTOR (27.88)
#define TEMPERATURE_SENSOR_LL_OFFSET_FACTOR (20.52)
#define TEMPERATURE_SENSOR_LL_MEASURE_MAX (125)
#define TEMPERATURE_SENSOR_LL_MEASURE_MIN (-40)

#define TEMPERATURE_SENSOR_LL_INTR_MASK SARADC_TSENS_INT_ST

#define TEMPERATURE_SENSOR_LL_ETM_EVENT_TABLE(event) \
(uint32_t [TEMPERATURE_SENSOR_EVENT_MAX]){ \
[TEMPERATURE_SENSOR_EVENT_OVER_LIMIT] = TMPSNSR_EVT_OVER_LIMIT, \
}[event]

#define TEMPERATURE_SENSOR_LL_ETM_TASK_TABLE(task) \
(uint32_t [TEMPERATURE_SENSOR_TASK_MAX]){ \
[TEMPERATURE_SENSOR_TASK_START] = TMPSNSR_TASK_START_SAMPLE, \
[TEMPERATURE_SENSOR_TASK_STOP] = TMPSNSR_TASK_STOP_SAMPLE, \
}[task]

typedef enum {
TEMPERATURE_SENSOR_LL_WAKE_ABSOLUTE = 0,
TEMPERATURE_SENSOR_LL_WAKE_DELTA = 1,
} temperature_sensor_ll_wakeup_mode_t;

/**
* @brief Enable the temperature sensor power.
*
* @param enable true: enable the power.
*/
static inline void temperature_sensor_ll_enable(bool enable)
{
ADC.saradc_apb_tsens_ctrl.saradc_tsens_pu = enable;
}

/**
* @brief Enable the clock
*/
static inline void temperature_sensor_ll_bus_clk_enable(bool enable)
{
PCR.tsens_clk_conf.tsens_clk_en = enable;
}

/**
* @brief Reset the Temperature sensor module
*/
static inline void temperature_sensor_ll_reset_module(void)
{
PCR.tsens_clk_conf.tsens_rst_en = 1;
PCR.tsens_clk_conf.tsens_rst_en = 0;
}

/**
* @brief Select the clock source for temperature sensor. On ESP32-C61, temperautre sensor
* can use XTAL or FOSC. To make it convenience, suggest using XTAL all the time.
*
* @param clk_src refer to ``temperature_sensor_clk_src_t``
*/
static inline void temperature_sensor_ll_clk_sel(temperature_sensor_clk_src_t clk_src)
{
uint8_t clk_sel = 0;
switch (clk_src) {
case TEMPERATURE_SENSOR_CLK_SRC_XTAL:
clk_sel = 1;
break;
case TEMPERATURE_SENSOR_CLK_SRC_RC_FAST:
clk_sel = 0;
break;
default:
HAL_ASSERT(false);
break;
}
PCR.tsens_clk_conf.tsens_clk_sel = clk_sel;
}

/**
* @brief Set the hardware range, you can refer to the table ``temperature_sensor_attributes``
*
* @param tsens_dac ``reg_val`` in table ``temperature_sensor_attributes``
*/
static inline void temperature_sensor_ll_set_range(uint32_t range)
{
REGI2C_WRITE_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC, range);
}

/**
* @brief Get the raw value of temperature sensor.
*
* @return uint32_t raw_value
*/
__attribute__((always_inline))
static inline uint32_t temperature_sensor_ll_get_raw_value(void)
{
return HAL_FORCE_READ_U32_REG_FIELD(ADC.saradc_apb_tsens_ctrl, saradc_tsens_out);
}

/**
* @brief Get the offset value of temperature sensor.
*
* @note This function is only used in legacy driver
*
* @return uint32_t offset value
*/
static inline uint32_t temperature_sensor_ll_get_offset(void)
{
return REGI2C_READ_MASK(I2C_SAR_ADC, I2C_SARADC_TSENS_DAC);
}

/**
* @brief Get the clock division factor value.
*
* @note This function is only used in legacy driver
*
* @return uint32_t clock division factor
*/
static inline uint32_t temperature_sensor_ll_get_clk_div(void)
{
return HAL_FORCE_READ_U32_REG_FIELD(ADC.saradc_apb_tsens_ctrl, saradc_tsens_clk_div);
}

/**
* @brief Set the clock division factor value, actually this has no impact on temperature sensor.
* Suggest just keep it as default value 6.
*
* @note This function is only used in legacy driver
*
* @param clk_div clock division factor, range from 1-10
*/
static inline void temperature_sensor_ll_set_clk_div(uint8_t clk_div)
{
HAL_FORCE_MODIFY_U32_REG_FIELD(ADC.saradc_apb_tsens_ctrl, saradc_tsens_clk_div, clk_div);
}

/**
* @brief Choose the wake-up mode for temperature sensor
*
* @note ESP32-C61 does not support difference mode.
*
* @param mode 0: Absolute value mode. 1: Difference mode.
*/
static inline void temperature_sensor_ll_wakeup_mode(temperature_sensor_ll_wakeup_mode_t mode)
{
ADC.tsens_wake.saradc_wakeup_mode = mode;
}

/**
* @brief Get temperature sensor interrupt/wakeup in which reason
*
* @return uint8_t 0: temperature value lower than low threshold 1: otherwise, higher than high threshold.
*/
__attribute__((always_inline))
static inline uint8_t temperature_sensor_ll_get_wakeup_reason(void)
{
return ADC.tsens_wake.saradc_wakeup_over_upper_th;
}

/**
* @brief Configure whether to enable temperature sensor wake up
*
* @param en true: enable, false: disable.
*/
static inline void temperature_sensor_ll_wakeup_enable(bool en)
{
ADC.tsens_wake.saradc_wakeup_en = en;
}

/**
* @brief Configures the low threshold for temperature sensor to wakeup
*
* @param th_low low threshold value.
*/
static inline void temperature_sensor_ll_set_th_low_val(uint8_t th_low)
{
HAL_FORCE_MODIFY_U32_REG_FIELD(ADC.tsens_wake, saradc_wakeup_th_low, th_low);
}

/**
* @brief Configures the high threshold for temperature sensor to wakeup
*
* @param th_high high threshold value.
*/
static inline void temperature_sensor_ll_set_th_high_val(uint8_t th_high)
{
HAL_FORCE_MODIFY_U32_REG_FIELD(ADC.tsens_wake, saradc_wakeup_th_high, th_high);
}

/**
* @brief Enable temperature sensor interrupt
*
* @param enable true: enable. false: disable
*/
static inline void temperature_sensor_ll_enable_intr(bool enable)
{
ADC.saradc_int_ena.saradc_adc_tsens_int_ena = enable;
}

/**
* @brief Clear temperature sensor interrupt
*/
__attribute__((always_inline))
static inline void temperature_sensor_ll_clear_intr(void)
{
ADC.saradc_int_clr.saradc_adc_tsens_int_clr = 1;
}

/**
* @brief Get temperature sensor interrupt status.
*/
static inline volatile void *temperature_sensor_ll_get_intr_status(void)
{
return &ADC.saradc_int_st;
}

/**
* @brief Configure whether to enable hardware sampling
*
* @param en true: enable, false: disable
*/
static inline void temperature_sensor_ll_sample_enable(bool en)
{
ADC.tsens_sample.saradc_tsens_sample_en = en;
}

/**
* @brief Configures the hardware sampling rate
*
* @param rate sampling rate
*/
static inline void temperature_sensor_ll_set_sample_rate(uint16_t rate)
{
HAL_FORCE_MODIFY_U32_REG_FIELD(ADC.tsens_sample, saradc_tsens_sample_rate, rate);
}

#ifdef __cplusplus
}
#endif
24 changes: 24 additions & 0 deletions components/soc/esp32c61/include/soc/Kconfig.soc_caps.in
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,10 @@ config SOC_ASYNC_MEMCPY_SUPPORTED
bool
default y

config SOC_TEMP_SENSOR_SUPPORTED
bool
default y

config SOC_PHY_SUPPORTED
bool
default y
Expand Down Expand Up @@ -1119,6 +1123,26 @@ config SOC_CLK_ANA_I2C_MST_HAS_ROOT_GATE
bool
default y

config SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC
bool
default y

config SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL
bool
default y

config SOC_TEMPERATURE_SENSOR_INTR_SUPPORT
bool
default y

config SOC_TEMPERATURE_SENSOR_SUPPORT_SLEEP_RETENTION
bool
default y

config SOC_TEMPERATURE_SENSOR_UNDER_PD_TOP_DOMAIN
bool
default y

config SOC_WIFI_HW_TSF
bool
default y
Expand Down
5 changes: 3 additions & 2 deletions components/soc/esp32c61/include/soc/interrupts.h
Original file line number Diff line number Diff line change
Expand Up @@ -69,8 +69,9 @@ typedef enum {
ETS_SYSTIMER_TARGET0_INTR_SOURCE,
ETS_SYSTIMER_TARGET1_INTR_SOURCE,
ETS_SYSTIMER_TARGET2_INTR_SOURCE,
ETS_APB_ADC_INTR_SOURCE,
ETS_DMA_IN_CH0_INTR_SOURCE,
ETS_APB_ADC_INTR_SOURCE = 53,
ETS_TEMPERATURE_SENSOR_INTR_SOURCE = ETS_APB_ADC_INTR_SOURCE,
ETS_DMA_IN_CH0_INTR_SOURCE = 54,
ETS_DMA_IN_CH1_INTR_SOURCE,
ETS_DMA_OUT_CH0_INTR_SOURCE,
ETS_DMA_OUT_CH1_INTR_SOURCE,
Expand Down
Loading

0 comments on commit 38b7375

Please sign in to comment.