1
1
/*
2
+ * The Clear BSD License
2
3
* Copyright 2017 NXP
4
+ * All rights reserved.
3
5
*
4
6
* Redistribution and use in source and binary forms, with or without modification,
5
- * are permitted provided that the following conditions are met:
7
+ * are permitted (subject to the limitations in the disclaimer below) provided
8
+ * that the following conditions are met:
6
9
*
7
10
* o Redistributions of source code must retain the above copyright notice, this list
8
11
* of conditions and the following disclaimer.
15
18
* contributors may be used to endorse or promote products derived from this
16
19
* software without specific prior written permission.
17
20
*
21
+ * NO EXPRESS OR IMPLIED LICENSES TO ANY PARTY'S PATENT RIGHTS ARE GRANTED BY THIS LICENSE.
18
22
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
19
23
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20
24
* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
26
30
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
27
31
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
32
*/
33
+ /*
34
+ * How to setup clock using clock driver functions:
35
+ *
36
+ * 1. Call CLOCK_InitXXXPLL() to configure corresponding PLL clock.
37
+ *
38
+ * 2. Call CLOCK_InitXXXpfd() to configure corresponding PLL pfd clock.
39
+ *
40
+ * 3. Call CLOCK_SetMux() to configure corresponding clock source for target clock out.
41
+ *
42
+ * 4. Call CLOCK_SetDiv() to configure corresponding clock divider for target clock out.
43
+ *
44
+ * 5. Call CLOCK_SetXtalFreq() to set XTAL frequency based on board settings.
45
+ *
46
+ */
47
+
48
+ /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
49
+ !!GlobalInfo
50
+ product: Clocks v4.1
51
+ processor: MIMXRT1052xxxxB
52
+ package_id: MIMXRT1052DVL6B
53
+ mcu_data: ksdk2_0
54
+ processor_version: 0.0.0
55
+ board: IMXRT1050-EVKB
56
+ * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
29
57
30
- #include "fsl_common.h"
31
58
#include "fsl_clock_config.h"
32
59
33
60
/*******************************************************************************
34
61
* Definitions
35
62
******************************************************************************/
36
- /* ARM PLL configuration for RUN mode */
37
- const clock_arm_pll_config_t armPllConfig = {.loopDivider = 100U };
38
-
39
- /* SYS PLL configuration for RUN mode */
40
- const clock_sys_pll_config_t sysPllConfig = {.loopDivider = 1U };
41
-
42
- /* USB1 PLL configuration for RUN mode */
43
- const clock_usb_pll_config_t usb1PllConfig = {.loopDivider = 0U };
44
63
45
64
/*******************************************************************************
46
65
* Variables
@@ -49,59 +68,240 @@ const clock_usb_pll_config_t usb1PllConfig = {.loopDivider = 0U};
49
68
extern uint32_t SystemCoreClock ;
50
69
51
70
/*******************************************************************************
52
- * Code
71
+ ************************ BOARD_InitBootClocks function ************************
53
72
******************************************************************************/
54
- static void BOARD_BootClockGate (void )
73
+ void BOARD_InitBootClocks (void )
55
74
{
56
- /* Disable all unused peripheral clock */
57
- CCM -> CCGR0 = 0x00C0000FU ;
58
- CCM -> CCGR1 = 0x30000000U ;
59
- CCM -> CCGR2 = 0xFF3F303FU ;
60
- CCM -> CCGR3 = 0xF0000330U ;
61
- CCM -> CCGR4 = 0x0000FF3CU ;
62
- CCM -> CCGR5 = 0xF003330FU ;
63
- CCM -> CCGR6 = 0x00FC0F00U ;
75
+ BOARD_BootClockRUN ();
64
76
}
65
77
78
+ /*******************************************************************************
79
+ ********************** Configuration BOARD_BootClockRUN ***********************
80
+ ******************************************************************************/
81
+ /* TEXT BELOW IS USED AS SETTING FOR TOOLS *************************************
82
+ !!Configuration
83
+ name: BOARD_BootClockRUN
84
+ called_from_default_init: true
85
+ outputs:
86
+ - {id: AHB_CLK_ROOT.outFreq, value: 600 MHz}
87
+ - {id: CAN_CLK_ROOT.outFreq, value: 40 MHz}
88
+ - {id: CKIL_SYNC_CLK_ROOT.outFreq, value: 32.768 kHz}
89
+ - {id: CLK_1M.outFreq, value: 1 MHz}
90
+ - {id: CSI_CLK_ROOT.outFreq, value: 12 MHz}
91
+ - {id: ENET_125M_CLK.outFreq, value: 2.4 MHz}
92
+ - {id: ENET_25M_REF_CLK.outFreq, value: 1.2 MHz}
93
+ - {id: FLEXIO1_CLK_ROOT.outFreq, value: 30 MHz}
94
+ - {id: FLEXIO2_CLK_ROOT.outFreq, value: 30 MHz}
95
+ - {id: FLEXSPI_CLK_ROOT.outFreq, value: 37.5 MHz}
96
+ - {id: IPG_CLK_ROOT.outFreq, value: 150 MHz}
97
+ - {id: LCDIF_CLK_ROOT.outFreq, value: 67.5 MHz}
98
+ - {id: LPI2C_CLK_ROOT.outFreq, value: 60 MHz}
99
+ - {id: LPSPI_CLK_ROOT.outFreq, value: 105.6 MHz}
100
+ - {id: LVDS1_CLK.outFreq, value: 1.2 GHz}
101
+ - {id: PERCLK_CLK_ROOT.outFreq, value: 75 MHz}
102
+ - {id: PLL7_MAIN_CLK.outFreq, value: 24 MHz}
103
+ - {id: SAI1_CLK_ROOT.outFreq, value: 1080/17 MHz}
104
+ - {id: SAI2_CLK_ROOT.outFreq, value: 1080/17 MHz}
105
+ - {id: SAI3_CLK_ROOT.outFreq, value: 1080/17 MHz}
106
+ - {id: SEMC_CLK_ROOT.outFreq, value: 75 MHz}
107
+ - {id: SPDIF0_CLK_ROOT.outFreq, value: 30 MHz}
108
+ - {id: TRACE_CLK_ROOT.outFreq, value: 352/3 MHz}
109
+ - {id: UART_CLK_ROOT.outFreq, value: 80 MHz}
110
+ - {id: USDHC1_CLK_ROOT.outFreq, value: 198 MHz}
111
+ - {id: USDHC2_CLK_ROOT.outFreq, value: 198 MHz}
112
+ settings:
113
+ - {id: CCM.AHB_PODF.scale, value: '1', locked: true}
114
+ - {id: CCM.ARM_PODF.scale, value: '2', locked: true}
115
+ - {id: CCM.LPSPI_PODF.scale, value: '5', locked: true}
116
+ - {id: CCM.PERCLK_PODF.scale, value: '2', locked: true}
117
+ - {id: CCM.SEMC_PODF.scale, value: '8'}
118
+ - {id: CCM.TRACE_PODF.scale, value: '3', locked: true}
119
+ - {id: CCM_ANALOG.PLL1_BYPASS.sel, value: CCM_ANALOG.PLL1}
120
+ - {id: CCM_ANALOG.PLL1_PREDIV.scale, value: '1', locked: true}
121
+ - {id: CCM_ANALOG.PLL1_VDIV.scale, value: '50', locked: true}
122
+ - {id: CCM_ANALOG.PLL2.denom, value: '1', locked: true}
123
+ - {id: CCM_ANALOG.PLL2.num, value: '0', locked: true}
124
+ - {id: CCM_ANALOG.PLL2_BYPASS.sel, value: CCM_ANALOG.PLL2_OUT_CLK}
125
+ - {id: CCM_ANALOG.PLL2_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD0}
126
+ - {id: CCM_ANALOG.PLL2_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD1}
127
+ - {id: CCM_ANALOG.PLL2_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD2}
128
+ - {id: CCM_ANALOG.PLL2_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL2_PFD3}
129
+ - {id: CCM_ANALOG.PLL3_BYPASS.sel, value: CCM_ANALOG.PLL3}
130
+ - {id: CCM_ANALOG.PLL3_PFD0_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD0}
131
+ - {id: CCM_ANALOG.PLL3_PFD1_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD1}
132
+ - {id: CCM_ANALOG.PLL3_PFD2_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD2}
133
+ - {id: CCM_ANALOG.PLL3_PFD3_BYPASS.sel, value: CCM_ANALOG.PLL3_PFD3}
134
+ - {id: CCM_ANALOG.PLL4.denom, value: '50'}
135
+ - {id: CCM_ANALOG.PLL4.div, value: '47'}
136
+ - {id: CCM_ANALOG.PLL5.denom, value: '1'}
137
+ - {id: CCM_ANALOG.PLL5.div, value: '40'}
138
+ - {id: CCM_ANALOG.PLL5.num, value: '0'}
139
+ - {id: CCM_ANALOG_PLL_USB1_POWER_CFG, value: 'Yes'}
140
+ sources:
141
+ - {id: XTALOSC24M.OSC.outFreq, value: 24 MHz, enabled: true}
142
+ - {id: XTALOSC24M.RTC_OSC.outFreq, value: 32.768 kHz, enabled: true}
143
+ * BE CAREFUL MODIFYING THIS COMMENT - IT IS YAML SETTINGS FOR TOOLS **********/
144
+
145
+ /*******************************************************************************
146
+ * Variables for BOARD_BootClockRUN configuration
147
+ ******************************************************************************/
148
+ const clock_arm_pll_config_t armPllConfig_BOARD_BootClockRUN = {
149
+ .loopDivider = 100 , /* PLL loop divider, Fout = Fin * 50 */
150
+ };
151
+ const clock_sys_pll_config_t sysPllConfig_BOARD_BootClockRUN = {
152
+ .loopDivider = 1 , /* PLL loop divider, Fout = Fin * ( 20 + loopDivider*2 + numerator / denominator ) */
153
+ .numerator = 0 , /* 30 bit numerator of fractional loop divider */
154
+ .denominator = 1 , /* 30 bit denominator of fractional loop divider */
155
+ };
156
+ const clock_usb_pll_config_t usb1PllConfig_BOARD_BootClockRUN = {
157
+ .loopDivider = 0 , /* PLL loop divider, Fout = Fin * 20 */
158
+ };
159
+ /*******************************************************************************
160
+ * Code for BOARD_BootClockRUN configuration
161
+ ******************************************************************************/
66
162
void BOARD_BootClockRUN (void )
67
163
{
68
- /* Boot ROM did initialize the XTAL, here we only sets external XTAL OSC freq */
69
- CLOCK_SetXtalFreq (24000000U );
164
+ /* Init RTC OSC clock frequency. */
70
165
CLOCK_SetRtcXtalFreq (32768U );
71
-
72
- CLOCK_SetMux (kCLOCK_PeriphClk2Mux , 0x1 ); /* Set PERIPH_CLK2 MUX to OSC */
73
- CLOCK_SetMux (kCLOCK_PeriphMux , 0x1 ); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
74
-
75
- /* Setting the VDD_SOC to 1.5V. It is necessary to config AHB to 600Mhz */
166
+ /* Set XTAL 24MHz clock frequency. */
167
+ CLOCK_SetXtalFreq (24000000U );
168
+ /* Setting PeriphClk2Mux and PeriphMux to provide stable clock before PLLs are initialed */
169
+ CLOCK_SetMux (kCLOCK_PeriphClk2Mux , 1 ); /* Set PERIPH_CLK2 MUX to OSC */
170
+ CLOCK_SetMux (kCLOCK_PeriphMux , 1 ); /* Set PERIPH_CLK MUX to PERIPH_CLK2 */
171
+ /* Setting the VDD_SOC to 1.5V. It is necessary to config AHB to 600Mhz. */
76
172
DCDC -> REG3 = (DCDC -> REG3 & (~DCDC_REG3_TRG_MASK )) | DCDC_REG3_TRG (0x12 );
77
-
78
- CLOCK_InitArmPll (& armPllConfig ); /* Configure ARM PLL to 1200M */
173
+ /* Waiting for DCDC_STS_DC_OK bit is asserted */
174
+ while (DCDC_REG0_STS_DC_OK_MASK != (DCDC_REG0_STS_DC_OK_MASK & DCDC -> REG0 ))
175
+ {
176
+ }
177
+ /* Init ARM PLL. */
178
+ CLOCK_InitArmPll (& armPllConfig_BOARD_BootClockRUN );
179
+ /* Init System PLL. */
79
180
#ifndef SKIP_SYSCLK_INIT
80
- CLOCK_InitSysPll (& sysPllConfig ); /* Configure SYS PLL to 528M */
181
+ CLOCK_InitSysPll (& sysPllConfig_BOARD_BootClockRUN );
81
182
#endif
82
- #ifndef SKIP_USB_PLL_INIT
83
- CLOCK_InitUsb1Pll (& usb1PllConfig ); /* Configure USB1 PLL to 480M */
183
+ /* Init Usb1 PLL. */
184
+ #if !(defined(XIP_EXTERNAL_FLASH ) && (XIP_EXTERNAL_FLASH == 1 ))
185
+ CLOCK_InitUsb1Pll (& usb1PllConfig_BOARD_BootClockRUN );
84
186
#endif
85
- CLOCK_SetDiv (kCLOCK_ArmDiv , 0x1 ); /* Set ARM PODF to 0, divide by 2 */
86
- CLOCK_SetDiv (kCLOCK_AhbDiv , 0x0 ); /* Set AHB PODF to 0, divide by 1 */
87
- CLOCK_SetDiv (kCLOCK_IpgDiv , 0x3 ); /* Set IPG PODF to 3, divede by 4 */
88
-
89
- CLOCK_SetMux (kCLOCK_PrePeriphMux , 0x3 ); /* Set PRE_PERIPH_CLK to PLL1, 1200M */
90
- CLOCK_SetMux (kCLOCK_PeriphMux , 0x0 ); /* Set PERIPH_CLK MUX to PRE_PERIPH_CLK */
91
-
92
- /* Disable unused clock */
93
- BOARD_BootClockGate ();
94
-
95
- /* Power down all unused PLL */
96
- CLOCK_DeinitAudioPll ();
97
- CLOCK_DeinitVideoPll ();
98
- CLOCK_DeinitEnetPll ();
99
- CLOCK_DeinitUsb2Pll ();
100
-
101
- /* Configure UART divider to default */
102
- CLOCK_SetMux (kCLOCK_UartMux , 0 ); /* Set UART source to PLL3 80M */
103
- CLOCK_SetDiv (kCLOCK_UartDiv , 0 ); /* Set UART divider to 1 */
104
-
105
- /* Update core clock */
106
- SystemCoreClockUpdate ();
187
+ /* Enbale Audio PLL output. */
188
+ CCM_ANALOG -> PLL_AUDIO |= CCM_ANALOG_PLL_AUDIO_ENABLE_MASK ;
189
+ /* Enbale Video PLL output. */
190
+ CCM_ANALOG -> PLL_VIDEO |= CCM_ANALOG_PLL_VIDEO_ENABLE_MASK ;
191
+ /* Enable ENET PLL output. */
192
+ CCM_ANALOG -> PLL_ENET |= CCM_ANALOG_PLL_ENET_ENABLE_MASK ;
193
+ CCM_ANALOG -> PLL_ENET |= CCM_ANALOG_PLL_ENET_ENET_25M_REF_EN_MASK ;
194
+ /* Set PERIPH_CLK2_PODF. */
195
+ CLOCK_SetDiv (kCLOCK_PeriphClk2Div , 0 );
196
+ /* Set periph clock2 clock source. */
197
+ CLOCK_SetMux (kCLOCK_PeriphClk2Mux , 0 );
198
+ /* Set periph clock source. */
199
+ CLOCK_SetMux (kCLOCK_PeriphMux , 0 );
200
+ /* Set AHB_PODF. */
201
+ CLOCK_SetDiv (kCLOCK_AhbDiv , 0 );
202
+ /* Set IPG_PODF. */
203
+ CLOCK_SetDiv (kCLOCK_IpgDiv , 3 );
204
+ /* Set ARM_PODF. */
205
+ CLOCK_SetDiv (kCLOCK_ArmDiv , 1 );
206
+ /* Set preperiph clock source. */
207
+ CLOCK_SetMux (kCLOCK_PrePeriphMux , 3 );
208
+ /* Set PERCLK_PODF. */
209
+ CLOCK_SetDiv (kCLOCK_PerclkDiv , 1 );
210
+ /* Set per clock source. */
211
+ CLOCK_SetMux (kCLOCK_PerclkMux , 0 );
212
+ /* Set USDHC1_PODF. */
213
+ CLOCK_SetDiv (kCLOCK_Usdhc1Div , 1 );
214
+ /* Set Usdhc1 clock source. */
215
+ CLOCK_SetMux (kCLOCK_Usdhc1Mux , 0 );
216
+ /* Set USDHC2_PODF. */
217
+ CLOCK_SetDiv (kCLOCK_Usdhc2Div , 1 );
218
+ /* Set Usdhc2 clock source. */
219
+ CLOCK_SetMux (kCLOCK_Usdhc2Mux , 0 );
220
+ #ifndef SKIP_SYSCLK_INIT
221
+ /* Set SEMC_PODF. */
222
+ CLOCK_SetDiv (kCLOCK_SemcDiv , 7 );
223
+ /* Set Semc alt clock source. */
224
+ CLOCK_SetMux (kCLOCK_SemcAltMux , 0 );
225
+ /* Set Semc clock source. */
226
+ CLOCK_SetMux (kCLOCK_SemcMux , 0 );
227
+ #endif
228
+ #if !(defined(XIP_EXTERNAL_FLASH ) && (XIP_EXTERNAL_FLASH == 1 ))
229
+ /* Set FLEXSPI_PODF. */
230
+ CLOCK_SetDiv (kCLOCK_FlexspiDiv , 1 );
231
+ /* Set Flexspi clock source. */
232
+ CLOCK_SetMux (kCLOCK_FlexspiMux , 0 );
233
+ #endif
234
+ /* Set CSI_PODF. */
235
+ CLOCK_SetDiv (kCLOCK_CsiDiv , 1 );
236
+ /* Set Csi clock source. */
237
+ CLOCK_SetMux (kCLOCK_CsiMux , 0 );
238
+ /* Set LPSPI_PODF. */
239
+ CLOCK_SetDiv (kCLOCK_LpspiDiv , 4 );
240
+ /* Set Lpspi clock source. */
241
+ CLOCK_SetMux (kCLOCK_LpspiMux , 2 );
242
+ /* Set TRACE_PODF. */
243
+ CLOCK_SetDiv (kCLOCK_TraceDiv , 2 );
244
+ /* Set Trace clock source. */
245
+ CLOCK_SetMux (kCLOCK_TraceMux , 2 );
246
+ /* Set SAI1_CLK_PRED. */
247
+ CLOCK_SetDiv (kCLOCK_Sai1PreDiv , 3 );
248
+ /* Set SAI1_CLK_PODF. */
249
+ CLOCK_SetDiv (kCLOCK_Sai1Div , 1 );
250
+ /* Set Sai1 clock source. */
251
+ CLOCK_SetMux (kCLOCK_Sai1Mux , 0 );
252
+ /* Set SAI2_CLK_PRED. */
253
+ CLOCK_SetDiv (kCLOCK_Sai2PreDiv , 3 );
254
+ /* Set SAI2_CLK_PODF. */
255
+ CLOCK_SetDiv (kCLOCK_Sai2Div , 1 );
256
+ /* Set Sai2 clock source. */
257
+ CLOCK_SetMux (kCLOCK_Sai2Mux , 0 );
258
+ /* Set SAI3_CLK_PRED. */
259
+ CLOCK_SetDiv (kCLOCK_Sai3PreDiv , 3 );
260
+ /* Set SAI3_CLK_PODF. */
261
+ CLOCK_SetDiv (kCLOCK_Sai3Div , 1 );
262
+ /* Set Sai3 clock source. */
263
+ CLOCK_SetMux (kCLOCK_Sai3Mux , 0 );
264
+ /* Set LPI2C_CLK_PODF. */
265
+ CLOCK_SetDiv (kCLOCK_Lpi2cDiv , 0 );
266
+ /* Set Lpi2c clock source. */
267
+ CLOCK_SetMux (kCLOCK_Lpi2cMux , 0 );
268
+ /* Set CAN_CLK_PODF. */
269
+ CLOCK_SetDiv (kCLOCK_CanDiv , 1 );
270
+ /* Set Can clock source. */
271
+ CLOCK_SetMux (kCLOCK_CanMux , 2 );
272
+ /* Set UART_CLK_PODF. */
273
+ CLOCK_SetDiv (kCLOCK_UartDiv , 0 );
274
+ /* Set Uart clock source. */
275
+ CLOCK_SetMux (kCLOCK_UartMux , 0 );
276
+ /* Set LCDIF_PRED. */
277
+ CLOCK_SetDiv (kCLOCK_LcdifPreDiv , 1 );
278
+ /* Set LCDIF_CLK_PODF. */
279
+ CLOCK_SetDiv (kCLOCK_LcdifDiv , 3 );
280
+ /* Set Lcdif pre clock source. */
281
+ CLOCK_SetMux (kCLOCK_LcdifPreMux , 5 );
282
+ /* Set SPDIF0_CLK_PRED. */
283
+ CLOCK_SetDiv (kCLOCK_Spdif0PreDiv , 1 );
284
+ /* Set SPDIF0_CLK_PODF. */
285
+ CLOCK_SetDiv (kCLOCK_Spdif0Div , 7 );
286
+ /* Set Spdif clock source. */
287
+ CLOCK_SetMux (kCLOCK_SpdifMux , 3 );
288
+ /* Set FLEXIO1_CLK_PRED. */
289
+ CLOCK_SetDiv (kCLOCK_Flexio1PreDiv , 1 );
290
+ /* Set FLEXIO1_CLK_PODF. */
291
+ CLOCK_SetDiv (kCLOCK_Flexio1Div , 7 );
292
+ /* Set Flexio1 clock source. */
293
+ CLOCK_SetMux (kCLOCK_Flexio1Mux , 3 );
294
+ /* Set FLEXIO2_CLK_PRED. */
295
+ CLOCK_SetDiv (kCLOCK_Flexio2PreDiv , 1 );
296
+ /* Set FLEXIO2_CLK_PODF. */
297
+ CLOCK_SetDiv (kCLOCK_Flexio2Div , 7 );
298
+ /* Set Flexio2 clock source. */
299
+ CLOCK_SetMux (kCLOCK_Flexio2Mux , 3 );
300
+ /* Set Pll3 sw clock source. */
301
+ CLOCK_SetMux (kCLOCK_Pll3SwMux , 0 );
302
+ /* Set lvds1 clock source. */
303
+ CCM_ANALOG -> MISC1 =
304
+ (CCM_ANALOG -> MISC1 & (~CCM_ANALOG_MISC1_LVDS1_CLK_SEL_MASK )) | CCM_ANALOG_MISC1_LVDS1_CLK_SEL (0 );
305
+ /* Set SystemCoreClock variable. */
306
+ SystemCoreClock = BOARD_BOOTCLOCKRUN_CORE_CLOCK ;
107
307
}
0 commit comments