1 /*
2 ** ###################################################################
3 **     Processors:          MIMXRT555SFAWC
4 **                          MIMXRT555SFFOC
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:    iMXRT500RM Rev.0, 01/2021
12 **     Version:             rev. 5.0, 2020-08-27
13 **     Build:               b220711
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-2022 NXP
22 **     All rights reserved.
23 **
24 **     SPDX-License-Identifier: BSD-3-Clause
25 **
26 **     http:                 www.nxp.com
27 **     mail:                 support@nxp.com
28 **
29 **     Revisions:
30 **     - rev. 1.0 (2019-04-19)
31 **         Initial version.
32 **     - rev. 2.0 (2019-07-22)
33 **         Base on rev 0.7 RM.
34 **     - rev. 3.0 (2020-03-16)
35 **         Base on Rev.A RM.
36 **     - rev. 4.0 (2020-05-18)
37 **         Base on Rev.B RM.
38 **     - rev. 5.0 (2020-08-27)
39 **         Base on Rev.C RM.
40 **
41 ** ###################################################################
42 */
43 
44 /*!
45  * @file MIMXRT555S
46  * @version 5.0
47  * @date 2020-08-27
48  * @brief Device specific configuration file for MIMXRT555S (implementation file)
49  *
50  * Provides a system configuration function and a global variable that contains
51  * the system frequency. It configures the device and initializes the oscillator
52  * (PLL) that is part of the microcontroller device.
53  */
54 
55 #include <stdint.h>
56 #include "fsl_device_registers.h"
57 
58 #define SYSTEM_IS_XIP_FLEXSPI()                                                                               \
59     ((((uint32_t)SystemCoreClockUpdate >= 0x08000000U) && ((uint32_t)SystemCoreClockUpdate < 0x10000000U)) || \
60      (((uint32_t)SystemCoreClockUpdate >= 0x18000000U) && ((uint32_t)SystemCoreClockUpdate < 0x20000000U)))
61 
62 /* Get FRO DIV clock from FRODIVSEL */
getFroDivClk(void)63 static uint32_t getFroDivClk(void)
64 {
65     uint32_t freq = 0U;
66 
67     switch ((CLKCTL0->FRODIVSEL) & CLKCTL0_FRODIVSEL_SEL_MASK)
68     {
69         case CLKCTL0_FRODIVSEL_SEL(0):
70             freq = CLK_FRO_DIV2_CLK;
71             break;
72         case CLKCTL0_FRODIVSEL_SEL(1):
73             freq = CLK_FRO_DIV4_CLK;
74             break;
75         case CLKCTL0_FRODIVSEL_SEL(2):
76             freq = CLK_FRO_DIV8_CLK;
77             break;
78         case CLKCTL0_FRODIVSEL_SEL(3):
79             freq = CLK_FRO_DIV16_CLK;
80             break;
81         default:
82             freq = 0U;
83             break;
84     }
85 
86     return freq;
87 }
88 
89 /* ----------------------------------------------------------------------------
90    -- Core clock
91    ---------------------------------------------------------------------------- */
92 
93 uint32_t SystemCoreClock = DEFAULT_SYSTEM_CLOCK;
94 
95 /* ----------------------------------------------------------------------------
96    -- SystemInit()
97    ---------------------------------------------------------------------------- */
98 
SystemInit(void)99 __attribute__((weak)) void SystemInit(void)
100 {
101 #if ((__FPU_PRESENT == 1) && (__FPU_USED == 1))
102     SCB->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10, CP11 Full Access in Secure mode */
103 #if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
104     SCB_NS->CPACR |= ((3UL << 10 * 2) | (3UL << 11 * 2)); /* set CP10, CP11 Full Access in Non-secure mode */
105 #endif                                                    /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
106 #endif                                                    /* ((__FPU_PRESENT == 1) && (__FPU_USED == 1)) */
107 
108     SCB->CPACR |= ((3UL << 0 * 2) | (3UL << 1 * 2)); /* set CP0, CP1 Full Access in Secure mode (enable PowerQuad) */
109 
110 #if defined(__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U)
111     SCB_NS->CPACR |=
112         ((3UL << 0 * 2) | (3UL << 1 * 2)); /* set CP0, CP1 Full Access in Non-secure mode (enable PowerQuad) */
113 #endif                                     /* (__ARM_FEATURE_CMSE) && (__ARM_FEATURE_CMSE == 3U) */
114 
115     SCB->NSACR |= ((3UL << 0) | (3UL << 10)); /* enable CP0, CP1, CP10, CP11 Non-secure Access */
116 
117     SYSCTL0->DSPSTALL = SYSCTL0_DSPSTALL_DSPSTALL_MASK;
118 
119     PMC->CTRL |= PMC_CTRL_CLKDIVEN_MASK; /* enable the internal clock divider for power saving */
120 
121     if (SYSTEM_IS_XIP_FLEXSPI() && (CACHE64_POLSEL0->POLSEL == 0U)) /* set CAHCHE64 if not configured */
122     {
123         /* set command to invalidate all ways and write GO bit to initiate command */
124         CACHE64_CTRL0->CCR = CACHE64_CTRL_CCR_INVW1_MASK | CACHE64_CTRL_CCR_INVW0_MASK;
125         CACHE64_CTRL0->CCR |= CACHE64_CTRL_CCR_GO_MASK;
126         /* Wait until the command completes */
127         while ((CACHE64_CTRL0->CCR & CACHE64_CTRL_CCR_GO_MASK) != 0U)
128         {
129         }
130         /* Enable cache, enable write buffer */
131         CACHE64_CTRL0->CCR = (CACHE64_CTRL_CCR_ENWRBUF_MASK | CACHE64_CTRL_CCR_ENCACHE_MASK);
132 
133         /* Set whole FlexSPI0 space to write through. */
134         CACHE64_POLSEL0->REG0_TOP = 0x07FFFC00U;
135         CACHE64_POLSEL0->REG1_TOP = 0x0U;
136         CACHE64_POLSEL0->POLSEL   = 0x1U;
137 
138         __ISB();
139         __DSB();
140     }
141 
142     SystemInitHook();
143 }
144 
145 /* ----------------------------------------------------------------------------
146    -- SystemCoreClockUpdate()
147    ---------------------------------------------------------------------------- */
148 
SystemCoreClockUpdate(void)149 void SystemCoreClockUpdate(void)
150 {
151     /* iMXRT5xx systemCoreClockUpdate */
152     uint32_t freq    = 0U;
153     uint64_t freqTmp = 0U;
154 
155     switch ((CLKCTL0->MAINCLKSELB) & CLKCTL0_MAINCLKSELB_SEL_MASK)
156     {
157         case CLKCTL0_MAINCLKSELB_SEL(0): /* MAINCLKSELA clock */
158             switch ((CLKCTL0->MAINCLKSELA) & CLKCTL0_MAINCLKSELA_SEL_MASK)
159             {
160                 case CLKCTL0_MAINCLKSELA_SEL(0): /* Low Power Oscillator Clock (1m_lposc) */
161                     freq = CLK_LPOSC_1MHZ;
162                     break;
163                 case CLKCTL0_MAINCLKSELA_SEL(1): /* FRO DIV clock */
164                     freq = getFroDivClk();
165                     break;
166                 case CLKCTL0_MAINCLKSELA_SEL(2): /* OSC clock */
167                     freq = CLK_OSC_CLK;
168                     break;
169                 case CLKCTL0_MAINCLKSELA_SEL(3): /* FRO clock */
170                     freq = CLK_FRO_CLK;
171                     break;
172                 default:
173                     freq = 0U;
174                     break;
175             }
176             break;
177 
178         case CLKCTL0_MAINCLKSELB_SEL(1): /* Main System PLL clock */
179             switch ((CLKCTL0->SYSPLL0CLKSEL) & CLKCTL0_SYSPLL0CLKSEL_SEL_MASK)
180             {
181                 case CLKCTL0_SYSPLL0CLKSEL_SEL(0): /* FRO_DIV8 clock */
182                     freq = CLK_FRO_DIV8_CLK;
183                     break;
184                 case CLKCTL0_SYSPLL0CLKSEL_SEL(1): /* OSC clock */
185                     freq = CLK_OSC_CLK;
186                     break;
187                 default:
188                     freq = 0U;
189                     break;
190             }
191 
192             if (((CLKCTL0->SYSPLL0CTL0) & CLKCTL0_SYSPLL0CTL0_BYPASS_MASK) == 0U)
193             {
194                 /* PLL output frequency = Fref * (DIV_SELECT + NUM/DENOM). */
195                 freqTmp = ((uint64_t)freq * ((uint64_t)(CLKCTL0->SYSPLL0NUM))) / ((uint64_t)(CLKCTL0->SYSPLL0DENOM));
196                 freq *= ((CLKCTL0->SYSPLL0CTL0) & CLKCTL0_SYSPLL0CTL0_MULT_MASK) >> CLKCTL0_SYSPLL0CTL0_MULT_SHIFT;
197                 freq += (uint32_t)freqTmp;
198                 freq =
199                     (uint32_t)((uint64_t)freq * 18U /
200                                ((CLKCTL0->SYSPLL0PFD & CLKCTL0_SYSPLL0PFD_PFD0_MASK) >> CLKCTL0_SYSPLL0PFD_PFD0_SHIFT));
201             }
202 
203             freq = freq / ((CLKCTL0->MAINPLLCLKDIV & CLKCTL0_MAINPLLCLKDIV_DIV_MASK) + 1U);
204             break;
205 
206         case CLKCTL0_MAINCLKSELB_SEL(2): /* RTC 32KHz clock */
207             freq = CLK_RTC_32K_CLK;
208             break;
209 
210         default:
211             freq = 0U;
212             break;
213     }
214 
215     SystemCoreClock = freq / ((CLKCTL0->SYSCPUAHBCLKDIV & CLKCTL0_SYSCPUAHBCLKDIV_DIV_MASK) + 1U);
216 }
217 
218 /* ----------------------------------------------------------------------------
219    -- SystemInitHook()
220    ---------------------------------------------------------------------------- */
221 
SystemInitHook(void)222 __attribute__((weak)) void SystemInitHook(void)
223 {
224     /* Void implementation of the weak function. */
225 }
226