1 /***************************************************************************//**
2 * \file  cy_sysint.c
3 * \version 1.120
4 *
5 * \brief
6 * Provides an API implementation of the SysInt driver.
7 *
8 ********************************************************************************
9 * \copyright
10 * Copyright (c) (2016-2022), Cypress Semiconductor Corporation (an Infineon company) or
11 * an affiliate of Cypress Semiconductor Corporation.
12 * SPDX-License-Identifier: Apache-2.0
13 *
14 * Licensed under the Apache License, Version 2.0 (the "License");
15 * you may not use this file except in compliance with the License.
16 * You may obtain a copy of the License at
17 *
18 *     http://www.apache.org/licenses/LICENSE-2.0
19 *
20 * Unless required by applicable law or agreed to in writing, software
21 * distributed under the License is distributed on an "AS IS" BASIS,
22 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
23 * See the License for the specific language governing permissions and
24 * limitations under the License.
25 *******************************************************************************/
26 
27 #include "cy_device.h"
28 
29 #if defined (CY_IP_M4CPUSS) || defined (CY_IP_M7CPUSS)
30 
31 #include "cy_sysint.h"
32 
33 CY_MISRA_DEVIATE_BLOCK_START('MISRA C-2012 Rule 8.4', 1, 'Intentionally, the prototype and definition are in the same place.')
34 #if defined (CY_IP_M7CPUSS) || (defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS_VERSION == 2u) && (CPUSS_SYSTEM_IRQ_PRESENT)) || defined (CY_DOXYGEN)
35 __WEAK cy_israddress * Cy_SysInt_SystemIrqUserTableRamPointer = NULL;
36 #endif /* defined (CY_IP_M7CPUSS) || (defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS_VERSION == 2u) && (CPUSS_SYSTEM_IRQ_PRESENT)) || defined (CY_DOXYGEN) */
37 CY_MISRA_BLOCK_END('MISRA C-2012 Rule 8.4')
38 
39 CY_MISRA_FP_BLOCK_START('MISRA C-2012 Rule 8.3', 1, 'Only one prototype will be picked for compilation')
40 #if (((CY_CPU_CORTEX_M0P) || defined (CY_IP_M7CPUSS) || defined (CY_DOXYGEN)) && !defined(CY_IP_M0SECCPUSS))
Cy_SysInt_SetNmiSource(cy_en_sysint_nmi_t nmiNum,cy_en_intr_t intrSrc)41 void Cy_SysInt_SetNmiSource(cy_en_sysint_nmi_t nmiNum, cy_en_intr_t intrSrc)
42 #else
43 void Cy_SysInt_SetNmiSource(cy_en_sysint_nmi_t nmiNum, IRQn_Type intrSrc)
44 #endif
45 {
46     CY_ASSERT_L3(CY_SYSINT_IS_NMI_NUM_VALID(nmiNum));
47 
48 #if (defined(CY_IP_M4CPUSS) && (CY_CPU_CORTEX_M0P))
49     CY_ASSERT_L1(CY_SYSINT_IS_PC_0);
50 #endif
51 
52 #if defined (CY_IP_M4CPUSS)
53     if (CY_CPUSS_V1)
54     {
55         nmiNum = CY_SYSINT_NMI1; /* For CPUSS_ver1 the NMI number is 1 */
56     }
57 #endif
58 
59     #if (CY_CPU_CORTEX_M0P)
60         CPUSS_CM0_NMI_CTL((uint32_t)nmiNum - 1UL) = (uint32_t)intrSrc;
61     #elif (CY_CPU_CORTEX_M4)
62         CPUSS_CM4_NMI_CTL((uint32_t)nmiNum - 1UL) = (uint32_t)intrSrc;
63     #else
64         if(0UL != CY_IS_CM7_CORE_0)
65         {
66             CPUSS_CM7_0_NMI_CTL((uint32_t)nmiNum - 1UL) = (uint32_t)intrSrc;
67         }
68         else
69         {
70             CPUSS_CM7_1_NMI_CTL((uint32_t)nmiNum - 1UL) = (uint32_t)intrSrc;
71         }
72     #endif
73 }
74 
75 #if (((CY_CPU_CORTEX_M0P) || defined(CY_IP_M7CPUSS) || defined (CY_DOXYGEN)) && !defined(CY_IP_M0SECCPUSS))
Cy_SysInt_GetNmiSource(cy_en_sysint_nmi_t nmiNum)76 cy_en_intr_t Cy_SysInt_GetNmiSource(cy_en_sysint_nmi_t nmiNum)
77 #else
78 IRQn_Type Cy_SysInt_GetNmiSource(cy_en_sysint_nmi_t nmiNum)
79 #endif
80 {
81     CY_ASSERT_L3(CY_SYSINT_IS_NMI_NUM_VALID(nmiNum));
82 
83 #if (defined(CY_IP_M4CPUSS) && (CY_CPU_CORTEX_M0P))
84     if (CY_CPUSS_V1)
85     {
86         nmiNum = CY_SYSINT_NMI1; /* For CPUSS_ver1 the NMI number is 1 */
87     }
88 #endif
89 
90 #if (CY_CPU_CORTEX_M0P)
91     return ((cy_en_intr_t)(CPUSS_CM0_NMI_CTL((uint32_t)nmiNum - 1UL)));
92 #elif (CY_CPU_CORTEX_M4)
93     return ((IRQn_Type)(CPUSS_CM4_NMI_CTL((uint32_t)nmiNum - 1UL)));
94 #else
95     if(0UL != CY_IS_CM7_CORE_0)
96     {
97         return ((cy_en_intr_t)(CPUSS_CM7_0_NMI_CTL((uint32_t)nmiNum - 1UL)));
98     }
99     else
100     {
101         return ((cy_en_intr_t)(CPUSS_CM7_1_NMI_CTL((uint32_t)nmiNum - 1UL)));
102     }
103 #endif
104 }
105 CY_MISRA_BLOCK_END('MISRA C-2012 Rule 8.3')
106 
Cy_SysInt_Init(const cy_stc_sysint_t * config,cy_israddress userIsr)107 cy_en_sysint_status_t Cy_SysInt_Init(const cy_stc_sysint_t* config, cy_israddress userIsr)
108 {
109     cy_en_sysint_status_t status = CY_SYSINT_SUCCESS;
110 
111     if(NULL != config)
112     {
113         CY_ASSERT_L3(CY_SYSINT_IS_PRIORITY_VALID(config->intrPriority));
114 
115         #if defined (CY_IP_M4CPUSS)
116             #if (CY_CPU_CORTEX_M0P)
117                 (void)userIsr; /* Suppress a compiler warning about unused variables */
118                 if (config->intrSrc > SysTick_IRQn)
119                 {
120                     Cy_SysInt_SetInterruptSource(config->intrSrc, config->cm0pSrc);
121                     NVIC_SetPriority((IRQn_Type)(config->intrSrc), config->intrPriority);
122 
123 #if (defined (CPUSS_SYSTEM_IRQ_PRESENT) && (CPUSS_SYSTEM_IRQ_PRESENT == 1u))
124                     (void)Cy_SysInt_SetSystemIrqVector(((cy_en_intr_t)config->cm0pSrc), userIsr);
125 #else
126                     /* Set the new vector only if it was moved to __ramVectors */
127                     if (SCB->VTOR == (uint32_t)&__ramVectors)
128                     {
129                         (void)Cy_SysInt_SetVector(config->intrSrc, userIsr);
130                     }
131 #endif
132                 }
133                 else
134                 {
135                     status = CY_SYSINT_BAD_PARAM;
136 
137                     NVIC_SetPriority((IRQn_Type)(config->cm0pSrc), config->intrPriority);
138                     /* Set the new vector only if it was moved to __ramVectors */
139                     if (SCB->VTOR == (uint32_t)&__ramVectors)
140                     {
141                         (void)Cy_SysInt_SetVector(config->intrSrc, userIsr);
142                     }
143                 }
144             #elif (defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS_VERSION == 2) && (CPUSS_SYSTEM_IRQ_PRESENT))
145                CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to IRQn_Type enum.');
146                IRQn_Type IRQn = (IRQn_Type)((uint32_t)config->intrSrc >> CY_SYSINT_INTRSRC_MUXIRQ_SHIFT) ; /* Fetch bit 12-15 to get CPU IRQ value */
147                CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to cy_en_intr_t enum.');
148                cy_en_intr_t devIntrSrc = (cy_en_intr_t)((uint32_t)config->intrSrc & CY_SYSINT_INTRSRC_MASK); /* Fetch bit 0-11 to get system interrupt value */
149                CY_ASSERT_L3(CY_SYSINT_IS_PRIORITY_VALID(config->intrPriority));
150                if (IRQn > SysTick_IRQn && IRQn < Internal0_IRQn)
151                {
152                    Cy_SysInt_SetInterruptSource(IRQn, devIntrSrc);
153 
154                    NVIC_SetPriority(IRQn, config->intrPriority);
155 
156                    (void)Cy_SysInt_SetSystemIrqVector(devIntrSrc, userIsr);
157                }
158                else
159                {
160                    status = CY_SYSINT_BAD_PARAM;
161 
162                    /* Set the new vector only if it was moved to __ramVectors */
163                    if (SCB->VTOR == (uint32_t)&__ramVectors)
164                    {
165                        (void)Cy_SysInt_SetVector(config->intrSrc, userIsr);
166                    }
167                }
168            #else
169                {
170 
171                    NVIC_SetPriority(config->intrSrc, config->intrPriority);
172 
173                    /* Set the new vector only if it was moved to __ramVectors */
174                    if (SCB->VTOR == (uint32_t)&__ramVectors)
175                    {
176                        (void)Cy_SysInt_SetVector(config->intrSrc, userIsr);
177                     }
178               }
179            #endif /* (CY_CPU_CORTEX_M0P) */
180         #endif /* defined (CY_IP_M4CPUSS) */
181 
182         #if defined (CY_IP_M7CPUSS)
183             CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to IRQn_Type enum.');
184             IRQn_Type IRQn = (IRQn_Type)((uint32_t)config->intrSrc >> CY_SYSINT_INTRSRC_MUXIRQ_SHIFT) ; /* Fetch bit 16-31 to get CPU IRQ value */
185             CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to cy_en_intr_t enum.');
186             cy_en_intr_t devIntrSrc = (cy_en_intr_t)((uint32_t)config->intrSrc & CY_SYSINT_INTRSRC_MASK); /* Fetch bit 0-15 to get system interrupt value */
187             CY_ASSERT_L3(CY_SYSINT_IS_PRIORITY_VALID(config->intrPriority));
188         #if (CY_CPU_CORTEX_M0P)
189             if (IRQn > NvicMux1_IRQn && IRQn < Internal0_IRQn) /* CPU IRQ0 and IRQ1 for CM0+ are used by ROM and not meant for user. */
190         #else
191             if (IRQn > SysTick_IRQn && IRQn < Internal0_IRQn)
192         #endif
193             {
194                 Cy_SysInt_SetInterruptSource(IRQn, devIntrSrc);
195             }
196             else
197             {
198                 status = CY_SYSINT_BAD_PARAM;
199             }
200 
201             NVIC_SetPriority(IRQn, config->intrPriority);
202 
203 #if (defined (CPUSS_SYSTEM_IRQ_PRESENT) && (CPUSS_SYSTEM_IRQ_PRESENT == 1u))
204             (void)Cy_SysInt_SetSystemIrqVector(devIntrSrc, userIsr);
205 #endif /* (defined (CPUSS_SYSTEM_IRQ_PRESENT) && (CPUSS_SYSTEM_IRQ_PRESENT == 1u)) */
206         #endif
207     }
208     else
209     {
210         status = CY_SYSINT_BAD_PARAM;
211     }
212 
213     return(status);
214 }
215 
216 #if (((CY_CPU_CORTEX_M0P) || defined (CY_IP_M7CPUSS) || (defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS_VERSION == 2) && (CPUSS_SYSTEM_IRQ_PRESENT)) || defined (CY_DOXYGEN)) && !defined(CY_IP_M0SECCPUSS))
Cy_SysInt_SetInterruptSource(IRQn_Type IRQn,cy_en_intr_t devIntrSrc)217 void Cy_SysInt_SetInterruptSource(IRQn_Type IRQn, cy_en_intr_t devIntrSrc)
218 {
219 #if defined (CY_IP_M4CPUSS)
220     if (CY_CPUSS_V1)
221     {
222         uint32_t regPos = ((uint32_t)IRQn >> CY_SYSINT_CM0P_MUX_SHIFT);
223         if(0UL == (regPos & (uint32_t)~CY_SYSINT_MUX_REG_MSK))
224         {
225             uint32_t bitfield_Pos = (uint32_t)((uint32_t)IRQn - (uint32_t)(regPos << CY_SYSINT_CM0P_MUX_SHIFT)) << CY_SYSINT_CM0P_MUX_SCALE;
226             uint32_t bitfield_Msk = (uint32_t)(CY_SYSINT_CM0P_MUX_MASK << bitfield_Pos);
227 
228             CY_REG32_CLR_SET(CPUSS_CM0_INT_CTL[regPos], bitfield, devIntrSrc);
229         }
230     }
231     else /* CPUSS_V2 */
232     {
233         CY_ASSERT_L1(CY_CPUSS_DISCONNECTED_IRQN != devIntrSrc); /* Disconnection feature doesn't work for CPUSS_V2 */
234         #if (CY_CPU_CORTEX_M0P)
235             CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc] = _VAL2FLD(CPUSS_V2_CM0_SYSTEM_INT_CTL_CPU_INT_IDX, IRQn)
236                                                     | CPUSS_V2_CM0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
237         #else
238             CPUSS_CM4_SYSTEM_INT_CTL[devIntrSrc] = _VAL2FLD(CPUSS_V2_CM4_SYSTEM_INT_CTL_CPU_INT_IDX, IRQn)
239                                                                 | CPUSS_V2_CM4_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
240         #endif
241     }
242 #endif
243 
244 #if defined (CY_IP_M7CPUSS)
245     CY_ASSERT_L1(CY_CPUSS_DISCONNECTED_IRQN != devIntrSrc);
246     #if (CY_CPU_CORTEX_M0P)
247         CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc] = _VAL2FLD(CPUSS_CM0_SYSTEM_INT_CTL_CM0_CPU_INT_IDX, IRQn)
248                                                         | CPUSS_CM0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
249     #else
250         if (0UL != CY_IS_CM7_CORE_0)
251         {
252             CPUSS_CM7_0_SYSTEM_INT_CTL[devIntrSrc] = _VAL2FLD(CPUSS_CM7_0_SYSTEM_INT_CTL_CPU_INT_IDX, IRQn)
253                                                             | CPUSS_CM7_0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
254         }
255         else
256         {
257             CPUSS_CM7_1_SYSTEM_INT_CTL[devIntrSrc] = _VAL2FLD(CPUSS_CM7_1_SYSTEM_INT_CTL_CPU_INT_IDX, IRQn)
258                                                             | CPUSS_CM7_1_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
259         }
260     #endif
261 #endif
262 }
263 
264 #if (defined(CY_IP_M4CPUSS) && (CY_CPU_CORTEX_M0P)) || defined (CY_DOXYGEN)
Cy_SysInt_DisconnectInterruptSource(IRQn_Type IRQn,cy_en_intr_t devIntrSrc)265 void Cy_SysInt_DisconnectInterruptSource(IRQn_Type IRQn, cy_en_intr_t devIntrSrc)
266 {
267     if (CY_CPUSS_V1)
268     {
269         Cy_SysInt_SetInterruptSource(IRQn, CY_CPUSS_DISCONNECTED_IRQN);
270     }
271     else /* CPUSS_V2 */
272     {
273         CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc] &= (uint32_t)~ CPUSS_V2_CM0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
274     }
275 }
276 
277 
Cy_SysInt_GetInterruptSource(IRQn_Type IRQn)278 cy_en_intr_t Cy_SysInt_GetInterruptSource(IRQn_Type IRQn)
279 {
280     uint32_t tempReg = CY_CPUSS_NOT_CONNECTED_IRQN;
281 
282     if (CY_CPUSS_V1)
283     {
284         uint32_t regPos  = ((uint32_t)IRQn >> CY_SYSINT_CM0P_MUX_SHIFT);
285         if(0UL == (regPos & (uint32_t)~CY_SYSINT_MUX_REG_MSK))
286         {
287             uint32_t bitfield_Pos  = ((uint32_t)IRQn - (regPos <<  CY_SYSINT_CM0P_MUX_SHIFT)) <<  CY_SYSINT_CM0P_MUX_SCALE;
288             uint32_t bitfield_Msk = (uint32_t)(CY_SYSINT_CM0P_MUX_MASK << bitfield_Pos);
289 
290             tempReg = _FLD2VAL(bitfield, CPUSS_CM0_INT_CTL[regPos]);
291         }
292     }
293 
294     return ((cy_en_intr_t)tempReg);
295 }
296 #endif
297 
Cy_SysInt_GetNvicConnection(cy_en_intr_t devIntrSrc)298 IRQn_Type Cy_SysInt_GetNvicConnection(cy_en_intr_t devIntrSrc)
299 {
300     uint32_t tempReg = CY_CPUSS_NOT_CONNECTED_IRQN;
301 
302 #if defined (CY_IP_M4CPUSS)
303     #if (CY_CPU_CORTEX_M0P)
304     if (CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_V2_CM0_SYSTEM_INT_CTL_CPU_INT_VALID, CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc]))
305     {
306         tempReg = _FLD2VAL(CPUSS_V2_CM0_SYSTEM_INT_CTL_CPU_INT_IDX, CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc]);
307     }
308     #else
309     if ((!CY_CPUSS_V1) && (CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_V2_CM4_SYSTEM_INT_CTL_CPU_INT_VALID, CPUSS_CM4_SYSTEM_INT_CTL[devIntrSrc])))
310     {
311         tempReg = _FLD2VAL(CPUSS_V2_CM4_SYSTEM_INT_CTL_CPU_INT_IDX, CPUSS_CM4_SYSTEM_INT_CTL[devIntrSrc]);
312     }
313     #endif /* (CY_CPU_CORTEX_M0P) */
314 #endif
315 
316 #if defined (CY_IP_M7CPUSS)
317     #if (CY_CPU_CORTEX_M0P)
318         if ((CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_CM0_SYSTEM_INT_CTL_CPU_INT_VALID, CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc])))
319         {
320             tempReg = _FLD2VAL(CPUSS_CM0_SYSTEM_INT_CTL_CM0_CPU_INT_IDX, CPUSS_CM0_SYSTEM_INT_CTL[devIntrSrc]);
321         }
322     #else
323         if (CY_IS_CM7_CORE_0 && (CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_CM7_0_SYSTEM_INT_CTL_CPU_INT_VALID, CPUSS_CM7_0_SYSTEM_INT_CTL[devIntrSrc])))
324         {
325             tempReg = _FLD2VAL(CPUSS_CM7_0_SYSTEM_INT_CTL_CPU_INT_IDX, CPUSS_CM7_0_SYSTEM_INT_CTL[devIntrSrc]);
326         }
327         else if ((CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_CM7_1_SYSTEM_INT_CTL_CPU_INT_VALID, CPUSS_CM7_1_SYSTEM_INT_CTL[devIntrSrc])))
328         {
329             tempReg = _FLD2VAL(CPUSS_CM7_1_SYSTEM_INT_CTL_CPU_INT_IDX, CPUSS_CM7_1_SYSTEM_INT_CTL[devIntrSrc]);
330         }
331         else
332         {
333             /* No active core */
334         }
335     #endif
336 #endif
337     return ((IRQn_Type)tempReg);
338 }
339 
340 
Cy_SysInt_GetInterruptActive(IRQn_Type IRQn)341 cy_en_intr_t Cy_SysInt_GetInterruptActive(IRQn_Type IRQn)
342 {
343     uint32_t tempReg = CY_CPUSS_NOT_CONNECTED_IRQN;
344     uint32_t locIdx = (uint32_t)IRQn & CY_SYSINT_INT_STATUS_MSK;
345 
346 #if defined (CY_IP_M4CPUSS)
347     #if (CY_CPU_CORTEX_M0P)
348     if(CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_V2_CM0_INT0_STATUS_SYSTEM_INT_VALID, CPUSS_CM0_INT_STATUS[locIdx]))
349     {
350         tempReg = _FLD2VAL(CPUSS_V2_CM0_INT0_STATUS_SYSTEM_INT_IDX, CPUSS_CM0_INT_STATUS[locIdx]);
351     }
352     #else
353     if (!CY_CPUSS_V1)
354     {
355         if(CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_V2_CM4_INT0_STATUS_SYSTEM_INT_VALID, CPUSS_CM4_INT_STATUS[locIdx]))
356         {
357             tempReg = _FLD2VAL(CPUSS_V2_CM4_INT0_STATUS_SYSTEM_INT_IDX, CPUSS_CM4_INT_STATUS[locIdx]);
358         }
359     }
360     #endif /* (CY_CPU_CORTEX_M0P) */
361 #endif
362 
363 #if defined (CY_IP_M7CPUSS)
364     #if (CY_CPU_CORTEX_M0P)
365         if(CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_CM0_INT0_STATUS_SYSTEM_INT_VALID, CPUSS_CM0_INT_STATUS_BASE[locIdx]))
366         {
367             tempReg = _FLD2VAL(CPUSS_CM0_INT0_STATUS_SYSTEM_INT_IDX, CPUSS_CM0_INT_STATUS_BASE[locIdx]);
368         }
369     #else
370         if((CY_IS_CM7_CORE_0) && (CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_CM7_0_INT_STATUS_SYSTEM_INT_VALID, CPUSS_CM7_0_INT_STATUS[locIdx])))
371         {
372             tempReg = _FLD2VAL(CPUSS_CM7_0_INT_STATUS_SYSTEM_INT_IDX, CPUSS_CM7_0_INT_STATUS[locIdx]);
373         }
374         else if(CY_SYSINT_ENABLE == _FLD2VAL(CPUSS_CM7_1_INT_STATUS_SYSTEM_INT_VALID, CPUSS_CM7_1_INT_STATUS[locIdx]))
375         {
376              tempReg = _FLD2VAL(CPUSS_CM7_1_INT_STATUS_SYSTEM_INT_IDX, CPUSS_CM7_1_INT_STATUS[locIdx]);
377         }
378         else
379         {
380             /* No active core */
381         }
382     #endif
383 #endif
384     return ((cy_en_intr_t)tempReg);
385 }
386 
387 #endif
388 
389 
Cy_SysInt_SetVector(IRQn_Type IRQn,cy_israddress userIsr)390 cy_israddress Cy_SysInt_SetVector(IRQn_Type IRQn, cy_israddress userIsr)
391 {
392     cy_israddress prevIsr;
393 
394     /* Set the new vector only if it was moved to __ramVectors */
395     if (SCB->VTOR == (uint32_t)&__ramVectors)
396     {
397         CY_ASSERT_L1(CY_SYSINT_IS_VECTOR_VALID(userIsr));
398 
399         prevIsr = __ramVectors[CY_INT_IRQ_BASE + (uint32_t)IRQn];
400         __ramVectors[CY_INT_IRQ_BASE + (uint32_t)IRQn] = userIsr;
401 
402         #if defined (CY_IP_M7CPUSS)
403             #if (CY_CPU_CORTEX_M7)
404                 // Ensure that above change in the vector table is cleaned from Data Cache,
405                 // and Instruction Cache is invalidated, so that CPU fetches the correct address
406                 SCB_CleanDCache_by_Addr((uint32_t*)&__ramVectors[CY_INT_IRQ_BASE + (uint32_t)IRQn], 4);
407                 SCB_InvalidateICache();
408             #endif
409         #endif
410     }
411     else
412     {
413         prevIsr = __Vectors[CY_INT_IRQ_BASE + (uint32_t)IRQn];
414     }
415 
416     return (prevIsr);
417 }
418 
419 
Cy_SysInt_GetVector(IRQn_Type IRQn)420 cy_israddress Cy_SysInt_GetVector(IRQn_Type IRQn)
421 {
422     cy_israddress currIsr;
423 
424     /* Return the SRAM ISR address only if it was moved to __ramVectors */
425     if (SCB->VTOR == (uint32_t)&__ramVectors)
426     {
427         currIsr = __ramVectors[CY_INT_IRQ_BASE + (uint32_t)IRQn];
428     }
429     else
430     {
431         currIsr = __Vectors[CY_INT_IRQ_BASE + (uint32_t)IRQn];
432     }
433 
434     return (currIsr);
435 }
436 
437 #if (defined(CY_IP_M4CPUSS) && (!CY_CPU_CORTEX_M0P))
Cy_SysInt_SoftwareTrig(IRQn_Type IRQn)438 void Cy_SysInt_SoftwareTrig(IRQn_Type IRQn)
439 {
440     NVIC->STIR = (uint32_t)IRQn & CY_SYSINT_STIR_MASK;
441 }
442 #endif
443 
444 
445 /* These functions are compatible with M7 and M4 CPUSSv2 that also have the CPUSS_SYSTEM_IRQ_PRESENT. */
446 #if defined (CY_IP_M7CPUSS) || (defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS_VERSION == 2u) && (CPUSS_SYSTEM_IRQ_PRESENT)) || defined (CY_DOXYGEN)
Cy_SysInt_InitExtIRQ(const cy_stc_sysint_t * config,cy_israddress userIsr)447 cy_en_sysint_status_t Cy_SysInt_InitExtIRQ(const cy_stc_sysint_t* config, cy_israddress userIsr)
448 {
449     cy_en_sysint_status_t status = CY_SYSINT_SUCCESS;
450 
451     if(NULL != config)
452     {
453         CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to IRQn_Type enum.');
454         IRQn_Type IRQn = (IRQn_Type)((uint32_t) config->intrSrc >> CY_SYSINT_INTRSRC_MUXIRQ_SHIFT);
455         CY_MISRA_DEVIATE_LINE('MISRA C-2012 Rule 10.8','Intentional typecast to cy_en_intr_t enum.');
456         cy_en_intr_t devIntrSrc = (cy_en_intr_t)((uint32_t) config->intrSrc & CY_SYSINT_INTRSRC_MASK);
457         CY_ASSERT_L3(CY_SYSINT_IS_PRIORITY_VALID(config->intrPriority));
458 
459     #if (CY_CPU_CORTEX_M0P)
460         if (IRQn > NvicMux1_IRQn && IRQn < Internal0_IRQn)
461     #else
462         if (IRQn > SysTick_IRQn && IRQn < Internal0_IRQn)
463     #endif
464         {
465             Cy_SysInt_SetInterruptSource(IRQn, devIntrSrc);
466         }
467         else
468         {
469             status = CY_SYSINT_BAD_PARAM;
470         }
471         NVIC_SetPriority(IRQn, config->intrPriority);
472 
473         /* Set the new vector only if it was moved to __ramVectors */
474         if (SCB->VTOR == (uint32_t)&__ramVectors)
475         {
476             (void)Cy_SysInt_SetVector(IRQn, userIsr);
477         }
478 
479     }
480     else
481     {
482         status = CY_SYSINT_BAD_PARAM;
483     }
484 
485     return(status);
486 }
487 
488 
Cy_SysInt_InitIntIRQ(const cy_stc_sysint_t * config,cy_israddress userIsr)489 cy_en_sysint_status_t Cy_SysInt_InitIntIRQ(const cy_stc_sysint_t* config, cy_israddress userIsr)
490 {
491     cy_en_sysint_status_t status = CY_SYSINT_SUCCESS;
492 
493     if(NULL != config)
494     {
495         CY_ASSERT_L3(CY_SYSINT_IS_PRIORITY_VALID(config->intrPriority));
496 
497         if (((uint32_t)config->intrSrc >= (uint32_t)Internal0_IRQn) && ((uint32_t)config->intrSrc <= (uint32_t)Internal7_IRQn))
498         {
499 
500             NVIC_SetPriority((IRQn_Type)config->intrSrc, config->intrPriority);
501 
502             /* Set the new vector only if it was moved to __ramVectors */
503             if (SCB->VTOR == (uint32_t)&__ramVectors)
504             {
505                 (void)Cy_SysInt_SetVector((IRQn_Type)config->intrSrc, userIsr);
506             }
507         }
508         else
509         {
510             status = CY_SYSINT_BAD_PARAM;
511         }
512 
513     }
514     else
515     {
516         status = CY_SYSINT_BAD_PARAM;
517     }
518 
519     return(status);
520 }
521 
Cy_SysInt_SetSystemIrqVector(cy_en_intr_t sysIntSrc,cy_israddress userIsr)522 void  Cy_SysInt_SetSystemIrqVector(cy_en_intr_t sysIntSrc, cy_israddress userIsr)
523 {
524     if (Cy_SysInt_SystemIrqUserTableRamPointer != NULL)
525     {
526         Cy_SysInt_SystemIrqUserTableRamPointer[sysIntSrc] = userIsr;
527     }
528 }
529 
530 
Cy_SysInt_GetSystemIrqVector(cy_en_intr_t sysIntSrc)531 cy_israddress  Cy_SysInt_GetSystemIrqVector(cy_en_intr_t sysIntSrc)
532 {
533     cy_israddress userIsr = NULL;
534     if (Cy_SysInt_SystemIrqUserTableRamPointer != NULL)
535     {
536         userIsr =  Cy_SysInt_SystemIrqUserTableRamPointer[sysIntSrc];
537     }
538 
539     return userIsr;
540 }
541 
542 CY_MISRA_DEVIATE_BLOCK_START('MISRA C-2012 Rule 14.3', 4, 'Valid Control expression conditions.')
Cy_SysInt_EnableSystemInt(cy_en_intr_t sysIntSrc)543 void Cy_SysInt_EnableSystemInt(cy_en_intr_t sysIntSrc)
544 {
545     if (CY_CPU_CORTEX_M0P)
546     {
547         CPUSS_CM0_SYSTEM_INT_CTL[sysIntSrc] |= CPUSS_CM0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
548     }
549     #if defined (CY_IP_M7CPUSS)
550     else if (CY_IS_CM7_CORE_0)
551     {
552         CPUSS_CM7_0_SYSTEM_INT_CTL[sysIntSrc] |= CPUSS_CM7_0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
553     }
554     else
555     {
556         CPUSS_CM7_1_SYSTEM_INT_CTL[sysIntSrc] |= CPUSS_CM7_1_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
557     }
558     #elif (CY_IP_M4CPUSS)
559     else
560     {
561         CPUSS_CM4_SYSTEM_INT_CTL[sysIntSrc] |= CPUSS_V2_CM4_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
562     }
563     #else
564         #error This version of the sysint driver only supports CM4 and CM7 devices.
565     #endif
566 }
567 
568 
Cy_SysInt_DisableSystemInt(cy_en_intr_t sysIntSrc)569 void Cy_SysInt_DisableSystemInt(cy_en_intr_t sysIntSrc)
570 {
571     if (CY_CPU_CORTEX_M0P)
572     {
573         CPUSS->CM0_SYSTEM_INT_CTL[sysIntSrc] &= (uint32_t) ~CPUSS_CM0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
574     }
575     #if defined (CY_IP_M7CPUSS)
576     else if (CY_IS_CM7_CORE_0)
577     {
578         CPUSS->CM7_0_SYSTEM_INT_CTL[sysIntSrc] &= (uint32_t) ~CPUSS_CM7_0_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
579     }
580     else
581     {
582         CPUSS->CM7_1_SYSTEM_INT_CTL[sysIntSrc] &= (uint32_t) ~CPUSS_CM7_1_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
583     }
584     #elif (CY_IP_M4CPUSS)
585     else
586     {
587         CPUSS->CM4_SYSTEM_INT_CTL[sysIntSrc] &= (uint32_t) ~CPUSS_CM4_SYSTEM_INT_CTL_CPU_INT_VALID_Msk;
588     }
589     #else
590         #error This version of the sysint driver only supports CM4 and CM7 devices.
591     #endif
592 }
593 CY_MISRA_BLOCK_END('MISRA C-2012 Rule 14.3')
594 
595 #endif  /* defined (CY_IP_M7CPUSS) || (defined (CY_IP_M4CPUSS) && (CY_IP_M4CPUSS_VERSION == 2u) && (CPUSS_SYSTEM_IRQ_PRESENT)) || defined (CY_DOXYGEN) */
596 
597 #endif  /* defined (CY_IP_M4CPUSS) || defined (CY_IP_M7CPUSS) */
598 
599 /* [] END OF FILE */
600