/***************************************************************************//**
* @file
* @brief SLEEPTIMER hardware abstraction layer definition.
*******************************************************************************
* # License
* Copyright 2019 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.
*
******************************************************************************/
#ifndef SL_SLEEPTIMER_HAL_H
#define SL_SLEEPTIMER_HAL_H
#include
#include
#include
#include "em_device.h"
#include "sli_sleeptimer.h"
#ifdef __cplusplus
extern "C" {
#endif
/*******************************************************************************
* Hardware Abstraction Layer of the sleep timer init.
******************************************************************************/
void sleeptimer_hal_init_timer(void);
/*******************************************************************************
* Hardware Abstraction Layer to get the current timer count.
*
* @return Value in ticks of the timer counter.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
uint32_t sleeptimer_hal_get_counter(void);
/*******************************************************************************
* Hardware Abstraction Layer to get a timer comparator value.
*
* @return Value in ticks of the timer comparator.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
uint32_t sleeptimer_hal_get_compare(void);
/*******************************************************************************
* Hardware Abstraction Layer to set a timer comparator value.
*
* @param value Number of ticks to set.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_set_compare(uint32_t value);
/*******************************************************************************
* Hardware Abstraction Layer to set a comparator value to trigger a
* peripheral request signal to initialize.
*
* @param value Number of ticks to set.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_set_compare_prs_hfxo_startup(int32_t value);
/*******************************************************************************
* Hardware Abstraction Layer to get the timer frequency.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
uint32_t sleeptimer_hal_get_timer_frequency(void);
/*******************************************************************************
* Hardware Abstraction Layer to enable timer interrupts.
*
* @param local_flag Internal interrupt flag.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_enable_int(uint8_t local_flag);
/*******************************************************************************
* Hardware Abstraction Layer to disable timer interrupts.
*
* @param local_flag Internal interrupt flag.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_disable_int(uint8_t local_flag);
/*******************************************************************************
* Hardware Abstraction Layer to set timer interrupts.
*
* @param local_flag Internal interrupt flag.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_set_int(uint8_t local_flag);
/*******************************************************************************
* Hardware Abstraction Layer to get the sleeptimer's clock accuracy.
*
* @return Clock accuracy in PPM.
******************************************************************************/
uint16_t sleeptimer_hal_get_clock_accuracy(void);
/*******************************************************************************
* Hardware Abstraction Layer to get the capture channel value.
*
* @note Not supported by all peripherals Sleeptimer can use.
*
* @return Capture value.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
uint32_t sleeptimer_hal_get_capture(void);
/*******************************************************************************
* Hardware Abstraction Layer to reset PRS signal triggered by the associated
* peripheral.
*
* @note Not supported by all peripherals Sleeptimer can use.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_reset_prs_signal(void);
/*******************************************************************************
* Hardware Abstraction Layer to disable PRS compare and capture channel.
*
* @note Not supported by all peripherals Sleeptimer can use.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void sleeptimer_hal_disable_prs_compare_and_capture_channel(void);
/*******************************************************************************
* Process the timer interrupt.
*
* @param flags Internal interrupt flag.
******************************************************************************/
SL_CODE_CLASSIFY(SL_CODE_COMPONENT_SLEEPTIMER, SL_CODE_CLASS_TIME_CRITICAL)
void process_timer_irq(uint8_t local_flag);
/***************************************************************************//**
* @brief
* Convert prescaler divider to a logarithmic value. It only works for even
* numbers equal to 2^n.
*
* @param[in] presc
* Prescaler value used to set the frequency divider. The divider is equal to
* ('presc' + 1). If a divider value is passed for 'presc', 'presc' will be
* equal to (divider - 1).
*
* @return
* Logarithm base 2 (binary) value, i.e. exponent as used by fixed
* 2^n prescalers.
******************************************************************************/
__STATIC_INLINE uint32_t sleeptimer_hal_presc_to_log2(uint32_t presc)
{
uint32_t log2;
// Integer prescalers take argument less than 32768.
EFM_ASSERT(presc < 32768U);
// Count leading zeroes and "reverse" result. Consider divider value to get
// exponent n from 2^n, so ('presc' +1).
log2 = 31UL - __CLZ(presc + (uint32_t) 1);
// Check that prescaler is a 2^n number.
EFM_ASSERT(presc == (SL_Log2ToDiv(log2) - 1U));
return log2;
}
#ifdef __cplusplus
}
#endif
#endif /* SL_SLEEPTIMER_HAL_H */