1 /*
2 * Copyright 2023-2024 NXP
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 /***********************************************************************************************************************
8 * This file was generated by the MCUXpresso Config Tools. Any manual edits made to this file
9 * will be overwritten if the respective MCUXpresso Config Tools is used to update this file.
10 **********************************************************************************************************************/
11 /*
12 * How to set up clock using clock driver functions:
13 *
14 * 1. Setup clock sources.
15 *
16 * 2. Set up all selectors to provide selected clocks.
17 *
18 * 3. Set up all dividers.
19 */
20
21 #include "fsl_clock.h"
22 #include "clock_config.h"
23 #include "fsl_power.h"
24
25 /*******************************************************************************
26 * Definitions
27 ******************************************************************************/
28
29 /*******************************************************************************
30 * Variables
31 ******************************************************************************/
32 /* System clock frequency. */
33 extern uint32_t SystemCoreClock;
34
35 /*PLL 528MHZ*/
36 const clock_main_pll_config_t g_mainPllConfig_BOARD_BootClockRUN = {
37 .main_pll_src = kCLOCK_MainPllOscClk, /* OSC clock */
38 .numerator = 0, /* Numerator of the SYSPLL0 fractional loop divider is 0 */
39 .denominator = 1, /* Denominator of the SYSPLL0 fractional loop divider is 1 */
40 .main_pll_mult = kCLOCK_MainPllMult22 /* Divide by 22 */
41 };
42
43 const clock_audio_pll_config_t g_audioPllConfig_BOARD_BootClockRUN = {
44 .audio_pll_src = kCLOCK_AudioPllOscClk, /* OSC clock */
45 .numerator = 5040, /* Numerator of the Audio PLL fractional loop divider is 0 */
46 .denominator = 27000, /* Denominator of the Audio PLL fractional loop divider is 1 */
47 .audio_pll_mult = kCLOCK_AudioPllMult22, /* Divide by 22 */
48 .enableVcoOut = true
49 };
50 /*******************************************************************************
51 ************************ BOARD_InitBootClocks function ************************
52 ******************************************************************************/
53 /*FUNCTION**********************************************************************
54 *
55 * Function Name : BOARD_XspiClockSafeConfig
56 * Description : XSPI clock source safe configuration weak function.
57 * Called before clock source(Such as PLL, Main clock) configuration.
58 * Note : Users need override this function to change XSPI clock source to stable source when executing
59 * code on XSPI memory(XIP). If XIP, the function should runs in RAM and move the XSPI clock
60 *source to an stable clock to avoid instruction/data fetch issue during clock updating.
61 *END**************************************************************************/
BOARD_XspiClockSafeConfig(void)62 __attribute__((weak)) void BOARD_XspiClockSafeConfig(void)
63 {
64 }
65
BOARD_SetXspiClock(XSPI_Type * base,uint32_t src,uint32_t divider)66 __attribute__((weak)) void BOARD_SetXspiClock(XSPI_Type *base, uint32_t src, uint32_t divider)
67 {
68 }
69
BOARD_InitBootClocks(void)70 void BOARD_InitBootClocks(void)
71 {
72 BOARD_BootClockRUN();
73 }
74
75 /*******************************************************************************
76 ********************** Configuration BOARD_BootClockRUN ***********************
77 ******************************************************************************/
78
79 /*******************************************************************************
80 * Variables for BOARD_BootClockRUN configuration
81 ******************************************************************************/
82
83 /*******************************************************************************
84 * Code for BOARD_BootClockRUN configuration
85 ******************************************************************************/
BOARD_BootClockRUN(void)86 void BOARD_BootClockRUN(void)
87 {
88 const clock_fro_config_t froAutotrimCfg = {
89 .targetFreq = 300000000U,
90 .range = 50U,
91 .trim1DelayUs = 15U,
92 .trim2DelayUs = 150U,
93 .refDiv = 1U,
94 .enableInt = 0U,
95 .coarseTrimEn = true,
96 };
97
98 POWER_DisablePD(kPDRUNCFG_PD_LPOSC);
99
100 /* Power up OSC */
101 POWER_DisablePD(kPDRUNCFG_PD_SYSXTAL);
102 CLOCK_EnableSysOscClk(true, true, BOARD_SYSOSC_SETTLING_US); /* Enable system OSC */
103 CLOCK_SetXtalFreq(BOARD_XTAL_SYS_CLK_HZ); /* Sets external XTAL OSC freq */
104
105 POWER_DisablePD(kPDRUNCFG_PD_FRO1); /* Make sure FRO1 is enabled. */
106
107 /* Switch to FRO1 for safe configure. */
108 CLOCK_AttachClk(kFRO1_DIV1_to_COMPUTE_BASE);
109 CLOCK_AttachClk(kCOMPUTE_BASE_to_COMPUTE_MAIN);
110 CLOCK_SetClkDiv(kCLOCK_DivCmptMainClk, 1U);
111 CLOCK_AttachClk(kFRO1_DIV1_to_RAM);
112 CLOCK_SetClkDiv(kCLOCK_DivComputeRamClk, 1U);
113 CLOCK_AttachClk(kFRO1_DIV1_to_COMMON_BASE);
114 CLOCK_AttachClk(kCOMMON_BASE_to_COMMON_VDDN);
115 CLOCK_SetClkDiv(kCLOCK_DivCommonVddnClk, 1U);
116
117 BOARD_XspiClockSafeConfig(); /*Change to common_base clock(Sourced by FRO1). */
118
119 /* Ungate all FRO clock. */
120 POWER_DisablePD(kPDRUNCFG_GATE_FRO0);
121 CLOCK_EnableFroClkFreqCloseLoop(FRO0, &froAutotrimCfg, kCLOCK_FroAllOutEn); /* Use close loop mode. */
122 CLOCK_EnableFro0ClkForDomain(kCLOCK_AllDomainEnable); /* Enable FRO0 MAX clock for all domains. */
123
124 CLOCK_InitMainPll(&g_mainPllConfig_BOARD_BootClockRUN);
125 CLOCK_InitMainPfd(kCLOCK_Pfd0, 20U); /* 475MHz */
126 CLOCK_InitMainPfd(kCLOCK_Pfd1, 24U); /* 396MHz */
127 CLOCK_InitMainPfd(kCLOCK_Pfd2, 18U); /* 528MHz */
128 CLOCK_InitMainPfd(kCLOCK_Pfd3, 19U); /* Main PLL kCLOCK_Pfd3 (528 * 18 / 19) = 500MHz -need 2 div -> 250MHz*/
129
130 CLOCK_EnableMainPllPfdClkForDomain(kCLOCK_Pfd0, kCLOCK_AllDomainEnable);
131 CLOCK_EnableMainPllPfdClkForDomain(kCLOCK_Pfd1, kCLOCK_AllDomainEnable);
132 CLOCK_EnableMainPllPfdClkForDomain(kCLOCK_Pfd2, kCLOCK_AllDomainEnable);
133 CLOCK_EnableMainPllPfdClkForDomain(kCLOCK_Pfd3, kCLOCK_AllDomainEnable);
134
135 CLOCK_SetClkDiv(kCLOCK_DivCmptMainClk, 2U);
136 CLOCK_AttachClk(kMAIN_PLL_PFD0_to_COMPUTE_MAIN); /* Switch to PLL 230MHZ */
137
138 CLOCK_SetClkDiv(kCLOCK_DivMediaMainClk, 2U);
139 CLOCK_AttachClk(kMAIN_PLL_PFD0_to_MEDIA_MAIN); /* Switch to PLL 230MHZ */
140
141 CLOCK_SetClkDiv(kCLOCK_DivMediaVddnClk, 2U);
142 CLOCK_AttachClk(kMAIN_PLL_PFD0_to_MEDIA_VDDN); /* Switch to PLL 230MHZ */
143
144 CLOCK_SetClkDiv(kCLOCK_DivComputeRamClk, 2U);
145 CLOCK_AttachClk(kMAIN_PLL_PFD0_to_RAM); /* Switch to PLL 230MHZ */
146
147 CLOCK_SetClkDiv(kCLOCK_DivCommonVddnClk, 2U);
148 CLOCK_AttachClk(kMAIN_PLL_PFD3_to_COMMON_VDDN); /* Switch to 250MHZ */
149
150 /* Configure Audio PLL clock source. */
151 CLOCK_InitAudioPll(&g_audioPllConfig_BOARD_BootClockRUN); /* 532.48MHZ */
152 CLOCK_InitAudioPfd(kCLOCK_Pfd1, 24U); /* 399.36MHz */
153 CLOCK_InitAudioPfd(kCLOCK_Pfd3, 26U); /* Enable Audio PLL PFD3 clock to 368.64MHZ */
154 CLOCK_EnableAudioPllPfdClkForDomain(kCLOCK_Pfd1, kCLOCK_AllDomainEnable);
155 CLOCK_EnableAudioPllPfdClkForDomain(kCLOCK_Pfd3, kCLOCK_AllDomainEnable);
156
157 /* Call function BOARD_SetXspiClock() to set user configured clock source/divider for XSPI. */
158 BOARD_SetXspiClock(XSPI0, 3U, 1U); /* Main PLL PDF1 DIV1. */
159
160 SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK;
161 }
162