1 /*
2 ** ###################################################################
3 **     Processors:          MIMXRT758SGAWAR_hifi1
4 **                          MIMXRT758SGFOA_hifi1
5 **
6 **     Compiler:            Xtensa Compiler
7 **     Reference manual:    iMXRT700RM Rev.2 DraftA, 05/2024
8 **     Version:             rev. 2.0, 2024-05-28
9 **     Build:               b240528
10 **
11 **     Abstract:
12 **         Provides a system configuration function and a global variable that
13 **         contains the system frequency. It configures the device and initializes
14 **         the oscillator (PLL) that is part of the microcontroller device.
15 **
16 **     Copyright 2016 Freescale Semiconductor, Inc.
17 **     Copyright 2016-2024 NXP
18 **     SPDX-License-Identifier: BSD-3-Clause
19 **
20 **     http:                 www.nxp.com
21 **     mail:                 support@nxp.com
22 **
23 **     Revisions:
24 **     - rev. 1.0 (2022-09-15)
25 **         Initial version.
26 **     - rev. 2.0 (2024-05-28)
27 **         Rev2 DraftA.
28 **
29 ** ###################################################################
30 */
31 
32 /*!
33  * @file MIMXRT758S
34  * @version 1.0
35  * @date 2024-05-28
36  * @brief Device specific configuration file for MIMXRT758S
37  *  (implementation file)
38  *
39  * Provides a system configuration function and a global variable that contains
40  * the system frequency. It configures the device and initializes the oscillator
41  * (PLL) that is part of the microcontroller device.
42  */
43 
44 #include <stdint.h>
45 #include "fsl_device_registers.h"
46 
47 /* ----------------------------------------------------------------------------
48    -- Core clock
49    ---------------------------------------------------------------------------- */
50 uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
51 
52 /* ----------------------------------------------------------------------------
53    -- SystemInit()
54    ---------------------------------------------------------------------------- */
55 
SystemInit(void)56 __attribute__((weak)) void SystemInit(void)
57 {
58     SystemInitHook();
59 }
60 
61 /* ----------------------------------------------------------------------------
62    -- SystemCoreClockUpdate()
63    ---------------------------------------------------------------------------- */
getFro2MaxFreq(void)64 static uint32_t getFro2MaxFreq(void)
65 {
66     return CLK_FRO2_CLK;
67 }
68 
getFro1MaxFreq(void)69 static uint32_t getFro1MaxFreq(void)
70 {
71     return CLK_FRO1_MAX_CLK;
72 }
73 
getFro1Div3Freq(void)74 static uint32_t getFro1Div3Freq(void)
75 {
76     return getFro1MaxFreq() / 3U;
77 }
78 
getFro2Div3Freq(void)79 static uint32_t getFro2Div3Freq(void)
80 {
81     return getFro2MaxFreq() / 3U;
82 }
83 
getLpOscFreq(void)84 static uint32_t getLpOscFreq(void)
85 {
86     return CLK_LPOSC_1MHZ;
87 }
88 
getBaseClkSense(void)89 static uint32_t getBaseClkSense(void)
90 {
91     uint32_t freq = 0U;
92 
93     switch (CLKCTL1->SENSEBASECLKSEL & CLKCTL1_SENSEBASECLKSEL_SEL_MASK)
94     {
95         case CLKCTL1_SENSEBASECLKSEL_SEL(0):
96             freq = getFro1Div3Freq();
97             break;
98         case CLKCTL1_SENSEBASECLKSEL_SEL(1):
99             freq = getFro1MaxFreq();
100             break;
101         case CLKCTL1_SENSEBASECLKSEL_SEL(2):
102             freq = getFro2Div3Freq();
103             break;
104         case CLKCTL1_SENSEBASECLKSEL_SEL(3):
105             freq = getLpOscFreq();
106             break;
107         default:
108             freq = 0U;
109             break;
110     }
111 
112     return freq;
113 }
114 
getAudioPllFreq(void)115 static uint32_t getAudioPllFreq(void)
116 {
117     uint32_t freq = 0U;
118     uint64_t freqTmp;
119 
120     switch ((CLKCTL2->AUDIOPLL0CLKSEL) & CLKCTL2_AUDIOPLL0CLKSEL_SEL_MASK)
121     {
122         case CLKCTL2_AUDIOPLL0CLKSEL_SEL(0):
123             freq = getFro1MaxFreq() / 8U;
124             break;
125         case CLKCTL2_AUDIOPLL0CLKSEL_SEL(1):
126             freq = CLK_OSC_CLK;
127             break;
128         default:
129             freq = 0U;
130             break;
131     }
132 
133     if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL)
134     {
135         /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */
136         freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL2->AUDIOPLL0NUM))) / ((uint64_t)(CLKCTL2->AUDIOPLL0DENOM));
137         freq *= ((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_MULT_MASK) >> CLKCTL2_AUDIOPLL0CTL0_MULT_SHIFT;
138         freq += (uint32_t)freqTmp;
139     }
140     return freq;
141 }
142 
getAudioPllPfd1Freq(void)143 static uint32_t getAudioPllPfd1Freq(void)
144 {
145     uint32_t freq = getAudioPllFreq();
146 
147     if (((CLKCTL2->AUDIOPLL0CTL0) & CLKCTL2_AUDIOPLL0CTL0_BYPASS_MASK) == 0UL)
148     {
149         freq =
150             (uint32_t)((uint64_t)freq * 18U /
151                        ((CLKCTL2->AUDIOPLL0PFD & CLKCTL2_AUDIOPLL0PFD_PFD1_MASK) >> CLKCTL2_AUDIOPLL0PFD_PFD1_SHIFT));
152     }
153     return freq;
154 }
155 
SystemCoreClockUpdate(void)156 void SystemCoreClockUpdate(void)
157 {
158     uint32_t freq = 0U;
159 
160     switch ((CLKCTL1->SENSEDSPCPUCLKSEL) & CLKCTL1_SENSEDSPCPUCLKSEL_SEL_MASK)
161     {
162         case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(0):
163             freq = getBaseClkSense();
164             break;
165 
166         case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(1):
167             freq = getFro2MaxFreq();
168             break;
169 
170         case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(2):
171             freq = getAudioPllPfd1Freq();
172             break;
173 
174         case CLKCTL1_SENSEDSPCPUCLKSEL_SEL(3):
175             freq = getFro1MaxFreq();
176             break;
177 
178         default:
179             freq = 0U;
180             break;
181     }
182 
183     SystemCoreClock = freq / ((CLKCTL1->SENSEDSPCPUCLKDIV & CLKCTL1_SENSEDSPCPUCLKDIV_DIV_MASK) + 1U);
184 }
185 
186 /* ----------------------------------------------------------------------------
187    -- SystemInitHook()
188    ---------------------------------------------------------------------------- */
189 
SystemInitHook(void)190 __attribute__((weak)) void SystemInitHook(void)
191 {
192     /* Void implementation of the weak function. */
193 }
194