temperature_sensor: Add support on ESP32-C6 (No calibration)

This commit is contained in:
Cao Sen Miao 2022-10-20 15:04:33 +08:00
parent 167d5ae3b9
commit fb9d0d9f03
12 changed files with 248 additions and 27 deletions

View File

@ -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"

View File

@ -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 |
| ----------------- | -------- | -------- | -------- | -------- | -------- |

View File

@ -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 |
| ----------------- | -------- | -------- | -------- | -------- | -------- |

View File

@ -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;
}

View File

@ -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;
}

View File

@ -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 <stdbool.h>
#include <stdlib.h>
#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

View File

@ -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}")

View File

@ -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

View File

@ -42,6 +42,7 @@ typedef enum {
PERIPH_MCPWM0_MODULE,
PERIPH_SYSTIMER_MODULE,
PERIPH_SARADC_MODULE,
PERIPH_TEMPSENSOR_MODULE,
PERIPH_MODULE_MAX
} periph_module_t;

View File

@ -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)

View File

@ -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

View File

@ -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