1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7 /***********************************************************************************************************************
8 * Includes <System Includes> , "Project Includes"
9 **********************************************************************************************************************/
10 #include "bsp_clocks.h"
11
12 #if BSP_TZ_NONSECURE_BUILD
13 #include "bsp_guard.h"
14 #endif
15
16 /***********************************************************************************************************************
17 * Macro definitions
18 **********************************************************************************************************************/
19
20 /* The number of clocks is used to size the g_clock_freq array. */
21 #define BSP_PRV_NUM_CLOCKS (FSP_PRIV_CLOCK_NUM)
22
23 /***********************************************************************************************************************
24 * Typedef definitions
25 **********************************************************************************************************************/
26
27 /***********************************************************************************************************************
28 * Exported global variables (to be accessed by other files)
29 **********************************************************************************************************************/
30
31 /***********************************************************************************************************************
32 * Private global variables and functions
33 **********************************************************************************************************************/
34 static void bsp_prv_clock_pre_setting(fsp_priv_clock_t clock);
35 static void bsp_prv_clock_post_setting(fsp_priv_clock_t clock);
36 void bsp_prv_clock_selector_set(fsp_priv_clock_t clock, uint32_t clock_sel);
37 void bsp_prv_clock_divider_set(fsp_priv_clock_t clock, uint32_t clock_div);
38
39 /*******************************************************************************************************************//**
40 * @internal
41 * @addtogroup BSP_MCU_PRV Internal BSP Documentation
42 * @ingroup RENESAS_INTERNAL
43 * @{
44 **********************************************************************************************************************/
45
46 /* This array stores the clock frequency of each bus clock. This section of RAM should not be initialized by the C
47 * runtime environment. This is initialized and used in bsp_clock_init, which is called before the C runtime
48 * environment is initialized. */
49 static uint32_t g_clock_freq[BSP_PRV_NUM_CLOCKS] BSP_PLACE_IN_SECTION(BSP_SECTION_NOINIT);
50
51 /*******************************************************************************************************************//**
52 * Update SystemCoreClock variable based on current clock settings.
53 **********************************************************************************************************************/
SystemCoreClockUpdate(void)54 void SystemCoreClockUpdate (void)
55 {
56 SystemCoreClock = g_clock_freq[FSP_PRIV_CLOCK_I2CLK];
57 }
58
59 /*******************************************************************************************************************//**
60 * Initializes variable to store system clock frequencies.
61 **********************************************************************************************************************/
62 #if BSP_TZ_CFG_INIT_SECURE_ONLY
bsp_clock_freq_var_init(void)63 void bsp_clock_freq_var_init (void)
64 #else
65 static void bsp_clock_freq_var_init (void)
66 #endif
67 {
68 #if defined(BSP_CFG_CLOCK_ICLK_HZ)
69 g_clock_freq[FSP_PRIV_CLOCK_ICLK] = BSP_CFG_CLOCK_ICLK_HZ;
70 #endif
71 #if defined(BSP_CFG_CLOCK_I2CLK_HZ)
72 g_clock_freq[FSP_PRIV_CLOCK_I2CLK] = BSP_CFG_CLOCK_I2CLK_HZ;
73 #endif
74 #if defined(BSP_CFG_CLOCK_GCLK_HZ)
75 g_clock_freq[FSP_PRIV_CLOCK_GCLK] = BSP_CFG_CLOCK_GCLK_HZ;
76 #endif
77 #if defined(BSP_CFG_CLOCK_S0CLK_HZ)
78 g_clock_freq[FSP_PRIV_CLOCK_S0CLK] = BSP_CFG_CLOCK_S0CLK_HZ;
79 #endif
80 #if defined(BSP_CFG_CLOCK_SPI0CLK_HZ)
81 g_clock_freq[FSP_PRIV_CLOCK_SPI0CLK] = BSP_CFG_CLOCK_SPI0CLK_HZ;
82 #endif
83 #if defined(BSP_CFG_CLOCK_SPI1CLK_HZ)
84 g_clock_freq[FSP_PRIV_CLOCK_SPI1CLK] = BSP_CFG_CLOCK_SPI1CLK_HZ;
85 #endif
86 #if defined(BSP_CFG_CLOCK_SD0CLK_HZ)
87 g_clock_freq[FSP_PRIV_CLOCK_SD0CLK] = BSP_CFG_CLOCK_SD0CLK_HZ;
88 #endif
89 #if defined(BSP_CFG_CLOCK_SD1CLK_HZ)
90 g_clock_freq[FSP_PRIV_CLOCK_SD1CLK] = BSP_CFG_CLOCK_SD1CLK_HZ;
91 #endif
92 #if defined(BSP_CFG_CLOCK_M0CLK_HZ)
93 g_clock_freq[FSP_PRIV_CLOCK_M0CLK] = BSP_CFG_CLOCK_M0CLK_HZ;
94 #endif
95 #if defined(BSP_CFG_CLOCK_M1CLK_HZ)
96 g_clock_freq[FSP_PRIV_CLOCK_M1CLK] = BSP_CFG_CLOCK_M1CLK_HZ;
97 #endif
98 #if defined(BSP_CFG_CLOCK_M2CLK_HZ)
99 g_clock_freq[FSP_PRIV_CLOCK_M2CLK] = BSP_CFG_CLOCK_M2CLK_HZ;
100 #endif
101 #if defined(BSP_CFG_CLOCK_M3CLK_HZ)
102 g_clock_freq[FSP_PRIV_CLOCK_M3CLK] = BSP_CFG_CLOCK_M3CLK_HZ;
103 #endif
104 #if defined(BSP_CFG_CLOCK_M4CLK_HZ)
105 g_clock_freq[FSP_PRIV_CLOCK_M4CLK] = BSP_CFG_CLOCK_M4CLK_HZ;
106 #endif
107 #if defined(BSP_CFG_CLOCK_HPCLK_HZ)
108 g_clock_freq[FSP_PRIV_CLOCK_HPCLK] = BSP_CFG_CLOCK_HPCLK_HZ;
109 #endif
110 #if defined(BSP_CFG_CLOCK_TSUCLK_HZ)
111 g_clock_freq[FSP_PRIV_CLOCK_TSUCLK] = BSP_CFG_CLOCK_TSUCLK_HZ;
112 #endif
113 #if defined(BSP_CFG_CLOCK_ZTCLK_HZ)
114 g_clock_freq[FSP_PRIV_CLOCK_ZTCLK] = BSP_CFG_CLOCK_ZTCLK_HZ;
115 #endif
116 #if defined(BSP_CFG_CLOCK_P0CLK_HZ)
117 g_clock_freq[FSP_PRIV_CLOCK_P0CLK] = BSP_CFG_CLOCK_P0CLK_HZ;
118 #endif
119 #if defined(BSP_CFG_CLOCK_P1CLK_HZ)
120 g_clock_freq[FSP_PRIV_CLOCK_P1CLK] = BSP_CFG_CLOCK_P1CLK_HZ;
121 #endif
122 #if defined(BSP_CFG_CLOCK_P2CLK_HZ)
123 g_clock_freq[FSP_PRIV_CLOCK_P2CLK] = BSP_CFG_CLOCK_P2CLK_HZ;
124 #endif
125 #if defined(BSP_CFG_CLOCK_ATCLK_HZ)
126 g_clock_freq[FSP_PRIV_CLOCK_ATCLK] = BSP_CFG_CLOCK_ATCLK_HZ;
127 #endif
128 #if defined(BSP_CFG_CLOCK_OSCCLK_HZ)
129 g_clock_freq[FSP_PRIV_CLOCK_OSCCLK] = BSP_CFG_CLOCK_OSCCLK_HZ;
130 #endif
131 #if defined(BSP_CFG_CLOCK_I3CLK_HZ)
132 g_clock_freq[FSP_PRIV_CLOCK_I3CLK] = BSP_CFG_CLOCK_I3CLK_HZ;
133 #endif
134 #if defined(BSP_CFG_CLOCK_P3CLK_HZ)
135 g_clock_freq[FSP_PRIV_CLOCK_P3CLK] = BSP_CFG_CLOCK_P3CLK_HZ;
136 #endif
137 #if defined(BSP_CFG_CLOCK_P4CLK_HZ)
138 g_clock_freq[FSP_PRIV_CLOCK_P4CLK] = BSP_CFG_CLOCK_P4CLK_HZ;
139 #endif
140 #if defined(BSP_CFG_CLOCK_P5CLK_HZ)
141 g_clock_freq[FSP_PRIV_CLOCK_P5CLK] = BSP_CFG_CLOCK_P5CLK_HZ;
142 #endif
143 #if defined(BSP_CFG_CLOCK_SD2CLK_HZ)
144 g_clock_freq[FSP_PRIV_CLOCK_SD2CLK] = BSP_CFG_CLOCK_SD2CLK_HZ;
145 #endif
146 #if defined(BSP_CFG_CLOCK_OC0CLK_HZ)
147 g_clock_freq[FSP_PRIV_CLOCK_OC0CLK] = BSP_CFG_CLOCK_OC0CLK_HZ;
148 #endif
149 #if defined(BSP_CFG_CLOCK_OC1CLK_HZ)
150 g_clock_freq[FSP_PRIV_CLOCK_OC1CLK] = BSP_CFG_CLOCK_OC1CLK_HZ;
151 #endif
152 #if defined(BSP_CFG_CLOCK_OSCCLK2_HZ)
153 g_clock_freq[FSP_PRIV_CLOCK_OSCCLK2] = BSP_CFG_CLOCK_OSCCLK2_HZ;
154 #endif
155
156 /* The SystemCoreClock needs to be updated before calling R_BSP_SoftwareDelay. */
157 SystemCoreClockUpdate();
158 }
159
160 /*******************************************************************************************************************//**
161 * Initializes system clocks. Makes no assumptions about current register settings.
162 **********************************************************************************************************************/
bsp_clock_init(void)163 void bsp_clock_init (void)
164 {
165 bsp_clock_freq_var_init();
166 }
167
168 /*******************************************************************************************************************//**
169 * Clock frequency configuration. According to the information specified in the Clocks tab, the divider and clock selector are initialized.
170 **********************************************************************************************************************/
bsp_clock_freq_init_cfg(void)171 void bsp_clock_freq_init_cfg (void)
172 {
173 #if BSP_FEATURE_BSP_CLOCK_FREQ_INIT_CFG_SUPPORT
174 uint32_t setting_value = 0;
175
176 /* Set CPG_PL1_DDIV to configure the frequency of ICLK. */
177 setting_value = (uint32_t) (BSP_CFG_DIVPL1_SET_DIV << R_CPG_CPG_PL1_DDIV_DIVPL1_SET_Pos);
178 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVPL1_STS_Msk & R_CPG->CPG_CLKDIVSTATUS), 0U);
179 R_CPG->CPG_PL1_DDIV =
180 (uint32_t) (R_CPG_CPG_PL1_DDIV_DIV_PLL1SET_WEN_Msk | (R_CPG_CPG_PL1_DDIV_DIVPL1_SET_Msk & setting_value));
181 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVPL1_STS_Msk & R_CPG->CPG_CLKDIVSTATUS), 0U);
182
183 /* Set CPG_PL2_DDIV to configure the frequency of P0CLK. */
184 setting_value = (uint32_t) (BSP_CFG_DIVPL2B_SET_DIV << R_CPG_CPG_PL2_DDIV_DIVPL2B_SET_Pos);
185 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVPL2B_STS_Msk & R_CPG->CPG_CLKDIVSTATUS), 0U);
186 R_CPG->CPG_PL2_DDIV =
187 (uint32_t) (R_CPG_CPG_PL2_DDIV_DIV_PLL2_B_WEN_Msk | (R_CPG_CPG_PL2_DDIV_DIVPL2B_SET_Msk & setting_value));
188 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVPL2B_STS_Msk & R_CPG->CPG_CLKDIVSTATUS), 0U);
189
190 /* Set CPG_PL3_DDIV to configure the frequency of P1CLK, P2CLK and P3CLK. */
191 setting_value = (uint32_t) ((BSP_CFG_DIVPL3A_SET_DIV << R_CPG_CPG_PL3_DDIV_DIVPL3A_SET_Pos) |
192 (BSP_CFG_DIVPL3B_SET_DIV << R_CPG_CPG_PL3_DDIV_DIVPL3B_SET_Pos) |
193 (BSP_CFG_DIVPL3C_SET_DIV << R_CPG_CPG_PL3_DDIV_DIVPL3C_SET_Pos));
194 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKDIVSTATUS_DIVPL3A_STS_Msk | R_CPG_CPG_CLKDIVSTATUS_DIVPL3B_STS_Msk |
195 R_CPG_CPG_CLKDIVSTATUS_DIVPL3C_STS_Msk) &
196 R_CPG->CPG_CLKDIVSTATUS),
197 0U);
198 R_CPG->CPG_PL3_DDIV =
199 (uint32_t) ((R_CPG_CPG_PL3_DDIV_DIV_PLL3_A_WEN_Msk | R_CPG_CPG_PL3_DDIV_DIV_PLL3_B_WEN_Msk |
200 R_CPG_CPG_PL3_DDIV_DIV_PLL3_C_WEN_Msk) |
201 ((R_CPG_CPG_PL3_DDIV_DIVPL3A_SET_Msk | R_CPG_CPG_PL3_DDIV_DIVPL3B_SET_Msk |
202 R_CPG_CPG_PL3_DDIV_DIVPL3C_SET_Msk) &
203 setting_value));
204 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKDIVSTATUS_DIVPL3A_STS_Msk | R_CPG_CPG_CLKDIVSTATUS_DIVPL3B_STS_Msk |
205 R_CPG_CPG_CLKDIVSTATUS_DIVPL3C_STS_Msk) &
206 R_CPG->CPG_CLKDIVSTATUS),
207 0U);
208
209 /* Set CPG_PL6_DDIV to configure the frequency of I2CLK and I3CLK. */
210 setting_value = (uint32_t) ((BSP_CFG_DIVPL6A_SET_DIV << R_CPG_CPG_PL6_DDIV_DIVPL6A_SET_Pos) |
211 (BSP_CFG_DIVPL6B_SET_DIV << R_CPG_CPG_PL6_DDIV_DIVPL6B_SET_Pos));
212 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKDIVSTATUS_DIVPL6A_STS_Msk | R_CPG_CPG_CLKDIVSTATUS_DIVPL6B_STS_Msk) &
213 R_CPG->CPG_CLKDIVSTATUS),
214 0U);
215 R_CPG->CPG_PL6_DDIV =
216 (uint32_t) ((R_CPG_CPG_PL6_DDIV_DIV_PLL6_A_WEN_Msk | R_CPG_CPG_PL6_DDIV_DIV_PLL6_B_WEN_Msk) |
217 ((R_CPG_CPG_PL6_DDIV_DIVPL6A_SET_Msk | R_CPG_CPG_PL6_DDIV_DIVPL6B_SET_Msk) &
218 setting_value));
219 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKDIVSTATUS_DIVPL6A_STS_Msk | R_CPG_CPG_CLKDIVSTATUS_DIVPL6B_STS_Msk) &
220 R_CPG->CPG_CLKDIVSTATUS),
221 0U);
222
223 /* Set CPG_SDHI_DDIV and CPG_SDHI_DSEL to configure the frequency of SD0CLK, SD1CLK and SD2CLK. */
224 setting_value = (uint32_t) ((BSP_CFG_DIVSDHI0_SET_DIV << R_CPG_CPG_SDHI_DDIV_DIVSDHI0_SET_Pos) |
225 (BSP_CFG_DIVSDHI1_SET_DIV << R_CPG_CPG_SDHI_DDIV_DIVSDHI1_SET_Pos) |
226 (BSP_CFG_DIVSDHI2_SET_DIV << R_CPG_CPG_SDHI_DDIV_DIVSDHI2_SET_Pos));
227 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKDIVSTATUS_DIVSDHI0_STS_Msk | R_CPG_CPG_CLKDIVSTATUS_DIVSDHI1_STS_Msk |
228 R_CPG_CPG_CLKDIVSTATUS_DIVSDHI2_STS_Msk) &
229 R_CPG->CPG_CLKDIVSTATUS),
230 0U);
231 R_CPG->CPG_SDHI_DDIV =
232 (uint32_t) ((R_CPG_CPG_SDHI_DDIV_DIVSDHI0_WEN_Msk | R_CPG_CPG_SDHI_DDIV_DIVSDHI1_WEN_Msk |
233 R_CPG_CPG_SDHI_DDIV_DIVSDHI2_WEN_Msk) |
234 ((R_CPG_CPG_SDHI_DDIV_DIVSDHI0_SET_Msk | R_CPG_CPG_SDHI_DDIV_DIVSDHI1_SET_Msk |
235 R_CPG_CPG_SDHI_DDIV_DIVSDHI2_SET_Msk) &
236 setting_value));
237 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKDIVSTATUS_DIVSDHI0_STS_Msk | R_CPG_CPG_CLKDIVSTATUS_DIVSDHI1_STS_Msk |
238 R_CPG_CPG_CLKDIVSTATUS_DIVSDHI2_STS_Msk) &
239 R_CPG->CPG_CLKDIVSTATUS),
240 0U);
241
242 setting_value = (uint32_t) ((BSP_CFG_SEL_SDHI0_SET_SOURCE << R_CPG_CPG_SDHI_DSEL_SEL_SDHI0_SET_Pos) |
243 (BSP_CFG_SEL_SDHI1_SET_SOURCE << R_CPG_CPG_SDHI_DSEL_SEL_SDHI1_SET_Pos) |
244 (BSP_CFG_SEL_SDHI2_SET_SOURCE << R_CPG_CPG_SDHI_DSEL_SEL_SDHI2_SET_Pos));
245 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKSELSTATUS_SELSDHI0_STS_Msk | R_CPG_CPG_CLKSELSTATUS_SELSDHI1_STS_Msk |
246 R_CPG_CPG_CLKSELSTATUS_SELSDHI2_STS_Msk) &
247 R_CPG->CPG_CLKSELSTATUS),
248 0U);
249 R_CPG->CPG_SDHI_DSEL =
250 (uint32_t) ((R_CPG_CPG_SDHI_DSEL_SEL_SDHI0_WEN_Msk | R_CPG_CPG_SDHI_DSEL_SEL_SDHI1_WEN_Msk |
251 R_CPG_CPG_SDHI_DSEL_SEL_SDHI2_WEN_Msk) |
252 ((R_CPG_CPG_SDHI_DSEL_SEL_SDHI0_SET_Msk | R_CPG_CPG_SDHI_DSEL_SEL_SDHI1_SET_Msk |
253 R_CPG_CPG_SDHI_DSEL_SEL_SDHI2_SET_Msk) &
254 setting_value));
255 FSP_HARDWARE_REGISTER_WAIT(((R_CPG_CPG_CLKSELSTATUS_SELSDHI0_STS_Msk | R_CPG_CPG_CLKSELSTATUS_SELSDHI1_STS_Msk |
256 R_CPG_CPG_CLKSELSTATUS_SELSDHI2_STS_Msk) &
257 R_CPG->CPG_CLKSELSTATUS),
258 0U);
259
260 /* Set CPG_PLL_DSEL to configure the frequency of S0CLK. */
261 setting_value = (uint32_t) (BSP_CFG_SELPL4_SET_SOURCE << R_CPG_CPG_PLL_DSEL_SELPL4_SET_Pos);
262 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELPL4_STS_Msk & R_CPG->CPG_CLKSELSTATUS), 0U);
263 R_CPG->CPG_PLL_DSEL =
264 (uint32_t) (R_CPG_CPG_PLL_DSEL_SELPL4_WEN_Msk | (R_CPG_CPG_PLL_DSEL_SELPL4_SET_Msk & setting_value));
265 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELPL4_STS_Msk & R_CPG->CPG_CLKSELSTATUS), 0U);
266 #endif
267 }
268
269 /*******************************************************************************************************************//**
270 * Perform any necessary processing before changing the frequency.
271 *
272 * @param[in] clock Desired clock
273 **********************************************************************************************************************/
bsp_prv_clock_pre_setting(fsp_priv_clock_t clock)274 static void bsp_prv_clock_pre_setting (fsp_priv_clock_t clock)
275 {
276 FSP_PARAMETER_NOT_USED(clock);
277 }
278
279 /*******************************************************************************************************************//**
280 * Perform any necessary processing after changing the frequency.
281 *
282 * @param[in] clock Desired clock
283 **********************************************************************************************************************/
bsp_prv_clock_post_setting(fsp_priv_clock_t clock)284 static void bsp_prv_clock_post_setting (fsp_priv_clock_t clock)
285 {
286 FSP_PARAMETER_NOT_USED(clock);
287 }
288
289 /*******************************************************************************************************************//**
290 * Set the Source Clock Setting register to change the frequency.
291 *
292 * @param[in] clock Element number of the array that defines the frequency of each clock.
293 * @param[in] clock_sel Value to set in Source Clock Setting register.
294 **********************************************************************************************************************/
bsp_prv_clock_selector_set(fsp_priv_clock_t clock,uint32_t clock_sel)295 void bsp_prv_clock_selector_set (fsp_priv_clock_t clock, uint32_t clock_sel)
296 {
297 uint32_t clock_freq = g_clock_freq[clock];
298
299 switch (clock)
300 {
301 #if defined(BSP_CFG_SEL_SDHI0_SET_SOURCE)
302
303 /* Source Clock setting for SDHI0. */
304 case FSP_PRIV_CLOCK_SD0CLK:
305 {
306 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELSDHI0_STS_Msk & R_CPG->CPG_CLKSELSTATUS) >>
307 R_CPG_CPG_CLKSELSTATUS_SELSDHI0_STS_Pos,
308 0U);
309
310 R_CPG->CPG_SDHI_DSEL = (uint32_t) (R_CPG_CPG_SDHI_DSEL_SEL_SDHI0_WEN_Msk |
311 (R_CPG_CPG_SDHI_DSEL_SEL_SDHI0_SET_Msk &
312 (clock_sel << R_CPG_CPG_SDHI_DSEL_SEL_SDHI0_SET_Pos)));
313
314 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELSDHI0_STS_Msk & R_CPG->CPG_CLKSELSTATUS) >>
315 R_CPG_CPG_CLKSELSTATUS_SELSDHI0_STS_Pos,
316 0U);
317
318 if (BSP_CLOCKS_SOURCE_CLOCK_PLL2_800 == clock_sel)
319 {
320 clock_freq = BSP_CFG_CLOCK_PLL2_1600_HZ >> 1;
321 }
322 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_500 == clock_sel)
323 {
324 clock_freq = BSP_CFG_CLOCK_PLL6_HZ;
325 }
326 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL2_266 == clock_sel)
327 {
328 clock_freq = BSP_CFG_CLOCK_PLL2_1600_HZ / 6;
329 }
330 else
331 {
332 /* If this condition is met, prohibited value was set in the register. */
333 ;
334 }
335
336 break;
337 }
338 #endif /* BSP_CFG_SEL_SDHI0_SET_SOURCE */
339
340 #if defined(BSP_CFG_SEL_SDHI1_SET_SOURCE)
341
342 /* Source Clock setting for SDHI1. */
343 case FSP_PRIV_CLOCK_SD1CLK:
344 {
345 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELSDHI1_STS_Msk & R_CPG->CPG_CLKSELSTATUS) >>
346 R_CPG_CPG_CLKSELSTATUS_SELSDHI1_STS_Pos,
347 0U);
348
349 R_CPG->CPG_SDHI_DSEL = (uint32_t) (R_CPG_CPG_SDHI_DSEL_SEL_SDHI1_WEN_Msk |
350 (R_CPG_CPG_SDHI_DSEL_SEL_SDHI1_SET_Msk &
351 (clock_sel << R_CPG_CPG_SDHI_DSEL_SEL_SDHI1_SET_Pos)));
352
353 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELSDHI1_STS_Msk & R_CPG->CPG_CLKSELSTATUS) >>
354 R_CPG_CPG_CLKSELSTATUS_SELSDHI1_STS_Pos,
355 0U);
356
357 if (BSP_CLOCKS_SOURCE_CLOCK_PLL2_800 == clock_sel)
358 {
359 clock_freq = BSP_CFG_CLOCK_PLL2_1600_HZ >> 1;
360 }
361 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_500 == clock_sel)
362 {
363 clock_freq = BSP_CFG_CLOCK_PLL6_HZ;
364 }
365 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL2_266 == clock_sel)
366 {
367 clock_freq = BSP_CFG_CLOCK_PLL2_1600_HZ / 6;
368 }
369 else
370 {
371 /* If this condition is met, prohibited value was set in the register. */
372 ;
373 }
374
375 break;
376 }
377 #endif /* BSP_CFG_SEL_SDHI1_SET_SOURCE */
378
379 #if defined(BSP_CFG_SEL_SDHI2_SET_SOURCE)
380
381 /* Source Clock setting for SDHI2. */
382 case FSP_PRIV_CLOCK_SD2CLK:
383 {
384 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELSDHI2_STS_Msk & R_CPG->CPG_CLKSELSTATUS) >>
385 R_CPG_CPG_CLKSELSTATUS_SELSDHI2_STS_Pos,
386 0U);
387
388 R_CPG->CPG_SDHI_DSEL = (uint32_t) (R_CPG_CPG_SDHI_DSEL_SEL_SDHI2_WEN_Msk |
389 (R_CPG_CPG_SDHI_DSEL_SEL_SDHI2_SET_Msk &
390 (clock_sel << R_CPG_CPG_SDHI_DSEL_SEL_SDHI2_SET_Pos)));
391
392 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKSELSTATUS_SELSDHI2_STS_Msk & R_CPG->CPG_CLKSELSTATUS) >>
393 R_CPG_CPG_CLKSELSTATUS_SELSDHI2_STS_Pos,
394 0U);
395
396 if (BSP_CLOCKS_SOURCE_CLOCK_PLL2_800 == clock_sel)
397 {
398 clock_freq = BSP_CFG_CLOCK_PLL2_1600_HZ >> 1;
399 }
400 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_500 == clock_sel)
401 {
402 clock_freq = BSP_CFG_CLOCK_PLL6_HZ;
403 }
404 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL2_266 == clock_sel)
405 {
406 clock_freq = BSP_CFG_CLOCK_PLL2_1600_HZ / 6;
407 }
408 else
409 {
410 /* If this condition is met, prohibited value was set in the register. */
411 ;
412 }
413
414 break;
415 }
416 #endif /* BSP_CFG_SEL_SDHI2_SET_SOURCE */
417
418 #if defined(BSP_CFG_SELSPI_SET_SOURCE)
419
420 /* Source Clock setting for SPI0. */
421 case FSP_PRIV_CLOCK_SPI0CLK:
422 {
423 uint32_t clock_mon = (uint32_t) ((R_CPG_CPG_CLKMON_SPI_CLK3_MON_Msk & R_CPG->CPG_CLKMON_SPI) >>
424 R_CPG_CPG_CLKMON_SPI_CLK3_MON_Pos);
425
426 /* If SPI_CLKX2 is supplied, the clock stops before setting the Source Clock Setting Register. */
427 if (clock_mon)
428 {
429 R_CPG->CPG_CLKON_SPI = R_CPG_CPG_CLKON_SPI_CLK3_ONWEN_Msk;
430 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_SPI_CLK3_MON_Msk & R_CPG->CPG_CLKMON_SPI) >>
431 R_CPG_CPG_CLKMON_SPI_CLK3_MON_Pos,
432 0U);
433 }
434
435 R_CPG->CPG_SPI_SSEL = (uint32_t) (R_CPG_CPG_SPI_SSEL_SELSPI_WEN_Msk |
436 (R_CPG_CPG_SPI_SSEL_SELSPI_SET_Msk &
437 (clock_sel << R_CPG_CPG_SPI_SSEL_SELSPI_SET_Pos)));
438
439 /* If the clock was stopped before setting the Source Clock Setting Register, the clock supply resumes. */
440 if (clock_mon)
441 {
442 R_CPG->CPG_CLKON_SPI = (uint32_t) (R_CPG_CPG_CLKON_SPI_CLK3_ONWEN_Msk |
443 R_CPG_CPG_CLKON_SPI_CLK3_ON_Msk);
444 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_SPI_CLK3_MON_Msk & R_CPG->CPG_CLKMON_SPI) >>
445 R_CPG_CPG_CLKMON_SPI_CLK3_MON_Pos,
446 1U);
447 }
448
449 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_sel)
450 {
451 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
452 }
453 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_sel)
454 {
455 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
456 }
457 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_sel)
458 {
459 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
460 }
461 else
462 {
463 /* If this condition is met, clock_sel is an invalid value. */
464 ;
465 }
466
467 uint32_t clock_div = (uint32_t) ((R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Msk & R_CPG->CPG_SPI_DDIV) >>
468 R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Pos);
469 if (BSP_CLOCKS_SPI_DIV_32 == clock_div)
470 {
471 clock_div++;
472 }
473
474 clock_freq = clock_freq >> (clock_div + 1);
475
476 /* Changing settings for the SPI0 clock related register, SPI1 clock frequency changes at the same time.
477 * So it is updated the variable that stored SPI1 clock frequency. */
478 g_clock_freq[FSP_PRIV_CLOCK_SPI1CLK] = clock_freq >> 1;
479 break;
480 }
481
482 /* Source Clock setting for SPI1. */
483 case FSP_PRIV_CLOCK_SPI1CLK:
484 {
485 uint32_t clock_mon = (uint32_t) ((R_CPG_CPG_CLKMON_SPI_CLK2_MON_Msk & R_CPG->CPG_CLKMON_SPI) >>
486 R_CPG_CPG_CLKMON_SPI_CLK2_MON_Pos);
487
488 /* If SPI_CLK is supplied, the clock stops before setting the Source Clock Setting Register. */
489 if (clock_mon)
490 {
491 R_CPG->CPG_CLKON_SPI = R_CPG_CPG_CLKON_SPI_CLK2_ONWEN_Msk;
492 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_SPI_CLK2_MON_Msk & R_CPG->CPG_CLKMON_SPI) >>
493 R_CPG_CPG_CLKMON_SPI_CLK2_MON_Pos,
494 0U);
495 }
496
497 R_CPG->CPG_SPI_SSEL = (uint32_t) (R_CPG_CPG_SPI_SSEL_SELSPI_WEN_Msk |
498 (R_CPG_CPG_SPI_SSEL_SELSPI_SET_Msk &
499 (clock_sel << R_CPG_CPG_SPI_SSEL_SELSPI_SET_Pos)));
500
501 /* If the clock was stopped before setting the Source Clock Setting Register, the clock supply resumes. */
502 if (clock_mon)
503 {
504 R_CPG->CPG_CLKON_SPI = (uint32_t) (R_CPG_CPG_CLKON_SPI_CLK2_ONWEN_Msk |
505 R_CPG_CPG_CLKON_SPI_CLK2_ON_Msk);
506 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_SPI_CLK2_MON_Msk & R_CPG->CPG_CLKMON_SPI) >>
507 R_CPG_CPG_CLKMON_SPI_CLK2_MON_Pos,
508 1U);
509 }
510
511 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_sel)
512 {
513 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
514 }
515 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_sel)
516 {
517 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
518 }
519 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_sel)
520 {
521 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
522 }
523 else
524 {
525 /* If this condition is met, clock_sel is an invalid value. */
526 ;
527 }
528
529 uint32_t clock_div = (uint32_t) ((R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Msk & R_CPG->CPG_SPI_DDIV) >>
530 R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Pos);
531 if (BSP_CLOCKS_SPI_DIV_32 == clock_div)
532 {
533 clock_div++;
534 }
535
536 clock_freq = clock_freq >> (clock_div + 2);
537
538 /* Changing settings for the SPI1 clock related register, SPI0 clock frequency changes at the same time.
539 * So it is updated the variable that stored SPI0 clock frequency. */
540 g_clock_freq[FSP_PRIV_CLOCK_SPI0CLK] = clock_freq << 1;
541 break;
542 }
543 #endif /* BSP_CFG_SELSPI_SET_SOURCE */
544
545 #if defined(BSP_CFG_SELOCTA_SET_SOURCE)
546
547 /* Source Clock setting for OC0. */
548 case FSP_PRIV_CLOCK_OC0CLK:
549 {
550 uint32_t clock_mon = (uint32_t) ((R_CPG_CPG_CLKMON_OCTA_CLK1_MON_Msk & R_CPG->CPG_CLKMON_OCTA) >>
551 R_CPG_CPG_CLKMON_OCTA_CLK1_MON_Pos);
552
553 /* If OCTA_MCLK is supplied, the clock stops before setting the Source Clock Setting Register. */
554 if (clock_mon)
555 {
556 R_CPG->CPG_CLKON_OCTA = R_CPG_CPG_CLKON_OCTA_CLK1_ONWEN_Msk;
557 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_OCTA_CLK1_MON_Msk & R_CPG->CPG_CLKMON_OCTA) >>
558 R_CPG_CPG_CLKMON_OCTA_CLK1_MON_Pos,
559 0U);
560 }
561
562 R_CPG->CPG_OCTA_SSEL = (uint32_t) (R_CPG_CPG_OCTA_SSEL_SELOCTA_WEN_Msk |
563 (R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Msk &
564 (clock_sel << R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Pos)));
565
566 /* If the clock was stopped before setting the Source Clock Setting Register, the clock supply resumes. */
567 if (clock_mon)
568 {
569 R_CPG->CPG_CLKON_OCTA = (uint32_t) (R_CPG_CPG_CLKON_OCTA_CLK1_ONWEN_Msk |
570 R_CPG_CPG_CLKON_OCTA_CLK1_ON_Msk);
571 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_OCTA_CLK1_MON_Msk & R_CPG->CPG_CLKMON_OCTA) >>
572 R_CPG_CPG_CLKMON_OCTA_CLK1_MON_Pos,
573 1U);
574 }
575
576 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_sel)
577 {
578 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
579 }
580 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_sel)
581 {
582 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
583 }
584 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_sel)
585 {
586 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
587 }
588 else
589 {
590 /* If this condition is met, clock_sel is an invalid value. */
591 ;
592 }
593
594 uint32_t clock_div = (uint32_t) ((R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Msk & R_CPG->CPG_OCTA_DDIV) >>
595 R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Pos);
596 if (BSP_CLOCKS_OCTA_DIV_32 == clock_div)
597 {
598 clock_div++;
599 }
600
601 clock_freq = clock_freq >> (clock_div + 1);
602
603 /* Changing settings for the OC0 clock related register, OC1 clock frequency changes at the same time.
604 * So it is updated the variable that stored OC1 clock frequency. */
605 g_clock_freq[FSP_PRIV_CLOCK_OC1CLK] = clock_freq >> 1;
606 break;
607 }
608
609 /* Source Clock setting for OC1. */
610 case FSP_PRIV_CLOCK_OC1CLK:
611 {
612 uint32_t clock_mon = (uint32_t) ((R_CPG_CPG_CLKMON_OCTA_CLK0_MON_Msk & R_CPG->CPG_CLKMON_OCTA) >>
613 R_CPG_CPG_CLKMON_OCTA_CLK0_MON_Pos);
614
615 /* If OCTA_ACLK is supplied, the clock stops before setting the Source Clock Setting Register. */
616 if (clock_mon)
617 {
618 R_CPG->CPG_CLKON_OCTA = R_CPG_CPG_CLKON_OCTA_CLK0_ONWEN_Msk;
619 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_OCTA_CLK0_MON_Msk & R_CPG->CPG_CLKMON_OCTA) >>
620 R_CPG_CPG_CLKMON_OCTA_CLK0_MON_Pos,
621 0U);
622 }
623
624 R_CPG->CPG_OCTA_SSEL = (uint32_t) (R_CPG_CPG_OCTA_SSEL_SELOCTA_WEN_Msk |
625 (R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Msk &
626 (clock_sel << R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Pos)));
627
628 /* If the clock was stopped before setting the Source Clock Setting Register, the clock supply resumes. */
629 if (clock_mon)
630 {
631 R_CPG->CPG_CLKON_OCTA = (uint32_t) (R_CPG_CPG_CLKON_OCTA_CLK0_ONWEN_Msk |
632 R_CPG_CPG_CLKON_OCTA_CLK0_ON_Msk);
633 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKMON_OCTA_CLK0_MON_Msk & R_CPG->CPG_CLKMON_OCTA) >>
634 R_CPG_CPG_CLKMON_OCTA_CLK0_MON_Pos,
635 1U);
636 }
637
638 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_sel)
639 {
640 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
641 }
642 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_sel)
643 {
644 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
645 }
646 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_sel)
647 {
648 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
649 }
650 else
651 {
652 /* If this condition is met, clock_sel is an invalid value. */
653 ;
654 }
655
656 uint32_t clock_div = (uint32_t) ((R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Msk & R_CPG->CPG_OCTA_DDIV) >>
657 R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Pos);
658 if (BSP_CLOCKS_OCTA_DIV_32 == clock_div)
659 {
660 clock_div++;
661 }
662
663 clock_freq = clock_freq >> (clock_div + 2);
664
665 /* Changing settings for the OC1 clock related register, OC0 clock frequency changes at the same time.
666 * So it is updated the variable that stored OC0 clock frequency. */
667 g_clock_freq[FSP_PRIV_CLOCK_OC0CLK] = clock_freq << 1;
668 break;
669 }
670 #endif /* BSP_CFG_SELOCTA_SET_SOURCE */
671
672 default:
673 {
674 FSP_PARAMETER_NOT_USED(clock_sel);
675 break;
676 }
677 }
678
679 g_clock_freq[clock] = clock_freq;
680 }
681
682 /*******************************************************************************************************************//**
683 * Set the Division Ratio Setting register to change the frequency.
684 *
685 * @param[in] clock Element number of the array that defines the frequency of each clock.
686 * @param[in] clock_div Value to set in Division Ratio Setting register.
687 **********************************************************************************************************************/
bsp_prv_clock_divider_set(fsp_priv_clock_t clock,uint32_t clock_div)688 void bsp_prv_clock_divider_set (fsp_priv_clock_t clock, uint32_t clock_div)
689 {
690 uint32_t clock_freq = g_clock_freq[clock];
691
692 switch (clock)
693 {
694 #if defined(BSP_CFG_DIVPL1_SET_DIV)
695
696 /* ICLK division ratio setting. */
697 case FSP_PRIV_CLOCK_ICLK:
698 {
699 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVPL1_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
700 R_CPG_CPG_CLKDIVSTATUS_DIVPL1_STS_Pos,
701 0U);
702 R_CPG->CPG_PL1_DDIV = (uint32_t) (R_CPG_CPG_PL1_DDIV_DIV_PLL1SET_WEN_Msk |
703 (R_CPG_CPG_PL1_DDIV_DIVPL1_SET_Msk &
704 (clock_div << R_CPG_CPG_PL1_DDIV_DIVPL1_SET_Pos)));
705 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVPL1_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
706 R_CPG_CPG_CLKDIVSTATUS_DIVPL1_STS_Pos,
707 0U);
708 clock_freq = BSP_CFG_CLOCK_PLL1_HZ >> clock_div;
709 break;
710 }
711 #endif
712
713 #if defined(BSP_CFG_DIVSPI_SET_DIV)
714
715 /* SPI0CLK division ratio setting. */
716 case FSP_PRIV_CLOCK_SPI0CLK:
717 {
718 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
719 R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Pos,
720 0U);
721 R_CPG->CPG_SPI_DDIV = (uint32_t) (R_CPG_CPG_SPI_DDIV_DIVSPI_WEN_Msk |
722 (R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Msk &
723 (clock_div << R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Pos)));
724 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
725 R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Pos,
726 0U);
727
728 uint32_t clock_source = (R_CPG_CPG_SPI_SSEL_SELSPI_SET_Msk & R_CPG->CPG_SPI_SSEL) >>
729 R_CPG_CPG_SPI_SSEL_SELSPI_SET_Pos;
730
731 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_source)
732 {
733 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
734 }
735 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_source)
736 {
737 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
738 }
739 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_source)
740 {
741 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
742 }
743 else
744 {
745 /* If this condition is met, prohibited value was set in the register. */
746 ;
747 }
748
749 if (BSP_CLOCKS_SPI_DIV_32 == clock_div)
750 {
751 clock_div++;
752 }
753
754 clock_freq = clock_freq >> clock_div;
755
756 /* Changing settings for the SPI0 clock related register, SPI1 clock frequency changes at the same time.
757 * So it is updated the variable that stored SPI1 clock frequency. */
758 g_clock_freq[FSP_PRIV_CLOCK_SPI1CLK] = clock_freq >> 1;
759 break;
760 }
761 #endif
762
763 #if defined(BSP_CFG_DIVSPI_SET_DIV)
764
765 /* SPI1CLK division ratio setting. */
766 case FSP_PRIV_CLOCK_SPI1CLK:
767 {
768 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
769 R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Pos,
770 0U);
771 R_CPG->CPG_SPI_DDIV = (uint32_t) (R_CPG_CPG_SPI_DDIV_DIVSPI_WEN_Msk |
772 (R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Msk &
773 (clock_div << R_CPG_CPG_SPI_DDIV_DIVSPI_SET_Pos)));
774 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
775 R_CPG_CPG_CLKDIVSTATUS_DIVSPI_STS_Pos,
776 0U);
777
778 uint32_t clock_source = (R_CPG_CPG_SPI_SSEL_SELSPI_SET_Msk & R_CPG->CPG_SPI_SSEL) >>
779 R_CPG_CPG_SPI_SSEL_SELSPI_SET_Pos;
780
781 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_source)
782 {
783 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
784 }
785 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_source)
786 {
787 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
788 }
789 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_source)
790 {
791 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
792 }
793 else
794 {
795 /* If this condition is met, prohibited value was set in the register. */
796 ;
797 }
798
799 if (BSP_CLOCKS_SPI_DIV_32 == clock_div)
800 {
801 clock_div++;
802 }
803
804 clock_freq = clock_freq >> (clock_div + 1);
805
806 /* Changing settings for the SPI1 clock related register, SPI0 clock frequency changes at the same time.
807 * So it is updated the variable that stored SPI0 clock frequency. */
808 g_clock_freq[FSP_PRIV_CLOCK_SPI0CLK] = clock_freq << 1;
809 break;
810 }
811 #endif
812
813 #if defined(BSP_CFG_DIVOCTA_SET_DIV)
814
815 /* OC0CLK division ratio setting. */
816 case FSP_PRIV_CLOCK_OC0CLK:
817 {
818 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
819 R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Pos,
820 0U);
821 R_CPG->CPG_OCTA_DDIV = (uint32_t) (R_CPG_CPG_OCTA_DDIV_DIVOCTA_WEN_Msk |
822 (R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Msk &
823 (clock_div << R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Pos)));
824 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
825 R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Pos,
826 0U);
827
828 uint32_t clock_source = (R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Msk & R_CPG->CPG_OCTA_SSEL) >>
829 R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Pos;
830
831 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_source)
832 {
833 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
834 }
835 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_source)
836 {
837 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
838 }
839 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_source)
840 {
841 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
842 }
843 else
844 {
845 /* If this condition is met, prohibited value was set in the register. */
846 ;
847 }
848
849 if (BSP_CLOCKS_OCTA_DIV_32 == clock_div)
850 {
851 clock_div++;
852 }
853
854 clock_freq = clock_freq >> clock_div;
855
856 /* Changing settings for the OC0 clock related register, OC1 clock frequency changes at the same time.
857 * So it is updated the variable that stored OC1 clock frequency. */
858 g_clock_freq[FSP_PRIV_CLOCK_OC1CLK] = clock_freq >> 1;
859 break;
860 }
861 #endif
862
863 #if defined(BSP_CFG_DIVOCTA_SET_DIV)
864
865 /* OC1CLK division ratio setting. */
866 case FSP_PRIV_CLOCK_OC1CLK:
867 {
868 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
869 R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Pos,
870 0U);
871 R_CPG->CPG_OCTA_DDIV = (uint32_t) (R_CPG_CPG_OCTA_DDIV_DIVOCTA_WEN_Msk |
872 (R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Msk &
873 (clock_div << R_CPG_CPG_OCTA_DDIV_DIVOCTA_SET_Pos)));
874 FSP_HARDWARE_REGISTER_WAIT((R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Msk & R_CPG->CPG_CLKDIVSTATUS) >>
875 R_CPG_CPG_CLKDIVSTATUS_DIVOCTA_STS_Pos,
876 0U);
877
878 uint32_t clock_source = (R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Msk & R_CPG->CPG_OCTA_SSEL) >>
879 R_CPG_CPG_OCTA_SSEL_SELOCTA_SET_Pos;
880
881 if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_400 == clock_source)
882 {
883 clock_freq = BSP_CFG_CLOCK_PLL3_HZ >> 2;
884 }
885 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL3_266 == clock_source)
886 {
887 clock_freq = BSP_CFG_CLOCK_PLL3_HZ / 6;
888 }
889 else if (BSP_CLOCKS_SOURCE_CLOCK_PLL6_250 == clock_source)
890 {
891 clock_freq = BSP_CFG_CLOCK_PLL6_HZ >> 1;
892 }
893 else
894 {
895 /* If this condition is met, prohibited value was set in the register. */
896 ;
897 }
898
899 if (BSP_CLOCKS_OCTA_DIV_32 == clock_div)
900 {
901 clock_div++;
902 }
903
904 clock_freq = clock_freq >> (clock_div + 1);
905
906 /* Changing settings for the OC1 clock related register, OC0 clock frequency changes at the same time.
907 * So it is updated the variable that stored OC0 clock frequency. */
908 g_clock_freq[FSP_PRIV_CLOCK_OC0CLK] = clock_freq << 1;
909 break;
910 }
911 #endif
912
913 default:
914 {
915 FSP_PARAMETER_NOT_USED(clock_div);
916 break;
917 }
918 }
919
920 g_clock_freq[clock] = clock_freq;
921 }
922
923 /** @} (end addtogroup BSP_MCU_PRV) */
924
925 /*******************************************************************************************************************//**
926 * @addtogroup BSP_MCU
927 * @{
928 **********************************************************************************************************************/
929
930 /*******************************************************************************************************************//**
931 * Get the system clock frequency.
932 *
933 * @param[in] clock Element number of the array that defines the frequency of the bus clock.
934 *
935 * @retval g_clock_freq[clock] System clock frequency.
936 **********************************************************************************************************************/
R_FSP_SystemClockHzGet(fsp_priv_clock_t clock)937 uint32_t R_FSP_SystemClockHzGet (fsp_priv_clock_t clock)
938 {
939 return g_clock_freq[clock];
940 }
941
942 /*******************************************************************************************************************//**
943 * Set a clock frequency.
944 *
945 * @param[in] clock Element number of the array that defines the frequency of each clock.
946 * @param[in] clock_sel Value to set in Source Clock Setting register.
947 * @param[in] clock_div Value to set in Division Ratio Setting register.
948 **********************************************************************************************************************/
R_FSP_SystemClockHzSet(fsp_priv_clock_t clock,uint32_t clock_sel,uint32_t clock_div)949 void R_FSP_SystemClockHzSet (fsp_priv_clock_t clock, uint32_t clock_sel, uint32_t clock_div)
950 {
951 bsp_prv_clock_pre_setting(clock);
952 bsp_prv_clock_selector_set(clock, clock_sel);
953 bsp_prv_clock_divider_set(clock, clock_div);
954 bsp_prv_clock_post_setting(clock);
955 }
956
957 /** @} (end addtogroup BSP_MCU) */
958