1 /***************************************************************************//**
2 * \file cy_syslib.c
3 * \version 3.60
4 *
5 *  Description:
6 *   Provides system API implementation for the SysLib driver.
7 *
8 ********************************************************************************
9 * Copyright (c) (2016-2022), Cypress Semiconductor Corporation (an Infineon company) or
10 * an affiliate of Cypress Semiconductor Corporation.
11 * SPDX-License-Identifier: Apache-2.0
12 *
13 * Licensed under the Apache License, Version 2.0 (the "License");
14 * you may not use this file except in compliance with the License.
15 * You may obtain a copy of the License at
16 *
17 *     http://www.apache.org/licenses/LICENSE-2.0
18 *
19 * Unless required by applicable law or agreed to in writing, software
20 * distributed under the License is distributed on an "AS IS" BASIS,
21 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
22 * See the License for the specific language governing permissions and
23 * limitations under the License.
24 *******************************************************************************/
25 
26 #include "cy_device.h"
27 
28 #if defined (CY_IP_M33SYSCPUSS) || defined (CY_IP_M4CPUSS) || defined (CY_IP_M7CPUSS) || defined(CY_IP_M55APPCPUSS)
29 
30 #include "cy_syslib.h"
31 
32 #if defined (CY_IP_M33SYSCPUSS)
33 #include "cy_efuse.h"
34 #endif
35 
36 #ifdef CY_IP_M4CPUSS
37 #include "cy_ipc_drv.h"
38 #endif
39 #if !defined(NDEBUG)
40     #include <string.h>
41 #endif /* NDEBUG */
42 
43 #if defined (CY_DEVICE_SECURE)
44 #include "cy_pra.h"
45 #endif /* defined (CY_DEVICE_SECURE) */
46 
47 #ifdef CY_IP_M4CPUSS
48 /* Flash wait states (ULP mode at 0.9v) */
49 #define CY_SYSLIB_FLASH_ULP_WS_0_FREQ_MAX    ( 16UL)
50 #define CY_SYSLIB_FLASH_ULP_WS_1_FREQ_MAX    ( 33UL)
51 #define CY_SYSLIB_FLASH_ULP_WS_2_FREQ_MAX    ( 50UL)
52 
53 /* ROM and SRAM wait states for the slow clock domain (LP mode at 1.1v) */
54 #define CY_SYSLIB_LP_SLOW_WS_0_FREQ_MAX      (100UL)
55 #define CY_SYSLIB_LP_SLOW_WS_1_FREQ_MAX      (120UL)
56 
57 /* ROM and SRAM wait states for the slow clock domain (ULP mode at 0.9v) */
58 #define CY_SYSLIB_ULP_SLOW_WS_0_FREQ_MAX     ( 25UL)
59 #define CY_SYSLIB_ULP_SLOW_WS_1_FREQ_MAX     ( 50UL)
60 #elif (defined(CY_IP_M33SYSCPUSS) && (CY_IP_M33SYSCPUSS))
61 /* These definitions can be removed once SystemCorClockUpdate() function is implemented */
62 #define CY_SYSCLK_IMO_FREQ          (8000000UL) /* Hz */
63 #define CY_DELAY_1K_THRESHOLD           (1000u)
64 #define CY_DELAY_1K_MINUS_1_THRESHOLD   (CY_DELAY_1K_THRESHOLD - 1u)
65 #define CY_DELAY_1M_THRESHOLD           (1000000u)
66 #define CY_DELAY_1M_MINUS_1_THRESHOLD   (CY_DELAY_1M_THRESHOLD - 1u)
67 
68 #elif defined(CY_IP_M7CPUSS)
69 #define CY_SYSLIB_LP_SLOW_WS_0_FREQ_MAX      (100UL)
70 
71 #endif
72 
73 #if (defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION < 2))
74 /* RESET_CAUSE2 macro for SRSSv1 devices (nominally CAT1A devices except TVIIBE) */
75 #define CY_SRSS_RES_CAUSE2_CSV_LOSS_Msk    (SRSS_RES_CAUSE2_RESET_CSV_HF_LOSS_Msk)
76 #define CY_SRSS_RES_CAUSE2_CSV_LOSS_Pos    (SRSS_RES_CAUSE2_RESET_CSV_HF_LOSS_Pos)
77 #define CY_SRSS_RES_CAUSE2_CSV_ERROR_Msk    (SRSS_RES_CAUSE2_RESET_CSV_HF_FREQ_Msk)
78 #define CY_SRSS_RES_CAUSE2_CSV_ERROR_Pos    (SRSS_RES_CAUSE2_RESET_CSV_HF_FREQ_Pos)
79 #endif
80 
81 #if (defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION >= 2))
82 /* RESET_CAUSE2 macro for SRSSv2 and v3 (nominally CAT1C and TVIIBE CAT1A devices) */
83 #define CY_SRSS_RES_CAUSE2_CSV_LOSS_Msk    (SRSS_RES_CAUSE2_RESET_CSV_HF_Msk)
84 #define CY_SRSS_RES_CAUSE2_CSV_LOSS_Pos    (SRSS_RES_CAUSE2_RESET_CSV_HF_Pos)
85 #define CY_SRSS_RES_CAUSE2_CSV_ERROR_Msk    (SRSS_RES_CAUSE2_RESET_CSV_REF_Msk)
86 #define CY_SRSS_RES_CAUSE2_CSV_ERROR_Pos    (SRSS_RES_CAUSE2_RESET_CSV_REF_Pos)
87 #endif
88 
89 #if  defined (CY_IP_MXS40SSRSS) || defined (CY_IP_MXS28SRSS) || defined(CY_IP_MXS22SRSS)
90 /* RESET_CAUSE2 macro for CAT1B, CAT1D devices */
91 #define CY_SRSS_RES_CAUSE2_CSV_LOSS_Msk    (SRSS_RES_CAUSE2_RESET_CSV_HF_Msk)
92 #define CY_SRSS_RES_CAUSE2_CSV_LOSS_Pos    (SRSS_RES_CAUSE2_RESET_CSV_HF_Pos)
93 #define CY_SRSS_RES_CAUSE2_CSV_ERROR_Msk    (SRSS_RES_CAUSE2_RESET_CSV_REF_Msk)
94 #define CY_SRSS_RES_CAUSE2_CSV_ERROR_Pos    (SRSS_RES_CAUSE2_RESET_CSV_REF_Pos)
95 #endif
96 
97 #if defined (CY_IP_MXS40SSRSS) || defined (CY_IP_MXS22SRSS)
98 /** Holds the flag to indicate if the System woke up from Warm Boot or not */
99 bool cy_WakeupFromWarmBootStatus = false;
100 #endif /* defined (CY_IP_MXS40SSRSS) || defined (CY_IP_MXS22SRSS) */
101 
102 #if !defined(NDEBUG)
103     CY_NOINIT char_t cy_assertFileName[CY_MAX_FILE_NAME_SIZE + 1];
104     CY_NOINIT uint32_t cy_assertLine;
105 #endif /* NDEBUG */
106 
107 #if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED)
108     CY_NOINIT cy_stc_fault_frame_t cy_faultFrame;
109 #endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) */
110 
111 #if defined(__ARMCC_VERSION)
112         #if (__ARMCC_VERSION >= 6010050)
Cy_SysLib_AsmInfiniteLoop(void)113             static void Cy_SysLib_AsmInfiniteLoop(void) { __ASM (" b . "); };
114         #else
Cy_SysLib_AsmInfiniteLoop(void)115             static __ASM void Cy_SysLib_AsmInfiniteLoop(void) { b . };
116         #endif /* (__ARMCC_VERSION >= 6010050) */
117 #endif  /* (__ARMCC_VERSION) */
118 
119 #if defined(CY_INIT_CODECOPY_ENABLE)
120 CY_SECTION_INIT_CODECOPY_BEGIN
121 #endif
Cy_SysLib_Delay(uint32_t milliseconds)122 void Cy_SysLib_Delay(uint32_t milliseconds)
123 {
124     uint32_t max_delay_ms = 0xFFFFFFFFU / (cy_delayFreqKhz * CY_SYSLIB_DELAY_CALIBRATION_FACTOR);
125 
126     while(milliseconds > max_delay_ms)
127     {
128         /* This loop prevents an overflow in value passed to Cy_SysLib_DelayCycles() API. */
129         Cy_SysLib_DelayCycles(max_delay_ms * cy_delayFreqKhz * CY_SYSLIB_DELAY_CALIBRATION_FACTOR);
130         milliseconds -= max_delay_ms;
131     }
132 
133     Cy_SysLib_DelayCycles(milliseconds * cy_delayFreqKhz * CY_SYSLIB_DELAY_CALIBRATION_FACTOR);
134 }
135 
136 
Cy_SysLib_DelayUs(uint16_t microseconds)137 void Cy_SysLib_DelayUs(uint16_t microseconds)
138 {
139     Cy_SysLib_DelayCycles((uint32_t) microseconds * cy_delayFreqMhz * CY_SYSLIB_DELAY_CALIBRATION_FACTOR);
140 }
141 
Cy_SysLib_Rtos_Delay(uint32_t milliseconds)142 __WEAK void Cy_SysLib_Rtos_Delay(uint32_t milliseconds)
143 {
144     Cy_SysLib_Delay(milliseconds);
145 }
146 
Cy_SysLib_Rtos_DelayUs(uint16_t microseconds)147 __WEAK void Cy_SysLib_Rtos_DelayUs(uint16_t microseconds)
148 {
149     Cy_SysLib_DelayUs(microseconds);
150 }
151 
Cy_SysLib_Halt(uint32_t reason)152 __NO_RETURN void Cy_SysLib_Halt(uint32_t reason)
153 {
154     if(0U != reason)
155     {
156         /* To remove an unreferenced local variable warning */
157     }
158 
159     #if defined (__ARMCC_VERSION)
160         __BKPT(0x0);
161     #elif defined(__GNUC__)
162         CY_HALT();
163     #elif defined (__ICCARM__)
164         CY_HALT();
165     #else
166         #error "An unsupported toolchain"
167     #endif  /* (__ARMCC_VERSION) */
168 
169     while(true) {}
170 }
171 
172 
Cy_SysLib_AssertFailed(const char_t * file,uint32_t line)173 __WEAK void Cy_SysLib_AssertFailed(const char_t * file, uint32_t line)
174 {
175 #if !defined(NDEBUG) || defined(CY_DOXYGEN)
176     (void) strncpy(cy_assertFileName, file, CY_MAX_FILE_NAME_SIZE);
177     cy_assertLine = line;
178     Cy_SysLib_Halt(0UL);
179 #else
180     (void) file;
181     (void) line;
182 #endif  /* !defined(NDEBUG) || defined(CY_DOXYGEN) */
183 }
184 
185 #ifdef CY_IP_M4CPUSS
186 
187 
Cy_SysLib_ClearFlashCacheAndBuffer(void)188 void Cy_SysLib_ClearFlashCacheAndBuffer(void)
189 {
190     #if CY_CPU_CORTEX_M4 && defined(CY_DEVICE_SECURE)
191         CY_PRA_REG32_SET(CY_PRA_INDX_FLASHC_FLASH_CMD, FLASHC_FLASH_CMD_INV_Msk);
192     #else
193         FLASHC_FLASH_CMD = FLASHC_FLASH_CMD_INV_Msk;
194     #endif /* CY_CPU_CORTEX_M4 && defined(CY_DEVICE_SECURE) */
195 }
196 #endif
197 
198 
Cy_SysLib_ResetBackupDomain(void)199 cy_en_syslib_status_t Cy_SysLib_ResetBackupDomain(void)
200 {
201     BACKUP_RESET = BACKUP_RESET_RESET_Msk;
202     return (Cy_SysLib_GetResetStatus());
203 }
204 
Cy_SysLib_GetResetReason(void)205 uint32_t Cy_SysLib_GetResetReason(void)
206 {
207     uint32_t retVal = SRSS_RES_CAUSE;
208 
209     if(0U != _FLD2VAL(SRSS_PWR_HIBERNATE_TOKEN, SRSS_PWR_HIBERNATE))
210     {
211         retVal |= CY_SYSLIB_RESET_HIB_WAKEUP;
212     }
213 
214 #if defined (CY_IP_MXS28SRSS) || defined (CY_IP_MXS40SSRSS) || defined (CY_IP_MXS40SRSS) || (defined (CY_IP_MXS40SRSS) && (CY_IP_MXS40SRSS_VERSION >= 2)) ||  defined(CY_IP_MXS22SRSS)
215     if(0U != _FLD2VAL(CY_SRSS_RES_CAUSE2_CSV_LOSS, SRSS_RES_CAUSE2))
216     {
217         retVal |= CY_SYSLIB_RESET_CSV_LOSS_WAKEUP;
218     }
219 
220     if(0U != _FLD2VAL(CY_SRSS_RES_CAUSE2_CSV_ERROR, SRSS_RES_CAUSE2))
221     {
222         retVal |= CY_SYSLIB_RESET_CSV_ERROR_WAKEUP;
223     }
224 #endif
225     return (retVal);
226 }
227 
228 
Cy_SysLib_ClearResetReason(void)229 void Cy_SysLib_ClearResetReason(void)
230 {
231     /* RES_CAUSE and RES_CAUSE2 register's bits are RW1C (every bit is cleared upon writing 1),
232      * so write all ones to clear all the reset reasons.
233      */
234     SRSS_RES_CAUSE  = 0xFFFFFFFFU;
235     SRSS_RES_CAUSE2 = 0xFFFFFFFFU;
236 
237     if(0U != _FLD2VAL(SRSS_PWR_HIBERNATE_TOKEN, SRSS_PWR_HIBERNATE))
238     {
239         /* Clears PWR_HIBERNATE token */
240 #if CY_CPU_CORTEX_M4 && defined (CY_DEVICE_SECURE)
241         CY_PRA_REG32_CLR_SET(CY_PRA_INDX_SRSS_PWR_HIBERNATE, SRSS_PWR_HIBERNATE_TOKEN, 0UL);
242 #else
243         SRSS_PWR_HIBERNATE &= ~SRSS_PWR_HIBERNATE_TOKEN_Msk;
244 #endif /* CY_CPU_CORTEX_M4 && defined (CY_DEVICE_SECURE) */
245     }
246 }
247 
248 #ifdef CY_IP_M4CPUSS
249 #if (CY_CPU_CORTEX_M0P)
250 
251 
Cy_SysLib_SoftResetCM4(void)252 void Cy_SysLib_SoftResetCM4(void)
253 {
254     static uint32_t msg;
255 
256     msg = CY_IPC_DATA_FOR_CM4_SOFT_RESET;
257 
258     /* Tries to acquire the IPC structure and pass the arguments to SROM API.
259     *  SROM API parameters:
260     *   ipcPtr: IPC Structure 0 reserved for M0+ Secure Access.
261     *   notifyEvent_Intr: 1U - IPC Interrupt Structure 1 is used for Releasing IPC 0 (M0+ NMI Handler).
262     *   msgPtr: &msg - The address of SRAM with the API's parameters.
263     */
264     if(CY_IPC_DRV_SUCCESS != Cy_IPC_Drv_SendMsgPtr(Cy_IPC_Drv_GetIpcBaseAddress(CY_IPC_CHAN_SYSCALL_CM0), 1U, (void *) &msg))
265     {
266         CY_ASSERT(0U != 0U);
267     }
268 
269     while(Cy_IPC_Drv_IsLockAcquired(Cy_IPC_Drv_GetIpcBaseAddress(CY_IPC_CHAN_SYSCALL_CM0)))
270     {
271         /* Waits until SROM API runs the command (sent over the IPC channel) and releases the IPC0 structure. */
272     }
273 }
274 #endif /* CY_CPU_CORTEX_M0P || defined (CY_DOXYGEN) */
275 
276 
277 #if defined (CY_IP_M4CPUSS) && (!(defined (SRSS_HT_VARIANT) && (SRSS_HT_VARIANT == 1u)))
278 
Cy_SysLib_GetUniqueId(void)279 uint64_t Cy_SysLib_GetUniqueId(void)
280 {
281     uint32_t uniqueIdHi;
282     uint32_t uniqueIdLo;
283 
284     uniqueIdHi = ((uint32_t) SFLASH_DIE_YEAR        << (CY_UNIQUE_ID_DIE_YEAR_Pos  - CY_UNIQUE_ID_DIE_X_Pos)) |
285                  (((uint32_t)SFLASH_DIE_MINOR & 1U) << (CY_UNIQUE_ID_DIE_MINOR_Pos - CY_UNIQUE_ID_DIE_X_Pos)) |
286                  ((uint32_t) SFLASH_DIE_SORT        << (CY_UNIQUE_ID_DIE_SORT_Pos  - CY_UNIQUE_ID_DIE_X_Pos)) |
287                  ((uint32_t) SFLASH_DIE_Y           << (CY_UNIQUE_ID_DIE_Y_Pos     - CY_UNIQUE_ID_DIE_X_Pos)) |
288                  ((uint32_t) SFLASH_DIE_X);
289 
290     uniqueIdLo = ((uint32_t) SFLASH_DIE_WAFER       << CY_UNIQUE_ID_DIE_WAFER_Pos) |
291                  ((uint32_t) SFLASH_DIE_LOT(2U)     << CY_UNIQUE_ID_DIE_LOT_2_Pos) |
292                  ((uint32_t) SFLASH_DIE_LOT(1U)     << CY_UNIQUE_ID_DIE_LOT_1_Pos) |
293                  ((uint32_t) SFLASH_DIE_LOT(0U));
294 
295     return (((uint64_t) uniqueIdHi << CY_UNIQUE_ID_DIE_X_Pos) | uniqueIdLo);
296 }
297 #endif /* defined (CY_IP_M4CPUSS) && (!(defined (SRSS_HT_VARIANT) && (SRSS_HT_VARIANT == 1u))) */
298 #endif
299 
300 
301 #if ((defined (CY_IP_M33SYSCPUSS) && defined(CY_IP_MXEFUSE)) && defined (CY_UNIQE_DEVICE_ID_PRESENT_SFLASH))
302 #define CY_DIE_REG_EFUSE_OFFSET    0x74
303 #define CY_DIE_REG_COUNT           3U
304 
Cy_SysLib_GetUniqueId(void)305 uint64_t Cy_SysLib_GetUniqueId(void)
306 {
307 #if (!CY_UNIQE_DEVICE_ID_PRESENT_SFLASH)
308     uint32_t uniqueIdHi;
309     uint32_t uniqueIdLo;
310     uint32_t dieRead[3];
311     cy_en_efuse_status_t status = CY_EFUSE_ERR_UNC;
312 
313     if(Cy_EFUSE_IsEnabled(EFUSE))
314     {
315 
316         status = Cy_EFUSE_ReadWordArray(EFUSE, dieRead, CY_DIE_REG_EFUSE_OFFSET, CY_DIE_REG_COUNT);
317 
318         if(status == CY_EFUSE_SUCCESS)
319         {
320             uniqueIdHi = ((uint32_t)  _FLD2VAL(EFUSE_DATA_DIE_2_YEAR, dieRead[2])              << (CY_UNIQUE_ID_DIE_YEAR_Pos  - CY_UNIQUE_ID_DIE_X_Pos)) |
321                          (((uint32_t)_FLD2VAL(EFUSE_DATA_DIE_2_REVISION_ID, dieRead[2]) & 1U)  << (CY_UNIQUE_ID_DIE_MINOR_Pos - CY_UNIQUE_ID_DIE_X_Pos)) |
322                          ((uint32_t)  _FLD2VAL(EFUSE_DATA_DIE_1_SORT, dieRead[1])               << (CY_UNIQUE_ID_DIE_SORT_Pos  - CY_UNIQUE_ID_DIE_X_Pos)) |
323                          ((uint32_t)  _FLD2VAL(EFUSE_DATA_DIE_1_Y, dieRead[1])                  << (CY_UNIQUE_ID_DIE_Y_Pos     - CY_UNIQUE_ID_DIE_X_Pos)) |
324                          ((uint32_t)  _FLD2VAL(EFUSE_DATA_DIE_1_X, dieRead[1]));
325 
326             uniqueIdLo = (((uint32_t) _FLD2VAL(EFUSE_DATA_DIE_0_WAFER, dieRead[0])       << CY_UNIQUE_ID_DIE_WAFER_Pos) |
327                          ((uint32_t) _FLD2VAL(EFUSE_DATA_DIE_0_LOT, dieRead[0])));
328 
329             return (((uint64_t) uniqueIdHi << CY_UNIQUE_ID_DIE_X_Pos) | uniqueIdLo);
330         }
331         else
332         {
333             return 0UL;
334         }
335     }
336     else
337     {
338         return 0UL;
339     }
340 #else
341     uint32_t uniqueIdHi;
342     uint32_t uniqueIdLo;
343 
344     uniqueIdHi = ((uint32_t) SFLASH_DIE_YEAR         << (CY_UNIQUE_ID_DIE_YEAR_Pos  - CY_UNIQUE_ID_DIE_X_Pos)) |
345                  (((uint32_t)SFLASH_DIE_MINOR & 1U) << (CY_UNIQUE_ID_DIE_MINOR_Pos - CY_UNIQUE_ID_DIE_X_Pos)) |
346                  ((uint32_t) SFLASH_DIE_SORT         << (CY_UNIQUE_ID_DIE_SORT_Pos  - CY_UNIQUE_ID_DIE_X_Pos)) |
347                  ((uint32_t) SFLASH_DIE_Y            << (CY_UNIQUE_ID_DIE_Y_Pos    - CY_UNIQUE_ID_DIE_X_Pos)) |
348                  ((uint32_t) SFLASH_DIE_X);
349 
350     uniqueIdLo = ((uint32_t) SFLASH_DIE_WAFER        << CY_UNIQUE_ID_DIE_WAFER_Pos) |
351                  ((uint32_t) SFLASH_DIE_LOT(2U)      << CY_UNIQUE_ID_DIE_LOT_2_Pos) |
352                  ((uint32_t) SFLASH_DIE_LOT(1U)      << CY_UNIQUE_ID_DIE_LOT_1_Pos) |
353                  ((uint32_t) SFLASH_DIE_LOT(0U));
354 
355     return (((uint64_t) uniqueIdHi << CY_UNIQUE_ID_DIE_X_Pos) | uniqueIdLo);
356 #endif
357 }
358 #endif
359 
360 
361 #if defined(CY_INIT_CODECOPY_ENABLE)
362 CY_SECTION_INIT_CODECOPY_END
363 #endif
364 
365 #if (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED)
366 
367 
Cy_SysLib_FaultHandler(uint32_t const * faultStackAddr)368 void Cy_SysLib_FaultHandler(uint32_t const *faultStackAddr)
369 {
370     /* Stores general registers */
371     cy_faultFrame.r0  = faultStackAddr[CY_R0_Pos];
372     cy_faultFrame.r1  = faultStackAddr[CY_R1_Pos];
373     cy_faultFrame.r2  = faultStackAddr[CY_R2_Pos];
374     cy_faultFrame.r3  = faultStackAddr[CY_R3_Pos];
375     cy_faultFrame.r12 = faultStackAddr[CY_R12_Pos];
376     cy_faultFrame.lr  = faultStackAddr[CY_LR_Pos];
377     cy_faultFrame.pc  = faultStackAddr[CY_PC_Pos];
378     cy_faultFrame.psr = faultStackAddr[CY_PSR_Pos];
379 
380 #if (defined (CY_IP_M4CPUSS) || defined (CY_IP_M7CPUSS) || CY_IP_M33SYSCPUSS || CY_IP_M55APPCPUSS)
381 #if (CY_CPU_CORTEX_M4 || (defined (CY_CPU_CORTEX_M7) && CY_CPU_CORTEX_M7) || \
382      (defined (CY_CPU_CORTEX_M33) && CY_CPU_CORTEX_M33) || (defined (CY_CPU_CORTEX_M55) && CY_CPU_CORTEX_M55))
383     /* Stores the Configurable Fault Status Register state with the fault cause */
384     cy_faultFrame.cfsr.cfsrReg = SCB->CFSR;
385     /* Stores the Hard Fault Status Register */
386     cy_faultFrame.hfsr.hfsrReg = SCB->HFSR;
387     /* Stores the System Handler Control and State Register */
388     cy_faultFrame.shcsr.shcsrReg = SCB->SHCSR;
389     /* Store MemMange fault address */
390     cy_faultFrame.mmfar = SCB->MMFAR;
391     /* Store Bus fault address */
392     cy_faultFrame.bfar = SCB->BFAR;
393 
394 #if ((defined (__FPU_PRESENT) && (__FPU_PRESENT == 1U)) && \
395      (defined (__FPU_USED   ) && (__FPU_USED    == 1U)))
396     /* Checks cumulative exception bits for floating-point exceptions */
397     if(0U != (__get_FPSCR() & (CY_FPSCR_IXC_Msk | CY_FPSCR_IDC_Msk)))
398     {
399         cy_faultFrame.s0    = faultStackAddr[CY_S0_Pos];
400         cy_faultFrame.s1    = faultStackAddr[CY_S1_Pos];
401         cy_faultFrame.s2    = faultStackAddr[CY_S2_Pos];
402         cy_faultFrame.s3    = faultStackAddr[CY_S3_Pos];
403         cy_faultFrame.s4    = faultStackAddr[CY_S4_Pos];
404         cy_faultFrame.s5    = faultStackAddr[CY_S5_Pos];
405         cy_faultFrame.s6    = faultStackAddr[CY_S6_Pos];
406         cy_faultFrame.s7    = faultStackAddr[CY_S7_Pos];
407         cy_faultFrame.s8    = faultStackAddr[CY_S8_Pos];
408         cy_faultFrame.s9    = faultStackAddr[CY_S9_Pos];
409         cy_faultFrame.s10   = faultStackAddr[CY_S10_Pos];
410         cy_faultFrame.s11   = faultStackAddr[CY_S11_Pos];
411         cy_faultFrame.s12   = faultStackAddr[CY_S12_Pos];
412         cy_faultFrame.s13   = faultStackAddr[CY_S13_Pos];
413         cy_faultFrame.s14   = faultStackAddr[CY_S14_Pos];
414         cy_faultFrame.s15   = faultStackAddr[CY_S15_Pos];
415         cy_faultFrame.fpscr = faultStackAddr[CY_FPSCR_Pos];
416     }
417 #endif /* __FPU_PRESENT */
418 #endif /* CY_CPU_CORTEX_M4, CY_CPU_CORTEX_M7, CY_CPU_CORTEX_M33, CY_CPU_CORTEX_M55 */
419 #endif
420     Cy_SysLib_ProcessingFault();
421 }
422 
423 
Cy_SysLib_ProcessingFault(void)424 __WEAK void Cy_SysLib_ProcessingFault(void)
425 {
426     #if defined(__ARMCC_VERSION)
427         /* Assembly implementation of an infinite loop
428          * is used for the armcc compiler to preserve the call stack.
429          * Otherwise, the compiler destroys the call stack,
430          * because treats this API as a no return function.
431          */
432         Cy_SysLib_AsmInfiniteLoop();
433     #else
434         while(true) {}
435     #endif  /* (__ARMCC_VERSION) */
436 }
437 #endif /* (CY_ARM_FAULT_DEBUG == CY_ARM_FAULT_DEBUG_ENABLED) || defined(CY_DOXYGEN) */
438 
439 #if defined(CY_INIT_CODECOPY_ENABLE)
440 CY_SECTION_INIT_CODECOPY_BEGIN
441 #endif
442 
Cy_SysLib_SetWaitStates(bool ulpMode,uint32_t clkHfMHz)443 void Cy_SysLib_SetWaitStates(bool ulpMode, uint32_t clkHfMHz)
444 {
445 #if defined(CY_IP_M4CPUSS) || defined(CY_IP_M7CPUSS)
446 #if !((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE))) || defined(CY_IP_M7CPUSS)
447     uint32_t waitStates;
448     uint32_t freqMax;
449 
450 #if defined(CY_IP_M7CPUSS)
451     CY_ASSERT_L1(ulpMode == false);
452 #endif
453 
454 #if defined(CY_IP_M7CPUSS)
455     freqMax = CY_SYSLIB_LP_SLOW_WS_0_FREQ_MAX;
456 #else
457     freqMax = ulpMode ? CY_SYSLIB_ULP_SLOW_WS_0_FREQ_MAX : CY_SYSLIB_LP_SLOW_WS_0_FREQ_MAX;
458 #endif
459     waitStates = (clkHfMHz <= freqMax) ? 0UL : 1UL;
460 
461     /* ROM */
462     CPUSS_ROM_CTL = _CLR_SET_FLD32U(CPUSS_ROM_CTL, CPUSS_ROM_CTL_SLOW_WS, waitStates);
463     CPUSS_ROM_CTL = _CLR_SET_FLD32U(CPUSS_ROM_CTL, CPUSS_ROM_CTL_FAST_WS, 0UL);
464 
465     /* SRAM */
466     CPUSS_RAM0_CTL0 = _CLR_SET_FLD32U(CPUSS_RAM0_CTL0, CPUSS_RAM0_CTL0_SLOW_WS, waitStates);
467     CPUSS_RAM0_CTL0 = _CLR_SET_FLD32U(CPUSS_RAM0_CTL0, CPUSS_RAM0_CTL0_FAST_WS, 0UL);
468     #if defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL)
469         CPUSS_RAM1_CTL0 = _CLR_SET_FLD32U(CPUSS_RAM1_CTL0, CPUSS_RAM1_CTL0_SLOW_WS, waitStates);
470         CPUSS_RAM1_CTL0 = _CLR_SET_FLD32U(CPUSS_RAM1_CTL0, CPUSS_RAM1_CTL0_FAST_WS, 0UL);
471     #endif /* defined (RAMC1_PRESENT) && (RAMC1_PRESENT == 1UL) */
472     #if defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL)
473         CPUSS_RAM2_CTL0 = _CLR_SET_FLD32U(CPUSS_RAM2_CTL0, CPUSS_RAM2_CTL0_SLOW_WS, waitStates);
474         CPUSS_RAM2_CTL0 = _CLR_SET_FLD32U(CPUSS_RAM2_CTL0, CPUSS_RAM2_CTL0_FAST_WS, 0UL);
475     #endif /* defined (RAMC2_PRESENT) && (RAMC2_PRESENT == 1UL) */
476 
477     /* Flash */
478 #if defined(CY_IP_M7CPUSS)
479     if (clkHfMHz <= CY_SYSLIB_LP_SLOW_WS_0_FREQ_MAX)
480     {
481         waitStates = 0UL;
482     }
483     else
484     {
485         waitStates = 1UL;
486     }
487 
488     FLASHC_FLASH_CTL = _CLR_SET_FLD32U(FLASHC_FLASH_CTL, FLASHC_FLASH_CTL_WS, waitStates);
489 
490 #else
491     if (ulpMode)
492     {
493         waitStates =  (clkHfMHz <= CY_SYSLIB_FLASH_ULP_WS_0_FREQ_MAX) ? 0UL :
494                      ((clkHfMHz <= CY_SYSLIB_FLASH_ULP_WS_1_FREQ_MAX) ? 1UL : 2UL);
495     }
496     else
497     {
498         waitStates =  (clkHfMHz <= cy_device->flashCtlMainWs0Freq) ? 0UL :
499                      ((clkHfMHz <= cy_device->flashCtlMainWs1Freq) ? 1UL :
500                      ((clkHfMHz <= cy_device->flashCtlMainWs2Freq) ? 2UL :
501                      ((clkHfMHz <= cy_device->flashCtlMainWs3Freq) ? 3UL :
502                      ((clkHfMHz <= cy_device->flashCtlMainWs4Freq) ? 4UL : 5UL))));
503     }
504 
505     FLASHC_FLASH_CTL = _CLR_SET_FLD32U(FLASHC_FLASH_CTL, FLASHC_FLASH_CTL_MAIN_WS, waitStates);
506 #endif
507 
508 #else
509     (void) ulpMode;
510     (void) clkHfMHz;
511 #endif /* !((CY_CPU_CORTEX_M4) && (defined(CY_DEVICE_SECURE))) || defined(CY_IP_M7CPUSS) */
512 #endif /* defined(CY_IP_M4CPUSS) || defined(CY_IP_M7CPUSS) */
513 
514     (void) ulpMode;
515     (void) clkHfMHz;
516 }
517 
518 
Cy_SysLib_GetDeviceRevision(void)519 uint8_t Cy_SysLib_GetDeviceRevision(void)
520 {
521 #if defined (CY_IP_M4CPUSS) && !(defined (SRSS_HT_VARIANT) && (SRSS_HT_VARIANT == 1u))
522     return ((SFLASH_SI_REVISION_ID == 0UL) ? CY_SYSLIB_DEVICE_REV_0A : SFLASH_SI_REVISION_ID);
523 #elif defined(CY_IP_M33SYSCPUSS) || defined(CY_IP_M7CPUSS) || (defined (SRSS_HT_VARIANT) && (SRSS_HT_VARIANT == 1u))
524     return ((uint8_t)((_FLD2VAL(CPUSS_PRODUCT_ID_MINOR_REV, CPUSS_PRODUCT_ID) << 4U) | _FLD2VAL(CPUSS_PRODUCT_ID_MAJOR_REV, CPUSS_PRODUCT_ID)));
525 #else
526     return 0;
527 #endif
528 }
529 
Cy_SysLib_GetDevice(void)530 uint16_t Cy_SysLib_GetDevice(void)
531 {
532 #if defined (CY_IP_M4CPUSS) && !(defined (SRSS_HT_VARIANT) && (SRSS_HT_VARIANT == 1u))
533     return ((SFLASH_FAMILY_ID == 0UL) ? CY_SYSLIB_DEVICE_PSOC6ABLE2 : SFLASH_FAMILY_ID);
534 #elif defined(CY_IP_M33SYSCPUSS)
535     return CPUSS_FAMILYID;
536 #else
537     return 0;
538 #endif
539 }
540 
541 #if  defined (CY_IP_MXS40SSRSS) || defined (CY_IP_MXS22SRSS)
Cy_Syslib_SetWarmBootEntryPoint(uint32_t * entryPoint,bool enable)542 void Cy_Syslib_SetWarmBootEntryPoint(uint32_t *entryPoint, bool enable)
543 {
544     *(uint32_t *)CY_SYSPM_BOOTROM_ENTRYPOINT_ADDR = (uint32_t)entryPoint | (enable ? CY_SYSPM_BOOTROM_DSRAM_DBG_ENABLE_MASK : 0UL) ;
545 }
546 
Cy_SysLib_IsDSRAMWarmBootEntry(void)547 bool Cy_SysLib_IsDSRAMWarmBootEntry(void)
548 {
549     return cy_WakeupFromWarmBootStatus;
550 }
551 
Cy_SysLib_ClearDSRAMWarmBootEntryStatus(void)552 void Cy_SysLib_ClearDSRAMWarmBootEntryStatus(void)
553 {
554     cy_WakeupFromWarmBootStatus = false;
555 }
556 #endif
557 
558 
559 #if defined(CY_IP_MXS22SRSS)
Cy_SysLib_GetDeviceLCS(void)560 cy_en_syslib_lcs_mode_t Cy_SysLib_GetDeviceLCS(void)
561 {
562     cy_en_syslib_lcs_mode_t lcsMode;
563 
564     lcsMode = (cy_en_syslib_lcs_mode_t)CY_GET_REG32(SRSS_DECODED_LCS_DATA);
565 
566     switch (lcsMode)
567     {
568         case CY_SYSLIB_LCS_VIRGIN:
569         case CY_SYSLIB_LCS_SORT:
570         case CY_SYSLIB_LCS_PROVISIONED:
571         case CY_SYSLIB_LCS_NORMAL_PROVISIONED:
572         case CY_SYSLIB_LCS_NORMAL:
573         case CY_SYSLIB_LCS_SECURE:
574         case CY_SYSLIB_LCS_NORMAL_NO_SECURE:
575         case CY_SYSLIB_LCS_RMA:
576         break;
577         default:
578             lcsMode = CY_SYSLIB_LCS_CORRUPTED;
579         break;
580     }
581 
582     return lcsMode;
583 }
584 #endif
585 
586 #if defined(CY_INIT_CODECOPY_ENABLE)
587 CY_SECTION_INIT_CODECOPY_END
588 #endif
589 
590 #endif /* CY_IP_M33SYSCPUSS, CY_IP_M4CPUSS */
591 
592 /* [] END OF FILE */
593