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 /***********************************************************************************************************************
13 * Macro definitions
14 **********************************************************************************************************************/
15
16 /* Key code for writing PRCR register. */
17 #define BSP_PRV_PRCR_KEY (0xA500U)
18 #define BSP_PRV_PRCR_CGC_UNLOCK ((BSP_PRV_PRCR_KEY) | 0x3U)
19 #define BSP_PRV_PRCR_LOCK ((BSP_PRV_PRCR_KEY) | 0x0U)
20
21 /* Key code for writing PCMD register. */
22 #define BSP_PRV_PCMD_KEY (0xA5U)
23
24 /* Calculate the value to write to SCKCR. */
25 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
26 #define BSP_PRV_STARTUP_SCKCR_FSELXSPI0_DIVSELXSPI0_BITS (BSP_CFG_FSELXSPI0_DIVSELXSPI0 & 0x47U)
27 #define BSP_PRV_STARTUP_SCKCR_FSELXSPI1_DIVSELXSPI1_BITS ((BSP_CFG_FSELXSPI1_DIVSELXSPI1 & 0x47U) << 8U)
28 #define BSP_PRV_STARTUP_SCKCR_CKIO_BITS ((BSP_CFG_CKIO & 7U) << 16U)
29 #define BSP_PRV_STARTUP_SCKCR_FSELCANFD_BITS ((BSP_CFG_FSELCANFD & 1U) << 20U)
30 #define BSP_PRV_STARTUP_SCKCR_PHYSEL_BITS ((BSP_CFG_PHYSEL & 1U) << 21U)
31 #define BSP_PRV_STARTUP_SCKCR_CLMASEL_BITS ((BSP_CFG_CLMASEL & 1U) << 22U)
32 #define BSP_PRV_STARTUP_SCKCR_SPI0ASYNCSEL_BITS ((BSP_CFG_SPI0ASYNCCLK & 1U) << 24U)
33 #define BSP_PRV_STARTUP_SCKCR_SPI1ASYNCSEL_BITS ((BSP_CFG_SPI1ASYNCCLK & 1U) << 25U)
34 #define BSP_PRV_STARTUP_SCKCR_SPI2ASYNCSEL_BITS ((BSP_CFG_SPI2ASYNCCLK & 1U) << 26U)
35 #define BSP_PRV_STARTUP_SCKCR_SCI0ASYNCSEL_BITS ((BSP_CFG_SCI0ASYNCCLK & 1U) << 27U)
36 #define BSP_PRV_STARTUP_SCKCR_SCI1ASYNCSEL_BITS ((BSP_CFG_SCI1ASYNCCLK & 1U) << 28U)
37 #define BSP_PRV_STARTUP_SCKCR_SCI2ASYNCSEL_BITS ((BSP_CFG_SCI2ASYNCCLK & 1U) << 29U)
38 #define BSP_PRV_STARTUP_SCKCR_SCI3ASYNCSEL_BITS ((BSP_CFG_SCI3ASYNCCLK & 1U) << 30U)
39 #define BSP_PRV_STARTUP_SCKCR_SCI4ASYNCSEL_BITS ((BSP_CFG_SCI4ASYNCCLK & 1U) << 31U)
40 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
41 #define BSP_PRV_STARTUP_SCKCR_FSELXSPI0_DIVSELXSPI0_BITS (BSP_CFG_FSELXSPI0_DIVSELXSPI0 & 0x47U)
42 #define BSP_PRV_STARTUP_SCKCR_FSELXSPI1_DIVSELXSPI1_BITS ((BSP_CFG_FSELXSPI1_DIVSELXSPI1 & 0x47U) << 8U)
43 #define BSP_PRV_STARTUP_SCKCR_CKIO_BITS ((BSP_CFG_CKIO & 7U) << 16U)
44 #define BSP_PRV_STARTUP_SCKCR_FSELCANFD_BITS ((BSP_CFG_FSELCANFD & 1U) << 20U)
45 #define BSP_PRV_STARTUP_SCKCR_PHYSEL_BITS ((BSP_CFG_PHYSEL & 1U) << 21U)
46 #define BSP_PRV_STARTUP_SCKCR_CLMASEL_BITS ((BSP_CFG_CLMASEL & 1U) << 22U)
47 #endif
48
49 /* Calculate the value to write to SCKCR2. */
50 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
51 #define BSP_PRV_STARTUP_SCKCR2_FSELCPU0_BITS (BSP_CFG_FSELCPU0 & 3U)
52 #if (2 == BSP_FEATURE_BSP_CR52_CORE_NUM)
53 #define BSP_PRV_STARTUP_SCKCR2_FSELCPU1_BITS ((BSP_CFG_FSELCPU1 & 3U) << 2U)
54 #else
55 #define BSP_PRV_STARTUP_SCKCR2_FSELCPU1_BITS (0U)
56 #endif
57 #define BSP_PRV_STARTUP_SCKCR2_RESERVED_BIT4_BITS (1U << 4U) // The write value should be 1.
58 #define BSP_PRV_STARTUP_SCKCR2_DIVSELSUB_BITS ((BSP_CFG_DIVSELSUB & 1U) << 5U)
59 #define BSP_PRV_STARTUP_SCKCR2_SPI3ASYNCSEL_BITS ((BSP_CFG_SPI3ASYNCCLK & 1U) << 24U)
60 #define BSP_PRV_STARTUP_SCKCR2_SCI5ASYNCSEL_BITS ((BSP_CFG_SCI5ASYNCCLK & 1U) << 25U)
61 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
62 #define BSP_PRV_STARTUP_SCKCR2_CR52CPU0_BITS (BSP_CFG_CR52C0CLK & 3U)
63 #define BSP_PRV_STARTUP_SCKCR2_CR52CPU1_BITS ((BSP_CFG_CR52C1CLK & 3U) << 2U)
64 #define BSP_PRV_STARTUP_SCKCR2_CA55CORE0_BITS ((BSP_CFG_CA55CORE0 & 1U) << 8U)
65 #define BSP_PRV_STARTUP_SCKCR2_CA55CORE1_BITS ((BSP_CFG_CA55CORE1 & 1U) << 9U)
66 #define BSP_PRV_STARTUP_SCKCR2_CA55CORE2_BITS ((BSP_CFG_CA55CORE2 & 1U) << 10U)
67 #define BSP_PRV_STARTUP_SCKCR2_CA55CORE3_BITS ((BSP_CFG_CA55CORE3 & 1U) << 11U)
68 #define BSP_PRV_STARTUP_SCKCR2_CA55SCLK_BITS ((BSP_CFG_CA55SCLK & 1U) << 12U)
69 #define BSP_PRV_STARTUP_SCKCR2_SPI3ASYNCSEL_BITS ((BSP_CFG_SPI3ASYNCCLK & 3U) << 16U)
70 #define BSP_PRV_STARTUP_SCKCR2_SCI5ASYNCSEL_BITS ((BSP_CFG_SCI5ASYNCCLK & 3U) << 18U)
71 #endif
72
73 /* Calculate the value to write to SCKCR3. */
74 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
75 #define BSP_PRV_STARTUP_SCKCR3_SPI0ASYNCSEL_BITS (BSP_CFG_SPI0ASYNCCLK & 3U)
76 #define BSP_PRV_STARTUP_SCKCR3_SPI1ASYNCSEL_BITS ((BSP_CFG_SPI1ASYNCCLK & 3U) << 2U)
77 #define BSP_PRV_STARTUP_SCKCR3_SPI2ASYNCSEL_BITS ((BSP_CFG_SPI2ASYNCCLK & 3U) << 4U)
78 #define BSP_PRV_STARTUP_SCKCR3_SCI0ASYNCSEL_BITS ((BSP_CFG_SCI0ASYNCCLK & 3U) << 6U)
79 #define BSP_PRV_STARTUP_SCKCR3_SCI1ASYNCSEL_BITS ((BSP_CFG_SCI1ASYNCCLK & 3U) << 8U)
80 #define BSP_PRV_STARTUP_SCKCR3_SCI2ASYNCSEL_BITS ((BSP_CFG_SCI2ASYNCCLK & 3U) << 10U)
81 #define BSP_PRV_STARTUP_SCKCR3_SCI3ASYNCSEL_BITS ((BSP_CFG_SCI3ASYNCCLK & 3U) << 12U)
82 #define BSP_PRV_STARTUP_SCKCR3_SCI4ASYNCSEL_BITS ((BSP_CFG_SCI4ASYNCCLK & 3U) << 14U)
83 #define BSP_PRV_STARTUP_SCKCR3_LCDCDIVSEL_BITS ((BSP_CFG_LCDCDIVSEL & 15U) << 20U)
84 #endif
85
86 /* Calculate the value to write to SCKCR4. */
87 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
88 #define BSP_PRV_STARTUP_SCKCR4_SCIE0ASYNCSEL_BITS (BSP_CFG_SCIE0ASYNCCLK & 3U)
89 #define BSP_PRV_STARTUP_SCKCR4_SCIE1ASYNCSEL_BITS ((BSP_CFG_SCIE1ASYNCCLK & 3U) << 2U)
90 #define BSP_PRV_STARTUP_SCKCR4_SCIE2ASYNCSEL_BITS ((BSP_CFG_SCIE2ASYNCCLK & 3U) << 4U)
91 #define BSP_PRV_STARTUP_SCKCR4_SCIE3ASYNCSEL_BITS ((BSP_CFG_SCIE3ASYNCCLK & 3U) << 6U)
92 #define BSP_PRV_STARTUP_SCKCR4_SCIE4ASYNCSEL_BITS ((BSP_CFG_SCIE4ASYNCCLK & 3U) << 8U)
93 #define BSP_PRV_STARTUP_SCKCR4_SCIE5ASYNCSEL_BITS ((BSP_CFG_SCIE5ASYNCCLK & 3U) << 10U)
94 #define BSP_PRV_STARTUP_SCKCR4_SCIE6ASYNCSEL_BITS ((BSP_CFG_SCIE6ASYNCCLK & 3U) << 12U)
95 #define BSP_PRV_STARTUP_SCKCR4_SCIE7ASYNCSEL_BITS ((BSP_CFG_SCIE7ASYNCCLK & 3U) << 14U)
96 #define BSP_PRV_STARTUP_SCKCR4_SCIE8ASYNCSEL_BITS ((BSP_CFG_SCIE8ASYNCCLK & 3U) << 16U)
97 #define BSP_PRV_STARTUP_SCKCR4_SCIE9ASYNCSEL_BITS ((BSP_CFG_SCIE9ASYNCCLK & 3U) << 18U)
98 #define BSP_PRV_STARTUP_SCKCR4_SCIE10ASYNCSEL_BITS ((BSP_CFG_SCIE10ASYNCCLK & 3U) << 20U)
99 #define BSP_PRV_STARTUP_SCKCR4_SCIE11ASYNCSEL_BITS ((BSP_CFG_SCIE11ASYNCCLK & 3U) << 22U)
100 #define BSP_PRV_STARTUP_SCKCR4_ENCOUTCLK_BITS ((BSP_CFG_ENCOUTCLK & 1U) << 24U)
101 #endif
102 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
103 #define BSP_PRV_STARTUP_SCKCR (BSP_PRV_STARTUP_SCKCR_FSELXSPI0_DIVSELXSPI0_BITS | \
104 BSP_PRV_STARTUP_SCKCR_FSELXSPI1_DIVSELXSPI1_BITS | \
105 BSP_PRV_STARTUP_SCKCR_CKIO_BITS | \
106 BSP_PRV_STARTUP_SCKCR_FSELCANFD_BITS | \
107 BSP_PRV_STARTUP_SCKCR_PHYSEL_BITS | \
108 BSP_PRV_STARTUP_SCKCR_CLMASEL_BITS | \
109 BSP_PRV_STARTUP_SCKCR_SPI0ASYNCSEL_BITS | \
110 BSP_PRV_STARTUP_SCKCR_SPI1ASYNCSEL_BITS | \
111 BSP_PRV_STARTUP_SCKCR_SPI2ASYNCSEL_BITS | \
112 BSP_PRV_STARTUP_SCKCR_SCI0ASYNCSEL_BITS | \
113 BSP_PRV_STARTUP_SCKCR_SCI1ASYNCSEL_BITS | \
114 BSP_PRV_STARTUP_SCKCR_SCI2ASYNCSEL_BITS | \
115 BSP_PRV_STARTUP_SCKCR_SCI3ASYNCSEL_BITS | \
116 BSP_PRV_STARTUP_SCKCR_SCI4ASYNCSEL_BITS)
117
118 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
119 #define BSP_PRV_STARTUP_SCKCR (BSP_PRV_STARTUP_SCKCR_FSELXSPI0_DIVSELXSPI0_BITS | \
120 BSP_PRV_STARTUP_SCKCR_FSELXSPI1_DIVSELXSPI1_BITS | \
121 BSP_PRV_STARTUP_SCKCR_CKIO_BITS | \
122 BSP_PRV_STARTUP_SCKCR_FSELCANFD_BITS | \
123 BSP_PRV_STARTUP_SCKCR_PHYSEL_BITS | \
124 BSP_PRV_STARTUP_SCKCR_CLMASEL_BITS)
125 #endif
126 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
127 #define BSP_PRV_STARTUP_SCKCR2 (BSP_PRV_STARTUP_SCKCR2_FSELCPU0_BITS | \
128 BSP_PRV_STARTUP_SCKCR2_FSELCPU1_BITS | \
129 BSP_PRV_STARTUP_SCKCR2_RESERVED_BIT4_BITS | \
130 BSP_PRV_STARTUP_SCKCR2_DIVSELSUB_BITS | \
131 BSP_PRV_STARTUP_SCKCR2_SPI3ASYNCSEL_BITS | \
132 BSP_PRV_STARTUP_SCKCR2_SCI5ASYNCSEL_BITS)
133 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
134 #define BSP_PRV_STARTUP_SCKCR2 (BSP_PRV_STARTUP_SCKCR2_CR52CPU0_BITS | \
135 BSP_PRV_STARTUP_SCKCR2_CR52CPU1_BITS | \
136 BSP_PRV_STARTUP_SCKCR2_CA55CORE0_BITS | \
137 BSP_PRV_STARTUP_SCKCR2_CA55CORE1_BITS | \
138 BSP_PRV_STARTUP_SCKCR2_CA55CORE2_BITS | \
139 BSP_PRV_STARTUP_SCKCR2_CA55CORE3_BITS | \
140 BSP_PRV_STARTUP_SCKCR2_CA55SCLK_BITS | \
141 BSP_PRV_STARTUP_SCKCR2_SPI3ASYNCSEL_BITS | \
142 BSP_PRV_STARTUP_SCKCR2_SCI5ASYNCSEL_BITS)
143 #endif
144
145 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
146 #define BSP_PRV_STARTUP_SCKCR3 (0U)
147 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
148 #define BSP_PRV_STARTUP_SCKCR3 (BSP_PRV_STARTUP_SCKCR3_SPI0ASYNCSEL_BITS | \
149 BSP_PRV_STARTUP_SCKCR3_SPI1ASYNCSEL_BITS | \
150 BSP_PRV_STARTUP_SCKCR3_SPI2ASYNCSEL_BITS | \
151 BSP_PRV_STARTUP_SCKCR3_SCI0ASYNCSEL_BITS | \
152 BSP_PRV_STARTUP_SCKCR3_SCI1ASYNCSEL_BITS | \
153 BSP_PRV_STARTUP_SCKCR3_SCI2ASYNCSEL_BITS | \
154 BSP_PRV_STARTUP_SCKCR3_SCI3ASYNCSEL_BITS | \
155 BSP_PRV_STARTUP_SCKCR3_SCI4ASYNCSEL_BITS | \
156 BSP_PRV_STARTUP_SCKCR3_LCDCDIVSEL_BITS)
157 #endif
158 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
159 #define BSP_PRV_STARTUP_SCKCR4 (0U)
160 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
161 #define BSP_PRV_STARTUP_SCKCR4 (BSP_PRV_STARTUP_SCKCR4_SCIE0ASYNCSEL_BITS | \
162 BSP_PRV_STARTUP_SCKCR4_SCIE1ASYNCSEL_BITS | \
163 BSP_PRV_STARTUP_SCKCR4_SCIE2ASYNCSEL_BITS | \
164 BSP_PRV_STARTUP_SCKCR4_SCIE3ASYNCSEL_BITS | \
165 BSP_PRV_STARTUP_SCKCR4_SCIE4ASYNCSEL_BITS | \
166 BSP_PRV_STARTUP_SCKCR4_SCIE5ASYNCSEL_BITS | \
167 BSP_PRV_STARTUP_SCKCR4_SCIE6ASYNCSEL_BITS | \
168 BSP_PRV_STARTUP_SCKCR4_SCIE7ASYNCSEL_BITS | \
169 BSP_PRV_STARTUP_SCKCR4_SCIE8ASYNCSEL_BITS | \
170 BSP_PRV_STARTUP_SCKCR4_SCIE9ASYNCSEL_BITS | \
171 BSP_PRV_STARTUP_SCKCR4_SCIE10ASYNCSEL_BITS | \
172 BSP_PRV_STARTUP_SCKCR4_SCIE11ASYNCSEL_BITS | \
173 BSP_PRV_STARTUP_SCKCR4_ENCOUTCLK_BITS)
174 #endif
175
176 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
177
178 #define BSP_PRV_STARTUP_SCKCR2_FSELCPU0_ICLK_MUL2 (BSP_CLOCKS_FSELCPU0_ICLK_MUL2 << \
179 R_SYSC_S_SCKCR2_FSELCPU0_Pos)
180 #if (2 == BSP_FEATURE_BSP_CR52_CORE_NUM)
181 #define BSP_PRV_STARTUP_SCKCR2_FSELCPU1_ICLK_MUL2 (BSP_CLOCKS_FSELCPU1_ICLK_MUL2 << \
182 R_SYSC_S_SCKCR2_FSELCPU1_Pos)
183 #endif
184
185 #endif
186
187 /* Calculate the value to write to HIZCTRLEN. */
188 #if (4 == BSP_FEATURE_CGC_CLMA_UNIT)
189 #define BSP_PRV_STARTUP_HIZCTRLEN ((BSP_CFG_CLMA1MASK << 2) | (BSP_CFG_CLMA0MASK << 1) | \
190 BSP_CFG_CLMA3MASK)
191 #elif (7 == BSP_FEATURE_CGC_CLMA_UNIT)
192 #define BSP_PRV_STARTUP_HIZCTRLEN ((BSP_CFG_CLMA4MASK << 5) | \
193 (BSP_CFG_CLMA3MASK << 4) | \
194 (BSP_CFG_CLMA2MASK << 3) | \
195 (BSP_CFG_CLMA1MASK << 2) | \
196 (BSP_CFG_CLMA0MASK << 1) | \
197 (BSP_CFG_CLMA6MASK))
198 #endif
199
200 /* Calculate the value to write to PLL0_SSC_CTR */
201 #if BSP_FEATURE_CGC_PLL0_STANDBY_STATE_SUPPORTED
202 #define BSP_PRV_STARTUP_PLL0_SSC_CTR ((BSP_CFG_PLL0MFR << 24) | \
203 (BSP_CFG_PLL0MRR << 16) | \
204 (BSP_CFG_PLL0SSCEN << 0))
205 #endif
206
207 /* Calculate the value to write to PLL2_SSC_CTR */
208 #if BSP_FEATURE_CGC_PLL2_STANDBY_STATE_SUPPORTED
209 #define BSP_PRV_STARTUP_PLL2_SSC_CTR ((BSP_CFG_PLL2MFR << 24) | \
210 (BSP_CFG_PLL2MRR << 16) | \
211 (BSP_CFG_PLL2SSCEN << 0))
212
213 #endif
214
215 /* Calculate the value to write to PLL3_VCO_CTR */
216 #if BSP_FEATURE_CGC_PLL3_STANDBY_STATE_SUPPORTED
217 #define BSP_PRV_STARTUP_PLL3_VCO_CTR0 ((BSP_CFG_PLL3P << 16) | \
218 (BSP_CFG_PLL3M << 0))
219
220 #define BSP_PRV_STARTUP_PLL3_VCO_CTR1 ((BSP_CFG_PLL3K << 16) | \
221 (BSP_CFG_PLL3S << 0))
222 #endif
223
224 /* Frequencies of clocks. */
225 #define BSP_PRV_CPU_FREQ_600_MHZ (600000000U) // CPU frequency is 600 MHz
226 #define BSP_PRV_CPU_FREQ_500_MHZ (500000000U) // CPU frequency is 500 MHz
227 #define BSP_PRV_CPU_FREQ_200_MHZ (200000000U) // CPU frequency is 200 MHz
228 #define BSP_PRV_CPU_FREQ_150_MHZ (150000000U) // CPU frequency is 150 MHz
229
230 /* Command sequence for enabling CLMA. */
231 #define BSP_PRV_CTL0_ENABLE_TARGET_CMD (0x01)
232 #define BSP_PRV_CTL0_ENABLE_REVERSED_CMD (0xFE)
233
234 #define BSP_PRV_LOCO_STABILIZATION_COUNT (40000)
235
236 /***********************************************************************************************************************
237 * Typedef definitions
238 **********************************************************************************************************************/
239
240 /***********************************************************************************************************************
241 * Exported global variables (to be accessed by other files)
242 **********************************************************************************************************************/
243
244 /***********************************************************************************************************************
245 * Private global variables and functions
246 **********************************************************************************************************************/
247 #if !BSP_CFG_SOFT_RESET_SUPPORTED
248 static void bsp_prv_clock_set_hard_reset(void);
249
250 #endif
251
252 /*******************************************************************************************************************//**
253 * @internal
254 * @addtogroup BSP_MCU_PRV Internal BSP Documentation
255 * @ingroup RENESAS_INTERNAL
256 * @{
257 **********************************************************************************************************************/
258
259 /*******************************************************************************************************************//**
260 * Update SystemCoreClock variable based on current clock settings.
261 **********************************************************************************************************************/
SystemCoreClockUpdate(void)262 void SystemCoreClockUpdate (void)
263 {
264 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
265 #if defined(BSP_CFG_CORE_CR52)
266 uint32_t devselsub = R_SYSC_S->SCKCR2_b.DIVSELSUB;
267 uint32_t fselcpu = R_SYSC_S->SCKCR2_b.FSELCPU0;
268
269 if (0U == devselsub)
270 {
271 SystemCoreClock = BSP_PRV_CPU_FREQ_200_MHZ << fselcpu;
272 }
273 else
274 {
275 SystemCoreClock = BSP_PRV_CPU_FREQ_150_MHZ << fselcpu;
276 }
277 #endif
278 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
279 #if defined(BSP_CFG_CORE_CR52)
280 #if (0 == BSP_CFG_CORE_CR52)
281 uint32_t cr52cpu = R_SYSC_S->SCKCR2_b.CR52CPU0;
282 #elif (1 == BSP_CFG_CORE_CR52)
283 uint32_t cr52cpu = R_SYSC_S->SCKCR2_b.CR52CPU1;
284 #endif
285 SystemCoreClock = BSP_PRV_CPU_FREQ_500_MHZ << cr52cpu;
286 #elif defined(BSP_CFG_CORE_CA55)
287 #if (0 == BSP_CFG_CORE_CA55)
288 uint32_t ca55core = R_SYSC_S->SCKCR2_b.CA55CORE0;
289 #elif (1 == BSP_CFG_CORE_CA55)
290 uint32_t ca55core = R_SYSC_S->SCKCR2_b.CA55CORE1;
291 #elif (2 == BSP_CFG_CORE_CA55)
292 uint32_t ca55core = R_SYSC_S->SCKCR2_b.CA55CORE2;
293 #elif (3 == BSP_CFG_CORE_CA55)
294 uint32_t ca55core = R_SYSC_S->SCKCR2_b.CA55CORE3;
295 #endif
296 SystemCoreClock = BSP_PRV_CPU_FREQ_600_MHZ << ca55core;
297 #endif
298 #endif
299 }
300
301 /*******************************************************************************************************************//**
302 * Applies system core clock source and divider changes. The MCU is expected to be in high speed mode during this
303 * configuration and the CGC registers are expected to be unlocked in PRCR.
304 *
305 * @param[in] sckcr Value to set in SCKCR register
306 * @param[in] sckcr2 Value to set in SCKCR2 register
307 * @param[in] sckcr3 Value to set in SCKCR3 register
308 * @param[in] sckcr4 Value to set in SCKCR4 register
309 **********************************************************************************************************************/
bsp_prv_clock_set(uint32_t sckcr,uint32_t sckcr2,uint32_t sckcr3,uint32_t sckcr4)310 void bsp_prv_clock_set (uint32_t sckcr, uint32_t sckcr2, uint32_t sckcr3, uint32_t sckcr4)
311 {
312 volatile uint32_t dummy;
313 sckcr = sckcr & BSP_PRV_SCKCR_MASK;
314 sckcr2 = sckcr2 & BSP_PRV_SCKCR2_MASK;
315 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
316 FSP_PARAMETER_NOT_USED(sckcr3);
317 FSP_PARAMETER_NOT_USED(sckcr4);
318 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
319 sckcr3 = sckcr3 & BSP_PRV_SCKCR3_MASK;
320 sckcr4 = sckcr4 & BSP_PRV_SCKCR4_MASK;
321 #endif
322
323 /* Set the system source clock */
324 R_SYSC_S->SCKCR2 = sckcr2;
325
326 /** In order to secure processing after clock frequency is changed,
327 * dummy read the same register at least eight times.
328 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
329 dummy = R_SYSC_S->SCKCR2;
330 dummy = R_SYSC_S->SCKCR2;
331 dummy = R_SYSC_S->SCKCR2;
332 dummy = R_SYSC_S->SCKCR2;
333 dummy = R_SYSC_S->SCKCR2;
334 dummy = R_SYSC_S->SCKCR2;
335 dummy = R_SYSC_S->SCKCR2;
336 dummy = R_SYSC_S->SCKCR2;
337
338 R_SYSC_NS->SCKCR = sckcr;
339
340 /** In order to secure processing after clock frequency is changed,
341 * dummy read the same register at least eight times.
342 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
343 dummy = R_SYSC_NS->SCKCR;
344 dummy = R_SYSC_NS->SCKCR;
345 dummy = R_SYSC_NS->SCKCR;
346 dummy = R_SYSC_NS->SCKCR;
347 dummy = R_SYSC_NS->SCKCR;
348 dummy = R_SYSC_NS->SCKCR;
349 dummy = R_SYSC_NS->SCKCR;
350 dummy = R_SYSC_NS->SCKCR;
351
352 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
353 R_SYSC_NS->SCKCR3 = sckcr3;
354
355 /** In order to secure processing after clock frequency is changed,
356 * dummy read the same register at least eight times.
357 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
358 dummy = R_SYSC_NS->SCKCR3;
359 dummy = R_SYSC_NS->SCKCR3;
360 dummy = R_SYSC_NS->SCKCR3;
361 dummy = R_SYSC_NS->SCKCR3;
362 dummy = R_SYSC_NS->SCKCR3;
363 dummy = R_SYSC_NS->SCKCR3;
364 dummy = R_SYSC_NS->SCKCR3;
365 dummy = R_SYSC_NS->SCKCR3;
366
367 R_SYSC_NS->SCKCR4 = sckcr4;
368
369 /** In order to secure processing after clock frequency is changed,
370 * dummy read the same register at least eight times.
371 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
372 dummy = R_SYSC_NS->SCKCR4;
373 dummy = R_SYSC_NS->SCKCR4;
374 dummy = R_SYSC_NS->SCKCR4;
375 dummy = R_SYSC_NS->SCKCR4;
376 dummy = R_SYSC_NS->SCKCR4;
377 dummy = R_SYSC_NS->SCKCR4;
378 dummy = R_SYSC_NS->SCKCR4;
379 dummy = R_SYSC_NS->SCKCR4;
380 #endif
381
382 FSP_PARAMETER_NOT_USED(dummy);
383
384 /* Clock is now at requested frequency. */
385
386 /* Update the CMSIS core clock variable so that it reflects the new ICLK frequency. */
387 SystemCoreClockUpdate();
388 }
389
390 #if !BSP_CFG_SOFT_RESET_SUPPORTED
391
bsp_prv_clock_set_hard_reset(void)392 static void bsp_prv_clock_set_hard_reset (void)
393 {
394 volatile uint32_t dummy;
395 uint32_t sckcr = BSP_PRV_STARTUP_SCKCR & BSP_PRV_SCKCR_MASK;
396 uint32_t sckcr2 = BSP_PRV_STARTUP_SCKCR2 & BSP_PRV_SCKCR2_MASK;
397 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
398 uint32_t sckcr3 = BSP_PRV_STARTUP_SCKCR3 & BSP_PRV_SCKCR3_MASK;
399 uint32_t sckcr4 = BSP_PRV_STARTUP_SCKCR4 & BSP_PRV_SCKCR4_MASK;
400 #endif
401
402 /* Set the system source clock */
403 R_SYSC_S->SCKCR2 = sckcr2;
404
405 /** In order to secure processing after clock frequency is changed,
406 * dummy read the same register at least eight times.
407 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
408 dummy = R_SYSC_S->SCKCR2;
409 dummy = R_SYSC_S->SCKCR2;
410 dummy = R_SYSC_S->SCKCR2;
411 dummy = R_SYSC_S->SCKCR2;
412 dummy = R_SYSC_S->SCKCR2;
413 dummy = R_SYSC_S->SCKCR2;
414 dummy = R_SYSC_S->SCKCR2;
415 dummy = R_SYSC_S->SCKCR2;
416
417 R_SYSC_NS->SCKCR = sckcr;
418
419 /** In order to secure processing after clock frequency is changed,
420 * dummy read the same register at least eight times.
421 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
422 dummy = R_SYSC_NS->SCKCR;
423 dummy = R_SYSC_NS->SCKCR;
424 dummy = R_SYSC_NS->SCKCR;
425 dummy = R_SYSC_NS->SCKCR;
426 dummy = R_SYSC_NS->SCKCR;
427 dummy = R_SYSC_NS->SCKCR;
428 dummy = R_SYSC_NS->SCKCR;
429 dummy = R_SYSC_NS->SCKCR;
430
431 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
432 R_SYSC_NS->SCKCR3 = sckcr3;
433
434 /** In order to secure processing after clock frequency is changed,
435 * dummy read the same register at least eight times.
436 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
437 dummy = R_SYSC_NS->SCKCR3;
438 dummy = R_SYSC_NS->SCKCR3;
439 dummy = R_SYSC_NS->SCKCR3;
440 dummy = R_SYSC_NS->SCKCR3;
441 dummy = R_SYSC_NS->SCKCR3;
442 dummy = R_SYSC_NS->SCKCR3;
443 dummy = R_SYSC_NS->SCKCR3;
444 dummy = R_SYSC_NS->SCKCR3;
445
446 R_SYSC_NS->SCKCR4 = sckcr4;
447
448 /** In order to secure processing after clock frequency is changed,
449 * dummy read the same register at least eight times.
450 * Refer to "Notes on Clock Generation Circuit" in the RZ microprocessor manual. */
451 dummy = R_SYSC_NS->SCKCR4;
452 dummy = R_SYSC_NS->SCKCR4;
453 dummy = R_SYSC_NS->SCKCR4;
454 dummy = R_SYSC_NS->SCKCR4;
455 dummy = R_SYSC_NS->SCKCR4;
456 dummy = R_SYSC_NS->SCKCR4;
457 dummy = R_SYSC_NS->SCKCR4;
458 dummy = R_SYSC_NS->SCKCR4;
459 #endif
460
461 FSP_PARAMETER_NOT_USED(dummy);
462
463 /* Clock is now at requested frequency. */
464
465 /* Update the CMSIS core clock variable so that it reflects the new ICLK frequency. */
466 SystemCoreClockUpdate();
467 }
468
469 #endif
470
471 /*******************************************************************************************************************//**
472 * Initializes system clocks. Makes no assumptions about current register settings.
473 **********************************************************************************************************************/
bsp_clock_init(void)474 void bsp_clock_init (void)
475 {
476 volatile uint32_t dummy = 0;
477
478 /* Unlock CGC protection registers. */
479 R_RWP_NS->PRCRN = (uint16_t) BSP_PRV_PRCR_CGC_UNLOCK;
480 R_RWP_S->PRCRS = (uint16_t) BSP_PRV_PRCR_CGC_UNLOCK;
481
482 /* The SystemCoreClock needs to be updated before calling R_BSP_SoftwareDelay. */
483 SystemCoreClockUpdate();
484
485 /* Set source clock and dividers. */
486 #if BSP_CFG_SOFT_RESET_SUPPORTED
487 bsp_prv_clock_set(BSP_PRV_STARTUP_SCKCR, BSP_PRV_STARTUP_SCKCR2, BSP_PRV_STARTUP_SCKCR3, BSP_PRV_STARTUP_SCKCR4);
488 #else
489 bsp_prv_clock_set_hard_reset();
490 #endif
491
492 #if (BSP_FEATURE_CGC_PLL0_STANDBY_STATE_SUPPORTED)
493 if (BSP_CLOCKS_PLL0_NORMAL == BSP_CFG_PLL0)
494 {
495 if (BSP_CLOCKS_PLL0_STANDBY == R_SYSC_S->PLL0EN_b.PLL0EN)
496 {
497 /* Configure SSC settings. */
498 if (BSP_CFG_PLL0SSCEN == BSP_CLOCKS_PLL0SSCEN_ENABLE)
499 {
500 R_SYSC_S->PLL0_SSC_CTR = BSP_PRV_STARTUP_PLL0_SSC_CTR;
501 }
502
503 /* Release PLL from standby state. */
504 R_SYSC_S->PLL0EN = BSP_CFG_PLL0;
505
506 /* Confirm transition to normal mode. */
507 FSP_HARDWARE_REGISTER_WAIT(R_SYSC_S->PLL0MON_b.PLL0MON, 1U);
508
509 /* Confirm clock source change of PLL clock domain. */
510 FSP_HARDWARE_REGISTER_WAIT(R_SYSC_S->PMSEL_b.PMSEL0MON, 1U);
511 }
512 }
513 #endif
514
515 #if (BSP_FEATURE_CGC_PLL1_STANDBY_STATE_SUPPORTED)
516 #if (BSP_CLOCKS_PLL1_INITIAL != BSP_CFG_PLL1)
517
518 /* Release PLL from standby state. */
519 R_SYSC_S->PLL1EN = BSP_CFG_PLL1;
520 #endif
521 #endif
522
523 #if (BSP_FEATURE_CGC_PLL2_STANDBY_STATE_SUPPORTED)
524 if (BSP_CLOCKS_PLL2_NORMAL == BSP_CFG_PLL2)
525 {
526 if (BSP_CLOCKS_PLL2_STANDBY == R_SYSC_S->PLL2EN_b.PLL2EN)
527 {
528 /* Configure SSC settings. */
529 if (BSP_CFG_PLL0SSCEN == BSP_CLOCKS_PLL0SSCEN_ENABLE)
530 {
531 R_SYSC_S->PLL2_SSC_CTR = BSP_PRV_STARTUP_PLL2_SSC_CTR;
532 }
533
534 /* Release PLL from standby state. */
535 R_SYSC_S->PLL2EN = BSP_CFG_PLL2;
536
537 /* Confirm transition to normal mode. */
538 FSP_HARDWARE_REGISTER_WAIT(R_SYSC_S->PLL2MON_b.PLL2MON, 1U);
539
540 /* Confirm clock source change of PLL clock domain. */
541 FSP_HARDWARE_REGISTER_WAIT(R_SYSC_S->PMSEL_b.PMSEL2MON, 1U);
542 }
543 }
544 #endif
545
546 #if (BSP_FEATURE_CGC_PLL3_STANDBY_STATE_SUPPORTED)
547 if (BSP_CLOCKS_PLL3_NORMAL == BSP_CFG_PLL3)
548 {
549 if (BSP_CLOCKS_PLL3_STANDBY == R_SYSC_S->PLL3EN_b.PLL3EN)
550 {
551 /* Configure PLL3 settings. */
552 R_SYSC_S->PLL3_VCO_CTR0 = BSP_PRV_STARTUP_PLL3_VCO_CTR0;
553 R_SYSC_S->PLL3_VCO_CTR1 = BSP_PRV_STARTUP_PLL3_VCO_CTR1;
554
555 /* Release PLL from standby state. */
556 R_SYSC_S->PLL3EN = BSP_CFG_PLL3;
557
558 /* Confirm transition to normal mode. */
559 FSP_HARDWARE_REGISTER_WAIT(R_SYSC_S->PLL3MON_b.PLL3MON, 1U);
560
561 /* Confirm clock source change of PLL clock domain. */
562 FSP_HARDWARE_REGISTER_WAIT(R_SYSC_S->PMSEL_b.PMSEL3MON, 1U);
563 }
564 }
565 #endif
566
567 #if (BSP_CLOCKS_LOCO_ENABLE == BSP_CFG_LOCO_ENABLE)
568 R_SYSC_S->LOCOCR = BSP_CLOCKS_LOCO_ENABLE;
569
570 /* Only start using the LOCO clock after
571 * the LOCO oscillation stabilization time (tLOCOWT) has elapsed. */
572 for (uint16_t i = 0; i < BSP_PRV_LOCO_STABILIZATION_COUNT; i++)
573 {
574 __asm volatile ("nop");
575 }
576 #endif
577
578 R_SYSC_S->HIZCTRLEN = BSP_PRV_STARTUP_HIZCTRLEN;
579
580 #if (BSP_CLOCKS_CLMA0_ENABLE == BSP_CFG_CLMA0_ENABLE)
581
582 /* Set the lower and upper limit for comparing frequency domains. */
583 R_CLMA0->CMPL = BSP_CFG_CLMA0_CMPL;
584 R_CLMA0->CMPH = BSP_CFG_CLMA0_CMPH;
585
586 /* Enabling CLMA0 operation. */
587 do
588 {
589 R_CLMA0->PCMD = BSP_PRV_PCMD_KEY;
590
591 R_CLMA0->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
592 R_CLMA0->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
593 R_CLMA0->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
594
595 if (1 != R_CLMA0->CTL0)
596 {
597 /* Check the value of PROTSR register. */
598 dummy = R_CLMA0->PROTSR;
599 }
600 } while (1 == R_CLMA0->PROTSR_b.PRERR);
601 #endif
602
603 #if (BSP_CLOCKS_CLMA1_ENABLE == BSP_CFG_CLMA1_ENABLE)
604
605 /* Set the lower and upper limit for comparing frequency domains. */
606 R_CLMA1->CMPL = BSP_CFG_CLMA1_CMPL;
607 R_CLMA1->CMPH = BSP_CFG_CLMA1_CMPH;
608
609 /* Enabling CLMA1 operation. */
610 do
611 {
612 R_CLMA1->PCMD = BSP_PRV_PCMD_KEY;
613
614 R_CLMA1->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
615 R_CLMA1->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
616 R_CLMA1->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
617
618 if (1 != R_CLMA1->CTL0)
619 {
620 /* Check the value of PROTSR register. */
621 dummy = R_CLMA1->PROTSR;
622 }
623 } while (1 == R_CLMA1->PROTSR_b.PRERR);
624 #endif
625
626 #if (BSP_CLOCKS_CLMA2_ENABLE == BSP_CFG_CLMA2_ENABLE)
627
628 /* Set the lower and upper limit for comparing frequency domains. */
629 R_CLMA2->CMPL = BSP_CFG_CLMA2_CMPL;
630 R_CLMA2->CMPH = BSP_CFG_CLMA2_CMPH;
631
632 /* Enabling CLMA2 operation. */
633 do
634 {
635 R_CLMA2->PCMD = BSP_PRV_PCMD_KEY;
636
637 R_CLMA2->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
638 R_CLMA2->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
639 R_CLMA2->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
640
641 if (1 != R_CLMA2->CTL0)
642 {
643 /* Check the value of PROTSR register. */
644 dummy = R_CLMA2->PROTSR;
645 }
646 } while (1 == R_CLMA2->PROTSR_b.PRERR);
647 #endif
648
649 #if (BSP_CLOCKS_CLMA3_ENABLE == BSP_CFG_CLMA3_ENABLE)
650
651 /* Set the lower and upper limit for comparing frequency domains. */
652 R_CLMA3->CMPL = BSP_CFG_CLMA3_CMPL;
653 R_CLMA3->CMPH = BSP_CFG_CLMA3_CMPH;
654
655 /* Enabling CLMA3 operation. */
656 do
657 {
658 R_CLMA3->PCMD = BSP_PRV_PCMD_KEY;
659
660 R_CLMA3->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
661 R_CLMA3->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
662 R_CLMA3->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
663
664 if (1 != R_CLMA3->CTL0)
665 {
666 /* Check the value of PROTSR register. */
667 dummy = R_CLMA3->PROTSR;
668 }
669 } while (1 == R_CLMA3->PROTSR_b.PRERR);
670 #endif
671
672 #if (BSP_CLOCKS_CLMA4_ENABLE == BSP_CFG_CLMA4_ENABLE)
673
674 /* Set the lower and upper limit for comparing frequency domains. */
675 R_CLMA4->CMPL = BSP_CFG_CLMA4_CMPL;
676 R_CLMA4->CMPH = BSP_CFG_CLMA4_CMPH;
677
678 /* Enabling CLMA4 operation. */
679 do
680 {
681 R_CLMA4->PCMD = BSP_PRV_PCMD_KEY;
682
683 R_CLMA4->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
684 R_CLMA4->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
685 R_CLMA4->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
686
687 if (1 != R_CLMA4->CTL0)
688 {
689 /* Check the value of PROTSR register. */
690 dummy = R_CLMA4->PROTSR;
691 }
692 } while (1 == R_CLMA4->PROTSR_b.PRERR);
693 #endif
694
695 #if (BSP_CLOCKS_CLMA5_ENABLE == BSP_CFG_CLMA5_ENABLE)
696
697 /* Set the lower and upper limit for comparing frequency domains. */
698 R_CLMA5->CMPL = BSP_CFG_CLMA5_CMPL;
699 R_CLMA5->CMPH = BSP_CFG_CLMA5_CMPH;
700
701 /* Enabling CLMA5 operation. */
702 do
703 {
704 R_CLMA5->PCMD = BSP_PRV_PCMD_KEY;
705
706 R_CLMA5->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
707 R_CLMA5->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
708 R_CLMA5->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
709
710 if (1 != R_CLMA5->CTL0)
711 {
712 /* Check the value of PROTSR register. */
713 dummy = R_CLMA5->PROTSR;
714 }
715 } while (1 == R_CLMA5->PROTSR_b.PRERR);
716 #endif
717
718 #if (BSP_CLOCKS_CLMA6_ENABLE == BSP_CFG_CLMA6_ENABLE)
719
720 /* Set the lower and upper limit for comparing frequency domains. */
721 R_CLMA6->CMPL = BSP_CFG_CLMA6_CMPL;
722 R_CLMA6->CMPH = BSP_CFG_CLMA6_CMPH;
723
724 /* Enabling CLMA6 operation. */
725 do
726 {
727 R_CLMA6->PCMD = BSP_PRV_PCMD_KEY;
728
729 R_CLMA6->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
730 R_CLMA6->CTL0 = BSP_PRV_CTL0_ENABLE_REVERSED_CMD;
731 R_CLMA6->CTL0 = BSP_PRV_CTL0_ENABLE_TARGET_CMD;
732
733 if (1 != R_CLMA6->CTL0)
734 {
735 /* Check the value of PROTSR register. */
736 dummy = R_CLMA6->PROTSR;
737 }
738 } while (1 == R_CLMA6->PROTSR_b.PRERR);
739 #endif
740
741 /* Lock CGC and LPM protection registers. */
742 R_RWP_NS->PRCRN = (uint16_t) BSP_PRV_PRCR_LOCK;
743 R_RWP_S->PRCRS = (uint16_t) BSP_PRV_PRCR_LOCK;
744
745 FSP_PARAMETER_NOT_USED(dummy);
746 }
747
748 /** @} (end addtogroup BSP_MCU_PRV) */
749