1 /*
2 * Copyright (c) 2016, Freescale Semiconductor, Inc.
3 * Copyright 2016-2019 NXP
4 * All rights reserved.
5 *
6 * SPDX-License-Identifier: BSD-3-Clause
7 */
8 #ifndef FSL_FMEAS_H_
9 #define FSL_FMEAS_H_
10
11 #include "fsl_common.h"
12
13 /*!
14 * @addtogroup fmeas
15 * @{
16 */
17
18 /*! @file */
19
20 /*******************************************************************************
21 * Definitions
22 *******************************************************************************/
23
24 /*! @name Driver version */
25 /*! @{ */
26 /*! @brief Defines LPC Frequency Measure driver version 2.1.1. */
27 #define FSL_FMEAS_DRIVER_VERSION (MAKE_VERSION(2, 1, 1))
28 /*! @} */
29
30 #if defined(FSL_FEATURE_FMEAS_INDEX_20) && (FSL_FEATURE_FMEAS_INDEX_20)
31 /*! The calibration duration is 2^FMEAS_INDEX times the reference clock period */
32 #define FMEAS_INDEX 20
33 #endif /*FSL_FEATURE_FMEAS_INDEX_20*/
34
35 #if defined(FSL_FEATURE_FMEAS_ASYNC_SYSCON_FREQMECTRL) && (FSL_FEATURE_FMEAS_ASYNC_SYSCON_FREQMECTRL)
36 #define FMEAS_SYSCON_FREQMECTRL_CAPVAL_MASK ASYNC_SYSCON_FREQMECTRL_CAPVAL_MASK
37 #define FMEAS_SYSCON_FREQMECTRL_CAPVAL_SHIFT ASYNC_SYSCON_FREQMECTRL_CAPVAL_SHIFT
38 #define FMEAS_SYSCON_FREQMECTRL_CAPVAL ASYNC_SYSCON_FREQMECTRL_CAPVAL
39 #define FMEAS_SYSCON_FREQMECTRL_PROG_MASK ASYNC_SYSCON_FREQMECTRL_PROG_MASK
40 #define FMEAS_SYSCON_FREQMECTRL_PROG_SHIFT ASYNC_SYSCON_FREQMECTRL_PROG_SHIFT
41 #define FMEAS_SYSCON_FREQMECTRL_PROG ASYNC_SYSCON_FREQMECTRL_PROG
42 #else
43 #define FMEAS_SYSCON_FREQMECTRL_CAPVAL_MASK SYSCON_FREQMECTRL_CAPVAL_MASK
44 #define FMEAS_SYSCON_FREQMECTRL_CAPVAL_SHIFT SYSCON_FREQMECTRL_CAPVAL_SHIFT
45 #define FMEAS_SYSCON_FREQMECTRL_CAPVAL SYSCON_FREQMECTRL_CAPVAL
46 #define FMEAS_SYSCON_FREQMECTRL_PROG_MASK SYSCON_FREQMECTRL_PROG_MASK
47 #define FMEAS_SYSCON_FREQMECTRL_PROG_SHIFT SYSCON_FREQMECTRL_PROG_SHIFT
48 #define FMEAS_SYSCON_FREQMECTRL_PROG SYSCON_FREQMECTRL_PROG
49 #endif /*FSL_FEATURE_FMEAS_ASYNC_SYSCON_FREQMECTRL*/
50
51 /*******************************************************************************
52 * Types
53 *******************************************************************************/
54
55 #if defined(FSL_FEATURE_FMEAS_USE_ASYNC_SYSCON) && (FSL_FEATURE_FMEAS_USE_ASYNC_SYSCON)
56 typedef ASYNC_SYSCON_Type FMEAS_SYSCON_Type;
57 #elif defined(FSL_FEATURE_SOC_FREQME_COUNT) && (FSL_FEATURE_SOC_FREQME_COUNT)
58 typedef FREQME_Type FMEAS_SYSCON_Type;
59 #else
60 typedef SYSCON_Type FMEAS_SYSCON_Type;
61 #endif
62
63 /*******************************************************************************
64 * Definitions
65 *******************************************************************************/
66
67 /*******************************************************************************
68 * API
69 *******************************************************************************/
70
71 #if defined(__cplusplus)
72 extern "C" {
73 #endif /* __cplusplus */
74
75 /*!
76 * @name FMEAS Functional Operation
77 * @{
78 */
79
80 /*!
81 * @brief Starts a frequency measurement cycle.
82 *
83 * @param base : SYSCON peripheral base address.
84 */
FMEAS_StartMeasure(FMEAS_SYSCON_Type * base)85 static inline void FMEAS_StartMeasure(FMEAS_SYSCON_Type *base)
86 {
87 #if defined(FSL_FEATURE_SOC_FREQME_COUNT) && (FSL_FEATURE_SOC_FREQME_COUNT)
88 base->FREQMECTRL_W = 0;
89 /*! Set the reference clock count cycle to 2^20 times*/
90 base->FREQMECTRL_W = FREQME_FREQMECTRL_W_MEASURE_IN_PROGRESS_MASK | FREQME_FREQMECTRL_W_REF_SCALE(20);
91 #else
92 base->FREQMECTRL = 0;
93 #if defined(SYSCON_CLOCK_CTRL_FRO1MHZ_FREQM_ENA_MASK)
94 /* Un-gate FRO1M to FMEAS if used as reference or target clock */
95 if ((((INPUTMUX->FREQMEAS_REF & INPUTMUX_FREQMEAS_REF_CLKIN_MASK) >> INPUTMUX_FREQMEAS_REF_CLKIN_SHIFT) ==
96 kCLOCK_fmeasFRO1Mhz) ||
97 (((INPUTMUX->FREQMEAS_TARGET & INPUTMUX_FREQMEAS_TARGET_CLKIN_MASK) >> INPUTMUX_FREQMEAS_TARGET_CLKIN_SHIFT) ==
98 kCLOCK_fmeasFRO1Mhz))
99 {
100 SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_FRO1MHZ_FREQM_ENA_MASK;
101 }
102 #endif /*SYSCON_CLOCK_CTRL_FRO1MHZ_FREQM_ENA_MASK*/
103
104 #if defined(SYSCON_CLOCK_CTRL_XTAL32MHZ_FREQM_ENA_MASK)
105 /* Un-gate XTAL32M to FMEAS if used as reference or target clock */
106 if ((((INPUTMUX->FREQMEAS_REF & INPUTMUX_FREQMEAS_REF_CLKIN_MASK) >> INPUTMUX_FREQMEAS_REF_CLKIN_SHIFT) ==
107 kCLOCK_fmeasXtal32Mhz) ||
108 (((INPUTMUX->FREQMEAS_TARGET & INPUTMUX_FREQMEAS_TARGET_CLKIN_MASK) >> INPUTMUX_FREQMEAS_TARGET_CLKIN_SHIFT) ==
109 kCLOCK_fmeasXtal32Mhz))
110 {
111 SYSCON->CLOCK_CTRL |= SYSCON_CLOCK_CTRL_XTAL32MHZ_FREQM_ENA_MASK;
112 }
113 #endif
114
115 #if defined(FMEAS_INDEX)
116 base->FREQMECTRL = FMEAS_INDEX | FMEAS_SYSCON_FREQMECTRL_PROG_MASK;
117 #else
118 base->FREQMECTRL = (1UL << 31);
119 #endif
120 #endif
121 }
122
123 /*!
124 * @brief Indicates when a frequency measurement cycle is complete.
125 *
126 * @param base : SYSCON peripheral base address.
127 * @return true if a measurement cycle is active, otherwise false.
128 */
FMEAS_IsMeasureComplete(FMEAS_SYSCON_Type * base)129 static inline bool FMEAS_IsMeasureComplete(FMEAS_SYSCON_Type *base)
130 {
131 #if defined(FSL_FEATURE_SOC_FREQME_COUNT) && (FSL_FEATURE_SOC_FREQME_COUNT)
132 return (bool)((base->FREQMECTRL_R & FREQME_FREQMECTRL_R_MEASURE_IN_PROGRESS_MASK) == 0U);
133 #else
134 return (bool)((base->FREQMECTRL & (1UL << 31)) == 0U);
135 #endif
136 }
137
138 /*!
139 * @brief Returns the computed value for a frequency measurement cycle
140 *
141 * @param base : SYSCON peripheral base address.
142 * @param refClockRate : Reference clock rate used during the frequency measurement cycle.
143 *
144 * @return Frequency in Hz.
145 */
146 uint32_t FMEAS_GetFrequency(FMEAS_SYSCON_Type *base, uint32_t refClockRate);
147
148 #if defined(FSL_FEATURE_FMEAS_GET_COUNT_SCALE) && (FSL_FEATURE_FMEAS_GET_COUNT_SCALE)
149 /*!
150 * @brief Get the clock count during the measurement time
151 *
152 * @param base : SYSCON peripheral base address.
153 * @param scale : measurement time is 2^scale cycle of reference clock, value is from 2 to 31.
154 * @param refClockCount : Reference clock cycle during the measurement time.
155 * @param targetClockCount : Target clock cycle during the measurement time.
156 *
157 */
158 void FMEAS_GetCountWithScale(FMEAS_SYSCON_Type *base,
159 uint8_t scale,
160 uint32_t *refClockCount,
161 uint32_t *targetClockCount);
162 #endif
163
164 /*! @} */
165
166 #if defined(__cplusplus)
167 }
168 #endif /* __cplusplus */
169
170 /*! @}*/
171
172 #endif /* FSL_FMEAS_H_ */
173