1 /*
2 * Copyright (c) 2020 - 2024 Renesas Electronics Corporation and/or its affiliates
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6 
7 #ifndef BSP_COMMON_H
8 #define BSP_COMMON_H
9 
10 /***********************************************************************************************************************
11  * Includes   <System Includes> , "Project Includes"
12  **********************************************************************************************************************/
13 
14 /* C99 includes. */
15 #include <stdint.h>
16 #include <stddef.h>
17 #include <stdbool.h>
18 #include <assert.h>
19 #include <string.h>
20 #include <stdlib.h>
21 
22 /* Different compiler support. */
23 #include "fsp_common_api.h"
24 #include "bsp_compiler_support.h"
25 #include "bsp_cfg.h"
26 
27 /* Zephyr includes */
28 #include <zephyr/arch/cpu.h>
29 
30 /** Common macro for FSP header files. There is also a corresponding FSP_FOOTER macro at the end of this file. */
31 FSP_HEADER
32 
33 /*******************************************************************************************************************//**
34  * @addtogroup BSP_MCU
35  * @{
36  **********************************************************************************************************************/
37 
38 /***********************************************************************************************************************
39  * Macro definitions
40  **********************************************************************************************************************/
41 
42 /** Used to signify that an ELC event is not able to be used as an interrupt. */
43 #define BSP_IRQ_DISABLED                       (0xFFU)
44 
45 /* Vector Number offset */
46 #define BSP_VECTOR_NUM_OFFSET                  (32)
47 #define BSP_INTERRUPT_TYPE_OFFSET              (16U)
48 
49 #define FSP_CONTEXT_SAVE
50 #define FSP_CONTEXT_RESTORE
51 
52 #define BSP_PRV_CPU_FREQ_1000_MHZ              (1000000000U) // CPU frequency is 1000 MHz
53 #define BSP_PRV_CPU_FREQ_500_MHZ               (500000000U)  // CPU frequency is 500 MHz
54 #define BSP_PRV_CPU_FREQ_200_MHZ               (200000000U)  // CPU frequency is 200 MHz
55 #define BSP_PRV_CPU_FREQ_150_MHZ               (150000000U)  // CPU frequency is 150 MHz
56 
57 #define BSP_PRV_CA55CLK_FREQ_1200_MHZ          (1200000000U) // CA55CLK frequency is 1200 MHz
58 #define BSP_PRV_CA55CLK_FREQ_600_MHZ           (600000000U)  // CA55CLK frequency is 600 MHz
59 
60 #define BSP_PRV_CA55SCLK_FREQ_1000_MHZ         (1000000000U) // CA55SCLK frequency is 500 MHz
61 #define BSP_PRV_CA55SCLK_FREQ_500_MHZ          (500000000U)  // CA55SCLK frequency is 500 MHz
62 
63 #define BSP_PRV_ICLK_FREQ_200_MHZ              (200000000U)  // ICLK frequency is 200 MHz
64 #define BSP_PRV_ICLK_FREQ_150_MHZ              (150000000U)  // ICLK frequency is 150 MHz
65 
66 #define BSP_PRV_PCLKH_FREQ_250_MHZ             (250000000U)  // PCLKH frequency is 250 MHz
67 #define BSP_PRV_PCLKH_FREQ_200_MHZ             (200000000U)  // PCLKH frequency is 200 MHz
68 #define BSP_PRV_PCLKH_FREQ_150_MHZ             (150000000U)  // PCLKH frequency is 150 MHz
69 
70 #define BSP_PRV_PCLKM_FREQ_125_MHZ             (125000000U)  // PCLKM frequency is 125 MHz
71 #define BSP_PRV_PCLKM_FREQ_100_MHZ             (100000000U)  // PCLKM frequency is 100 MHz
72 #define BSP_PRV_PCLKM_FREQ_75_MHZ              (75000000U)   // PCLKM frequency is 750 MHz
73 
74 #define BSP_PRV_PCLKL_FREQ_62_5_MHZ            (62500000U)   // PCLKL frequency is 62.5 MHz
75 #define BSP_PRV_PCLKL_FREQ_50_MHZ              (50000000U)   // PCLKL frequency is 50 MHz
76 #define BSP_PRV_PCLKL_FREQ_37_5_MHZ            (37500000U)   // PCLKL frequency is 37.5 MHz
77 
78 #define BSP_PRV_PCLKADC_FREQ_25_MHZ            (25000000U)   // PCLKADC frequency is 25 MHz
79 #define BSP_PRV_PCLKADC_FREQ_18_75_MHZ         (18750000U)   // PCLKADC frequency is 18.75 MHz
80 
81 #define BSP_PRV_PCLKGPTL_FREQ_500_MHZ          (500000000U)  // PCLKGPTL frequency is 500 MHz
82 #define BSP_PRV_PCLKGPTL_FREQ_400_MHZ          (400000000U)  // PCLKGPTL frequency is 400 MHz
83 #define BSP_PRV_PCLKGPTL_FREQ_300_MHZ          (300000000U)  // PCLKGPTL frequency is 300 MHz
84 
85 #define BSP_PRV_PCLKSCI_FREQ_75_MHZ            (75000000U)   // PCLKSCI frequency is 75 MHz
86 #define BSP_PRV_PCLKSCI_FREQ_80_MHZ            (80000000U)   // PCLKSCI frequency is 80 MHz
87 #define BSP_PRV_PCLKSCI_FREQ_96_MHZ            (96000000U)   // PCLKSCI frequency is 96 MHz
88 #define BSP_PRV_PCLKSCI_FREQ_100_MHZ           (100000000U)  // PCLKSCI frequency is 100 MHz
89 
90 #define BSP_PRV_PCLKSPI_FREQ_75_MHZ            (75000000U)   // PCLKSPI frequency is 75 MHz
91 #define BSP_PRV_PCLKSPI_FREQ_80_MHZ            (80000000U)   // PCLKSPI frequency is 80 MHz
92 #define BSP_PRV_PCLKSPI_FREQ_96_MHZ            (96000000U)   // PCLKSPI frequency is 96 MHz
93 #define BSP_PRV_PCLKSPI_FREQ_100_MHZ           (100000000U)  // PCLKSPI frequency is 100 MHz
94 
95 #define BSP_PRV_PCLKENCO_FREQ_20_MHZ           (20000000U)   // PCLKENCO frequency is 20 MHz
96 #define BSP_PRV_PCLKENCO_FREQ_80_MHZ           (80000000U)   // PCLKENCO frequency is 80 MHz
97 
98 #define BSP_PRV_PCLKCAN_FREQ_80_MHZ            (80000000U)   // PCLKCAN frequency is 80 MHz
99 #define BSP_PRV_PCLKCAN_FREQ_40_MHZ            (40000000U)   // PCLKCAN frequency is 40 MHz
100 
101 #define BSP_PRV_CKIO_FREQ_125_MHZ              (125000000U)  // CKIO frequency is 125 MHz
102 #define BSP_PRV_CKIO_FREQ_100_MHZ              (100000000U)  // CKIO frequency is 100 MHz
103 #define BSP_PRV_CKIO_FREQ_83_3_MHZ             (83333333U)   // CKIO frequency is 83.3 MHz
104 #define BSP_PRV_CKIO_FREQ_75_MHZ               (75000000U)   // CKIO frequency is 75 MHz
105 #define BSP_PRV_CKIO_FREQ_66_7_MHZ             (66666666U)   // CKIO frequency is 66.7 MHz
106 #define BSP_PRV_CKIO_FREQ_62_5_MHZ             (62500000U)   // CKIO frequency is 62.5 MHz
107 #define BSP_PRV_CKIO_FREQ_50_MHZ               (50000000U)   // CKIO frequency is 50 MHz
108 #define BSP_PRV_CKIO_FREQ_41_7_MHZ             (41666666U)   // CKIO frequency is 41.6 MHz
109 #define BSP_PRV_CKIO_FREQ_40_MHZ               (40000000U)   // CKIO frequency is 40 MHz
110 #define BSP_PRV_CKIO_FREQ_37_5_MHZ             (37500000U)   // CKIO frequency is 37.5 MHz
111 #define BSP_PRV_CKIO_FREQ_35_7_MHZ             (35714285U)   // CKIO frequency is 125 MHz
112 #define BSP_PRV_CKIO_FREQ_33_3_MHZ             (33333333U)   // CKIO frequency is 33.3MHz
113 #define BSP_PRV_CKIO_FREQ_31_25_MHZ            (31250000U)   // CKIO frequency is 31.25 MHz
114 #define BSP_PRV_CKIO_FREQ_30_MHZ               (30000000U)   // CKIO frequency is 30 MHz
115 #define BSP_PRV_CKIO_FREQ_28_6_MHZ             (28571428U)   // CKIO frequency is 28.6 MHz
116 #define BSP_PRV_CKIO_FREQ_25_MHZ               (25000000U)   // CKIO frequency is 25 MHz
117 #define BSP_PRV_CKIO_FREQ_21_4_MHZ             (21428571U)   // CKIO frequency is 21.4 MHz
118 #define BSP_PRV_CKIO_FREQ_18_75_MHZ            (18750000U)   // CKIO frequency is 18.75 MHz
119 #define BSP_PRV_CKIO_FREQ_NOT_SUPPORTED        (0xFFFFFFFFU) // CKIO frequency is not supported
120 
121 #define BSP_PRV_XSPI_CLK_FREQ_150_MHZ          (150000000U)  // XSPI_CLK frequency is 150.0 MHz
122 #define BSP_PRV_XSPI_CLK_FREQ_133_3_MHZ        (133333333U)  // XSPI_CLK frequency is 133.3 MHz
123 #define BSP_PRV_XSPI_CLK_FREQ_100_MHZ          (100000000U)  // XSPI_CLK frequency is 100.0 MHz
124 #define BSP_PRV_XSPI_CLK_FREQ_75_MHZ           (75000000U)   // XSPI_CLK frequency is 75.0 MHz
125 #define BSP_PRV_XSPI_CLK_FREQ_50_MHZ           (50000000U)   // XSPI_CLK frequency is 50.0 MHz
126 #define BSP_PRV_XSPI_CLK_FREQ_37_5_MHZ         (37500000U)   // XSPI_CLK frequency is 37.5 MHz
127 #define BSP_PRV_XSPI_CLK_FREQ_25_MHZ           (25000000U)   // XSPI_CLK frequency is 25.0 MHz
128 #define BSP_PRV_XSPI_CLK_FREQ_12_5_MHZ         (12500000U)   // XSPI_CLK frequency is 12.5 MHz
129 #define BSP_PRV_XSPI_CLK_FREQ_NOT_SUPPORTED    (0xFFFFFFFFU) // XSPI_CLK frequency is not supported
130 
131 /** Macro to log and return error without an assertion. */
132 #ifndef FSP_RETURN
133 
134  #define FSP_RETURN(err)    FSP_ERROR_LOG((err)); \
135     return err;
136 #endif
137 
138 /** This function is called before returning an error code. To stop on a runtime error, define fsp_error_log in
139  * user code and do required debugging (breakpoints, stack dump, etc) in this function.*/
140 #if (1 == BSP_CFG_ERROR_LOG)
141 
142  #ifndef FSP_ERROR_LOG
143   #define FSP_ERROR_LOG(err) \
144     fsp_error_log((err), __FILE__, __LINE__);
145  #endif
146 #else
147 
148  #define FSP_ERROR_LOG(err)
149 #endif
150 
151 /** Default assertion calls ::FSP_ERROR_RETURN if condition "a" is false. Used to identify incorrect use of API's in FSP
152  * functions. */
153 #if (3 == BSP_CFG_ASSERT)
154  #define FSP_ASSERT(a)
155 #elif (2 == BSP_CFG_ASSERT)
156  #define FSP_ASSERT(a)    {assert(a);}
157 #else
158  #define FSP_ASSERT(a)    FSP_ERROR_RETURN((a), FSP_ERR_ASSERTION)
159 #endif                                 // ifndef FSP_ASSERT
160 
161 /** All FSP error codes are returned using this macro. Calls ::FSP_ERROR_LOG function if condition "a" is false. Used
162  * to identify runtime errors in FSP functions. */
163 
164 #define FSP_ERROR_RETURN(a, err)                        \
165     {                                                   \
166         if ((a))                                        \
167         {                                               \
168             (void) 0;                  /* Do nothing */ \
169         }                                               \
170         else                                            \
171         {                                               \
172             FSP_ERROR_LOG(err);                         \
173             return err;                                 \
174         }                                               \
175     }
176 
177 /* Function-like macro used to wait for a condition to be met, most often used to wait for hardware register updates.
178  * This macro can be redefined to add a timeout if necessary. */
179 #ifndef FSP_HARDWARE_REGISTER_WAIT
180  #define FSP_HARDWARE_REGISTER_WAIT(reg, required_value)    while (reg != required_value) { /* Wait. */}
181 #endif
182 
183 /* Function-like macro used to wait for a condition to be met with timeout,
184  * most often used to wait for hardware register updates. */
185 #define BSP_HARDWARE_REGISTER_WAIT_WTIH_TIMEOUT(reg, required_value, timeout) \
186     while ((timeout))                                                         \
187     {                                                                         \
188         if ((required_value) == (reg))                                        \
189         {                                                                     \
190             break;                                                            \
191         }                                                                     \
192         (timeout)--;                                                          \
193     }
194 
195 #ifndef BSP_CFG_IRQ_MASK_LEVEL_FOR_CRITICAL_SECTION
196  #define BSP_CFG_IRQ_MASK_LEVEL_FOR_CRITICAL_SECTION    (0U)
197 #endif
198 
199 /* This macro defines a variable for saving previous mask value */
200 #ifndef FSP_CRITICAL_SECTION_DEFINE
201 
202  #define FSP_CRITICAL_SECTION_DEFINE              uintptr_t old_mask_level = 0U
203 #endif
204 
205 /* These macros abstract methods to save and restore the interrupt state. */
206 #define FSP_CRITICAL_SECTION_GET_CURRENT_STATE    read_ICC_PMR_EL1
207 #define FSP_CRITICAL_SECTION_SET_STATE            write_ICC_PMR_EL1
208 #define FSP_CRITICAL_SECTION_IRQ_MASK_SET         ((uint8_t) (BSP_CFG_IRQ_MASK_LEVEL_FOR_CRITICAL_SECTION << \
209                                                               BSP_FEATURE_BSP_IRQ_PRIORITY_POS_BIT))
210 
211 /** This macro temporarily saves the current interrupt state and disables interrupts. */
212 #ifndef FSP_CRITICAL_SECTION_ENTER
213  #define FSP_CRITICAL_SECTION_ENTER                            \
214     old_mask_level = FSP_CRITICAL_SECTION_GET_CURRENT_STATE(); \
215     FSP_CRITICAL_SECTION_SET_STATE(FSP_CRITICAL_SECTION_IRQ_MASK_SET)
216 #endif
217 
218 /** This macro restores the previously saved interrupt state, reenabling interrupts. */
219 #ifndef FSP_CRITICAL_SECTION_EXIT
220  #define FSP_CRITICAL_SECTION_EXIT              FSP_CRITICAL_SECTION_SET_STATE(old_mask_level)
221 #endif
222 
223 /* Number of Cortex processor exceptions. */
224 #define FSP_PRIV_CORTEX_PROCESSOR_EXCEPTIONS    (32U)
225 
226 /** Used to signify that the requested IRQ vector is not defined in this system. */
227 #define FSP_INVALID_VECTOR                      ((IRQn_Type) - 33)
228 
229 /* This macro Enable or Disable interrupts. */
230 #if defined(BSP_CFG_CORE_CA55)
231  #define BSP_INTERRUPT_ENABLE                   __enable_fiq()
232 
233  #define BSP_INTERRUPT_DISABLE                  __disable_fiq()
234 
235 #elif defined(BSP_CFG_CORE_CR52)
236  #define BSP_INTERRUPT_ENABLE                   __asm volatile ("cpsie i"); \
237     __asm volatile ("isb");
238 
239  #define BSP_INTERRUPT_DISABLE                  __asm volatile ("cpsid i"); \
240     __asm volatile ("isb");
241 #endif
242 
243 /** In the event of an unrecoverable error the BSP will by default call the __BKPT() intrinsic function which will
244  *  alert the user of the error. The user can override this default behavior by defining their own
245  *  BSP_CFG_HANDLE_UNRECOVERABLE_ERROR macro.
246  */
247 #if !defined(BSP_CFG_HANDLE_UNRECOVERABLE_ERROR)
248 
249  #define BSP_CFG_HANDLE_UNRECOVERABLE_ERROR(x)    __BKPT((x))
250 #endif
251 
252 /***********************************************************************************************************************
253  * Typedef definitions
254  **********************************************************************************************************************/
255 
256 /** Different warm start entry locations in the BSP. */
257 typedef enum e_bsp_warm_start_event
258 {
259     BSP_WARM_START_RESET = 0,          ///< Called almost immediately after reset. No C runtime environment, clocks, or IRQs.
260     BSP_WARM_START_POST_CLOCK,         ///< Called after clock initialization. No C runtime environment or IRQs.
261     BSP_WARM_START_POST_C,             ///< Called after clocks and C runtime environment have been set up
262 } bsp_warm_start_event_t;
263 
264 /* Private enum used in R_FSP_SystemClockHzGet. */
265 typedef enum e_fsp_priv_clock
266 {
267     FSP_PRIV_CLOCK_CPU0,
268     FSP_PRIV_CLOCK_CPU1,
269     FSP_PRIV_CLOCK_CA55C0,
270     FSP_PRIV_CLOCK_CA55C1,
271     FSP_PRIV_CLOCK_CA55C2,
272     FSP_PRIV_CLOCK_CA55C3,
273     FSP_PRIV_CLOCK_CA55SCLK,
274     FSP_PRIV_CLOCK_ICLK,
275     FSP_PRIV_CLOCK_PCLKH,
276     FSP_PRIV_CLOCK_PCLKM,
277     FSP_PRIV_CLOCK_PCLKL,
278     FSP_PRIV_CLOCK_PCLKADC,
279     FSP_PRIV_CLOCK_PCLKGPTL,
280     FSP_PRIV_CLOCK_PCLKENCO,
281     FSP_PRIV_CLOCK_PCLKSPI0,
282     FSP_PRIV_CLOCK_PCLKSPI1,
283     FSP_PRIV_CLOCK_PCLKSPI2,
284     FSP_PRIV_CLOCK_PCLKSPI3,
285     FSP_PRIV_CLOCK_PCLKSCI0,
286     FSP_PRIV_CLOCK_PCLKSCI1,
287     FSP_PRIV_CLOCK_PCLKSCI2,
288     FSP_PRIV_CLOCK_PCLKSCI3,
289     FSP_PRIV_CLOCK_PCLKSCI4,
290     FSP_PRIV_CLOCK_PCLKSCI5,
291     FSP_PRIV_CLOCK_PCLKSCIE0,
292     FSP_PRIV_CLOCK_PCLKSCIE1,
293     FSP_PRIV_CLOCK_PCLKSCIE2,
294     FSP_PRIV_CLOCK_PCLKSCIE3,
295     FSP_PRIV_CLOCK_PCLKSCIE4,
296     FSP_PRIV_CLOCK_PCLKSCIE5,
297     FSP_PRIV_CLOCK_PCLKSCIE6,
298     FSP_PRIV_CLOCK_PCLKSCIE7,
299     FSP_PRIV_CLOCK_PCLKSCIE8,
300     FSP_PRIV_CLOCK_PCLKSCIE9,
301     FSP_PRIV_CLOCK_PCLKSCIE10,
302     FSP_PRIV_CLOCK_PCLKSCIE11,
303     FSP_PRIV_CLOCK_PCLKCAN,
304     FSP_PRIV_CLOCK_CKIO,
305     FSP_PRIV_CLOCK_XSPI0_CLK,
306     FSP_PRIV_CLOCK_XSPI1_CLK
307 } fsp_priv_clock_t;
308 
309 /***********************************************************************************************************************
310  * Exported global variables
311  **********************************************************************************************************************/
312 #if (1 == BSP_FEATURE_CGC_CKIO_CLOCK_FREQ_TYPE)
313 extern const uint32_t g_bsp_system_clock_select_ckio[][2];
314 #elif (2 == BSP_FEATURE_CGC_CKIO_CLOCK_FREQ_TYPE)
315 extern const uint32_t g_bsp_system_clock_select_ckio[];
316 #endif
317 extern const uint32_t g_bsp_system_clock_select_xspi_clk[][2];
318 extern const uint32_t g_bsp_system_clock_select_spi_clk[];
319 extern const uint32_t g_bsp_system_clock_select_sci_clk[];
320 
321 extern IRQn_Type g_current_interrupt_num[];
322 extern uint8_t   g_current_interrupt_pointer;
323 
324 /***********************************************************************************************************************
325  * Exported global functions (to be accessed by other files)
326  **********************************************************************************************************************/
327 
328 /***********************************************************************************************************************
329  * Inline Functions
330  **********************************************************************************************************************/
331 
332 /*******************************************************************************************************************//**
333  * Return active interrupt vector number value
334  *
335  * @return     Active interrupt vector number value
336  **********************************************************************************************************************/
R_FSP_CurrentIrqGet(void)337 __STATIC_INLINE IRQn_Type R_FSP_CurrentIrqGet (void)
338 {
339     /* Return the current interrupt number. */
340     return g_current_interrupt_num[(g_current_interrupt_pointer - 1U)];
341 }
342 
343 /*******************************************************************************************************************//**
344  * Gets the frequency of a system clock.
345  *
346  * @return     Frequency of requested clock in Hertz.
347  **********************************************************************************************************************/
R_FSP_SystemClockHzGet(fsp_priv_clock_t clock)348 __STATIC_INLINE uint32_t R_FSP_SystemClockHzGet (fsp_priv_clock_t clock)
349 {
350     uint32_t clock_hz = 0;
351 
352 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
353     uint32_t fselcpu0  = R_SYSC_S->SCKCR2_b.FSELCPU0;
354     uint32_t divselsub = R_SYSC_S->SCKCR2_b.DIVSELSUB;
355 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
356     uint32_t cr52cpu0 = R_SYSC_S->SCKCR2_b.CR52CPU0;
357     uint32_t cr52cpu1 = R_SYSC_S->SCKCR2_b.CR52CPU1;
358 #endif
359     switch (clock)
360     {
361         case FSP_PRIV_CLOCK_CPU0:
362         {
363 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
364             clock_hz = (0 == divselsub) ? BSP_PRV_CPU_FREQ_200_MHZ : BSP_PRV_CPU_FREQ_150_MHZ;
365             clock_hz = clock_hz << fselcpu0;
366 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
367             clock_hz = (0 == cr52cpu0) ? BSP_PRV_CPU_FREQ_500_MHZ : BSP_PRV_CPU_FREQ_1000_MHZ;
368 #endif
369             break;
370         }
371 
372         case FSP_PRIV_CLOCK_CPU1:
373         {
374 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
375             clock_hz = (0 == cr52cpu1) ? BSP_PRV_CPU_FREQ_500_MHZ : BSP_PRV_CPU_FREQ_1000_MHZ;
376 #endif
377             break;
378         }
379 
380 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
381         case FSP_PRIV_CLOCK_CA55C0:
382         {
383             uint32_t ca55core0 = R_SYSC_S->SCKCR2_b.CA55CORE0;
384             clock_hz = (0 == ca55core0) ? BSP_PRV_CA55CLK_FREQ_600_MHZ : BSP_PRV_CA55CLK_FREQ_1200_MHZ;
385             break;
386         }
387 
388         case FSP_PRIV_CLOCK_CA55C1:
389         {
390             uint32_t ca55core1 = R_SYSC_S->SCKCR2_b.CA55CORE1;
391             clock_hz = (0 == ca55core1) ? BSP_PRV_CA55CLK_FREQ_600_MHZ : BSP_PRV_CA55CLK_FREQ_1200_MHZ;
392             break;
393         }
394 
395         case FSP_PRIV_CLOCK_CA55C2:
396         {
397             uint32_t ca55core2 = R_SYSC_S->SCKCR2_b.CA55CORE2;
398             clock_hz = (0 == ca55core2) ? BSP_PRV_CA55CLK_FREQ_600_MHZ : BSP_PRV_CA55CLK_FREQ_1200_MHZ;
399             break;
400         }
401 
402         case FSP_PRIV_CLOCK_CA55C3:
403         {
404             uint32_t ca55core3 = R_SYSC_S->SCKCR2_b.CA55CORE3;
405             clock_hz = (0 == ca55core3) ? BSP_PRV_CA55CLK_FREQ_600_MHZ : BSP_PRV_CA55CLK_FREQ_1200_MHZ;
406             break;
407         }
408 
409         case FSP_PRIV_CLOCK_CA55SCLK:
410         {
411             uint32_t ca55sclk = R_SYSC_S->SCKCR2_b.CA55SCLK;
412             clock_hz = (0 == ca55sclk) ? BSP_PRV_CA55SCLK_FREQ_500_MHZ : BSP_PRV_CA55SCLK_FREQ_1000_MHZ;
413             break;
414         }
415 #endif
416 
417         case FSP_PRIV_CLOCK_ICLK:
418         {
419 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
420             clock_hz = (0 == divselsub) ? BSP_PRV_ICLK_FREQ_200_MHZ : BSP_PRV_ICLK_FREQ_150_MHZ;
421 #endif
422             break;
423         }
424 
425         case FSP_PRIV_CLOCK_PCLKH:
426         {
427 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
428             clock_hz = (0 == divselsub) ? BSP_PRV_PCLKH_FREQ_200_MHZ : BSP_PRV_PCLKH_FREQ_150_MHZ;
429 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
430             clock_hz = BSP_PRV_PCLKH_FREQ_250_MHZ;
431 #endif
432             break;
433         }
434 
435         case FSP_PRIV_CLOCK_PCLKM:
436         {
437 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
438             clock_hz = (0 == divselsub) ? BSP_PRV_PCLKM_FREQ_100_MHZ : BSP_PRV_PCLKM_FREQ_75_MHZ;
439 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
440             clock_hz = BSP_PRV_PCLKM_FREQ_125_MHZ;
441 #endif
442             break;
443         }
444 
445         case FSP_PRIV_CLOCK_PCLKL:
446         {
447 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
448             clock_hz = (0 == divselsub) ? BSP_PRV_PCLKL_FREQ_50_MHZ : BSP_PRV_PCLKL_FREQ_37_5_MHZ;
449 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
450             clock_hz = BSP_PRV_PCLKL_FREQ_62_5_MHZ;
451 #endif
452             break;
453         }
454 
455         case FSP_PRIV_CLOCK_PCLKADC:
456         {
457 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
458             clock_hz = (0 == divselsub) ? BSP_PRV_PCLKADC_FREQ_25_MHZ : BSP_PRV_PCLKADC_FREQ_18_75_MHZ;
459 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
460             clock_hz = BSP_PRV_PCLKADC_FREQ_25_MHZ;
461 #endif
462             break;
463         }
464 
465         case FSP_PRIV_CLOCK_PCLKGPTL:
466         {
467 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
468             clock_hz = (0 == divselsub) ? BSP_PRV_PCLKGPTL_FREQ_400_MHZ : BSP_PRV_PCLKGPTL_FREQ_300_MHZ;
469 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
470             clock_hz = BSP_PRV_PCLKGPTL_FREQ_500_MHZ;
471 #endif
472             break;
473         }
474 
475         case FSP_PRIV_CLOCK_PCLKSPI0:
476         {
477 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
478             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_NS->SCKCR_b.SPI0ASYNCSEL];
479 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
480             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_NS->SCKCR3_b.SPI0ASYNCSEL];
481 #endif
482             break;
483         }
484 
485         case FSP_PRIV_CLOCK_PCLKSPI1:
486         {
487 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
488             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_NS->SCKCR_b.SPI1ASYNCSEL];
489 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
490             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_NS->SCKCR3_b.SPI1ASYNCSEL];
491 #endif
492             break;
493         }
494 
495         case FSP_PRIV_CLOCK_PCLKSPI2:
496         {
497 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
498             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_NS->SCKCR_b.SPI2ASYNCSEL];
499 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
500             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_NS->SCKCR3_b.SPI2ASYNCSEL];
501 #endif
502             break;
503         }
504 
505         case FSP_PRIV_CLOCK_PCLKSPI3:
506         {
507             clock_hz = g_bsp_system_clock_select_spi_clk[R_SYSC_S->SCKCR2_b.SPI3ASYNCSEL];
508             break;
509         }
510 
511         case FSP_PRIV_CLOCK_PCLKSCI0:
512         {
513 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
514             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR_b.SCI0ASYNCSEL];
515 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
516             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR3_b.SCI0ASYNCSEL];
517 #endif
518             break;
519         }
520 
521         case FSP_PRIV_CLOCK_PCLKSCI1:
522         {
523 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
524             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR_b.SCI1ASYNCSEL];
525 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
526             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR3_b.SCI1ASYNCSEL];
527 #endif
528             break;
529         }
530 
531         case FSP_PRIV_CLOCK_PCLKSCI2:
532         {
533 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
534             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR_b.SCI2ASYNCSEL];
535 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
536             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR3_b.SCI2ASYNCSEL];
537 #endif
538             break;
539         }
540 
541         case FSP_PRIV_CLOCK_PCLKSCI3:
542         {
543 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
544             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR_b.SCI3ASYNCSEL];
545 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
546             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR3_b.SCI3ASYNCSEL];
547 #endif
548             break;
549         }
550 
551         case FSP_PRIV_CLOCK_PCLKSCI4:
552         {
553 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
554             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR_b.SCI4ASYNCSEL];
555 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
556             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR3_b.SCI4ASYNCSEL];
557 #endif
558             break;
559         }
560 
561         case FSP_PRIV_CLOCK_PCLKSCI5:
562         {
563             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_S->SCKCR2_b.SCI5ASYNCSEL];
564             break;
565         }
566 
567 #if (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
568         case FSP_PRIV_CLOCK_PCLKSCIE0:
569         {
570             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE0ASYNCSEL];
571             break;
572         }
573 
574         case FSP_PRIV_CLOCK_PCLKSCIE1:
575         {
576             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE1ASYNCSEL];
577             break;
578         }
579 
580         case FSP_PRIV_CLOCK_PCLKSCIE2:
581         {
582             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE2ASYNCSEL];
583             break;
584         }
585 
586         case FSP_PRIV_CLOCK_PCLKSCIE3:
587         {
588             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE3ASYNCSEL];
589             break;
590         }
591 
592         case FSP_PRIV_CLOCK_PCLKSCIE4:
593         {
594             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE4ASYNCSEL];
595             break;
596         }
597 
598         case FSP_PRIV_CLOCK_PCLKSCIE5:
599         {
600             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE5ASYNCSEL];
601             break;
602         }
603 
604         case FSP_PRIV_CLOCK_PCLKSCIE6:
605         {
606             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE6ASYNCSEL];
607             break;
608         }
609 
610         case FSP_PRIV_CLOCK_PCLKSCIE7:
611         {
612             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE7ASYNCSEL];
613             break;
614         }
615 
616         case FSP_PRIV_CLOCK_PCLKSCIE8:
617         {
618             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE8ASYNCSEL];
619             break;
620         }
621 
622         case FSP_PRIV_CLOCK_PCLKSCIE9:
623         {
624             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE9ASYNCSEL];
625             break;
626         }
627 
628         case FSP_PRIV_CLOCK_PCLKSCIE10:
629         {
630             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE10ASYNCSEL];
631             break;
632         }
633 
634         case FSP_PRIV_CLOCK_PCLKSCIE11:
635         {
636             clock_hz = g_bsp_system_clock_select_sci_clk[R_SYSC_NS->SCKCR4_b.SCIE11ASYNCSEL];
637             break;
638         }
639 #endif
640 
641         case FSP_PRIV_CLOCK_PCLKCAN:
642         {
643             uint32_t fselcanfd = R_SYSC_NS->SCKCR_b.FSELCANFD;
644             clock_hz = (0 == fselcanfd) ? BSP_PRV_PCLKCAN_FREQ_80_MHZ : BSP_PRV_PCLKCAN_FREQ_40_MHZ;
645             break;
646         }
647 
648         case FSP_PRIV_CLOCK_CKIO:
649         {
650             uint32_t ckio = R_SYSC_NS->SCKCR_b.CKIO;
651 #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
652             clock_hz = g_bsp_system_clock_select_ckio[ckio][divselsub];
653 #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
654             clock_hz = g_bsp_system_clock_select_ckio[ckio];
655 #endif
656             break;
657         }
658 
659         case FSP_PRIV_CLOCK_XSPI0_CLK:
660         {
661             uint32_t fselxspi0 = R_SYSC_NS->SCKCR_b.FSELXSPI0;
662             clock_hz = g_bsp_system_clock_select_xspi_clk[fselxspi0][R_SYSC_NS->SCKCR_b.DIVSELXSPI0];
663             break;
664         }
665 
666         case FSP_PRIV_CLOCK_XSPI1_CLK:
667         {
668             uint32_t fselxspi1 = R_SYSC_NS->SCKCR_b.FSELXSPI1;
669             clock_hz = g_bsp_system_clock_select_xspi_clk[fselxspi1][R_SYSC_NS->SCKCR_b.DIVSELXSPI1];
670             break;
671         }
672 
673 #if (BSP_FEATURE_BSP_ENCOUT_SUPPORTED)
674         case FSP_PRIV_CLOCK_PCLKENCO:
675         {
676  #if (1 == BSP_FEATURE_CGC_SCKCR_TYPE)
677             clock_hz = BSP_PRV_PCLKENCO_FREQ_20_MHZ;
678  #elif (2 == BSP_FEATURE_CGC_SCKCR_TYPE)
679             uint32_t encoutclk = R_SYSC_NS->SCKCR4_b.ENCOUTCLK;
680             clock_hz = (0 == encoutclk) ? BSP_PRV_PCLKENCO_FREQ_20_MHZ : BSP_PRV_PCLKENCO_FREQ_80_MHZ;
681  #endif
682             break;
683         }
684 #endif
685 
686         default:
687         {
688             break;
689         }
690     }
691 
692     return clock_hz;
693 }
694 
695 #if ((1 == BSP_CFG_ERROR_LOG) || (1 == BSP_CFG_ASSERT))
696 
697 /** Prototype of default function called before errors are returned in FSP code if BSP_CFG_LOG_ERRORS is set to 1. */
698 void fsp_error_log(fsp_err_t err, const char * file, int32_t line);
699 
700 #endif
701 
702 /** @} (end addtogroup BSP_MCU) */
703 
704 void * bsp_prv_malloc(size_t size);
705 void   bsp_prv_free(void * ptr);
706 
707 /** Common macro for FSP header files. There is also a corresponding FSP_HEADER macro at the top of this file. */
708 FSP_FOOTER
709 
710 #endif
711