1
0
mirror of https://github.com/RIOT-OS/RIOT.git synced 2024-12-29 04:50:03 +01:00
RIOT/sys/include/ztimer/convert.h
2022-11-22 00:25:34 +01:00

98 lines
2.8 KiB
C

/*
* Copyright (C) 2019 Kaspar Schleiser <kaspar@schleiser.de>
*
* This file is subject to the terms and conditions of the GNU Lesser General
* Public License v2.1. See the file LICENSE in the top level directory for more
* details.
*/
/**
* @defgroup sys_ztimer_convert ztimer frequency conversion modules
* @ingroup sys_ztimer
* @brief ztimer frequency conversion modules
*
* ztimer provides multiple conversion modules:
*
* - ztimer_convert_shift: should be used if the fraction is a power of two.
*
* - ztimer_convert_frac: should be used if the fraction is not a power of two.
* rounding might be a bit off for some fractions.
*
* - ztimer_convert_muldiv64: can be used instead of ztimer_convert_frac,
* if 64bit division is cheap on the target board.
*
* @{
* @file
* @brief ztimer frequency conversion base module
* @author Kaspar Schleiser <kaspar@schleiser.de>
*/
#ifndef ZTIMER_CONVERT_H
#define ZTIMER_CONVERT_H
#include "ztimer.h"
#ifdef __cplusplus
extern "C" {
#endif
/**
* @brief base type for ztimer convert modules
*
* This type is supposed to be extended. It provides common fields for a ztimer
* clock that has a parent clock.
* */
typedef struct {
ztimer_clock_t super; /**< ztimer_clock super class */
ztimer_clock_t *lower; /**< lower clock device */
ztimer_t lower_entry; /**< timer entry in parent clock */
} ztimer_convert_t;
/**
* @brief Initialization function for ztimer_convert_t
*
* @p max_value needs to be set to the maximum value that can be converted
* without overflowing. E.g., if the conversion module slows down a lower
* clock by factor X, max_value needs to be set to UINT32_MAX / X.
*
* @param[in,out] ztimer_convert object to initialize
* @param[in] lower lower ztimer clock
* @param[in] max_value maximum value for this clock's set()
*/
void ztimer_convert_init(ztimer_convert_t *ztimer_convert,
ztimer_clock_t *lower, uint32_t max_value);
/**
* @brief ztimer_convert common cancel() op
*
* Used by some conversion modules as ztimer_clock_t::ops.cancel().
*
* @param[in] clock ztimer clock to operate on
*/
void ztimer_convert_cancel(ztimer_clock_t *clock);
/**
* @brief ztimer_convert common start() op
*
* Used by some conversion modules as ztimer_clock_t::ops.start().
*
* @param[in] clock ztimer clock to operate on
*/
void ztimer_convert_start(ztimer_clock_t *clock);
/**
* @brief ztimer_convert common stop() op
*
* Used by some conversion modules as ztimer_clock_t::ops.stop().
*
* @param[in] clock ztimer clock to operate on
*/
void ztimer_convert_stop(ztimer_clock_t *clock);
#ifdef __cplusplus
}
#endif
#endif /* ZTIMER_CONVERT_H */
/** @} */