1 /*
2 ** ###################################################################
3 ** Processors: MIMXRT798SGAWAR_cm33_core0
4 ** MIMXRT798SGFOA_cm33_core0
5 **
6 ** Compilers: GNU C Compiler
7 ** IAR ANSI C/C++ Compiler for ARM
8 ** Keil ARM C/C++ Compiler
9 ** MCUXpresso Compiler
10 **
11 ** Reference manual: iMXRT700RM Rev.2 DraftA, 05/2024
12 ** Version: rev. 2.0, 2024-05-28
13 ** Build: b240528
14 **
15 ** Abstract:
16 ** Provides a system configuration function and a global variable that
17 ** contains the system frequency. It configures the device and initializes
18 ** the oscillator (PLL) that is part of the microcontroller device.
19 **
20 ** Copyright 2016 Freescale Semiconductor, Inc.
21 ** Copyright 2016-2024 NXP
22 ** SPDX-License-Identifier: BSD-3-Clause
23 **
24 ** http: www.nxp.com
25 ** mail: support@nxp.com
26 **
27 ** Revisions:
28 ** - rev. 1.0 (2022-09-15)
29 ** Initial version.
30 ** - rev. 2.0 (2024-05-28)
31 ** Rev2 DraftA.
32 **
33 ** ###################################################################
34 */
35
36 /*!
37 * @file MIMXRT798S_cm33_core0
38 * @version 1.0
39 * @date 2024-05-28
40 * @brief Device specific configuration file for MIMXRT798S_cm33_core0
41 * (implementation file)
42 *
43 * Provides a system configuration function and a global variable that contains
44 * the system frequency. It configures the device and initializes the oscillator
45 * (PLL) that is part of the microcontroller device.
46 */
47
48 #include <stdint.h>
49 #include <stdbool.h>
50 #include "fsl_device_registers.h"
51
52 /* ----------------------------------------------------------------------------
53 -- Core clock
54 ---------------------------------------------------------------------------- */
55
56 uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
57
58 /* ----------------------------------------------------------------------------
59 -- SystemInit()
60 ---------------------------------------------------------------------------- */
61
SystemInit(void)62 __attribute__((weak)) void SystemInit(void)
63 {
64 #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
65 SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10, CP11 Full Access in Secure mode */
66 #if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
67 SCB_NS->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10, CP11 Full Access in Non-secure mode */
68 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
69 #endif /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
70
71 SCB->CPACR |= ((3UL << 0 * 2) | (3UL << 1 * 2)); /* set CP0, CP1 Full Access in Secure mode (enable PowerQuad) */
72
73 #if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
74 SCB_NS->CPACR |=
75 ((3UL << 0 * 2) | (3UL << 1 * 2)); /* set CP0, CP1 Full Access in Non-secure mode (enable PowerQuad) */
76 #endif /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
77
78 SCB->NSACR |= ((3UL << 0) | (3UL << 10)); /* enable CP0, CP1, CP10, CP11 Non-secure Access */
79
80 SYSCON0->DSPSTALL = SYSCON0_DSPSTALL_DSPSTALL_MASK;
81
82 if ((XCACHE1->CCR & XCACHE_CCR_ENCACHE_MASK) == 0U) /* set XCACHE if not configured for code bus.*/
83 {
84 /* set command to invalidate all ways and write GO bit to initiate command */
85 XCACHE1->CCR = XCACHE_CCR_INVW1_MASK | XCACHE_CCR_INVW0_MASK;
86 XCACHE1->CCR |= XCACHE_CCR_GO_MASK;
87 /* Wait until the command completes */
88 while ((XCACHE1->CCR & XCACHE_CCR_GO_MASK) != 0U)
89 {
90 }
91 /* Enable cache */
92 XCACHE1->CCR = XCACHE_CCR_ENCACHE_MASK;
93
94 __ISB();
95 __DSB();
96 }
97
98 #if STARTUP_XSPI0_CACHE_POLICY
99 if ((CACHE64_CTRL0->CCR & CACHE64_CTRL_CCR_ENCACHE_MASK) == 0U)
100 {
101 /* Enable XSPI0 caches */
102 CACHE64_POLSEL0->REG0_TOP = 0x07FFFC00UL;
103 CACHE64_POLSEL0->POLSEL = STARTUP_XSPI0_CACHE_POLICY;
104 /* First, invalidate the entire cache. */
105 CACHE64_CTRL0->CCR = CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK;
106 CACHE64_CTRL0->CCR |= CACHE64_CTRL_CCR_GO_MASK;
107 while ((CACHE64_CTRL0->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0U)
108 {
109 }
110 CACHE64_CTRL0->CCR = CACHE64_CTRL_CCR_ENCACHE_MASK;
111
112 __ISB();
113 __DSB();
114 }
115 #endif
116
117 #if STARTUP_XSPI1_CACHE_POLICY
118 if ((CACHE64_CTRL1->CCR & CACHE64_CTRL_CCR_ENCACHE_MASK) == 0U)
119 {
120 /* Enable XSPI0 caches */
121 CACHE64_POLSEL1->REG0_TOP = 0x07FFFC00UL;
122 CACHE64_POLSEL1->POLSEL = STARTUP_XSPI1_CACHE_POLICY;
123 /* First, invalidate the entire cache. */
124 CACHE64_CTRL1->CCR = CACHE64_CTRL_CCR_INVW0_MASK | CACHE64_CTRL_CCR_INVW1_MASK;
125 CACHE64_CTRL1->CCR |= CACHE64_CTRL_CCR_GO_MASK;
126 while ((CACHE64_CTRL1->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0U)
127 {
128 }
129 CACHE64_CTRL1->CCR = CACHE64_CTRL_CCR_ENCACHE_MASK;
130
131 __ISB();
132 __DSB();
133 }
134 #endif
135
136 SystemInitHook();
137 }
138
139 /* ----------------------------------------------------------------------------
140 -- SystemCoreClockUpdate()
141 ---------------------------------------------------------------------------- */
142
getFro0MaxFreq(void)143 static uint32_t getFro0MaxFreq(void)
144 {
145 return CLK_FRO0_CLK;
146 }
147
getFro1MaxFreq(void)148 static uint32_t getFro1MaxFreq(void)
149 {
150 return CLK_FRO1_MAX_CLK;
151 }
152
getFro1Div3Freq(void)153 static uint32_t getFro1Div3Freq(void)
154 {
155 return getFro1MaxFreq() / 3U;
156 }
157
getFro0Div3Freq(void)158 static uint32_t getFro0Div3Freq(void)
159 {
160 return getFro0MaxFreq() / 3U;
161 }
162
getLpOscFreq(void)163 static uint32_t getLpOscFreq(void)
164 {
165 return CLK_LPOSC_1MHZ;
166 }
167
getBaseClkCmpt(void)168 static uint32_t getBaseClkCmpt(void)
169 {
170 uint32_t freq = 0U;
171
172 switch (CLKCTL0->CMPTBASECLKSEL & CLKCTL0_CMPTBASECLKSEL_SEL_MASK)
173 {
174 case CLKCTL0_CMPTBASECLKSEL_SEL(0):
175 freq = getFro1Div3Freq();
176 break;
177 case CLKCTL0_CMPTBASECLKSEL_SEL(1):
178 freq = getFro1MaxFreq();
179 break;
180 case CLKCTL0_CMPTBASECLKSEL_SEL(2):
181 freq = getFro0Div3Freq();
182 break;
183 case CLKCTL0_CMPTBASECLKSEL_SEL(3):
184 freq = getLpOscFreq();
185 break;
186 default:
187 freq = 0U;
188 break;
189 }
190
191 return freq;
192 }
193
getMainPllFreq(void)194 static uint32_t getMainPllFreq(void)
195 {
196 uint32_t freq = 0U;
197 uint64_t freqTmp;
198
199 switch ((CLKCTL2->MAINPLL0CLKSEL) & CLKCTL2_MAINPLL0CLKSEL_SEL_MASK)
200 {
201 case CLKCTL2_MAINPLL0CLKSEL_SEL(0):
202 freq = getFro1MaxFreq() / 8U;
203 break;
204 case CLKCTL2_MAINPLL0CLKSEL_SEL(1):
205 freq = CLK_OSC_CLK;
206 break;
207 default:
208 freq = 0U;
209 break;
210 }
211
212 if (((CLKCTL2->MAINPLL0CTL0) & CLKCTL2_MAINPLL0CTL0_BYPASS_MASK) == 0U)
213 {
214 /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */
215 freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL2->MAINPLL0NUM))) / ((uint64_t)(CLKCTL2->MAINPLL0DENOM));
216 freq *= ((CLKCTL2->MAINPLL0CTL0) & CLKCTL2_MAINPLL0CTL0_MULT_MASK) >> CLKCTL2_MAINPLL0CTL0_MULT_SHIFT;
217 freq += (uint32_t)freqTmp;
218 }
219 return freq;
220 }
221
getMainPllPfd0Freq(void)222 static uint32_t getMainPllPfd0Freq(void)
223 {
224 uint32_t freq = getMainPllFreq();
225
226 if (((CLKCTL2->MAINPLL0CTL0) & CLKCTL2_MAINPLL0CTL0_BYPASS_MASK) == 0U)
227 {
228 freq = (uint32_t)((uint64_t)freq * 18U /
229 ((CLKCTL2->MAINPLL0PFD & CLKCTL2_MAINPLL0PFD_PFD0_MASK) >> CLKCTL2_MAINPLL0PFD_PFD0_SHIFT));
230 }
231 return freq;
232 }
233
getAudioPllFreq(void)234 static uint32_t getAudioPllFreq(void)
235 {
236 uint32_t freq = 0U;
237 uint64_t freqTmp;
238
239 switch ((CLKCTL2->AUDIOPLL0CLKSEL) & CLKCTL2_AUDIOPLL0CLKSEL_SEL_MASK)
240 {
241 case CLKCTL2_AUDIOPLL0CLKSEL_SEL(0):
242 freq = getFro1MaxFreq() / 8U;
243 break;
244 case CLKCTL2_AUDIOPLL0CLKSEL_SEL(1):
245 freq = CLK_OSC_CLK;
246 break;
247 default:
248 freq = 0U;
249 break;
250 }
251
252 if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL)
253 {
254 /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */
255 freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL2->AUDIOPLL0NUM))) / ((uint64_t)(CLKCTL2->AUDIOPLL0DENOM));
256 freq *= ((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_MULT_MASK) >> CLKCTL2_AUDIOPLL0CTL0_MULT_SHIFT;
257 freq += (uint32_t)freqTmp;
258 }
259 return freq;
260 }
261
getAudioPllPfd1Freq(void)262 static uint32_t getAudioPllPfd1Freq(void)
263 {
264 uint32_t freq = getAudioPllFreq();
265
266 if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL)
267 {
268 freq =
269 (uint32_t)((uint64_t)freq * 18U /
270 ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD1_MASK) >> CLKCTL2_AUDIOPLL0PFD_PFD1_SHIFT));
271 }
272 return freq;
273 }
274
SystemCoreClockUpdate(void)275 void SystemCoreClockUpdate(void)
276 {
277 uint32_t freq = 0U;
278
279 switch (CLKCTL0->MAINCLKSEL & CLKCTL0_MAINCLKSEL_SEL_MASK)
280 {
281 case CLKCTL0_MAINCLKSEL_SEL(0):
282 freq = getBaseClkCmpt();
283 break;
284
285 case CLKCTL0_MAINCLKSEL_SEL(1):
286 freq = getMainPllPfd0Freq();
287 break;
288
289 case CLKCTL0_MAINCLKSEL_SEL(2):
290 freq = getFro0MaxFreq();
291 break;
292
293 case CLKCTL0_MAINCLKSEL_SEL(3):
294 freq = getAudioPllPfd1Freq();
295 break;
296
297 default:
298 freq = 0U;
299 break;
300 }
301
302 SystemCoreClock = freq / ((CLKCTL0->MAINCLKDIV & CLKCTL0_MAINCLKDIV_DIV_MASK) + 1U);
303 }
304
305 /* ----------------------------------------------------------------------------
306 -- SystemInitHook()
307 ---------------------------------------------------------------------------- */
308
SystemInitHook(void)309 __attribute__((weak)) void SystemInitHook(void)
310 {
311 /* Void implementation of the weak function. */
312 }
313