1 /*
2  * Copyright 2017-2021, 2023 NXP
3  * All rights reserved.
4  *
5  * SPDX-License-Identifier: BSD-3-Clause
6  */
7 
8 #ifndef _FSL_CLOCK_H_
9 #define _FSL_CLOCK_H_
10 
11 #include "fsl_common.h"
12 
13 /*! @addtogroup clock */
14 /*! @{ */
15 
16 /*! @file */
17 
18 /*******************************************************************************
19  * Definitions
20  *****************************************************************************/
21 
22 /*! @name Driver version */
23 /*@{*/
24 /*! @brief CLOCK driver version 2.3.4. */
25 #define FSL_CLOCK_DRIVER_VERSION (MAKE_VERSION(2, 3, 4))
26 /*@}*/
27 
28 /* Definition for delay API in clock driver, users can redefine it to the real application. */
29 #ifndef SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY
30 #define SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY (15000000UL)
31 #endif
32 
33 /*! @brief watchdog oscilltor clock frequency.
34  *
35  * This variable is used to store the watchdog oscillator frequency which is
36  * set by CLOCK_InitWdtOsc, and it is returned by CLOCK_GetWdtOscFreq.
37  */
38 extern volatile uint32_t g_Wdt_Osc_Freq;
39 
40 /*! @brief external clock frequency.
41  *
42  * This variable is used to store the external clock frequency which is include
43  * external oscillator clock and external clk in clock frequency value, it is
44  * set by CLOCK_InitExtClkin when CLK IN is used as external clock or by CLOCK_InitSysOsc
45  * when external oscillator is used as external clock ,and it is returned by
46  * CLOCK_GetExtClkFreq.
47  */
48 extern volatile uint32_t g_Ext_Clk_Freq;
49 
50 /*! @brief FRO clock setting API address in ROM. */
51 #define CLOCK_FRO_SETTING_API_ROM_ADDRESS (0x0F001CD3U)
52 /*! @brief FAIM base address*/
53 #define CLOCK_FAIM_BASE (0x50010000U)
54 
55 /*! @brief Clock ip name array for ADC. */
56 #define ADC_CLOCKS  \
57     {               \
58         kCLOCK_Adc, \
59     }
60 /*! @brief Clock ip name array for ACMP. */
61 #define ACMP_CLOCKS  \
62     {                \
63         kCLOCK_Acmp, \
64     }
65 /*! @brief Clock ip name array for DAC. */
66 #define DAC_CLOCKS                \
67     {                             \
68         kCLOCK_Dac0, kCLOCK_Dac1, \
69     }
70 /*! @brief Clock ip name array for SWM. */
71 #define SWM_CLOCKS  \
72     {               \
73         kCLOCK_Swm, \
74     }
75 /*! @brief Clock ip name array for ROM. */
76 #define ROM_CLOCKS  \
77     {               \
78         kCLOCK_Rom, \
79     }
80 /*! @brief Clock ip name array for SRAM. */
81 #define SRAM_CLOCKS    \
82     {                  \
83         kCLOCK_Ram0_1, \
84     }
85 /*! @brief Clock ip name array for IOCON. */
86 #define IOCON_CLOCKS  \
87     {                 \
88         kCLOCK_Iocon, \
89     }
90 /*! @brief Clock ip name array for GPIO. */
91 #define GPIO_CLOCKS   \
92     {                 \
93         kCLOCK_Gpio0, \
94     }
95 /*! @brief Clock ip name array for GPIO_INT. */
96 #define GPIO_INT_CLOCKS \
97     {                   \
98         kCLOCK_GpioInt, \
99     }
100 /*! @brief Clock ip name array for DMA. */
101 #define DMA_CLOCKS  \
102     {               \
103         kCLOCK_Dma, \
104     }
105 /*! @brief Clock ip name array for CRC. */
106 #define CRC_CLOCKS  \
107     {               \
108         kCLOCK_Crc, \
109     }
110 /*! @brief Clock ip name array for WWDT. */
111 #define WWDT_CLOCKS  \
112     {                \
113         kCLOCK_Wwdt, \
114     }
115 /*! @brief Clock ip name array for SCT0. */
116 #define SCT_CLOCKS  \
117     {               \
118         kCLOCK_Sct, \
119     }
120 /*! @brief Clock ip name array for I2C. */
121 #define I2C_CLOCKS   \
122     {                \
123         kCLOCK_I2c0, \
124     }
125 /*! @brief Clock ip name array for I2C. */
126 #define USART_CLOCKS                \
127     {                               \
128         kCLOCK_Uart0, kCLOCK_Uart1, \
129     }
130 /*! @brief Clock ip name array for SPI. */
131 #define SPI_CLOCKS   \
132     {                \
133         kCLOCK_Spi0, \
134     }
135 /*! @brief Clock ip name array for CAPT. */
136 #define CAPT_CLOCKS  \
137     {                \
138         kCLOCK_Capt, \
139     }
140 /*! @brief Clock ip name array for CTIMER. */
141 #define CTIMER_CLOCKS   \
142     {                   \
143         kCLOCK_Ctimer0, \
144     }
145 /*! @brief Clock ip name array for MTB. */
146 #define MTB_CLOCKS  \
147     {               \
148         kCLOCK_Mtb, \
149     }
150 /*! @brief Clock ip name array for MRT. */
151 #define MRT_CLOCKS  \
152     {               \
153         kCLOCK_Mrt, \
154     }
155 /*! @brief Clock ip name array for WKT. */
156 #define WKT_CLOCKS  \
157     {               \
158         kCLOCK_Wkt, \
159     }
160 
161 /*! @brief Internal used Clock definition only. */
162 #define CLK_GATE_DEFINE(reg, bit)  ((((reg)&0xFFU) << 8U) | ((bit)&0xFFU))
163 #define CLK_GATE_GET_REG(x)        (((x) >> 8U) & 0xFFU)
164 #define CLK_GATE_GET_BITS_SHIFT(x) ((uint32_t)(x)&0xFFU)
165 /* clock mux register definition */
166 #define CLK_MUX_DEFINE(reg, mux)             (((offsetof(SYSCON_Type, reg) & 0xFFU) << 8U) | ((mux)&0xFFU))
167 #define CLK_MUX_GET_REG(x)                   ((volatile uint32_t *)(((uint32_t)(SYSCON)) + (((uint32_t)(x) >> 8U) & 0xFFU)))
168 #define CLK_MUX_GET_MUX(x)                   (((uint32_t)x) & 0xFFU)
169 #define CLK_MAIN_CLK_MUX_DEFINE(preMux, mux) ((preMux) << 8U | (mux))
170 #define CLK_MAIN_CLK_MUX_GET_PRE_MUX(x)      ((((uint32_t)(x)) >> 8U) & 0xFFU)
171 #define CLK_MAIN_CLK_MUX_GET_MUX(x)          (((uint32_t)(x)) & 0xFFU)
172 /* clock divider register definition */
173 #define CLK_DIV_DEFINE(reg) (((uint32_t)offsetof(SYSCON_Type, reg)) & 0xFFFU)
174 
175 #define CLK_DIV_GET_REG(x) *((volatile uint32_t *)(((uint32_t)(SYSCON)) + (((uint32_t)(x)) & 0xFFFU)))
176 /* watch dog oscillator definition */
177 #define CLK_WDT_OSC_DEFINE(freq, regValue) (((freq)&0xFFFFFFU) | (((regValue)&0xFFU) << 24U))
178 #define CLK_WDT_OSC_GET_FREQ(x)            ((x)&0xFFFFFFU)
179 #define CLK_WDT_OSC_GET_REG(x)             (((x) >> 24U) & 0xFFU)
180 /* Fractional clock register map */
181 #define CLK_FRG_DIV_REG_MAP(base) (*(base))
182 #define CLK_FRG_MUL_REG_MAP(base) (*((uint32_t *)((uint32_t)(base) + 4U)))
183 #define CLK_FRG_SEL_REG_MAP(base) (*((uint32_t *)((uint32_t)(base) + 8U)))
184 /* register offset */
185 #define SYS_AHB_CLK_CTRL0 (0U)
186 /*! @brief Clock gate name used for CLOCK_EnableClock/CLOCK_DisableClock. */
187 typedef enum _clock_ip_name
188 {
189     kCLOCK_IpInvalid = 0U,                                     /*!< Invalid Ip Name. */
190     kCLOCK_Rom       = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 1U), /*!< Clock gate name: Rom. */
191 
192     kCLOCK_Ram0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 2U), /*!< Clock gate name: Ram0. */
193 
194     kCLOCK_Flash = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 4U), /*!< Clock gate name: Flash. */
195 
196     kCLOCK_I2c0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 5U), /*!< Clock gate name: I2c0. */
197 
198     kCLOCK_Gpio0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 6U), /*!< Clock gate name: Gpio0. */
199 
200     kCLOCK_Swm = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 7U), /*!< Clock gate name: Swm. */
201 
202     kCLOCK_Wkt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 9U), /*!< Clock gate name: Wkt. */
203 
204     kCLOCK_Mrt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 10U), /*!< Clock gate name: Mrt. */
205 
206     kCLOCK_Spi0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 11U), /*!< Clock gate name: Spi0. */
207 
208     kCLOCK_Crc = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 13U), /*!< Clock gate name: Crc. */
209 
210     kCLOCK_Uart0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 14U), /*!< Clock gate name: Uart0. */
211 
212     kCLOCK_Uart1 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 15U), /*!< Clock gate name: Uart1. */
213 
214     kCLOCK_Wwdt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 17U), /*!< Clock gate name: Wwdt. */
215 
216     kCLOCK_Iocon = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 18U), /*!< Clock gate name: Iocon. */
217 
218     kCLOCK_Acmp = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 19U), /*!< Clock gate name: Acmp. */
219 
220     kCLOCK_Adc = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 24U), /*!< Clock gate name: Adc. */
221 
222     kCLOCK_Ctimer0 = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 25U), /*!< Clock gate name: Ctimer0. */
223 
224     kCLOCK_GpioInt = CLK_GATE_DEFINE(SYS_AHB_CLK_CTRL0, 28U), /*!< Clock gate name: GpioInt. */
225 
226 } clock_ip_name_t;
227 
228 /*! @brief Clock name used to get clock frequency. */
229 typedef enum _clock_name
230 {
231     kCLOCK_CoreSysClk, /*!< Cpu/AHB/AHB matrix/Memories,etc */
232     kCLOCK_MainClk,    /*!< Main clock */
233 
234     kCLOCK_Fro,    /*!< FRO18/24/30 */
235     kCLOCK_FroDiv, /*!< FRO div clock */
236     kCLOCK_ExtClk, /*!< External Clock */
237     kCLOCK_LPOsc,  /*!< Low power Oscillator */
238     kCLOCK_Frg,    /*!< fractional rate0 */
239 } clock_name_t;
240 
241 /*! @brief Clock Mux Switches
242  *CLK_MUX_DEFINE(reg, mux)
243  *reg is used to define the mux register
244  *mux is used to define the mux value
245  *
246  */
247 typedef enum _clock_select
248 {
249 
250     kADC_Clk_From_Fro = CLK_MUX_DEFINE(ADCCLKSEL, 0U), /*!< Mux ADC_Clk from Fro. */
251 
252     kADC_Clk_From_ClkIn = CLK_MUX_DEFINE(ADCCLKSEL, 1U), /*!< Mux ADC_Clk from ClkIn. */
253 
254     kUART0_Clk_From_Fro = CLK_MUX_DEFINE(UART0CLKSEL, 0U), /*!< Mux UART0_Clk from Fro. */
255 
256     kUART0_Clk_From_MainClk = CLK_MUX_DEFINE(UART0CLKSEL, 1U), /*!< Mux UART0_Clk from MainClk. */
257 
258     kUART0_Clk_From_Frg0Clk = CLK_MUX_DEFINE(UART0CLKSEL, 2U), /*!< Mux UART0_Clk from Frg0Clk. */
259 
260     kUART0_Clk_From_Fro_Div = CLK_MUX_DEFINE(UART0CLKSEL, 4U), /*!< Mux UART0_Clk from Fro_Div. */
261 
262     kUART1_Clk_From_Fro = CLK_MUX_DEFINE(UART1CLKSEL, 0U), /*!< Mux UART1_Clk from Fro. */
263 
264     kUART1_Clk_From_MainClk = CLK_MUX_DEFINE(UART1CLKSEL, 1U), /*!< Mux UART1_Clk from MainClk. */
265 
266     kUART1_Clk_From_Frg0Clk = CLK_MUX_DEFINE(UART1CLKSEL, 2U), /*!< Mux UART1_Clk from Frg0Clk. */
267 
268     kUART1_Clk_From_Fro_Div = CLK_MUX_DEFINE(UART1CLKSEL, 4U), /*!< Mux UART1_Clk from Fro_Div. */
269 
270     kI2C_Clk_From_Fro = CLK_MUX_DEFINE(I2C0CLKSEL, 0U), /*!< Mux I2C_Clk from Fro. */
271 
272     kI2C_Clk_From_MainClk = CLK_MUX_DEFINE(I2C0CLKSEL, 1U), /*!< Mux I2C_Clk from MainClk. */
273 
274     kI2C_Clk_From_Frg0Clk = CLK_MUX_DEFINE(I2C0CLKSEL, 2U), /*!< Mux I2C_Clk from Frg0Clk. */
275 
276     kI2C_Clk_From_Fro_Div = CLK_MUX_DEFINE(I2C0CLKSEL, 4U), /*!< Mux I2C_Clk from Fro_Div. */
277 
278     kSPI_Clk_From_Fro = CLK_MUX_DEFINE(SPI0CLKSEL, 0U), /*!< Mux SPI_Clk from Fro. */
279 
280     kSPI_Clk_From_MainClk = CLK_MUX_DEFINE(SPI0CLKSEL, 1U), /*!< Mux SPI_Clk from MainClk. */
281 
282     kSPI_Clk_From_Frg0Clk = CLK_MUX_DEFINE(SPI0CLKSEL, 2U), /*!< Mux SPI_Clk from Frg0Clk. */
283 
284     kSPI_Clk_From_Fro_Div = CLK_MUX_DEFINE(SPI0CLKSEL, 4U), /*!< Mux SPI_Clk from Fro_Div. */
285 
286     kFRG0_Clk_From_Fro = CLK_MUX_DEFINE(FRG[0].FRGCLKSEL, 0U), /*!< Mux FRG0_Clk from Fro. */
287 
288     kFRG0_Clk_From_MainClk = CLK_MUX_DEFINE(FRG[0].FRGCLKSEL, 1U), /*!< Mux FRG0_Clk from MainClk. */
289 
290     kCLKOUT_From_Fro = CLK_MUX_DEFINE(CLKOUTSEL, 0U), /*!< Mux CLKOUT from Fro. */
291 
292     kCLKOUT_From_MainClk = CLK_MUX_DEFINE(CLKOUTSEL, 1U), /*!< Mux CLKOUT from MainClk. */
293 
294     kCLKOUT_From_ExtClk = CLK_MUX_DEFINE(CLKOUTSEL, 3U), /*!< Mux CLKOUT from ExtClk. */
295 
296     kCLKOUT_From_WdtOsc = CLK_MUX_DEFINE(CLKOUTSEL, 4U) /*!< Mux clock out from WdtOsc. */
297 } clock_select_t;
298 
299 /*! @brief Clock divider
300  */
301 typedef enum _clock_divider
302 {
303     kCLOCK_DivAdcClk = CLK_DIV_DEFINE(ADCCLKDIV), /*!< Adc Clock Divider. */
304 
305     kCLOCK_DivClkOut = CLK_DIV_DEFINE(CLKOUTDIV) /*!< Clock out divider. */
306 } clock_divider_t;
307 
308 /*! @brief fro output frequency source definition */
309 typedef enum _clock_fro_src
310 {
311     kCLOCK_FroSrcLpwrBootValue = 0U, /*!< fro source from the fro oscillator divided by low power boot value */
312     //    kCLOCK_FroSrcFroOsc        = 1U << SYSCON_FROOSCCTRL_DIRECT_SHIFT,
313 } clock_fro_src_t;
314 
315 /*! @brief fro oscillator output frequency value definition */
316 typedef enum _clock_fro_osc_freq
317 {
318     kCLOCK_FroOscOut18M = 18000U, /*!< FRO oscillator output 18M */
319     kCLOCK_FroOscOut24M = 24000U, /*!< FRO oscillator output 24M */
320     kCLOCK_FroOscOut30M = 30000U, /*!< FRO oscillator output 30M */
321 } clock_fro_osc_freq_t;
322 
323 /*! @brief Main clock source definition */
324 typedef enum _clock_main_clk_src
325 {
326     kCLOCK_MainClkSrcFro    = CLK_MAIN_CLK_MUX_DEFINE(0U, 0U), /*!< main clock source from FRO */
327     kCLOCK_MainClkSrcExtClk = CLK_MAIN_CLK_MUX_DEFINE(1U, 0U), /*!< main clock source from Ext clock */
328     kCLOCK_MainClkSrcLPOsc  = CLK_MAIN_CLK_MUX_DEFINE(2U, 0U), /*!< main clock source from watchdog oscillator */
329     kCLOCK_MainClkSrcFroDiv = CLK_MAIN_CLK_MUX_DEFINE(3U, 0U), /*!< main clock source from FRO Div */
330 } clock_main_clk_src_t;
331 
332 /*******************************************************************************
333  * API
334  ******************************************************************************/
335 
336 #if defined(__cplusplus)
337 extern "C" {
338 #endif /* __cplusplus */
339 
340 /*!
341  * @name Clock gate, mux, and divider.
342  * @{
343  */
344 
345 /*
346  *! @brief enable ip clock.
347  *
348  * @param clk clock ip definition.
349  */
CLOCK_EnableClock(clock_ip_name_t clk)350 static inline void CLOCK_EnableClock(clock_ip_name_t clk)
351 {
352     SYSCON->SYSAHBCLKCTRL0 |= 1UL << CLK_GATE_GET_BITS_SHIFT(clk);
353 }
354 
355 /*
356  *!@brief disable ip clock.
357  *
358  * @param clk clock ip definition.
359  */
CLOCK_DisableClock(clock_ip_name_t clk)360 static inline void CLOCK_DisableClock(clock_ip_name_t clk)
361 {
362     SYSCON->SYSAHBCLKCTRL0 &= ~(1UL << CLK_GATE_GET_BITS_SHIFT(clk));
363 }
364 
365 /*
366  *! @brief	Configure the clock selection muxes.
367  * @param	mux	: Clock to be configured.
368  * @return	Nothing
369  */
CLOCK_Select(clock_select_t sel)370 static inline void CLOCK_Select(clock_select_t sel)
371 {
372     *(CLK_MUX_GET_REG(sel)) = CLK_MUX_GET_MUX(sel);
373 }
374 
375 /*
376  *! @brief	Setup peripheral clock dividers.
377  * @param	name	: Clock divider name
378  * @param   value: Value to be divided
379  * @return	Nothing
380  */
CLOCK_SetClkDivider(clock_divider_t name,uint32_t value)381 static inline void CLOCK_SetClkDivider(clock_divider_t name, uint32_t value)
382 {
383     CLK_DIV_GET_REG(name) = value & 0xFFU;
384 }
385 
386 /*
387  *! @brief  Get peripheral clock dividers.
388  * @param   name    : Clock divider name
389  * @return  clock divider value
390  */
CLOCK_GetClkDivider(clock_divider_t name)391 static inline uint32_t CLOCK_GetClkDivider(clock_divider_t name)
392 {
393     return CLK_DIV_GET_REG(name) & 0xFFU;
394 }
395 
396 /*
397  *! @brief   Setup Core clock dividers.
398  * Be careful about the core divider value, due to core/system frequency should be lower than 30MHZ.
399  * @param   value: Value to be divided
400  * @return  Nothing
401  */
CLOCK_SetCoreSysClkDiv(uint32_t value)402 static inline void CLOCK_SetCoreSysClkDiv(uint32_t value)
403 {
404     assert(value != 0U);
405 
406     SYSCON->SYSAHBCLKDIV = (SYSCON->SYSAHBCLKDIV & (~SYSCON_SYSAHBCLKDIV_DIV_MASK)) | SYSCON_SYSAHBCLKDIV_DIV(value);
407 }
408 
409 /*! @brief  Set main clock reference source.
410  * @param src Reference clock_main_clk_src_t to set the main clock source.
411  */
412 void CLOCK_SetMainClkSrc(clock_main_clk_src_t src);
413 
414 /*
415  *! @brief	Set Fractional generator multiplier value.
416  * @param   base: Fractional generator register address
417  * @param	mul	: FRG multiplier value.
418  * @return	Nothing
419  */
CLOCK_SetFRGClkMul(uint32_t * base,uint32_t mul)420 static inline void CLOCK_SetFRGClkMul(uint32_t *base, uint32_t mul)
421 {
422     CLK_FRG_DIV_REG_MAP(base) = SYSCON_FRG_FRGDIV_DIV_MASK;
423     CLK_FRG_MUL_REG_MAP(base) = SYSCON_FRG_FRGMULT_MULT(mul);
424 }
425 /* @} */
426 
427 /*!
428  * @name Get frequency
429  * @{
430  */
431 
432 /*! @brief  Return Frequency of FRG0 Clock.
433  *  @return Frequency of FRG0 Clock.
434  */
435 uint32_t CLOCK_GetFRGClkFreq(void);
436 
437 /*! @brief  Return Frequency of Main Clock.
438  *  @return Frequency of Main Clock.
439  */
440 uint32_t CLOCK_GetMainClkFreq(void);
441 
442 /*! @brief  Return Frequency of FRO.
443  *  @return Frequency of FRO.
444  */
445 uint32_t CLOCK_GetFroFreq(void);
446 
447 /*! @brief  Return Frequency of core.
448  *  @return Frequency of core.
449  */
CLOCK_GetCoreSysClkFreq(void)450 static inline uint32_t CLOCK_GetCoreSysClkFreq(void)
451 {
452     return CLOCK_GetMainClkFreq() / (SYSCON->SYSAHBCLKDIV & 0xffU);
453 }
454 
455 /*! @brief  Return Frequency of ClockOut
456  *  @return Frequency of ClockOut
457  */
458 uint32_t CLOCK_GetClockOutClkFreq(void);
459 
460 /*! @brief  Get UART0 frequency
461  * @retval UART0 frequency value.
462  */
463 uint32_t CLOCK_GetUart0ClkFreq(void);
464 
465 /*! @brief  Get UART1 frequency
466  * @retval UART1 frequency value.
467  */
468 uint32_t CLOCK_GetUart1ClkFreq(void);
469 
470 /*! @brief	Return Frequency of selected clock
471  *  @return	Frequency of selected clock
472  */
473 uint32_t CLOCK_GetFreq(clock_name_t clockName);
474 
475 /*! @brief  Get watch dog OSC frequency
476  * @retval watch dog OSC frequency value.
477  */
CLOCK_GetLPOscFreq(void)478 static inline uint32_t CLOCK_GetLPOscFreq(void)
479 {
480     return 1000000;
481 }
482 
483 /*! @brief  Get external clock frequency
484  * @retval external clock frequency value.
485  */
CLOCK_GetExtClkFreq(void)486 static inline uint32_t CLOCK_GetExtClkFreq(void)
487 {
488     return g_Ext_Clk_Freq;
489 }
490 /* @} */
491 
492 /* @} */
493 
494 /*!
495  * @name Fractional clock operations
496  * @{
497  */
498 
499 /*! @brief Set FRG0 output frequency.
500  * @param freq, target output frequency,freq < input and (input / freq) < 2 should be satisfy.
501  * @retval true - successfully, false - input argument is invalid.
502  *
503  */
504 bool CLOCK_SetFRGClkFreq(uint32_t freq);
505 
506 /* @} */
507 
508 /*!
509  * @name External/internal oscillator clock operations
510  * @{
511  */
512 
513 /*! @brief  Init external CLK IN, select the CLKIN as the external clock source.
514  * @param clkInFreq external clock in frequency.
515  */
516 void CLOCK_InitExtClkin(uint32_t clkInFreq);
517 
518 /*! @brief  Deinit watch dog OSC
519  * @param config oscillator configuration.
520  */
CLOCK_DeinitLPOsc(void)521 static inline void CLOCK_DeinitLPOsc(void)
522 {
523     SYSCON->PDRUNCFG |= SYSCON_PDRUNCFG_LPOSC_PD_MASK;
524 }
525 
526 /*! @brief Set FRO oscillator output frequency.
527  *  Initialize the FRO clock to given frequency (18, 24 or 30 MHz).
528  * @param freq, please reference clock_fro_osc_freq_t definition, frequency must be one of 18000, 24000 or 30000 KHz.
529  *
530  */
531 void CLOCK_SetFroOscFreq(clock_fro_osc_freq_t freq);
532 
533 /* @} */
534 
535 #if defined(__cplusplus)
536 }
537 #endif /* __cplusplus */
538 
539 /*! @} */
540 
541 #endif /* _FSL_CLOCK_H_ */
542