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