Files
2026-01-09 16:48:24 +08:00

243 lines
6.5 KiB
C

/**
* @file sdrv_pvt.h
* @brief SemiDrive Temperature sensor driver header file.
*
* @copyright Copyright (c) 2022 Semidrive Semiconductor.
* All rights reserved.
*/
#ifndef SDRV_PVT_H_
#define SDRV_PVT_H_
#include <sdrv_common.h>
#include <types.h>
/* Don't use edge alarm due to limitations of hysterisis function. */
#define SDRV_PVT_USE_EDGE_ALARM 0
/* Temperature threshold range */
#if CONFIG_PVT_TYPE_INT
#define PVT_TEMPERATURE_MIN (-75) /* dout_to_celsius(0x0) */
#define PVT_TEMPERATURE_MAX (230) /* dout_to_celsius(0xfff) */
#else
#define PVT_TEMPERATURE_MIN (-75.9f) /* dout_to_celsius(0x0) */
#define PVT_TEMPERATURE_MAX (230.7f) /* dout_to_celsius(0xfff) */
#endif
#if CONFIG_PVT_TYPE_INT
typedef int32_t sdrv_pvt_type;
#else
typedef float sdrv_pvt_type;
#endif
/**
* @brief PVT core logics.
*
* The sensor has 2 cores, both of which have identical logics, but
* different interrupt numbers.
*/
typedef enum sdrv_pvt_core_id {
PVT_CORE0 = 0u,
PVT_CORE1 = 1u,
PVT_CORE_NR,
} sdrv_pvt_core_id_e;
/**
* @brief Temperature sensor alarm modes.
*
* @note Do not change the order of this structure.
*/
typedef enum sdrv_pvt_alarm {
/**< Alarm asserted when DOUT is above HYST_H thresholds. */
PVT_HIGH_LEVEL_ALARM = 0,
/**< Alarm asserted when DOUT is below HYST_L thresholds. */
PVT_LOW_LEVEL_ALARM,
#if SDRV_PVT_USE_EDGE_ALARM
/**< Alarm asserted when sensored value is rising above HYST_R. */
PVT_RISING_EDGE_ALARM,
/**< Alarm asserted when sensored value is falling below HYST_L. */
PVT_FALLING_EDGE_ALARM,
#endif
PVT_ALARM_NR,
} sdrv_pvt_alarm_e;
/**
* @brief Level alarm configuration.
*
* Temperature alarm thresholds, between PVT_TEMPERATURE_MIN and
* PVT_TEMPERATURE_MAX.
*/
typedef struct sdrv_pvt_level_alarm_config {
/**< Low threashold temperature. */
sdrv_pvt_type thresh_low;
/**< High threashold temperature. */
sdrv_pvt_type thresh_high;
} sdrv_pvt_level_alarm_config_t;
#if SDRV_PVT_USE_EDGE_ALARM
/**
* @brief Edge alarm configuration.
*
* Temperature alarm thresholds, between PVT_TEMPERATURE_MIN and
* PVT_TEMPERATURE_MAX.
*/
typedef struct sdrv_pvt_edge_alarm_config {
/**< Hysterisis temperature. In HYST_R rising edge detection mode,
* the sensor start monitoring edge alarm status when DOUT[11:0]
* is above hyst. In HYST_L falling edge detection mode, the
* sensor start monitoring edge alarm status when DOUT[11:0]
* is below hyst.
*/
sdrv_pvt_type hyst;
/**< Alarm temperature. Edge alarm status is asserted when
* DOUT[11:0] is above or below alarm, depending on rising
* or falling alarm mode.
*/
sdrv_pvt_type alarm;
} sdrv_pvt_edge_alarm_config_t;
#endif
/**
* @brief Hysterisis alarm configuration.
*/
typedef union sdrv_pvt_alarm_config {
sdrv_pvt_level_alarm_config_t level_alarm;
#if SDRV_PVT_USE_EDGE_ALARM
sdrv_pvt_edge_alarm_config_t edge_alarm;
#endif
} sdrv_pvt_alarm_config_t;
struct sdrv_pvt;
/**
* @brief Temperature alarm callback.
*/
typedef void (*sdrv_pvt_alarm_cb_t)(struct sdrv_pvt *dev,
sdrv_pvt_core_id_e core,
sdrv_pvt_alarm_e alarm, void *arg);
/**
* @brief PVT core logic structure.
*
* The controller has 2 cores, which have unique interrupt number
* and configuration registers.
*/
typedef struct sdrv_pvt_core {
/**< Interrupt number of the core. */
uint32_t irq;
/**< Interrupt callback. */
sdrv_pvt_alarm_cb_t alarm_cb;
/**< Interrupt callback arg. */
void *cb_arg;
/**< Bit mask of enabled alarms of this core, using sdrv_pvt_alarm_e
* as bit shift. */
uint32_t alarm_enable_mask;
} sdrv_pvt_core_t;
/**
* @brief Process and temperature sensor structure.
*/
typedef struct sdrv_pvt {
/**< PVT controller base address. */
paddr_t base;
/**< Core logics. */
sdrv_pvt_core_t core[PVT_CORE_NR];
} sdrv_pvt_t;
/**
* @brief PVT error code.
*/
enum sdrv_pvt_error {
SDRV_PVT_INVALID_PARAM = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_PVT, 0),
SDRV_PVT_NOT_STARTED = SDRV_ERROR_STATUS(SDRV_STATUS_GROUP_PVT, 1),
};
/**
* @brief Initialize the PVT device.
*
* @param [in] dev PVT sensor device.
*/
status_t sdrv_pvt_init(sdrv_pvt_t *dev);
/**
* @brief De-initialize the PVT device.
*
* @param [in] dev PVT sensor device.
*/
status_t sdrv_pvt_deinit(sdrv_pvt_t *dev);
/**
* @brief Start temperature sensor.
*
* After this function is called, the sensor automatically update temperature
* value every 280ms.
*
* @param [in] dev PVT sensor device.
*/
status_t sdrv_pvt_start(sdrv_pvt_t *dev);
/**
* @brief Stop temperature sensor.
*
* @param [in] dev PVT sensor device.
*/
status_t sdrv_pvt_stop(sdrv_pvt_t *dev);
/**
* @brief Power down T-sensor and P-sensor.
*
* @param [in] dev PVT sensor device.
*/
status_t sdrv_pvt_power_down(sdrv_pvt_t *dev);
/**
* @brief Read temperature sensor value.
*
* @note Temperature value is not ready until 280ms after sdrv_pvt_start()
* is called.
*
* @param [in] dev PVT sensor device.
* @param [out] temperature Junction temperature value.
*/
status_t sdrv_pvt_get(sdrv_pvt_t *dev, sdrv_pvt_type *temperature);
/**
* @brief Register temperature alarm callback.
*
* @param [in] dev Sensor device.
* @param [in] core Sensor core.
* @param [in] alarm_cb Temperature alarm callback function.
*/
status_t sdrv_pvt_register_alarm_cb(sdrv_pvt_t *dev, sdrv_pvt_core_id_e core,
sdrv_pvt_alarm_cb_t alarm_cb, void *arg);
/**
* @brief Enable Temperature sensor alarm.
*
* This function enables temperature sensor alarms.
*
* @note When high level alarm is enabled and triggered in Safety PVT
* sensor Core 0, internal power-down/reset request is sent from Safety
* PVT to PMU by default.
*
* @param [in] dev Temperature sensor device.
* @param [in] core Temperature sensor core.
* @param [in] alarm The alarm to enable.
* @param [in] config Alarm configurations.
*/
status_t sdrv_pvt_enable_alarm(sdrv_pvt_t *dev, sdrv_pvt_core_id_e core,
sdrv_pvt_alarm_e alarm,
const sdrv_pvt_alarm_config_t *config);
/**
* @brief Disable Temperature sensor alarm.
*
* @param [in] dev Temperature sensor device.
* @param [in] core Temperature sensor core.
* @param [in] alarm The alarm to disable.
*/
status_t sdrv_pvt_disable_alarm(sdrv_pvt_t *dev, sdrv_pvt_core_id_e core,
sdrv_pvt_alarm_e alarm);
#endif /* SDRV_PVT_H_ */