123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112 |
- /* Copyright (C) 2018 RDA Technologies Limited and/or its affiliates("RDA").
- * All rights reserved.
- *
- * This software is supplied "AS IS" without any warranties.
- * RDA assumes no responsibility or liability for the use of the software,
- * conveys no license or title under any patent, copyright, or mask work
- * right to the product. RDA reserves the right to make changes in the
- * software without notification. RDA also make no representation or
- * warranty that such application will be suitable for the specified use
- * without further testing or modification.
- */
- #ifndef _OSI_TICK_UNIT_H_
- #define _OSI_TICK_UNIT_H_
- #include "hal_chip.h" // HAL_TIMER_FREQ
- /**
- * \brief tick unit conversion with 64bits calculation
- *
- * It is implemented as a macro to be able to be used in const initializer.
- * Common divider \p cdiv is helpful to avoid intermediate overflow.
- *
- * \param t source tick
- * \param sfreq source tick frequency
- * \param dfres destination tick frequency
- * \param cdiv common divider of source and destination frequency
- * \return destination tick
- */
- #define OSI_TICK_CONVERT(t, sfreq, dfreq, cdiv) ((int64_t)__OSI_TICK_CONVERT((int64_t)(t), (unsigned)(sfreq), (unsigned)(dfreq), (unsigned)(cdiv)))
- /**
- * \brief tick unit conversion with 32bits calculation
- *
- * It is implemented as a macro to be able to be used in const initializer.
- * Common divider \p cdiv is helpful to avoid intermediate overflow. It will
- * only be used when performance is really cared.
- *
- * \param t source tick
- * \param sfreq source tick frequency
- * \param dfres destination tick frequency
- * \param cdiv common divider of source and destination frequency
- * \return destination tick
- */
- #define OSI_TICK_CONVERT_U32(t, sfreq, dfreq, cdiv) ((uint32_t)__OSI_TICK_CONVERT((uint32_t)(t), (unsigned)(sfreq), (unsigned)(dfreq), (unsigned)(cdiv)))
- /**
- * \brief various tick unit conversion with 64bits calculation
- */
- #define OSI_TICK16K_TO_MS(t) OSI_TICK_CONVERT(t, 16384, 1000, 8)
- #define OSI_MS_TO_TICK16K(t) OSI_TICK_CONVERT(t, 1000, 16384, 8)
- #define OSI_TICK16K_TO_US(t) OSI_TICK_CONVERT(t, 16384, 1000000, 64)
- #define OSI_US_TO_TICK16K(t) OSI_TICK_CONVERT(t, 1000000, 16384, 64)
- #define OSI_TICK32K_TO_MS(t) OSI_TICK_CONVERT(t, 32768, 1000, 8)
- #define OSI_MS_TO_TICK32K(t) OSI_TICK_CONVERT(t, 1000, 32768, 8)
- #define OSI_HWTICK_TO_SECOND(t) OSI_TICK_CONVERT(t, HAL_TIMER_FREQ, 1, 1)
- #define OSI_SECOND_TO_HWTICK(t) OSI_TICK_CONVERT(t, 1, HAL_TIMER_FREQ, 1)
- #define OSI_HWTICK_TO_MS(t) OSI_TICK_CONVERT(t, HAL_TIMER_FREQ, 1000, __OSI_HWTICK_CMN_DIV_MS)
- #define OSI_MS_TO_HWTICK(t) OSI_TICK_CONVERT(t, 1000, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_MS)
- #define OSI_HWTICK_TO_US(t) OSI_TICK_CONVERT(t, HAL_TIMER_FREQ, 1000000, __OSI_HWTICK_CMN_DIV_US)
- #define OSI_US_TO_HWTICK(t) OSI_TICK_CONVERT(t, 1000000, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_US)
- #define OSI_HWTICK_TO_16K(t) OSI_TICK_CONVERT(t, HAL_TIMER_FREQ, 16384, __OSI_HWTICK_CMN_DIV_16K)
- #define OSI_16K_TO_HWTICK(t) OSI_TICK_CONVERT(t, 16384, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_16K)
- #define OSI_HWTICK_TO_32K(t) OSI_TICK_CONVERT(t, HAL_TIMER_FREQ, 32768, __OSI_HWTICK_CMN_DIV_32K)
- #define OSI_32K_TO_HWTICK(t) OSI_TICK_CONVERT(t, 32768, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_32K)
- /**
- * \brief various tick unit conversion with 32bits calculation
- */
- #define OSI_TICK16K_TO_MS_U32(t) OSI_TICK_CONVERT_U32(t, 16384, 1000, 8)
- #define OSI_MS_TO_TICK16K_U32(t) OSI_TICK_CONVERT_U32(t, 1000, 16384, 8)
- #define OSI_TICK16K_TO_US_U32(t) OSI_TICK_CONVERT_U32(t, 16384, 1000000, 64)
- #define OSI_US_TO_TICK16K_U32(t) OSI_TICK_CONVERT_U32(t, 1000000, 16384, 64)
- #define OSI_TICK32K_TO_MS_U32(t) OSI_TICK_CONVERT_U32(t, 32768, 1000, 8)
- #define OSI_MS_TO_TICK32K_U32(t) OSI_TICK_CONVERT_U32(t, 1000, 32768, 8)
- #define OSI_HWTICK_TO_MS_U32(t) OSI_TICK_CONVERT_U32(t, HAL_TIMER_FREQ, 1000, __OSI_HWTICK_CMN_DIV_MS)
- #define OSI_MS_TO_HWTICK_U32(t) OSI_TICK_CONVERT_U32(t, 1000, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_MS)
- #define OSI_HWTICK_TO_US_U32(t) OSI_TICK_CONVERT_U32(t, HAL_TIMER_FREQ, 1000000, __OSI_HWTICK_CMN_DIV_US)
- #define OSI_US_TO_HWTICK_U32(t) OSI_TICK_CONVERT_U32(t, 1000000, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_US)
- #define OSI_HWTICK_TO_16K_U32(t) OSI_TICK_CONVERT_U32(t, HAL_TIMER_FREQ, 16384, __OSI_HWTICK_CMN_DIV_16K)
- #define OSI_16K_TO_HWTICK_U32(t) OSI_TICK_CONVERT_U32(t, 16384, HAL_TIMER_FREQ, __OSI_HWTICK_CMN_DIV_16K)
- // ============================================================================
- // Implementation
- // ============================================================================
- #define __OSI_TICK_CONVERT(t, sfreq, dfreq, cdiv) (((t) * ((dfreq) / (cdiv))) / ((sfreq) / (cdiv)))
- #if (HAL_TIMER_FREQ == 16384)
- #define __OSI_HWTICK_CMN_DIV_MS (8)
- #define __OSI_HWTICK_CMN_DIV_US (64)
- #define __OSI_HWTICK_CMN_DIV_16K (16384)
- #define __OSI_HWTICK_CMN_DIV_32K (16384)
- #endif
- #if (HAL_TIMER_FREQ == 2000000)
- #define __OSI_HWTICK_CMN_DIV_MS (1000)
- #define __OSI_HWTICK_CMN_DIV_US (1000000)
- #define __OSI_HWTICK_CMN_DIV_16K (128)
- #define __OSI_HWTICK_CMN_DIV_32K (128)
- #endif
- #if (HAL_TIMER_FREQ == 1000000)
- #define __OSI_HWTICK_CMN_DIV_MS (1000)
- #define __OSI_HWTICK_CMN_DIV_US (1000000)
- #define __OSI_HWTICK_CMN_DIV_16K (64)
- #define __OSI_HWTICK_CMN_DIV_32K (64)
- #endif
- #endif
|