tempdrv.c File Reference

TEMPDRV API implementation.

License

Copyright 2018 Silicon Laboratories Inc. www.silabs.com

SPDX-License-Identifier: Zlib

The licensor of this software is Silicon Laboratories Inc.

This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software.

Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions:

  1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required.
  2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  3. This notice may not be removed or altered from any source distribution.

Definition in file tempdrv.c .

#include "em_device.h"
#include " em_system.h "
#include " em_emu.h "
#include "string.h"
#include " tempdrv.h "

Data Structures

struct TEMPDRV_CallbackSet_t

Macros

#define DECREASING_TEMPERATURE_FLAG EMU_IF_TEMPHIGH
#define ERRATA_HIGH_LIMIT 80
#define ERRATA_HYSTERESIS 8
#define ERRATA_MID_LIMIT 65
#define INCREASING_TEMPERATURE_FLAG EMU_IF_TEMPLOW
#define TEMPDRV_
#define TEMPDRV_CALLBACK_DEPTH (TEMPDRV_INT_CALLBACK_DEPTH + TEMPDRV_CUSTOM_CALLBACK_DEPTH)
#define TEMPDRV_CUSTOM_CALLBACK_INDEX TEMPDRV_INT_CALLBACK_DEPTH
#define TEMPDRV_ERRATA_FIX
#define TEMPDRV_INT_CALLBACK_DEPTH 1

Typedefs

typedef enum ErrataState ErrataState_t

Enumerations

enum ErrataState {
ERRATA_LOW = 0,
ERRATA_MID = 1,
ERRATA_HIGH = 2
}

Functions

static Ecode_t addCallback ( TEMPDRV_CallbackSet_t *set, int8_t temp, TEMPDRV_Callback_t callback)
Attempt to add a callback to a set.
static void calibration (void)
Prepare calibration values for temperature conversion.
static bool checkForDuplicates ( TEMPDRV_CallbackSet_t *set, int8_t temp)
Check if another callback has registered the same temperature.
static uint32_t convertToEmu (int temp)
Convert a temperature in °C to an EMU sensor value.
static int convertToTemp (uint32_t emu)
Convert EMU value to degrees Celsius.
static void disableInterrupts (void)
Turn off and clear EMU temperature related interrupts.
void EMU_IRQHandler (void)
EMU Interrupt Handler.
static void errataCallback (int8_t temp, TEMPDRV_LimitType_t limit)
Errata Callback.
static void errataInit (void)
Errata Initialization.
static void errataStateUpdate (int8_t temp)
Errata State Update.
static int8_t findCallbackSpace ( TEMPDRV_CallbackSet_t *set)
Find an empty spot for callback in set.
static bool removeCallback ( TEMPDRV_CallbackSet_t *set, TEMPDRV_Callback_t callback)
Remove a callback from the set.
Ecode_t TEMPDRV_DeInit (void)
De-initialize the TEMP driver.
Ecode_t TEMPDRV_Enable (bool enable)
Enable or disable the TEMP driver.
uint8_t TEMPDRV_GetActiveCallbacks ( TEMPDRV_LimitType_t limit)
Get the number of active callbacks for a limit.
int8_t TEMPDRV_GetTemp (void)
Get the current temperature.
Ecode_t TEMPDRV_Init (void)
Initialize the TEMP driver.
void TEMPDRV_IRQHandler (void)
TEMPDRV Interrupt Handler.
Ecode_t TEMPDRV_RegisterCallback (int8_t temp, TEMPDRV_LimitType_t limit, TEMPDRV_Callback_t callback)
Register a callback in the TEMP driver.
Ecode_t TEMPDRV_UnregisterCallback ( TEMPDRV_Callback_t callback)
Unregister a callback in the TEMP driver.
static void updateInterrupts (void)
Update interrupts based on active callbacks.

Variables

static int calibrationEMU
static int calibrationTEMP
static TEMPDRV_CallbackSet_t errataHighTemp [3]
static TEMPDRV_CallbackSet_t errataLowTemp [3]
static uint8_t fallbackEMU = 0x90
static uint8_t fallbackTEMP = 25
static TEMPDRV_CallbackSet_t * highCallback
static TEMPDRV_CallbackSet_t * lowCallback
static TEMPDRV_CallbackSet_t nullCallback = { NULL, 0 }
static bool TEMPDRV_EnableState = false
static bool TEMPDRV_InitState = false
static TEMPDRV_CallbackSet_t tempdrvHighCallbacks [TEMPDRV_CALLBACK_DEPTH]
static TEMPDRV_CallbackSet_t tempdrvLowCallbacks [TEMPDRV_CALLBACK_DEPTH]

Enumeration Type Documentation

Enumerator
ERRATA_LOW

