1
1
/*
2
- * Copyright 2024 NXP
2
+ * Copyright 2024, 2025 NXP
3
3
* Copyright (c) 2019-2021 Vestas Wind Systems A/S
4
4
*
5
5
* Based on NXP k6x soc.c, which is:
@@ -43,13 +43,19 @@ static const scg_sys_clk_config_t scg_sys_clk_config = {
43
43
.src = kSCG_SysClkSrcSirc ,
44
44
#elif DT_SAME_NODE (DT_CLOCKS_CTLR (SCG_CLOCK_NODE (core_clk )), SCG_CLOCK_NODE (firc_clk ))
45
45
.src = kSCG_SysClkSrcFirc ,
46
+ #elif DT_SAME_NODE (DT_CLOCKS_CTLR (SCG_CLOCK_NODE (core_clk )), SCG_CLOCK_NODE (lpfll_clk ))
47
+ .src = kSCG_SysClkSrcLpFll ,
48
+ #elif DT_SAME_NODE (DT_CLOCKS_CTLR (SCG_CLOCK_NODE (core_clk )), SCG_CLOCK_NODE (sosc_clk ))
49
+ .src = kSCG_SysClkSrcSysOsc ,
50
+ #else
51
+ #error Invalid SCG core clock selected
46
52
#endif
47
53
};
48
54
49
55
/* Slow Internal Reference Clock (SIRC) configuration */
50
56
ASSERT_ASYNC_CLK_DIV_VALID (SCG_CLOCK_DIV (sircdiv2_clk ),
51
57
"Invalid SCG SIRC divider 2 value" );
52
- static const scg_sirc_config_t scg_sirc_config = {
58
+ static scg_sirc_config_t scg_sirc_config = {
53
59
.enableMode = kSCG_SircEnable ,
54
60
.div2 = TO_ASYNC_CLK_DIV (SCG_CLOCK_DIV (sircdiv2_clk )),
55
61
#if MHZ (2 ) == DT_PROP (SCG_CLOCK_NODE (sirc_clk ), clock_frequency )
@@ -66,7 +72,7 @@ ASSERT_ASYNC_CLK_DIV_VALID(SCG_CLOCK_DIV(fircdiv2_clk),
66
72
"Invalid SCG FIRC divider 2 value" );
67
73
static const scg_firc_config_t scg_firc_config = {
68
74
.enableMode = kSCG_FircEnable ,
69
- .div2 = TO_ASYNC_CLK_DIV (SCG_CLOCK_DIV (fircdiv2_clk )), /* b20253 */
75
+ .div2 = TO_ASYNC_CLK_DIV (SCG_CLOCK_DIV (fircdiv2_clk )),
70
76
#if MHZ (48 ) == DT_PROP (SCG_CLOCK_NODE (firc_clk ), clock_frequency )
71
77
.range = kSCG_FircRange48M ,
72
78
#elif MHZ (52 ) == DT_PROP (SCG_CLOCK_NODE (firc_clk ), clock_frequency )
@@ -81,31 +87,90 @@ static const scg_firc_config_t scg_firc_config = {
81
87
.trimConfig = NULL
82
88
};
83
89
84
- __weak void clk_init (void )
90
+ #if DT_NODE_HAS_STATUS_OKAY (SCG_CLOCK_NODE (sosc_clk ))
91
+ /* System Oscillator (SOSC) configuration */
92
+ ASSERT_ASYNC_CLK_DIV_VALID (SCG_CLOCK_DIV (soscdiv2_clk )),
93
+ "Invalid SCG SOSC divider 2 value" );
94
+ static const scg_sosc_config_t scg_sosc_config = {
95
+ .freq = DT_PROP (SCG_CLOCK_NODE (sosc_clk ), clock_frequency ),
96
+ .monitorMode = kSCG_SysOscMonitorDisable ,
97
+ .enableMode = kSCG_SysOscEnable | kSCG_SysOscEnableInLowPower ,
98
+ .div2 = TO_ASYNC_CLK_DIV (SCG_CLOCK_DIV (soscdiv2_clk )),
99
+ .workMode = DT_PROP (DT_INST (0 , nxp_kinetis_scg ), sosc_mode )
100
+ };
101
+ #endif /* DT_NODE_HAS_PROP(DT_INST(0, nxp_kinetis_scg), sosc_freq) */
102
+
103
+
104
+ static const scg_lpfll_config_t scg_lpfll_config = {
105
+ .enableMode = kSCG_LpFllEnable ,
106
+ .div2 = TO_ASYNC_CLK_DIV (SCG_CLOCK_DIV (flldiv2_clk )),
107
+ #if MHZ (48 ) == DT_PROP (SCG_CLOCK_NODE (lpfll_clk ), clock_frequency )
108
+ .range = kSCG_LpFllRange48M ,
109
+ #elif MHZ (72 ) == DT_PROP (SCG_CLOCK_NODE (lpfll_clk ), clock_frequency )
110
+ .range = kSCG_LpFllRange72M ,
111
+ #elif MHZ (96 ) == DT_PROP (SCG_CLOCK_NODE (lpfll_clk ), clock_frequency )
112
+ .range = kSCG_LpFllRange96M ,
113
+ #else
114
+ #error Invalid SCG FLL clock frequency
115
+ #endif
116
+ .trimConfig = NULL ,
117
+ };
118
+
119
+
120
+ static void CLOCK_CONFIG_FircSafeConfig (const scg_firc_config_t * fircConfig )
85
121
{
86
- const scg_sys_clk_config_t scg_sys_clk_config_safe = {
87
- .divSlow = kSCG_SysClkDivBy4 ,
88
- .divCore = kSCG_SysClkDivBy1 ,
89
- .src = kSCG_SysClkSrcSirc
122
+ scg_sys_clk_config_t curConfig ;
123
+ const scg_sirc_config_t scgSircConfig = {.enableMode = kSCG_SircEnable ,
124
+ .div2 = kSCG_AsyncClkDivBy2 ,
125
+ .range = kSCG_SircRangeHigh };
126
+ scg_sys_clk_config_t sysClkSafeConfigSource = {
127
+ .divSlow = kSCG_SysClkDivBy4 , /* Slow clock divider */
128
+ .divCore = kSCG_SysClkDivBy1 , /* Core clock divider */
129
+ .src = kSCG_SysClkSrcSirc /* System clock source */
90
130
};
91
- scg_sys_clk_config_t current ;
131
+ /* Init Sirc. */
132
+ CLOCK_InitSirc (& scgSircConfig );
133
+ /* Change to use SIRC as system clock source to prepare to change FIRCCFG register. */
134
+ CLOCK_SetRunModeSysClkConfig (& sysClkSafeConfigSource );
135
+ /* Wait for clock source switch finished. */
136
+ do {
137
+ CLOCK_GetCurSysClkConfig (& curConfig );
138
+ } while (curConfig .src != sysClkSafeConfigSource .src );
139
+
140
+ /* Init Firc. */
141
+ CLOCK_InitFirc (fircConfig );
142
+ /* Change back to use FIRC as system clock source in order to configure SIRC if needed. */
143
+ sysClkSafeConfigSource .src = kSCG_SysClkSrcFirc ;
144
+ CLOCK_SetRunModeSysClkConfig (& sysClkSafeConfigSource );
145
+ /* Wait for clock source switch finished. */
146
+ do {
147
+ CLOCK_GetCurSysClkConfig (& curConfig );
148
+ } while (curConfig .src != sysClkSafeConfigSource .src );
149
+ }
92
150
93
- /* Configure SIRC */
94
- CLOCK_InitSirc (& scg_sirc_config );
95
151
96
- /* Temporary switch to safe SIRC in order to configure FIRC */
97
- CLOCK_SetRunModeSysClkConfig (& scg_sys_clk_config_safe );
98
- do {
99
- CLOCK_GetCurSysClkConfig (& current );
100
- } while (current .src != scg_sys_clk_config_safe .src );
101
- CLOCK_InitFirc (& scg_firc_config );
152
+ __weak void clk_init (void )
153
+ {
154
+ scg_sys_clk_config_t current ;
102
155
103
- /* Only RUN mode supported for now */
104
- CLOCK_SetRunModeSysClkConfig (& scg_sys_clk_config );
156
+ #if DT_NODE_HAS_STATUS_OKAY (SCG_CLOCK_NODE (sosc_clk ))
157
+ /* Init SOSC according to board configuration. */
158
+ CLOCK_InitSysOsc (& scg_sysosc_config );
159
+ CLOCK_SetXtal0Freq (scg_sysosc_config .freq );
160
+ #endif
161
+ /* Init FIRC. */
162
+ CLOCK_CONFIG_FircSafeConfig (& scg_firc_config );
163
+ /* Init SIRC. */
164
+ CLOCK_InitSirc (& scg_sirc_config );
165
+ /* Init LPFLL. */
166
+ CLOCK_InitLpFll (& scg_lpfll_config );
167
+ /* Finally init the App desired clock */
168
+ CLOCK_SetRunModeSysClkConfig (& scg_sys_clk_config );
105
169
do {
106
- CLOCK_GetCurSysClkConfig (& current );
170
+ CLOCK_GetCurSysClkConfig (& current );
107
171
} while (current .src != scg_sys_clk_config .src );
108
172
173
+
109
174
#if DT_NODE_HAS_STATUS_OKAY (DT_NODELABEL (lpuart0 ))
110
175
CLOCK_SetIpSrc (kCLOCK_Lpuart0 ,
111
176
DT_CLOCKS_CELL (DT_NODELABEL (lpuart0 ), ip_source ));
0 commit comments