243 lines
6.5 KiB
C
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_ */
|