1 /*
2 * Copyright 2023-2024 NXP
3 * All rights reserved.
4 *
5 * SPDX-License-Identifier: BSD-3-Clause
6 */
7
8 #include "fsl_clock.h"
9 #include "fsl_common.h"
10
11 /*******************************************************************************
12 * Definitions
13 ******************************************************************************/
14 /* Component ID definition, used by tools. */
15 #ifndef FSL_COMPONENT_ID
16 #define FSL_COMPONENT_ID "platform.drivers.clock"
17 #endif
18
19 #define FRO0_DEFAULT_CLOCK_FREQ 300000000U
20 #define FRO1_MAX_CLOCK_FREQ 192000000U
21 #define FRO2_DEFAULT_CLOCK_FREQ 196000000U
22
23 #define FRO_MIN_CLOCK_FREQ 150000000U
24 #define FRO_MAX_CLOCK_FREQ 300000000U
25
26 /*******************************************************************************
27 * Variables
28 ******************************************************************************/
29 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
30 /* Array of LPUART peripheral base address. */
31 static FRO_Type *const s_froBases[] = FRO_BASE_PTRS;
32 volatile uint32_t g_senseAudioClkFreq = 0U;
33 #endif
34
35 /* External XTAL (OSC) clock frequency. */
36 volatile uint32_t g_xtalFreq = 24000000U;
37 /* External CLK_IN pin clock frequency. */
38 volatile uint32_t g_clkinFreq = 0U;
39 /* External MCLK IN clock frequency. */
40 volatile uint32_t g_mclkFreq = 0U;
41 /* External 32 kHz input clock pin clock frequency. */
42 volatile uint32_t g_32kClkinFreq = 0U;
43
44 /*******************************************************************************
45 * Code
46 ******************************************************************************/
CLOCK_EnableClock(clock_ip_name_t clk)47 void CLOCK_EnableClock(clock_ip_name_t clk)
48 {
49 uint32_t index = CLK_GATE_ABSTRACT_REG_OFFSET(clk);
50 uint32_t bitMask = 1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk);
51
52 switch (index)
53 {
54 #if defined(FSL_CLOCK_DRIVER_COMPUTE) || defined(FSL_CLOCK_DRIVER_MEDIA)
55 case CLK_CTL0_PSCCTL0:
56 CLKCTL0->PSCCTL0_SET = bitMask;
57 while ((CLKCTL0->PSCCTL0 & bitMask) == 0U)
58 {
59 }
60 break;
61 case CLK_CTL0_PSCCTL1:
62 CLKCTL0->PSCCTL1_SET = bitMask;
63 while ((CLKCTL0->PSCCTL1 & bitMask) == 0U)
64 {
65 }
66 break;
67 case CLK_CTL0_PSCCTL2:
68 CLKCTL0->PSCCTL2_SET = bitMask;
69 while ((CLKCTL0->PSCCTL2 & bitMask) == 0U)
70 {
71 }
72 break;
73 case CLK_CTL0_PSCCTL3:
74 CLKCTL0->PSCCTL3_SET = bitMask;
75 while ((CLKCTL0->PSCCTL3 & bitMask) == 0U)
76 {
77 }
78 break;
79 case CLK_CTL0_PSCCTL4:
80 CLKCTL0->PSCCTL4_SET = bitMask;
81 while ((CLKCTL0->PSCCTL4 & bitMask) == 0U)
82 {
83 }
84 break;
85 case CLK_CTL0_PSCCTL5:
86 CLKCTL0->PSCCTL5_SET = bitMask;
87 while ((CLKCTL0->PSCCTL5 & bitMask) == 0U)
88 {
89 }
90 break;
91 case CLK_CTL3_PSCCTL0:
92 CLKCTL3->PSCCTL0_COMP_SET = bitMask;
93 while ((CLKCTL3->PSCCTL0_COMP & bitMask) == 0U)
94 {
95 }
96 break;
97 case CLK_CTL4_PSCCTL0:
98 CLKCTL4->PSCCTL0_MEDIA_SET = bitMask;
99 while ((CLKCTL4->PSCCTL0_MEDIA & bitMask) == 0U)
100 {
101 }
102 break;
103 case CLK_CTL4_PSCCTL1:
104 CLKCTL4->PSCCTL1_MEDIA_SET = bitMask;
105 while ((CLKCTL4->PSCCTL1_MEDIA & bitMask) == 0U)
106 {
107 }
108 break;
109 case SYSCON0_SEC_CLK_CTRL:
110 SYSCON0->SEC_CLK_CTRL_SET = bitMask;
111 while ((SYSCON0->SEC_CLK_CTRL & bitMask) == 0U)
112 {
113 }
114 break;
115 case CLKCTL0_ONE_SRC_CLKSLICE_ENABLE:
116 CLKCTL0->ONE_SRC_CLKSLICE_ENABLE |= bitMask;
117 while ((CLKCTL0->ONE_SRC_CLKSLICE_ENABLE & bitMask) == 0U)
118 {
119 }
120 break;
121 case CLKCTL3_ONE_SRC_CLKSLICE_ENABLE:
122 CLKCTL3->ONE_SRC_CLKSLICE_ENABLE_COMP |= bitMask;
123 while ((CLKCTL3->ONE_SRC_CLKSLICE_ENABLE_COMP & bitMask) == 0U)
124 {
125 }
126 break;
127 case CLKCTL4_ONE_SRC_CLKSLICE_ENABLE:
128 CLKCTL4->ONE_SRC_CLKSLICE_ENABLE |= bitMask;
129 while ((CLKCTL4->ONE_SRC_CLKSLICE_ENABLE & bitMask) == 0U)
130 {
131 }
132 break;
133 #else /* Sense domain */
134 case CLK_CTL1_PSCCTL0:
135 CLKCTL1->PSCCTL0_SET = bitMask;
136 while ((CLKCTL1->PSCCTL0 & bitMask) == 0U)
137 {
138 }
139 break;
140 case CLK_CTL1_PSCCTL1:
141 CLKCTL1->PSCCTL1_SET = bitMask;
142 while ((CLKCTL1->PSCCTL1 & bitMask) == 0U)
143 {
144 }
145 break;
146 case CLK_CTL3_PSCCTL0:
147 CLKCTL3->PSCCTL0_SENS_SET = bitMask;
148 while ((CLKCTL3->PSCCTL0_SENS & bitMask) == 0U)
149 {
150 }
151 break;
152 case CLK_CTL4_PSCCTL0:
153 CLKCTL4->PSCCTL0_SENS_SET = bitMask;
154 while ((CLKCTL4->PSCCTL0_SENS & bitMask) == 0U)
155 {
156 }
157 break;
158 case CLK_CTL4_PSCCTL1:
159 CLKCTL4->PSCCTL1_SENS_SET = bitMask;
160 while ((CLKCTL4->PSCCTL1_SENS & bitMask) == 0U)
161 {
162 }
163 break;
164 case CLKCTL3_ONE_SRC_CLKSLICE_ENABLE:
165 CLKCTL3->ONE_SRC_CLKSLICE_ENABLE_SENSE |= bitMask;
166 while ((CLKCTL3->ONE_SRC_CLKSLICE_ENABLE_SENSE & bitMask) == 0U)
167 {
168 }
169 break;
170 case CLKCTL4_ONE_SRC_CLKSLICE_ENABLE:
171 CLKCTL4->ONE_SRC_CLKSLICE_ENABLE_SENSE |= bitMask;
172 while ((CLKCTL4->ONE_SRC_CLKSLICE_ENABLE_SENSE & bitMask) == 0U)
173 {
174 }
175 break;
176 #endif /* FSL_CLOCK_DRIVER_COMPUTE */
177 case CLK_CTL2_PSCCTL0:
178 CLKCTL2->PSCCTL0_SET = bitMask;
179 while ((CLKCTL2->PSCCTL0 & bitMask) == 0U)
180 {
181 }
182 break;
183 case SYSCON3_SEC_CLK_CTRL:
184 SYSCON3->SEC_CLK_CTRL_SET = bitMask;
185 while ((SYSCON3->SEC_CLK_CTRL & bitMask) == 0U)
186 {
187 }
188 break;
189 default:
190 /* Should not go here. */
191 assert(false);
192 break;
193 }
194 }
195
CLOCK_DisableClock(clock_ip_name_t clk)196 void CLOCK_DisableClock(clock_ip_name_t clk)
197 {
198 uint32_t index = CLK_GATE_ABSTRACT_REG_OFFSET(clk);
199 switch (index)
200 {
201 #if defined(FSL_CLOCK_DRIVER_COMPUTE) || defined(FSL_CLOCK_DRIVER_MEDIA)
202 case CLK_CTL0_PSCCTL0:
203 CLKCTL0->PSCCTL0_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
204 break;
205 case CLK_CTL0_PSCCTL1:
206 CLKCTL0->PSCCTL1_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
207 break;
208 case CLK_CTL0_PSCCTL2:
209 CLKCTL0->PSCCTL2_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
210 break;
211 case CLK_CTL0_PSCCTL3:
212 CLKCTL0->PSCCTL3_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
213 break;
214 case CLK_CTL0_PSCCTL4:
215 CLKCTL0->PSCCTL4_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
216 break;
217 case CLK_CTL0_PSCCTL5:
218 CLKCTL0->PSCCTL5_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
219 break;
220 case CLK_CTL3_PSCCTL0:
221 CLKCTL3->PSCCTL0_COMP_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
222 break;
223 case CLK_CTL4_PSCCTL0:
224 CLKCTL4->PSCCTL0_MEDIA_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
225 break;
226 case CLK_CTL4_PSCCTL1:
227 CLKCTL4->PSCCTL1_MEDIA_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
228 break;
229 case SYSCON0_SEC_CLK_CTRL:
230 SYSCON0->SEC_CLK_CTRL_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
231 break;
232 case CLKCTL0_ONE_SRC_CLKSLICE_ENABLE:
233 CLKCTL0->ONE_SRC_CLKSLICE_ENABLE &= ~(1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
234 break;
235 case CLKCTL3_ONE_SRC_CLKSLICE_ENABLE:
236 CLKCTL3->ONE_SRC_CLKSLICE_ENABLE_COMP &= ~(1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
237 break;
238 case CLKCTL4_ONE_SRC_CLKSLICE_ENABLE:
239 CLKCTL4->ONE_SRC_CLKSLICE_ENABLE &= ~(1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
240 break;
241 #else
242 case CLK_CTL1_PSCCTL0:
243 CLKCTL1->PSCCTL0_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
244 break;
245 case CLK_CTL1_PSCCTL1:
246 CLKCTL1->PSCCTL1_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
247 break;
248 case CLK_CTL3_PSCCTL0:
249 CLKCTL3->PSCCTL0_SENS_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
250 break;
251 case CLK_CTL4_PSCCTL0:
252 CLKCTL4->PSCCTL0_SENS_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
253 break;
254 case CLK_CTL4_PSCCTL1:
255 CLKCTL4->PSCCTL1_SENS_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
256 break;
257 case CLKCTL3_ONE_SRC_CLKSLICE_ENABLE:
258 CLKCTL3->ONE_SRC_CLKSLICE_ENABLE_SENSE &= ~(1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
259 break;
260 case CLKCTL4_ONE_SRC_CLKSLICE_ENABLE:
261 CLKCTL4->ONE_SRC_CLKSLICE_ENABLE_SENSE &= ~(1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
262 break;
263 #endif
264 case CLK_CTL2_PSCCTL0:
265 CLKCTL2->PSCCTL0_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
266 break;
267 case SYSCON3_SEC_CLK_CTRL:
268 SYSCON3->SEC_CLK_CTRL_CLR = (1UL << CLK_GATE_ABSTRACT_BITS_SHIFT(clk));
269 break;
270 default:
271 /* Should not go here. */
272 assert(false);
273 break;
274 }
275 }
276
277 /* Clock Selection for IP */
278 /**
279 * brief Configure the clock selection muxes.
280 * param connection : Clock to be configured.
281 * return Nothing
282 */
CLOCK_AttachClk(clock_attach_id_t connection)283 void CLOCK_AttachClk(clock_attach_id_t connection)
284 {
285 volatile uint32_t *pClkSel;
286
287 switch (((uint32_t)connection) & 0xE0000000U)
288 {
289 case CLKCTL4_INDEX:
290 pClkSel = CLKCTL_TUPLE_REG(CLKCTL4, connection);
291 break;
292 case CLKCTL3_INDEX:
293 pClkSel = CLKCTL_TUPLE_REG(CLKCTL3, connection);
294 break;
295 case CLKCTL2_INDEX:
296 pClkSel = CLKCTL_TUPLE_REG(CLKCTL2, connection);
297 break;
298 #if defined(FSL_CLOCK_DRIVER_SENSE)
299 case CLKCTL1_INDEX:
300 pClkSel = CLKCTL_TUPLE_REG(CLKCTL1, connection);
301 break;
302 #else
303 case CLKCTL0_INDEX:
304 pClkSel = CLKCTL_TUPLE_REG(CLKCTL0, connection);
305 break;
306 #endif
307 default:
308 pClkSel = NULL;
309 break;
310 }
311
312 if (pClkSel != NULL)
313 {
314 if (((uint32_t)connection & CLK_MUX_DISABLE_OUTPUT_MASK) != 0U) /* For muxes with SEL_EN bit*/
315 {
316 *pClkSel = (*pClkSel & 0xFFFFFF8UL) | CLKCTL_TUPLE_SEL(connection);
317 }
318 else
319 {
320 *pClkSel = (*pClkSel & 0xFFFFFFCUL) | CLKCTL_TUPLE_SEL(connection) | 0x4U;
321 }
322 }
323 else
324 {
325 /* Unreachable */
326 assert(false);
327 }
328 }
329
330 /* Set IP Clock divider */
331 /**
332 * brief Setup peripheral clock dividers.
333 * param div_name : Clock divider name
334 * param divider : Value to be divided. Divided clock frequency = Undivided clock frequency / divider.
335 * return Nothing
336 */
CLOCK_SetClkDiv(clock_div_name_t div_name,uint32_t divider)337 void CLOCK_SetClkDiv(clock_div_name_t div_name, uint32_t divider)
338 {
339 volatile uint32_t *pClkDiv = NULL;
340
341 switch (((uint32_t)div_name) & 0xE0000000U)
342 {
343 case CLKCTL4_INDEX:
344 pClkDiv = CLKCTL_TUPLE_REG(CLKCTL4, div_name);
345 break;
346 case CLKCTL3_INDEX:
347 pClkDiv = CLKCTL_TUPLE_REG(CLKCTL3, div_name);
348 break;
349 case CLKCTL2_INDEX:
350 pClkDiv = CLKCTL_TUPLE_REG(CLKCTL2, div_name);
351 break;
352 #if defined(FSL_CLOCK_DRIVER_SENSE)
353 case CLKCTL1_INDEX:
354 pClkDiv = CLKCTL_TUPLE_REG(CLKCTL1, div_name);
355 break;
356 #else
357 case CLKCTL0_INDEX:
358 pClkDiv = CLKCTL_TUPLE_REG(CLKCTL0, div_name);
359 break;
360 #endif
361 default:
362 /* Should not go here. */
363 assert(false);
364 break;
365 }
366
367 /* Reset the divider counter */
368 #if defined(FSL_CLOCK_DRIVER_SENSE)
369 if (div_name != kCLOCK_DivSenseMainClk)
370 #endif
371 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
372 if ((div_name != kCLOCK_DivCmptMainClk) && (div_name != kCLOCK_DivSenseMainClk))
373 #endif
374 {
375 *pClkDiv |= 1UL << 29U;
376 }
377
378 if (divider == 0U) /*!< halt */
379 {
380 *pClkDiv |= 1UL << 30U;
381 }
382 else
383 {
384 *pClkDiv = divider - 1U;
385
386 while (((*pClkDiv) & 0x80000000U) != 0U)
387 {
388 }
389 }
390 }
391
CLOCK_GetFreq(clock_name_t clockName)392 uint32_t CLOCK_GetFreq(clock_name_t clockName)
393 {
394 uint32_t freq = 0U;
395
396 switch (clockName)
397 {
398 case kCLOCK_CoreSysClk:
399 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
400 case kCLOCK_BusClk:
401 freq = CLOCK_GetComputeMainClkFreq();
402 break;
403 case kCLOCK_Vdd2ClockOutClk:
404 freq = CLOCK_GetClockOutClkFreq();
405 break;
406 case kCLOCK_Wdt0Clk:
407 freq = CLOCK_GetWdtClkFreq(0U);
408 break;
409 case kCLOCK_Wdt1Clk:
410 freq = CLOCK_GetWdtClkFreq(1U);
411 break;
412 case kCLOCK_Xspi0Clk:
413 freq = CLOCK_GetXspiClkFreq(0U);
414 break;
415 case kCLOCK_Xspi1Clk:
416 freq = CLOCK_GetXspiClkFreq(1U);
417 break;
418 case kCLOCK_SctClk:
419 freq = CLOCK_GetSctClkFreq();
420 break;
421 case kCLOCK_Hifi4CpuClk:
422 freq = CLOCK_GetHifi4ClkFreq();
423 break;
424 case kCLOCK_LPFlexComm0Clk:
425 freq = CLOCK_GetLPFlexCommClkFreq(0U);
426 break;
427 case kCLOCK_LPFlexComm1Clk:
428 freq = CLOCK_GetLPFlexCommClkFreq(1U);
429 break;
430 case kCLOCK_LPFlexComm2Clk:
431 freq = CLOCK_GetLPFlexCommClkFreq(2U);
432 break;
433 case kCLOCK_LPFlexComm3Clk:
434 freq = CLOCK_GetLPFlexCommClkFreq(3U);
435 break;
436 case kCLOCK_LPFlexComm4Clk:
437 freq = CLOCK_GetLPFlexCommClkFreq(4U);
438 break;
439 case kCLOCK_LPFlexComm5Clk:
440 freq = CLOCK_GetLPFlexCommClkFreq(5U);
441 break;
442 case kCLOCK_LPFlexComm6Clk:
443 freq = CLOCK_GetLPFlexCommClkFreq(6U);
444 break;
445 case kCLOCK_LPFlexComm7Clk:
446 freq = CLOCK_GetLPFlexCommClkFreq(7U);
447 break;
448 case kCLOCK_LPFlexComm8Clk:
449 freq = CLOCK_GetLPFlexCommClkFreq(8U);
450 break;
451 case kCLOCK_LPFlexComm9Clk:
452 freq = CLOCK_GetLPFlexCommClkFreq(9U);
453 break;
454 case kCLOCK_LPFlexComm10Clk:
455 freq = CLOCK_GetLPFlexCommClkFreq(10U);
456 break;
457 case kCLOCK_LPFlexComm11Clk:
458 freq = CLOCK_GetLPFlexCommClkFreq(11U);
459 break;
460 case kCLOCK_LPFlexComm12Clk:
461 freq = CLOCK_GetLPFlexCommClkFreq(12U);
462 break;
463 case kCLOCK_LPFlexComm13Clk:
464 freq = CLOCK_GetLPFlexCommClkFreq(13U);
465 break;
466 #else
467 case kCLOCK_BusClk:
468 freq = CLOCK_GetSenseMainClkFreq();
469 break;
470 case kCLOCK_Wdt2Clk:
471 freq = CLOCK_GetWdtClkFreq(2U);
472 break;
473 case kCLOCK_Wdt3Clk:
474 freq = CLOCK_GetWdtClkFreq(3U);
475 break;
476 case kCLOCK_Hifi1CpuClk:
477 freq = CLOCK_GetHifi1ClkFreq();
478 break;
479 case kCLOCK_LPFlexComm17Clk:
480 freq = CLOCK_GetLPFlexCommClkFreq(17U);
481 break;
482 case kCLOCK_LPFlexComm18Clk:
483 freq = CLOCK_GetLPFlexCommClkFreq(18U);
484 break;
485 case kCLOCK_LPFlexComm19Clk:
486 freq = CLOCK_GetLPFlexCommClkFreq(19U);
487 break;
488 case kCLOCK_LPFlexComm20Clk:
489 freq = CLOCK_GetLPFlexCommClkFreq(20U);
490 break;
491 #endif
492
493 case kCLOCK_MclkClk:
494 freq = CLOCK_GetMclkInClkFreq();
495 break;
496 case kCLOCK_Vdd1ClockOutClk:
497 freq = CLOCK_GetVdd1ClockOutClkFreq();
498 break;
499 case kCLOCK_AdcClk:
500 freq = CLOCK_GetAdcClkFreq();
501 break;
502 case kCLOCK_Xspi2Clk:
503 freq = CLOCK_GetXspiClkFreq(2U);
504 break;
505 case kCLOCK_SystickClk:
506 freq = CLOCK_GetSystickClkFreq();
507 break;
508 case kCLOCK_Sdio0Clk:
509 freq = CLOCK_GetUsdhcClkFreq(0U);
510 break;
511 case kCLOCK_Sdio1Clk:
512 freq = CLOCK_GetUsdhcClkFreq(1U);
513 break;
514 case kCLOCK_I3cClk:
515 freq = CLOCK_GetI3cClkFreq();
516 break;
517 case kCLOCK_Usb0Clk:
518 freq = CLOCK_GetMediaVddnClkFreq();
519 break;
520 case kCLOCK_Usb1Clk:
521 freq = CLOCK_GetUsbClkFreq();
522 break;
523 case kCLOCK_PdmClk:
524 freq = CLOCK_GetMicfilClkFreq();
525 break;
526 case kCLOCK_AcmpClk:
527 freq = CLOCK_GetAcmpClkFreq();
528 break;
529 case kCLOCK_LPSpi14Clk:
530 freq = CLOCK_GetLPSpiClkFreq(14U);
531 break;
532 case kCLOCK_LPSpi16Clk:
533 freq = CLOCK_GetLPSpiClkFreq(16U);
534 break;
535 case kCLOCK_LPI2c15Clk:
536 freq = CLOCK_GetLPI2cClkFreq(15U);
537 break;
538 case kCLOCK_FlexioClk:
539 freq = CLOCK_GetFlexioClkFreq();
540 break;
541 case kCLOCK_VgpuClk:
542 freq = CLOCK_GetVgpuClkFreq();
543 break;
544 case kCLOCK_LcdifClk:
545 freq = CLOCK_GetLcdifClkFreq();
546 break;
547 case kCLOCK_MipiDphyClk:
548 freq = CLOCK_GetMipiDphyClkFreq();
549 break;
550 case kCLOCK_MipiDphyEscRxClk:
551 freq = CLOCK_GetMipiDphyEscRxClkFreq();
552 break;
553 case kCLOCK_MipiDphyEscTxClk:
554 freq = CLOCK_GetMipiDphyEscTxClkFreq();
555 break;
556 default:
557 freq = 0U;
558 break;
559 }
560
561 return freq;
562 }
563
564 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
565 /*!
566 * brief Get the FRO instance from peripheral base address.
567 *
568 * param base FRO peripheral base address.
569 * return FRO instance.
570 */
CLOCK_FroGetInstance(FRO_Type * base)571 static uint32_t CLOCK_FroGetInstance(FRO_Type *base)
572 {
573 uint32_t instance;
574
575 /* Find the instance index from base address mappings. */
576 for (instance = 0U; instance < ARRAY_SIZE(s_froBases); instance++)
577 {
578 if (s_froBases[instance] == base)
579 {
580 break;
581 }
582 }
583
584 assert(instance < ARRAY_SIZE(s_froBases));
585
586 return instance;
587 }
588 #endif
589
CLOCK_CalFroFreq(FRO_Type * base)590 static uint32_t CLOCK_CalFroFreq(FRO_Type *base)
591 {
592 uint32_t freq = 0U;
593 bool enabled = false;
594 uint32_t refFreq = 0U;
595
596 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
597 assert(base != FRO1);
598 enabled = ((SLEEPCON0->RUNCFG & ((uint32_t)SLEEPCON0_RUNCFG_FRO0_PD_MASK << CLOCK_FroGetInstance(base))) != 0U) ?
599 false :
600 true;
601 #else
602 enabled = ((SLEEPCON1->RUNCFG & SLEEPCON1_RUNCFG_FRO2_PD_MASK) != 0U) ? false : true;
603 #endif
604 refFreq = (g_xtalFreq != 0U) ? g_xtalFreq : g_clkinFreq;
605
606 if ((base->CSR.RW & FRO_CSR_FROEN_MASK) != 0U || enabled)
607 {
608 if (base == FRO2)
609 {
610 if ((base->TEXPCNT.RW & FRO_TEXPCNT_TEXPCNT_MASK) != 0u)
611 {
612 freq = ((uint32_t)((uint64_t)(base->TRIMCNT.RW) *
613 ((uint64_t)refFreq / (uint64_t)((base->CNFG1.RW & FRO_CNFG1_REFDIV_MASK) + 1UL)) /
614 (uint64_t)((base->CNFG1.RW & FRO_CNFG1_RFCLKCNT_MASK) >> FRO_CNFG1_RFCLKCNT_SHIFT)));
615 }
616 else
617 {
618 freq = FRO2_DEFAULT_CLOCK_FREQ;
619 }
620 }
621 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
622 else
623 {
624 if ((base->TEXPCNT.RW & FRO_TEXPCNT_TEXPCNT_MASK) != 0u)
625 {
626 freq = ((uint32_t)((uint64_t)(base->TRIMCNT.RW) *
627 ((uint64_t)refFreq / (uint64_t)((base->CNFG1.RW & FRO_CNFG1_REFDIV_MASK) + 1UL)) /
628 (uint64_t)((base->CNFG1.RW & FRO_CNFG1_RFCLKCNT_MASK) >> FRO_CNFG1_RFCLKCNT_SHIFT)));
629 }
630 else
631 {
632 freq = FRO0_DEFAULT_CLOCK_FREQ;
633 }
634 }
635 #endif
636 }
637 else
638 {
639 freq = 0U; /* FRO is disabled. */
640 }
641
642 return freq;
643 }
644
CLOCK_GetFroClkFreq(uint32_t id)645 uint32_t CLOCK_GetFroClkFreq(uint32_t id)
646 {
647 uint32_t freq = 0U;
648
649 switch (id)
650 {
651 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
652 case 0U:
653 freq = CLOCK_CalFroFreq(FRO0);
654 break;
655 #endif
656 case 1U:
657 freq = FRO1_MAX_CLOCK_FREQ;
658 break;
659 case 2U:
660 freq = CLOCK_CalFroFreq(FRO2);
661 break;
662 default:
663 /* Added comments to prevent the violation of MISRA C-2012 rule. */
664 break;
665 }
666
667 return freq;
668 }
669
CLOCK_GetFroFlags(FRO_Type * base)670 uint32_t CLOCK_GetFroFlags(FRO_Type *base)
671 {
672 uint32_t flags = 0U;
673
674 flags = base->CSR.RW & (FRO_CSR_TUNE_ERR_MASK | FRO_CSR_LOL_ERR_MASK | FRO_CSR_TRUPREQ_MASK |
675 FRO_CSR_TUNEONCE_DONE_MASK | FRO_CSR_TRIM_LOCK_MASK);
676 return flags;
677 }
678
CLOCK_EnableFroClkOutput(FRO_Type * base,uint32_t divOutEnable)679 void CLOCK_EnableFroClkOutput(FRO_Type *base, uint32_t divOutEnable)
680 {
681 if (divOutEnable != 0U)
682 {
683 /* Wait clock ready. */
684 if (base == FRO2)
685 {
686 while ((CLKCTL3->FRO2CLKSTATUS & CLKCTL3_FRO2CLKSTATUS_CLK_OK_MASK) == 0U)
687 {
688 }
689 }
690 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
691 else if (base == FRO0)
692 {
693 while ((CLKCTL0->FRO01CLKSTATUS & CLKCTL0_FRO01CLKSTATUS_FRO0_CLK_OK_MASK) == 0U)
694 {
695 }
696 }
697 else
698 {
699 while ((CLKCTL0->FRO01CLKSTATUS & CLKCTL0_FRO01CLKSTATUS_FRO1_CLK_OK_MASK) == 0U)
700 {
701 }
702 }
703 #else
704 else
705 {
706 /* Intentional empty. */
707 }
708 #endif /* FSL_CLOCK_DRIVER_COMPUTE */
709 }
710 else
711 {
712 /* Intentional empty. */
713 }
714
715 base->CSR.CLR = ((base->CSR.RW & FRO_CSR_CLKGATE_MASK) ^ divOutEnable) & FRO_CSR_CLKGATE_MASK;
716 base->CSR.SET = divOutEnable;
717 }
718
CLOCK_EnableFroAutoTuning(FRO_Type * base,const clock_fro_config_t * config,bool enable)719 status_t CLOCK_EnableFroAutoTuning(FRO_Type *base, const clock_fro_config_t *config, bool enable)
720 {
721 uint32_t refFreq = 0U;
722 uint32_t tempCnt = 0U;
723 uint32_t trim1Delay = 0U;
724 uint32_t trim2Delay = 0U;
725 uint32_t freqkHZ = 0U;
726 status_t ret = kStatus_Success;
727
728 if (enable)
729 {
730 /* Check parameter. FRO1 192MHz, FRO0,2 150MHz ~ 300MHz*/
731 if ((config->targetFreq < FRO_MIN_CLOCK_FREQ) || (config->targetFreq > FRO_MAX_CLOCK_FREQ) ||
732 (config->refDiv == 0U))
733 {
734 ret = kStatus_InvalidArgument;
735 }
736 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
737 else if ((base == FRO1) && (config->targetFreq != FRO1_MAX_CLOCK_FREQ))
738 {
739 ret = kStatus_InvalidArgument;
740 }
741 #endif
742 else
743 {
744 /* Do nothing. */
745 }
746
747 if (ret == kStatus_Success)
748 {
749 /* Both FRO_PD in SLEEPCON and FROEN can power up FRO, clear FROEN for only using FRO_PD to control it's
750 * power. */
751 base->CSR.CLR = FRO_CSR_FROEN_MASK | FRO_CSR_TREN_MASK | FRO_CSR_TRUPEN_MASK;
752
753 refFreq = CLOCK_GetXtalInClkFreq() / (config->refDiv);
754 freqkHZ = config->targetFreq / 1000U;
755
756 tempCnt = (10U * refFreq + freqkHZ - 1U) /
757 freqkHZ; /* REFCLKCNT = 10000 * divided reference clock / FRO target frequency. */
758 base->CNFG1.RW =
759 config->enableInt | FRO_CNFG1_RFCLKCNT(tempCnt) | FRO_CNFG1_REFDIV((uint32_t)config->refDiv - 1UL);
760
761 /* TEXPCNT */
762 tempCnt = (uint32_t)((uint64_t)config->targetFreq * tempCnt / refFreq);
763 base->TEXPCNT.RW = FRO_TEXPCNT_TEXPCNT(tempCnt) | FRO_TEXPCNT_TEXPCNT_RANGE(config->range);
764
765 trim1Delay = refFreq / 1000000UL * (uint32_t)config->trim1DelayUs;
766 trim2Delay = refFreq / 1000000UL * (uint32_t)config->trim2DelayUs;
767 base->CNFG2.RW = FRO_CNFG2_TRIM1_DELAY(trim1Delay == 0U ? 1U : trim1Delay) |
768 FRO_CNFG2_TRIM2_DELAY(trim2Delay == 0U ? 1U : trim2Delay);
769
770 if (config->coarseTrimEn)
771 {
772 base->CSR.SET = FRO_CSR_COARSEN_MASK;
773 }
774 else
775 {
776 base->CSR.CLR = FRO_CSR_COARSEN_MASK;
777 }
778 /* Enable FRO close loop mode. */
779 base->CSR.SET = FRO_CSR_TREN_MASK | FRO_CSR_TRUPEN_MASK;
780 }
781 else
782 {
783 /* Do nothing. */
784 }
785
786 return ret;
787 }
788 else
789 {
790 base->CSR.CLR = FRO_CSR_TREN_MASK | FRO_CSR_TRUPEN_MASK;
791 ret = kStatus_Success;
792 }
793
794 return ret;
795 }
796
CLOCK_EnableFroClkFreq(FRO_Type * base,uint32_t targetFreq,uint32_t divOutEnable)797 void CLOCK_EnableFroClkFreq(FRO_Type *base, uint32_t targetFreq, uint32_t divOutEnable)
798 {
799 const clock_fro_config_t froAutotrimCfg = {
800 .targetFreq = targetFreq,
801 .range = 50U, /* For about 0.5% deviation. */
802 .trim1DelayUs = 15U,
803 .trim2DelayUs = 150U,
804 .refDiv = 1U,
805 .enableInt = 0U,
806 .coarseTrimEn = true,
807 };
808 (void)CLOCK_EnableFroClkFreqCloseLoop(base, &froAutotrimCfg, divOutEnable);
809 (void)CLOCK_EnableFroAutoTuning(base, &froAutotrimCfg, false);
810 }
811
CLOCK_ConfigFroTrim(FRO_Type * base,uint16_t trimVal)812 void CLOCK_ConfigFroTrim(FRO_Type *base, uint16_t trimVal)
813 {
814 base->FROTRIM.RW = (base->FROTRIM.RW & ~(FRO_FROTRIM_COARSE_TRIM_MASK | FRO_FROTRIM_FINE_TRIM_MASK)) |
815 FRO_FROTRIM_COARSE_TRIM(((uint32_t)trimVal & 0xF80U) >> 0x7U) |
816 FRO_FROTRIM_FINE_TRIM((uint32_t)trimVal & 0x7FU);
817 }
818
CLOCK_EnableFroClkFreqCloseLoop(FRO_Type * base,const clock_fro_config_t * config,uint32_t divOutEnable)819 status_t CLOCK_EnableFroClkFreqCloseLoop(FRO_Type *base, const clock_fro_config_t *config, uint32_t divOutEnable)
820 {
821 status_t ret = kStatus_Success;
822 uint32_t flags = 0U;
823
824 /*Power up FRO */
825 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
826 SLEEPCON0->RUNCFG_CLR = (uint32_t)SLEEPCON0_RUNCFG_FRO0_PD_MASK << CLOCK_FroGetInstance(base);
827 #else
828 SLEEPCON1->RUNCFG_CLR = (uint32_t)SLEEPCON1_RUNCFG_FRO2_PD_MASK;
829 #endif
830
831 /* Disable output before changeing frequency. */
832 CLOCK_EnableFroClkOutput(base, 0U);
833 ret = CLOCK_EnableFroAutoTuning(base, config, true);
834
835 if (ret == kStatus_Success)
836 {
837 /* Polling wait tune finish. */
838 do
839 {
840 flags = CLOCK_GetFroFlags(base);
841
842 } while ((flags & FRO_CSR_TRIM_LOCK_MASK) == 0U);
843
844 if ((flags & (FRO_CSR_TUNE_ERR_MASK | FRO_CSR_LOL_ERR_MASK)) != 0U)
845 {
846 ret = kStatus_Fail; /* Error occures. */
847 }
848 else
849 {
850 ret = kStatus_Success;
851 /* Configure the FROTRIM with autotrim value. */
852 CLOCK_ConfigFroTrim(base, (uint16_t)(base->AUTOTRIM.RW & FRO_AUTOTRIM_AUTOTRIM_MASK));
853 }
854 }
855
856 /* Enable output */
857 CLOCK_EnableFroClkOutput(base, divOutEnable);
858
859 return ret;
860 }
861
CLOCK_DisableFro(FRO_Type * base)862 void CLOCK_DisableFro(FRO_Type *base)
863 {
864 CLOCK_EnableFroClkOutput(base, 0);
865 base->CSR.CLR = FRO_CSR_FROEN_MASK | FRO_CSR_TREN_MASK | FRO_CSR_TRUPEN_MASK;
866
867 /*Power down FRO */
868 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
869 SLEEPCON0->RUNCFG_SET = (uint32_t)SLEEPCON0_RUNCFG_FRO0_PD_MASK << CLOCK_FroGetInstance(base);
870 #else
871 SLEEPCON1->RUNCFG_SET = SLEEPCON1_RUNCFG_FRO2_PD_MASK;
872 #endif
873 }
874
875 /* Initialize the SYSTEM PLL Clk */
876 /*! brief Initialize the System PLL.
877 * param config : Configuration to set to PLL.
878 */
CLOCK_InitMainPll(const clock_main_pll_config_t * config)879 void CLOCK_InitMainPll(const clock_main_pll_config_t *config)
880 {
881 /* Power down MAINPLL before change fractional settings */
882 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
883 SLEEPCON0->RUNCFG_SET = SLEEPCON0_RUNCFG_PLLLDO_PD_MASK | SLEEPCON0_RUNCFG_PLLANA_PD_MASK;
884 #else
885 SLEEPCON1->RUNCFG_SET = SLEEPCON1_RUNCFG_PLLLDO_PD_MASK | SLEEPCON1_RUNCFG_PLLANA_PD_MASK;
886 #endif
887
888 CLKCTL2->MAINPLL0CLKSEL = (uint32_t)config->main_pll_src;
889 CLKCTL2->MAINPLL0NUM = config->numerator;
890 CLKCTL2->MAINPLL0DENOM = config->denominator;
891 CLKCTL2->MAINPLL0CTL0 = (CLKCTL2->MAINPLL0CTL0 & ~CLKCTL2_MAINPLL0CTL0_MULT_MASK) |
892 CLKCTL2_MAINPLL0CTL0_MULT((uint32_t)(config->main_pll_mult));
893
894 /* Clear System PLL reset*/
895 CLKCTL2->MAINPLL0CTL0 &= ~CLKCTL2_MAINPLL0CTL0_RESET_MASK;
896 /* Power up MAINPLL*/
897 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
898 SLEEPCON0->RUNCFG_CLR = SLEEPCON0_RUNCFG_PLLLDO_PD_MASK | SLEEPCON0_RUNCFG_PLLANA_PD_MASK;
899 #else
900 SLEEPCON1->RUNCFG_CLR = SLEEPCON1_RUNCFG_PLLLDO_PD_MASK | SLEEPCON1_RUNCFG_PLLANA_PD_MASK;
901 #endif
902 SDK_DelayAtLeastUs((CLKCTL2->MAINPLL0LOCKTIMEDIV2 & CLKCTL2_MAINPLL0LOCKTIMEDIV2_LOCKTIMEDIV2_MASK) / 2UL,
903 SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
904 /* Set System PLL HOLD_RING_OFF_ENA */
905 CLKCTL2->MAINPLL0CTL0 |= CLKCTL2_MAINPLL0CTL0_HOLD_RING_OFF_ENA_MASK;
906 SDK_DelayAtLeastUs((CLKCTL2->MAINPLL0LOCKTIMEDIV2 & CLKCTL2_MAINPLL0LOCKTIMEDIV2_LOCKTIMEDIV2_MASK) / 6UL,
907 SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
908 /* Clear System PLL HOLD_RING_OFF_ENA*/
909 CLKCTL2->MAINPLL0CTL0 &= ~CLKCTL2_MAINPLL0CTL0_HOLD_RING_OFF_ENA_MASK;
910 SDK_DelayAtLeastUs((CLKCTL2->MAINPLL0LOCKTIMEDIV2 & CLKCTL2_MAINPLL0LOCKTIMEDIV2_LOCKTIMEDIV2_MASK) / 3UL,
911 SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
912 }
913
914 /* Initialize the Main PLL PFD */
915 /*! brief Initialize the Main PLL PFD.
916 * param pfd : Which PFD clock to enable.
917 * param divider : The PFD divider value.
918 * note It is recommended that PFD settings are kept between 12-35.
919 */
CLOCK_InitMainPfd(clock_pfd_t pfd,uint8_t divider)920 void CLOCK_InitMainPfd(clock_pfd_t pfd, uint8_t divider)
921 {
922 uint32_t pfdIndex = (uint32_t)pfd;
923 uint32_t syspfd;
924
925 syspfd = CLKCTL2->MAINPLL0PFD &
926 ~(((uint32_t)CLKCTL2_MAINPLL0PFD_PFD0_CLKGATE_MASK | (uint32_t)CLKCTL2_MAINPLL0PFD_PFD0_MASK)
927 << (8UL * pfdIndex));
928
929 /* Disable the clock output first. */
930 CLKCTL2->MAINPLL0PFD = syspfd | ((uint32_t)CLKCTL2_MAINPLL0PFD_PFD0_CLKGATE_MASK << (8UL * pfdIndex));
931
932 /* Set the new value and enable output. */
933 CLKCTL2->MAINPLL0PFD = syspfd | (CLKCTL2_MAINPLL0PFD_PFD0(divider) << (8UL * pfdIndex));
934 /* Wait for output becomes stable. */
935 while ((CLKCTL2->MAINPLL0PFD & ((uint32_t)CLKCTL2_MAINPLL0PFD_PFD0_CLKRDY_MASK << (8UL * pfdIndex))) == 0UL)
936 {
937 }
938 /* Clear ready status flag. */
939 CLKCTL2->MAINPLL0PFD |= ((uint32_t)CLKCTL2_MAINPLL0PFD_PFD0_CLKRDY_MASK << (8UL * pfdIndex));
940 }
941 /* Initialize the Audio PLL Clk */
942 /*! brief Initialize the audio PLL.
943 * param config : Configuration to set to PLL.
944 */
CLOCK_InitAudioPll(const clock_audio_pll_config_t * config)945 void CLOCK_InitAudioPll(const clock_audio_pll_config_t *config)
946 {
947 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
948 /* Power down Audio PLL before change fractional settings */
949 SLEEPCON0->RUNCFG_SET = SLEEPCON0_RUNCFG_AUDPLLLDO_PD_MASK | SLEEPCON0_RUNCFG_AUDPLLANA_PD_MASK;
950 #else
951 SLEEPCON1->RUNCFG_SET = SLEEPCON1_RUNCFG_AUDPLLLDO_PD_MASK | SLEEPCON1_RUNCFG_AUDPLLANA_PD_MASK;
952 #endif
953
954 CLKCTL2->AUDIOPLL0CLKSEL = (uint32_t)(config->audio_pll_src);
955 CLKCTL2->AUDIOPLL0NUM = config->numerator;
956 CLKCTL2->AUDIOPLL0DENOM = config->denominator;
957 CLKCTL2->AUDIOPLL0CTL0 = (CLKCTL2->AUDIOPLL0CTL0 & ~CLKCTL2_AUDIOPLL0CTL0_MULT_MASK) |
958 CLKCTL2_AUDIOPLL0CTL0_MULT((uint32_t)(config->audio_pll_mult));
959
960 /* Clear Audio PLL reset*/
961 CLKCTL2->AUDIOPLL0CTL0 &= ~CLKCTL2_AUDIOPLL0CTL0_RESET_MASK;
962 /* Power up Audio PLL*/
963 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
964 /* Power down Audio PLL before change fractional settings */
965 SLEEPCON0->RUNCFG_CLR = SLEEPCON0_RUNCFG_AUDPLLLDO_PD_MASK | SLEEPCON0_RUNCFG_AUDPLLANA_PD_MASK;
966 #else
967 SLEEPCON1->RUNCFG_CLR = SLEEPCON1_RUNCFG_AUDPLLLDO_PD_MASK | SLEEPCON1_RUNCFG_AUDPLLANA_PD_MASK;
968 #endif
969 SDK_DelayAtLeastUs((CLKCTL2->AUDIOPLL0LOCKTIMEDIV2 & CLKCTL2_AUDIOPLL0LOCKTIMEDIV2_LOCKTIMEDIV2_MASK) / 2UL,
970 SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
971 /* Set Audio PLL HOLD_RING_OFF_ENA */
972 CLKCTL2->AUDIOPLL0CTL0 |= CLKCTL2_AUDIOPLL0CTL0_HOLD_RING_OFF_ENA_MASK;
973 SDK_DelayAtLeastUs((CLKCTL2->AUDIOPLL0LOCKTIMEDIV2 & CLKCTL2_AUDIOPLL0LOCKTIMEDIV2_LOCKTIMEDIV2_MASK) / 6UL,
974 SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
975 /* Clear Audio PLL HOLD_RING_OFF_ENA*/
976 CLKCTL2->AUDIOPLL0CTL0 &= ~CLKCTL2_AUDIOPLL0CTL0_HOLD_RING_OFF_ENA_MASK;
977 SDK_DelayAtLeastUs((CLKCTL2->AUDIOPLL0LOCKTIMEDIV2 & CLKCTL2_AUDIOPLL0LOCKTIMEDIV2_LOCKTIMEDIV2_MASK) / 3UL,
978 SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
979
980 /* Each time after PLL power up, software needs to wait the whole PLL lock time the to enable VCO output .*/
981 if (config->enableVcoOut)
982 {
983 CLKCTL2->AUDIOPLL0CTL0 |= CLKCTL2_AUDIOPLL0CTL0_VCO_OUT_ENABLE_MASK;
984 }
985 else
986 {
987 CLKCTL2->AUDIOPLL0CTL0 &= ~CLKCTL2_AUDIOPLL0CTL0_VCO_OUT_ENABLE_MASK;
988 }
989 }
990
991 /* Initialize the Audio PLL PFD */
992 /*! brief Initialize the audio PLL PFD.
993 * param pfd : Which PFD clock to enable.
994 * param divider : The PFD divider value.
995 * note It is recommended that PFD settings are kept between 12-35.
996 */
CLOCK_InitAudioPfd(clock_pfd_t pfd,uint8_t divider)997 void CLOCK_InitAudioPfd(clock_pfd_t pfd, uint8_t divider)
998 {
999 uint32_t pfdIndex = (uint32_t)pfd;
1000 uint32_t syspfd;
1001
1002 syspfd = CLKCTL2->AUDIOPLL0PFD &
1003 ~(((uint32_t)CLKCTL2_AUDIOPLL0PFD_PFD0_CLKGATE_MASK | (uint32_t)CLKCTL2_AUDIOPLL0PFD_PFD0_MASK)
1004 << (8UL * pfdIndex));
1005
1006 /* Disable the clock output first. */
1007 CLKCTL2->AUDIOPLL0PFD = syspfd | ((uint32_t)CLKCTL2_AUDIOPLL0PFD_PFD0_CLKGATE_MASK << (8UL * pfdIndex));
1008
1009 /* Set the new value and enable output. */
1010 CLKCTL2->AUDIOPLL0PFD = syspfd | (CLKCTL2_AUDIOPLL0PFD_PFD0(divider) << (8UL * pfdIndex));
1011 /* Wait for output becomes stable. */
1012 while ((CLKCTL2->AUDIOPLL0PFD & ((uint32_t)CLKCTL2_AUDIOPLL0PFD_PFD0_CLKRDY_MASK << (8UL * pfdIndex))) == 0UL)
1013 {
1014 }
1015 /* Clear ready status flag. */
1016 CLKCTL2->AUDIOPLL0PFD |= ((uint32_t)CLKCTL2_AUDIOPLL0PFD_PFD0_CLKRDY_MASK << (8UL * pfdIndex));
1017 }
1018
1019 /*! @brief Enable/Disable sys osc clock from external crystal clock.
1020 * @param enable : true to enable system osc clock, false to bypass system osc.
1021 * @param enableLowPower : true to enable low power mode, false to enable high gain mode.
1022 * @param delay_us : Delay time after OSC power up.
1023 */
CLOCK_EnableSysOscClk(bool enable,bool enableLowPower,uint32_t delay_us)1024 void CLOCK_EnableSysOscClk(bool enable, bool enableLowPower, uint32_t delay_us)
1025 {
1026 uint32_t ctrl = enableLowPower ? CLKCTL2_SYSOSCCTL0_LP_ENABLE_MASK : 0U;
1027
1028 if (enable)
1029 {
1030 CLKCTL2->SYSOSCCTL0 = ctrl;
1031 CLKCTL2->SYSOSCBYPASS = 0U;
1032 SDK_DelayAtLeastUs(delay_us, SDK_DEVICE_MAXIMUM_CPU_CLOCK_FREQUENCY);
1033 }
1034 else
1035 {
1036 CLKCTL2->SYSOSCCTL0 = ctrl | CLKCTL2_SYSOSCCTL0_BYPASS_ENABLE_MASK;
1037 }
1038 }
1039
CLOCK_EnableOsc32K(clock_osc32k_config_t * config)1040 void CLOCK_EnableOsc32K(clock_osc32k_config_t *config)
1041 {
1042 uint32_t ctrl = OSC32KNP->CTRL;
1043
1044 ctrl &= ~(OSC32KNP_CTRL_CAP_TRIM_MASK | OSC32KNP_CTRL_CLKMON_EN_MASK | OSC32KNP_CTRL_BYPASS_EN_MASK);
1045 OSC32KNP->CTRL = ctrl | OSC32KNP_CTRL_CAP_TRIM((uint32_t)config->cap) |
1046 OSC32KNP_CTRL_CLKMON_EN((uint32_t)config->monitorEnable) |
1047 OSC32KNP_CTRL_BYPASS_EN((uint32_t)config->bypass);
1048
1049 if (config->lowPowerMode)
1050 {
1051 /* Disables the output of an oscillator on the channel before changing the OSC32KNP power mode of the channel.*/
1052 OSC32KNP->CTRL |= OSC32KNP_CTRL_OSC_DIS_MASK;
1053 /* Low power mode. */
1054 OSC32KNP->CTRL &= ~OSC32KNP_CTRL_MODE_MASK;
1055 /* Wait Self-Charge Oscillator stable. */
1056 while ((OSC32KNP->STAT & OSC32KNP_STAT_SCXO_STABLE_MASK) == 0U)
1057 {
1058 }
1059 OSC32KNP->CTRL &= ~OSC32KNP_CTRL_OSC_DIS_MASK;
1060 }
1061 else
1062 {
1063 if ((OSC32KNP->CTRL & OSC32KNP_CTRL_MODE_MASK) == 0U)
1064 {
1065 /* Can only change from high power mode to low power mode. */
1066 assert(false);
1067 }
1068
1069 while ((OSC32KNP->STAT & OSC32KNP_STAT_TCXO_STABLE_MASK) == 0U)
1070 {
1071 }
1072 }
1073 }
1074
CLOCK_GetOsc32KFreq(void)1075 uint32_t CLOCK_GetOsc32KFreq(void)
1076 {
1077 uint32_t freq = 0U;
1078
1079 if ((OSC32KNP->CTRL & OSC32KNP_CTRL_OSC_DIS_MASK) == 0U)
1080 {
1081 freq = ((OSC32KNP->CTRL & OSC32KNP_CTRL_BYPASS_EN_MASK) != 0UL) ? g_32kClkinFreq : CLK_RTC_32K_CLK;
1082 }
1083 else /* OSC32KNP disabled. */
1084 {
1085 freq = 0U;
1086 }
1087
1088 return freq;
1089 }
1090
CLOCK_GetVddnComBaseClkFreq(void)1091 uint32_t CLOCK_GetVddnComBaseClkFreq(void)
1092 {
1093 uint32_t freq = 0U;
1094
1095 switch (CLKCTL2->COMNBASECLKSEL & CLKCTL2_COMNBASECLKSEL_SEL_MASK)
1096 {
1097 case CLKCTL2_COMNBASECLKSEL_SEL(0U):
1098 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1099 break;
1100 case CLKCTL2_COMNBASECLKSEL_SEL(1U):
1101 freq = CLOCK_GetFroClkFreq(1U);
1102 break;
1103 case CLKCTL2_COMNBASECLKSEL_SEL(2U):
1104 freq = CLOCK_GetFroClkFreq(0U) / 3U;
1105 break;
1106 case CLKCTL2_COMNBASECLKSEL_SEL(3U):
1107 freq = CLOCK_GetLpOscFreq();
1108 break;
1109 default:
1110 freq = 0U;
1111 break;
1112 }
1113
1114 return freq;
1115 }
1116
1117 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
1118 /*! @brief Enable/Disable FRO clock output. */
CLOCK_EnableFro0ClkForDomain(uint32_t domainEnable)1119 void CLOCK_EnableFro0ClkForDomain(uint32_t domainEnable)
1120 {
1121 if (domainEnable != 0U)
1122 {
1123 /* Wait FRO stable first in case FRO just get powered on. */
1124 while ((CLKCTL0->FRO01CLKSTATUS & CLKCTL0_FRO01CLKSTATUS_FRO0_CLK_OK_MASK) == 0U)
1125 {
1126 }
1127 }
1128 else
1129 {
1130 /* Do nothing */
1131 }
1132 CLKCTL0->FRO0MAXDOMAINEN = domainEnable & (uint32_t)kCLOCK_AllDomainEnable;
1133 }
1134
CLOCK_GetComputeBaseClkFreq(void)1135 uint32_t CLOCK_GetComputeBaseClkFreq(void)
1136 {
1137 uint32_t freq = 0U;
1138 uint32_t clkSel = 0U;
1139 clkSel = CLKCTL0->CMPTBASECLKSEL & CLKCTL0_CMPTBASECLKSEL_SEL_MASK;
1140
1141 switch (clkSel)
1142 {
1143 case CLKCTL0_CMPTBASECLKSEL_SEL(0U):
1144 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1145 break;
1146 case CLKCTL0_CMPTBASECLKSEL_SEL(1U):
1147 freq = CLOCK_GetFroClkFreq(1U);
1148 break;
1149 case CLKCTL0_CMPTBASECLKSEL_SEL(2U):
1150 freq = CLOCK_GetFroClkFreq(0U) / 3U;
1151 break;
1152 case CLKCTL0_CMPTBASECLKSEL_SEL(3U):
1153 freq = CLOCK_GetLpOscFreq();
1154 break;
1155 default:
1156 freq = 0U;
1157 break;
1158 }
1159
1160 return freq;
1161 }
1162
CLOCK_GetComputeDspBaseClkFreq(void)1163 uint32_t CLOCK_GetComputeDspBaseClkFreq(void)
1164 {
1165 uint32_t freq = 0U;
1166 uint32_t clkSel = 0U;
1167 clkSel = CLKCTL0->DSPBASECLKSEL & CLKCTL0_DSPBASECLKSEL_SEL_MASK;
1168
1169 switch (clkSel)
1170 {
1171 case CLKCTL0_CMPTBASECLKSEL_SEL(0U):
1172 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1173 break;
1174 case CLKCTL0_CMPTBASECLKSEL_SEL(1U):
1175 freq = CLOCK_GetFroClkFreq(1U);
1176 break;
1177 case CLKCTL0_CMPTBASECLKSEL_SEL(2U):
1178 freq = CLOCK_GetFroClkFreq(0U) / 3U;
1179 break;
1180 case CLKCTL0_CMPTBASECLKSEL_SEL(3U):
1181 freq = CLOCK_GetLpOscFreq();
1182 break;
1183 default:
1184 freq = 0U;
1185 break;
1186 }
1187
1188 return freq;
1189 }
1190
CLOCK_GetVdd2ComBaseClkFreq(void)1191 uint32_t CLOCK_GetVdd2ComBaseClkFreq(void)
1192 {
1193 uint32_t freq = 0U;
1194
1195 switch (CLKCTL0->VDD2COMBASECLKSEL & CLKCTL0_VDD2COMBASECLKSEL_SEL_MASK)
1196 {
1197 case CLKCTL0_VDD2COMBASECLKSEL_SEL(0U):
1198 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1199 break;
1200 case CLKCTL0_VDD2COMBASECLKSEL_SEL(1U):
1201 freq = CLOCK_GetFroClkFreq(1U);
1202 break;
1203 case CLKCTL0_VDD2COMBASECLKSEL_SEL(2U):
1204 freq = CLOCK_GetFroClkFreq(0U) / 3U;
1205 break;
1206 case CLKCTL0_VDD2COMBASECLKSEL_SEL(3U):
1207 freq = CLOCK_GetLpOscFreq();
1208 break;
1209 default:
1210 freq = 0U;
1211 break;
1212 }
1213
1214 return freq;
1215 }
1216
CLOCK_GetComputeAudioClkFreq(void)1217 uint32_t CLOCK_GetComputeAudioClkFreq(void)
1218 {
1219 uint32_t freq = 0U;
1220
1221 switch (CLKCTL0->AUDIOVDD2CLKSEL & CLKCTL0_AUDIOVDD2CLKSEL_SEL_MASK)
1222 {
1223 case CLKCTL0_AUDIOVDD2CLKSEL_SEL(0U):
1224 freq = CLOCK_GetMclkInClkFreq();
1225 break;
1226 case CLKCTL0_AUDIOVDD2CLKSEL_SEL(1U):
1227 freq = CLOCK_GetXtalInClkFreq();
1228 break;
1229 case CLKCTL0_AUDIOVDD2CLKSEL_SEL(2U):
1230 freq = CLOCK_GetFroClkFreq(2U) / 8U;
1231 break;
1232 case CLKCTL0_AUDIOVDD2CLKSEL_SEL(3U):
1233 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd3);
1234 break;
1235 default:
1236 freq = 0U;
1237 break;
1238 }
1239
1240 return freq;
1241 }
1242
CLOCK_GetSenseAudioClkFreq(void)1243 uint32_t CLOCK_GetSenseAudioClkFreq(void)
1244 {
1245 return g_senseAudioClkFreq;
1246 }
1247
1248 /* Get FCCLK Clk frequency */
CLOCK_GetFCClkFreq(uint32_t id)1249 uint32_t CLOCK_GetFCClkFreq(uint32_t id)
1250 {
1251 uint32_t freq = 0U;
1252 uint32_t clkSel = 0U;
1253 uint32_t clkDiv = 0U;
1254 bool selEn = false;
1255
1256 assert(id <= 3U);
1257
1258 clkSel = CLKCTL0->FLEXCOMM[id].FCCLKSEL & CLKCTL0_FCCLKSEL_SEL_MASK;
1259 selEn = (CLKCTL0->FLEXCOMM[id].FCCLKSEL & CLKCTL0_FCCLKSEL_SEL_EN_MASK) == CLKCTL0_FCCLKSEL_SEL_EN_MASK;
1260 clkDiv = (CLKCTL0->FLEXCOMM[id].FCCLKDIV & CLKCTL0_FCCLKDIV_DIV_MASK) >> CLKCTL0_FCCLKDIV_DIV_SHIFT;
1261
1262 if (selEn)
1263 {
1264 switch (clkSel)
1265 {
1266 case CLKCTL0_FCCLKSEL_SEL(0):
1267 freq = CLOCK_GetComputeBaseClkFreq();
1268 break;
1269
1270 case CLKCTL0_FCCLKSEL_SEL(1):
1271 freq = CLOCK_GetFroClkFreq(0U);
1272 break;
1273
1274 case CLKCTL0_FCCLKSEL_SEL(2):
1275 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd3);
1276 break;
1277
1278 case CLKCTL0_FCCLKSEL_SEL(3):
1279 freq = CLOCK_GetSysOscFreq();
1280 break;
1281 default:
1282 freq = 0U;
1283 break;
1284 }
1285 }
1286 else
1287 {
1288 freq = 0U;
1289 }
1290
1291 return (freq / (clkDiv + 1U));
1292 }
1293
CLOCK_GetComputeMainClkFreq(void)1294 uint32_t CLOCK_GetComputeMainClkFreq(void)
1295 {
1296 uint32_t freq = 0U;
1297
1298 switch ((CLKCTL0->MAINCLKSEL) & CLKCTL0_MAINCLKSEL_SEL_MASK)
1299 {
1300 case CLKCTL0_MAINCLKSEL_SEL(0):
1301 freq = CLOCK_GetComputeBaseClkFreq();
1302 break;
1303
1304 case CLKCTL0_MAINCLKSEL_SEL(1):
1305 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
1306 break;
1307
1308 case CLKCTL0_MAINCLKSEL_SEL(2):
1309 freq = CLOCK_GetFroClkFreq(0U);
1310 break;
1311
1312 case CLKCTL0_MAINCLKSEL_SEL(3):
1313 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd1);
1314 break;
1315
1316 default:
1317 freq = 0U;
1318 break;
1319 }
1320
1321 return freq / ((CLKCTL0->MAINCLKDIV & CLKCTL0_MAINCLKDIV_DIV_MASK) + 1U);
1322 }
1323
CLOCK_GetHifi4ClkFreq(void)1324 uint32_t CLOCK_GetHifi4ClkFreq(void)
1325 {
1326 uint32_t freq = 0U;
1327
1328 if ((CLKCTL0->DSPCPUCLKSEL & CLKCTL0_DSPCPUCLKSEL_SEL_EN_MASK) != 0U)
1329 {
1330 switch ((CLKCTL0->DSPCPUCLKSEL) & CLKCTL0_DSPCPUCLKSEL_SEL_MASK)
1331 {
1332 case CLKCTL0_DSPCPUCLKSEL_SEL(0):
1333 freq = CLOCK_GetComputeDspBaseClkFreq();
1334 break;
1335
1336 case CLKCTL0_DSPCPUCLKSEL_SEL(1):
1337 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
1338 break;
1339
1340 case CLKCTL0_DSPCPUCLKSEL_SEL(2):
1341 freq = CLOCK_GetFroClkFreq(0U);
1342 break;
1343
1344 case CLKCTL0_DSPCPUCLKSEL_SEL(3):
1345 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd1);
1346 break;
1347
1348 default:
1349 freq = 0U;
1350 break;
1351 }
1352 }
1353
1354 return freq / ((CLKCTL0->DSPCPUCLKDIV & CLKCTL0_DSPCPUCLKDIV_DIV_MASK) + 1U);
1355 }
1356
CLOCK_GetSenseBaseClkFreq(void)1357 uint32_t CLOCK_GetSenseBaseClkFreq(void)
1358 {
1359 uint32_t freq = 0U;
1360 uint32_t clkSel = 0U;
1361 clkSel = CLKCTL3->SENSEBASECLKSEL & CLKCTL3_SENSEBASECLKSEL_SEL_MASK;
1362
1363 /* Read again to avoid glitch. */
1364 if (clkSel == (CLKCTL3->SENSEBASECLKSEL & CLKCTL3_SENSEBASECLKSEL_SEL_MASK))
1365 {
1366 switch (clkSel)
1367 {
1368 case CLKCTL3_SENSEBASECLKSEL_SEL(0U):
1369 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1370 break;
1371 case CLKCTL3_SENSEBASECLKSEL_SEL(1U):
1372 freq = CLOCK_GetFroClkFreq(1U);
1373 break;
1374 case CLKCTL3_SENSEBASECLKSEL_SEL(2U):
1375 freq = CLOCK_GetFroClkFreq(2U) / 3U;
1376 break;
1377 case CLKCTL3_SENSEBASECLKSEL_SEL(3U):
1378 freq = CLOCK_GetLpOscFreq();
1379 break;
1380 default:
1381 freq = 0U;
1382 break;
1383 }
1384 }
1385
1386 return freq;
1387 }
1388
1389 #endif /* FSL_CLOCK_DRIVER_COMPUTE */
1390
1391 #if defined(FSL_CLOCK_DRIVER_SENSE)
1392 /*! @brief Get Sense base clock frequency. */
CLOCK_GetSenseBaseClkFreq(void)1393 uint32_t CLOCK_GetSenseBaseClkFreq(void)
1394 {
1395 uint32_t freq = 0U;
1396 uint32_t clkSel = 0U;
1397 clkSel = CLKCTL1->SENSEBASECLKSEL & CLKCTL1_SENSEBASECLKSEL_SEL_MASK;
1398
1399 switch (clkSel)
1400 {
1401 case CLKCTL1_SENSEBASECLKSEL_SEL(0U):
1402 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1403 break;
1404 case CLKCTL1_SENSEBASECLKSEL_SEL(1U):
1405 freq = CLOCK_GetFroClkFreq(1U);
1406 break;
1407 case CLKCTL1_SENSEBASECLKSEL_SEL(2U):
1408 freq = CLOCK_GetFroClkFreq(2U) / 3U;
1409 break;
1410 case CLKCTL1_SENSEBASECLKSEL_SEL(3U):
1411 freq = CLOCK_GetLpOscFreq();
1412 break;
1413 default:
1414 freq = 0U;
1415 break;
1416 }
1417
1418 return freq;
1419 }
1420
CLOCK_GetHifi1ClkFreq(void)1421 uint32_t CLOCK_GetHifi1ClkFreq(void)
1422 {
1423 uint32_t freq = 0U;
1424
1425 if ((CLKCTL1->SENSEDSPCPUCLKSEL & CLKCTL1_SENSEDSPCPUCLKSEL_SEL_EN_MASK) != 0U)
1426 {
1427 switch ((CLKCTL1->SENSEDSPCPUCLKSEL) & CLKCTL1_SENSEDSPCPUCLKSEL_SEL_MASK)
1428 {
1429 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(0):
1430 freq = CLOCK_GetSenseBaseClkFreq();
1431 break;
1432
1433 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(1):
1434 freq = CLOCK_GetFroClkFreq(2U);
1435 break;
1436
1437 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(2):
1438 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd1);
1439 break;
1440
1441 case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(3):
1442 freq = CLOCK_GetFroClkFreq(1U);
1443 break;
1444
1445 default:
1446 freq = 0U;
1447 break;
1448 }
1449 }
1450
1451 return freq / ((CLKCTL1->SENSEDSPCPUCLKDIV & CLKCTL1_SENSEDSPCPUCLKDIV_DIV_MASK) + 1U);
1452 }
1453
CLOCK_GetSenseAudioClkFreq(void)1454 uint32_t CLOCK_GetSenseAudioClkFreq(void)
1455 {
1456 uint32_t freq = 0U;
1457
1458 switch (CLKCTL1->AUDIOVDD1CLKSEL & CLKCTL1_AUDIOVDD1CLKSEL_SEL_MASK)
1459 {
1460 case CLKCTL1_AUDIOVDD1CLKSEL_SEL(0U):
1461 freq = CLOCK_GetMclkInClkFreq();
1462 break;
1463 case CLKCTL1_AUDIOVDD1CLKSEL_SEL(1U):
1464 freq = CLOCK_GetXtalInClkFreq();
1465 break;
1466 case CLKCTL1_AUDIOVDD1CLKSEL_SEL(2U):
1467 freq = CLOCK_GetFroClkFreq(2U) / 8U;
1468 break;
1469 case CLKCTL1_AUDIOVDD1CLKSEL_SEL(3U):
1470 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd3);
1471 break;
1472 default:
1473 freq = 0U;
1474 break;
1475 }
1476
1477 return freq;
1478 }
1479
1480 #endif /* FSL_CLOCK_DRIVER_SENSE */
1481
CLOCK_GetSenseMainClkFreq(void)1482 uint32_t CLOCK_GetSenseMainClkFreq(void)
1483 {
1484 uint32_t freq = 0U;
1485
1486 switch ((CLKCTL3->MAINCLKSEL) & CLKCTL3_MAINCLKSEL_SEL_MASK)
1487 {
1488 case CLKCTL3_MAINCLKSEL_SEL(0):
1489 freq = CLOCK_GetSenseBaseClkFreq();
1490 break;
1491
1492 case CLKCTL3_MAINCLKSEL_SEL(1):
1493 freq = CLOCK_GetFroClkFreq(2U);
1494 break;
1495
1496 case CLKCTL3_MAINCLKSEL_SEL(2):
1497 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd3);
1498 break;
1499
1500 case CLKCTL3_MAINCLKSEL_SEL(3):
1501 freq = CLOCK_GetFroClkFreq(1U);
1502 break;
1503
1504 default:
1505 freq = 0U;
1506 break;
1507 }
1508
1509 return freq / ((CLKCTL3->SENSEMAINCLKDIV & CLKCTL3_SENSEMAINCLKDIV_DIV_MASK) + 1U);
1510 }
1511
CLOCK_GetVdd2MediaBaseClkFreq(void)1512 uint32_t CLOCK_GetVdd2MediaBaseClkFreq(void)
1513 {
1514 uint32_t freq = 0U;
1515
1516 switch ((CLKCTL4->MD2BASECLKSEL) & CLKCTL4_MD2BASECLKSEL_SEL_MASK)
1517 {
1518 case CLKCTL4_MD2BASECLKSEL_SEL(0):
1519 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1520 break;
1521
1522 case CLKCTL4_MD2BASECLKSEL_SEL(1):
1523 freq = CLOCK_GetFroClkFreq(1U);
1524 break;
1525
1526 case CLKCTL4_MD2BASECLKSEL_SEL(2):
1527 freq = CLOCK_GetFroClkFreq(0U) / 3U;
1528 break;
1529
1530 case CLKCTL4_MD2BASECLKSEL_SEL(3):
1531 freq = CLOCK_GetLpOscFreq();
1532 break;
1533
1534 default:
1535 freq = 0U;
1536 break;
1537 }
1538
1539 return freq;
1540 }
1541
CLOCK_GetVddnMediaBaseClkFreq(void)1542 uint32_t CLOCK_GetVddnMediaBaseClkFreq(void)
1543 {
1544 uint32_t freq = 0U;
1545
1546 switch ((CLKCTL4->MDNBASECLKSEL) & CLKCTL4_MDNBASECLKSEL_SEL_MASK)
1547 {
1548 case CLKCTL4_MDNBASECLKSEL_SEL(0):
1549 freq = CLOCK_GetFroClkFreq(1U) / 3U;
1550 break;
1551
1552 case CLKCTL4_MDNBASECLKSEL_SEL(1):
1553 freq = CLOCK_GetFroClkFreq(1U);
1554 break;
1555
1556 case CLKCTL4_MDNBASECLKSEL_SEL(2):
1557 freq = CLOCK_GetFroClkFreq(0U) / 3U;
1558 break;
1559
1560 case CLKCTL4_MDNBASECLKSEL_SEL(3):
1561 freq = CLOCK_GetLpOscFreq();
1562 break;
1563
1564 default:
1565 freq = 0U;
1566 break;
1567 }
1568
1569 return freq;
1570 }
1571
CLOCK_GetMediaMainClkFreq(void)1572 uint32_t CLOCK_GetMediaMainClkFreq(void)
1573 {
1574 uint32_t freq = 0U;
1575
1576 switch ((CLKCTL4->MEDIAMAINCLKSEL) & CLKCTL4_MEDIAMAINCLKSEL_SEL_MASK)
1577 {
1578 case CLKCTL4_MEDIAMAINCLKSEL_SEL(0):
1579 freq = CLOCK_GetVdd2MediaBaseClkFreq();
1580 break;
1581
1582 case CLKCTL4_MEDIAMAINCLKSEL_SEL(1):
1583 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
1584 break;
1585
1586 case CLKCTL4_MEDIAMAINCLKSEL_SEL(2):
1587 freq = CLOCK_GetFroClkFreq(0U);
1588 break;
1589
1590 case CLKCTL4_MEDIAMAINCLKSEL_SEL(3):
1591 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
1592 break;
1593
1594 default:
1595 freq = 0U;
1596 break;
1597 }
1598
1599 return freq / ((CLKCTL4->MEDIAMAINCLKDIV & CLKCTL4_MEDIAMAINCLKDIV_DIV_MASK) + 1U);
1600 }
1601
CLOCK_GetMediaVddnClkFreq(void)1602 uint32_t CLOCK_GetMediaVddnClkFreq(void)
1603 {
1604 uint32_t freq = 0U;
1605
1606 switch ((CLKCTL4->MEDIAVDDNCLKSEL) & CLKCTL4_MEDIAVDDNCLKSEL_SEL_MASK)
1607 {
1608 case CLKCTL4_MEDIAVDDNCLKSEL_SEL(0):
1609 freq = CLOCK_GetVddnMediaBaseClkFreq();
1610 break;
1611
1612 case CLKCTL4_MEDIAVDDNCLKSEL_SEL(1):
1613 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
1614 break;
1615
1616 case CLKCTL4_MEDIAVDDNCLKSEL_SEL(2):
1617 freq = CLOCK_GetFroClkFreq(0U);
1618 break;
1619
1620 case CLKCTL4_MEDIAVDDNCLKSEL_SEL(3):
1621 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
1622 break;
1623
1624 default:
1625 freq = 0U;
1626 break;
1627 }
1628
1629 return freq / ((CLKCTL4->MEDIAVDDNCLKDIV & CLKCTL4_MEDIAVDDNCLKDIV_DIV_MASK) + 1U);
1630 }
1631
1632 /*! @brief Enable/Disable FRO2 clock output. */
CLOCK_EnableFro2ClkForDomain(uint32_t domainEnable)1633 void CLOCK_EnableFro2ClkForDomain(uint32_t domainEnable)
1634 {
1635 if (domainEnable != 0U)
1636 {
1637 /* Wait FRO stable first in case FRO just get powered on. */
1638 while ((CLKCTL3->FRO2CLKSTATUS & CLKCTL3_FRO2CLKSTATUS_CLK_OK_MASK) == 0U)
1639 {
1640 }
1641 }
1642 else
1643 {
1644 /* Do nothing */
1645 }
1646 CLKCTL3->FRO2MAXDOMAINEN = domainEnable & (uint32_t)kCLOCK_AllDomainEnable;
1647 }
1648
CLOCK_EnableMainPllPfdClkForDomain(clock_pfd_t pfd,uint32_t domainEnable)1649 void CLOCK_EnableMainPllPfdClkForDomain(clock_pfd_t pfd, uint32_t domainEnable)
1650 {
1651 uint32_t pfdIndex = (uint32_t)pfd;
1652 uint32_t pfdValue;
1653
1654 pfdValue = CLKCTL2->MAINPLL0PFDDOMAINEN & (~(0x7FUL << (8UL * pfdIndex)));
1655
1656 CLKCTL2->MAINPLL0PFDDOMAINEN = pfdValue | ((domainEnable & (uint32_t)kCLOCK_AllDomainEnable) << (8UL * pfdIndex));
1657 }
1658
CLOCK_EnableAudioPllPfdClkForDomain(clock_pfd_t pfd,uint32_t domainEnable)1659 void CLOCK_EnableAudioPllPfdClkForDomain(clock_pfd_t pfd, uint32_t domainEnable)
1660 {
1661 uint32_t pfdIndex = (uint32_t)pfd;
1662 uint32_t pfdValue;
1663
1664 pfdValue = CLKCTL2->AUDIOPLL0PFDDOMAINEN & (~(0x7FUL << (8UL * pfdIndex)));
1665
1666 CLKCTL2->AUDIOPLL0PFDDOMAINEN = pfdValue | ((domainEnable & (uint32_t)kCLOCK_AllDomainEnable) << (8UL * pfdIndex));
1667 }
1668
CLOCK_EnableAudioPllVcoClkForDomain(uint32_t domainEnable)1669 void CLOCK_EnableAudioPllVcoClkForDomain(uint32_t domainEnable)
1670 {
1671 CLKCTL2->AUDIOPLL0VCODOMAINEN = domainEnable & (uint32_t)kCLOCK_AllDomainEnable;
1672 }
1673
1674 /* Get LP_FLEXCOMM Clk */
1675 /*! brief Return Frequency of LP_Flexcomm functional Clock
1676 * param id : flexcomm index to get frequency.
1677 * return Frequency of Flexcomm functional Clock
1678 */
CLOCK_GetLPFlexCommClkFreq(uint32_t id)1679 uint32_t CLOCK_GetLPFlexCommClkFreq(uint32_t id)
1680 {
1681 uint32_t freq = 0U;
1682 uint32_t fcFclkSel = 0U;
1683 uint32_t clkSel = 0U;
1684
1685 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
1686 assert(id <= 13U);
1687
1688 fcFclkSel = CLKCTL0->FLEXCOMM[id].FCFCLKSEL;
1689
1690 if ((fcFclkSel & CLKCTL0_FCFCLKSEL_SEL_EN_MASK) == CLKCTL0_FCFCLKSEL_SEL_EN_MASK)
1691 {
1692 clkSel = (fcFclkSel & CLKCTL0_FCFCLKSEL_SEL_MASK) >> CLKCTL0_FCFCLKSEL_SEL_SHIFT;
1693 freq = CLOCK_GetFCClkFreq(clkSel);
1694 }
1695 else
1696 {
1697 freq = 0U;
1698 }
1699 #else
1700 assert((id <= 20U) && (id >= 17U));
1701
1702 fcFclkSel = CLKCTL1->FLEXCOMM[id - 17U].FCFCLKSEL;
1703 if ((fcFclkSel & CLKCTL1_FCFCLKSEL_SEL_EN_MASK) == CLKCTL1_FCFCLKSEL_SEL_EN_MASK)
1704 {
1705 clkSel = (fcFclkSel & CLKCTL1_FCFCLKSEL_SEL_MASK) >> CLKCTL1_FCFCLKSEL_SEL_SHIFT;
1706 switch (clkSel)
1707 {
1708 case 0U:
1709 freq = CLOCK_GetSenseBaseClkFreq() /
1710 ((CLKCTL1->FLEXCOMM[id - 17U].FCFCLKDIV & CLKCTL1_FCFCLKDIV_DIV_MASK) + 1U);
1711 break;
1712 case 1U:
1713 freq = CLOCK_GetFroClkFreq(2U) /
1714 ((CLKCTL1->FLEXCOMM[id - 17U].FCFCLKDIV & CLKCTL1_FCFCLKDIV_DIV_MASK) + 1U);
1715 break;
1716 case 2U:
1717 freq = CLOCK_GetFroClkFreq(1U) /
1718 ((CLKCTL1->FLEXCOMM[id - 17U].FCFCLKDIV & CLKCTL1_FCFCLKDIV_DIV_MASK) + 1U);
1719 break;
1720 case 3U:
1721 freq = CLOCK_GetWakeClk32KFreq() /
1722 ((CLKCTL1->FLEXCOMM[id - 17U].FCFCLKDIV & CLKCTL1_FCFCLKDIV_DIV_MASK) + 1U);
1723 break;
1724 default:
1725 freq = 0U;
1726 break;
1727 }
1728 }
1729 else
1730 {
1731 freq = 0U;
1732 }
1733 #endif /* FSL_CLOCK_DRIVER_COMPUTE */
1734 return freq;
1735 }
1736
CLOCK_GetMainPllFreq(void)1737 uint32_t CLOCK_GetMainPllFreq(void)
1738 {
1739 uint32_t freq = 0U;
1740 uint64_t freqTmp;
1741
1742 switch ((CLKCTL2->MAINPLL0CLKSEL) & CLKCTL2_MAINPLL0CLKSEL_SEL_MASK)
1743 {
1744 case CLKCTL2_MAINPLL0CLKSEL_SEL(0):
1745 freq = CLOCK_GetFroClkFreq(1U) / 8U;
1746 break;
1747 case CLKCTL2_MAINPLL0CLKSEL_SEL(1):
1748 freq = CLOCK_GetXtalInClkFreq();
1749 break;
1750 default:
1751 /* Added comments to prevent the violation of MISRA C-2012 rule. */
1752 break;
1753 }
1754
1755 if (((CLKCTL2->MAINPLL0CTL0) & CLKCTL2_MAINPLL0CTL0_BYPASS_MASK) == 0U)
1756 {
1757 /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */
1758 freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL2->MAINPLL0NUM))) / ((uint64_t)(CLKCTL2->MAINPLL0DENOM));
1759 freq *= ((CLKCTL2->MAINPLL0CTL0) & CLKCTL2_MAINPLL0CTL0_MULT_MASK) >> CLKCTL2_MAINPLL0CTL0_MULT_SHIFT;
1760 freq += (uint32_t)freqTmp;
1761 }
1762 return freq;
1763 }
1764
CLOCK_GetMainPfdFreq(clock_pfd_t pfd)1765 uint32_t CLOCK_GetMainPfdFreq(clock_pfd_t pfd)
1766 {
1767 uint32_t freq = CLOCK_GetMainPllFreq();
1768
1769 if (((CLKCTL2->MAINPLL0CTL0) & CLKCTL2_MAINPLL0CTL0_BYPASS_MASK) == 0U)
1770 {
1771 switch (pfd)
1772 {
1773 case kCLOCK_Pfd0:
1774 freq = (uint32_t)((uint64_t)freq * 18ULL /
1775 ((CLKCTL2->MAINPLL0PFD & CLKCTL2_MAINPLL0PFD_PFD0_MASK) >>
1776 CLKCTL2_MAINPLL0PFD_PFD0_SHIFT));
1777 break;
1778
1779 case kCLOCK_Pfd1:
1780 freq = (uint32_t)((uint64_t)freq * 18ULL /
1781 ((CLKCTL2->MAINPLL0PFD & CLKCTL2_MAINPLL0PFD_PFD1_MASK) >>
1782 CLKCTL2_MAINPLL0PFD_PFD1_SHIFT));
1783 break;
1784
1785 case kCLOCK_Pfd2:
1786 freq = (uint32_t)((uint64_t)freq * 18ULL /
1787 ((CLKCTL2->MAINPLL0PFD & CLKCTL2_MAINPLL0PFD_PFD2_MASK) >>
1788 CLKCTL2_MAINPLL0PFD_PFD2_SHIFT));
1789 break;
1790
1791 case kCLOCK_Pfd3:
1792 freq = (uint32_t)((uint64_t)freq * 18ULL /
1793 ((CLKCTL2->MAINPLL0PFD & CLKCTL2_MAINPLL0PFD_PFD3_MASK) >>
1794 CLKCTL2_MAINPLL0PFD_PFD3_SHIFT));
1795 break;
1796
1797 default:
1798 freq = 0U;
1799 break;
1800 }
1801 }
1802
1803 return freq;
1804 }
1805
CLOCK_GetAudioPllFreq(void)1806 uint32_t CLOCK_GetAudioPllFreq(void)
1807 {
1808 uint32_t freq = 0U;
1809 uint64_t freqTmp;
1810
1811 switch ((CLKCTL2->AUDIOPLL0CLKSEL) & CLKCTL2_AUDIOPLL0CLKSEL_SEL_MASK)
1812 {
1813 case CLKCTL2_AUDIOPLL0CLKSEL_SEL(0):
1814 freq = CLOCK_GetFroClkFreq(1U) / 8U;
1815 break;
1816 case CLKCTL2_AUDIOPLL0CLKSEL_SEL(1):
1817 freq = CLOCK_GetXtalInClkFreq();
1818 break;
1819 default:
1820 freq = 0U;
1821 break;
1822 }
1823
1824 if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL)
1825 {
1826 /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */
1827 freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL2->AUDIOPLL0NUM))) / ((uint64_t)(CLKCTL2->AUDIOPLL0DENOM));
1828 freq *= ((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_MULT_MASK) >> CLKCTL2_AUDIOPLL0CTL0_MULT_SHIFT;
1829 freq += (uint32_t)freqTmp;
1830 }
1831 return freq;
1832 }
1833
CLOCK_GetAudioPfdFreq(clock_pfd_t pfd)1834 uint32_t CLOCK_GetAudioPfdFreq(clock_pfd_t pfd)
1835 {
1836 uint32_t freq = CLOCK_GetAudioPllFreq();
1837
1838 if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL)
1839 {
1840 switch (pfd)
1841 {
1842 case kCLOCK_Pfd0:
1843 freq = (uint32_t)((uint64_t)freq * 18ULL /
1844 ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD0_MASK) >>
1845 CLKCTL2_AUDIOPLL0PFD_PFD0_SHIFT));
1846 break;
1847
1848 case kCLOCK_Pfd1:
1849 freq = (uint32_t)((uint64_t)freq * 18ULL /
1850 ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD1_MASK) >>
1851 CLKCTL2_AUDIOPLL0PFD_PFD1_SHIFT));
1852 break;
1853
1854 case kCLOCK_Pfd2:
1855 freq = (uint32_t)((uint64_t)freq * 18ULL /
1856 ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD2_MASK) >>
1857 CLKCTL2_AUDIOPLL0PFD_PFD2_SHIFT));
1858 break;
1859
1860 case kCLOCK_Pfd3:
1861 freq = (uint32_t)((uint64_t)freq * 18ULL /
1862 ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD3_MASK) >>
1863 CLKCTL2_AUDIOPLL0PFD_PFD3_SHIFT));
1864 break;
1865
1866 default:
1867 freq = 0U;
1868 break;
1869 }
1870 }
1871
1872 return freq;
1873 }
1874
CLOCK_GetWakeClk32KFreq(void)1875 uint32_t CLOCK_GetWakeClk32KFreq(void)
1876 {
1877 uint32_t freq = 0U;
1878 switch (CLKCTL3->WAKE32KCLKSEL & CLKCTL3_WAKE32KCLKSEL_SEL_MASK)
1879 {
1880 case CLKCTL3_WAKE32KCLKSEL_SEL(0):
1881 freq = CLOCK_GetOsc32KFreq();
1882 break;
1883 case CLKCTL3_WAKE32KCLKSEL_SEL(1):
1884 freq = CLOCK_GetLpOscFreq();
1885 break;
1886 default:
1887 freq = 0U;
1888 break;
1889 }
1890 return freq / ((CLKCTL3->WAKE32KCLKDIV & CLKCTL3_WAKE32KCLKDIV_DIV_MASK) + 1U);
1891 }
1892
CLOCK_GetXspiClkFreq(uint32_t id)1893 uint32_t CLOCK_GetXspiClkFreq(uint32_t id)
1894 {
1895 uint32_t freq = 0U;
1896
1897 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
1898 if (id == 0U)
1899 {
1900 if ((CLKCTL0->XSPI0FCLKSEL & CLKCTL0_XSPI0FCLKSEL_SEL_EN_MASK) != 0U)
1901 {
1902 switch (CLKCTL0->XSPI0FCLKSEL & CLKCTL0_XSPI0FCLKSEL_SEL_MASK)
1903 {
1904 case CLKCTL0_XSPI0FCLKSEL_SEL(0):
1905 freq = CLOCK_GetVddnComBaseClkFreq();
1906 break;
1907 case CLKCTL0_XSPI0FCLKSEL_SEL(1):
1908 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd0);
1909 break;
1910 case CLKCTL0_XSPI0FCLKSEL_SEL(2):
1911 freq = CLOCK_GetFroClkFreq(0U);
1912 break;
1913 case CLKCTL0_XSPI0FCLKSEL_SEL(3):
1914 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd1);
1915 break;
1916 default:
1917 /* Added comments to prevent the violation of MISRA C-2012 rule. */
1918 break;
1919 }
1920 freq = freq / ((CLKCTL0->XSPI0FCLKDIV & CLKCTL0_XSPI0FCLKDIV_DIV_MASK) + 1U);
1921 }
1922 else
1923 {
1924 freq = 0U;
1925 }
1926 }
1927 else if (id == 1U)
1928 {
1929 if ((CLKCTL0->XSPI1FCLKSEL & CLKCTL0_XSPI1FCLKSEL_SEL_EN_MASK) != 0U)
1930 {
1931 switch (CLKCTL0->XSPI1FCLKSEL & CLKCTL0_XSPI1FCLKSEL_SEL_MASK)
1932 {
1933 case CLKCTL0_XSPI1FCLKSEL_SEL(0):
1934 freq = CLOCK_GetVddnComBaseClkFreq();
1935 break;
1936 case CLKCTL0_XSPI1FCLKSEL_SEL(1):
1937 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd1);
1938 break;
1939 case CLKCTL0_XSPI1FCLKSEL_SEL(2):
1940 freq = CLOCK_GetFroClkFreq(0U);
1941 break;
1942 case CLKCTL0_XSPI1FCLKSEL_SEL(3):
1943 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
1944 break;
1945 default:
1946 /* Added comments to prevent the violation of MISRA C-2012 rule. */
1947 break;
1948 }
1949 freq = freq / ((CLKCTL0->XSPI1FCLKDIV & CLKCTL0_XSPI1FCLKDIV_DIV_MASK) + 1U);
1950 }
1951 else
1952 {
1953 freq = 0U;
1954 }
1955 }
1956 else if (id == 2U)
1957 #else
1958 if (id == 2U)
1959 #endif /* FSL_CLOCK_DRIVER_COMPUTE */
1960 {
1961 if ((CLKCTL4->XSPI2FCLKSEL & CLKCTL4_XSPI2FCLKSEL_SEL_EN_MASK) != 0U)
1962 {
1963 switch (CLKCTL4->XSPI2FCLKSEL & CLKCTL4_XSPI2FCLKSEL_SEL_MASK)
1964 {
1965 case CLKCTL4_XSPI2FCLKSEL_SEL(0):
1966 freq = CLOCK_GetVddnComBaseClkFreq();
1967 break;
1968 case CLKCTL4_XSPI2FCLKSEL_SEL(1):
1969 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd1);
1970 break;
1971 case CLKCTL4_XSPI2FCLKSEL_SEL(2):
1972 freq = CLOCK_GetFroClkFreq(0U);
1973 break;
1974 case CLKCTL4_XSPI2FCLKSEL_SEL(3):
1975 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd3);
1976 break;
1977 default:
1978 freq = 0U;
1979 break;
1980 }
1981 freq = freq / ((CLKCTL4->XSPI2FCLKDIV & CLKCTL4_XSPI2FCLKDIV_DIV_MASK) + 1U);
1982 }
1983 else
1984 {
1985 freq = 0U;
1986 }
1987 }
1988 else
1989 {
1990 freq = 0U;
1991 }
1992
1993 return freq;
1994 }
1995
1996 #if defined(FSL_CLOCK_DRIVER_COMPUTE)
CLOCK_GetSctClkFreq(void)1997 uint32_t CLOCK_GetSctClkFreq(void)
1998 {
1999 uint32_t freq = 0U;
2000 if ((CLKCTL0->SCTFCLKSEL & CLKCTL0_SCTFCLKSEL_SEL_EN_MASK) != 0U)
2001 {
2002 switch (CLKCTL0->SCTFCLKSEL & CLKCTL0_SCTFCLKSEL_SEL_MASK)
2003 {
2004 case CLKCTL0_SCTFCLKSEL_SEL(0):
2005 freq = CLOCK_GetComputeBaseClkFreq();
2006 break;
2007 case CLKCTL0_SCTFCLKSEL_SEL(1):
2008 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2009 break;
2010 case CLKCTL0_SCTFCLKSEL_SEL(2):
2011 freq = CLOCK_GetFroClkFreq(0U);
2012 break;
2013 case CLKCTL0_SCTFCLKSEL_SEL(3):
2014 freq = CLOCK_GetFroClkFreq(0U) / 6U;
2015 break;
2016 default:
2017 freq = 0U;
2018 break;
2019 }
2020 }
2021 return freq / ((CLKCTL0->SCTFCLKDIV & CLKCTL0_SCTFCLKDIV_DIV_MASK) + 1U);
2022 }
2023
CLOCK_GetUtickClkFreq(void)2024 uint32_t CLOCK_GetUtickClkFreq(void)
2025 {
2026 uint32_t freq = 0U;
2027
2028 if ((CLKCTL0->UTICK0FCLKSEL & CLKCTL0_UTICK0FCLKSEL_SEL_EN_MASK) != 0U)
2029 {
2030 switch (CLKCTL0->UTICK0FCLKSEL & CLKCTL0_UTICK0FCLKSEL_SEL_MASK)
2031 {
2032 case CLKCTL0_UTICK0FCLKSEL_SEL(0):
2033 freq = CLOCK_GetComputeBaseClkFreq();
2034 break;
2035 case CLKCTL0_UTICK0FCLKSEL_SEL(1):
2036 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2037 break;
2038 case CLKCTL0_UTICK0FCLKSEL_SEL(2):
2039 freq = CLOCK_GetFroClkFreq(0U);
2040 break;
2041 case CLKCTL0_UTICK0FCLKSEL_SEL(3):
2042 freq = CLOCK_GetFroClkFreq(1U) / 2U;
2043 break;
2044 default:
2045 freq = 0U;
2046 break;
2047 }
2048 }
2049 return freq / ((CLKCTL0->UTICK0FCLKDIV & CLKCTL0_UTICK0FCLKDIV_DIV_MASK) + 1U);
2050 }
2051
CLOCK_GetWdtClkFreq(uint32_t id)2052 uint32_t CLOCK_GetWdtClkFreq(uint32_t id)
2053 {
2054 uint32_t freq = 0U;
2055
2056 if (id == 0U)
2057 {
2058 if ((CLKCTL0->WWDT0FCLKSEL & CLKCTL0_WWDT0FCLKSEL_SEL_EN_MASK) != 0U)
2059 {
2060 switch (CLKCTL0->WWDT0FCLKSEL & CLKCTL0_WWDT0FCLKSEL_SEL_MASK)
2061 {
2062 case CLKCTL0_WWDT0FCLKSEL_SEL(0):
2063 freq = CLOCK_GetLpOscFreq();
2064 break;
2065 default:
2066 freq = 0U;
2067 break;
2068 }
2069 }
2070 }
2071 else if (id == 1U)
2072 {
2073 if ((CLKCTL0->WWDT1FCLKSEL & CLKCTL0_WWDT1FCLKSEL_SEL_EN_MASK) != 0U)
2074 {
2075 switch (CLKCTL0->WWDT1FCLKSEL & CLKCTL0_WWDT1FCLKSEL_SEL_MASK)
2076 {
2077 case CLKCTL0_WWDT1FCLKSEL_SEL(0):
2078 freq = CLOCK_GetLpOscFreq();
2079 break;
2080 default:
2081 freq = 0U;
2082 break;
2083 }
2084 }
2085 }
2086 else
2087 {
2088 freq = 0U;
2089 }
2090
2091 return freq;
2092 }
2093
CLOCK_GetSystickClkFreq(void)2094 uint32_t CLOCK_GetSystickClkFreq(void)
2095 {
2096 uint32_t freq = 0U;
2097
2098 if ((CLKCTL0->SYSTICKFCLKSEL & CLKCTL0_SYSTICKFCLKSEL_SEL_EN_MASK) != 0U)
2099 {
2100 switch (CLKCTL0->SYSTICKFCLKSEL & CLKCTL0_SYSTICKFCLKSEL_SEL_MASK)
2101 {
2102 case CLKCTL0_SYSTICKFCLKSEL_SEL(0):
2103 freq = CLOCK_GetComputeBaseClkFreq();
2104 break;
2105 case CLKCTL0_SYSTICKFCLKSEL_SEL(1):
2106 freq = CLOCK_GetLpOscFreq();
2107 break;
2108 case CLKCTL0_SYSTICKFCLKSEL_SEL(2):
2109 freq = CLOCK_GetWakeClk32KFreq();
2110 break;
2111 case CLKCTL0_SYSTICKFCLKSEL_SEL(3):
2112 freq = CLOCK_GetXtalInClkFreq();
2113 break;
2114 default:
2115 freq = 0U;
2116 break;
2117 }
2118 }
2119 return freq / ((CLKCTL0->SYSTICKFCLKDIV & CLKCTL0_SYSTICKFCLKDIV_DIV_MASK) + 1U);
2120 }
2121
CLOCK_GetCTimerClkFreq(uint32_t id)2122 uint32_t CLOCK_GetCTimerClkFreq(uint32_t id)
2123 {
2124 uint32_t freq = 0U;
2125
2126 if ((CLKCTL0->CTIMERFCLKSEL[id] & CLKCTL0_CTIMERFCLKSEL_SEL_EN_MASK) != 0U)
2127 {
2128 switch ((CLKCTL0->CTIMERFCLKSEL[id]) & CLKCTL0_CTIMERFCLKSEL_SEL_MASK)
2129 {
2130 case CLKCTL0_CTIMERFCLKSEL_SEL(0):
2131 freq = CLOCK_GetComputeBaseClkFreq();
2132 break;
2133
2134 case CLKCTL0_CTIMERFCLKSEL_SEL(1):
2135 freq = CLOCK_GetComputeAudioClkFreq();
2136 break;
2137
2138 case CLKCTL0_CTIMERFCLKSEL_SEL(2):
2139 freq = CLOCK_GetFroClkFreq(0U);
2140 break;
2141
2142 case CLKCTL0_CTIMERFCLKSEL_SEL(3):
2143 freq = CLOCK_GetWakeClk32KFreq();
2144 break;
2145
2146 default:
2147 freq = 0U;
2148 break;
2149 }
2150 }
2151
2152 return freq / ((CLKCTL0->CTIMERCLKDIV[id] & CLKCTL0_CTIMERCLKDIV_DIV_MASK) + 1U);
2153 }
2154
CLOCK_GetI3cClkFreq(void)2155 uint32_t CLOCK_GetI3cClkFreq(void)
2156 {
2157 uint32_t freq = 0U;
2158
2159 if ((CLKCTL0->I3C01FCLKSEL & CLKCTL0_I3C01FCLKSEL_SEL_EN_MASK) != 0U)
2160 {
2161 switch ((CLKCTL0->I3C01FCLKSEL) & CLKCTL0_I3C01FCLKSEL_SEL_MASK)
2162 {
2163 case CLKCTL0_I3C01FCLKSEL_SEL(0):
2164 freq = CLOCK_GetComputeBaseClkFreq();
2165 break;
2166
2167 case CLKCTL0_I3C01FCLKSEL_SEL(1):
2168 freq = CLOCK_GetFroClkFreq(0U);
2169 break;
2170
2171 case CLKCTL0_I3C01FCLKSEL_SEL(2):
2172 freq = CLOCK_GetFroClkFreq(1U) / 8U;
2173 break;
2174
2175 case CLKCTL0_I3C01FCLKSEL_SEL(3):
2176 freq = CLOCK_GetSysOscFreq();
2177 break;
2178
2179 default:
2180 freq = 0U;
2181 break;
2182 }
2183 }
2184
2185 return freq / ((CLKCTL0->I3C01FCLKDIV & CLKCTL0_I3C01FCLKDIV_DIV_MASK) + 1U);
2186 }
2187
CLOCK_GetTrngClkFreq(void)2188 uint32_t CLOCK_GetTrngClkFreq(void)
2189 {
2190 uint32_t freq = 0U;
2191
2192 if ((CLKCTL0->TRNGFCLKSEL & CLKCTL0_TRNGFCLKSEL_SEL_EN_MASK) != 0U)
2193 {
2194 switch ((CLKCTL0->TRNGFCLKSEL) & CLKCTL0_TRNGFCLKSEL_SEL_MASK)
2195 {
2196 case CLKCTL0_TRNGFCLKSEL_SEL(0):
2197 freq = CLOCK_GetComputeBaseClkFreq();
2198 break;
2199
2200 case CLKCTL0_TRNGFCLKSEL_SEL(1):
2201 freq = CLOCK_GetFroClkFreq(1U) / 2U;
2202 break;
2203
2204 case CLKCTL0_TRNGFCLKSEL_SEL(2):
2205 freq = CLOCK_GetFroClkFreq(1U) / 8U;
2206 break;
2207
2208 case CLKCTL0_TRNGFCLKSEL_SEL(3):
2209 freq = CLOCK_GetFroClkFreq(1U) / 3U;
2210 break;
2211
2212 default:
2213 freq = 0U;
2214 break;
2215 }
2216 }
2217
2218 return freq / ((CLKCTL0->TRNGFCLKDIV & CLKCTL0_TRNGFCLKDIV_DIV_MASK) + 1U);
2219 }
2220
CLOCK_GetTpiuClkFreq(void)2221 uint32_t CLOCK_GetTpiuClkFreq(void)
2222 {
2223 uint32_t freq = 0U;
2224
2225 if ((CLKCTL0->TPIUFCLKSEL & CLKCTL0_TPIUFCLKSEL_SEL_EN_MASK) != 0U)
2226 {
2227 switch ((CLKCTL0->TPIUFCLKSEL) & CLKCTL0_TPIUFCLKSEL_SEL_MASK)
2228 {
2229 case CLKCTL0_TPIUFCLKSEL_SEL(0):
2230 freq = CLOCK_GetComputeBaseClkFreq();
2231 break;
2232
2233 case CLKCTL0_TPIUFCLKSEL_SEL(1):
2234 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2235 break;
2236
2237 case CLKCTL0_TPIUFCLKSEL_SEL(2):
2238 freq = CLOCK_GetFroClkFreq(0U);
2239 break;
2240
2241 case CLKCTL0_TPIUFCLKSEL_SEL(3):
2242 freq = CLOCK_GetFroClkFreq(0U) / 6U;
2243 break;
2244
2245 default:
2246 freq = 0U;
2247 break;
2248 }
2249 }
2250
2251 return freq / ((CLKCTL0->TPIUCLKDIV & CLKCTL0_TPIUCLKDIV_DIV_MASK) + 1U);
2252 }
2253
CLOCK_GetSaiClkFreq(void)2254 uint32_t CLOCK_GetSaiClkFreq(void)
2255 {
2256 uint32_t freq = 0U;
2257
2258 if ((CLKCTL0->SAI012FCLKSEL & CLKCTL0_SAI012FCLKSEL_SEL_EN_MASK) != 0U)
2259 {
2260 switch ((CLKCTL0->SAI012FCLKSEL) & CLKCTL0_SAI012FCLKSEL_SEL_MASK)
2261 {
2262 case CLKCTL0_SAI012FCLKSEL_SEL(0):
2263 freq = CLOCK_GetComputeBaseClkFreq();
2264 break;
2265
2266 case CLKCTL0_SAI012FCLKSEL_SEL(1):
2267 freq = CLOCK_GetFroClkFreq(2U) / 8U;
2268 break;
2269
2270 case CLKCTL0_SAI012FCLKSEL_SEL(2):
2271 freq = CLOCK_GetFroClkFreq(0U);
2272 break;
2273
2274 case CLKCTL0_SAI012FCLKSEL_SEL(3):
2275 freq = CLOCK_GetComputeAudioClkFreq();
2276 break;
2277
2278 default:
2279 freq = 0U;
2280 break;
2281 }
2282 }
2283
2284 return freq / ((CLKCTL0->SAI012CLKDIV & CLKCTL0_SAI012CLKDIV_DIV_MASK) + 1U);
2285 }
2286
CLOCK_GetClockOutClkFreq(void)2287 uint32_t CLOCK_GetClockOutClkFreq(void)
2288 {
2289 uint32_t freq = 0U;
2290
2291 if ((CLKCTL0->CLKOUTCLKSEL & CLKCTL0_CLKOUTCLKSEL_SEL_EN_MASK) != 0U)
2292 {
2293 switch ((CLKCTL0->CLKOUTCLKSEL) & CLKCTL0_CLKOUTCLKSEL_SEL_MASK)
2294 {
2295 case CLKCTL0_CLKOUTCLKSEL_SEL(0):
2296 freq = CLOCK_GetVdd2ComBaseClkFreq();
2297 break;
2298
2299 case CLKCTL0_CLKOUTCLKSEL_SEL(1):
2300 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2301 break;
2302
2303 case CLKCTL0_CLKOUTCLKSEL_SEL(2):
2304 freq = CLOCK_GetFroClkFreq(0U);
2305 break;
2306
2307 case CLKCTL0_CLKOUTCLKSEL_SEL(3):
2308 freq = CLOCK_GetFroClkFreq(1U);
2309 break;
2310
2311 default:
2312 freq = 0U;
2313 break;
2314 }
2315 }
2316
2317 return freq / ((CLKCTL0->CLKOUTCLKDIV & CLKCTL0_CLKOUTCLKDIV_DIV_MASK) + 1U);
2318 }
2319 #else /* Sense domain. */
CLOCK_GetUtickClkFreq(void)2320 uint32_t CLOCK_GetUtickClkFreq(void)
2321 {
2322 uint32_t freq = 0U;
2323
2324 if ((CLKCTL1->UTICK1FCLKSEL & CLKCTL1_UTICK1FCLKSEL_SEL_EN_MASK) != 0U)
2325 {
2326 switch (CLKCTL1->UTICK1FCLKSEL & CLKCTL1_UTICK1FCLKSEL_SEL_MASK)
2327 {
2328 case CLKCTL1_UTICK1FCLKSEL_SEL(0):
2329 freq = CLOCK_GetSenseBaseClkFreq();
2330 break;
2331 case CLKCTL1_UTICK1FCLKSEL_SEL(1):
2332 freq = CLOCK_GetLpOscFreq();
2333 break;
2334 case CLKCTL1_UTICK1FCLKSEL_SEL(2):
2335 freq = CLOCK_GetFroClkFreq(0U);
2336 break;
2337 case CLKCTL1_UTICK1FCLKSEL_SEL(3):
2338 freq = CLOCK_GetFroClkFreq(1U) / 2U;
2339 break;
2340 default:
2341 freq = 0U;
2342 break;
2343 }
2344 }
2345 return freq / ((CLKCTL1->UTICK1CLKDIV & CLKCTL1_UTICK1CLKDIV_DIV_MASK) + 1U);
2346 }
2347
CLOCK_GetWdtClkFreq(uint32_t id)2348 uint32_t CLOCK_GetWdtClkFreq(uint32_t id)
2349 {
2350 uint32_t freq = 0U;
2351
2352 if (id == 2U)
2353 {
2354 if ((CLKCTL1->WWDT2FCLKSEL & CLKCTL1_WWDT2FCLKSEL_SEL_EN_MASK) != 0U)
2355 {
2356 switch (CLKCTL1->WWDT2FCLKSEL & CLKCTL1_WWDT2FCLKSEL_SEL_MASK)
2357 {
2358 case CLKCTL1_WWDT2FCLKSEL_SEL(0):
2359 freq = CLOCK_GetLpOscFreq();
2360 break;
2361 default:
2362 freq = 0U;
2363 break;
2364 }
2365 }
2366 }
2367 else if (id == 3U)
2368 {
2369 if ((CLKCTL1->WWDT3FCLKSEL & CLKCTL1_WWDT3FCLKSEL_SEL_EN_MASK) != 0U)
2370 {
2371 switch (CLKCTL1->WWDT3FCLKSEL & CLKCTL1_WWDT3FCLKSEL_SEL_MASK)
2372 {
2373 case CLKCTL1_WWDT3FCLKSEL_SEL(0):
2374 freq = CLOCK_GetLpOscFreq();
2375 break;
2376 default:
2377 freq = 0U;
2378 break;
2379 }
2380 }
2381 }
2382
2383 else
2384 {
2385 freq = 0U;
2386 }
2387
2388 return freq;
2389 }
2390
CLOCK_GetSystickClkFreq(void)2391 uint32_t CLOCK_GetSystickClkFreq(void)
2392 {
2393 uint32_t freq = 0U;
2394
2395 if ((CLKCTL1->SYSTICKFCLKSEL & CLKCTL1_SYSTICKFCLKSEL_SEL_EN_MASK) != 0U)
2396 {
2397 switch (CLKCTL1->SYSTICKFCLKSEL & CLKCTL1_SYSTICKFCLKSEL_SEL_MASK)
2398 {
2399 case CLKCTL1_SYSTICKFCLKSEL_SEL(0):
2400 freq = CLOCK_GetSenseBaseClkFreq();
2401 break;
2402 case CLKCTL1_SYSTICKFCLKSEL_SEL(1):
2403 freq = CLOCK_GetLpOscFreq();
2404 break;
2405 case CLKCTL1_SYSTICKFCLKSEL_SEL(2):
2406 freq = CLOCK_GetWakeClk32KFreq();
2407 break;
2408 case CLKCTL1_SYSTICKFCLKSEL_SEL(3):
2409 freq = CLOCK_GetXtalInClkFreq();
2410 break;
2411 default:
2412 freq = 0U;
2413 break;
2414 }
2415 }
2416 return freq / ((CLKCTL1->SYSTICKFCLKDIV & CLKCTL1_SYSTICKFCLKDIV_DIV_MASK) + 1U);
2417 }
2418
CLOCK_GetCTimerClkFreq(uint32_t id)2419 uint32_t CLOCK_GetCTimerClkFreq(uint32_t id)
2420 {
2421 uint32_t freq = 0U;
2422 assert(id >= 5U);
2423
2424 if ((CLKCTL1->CTIMERFCLKSEL[id - 5U] & CLKCTL1_CTIMERFCLKSEL_SEL_EN_MASK) != 0U)
2425 {
2426 switch ((CLKCTL1->CTIMERFCLKSEL[id - 5U]) & CLKCTL1_CTIMERFCLKSEL_SEL_MASK)
2427 {
2428 case CLKCTL1_CTIMERFCLKSEL_SEL(0):
2429 freq = CLOCK_GetSenseBaseClkFreq();
2430 break;
2431
2432 case CLKCTL1_CTIMERFCLKSEL_SEL(1):
2433 freq = CLOCK_GetSenseAudioClkFreq();
2434 break;
2435
2436 case CLKCTL1_CTIMERFCLKSEL_SEL(2):
2437 freq = CLOCK_GetFroClkFreq(2U);
2438 break;
2439
2440 case CLKCTL1_CTIMERFCLKSEL_SEL(3):
2441 freq = CLOCK_GetWakeClk32KFreq();
2442 break;
2443
2444 default:
2445 freq = 0U;
2446 break;
2447 }
2448 freq = freq / ((CLKCTL1->CTIMERCLKDIV[id - 5U] & CLKCTL1_CTIMERCLKDIV_DIV_MASK) + 1U);
2449 }
2450
2451 return freq;
2452 }
2453
CLOCK_GetI3cClkFreq(void)2454 uint32_t CLOCK_GetI3cClkFreq(void)
2455 {
2456 uint32_t freq = 0U;
2457
2458 if ((CLKCTL1->I3C23FCLKSEL & CLKCTL1_I3C23FCLKSEL_SEL_EN_MASK) != 0U)
2459 {
2460 switch ((CLKCTL1->I3C23FCLKSEL) & CLKCTL1_I3C23FCLKSEL_SEL_MASK)
2461 {
2462 case CLKCTL1_I3C23FCLKSEL_SEL(0):
2463 freq = CLOCK_GetSenseBaseClkFreq();
2464 break;
2465
2466 case CLKCTL1_I3C23FCLKSEL_SEL(1):
2467 freq = CLOCK_GetFroClkFreq(2U);
2468 break;
2469
2470 case CLKCTL1_I3C23FCLKSEL_SEL(2):
2471 freq = CLOCK_GetFroClkFreq(1U) / 8U;
2472 break;
2473
2474 case CLKCTL1_I3C23FCLKSEL_SEL(3):
2475 freq = CLOCK_GetXtalInClkFreq();
2476 break;
2477
2478 default:
2479 freq = 0U;
2480 break;
2481 }
2482 }
2483
2484 return freq / ((CLKCTL1->I3C23FCLKDIV & CLKCTL1_I3C23FCLKDIV_DIV_MASK) + 1U);
2485 }
2486
CLOCK_GetSaiClkFreq(void)2487 uint32_t CLOCK_GetSaiClkFreq(void)
2488 {
2489 uint32_t freq = 0U;
2490
2491 if ((CLKCTL1->SAI3FCLKSEL & CLKCTL1_SAI3FCLKSEL_SEL_EN_MASK) != 0U)
2492 {
2493 switch ((CLKCTL1->SAI3FCLKSEL) & CLKCTL1_SAI3FCLKSEL_SEL_MASK)
2494 {
2495 case CLKCTL1_SAI3FCLKSEL_SEL(0):
2496 freq = CLOCK_GetSenseBaseClkFreq();
2497 break;
2498
2499 case CLKCTL1_SAI3FCLKSEL_SEL(1):
2500 freq = CLOCK_GetFroClkFreq(2U) / 8U;
2501 break;
2502
2503 case CLKCTL1_SAI3FCLKSEL_SEL(2):
2504 freq = CLOCK_GetFroClkFreq(2U);
2505 break;
2506
2507 case CLKCTL1_SAI3FCLKSEL_SEL(3):
2508 freq = CLOCK_GetSenseAudioClkFreq();
2509 break;
2510
2511 default:
2512 freq = 0U;
2513 break;
2514 }
2515 }
2516
2517 return freq / ((CLKCTL1->SAI3CLKDIV & CLKCTL1_SAI3CLKDIV_DIV_MASK) + 1U);
2518 }
2519
2520 #endif /* FSL_CLOCK_DRIVER_COMPUTE */
CLOCK_GetVdd1ClockOutClkFreq(void)2521 uint32_t CLOCK_GetVdd1ClockOutClkFreq(void)
2522 {
2523 uint32_t freq = 0U;
2524
2525 if ((CLKCTL3->CLKOUTCLKSEL & CLKCTL3_CLKOUTCLKSEL_SEL_EN_MASK) != 0U)
2526 {
2527 switch ((CLKCTL3->CLKOUTCLKSEL) & CLKCTL3_CLKOUTCLKSEL_SEL_MASK)
2528 {
2529 case CLKCTL3_CLKOUTCLKSEL_SEL(0):
2530 freq = CLOCK_GetSenseBaseClkFreq();
2531 break;
2532
2533 case CLKCTL3_CLKOUTCLKSEL_SEL(1):
2534 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2535 break;
2536
2537 case CLKCTL3_CLKOUTCLKSEL_SEL(2):
2538 freq = CLOCK_GetFroClkFreq(0U);
2539 break;
2540
2541 case CLKCTL3_CLKOUTCLKSEL_SEL(3):
2542 freq = CLOCK_GetFroClkFreq(1U);
2543 break;
2544
2545 default:
2546 freq = 0U;
2547 break;
2548 }
2549 }
2550
2551 return freq / ((CLKCTL3->CLKOUTCLKDIV & CLKCTL3_CLKOUTCLKDIV_DIV_MASK) + 1U);
2552 }
2553
CLOCK_GetAdcClkFreq(void)2554 uint32_t CLOCK_GetAdcClkFreq(void)
2555 {
2556 uint32_t freq = 0U;
2557
2558 if ((CLKCTL3->SARADCFCLKSEL & CLKCTL3_SARADCFCLKSEL_SEL_EN_MASK) != 0U)
2559 {
2560 switch ((CLKCTL3->SARADCFCLKSEL) & CLKCTL3_SARADCFCLKSEL_SEL_MASK)
2561 {
2562 case CLKCTL3_SARADCFCLKSEL_SEL(0):
2563 freq = CLOCK_GetSenseBaseClkFreq();
2564 break;
2565
2566 case CLKCTL3_SARADCFCLKSEL_SEL(1):
2567 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd1);
2568 break;
2569
2570 case CLKCTL3_SARADCFCLKSEL_SEL(2):
2571 freq = CLOCK_GetFroClkFreq(2U);
2572 break;
2573
2574 case CLKCTL3_SARADCFCLKSEL_SEL(3):
2575 freq = CLOCK_GetXtalInClkFreq();
2576 break;
2577
2578 default:
2579 freq = 0U;
2580 break;
2581 }
2582 }
2583
2584 return freq / ((CLKCTL3->SARADCFCLKDIV & CLKCTL3_SARADCFCLKDIV_DIV_MASK) + 1U);
2585 }
2586
CLOCK_GetAcmpClkFreq(void)2587 uint32_t CLOCK_GetAcmpClkFreq(void)
2588 {
2589 return CLOCK_GetSenseMainClkFreq();
2590 }
2591
CLOCK_GetUsbClkFreq(void)2592 uint32_t CLOCK_GetUsbClkFreq(void)
2593 {
2594 return CLOCK_GetMediaVddnClkFreq();
2595 }
2596
CLOCK_GetSdAdcClkFreq(void)2597 uint32_t CLOCK_GetSdAdcClkFreq(void)
2598 {
2599 uint32_t freq = 0U;
2600
2601 if ((CLKCTL3->SDADCFCLKSEL & CLKCTL3_SDADCFCLKSEL_SEL_EN_MASK) != 0U)
2602 {
2603 switch ((CLKCTL3->SDADCFCLKSEL) & CLKCTL3_SDADCFCLKSEL_SEL_MASK)
2604 {
2605 case CLKCTL3_SDADCFCLKSEL_SEL(0):
2606 freq = CLOCK_GetSenseBaseClkFreq();
2607 break;
2608
2609 case CLKCTL3_SDADCFCLKSEL_SEL(1):
2610 freq = CLOCK_GetFroClkFreq(2) / 8U;
2611 break;
2612
2613 case CLKCTL3_SDADCFCLKSEL_SEL(2):
2614 freq = CLOCK_GetAudioPllFreq();
2615 break;
2616
2617 case CLKCTL3_SDADCFCLKSEL_SEL(3):
2618 freq = CLOCK_GetSenseAudioClkFreq();
2619 break;
2620
2621 default:
2622 freq = 0U;
2623 break;
2624 }
2625 }
2626
2627 return freq / ((CLKCTL3->SDADCFCLKDIV & CLKCTL3_SDADCFCLKDIV_DIV_MASK) + 1U);
2628 }
2629
CLOCK_GetOSTimerClkFreq(void)2630 uint32_t CLOCK_GetOSTimerClkFreq(void)
2631 {
2632 uint32_t freq = 0U;
2633
2634 if ((CLKCTL3->OSTIMERFCLKSEL & CLKCTL3_OSTIMERFCLKSEL_SEL_EN_MASK) != 0U)
2635 {
2636 switch ((CLKCTL3->OSTIMERFCLKSEL) & CLKCTL3_OSTIMERFCLKSEL_SEL_MASK)
2637 {
2638 case CLKCTL3_OSTIMERFCLKSEL_SEL(0):
2639 freq = CLOCK_GetSenseBaseClkFreq();
2640 break;
2641
2642 case CLKCTL3_OSTIMERFCLKSEL_SEL(1):
2643 freq = CLOCK_GetWakeClk32KFreq();
2644 break;
2645
2646 case CLKCTL3_OSTIMERFCLKSEL_SEL(2):
2647 freq = CLOCK_GetLpOscFreq();
2648 break;
2649
2650 case CLKCTL3_OSTIMERFCLKSEL_SEL(3):
2651 freq = CLOCK_GetXtalInClkFreq();
2652 break;
2653
2654 default:
2655 freq = 0U;
2656 break;
2657 }
2658 }
2659
2660 return freq / ((CLKCTL3->OSTIMERFCLKDIV & CLKCTL3_OSTIMERFCLKDIV_DIV_MASK) + 1U);
2661 }
2662
CLOCK_GetMicfilClkFreq(void)2663 uint32_t CLOCK_GetMicfilClkFreq(void)
2664 {
2665 uint32_t freq = 0U;
2666
2667 if ((CLKCTL3->MICFILFCLKSEL & CLKCTL3_MICFILFCLKSEL_SEL_EN_MASK) != 0U)
2668 {
2669 switch ((CLKCTL3->MICFILFCLKSEL) & CLKCTL3_MICFILFCLKSEL_SEL_MASK)
2670 {
2671 case CLKCTL3_MICFILFCLKSEL_SEL(0):
2672 freq = CLOCK_GetSenseBaseClkFreq();
2673 break;
2674
2675 case CLKCTL3_MICFILFCLKSEL_SEL(1):
2676 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd3);
2677 break;
2678
2679 case CLKCTL3_MICFILFCLKSEL_SEL(2):
2680 freq = CLOCK_GetFroClkFreq(2);
2681 break;
2682
2683 case CLKCTL3_MICFILFCLKSEL_SEL(3):
2684 freq = CLOCK_GetSenseAudioClkFreq();
2685 break;
2686
2687 default:
2688 freq = 0U;
2689 break;
2690 }
2691 }
2692
2693 return freq / ((CLKCTL3->MICFILFCLKDIV & CLKCTL3_MICFILFCLKDIV_DIV_MASK) + 1U);
2694 }
2695
CLOCK_GetFlexioClkFreq(void)2696 uint32_t CLOCK_GetFlexioClkFreq(void)
2697 {
2698 uint32_t freq = 0U;
2699
2700 if ((CLKCTL4->FLEXIOCLKSEL & CLKCTL4_FLEXIOCLKSEL_SEL_EN_MASK) != 0U)
2701 {
2702 switch ((CLKCTL4->FLEXIOCLKSEL) & CLKCTL4_FLEXIOCLKSEL_SEL_MASK)
2703 {
2704 case CLKCTL4_FLEXIOCLKSEL_SEL(0):
2705 freq = CLOCK_GetVdd2MediaBaseClkFreq();
2706 break;
2707
2708 case CLKCTL4_FLEXIOCLKSEL_SEL(1):
2709 freq = CLOCK_GetFroClkFreq(0);
2710 break;
2711
2712 case CLKCTL4_FLEXIOCLKSEL_SEL(2):
2713 freq = CLOCK_GetFroClkFreq(1);
2714 break;
2715
2716 case CLKCTL4_FLEXIOCLKSEL_SEL(3):
2717 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd3);
2718 break;
2719
2720 default:
2721 freq = 0U;
2722 break;
2723 }
2724 }
2725
2726 return freq / ((CLKCTL4->FLEXIOCLKDIV & CLKCTL4_FLEXIOCLKDIV_DIV_MASK) + 1U);
2727 }
2728
CLOCK_GetLPSpiClkFreq(uint32_t id)2729 uint32_t CLOCK_GetLPSpiClkFreq(uint32_t id)
2730 {
2731 uint32_t freq = 0U;
2732
2733 if (id == 14U)
2734 {
2735 if ((CLKCTL4->LPSPI14CLKSEL & CLKCTL4_LPSPI14CLKSEL_SEL_EN_MASK) != 0U)
2736 {
2737 switch ((CLKCTL4->LPSPI14CLKSEL) & CLKCTL4_LPSPI14CLKSEL_SEL_MASK)
2738 {
2739 case CLKCTL4_LPSPI14CLKSEL_SEL(0):
2740 freq = CLOCK_GetVdd2MediaBaseClkFreq();
2741 break;
2742
2743 case CLKCTL4_LPSPI14CLKSEL_SEL(1):
2744 freq = CLOCK_GetFroClkFreq(0U);
2745 break;
2746
2747 case CLKCTL4_LPSPI14CLKSEL_SEL(2):
2748 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2749 break;
2750
2751 case CLKCTL4_LPSPI14CLKSEL_SEL(3):
2752 freq = CLOCK_GetFroClkFreq(1U);
2753 break;
2754
2755 default:
2756 freq = 0U;
2757 break;
2758 }
2759 }
2760
2761 freq = freq / ((CLKCTL4->LPSPI14CLKDIV & CLKCTL4_LPSPI14CLKDIV_DIV_MASK) + 1U);
2762 }
2763 else if (id == 16U)
2764 {
2765 if ((CLKCTL4->LPSPI16CLKSEL & CLKCTL4_LPSPI16CLKSEL_SEL_EN_MASK) != 0U)
2766 {
2767 switch ((CLKCTL4->LPSPI16CLKSEL) & CLKCTL4_LPSPI16CLKSEL_SEL_MASK)
2768 {
2769 case CLKCTL4_LPSPI16CLKSEL_SEL(0):
2770 freq = CLOCK_GetVdd2MediaBaseClkFreq();
2771 break;
2772
2773 case CLKCTL4_LPSPI16CLKSEL_SEL(1):
2774 freq = CLOCK_GetFroClkFreq(0U);
2775 break;
2776
2777 case CLKCTL4_LPSPI16CLKSEL_SEL(2):
2778 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
2779 break;
2780
2781 case CLKCTL4_LPSPI16CLKSEL_SEL(3):
2782 freq = CLOCK_GetFroClkFreq(1U);
2783 break;
2784
2785 default:
2786 freq = 0U;
2787 break;
2788 }
2789 }
2790
2791 freq = freq / ((CLKCTL4->LPSPI16CLKDIV & CLKCTL4_LPSPI16CLKDIV_DIV_MASK) + 1U);
2792 }
2793 else
2794 {
2795 freq = CLOCK_GetLPFlexCommClkFreq(id);
2796 }
2797
2798 return freq;
2799 }
2800
CLOCK_GetLPI2cClkFreq(uint32_t id)2801 uint32_t CLOCK_GetLPI2cClkFreq(uint32_t id)
2802 {
2803 uint32_t freq = 0U;
2804
2805 if (id != 15U)
2806 {
2807 freq = CLOCK_GetLPFlexCommClkFreq(id);
2808 }
2809 else
2810 {
2811 if ((CLKCTL3->LPI2C15FCLKSEL & CLKCTL3_LPI2C15FCLKSEL_SEL_EN_MASK) != 0U)
2812 {
2813 switch ((CLKCTL3->LPI2C15FCLKSEL) & CLKCTL3_LPI2C15FCLKSEL_SEL_MASK)
2814 {
2815 case CLKCTL3_LPI2C15FCLKSEL_SEL(0):
2816 freq = CLOCK_GetSenseBaseClkFreq();
2817 break;
2818
2819 case CLKCTL3_LPI2C15FCLKSEL_SEL(1):
2820 freq = CLOCK_GetFroClkFreq(1U);
2821 break;
2822
2823 case CLKCTL3_LPI2C15FCLKSEL_SEL(2):
2824 freq = CLOCK_GetFroClkFreq(1U) / 2U;
2825 break;
2826
2827 case CLKCTL3_LPI2C15FCLKSEL_SEL(3):
2828 freq = CLOCK_GetFroClkFreq(2U);
2829 break;
2830
2831 default:
2832 freq = 0U;
2833 break;
2834 }
2835 }
2836 freq = freq / ((CLKCTL3->LPI2C15FCLKDIV & CLKCTL3_LPI2C15FCLKDIV_DIV_MASK) + 1U);
2837 }
2838
2839 return freq;
2840 }
2841
CLOCK_GetLcdifClkFreq(void)2842 uint32_t CLOCK_GetLcdifClkFreq(void)
2843 {
2844 uint32_t freq = 0U;
2845
2846 if ((CLKCTL4->LCDIFPIXELCLKSEL & CLKCTL4_LCDIFPIXELCLKSEL_SEL_EN_MASK) != 0U)
2847 {
2848 switch ((CLKCTL4->LCDIFPIXELCLKSEL) & CLKCTL4_LCDIFPIXELCLKSEL_SEL_MASK)
2849 {
2850 case CLKCTL4_LCDIFPIXELCLKSEL_SEL(0):
2851 freq = CLOCK_GetVdd2MediaBaseClkFreq();
2852 break;
2853
2854 case CLKCTL4_LCDIFPIXELCLKSEL_SEL(1):
2855 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
2856 break;
2857
2858 case CLKCTL4_LCDIFPIXELCLKSEL_SEL(2):
2859 freq = CLOCK_GetFroClkFreq(0U);
2860 break;
2861
2862 case CLKCTL4_LCDIFPIXELCLKSEL_SEL(3):
2863 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd1);
2864 break;
2865
2866 default:
2867 freq = 0U;
2868 break;
2869 }
2870 }
2871
2872 return freq / ((CLKCTL4->LCDIFPIXELCLKDIV & CLKCTL4_LCDIFPIXELCLKDIV_DIV_MASK) + 1U);
2873 }
2874
CLOCK_GetMipiDphyClkFreq(void)2875 uint32_t CLOCK_GetMipiDphyClkFreq(void)
2876 {
2877 uint32_t freq = 0U;
2878
2879 if ((CLKCTL4->DPHYCLKSEL & CLKCTL4_DPHYCLKSEL_SEL_EN_MASK) != 0U)
2880 {
2881 switch ((CLKCTL4->DPHYCLKSEL) & CLKCTL4_DPHYCLKSEL_SEL_MASK)
2882 {
2883 case CLKCTL4_DPHYCLKSEL_SEL(0):
2884 freq = CLOCK_GetVdd2MediaBaseClkFreq();
2885 break;
2886
2887 /*Source select 1 is internal. */
2888
2889 case CLKCTL4_DPHYCLKSEL_SEL(2):
2890 freq = CLOCK_GetFroClkFreq(0U);
2891 break;
2892
2893 case CLKCTL4_DPHYCLKSEL_SEL(3):
2894 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd2);
2895 break;
2896
2897 default:
2898 freq = 0U;
2899 break;
2900 }
2901 }
2902
2903 return freq / ((CLKCTL4->DPHYCLKDIV & CLKCTL4_DPHYCLKDIV_DIV_MASK) + 1U);
2904 }
2905
CLOCK_GetMipiDphyEscRxClkFreq(void)2906 uint32_t CLOCK_GetMipiDphyEscRxClkFreq(void)
2907 {
2908 uint32_t freq = 0U;
2909
2910 if ((CLKCTL4->DPHYESCCLKSEL & CLKCTL4_DPHYESCCLKSEL_SEL_EN_MASK) != 0U)
2911 {
2912 switch ((CLKCTL4->DPHYESCCLKSEL) & CLKCTL4_DPHYESCCLKSEL_SEL_MASK)
2913 {
2914 case CLKCTL4_DPHYESCCLKSEL_SEL(0):
2915 freq = CLOCK_GetVdd2MediaBaseClkFreq();
2916 break;
2917
2918 case CLKCTL4_DPHYESCCLKSEL_SEL(1):
2919 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd1);
2920 break;
2921
2922 case CLKCTL4_DPHYESCCLKSEL_SEL(2):
2923 freq = CLOCK_GetFroClkFreq(0U);
2924 break;
2925
2926 case CLKCTL4_DPHYESCCLKSEL_SEL(3):
2927 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd2);
2928 break;
2929
2930 default:
2931 freq = 0U;
2932 break;
2933 }
2934 }
2935
2936 return freq / ((CLKCTL4->DPHYESCRXCLKDIV & CLKCTL4_DPHYESCRXCLKDIV_DIV_MASK) + 1U);
2937 }
2938
CLOCK_GetMipiDphyEscTxClkFreq(void)2939 uint32_t CLOCK_GetMipiDphyEscTxClkFreq(void)
2940 {
2941 return CLOCK_GetMipiDphyEscRxClkFreq() / ((CLKCTL4->DPHYESCTXCLKDIV & CLKCTL4_DPHYESCTXCLKDIV_DIV_MASK) + 1U);
2942 }
2943
CLOCK_GetUsdhcClkFreq(uint32_t id)2944 uint32_t CLOCK_GetUsdhcClkFreq(uint32_t id)
2945 {
2946 uint32_t freq = 0U;
2947
2948 if (id == 0U)
2949 {
2950 if ((CLKCTL4->SDIO0FCLKSEL & CLKCTL4_SDIO0FCLKSEL_SEL_EN_MASK) != 0U)
2951 {
2952 switch ((CLKCTL4->SDIO0FCLKSEL) & CLKCTL4_SDIO0FCLKSEL_SEL_MASK)
2953 {
2954 case CLKCTL4_SDIO0FCLKSEL_SEL(0):
2955 freq = CLOCK_GetVddnMediaBaseClkFreq();
2956 break;
2957
2958 case CLKCTL4_SDIO0FCLKSEL_SEL(1):
2959 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd0);
2960 break;
2961
2962 case CLKCTL4_SDIO0FCLKSEL_SEL(2):
2963 freq = CLOCK_GetFroClkFreq(0U);
2964 break;
2965
2966 case CLKCTL4_SDIO0FCLKSEL_SEL(3):
2967 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
2968 break;
2969
2970 default:
2971 freq = 0U;
2972 break;
2973 }
2974 freq = freq / ((CLKCTL4->SDIO0FCLKDIV & CLKCTL4_SDIO0FCLKDIV_DIV_MASK) + 1U);
2975 }
2976 }
2977 else if (id == 1U)
2978 {
2979 if ((CLKCTL4->SDIO1FCLKSEL & CLKCTL4_SDIO1FCLKSEL_SEL_EN_MASK) != 0U)
2980 {
2981 switch ((CLKCTL4->SDIO1FCLKSEL) & CLKCTL4_SDIO1FCLKSEL_SEL_MASK)
2982 {
2983 case CLKCTL4_SDIO1FCLKSEL_SEL(0):
2984 freq = CLOCK_GetVddnMediaBaseClkFreq();
2985 break;
2986
2987 case CLKCTL4_SDIO1FCLKSEL_SEL(1):
2988 freq = CLOCK_GetAudioPfdFreq(kCLOCK_Pfd0);
2989 break;
2990
2991 case CLKCTL4_SDIO1FCLKSEL_SEL(2):
2992 freq = CLOCK_GetFroClkFreq(0U);
2993 break;
2994
2995 case CLKCTL4_SDIO1FCLKSEL_SEL(3):
2996 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
2997 break;
2998
2999 default:
3000 freq = 0U;
3001 break;
3002 }
3003 freq = freq / ((CLKCTL4->SDIO1FCLKDIV & CLKCTL4_SDIO1FCLKDIV_DIV_MASK) + 1U);
3004 }
3005 }
3006 else
3007 {
3008 /* Nothing.*/
3009 }
3010
3011 return freq;
3012 }
3013
CLOCK_GetVgpuClkFreq(void)3014 uint32_t CLOCK_GetVgpuClkFreq(void)
3015 {
3016 uint32_t freq = 0U;
3017
3018 if ((CLKCTL4->VGPUCLKSEL & CLKCTL4_VGPUCLKSEL_SEL_EN_MASK) != 0U)
3019 {
3020 switch ((CLKCTL4->VGPUCLKSEL) & CLKCTL4_VGPUCLKSEL_SEL_MASK)
3021 {
3022 case CLKCTL4_VGPUCLKSEL_SEL(0):
3023 freq = CLOCK_GetVdd2MediaBaseClkFreq();
3024 break;
3025
3026 case CLKCTL4_VGPUCLKSEL_SEL(1):
3027 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd0);
3028 break;
3029
3030 case CLKCTL4_VGPUCLKSEL_SEL(2):
3031 freq = CLOCK_GetFroClkFreq(0U);
3032 break;
3033
3034 case CLKCTL4_VGPUCLKSEL_SEL(3):
3035 freq = CLOCK_GetMainPfdFreq(kCLOCK_Pfd2);
3036 break;
3037
3038 default:
3039 freq = 0U;
3040 break;
3041 }
3042 freq = freq / ((CLKCTL4->VGPUCLKDIV & CLKCTL4_VGPUCLKDIV_DIV_MASK) + 1U);
3043 }
3044 return freq;
3045 }
3046
3047 /*! brief Enable USB HS clock.
3048 *
3049 * This function only enables the access to USB HS prepheral, upper layer
3050 * should first call the ref CLOCK_EnableUsbhs0PhyPllClock to enable the PHY
3051 * clock to use USB HS.
3052 *
3053 * param src USB HS does not care about the clock source, here must be ref kCLOCK_UsbSrcUnused.
3054 * param freq USB HS does not care about the clock source, so this parameter is ignored.
3055 * retval true The clock is set successfully.
3056 * retval false The clock source is invalid to get proper USB HS clock.
3057 */
CLOCK_EnableUsbhs0Clock(clock_usb_src_t src,uint32_t freq)3058 bool CLOCK_EnableUsbhs0Clock(clock_usb_src_t src, uint32_t freq)
3059 {
3060 return true;
3061 }
3062
3063 /*! brief Enable USB HS PHY PLL clock.
3064 *
3065 * This function enables the internal 480MHz USB PHY PLL clock.
3066 *
3067 * param src USB HS PHY PLL clock source.
3068 * param freq The frequency specified by src.
3069 * retval true The clock is set successfully.
3070 * retval false The clock source is invalid to get proper USB HS clock.
3071 */
CLOCK_EnableUsbhs0PhyPllClock(clock_usb_phy_src_t src,uint32_t freq)3072 bool CLOCK_EnableUsbhs0PhyPllClock(clock_usb_phy_src_t src, uint32_t freq)
3073 {
3074 uint32_t phyPllDiv = 0U;
3075 uint16_t multiplier = 0U;
3076 bool retVal = true;
3077 CLOCK_EnableClock(kCLOCK_Usb0);
3078
3079 USBPHY->CTRL_CLR = USBPHY_CTRL_SFTRST_MASK;
3080
3081 USBPHY->PLL_SIC_SET = (USBPHY_PLL_SIC_PLL_POWER(1) | USBPHY_PLL_SIC_PLL_REG_ENABLE_MASK);
3082 if ((480000000UL % freq) != 0UL)
3083 {
3084 return false;
3085 }
3086 multiplier = (uint16_t)(480000000UL / freq);
3087
3088 switch (multiplier)
3089 {
3090 case 13:
3091 {
3092 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(0U);
3093 break;
3094 }
3095 case 15:
3096 {
3097 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(1U);
3098 break;
3099 }
3100 case 16:
3101 {
3102 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(2U);
3103 break;
3104 }
3105 case 20:
3106 {
3107 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(3U);
3108 break;
3109 }
3110 case 22:
3111 {
3112 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(4U);
3113 break;
3114 }
3115 case 25:
3116 {
3117 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(5U);
3118 break;
3119 }
3120 case 30:
3121 {
3122 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(6U);
3123 break;
3124 }
3125 case 240:
3126 {
3127 phyPllDiv = USBPHY_PLL_SIC_PLL_DIV_SEL(7U);
3128 break;
3129 }
3130 default:
3131 {
3132 retVal = false;
3133 break;
3134 }
3135 }
3136
3137 if (retVal)
3138 {
3139 USBPHY->PLL_SIC = (USBPHY->PLL_SIC & ~(USBPHY_PLL_SIC_PLL_DIV_SEL_MASK)) | phyPllDiv;
3140
3141 USBPHY->PLL_SIC_CLR = USBPHY_PLL_SIC_PLL_BYPASS_MASK;
3142 USBPHY->PLL_SIC_SET = (USBPHY_PLL_SIC_PLL_EN_USB_CLKS_MASK);
3143
3144 USBPHY->CTRL_CLR = USBPHY_CTRL_CLR_CLKGATE_MASK;
3145
3146 while (0UL == (USBPHY->PLL_SIC & USBPHY_PLL_SIC_PLL_LOCK_MASK))
3147 {
3148 }
3149 }
3150
3151 return true;
3152 }
3153
3154 /*! brief Disable USB HS PHY PLL clock.
3155 *
3156 * This function disables USB HS PHY PLL clock.
3157 */
CLOCK_DisableUsbhs0PhyPllClock(void)3158 void CLOCK_DisableUsbhs0PhyPllClock(void)
3159 {
3160 USBPHY->PLL_SIC_CLR = (USBPHY_PLL_SIC_PLL_EN_USB_CLKS_MASK);
3161 USBPHY->CTRL |= USBPHY_CTRL_CLKGATE_MASK; /* Set to 1U to gate clocks */
3162 }
3163