Low temperature <65°C.

ERRATA_MID

Medium temperature >65°C and <80°C.

ERRATA_HIGH

High temperature >80°C.

Definition at line 143 of file tempdrv.c .

Function Documentation

static Ecode_t addCallback ( TEMPDRV_CallbackSet_t * set,
int8_t temp,
TEMPDRV_Callback_t callback
)
static

Attempt to add a callback to a set.

Parameters
[in] set Callback set to add callback to
[in] temp Temperature to register callback at
[in] callback Callback function
Returns

Definition at line 306 of file tempdrv.c .

References TEMPDRV_CallbackSet_t::callback , convertToEmu() , ECODE_EMDRV_TEMPDRV_NO_SPACE , ECODE_EMDRV_TEMPDRV_OK , findCallbackSpace() , TEMPDRV_CallbackSet_t::temp , and updateInterrupts() .

Referenced by TEMPDRV_RegisterCallback() .

static bool checkForDuplicates ( TEMPDRV_CallbackSet_t * set,
int8_t temp
)
static

Check if another callback has registered the same temperature.

Parameters
[in] set Callback set to search
[in] temp Temperature to match
Returns
true if a duplicate is found, false if no duplicates is found.

Definition at line 362 of file tempdrv.c .

References convertToEmu() .

Referenced by TEMPDRV_RegisterCallback() .

static uint32_t convertToEmu ( int temp )
static

Convert a temperature in °C to an EMU sensor value.

Parameters
[in] temp Temperature to convert in degrees Celsius
Returns
EMU temperature sensor value that represents the given temperature

Definition at line 416 of file tempdrv.c .

Referenced by addCallback() , checkForDuplicates() , and errataInit() .

static int convertToTemp ( uint32_t emu )
static

Convert EMU value to degrees Celsius.

Parameters
[in] emu EMU value to convert
Returns
temperature in degrees Celsius

Definition at line 389 of file tempdrv.c .

Referenced by TEMPDRV_GetTemp() .

static void errataCallback ( int8_t temp,
TEMPDRV_LimitType_t limit
)
static

Errata Callback.

This function is called by the TEMPDRV_IRQHandler and will change the state depending on the current temperature.

Definition at line 168 of file tempdrv.c .

References errataStateUpdate() .

Referenced by errataInit() .

static void errataInit ( void )
static

Errata Initialization.

Initialize the temperature thresholds based on calibration values and initializes the errata fix based on the current temperature.

Definition at line 228 of file tempdrv.c .

References TEMPDRV_CallbackSet_t::callback , convertToEmu() , ERRATA_HIGH , ERRATA_LOW , ERRATA_MID , errataCallback() , errataStateUpdate() , SYSTEM_ChipRevision_TypeDef::major , SYSTEM_ChipRevisionGet() , TEMPDRV_CallbackSet_t::temp , and TEMPDRV_GetTemp() .

Referenced by TEMPDRV_Init() .

static void errataStateUpdate ( int8_t temp )
static

Errata State Update.

Updates registers based on the current temperature

Definition at line 181 of file tempdrv.c .

References EMU_SetBiasMode() , ERRATA_HIGH , ERRATA_LOW , and ERRATA_MID .

Referenced by errataCallback() , and errataInit() .

static int8_t findCallbackSpace ( TEMPDRV_CallbackSet_t * set )
static

Find an empty spot for callback in set.

Parameters
[in] set Callback set to search
Returns
index of empty space if found, -1 if none

Definition at line 276 of file tempdrv.c .

Referenced by addCallback() .

static bool removeCallback ( TEMPDRV_CallbackSet_t * set,
TEMPDRV_Callback_t callback
)
static

Remove a callback from the set.

Parameters
[in] set Callback set to remove callback from
[in] callback Callback function
Returns
true on success and false if the callback was not found.

Definition at line 333 of file tempdrv.c .

References TEMPDRV_CallbackSet_t::callback , TEMPDRV_CallbackSet_t::temp , and updateInterrupts() .

Referenced by TEMPDRV_UnregisterCallback() .

static void updateInterrupts ( void )
static

Update interrupts based on active callbacks.

There can only be two temperature thresholds active in the EMU sensor at a single point in time. One threshold for increasing temperature and one threshold for decreasing temperature. The responsibility of this function is to always select which temperature thresholds that should be activated in the EMU sensor at any given time.

Definition at line 453 of file tempdrv.c .

References TEMPDRV_CallbackSet_t::callback , EMU_IntDisable() , EMU_IntEnable() , and TEMPDRV_CallbackSet_t::temp .

Referenced by addCallback() , removeCallback() , TEMPDRV_Enable() , TEMPDRV_Init() , and TEMPDRV_IRQHandler() .