From fb9d0d9f0324acb61a1e695d003b2cae6aca9148 Mon Sep 17 00:00:00 2001 From: Cao Sen Miao Date: Thu, 20 Oct 2022 15:04:33 +0800 Subject: [PATCH] temperature_sensor: Add support on ESP32-C6 (No calibration) --- .../deprecated/rtc_temperature_legacy.c | 1 - .../legacy_rtc_temp_driver/README.md | 4 +- .../test_apps/temperature_sensor/README.md | 4 +- .../efuse/esp32c6/esp_efuse_rtc_calib.c | 18 +- .../hal/esp32c6/include/hal/clk_gate_ll.h | 8 + .../include/hal/temperature_sensor_ll.h | 226 ++++++++++++++++++ components/soc/esp32c6/CMakeLists.txt | 1 - .../esp32c6/include/soc/Kconfig.soc_caps.in | 4 + .../soc/esp32c6/include/soc/periph_defs.h | 1 + components/soc/esp32c6/include/soc/soc_caps.h | 3 +- docs/docs_not_updated/esp32c6.txt | 1 - examples/peripherals/temp_sensor/README.md | 4 +- 12 files changed, 248 insertions(+), 27 deletions(-) create mode 100644 components/hal/esp32c6/include/hal/temperature_sensor_ll.h diff --git a/components/driver/deprecated/rtc_temperature_legacy.c b/components/driver/deprecated/rtc_temperature_legacy.c index 965973dab7..fccb3c9e8a 100644 --- a/components/driver/deprecated/rtc_temperature_legacy.c +++ b/components/driver/deprecated/rtc_temperature_legacy.c @@ -12,7 +12,6 @@ #include "esp_log.h" #include "esp_check.h" #include "freertos/FreeRTOS.h" -#include "soc/rtc_cntl_reg.h" #include "esp_private/regi2c_ctrl.h" #include "soc/regi2c_saradc.h" #include "esp_log.h" diff --git a/components/driver/test_apps/legacy_rtc_temp_driver/README.md b/components/driver/test_apps/legacy_rtc_temp_driver/README.md index bff9e386d1..2a60590c79 100644 --- a/components/driver/test_apps/legacy_rtc_temp_driver/README.md +++ b/components/driver/test_apps/legacy_rtc_temp_driver/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/driver/test_apps/temperature_sensor/README.md b/components/driver/test_apps/temperature_sensor/README.md index bff9e386d1..2a60590c79 100644 --- a/components/driver/test_apps/temperature_sensor/README.md +++ b/components/driver/test_apps/temperature_sensor/README.md @@ -1,2 +1,2 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | diff --git a/components/efuse/esp32c6/esp_efuse_rtc_calib.c b/components/efuse/esp32c6/esp_efuse_rtc_calib.c index 4673a93995..d2c3fd6459 100644 --- a/components/efuse/esp32c6/esp_efuse_rtc_calib.c +++ b/components/efuse/esp32c6/esp_efuse_rtc_calib.c @@ -75,21 +75,7 @@ esp_err_t esp_efuse_rtc_calib_get_cal_voltage(int version, int atten, uint32_t* esp_err_t esp_efuse_rtc_calib_get_tsens_val(float* tsens_cal) { - uint32_t version = esp_efuse_rtc_calib_get_ver(); - if (version != 1) { - *tsens_cal = 0.0; - return ESP_ERR_NOT_SUPPORTED; - } - const esp_efuse_desc_t** cal_temp_efuse; - cal_temp_efuse = ESP_EFUSE_TEMP_CALIB; - 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); - assert(err == ESP_OK); - (void)err; - // BIT(8) stands for sign: 1: negtive, 0: positive - *tsens_cal = ((cal_temp & BIT(8)) != 0)? -(uint8_t)cal_temp: (uint8_t)cal_temp; + // Currently calibration is not supported on ESP32-C6, IDF-5236 + *tsens_cal = 0; return ESP_OK; } diff --git a/components/hal/esp32c6/include/hal/clk_gate_ll.h b/components/hal/esp32c6/include/hal/clk_gate_ll.h index 176bbc2377..10c5a999ae 100644 --- a/components/hal/esp32c6/include/hal/clk_gate_ll.h +++ b/components/hal/esp32c6/include/hal/clk_gate_ll.h @@ -68,6 +68,8 @@ static inline uint32_t periph_ll_get_clk_en_mask(periph_module_t periph) return PCR_HMAC_CLK_EN; case PERIPH_DS_MODULE: return PCR_DS_CLK_EN; + case PERIPH_TEMPSENSOR_MODULE: + return PCR_TSENS_CLK_EN; // case PERIPH_RNG_MODULE: // return PCR_WIFI_CLK_RNG_EN; // case PERIPH_WIFI_MODULE: @@ -128,6 +130,8 @@ static inline uint32_t periph_ll_get_rst_en_mask(periph_module_t periph, bool en return PCR_PWM_RST_EN; case PERIPH_ECC_MODULE: return PCR_ECC_RST_EN; + case PERIPH_TEMPSENSOR_MODULE: + return PCR_TSENS_RST_EN; case PERIPH_AES_MODULE: if (enable == true) { // Clear reset on digital signature, otherwise AES unit is held in reset also. @@ -232,6 +236,8 @@ static uint32_t periph_ll_get_clk_en_reg(periph_module_t periph) return PCR_HMAC_CONF_REG; case PERIPH_DS_MODULE: return PCR_DS_CONF_REG; + case PERIPH_TEMPSENSOR_MODULE: + return PCR_TSENS_CLK_CONF_REG; default: return 0; } @@ -288,6 +294,8 @@ static uint32_t periph_ll_get_rst_en_reg(periph_module_t periph) return PCR_HMAC_CONF_REG; case PERIPH_DS_MODULE: return PCR_DS_CONF_REG; + case PERIPH_TEMPSENSOR_MODULE: + return PCR_TSENS_CLK_CONF_REG; default: return 0; } diff --git a/components/hal/esp32c6/include/hal/temperature_sensor_ll.h b/components/hal/esp32c6/include/hal/temperature_sensor_ll.h new file mode 100644 index 0000000000..c57b56e47e --- /dev/null +++ b/components/hal/esp32c6/include/hal/temperature_sensor_ll.h @@ -0,0 +1,226 @@ +/* + * SPDX-FileCopyrightText: 2022 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 +#include +#include "hal/regi2c_ctrl.h" +#include "soc/regi2c_saradc.h" +#include "soc/apb_saradc_struct.h" +#include "soc/soc.h" +#include "soc/soc_caps.h" +#include "soc/pcr_struct.h" +#include "hal/temperature_sensor_types.h" +#include "hal/assert.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) + +/** + * @brief Enable the temperature sensor power. + * + * @param enable true: enable the power. + */ +static inline void temperature_sensor_ll_enable(bool enable) +{ + APB_SARADC.saradc_apb_tsens_ctrl.saradc_tsens_pu = enable; +} + +/** + * @brief Enable the clock + */ +static inline void temperature_sensor_ll_clk_enable(bool enable) +{ + // clock enable duplicated with periph enable, no need to enable it again. +} + +/** + * @brief Select the clock source for temperature sensor. On ESP32-C6, 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 + */ +static inline uint32_t temperature_sensor_ll_get_raw_value(void) +{ + return APB_SARADC.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 APB_SARADC.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) +{ + APB_SARADC.saradc_apb_tsens_ctrl.saradc_tsens_clk_div = clk_div; +} + +/** + * @brief Choose the wake-up mode for temperature sensor + * + * @note ESP32-C6 does not support difference mode. + * + * @param mode 0: Absolute value mode. 1: Difference mode. + */ +static inline void temperature_sensor_ll_wakeup_mode(uint8_t mode) +{ + APB_SARADC.tsens_wake.saradc_wakeup_mode = mode; +} + +/** + * @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) +{ + APB_SARADC.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) +{ + APB_SARADC.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) +{ + APB_SARADC.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) +{ + APB_SARADC.saradc_int_ena.saradc_apb_saradc_tsens_int_ena = enable; +} + +/** + * @brief Clear temperature sensor interrupt + */ +static inline void temperature_sensor_ll_clear_intr(void) +{ + APB_SARADC.saradc_int_clr.saradc_apb_saradc_tsens_int_clr = 1; +} + +/** + * @brief Get temperature sensor interrupt status. + * + * @param[out] int_status interrupt status. + */ +static inline void temperature_sensor_ll_get_intr_status(uint8_t *int_status) +{ + *int_status = APB_SARADC.saradc_int_st.saradc_apb_saradc_tsens_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) +{ + APB_SARADC.tsens_sample.saradc_tsens_sample_en = en; +} + +/** + * @brief Configures the hardware sampling rate + * + * @param rate sampling rate + */ +static inline void temperature_sensor_ll_sample_rate(uint16_t rate) +{ + APB_SARADC.tsens_sample.saradc_tsens_sample_rate = rate; +} + +#ifdef __cplusplus +} +#endif diff --git a/components/soc/esp32c6/CMakeLists.txt b/components/soc/esp32c6/CMakeLists.txt index a910f2382a..1a0ded232d 100644 --- a/components/soc/esp32c6/CMakeLists.txt +++ b/components/soc/esp32c6/CMakeLists.txt @@ -21,7 +21,6 @@ set(srcs list(REMOVE_ITEM srcs "adc_periph.c" # TODO: IDF-5310 "ledc_periph.c" # TODO: IDF-5328 - "temperature_sensor_periph.c" # TODO: IDF-5322 ) add_prefix(srcs "${CMAKE_CURRENT_LIST_DIR}/" "${srcs}") diff --git a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in index 8cb88aa4f7..1ee1e53376 100644 --- a/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in +++ b/components/soc/esp32c6/include/soc/Kconfig.soc_caps.in @@ -35,6 +35,10 @@ config SOC_USB_SERIAL_JTAG_SUPPORTED bool default y +config SOC_TEMP_SENSOR_SUPPORTED + bool + default y + config SOC_SUPPORTS_SECURE_DL_MODE bool default y diff --git a/components/soc/esp32c6/include/soc/periph_defs.h b/components/soc/esp32c6/include/soc/periph_defs.h index 201a73fba5..826ebe6dd6 100644 --- a/components/soc/esp32c6/include/soc/periph_defs.h +++ b/components/soc/esp32c6/include/soc/periph_defs.h @@ -42,6 +42,7 @@ typedef enum { PERIPH_MCPWM0_MODULE, PERIPH_SYSTIMER_MODULE, PERIPH_SARADC_MODULE, + PERIPH_TEMPSENSOR_MODULE, PERIPH_MODULE_MAX } periph_module_t; diff --git a/components/soc/esp32c6/include/soc/soc_caps.h b/components/soc/esp32c6/include/soc/soc_caps.h index bcf983f6b1..ecca93f5dd 100644 --- a/components/soc/esp32c6/include/soc/soc_caps.h +++ b/components/soc/esp32c6/include/soc/soc_caps.h @@ -34,7 +34,7 @@ #define SOC_BT_SUPPORTED 1 #define SOC_ASYNC_MEMCPY_SUPPORTED 1 #define SOC_USB_SERIAL_JTAG_SUPPORTED 1 -// #define SOC_TEMP_SENSOR_SUPPORTED 1 // TODO: IDF-5322 +#define SOC_TEMP_SENSOR_SUPPORTED 1 // #define SOC_WIFI_SUPPORTED 1 // TODO: IDF-5679 #define SOC_SUPPORTS_SECURE_DL_MODE 1 //#define SOC_RISCV_COPROC_SUPPORTED 1 // TODO: IDF-5816 @@ -415,7 +415,6 @@ #define SOC_PM_SUPPORT_BT_PD (1) -// TODO: IDF-5322 (Copy from esp32c3, need check) /*-------------------------- Temperature Sensor CAPS -------------------------------------*/ #define SOC_TEMPERATURE_SENSOR_SUPPORT_FAST_RC (1) #define SOC_TEMPERATURE_SENSOR_SUPPORT_XTAL (1) diff --git a/docs/docs_not_updated/esp32c6.txt b/docs/docs_not_updated/esp32c6.txt index 1d33556ab0..d62790dbad 100644 --- a/docs/docs_not_updated/esp32c6.txt +++ b/docs/docs_not_updated/esp32c6.txt @@ -105,7 +105,6 @@ api-reference/peripherals/touch_element api-reference/peripherals/lcd api-reference/peripherals/secure_element api-reference/peripherals/ledc -api-reference/peripherals/temp_sensor api-reference/peripherals/sdio_slave api-reference/peripherals/clk_tree api-reference/peripherals/sdm diff --git a/examples/peripherals/temp_sensor/README.md b/examples/peripherals/temp_sensor/README.md index 47678c61c8..f79aca7d32 100644 --- a/examples/peripherals/temp_sensor/README.md +++ b/examples/peripherals/temp_sensor/README.md @@ -1,5 +1,5 @@ -| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-S2 | ESP32-S3 | -| ----------------- | -------- | -------- | -------- | -------- | +| Supported Targets | ESP32-C2 | ESP32-C3 | ESP32-C6 | ESP32-S2 | ESP32-S3 | +| ----------------- | -------- | -------- | -------- | -------- | -------- | # Temperature Sensor Example