18 #if !defined(INTERRUPT_MANAGER_H)
19 #define INTERRUPT_MANAGER_H
55 #if FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER
60 INTERRUPT_MANAGER_TARGET_SELF = -2,
61 INTERRUPT_MANAGER_TARGET_OTHERS = -1,
62 INTERRUPT_MANAGER_TARGET_NONE = 0,
63 INTERRUPT_MANAGER_TARGET_CP0 = 1,
64 INTERRUPT_MANAGER_TARGET_CP1 = 2,
65 INTERRUPT_MANAGER_TARGET_CP0_CP1 = 3
66 } interrupt_manager_cpu_targets_t;
83 #if defined(__cplusplus)
109 const isr_t newHandler,
110 isr_t*
const oldHandler);
171 if ((int32_t)irqNumber < 0)
173 uint32_t intVectorId = ((uint32_t)(irqNumber) & 0xFU);
174 uint32_t regId = intVectorId / 4U;
176 volatile uint8_t * shpr_reg_ptr = ((regId == 1U) ? (
volatile uint8_t *)&
S32_SCB->SHPR1 : ((regId == 2U) ? (
volatile uint8_t *)&
S32_SCB->SHPR2 : (
volatile uint8_t *)&
S32_SCB->SHPR3));
178 shpr_reg_ptr[intVectorId % 4U] = (uint8_t)(((((uint32_t)priority) << shift)) & 0xffUL);
183 S32_NVIC->IP[(uint32_t)(irqNumber)] = (uint8_t)(((((uint32_t)priority) << shift)) & 0xFFUL);
202 uint8_t priority = 0U;
205 if ((int32_t)irqNumber < 0)
207 uint32_t intVectorId = ((uint32_t)(irqNumber) & 0xFU);
208 uint32_t regId = intVectorId / 4U;
211 volatile const uint8_t * shpr_reg_ptr = ((regId == 1U) ? (
volatile uint8_t *)&
S32_SCB->SHPR1 : ((regId == 2U) ? (
volatile uint8_t *)&
S32_SCB->SHPR2 : (
volatile uint8_t *)&
S32_SCB->SHPR3));
213 priority = (uint8_t)(shpr_reg_ptr[intVectorId % 4U] >> (shift));
218 priority = (uint8_t)(
S32_NVIC->IP[(uint32_t)(irqNumber)] >> shift);
239 #if FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER
241 if ((FEATURE_DIRECTED_CPU_INT_MIN <= irqNumber) && (irqNumber <= FEATURE_DIRECTED_CPU_INT_MAX))
244 switch (
MSCM->CPXNUM)
247 MSCM->IRCP0IR |= (1UL << ((uint32_t)irqNumber - (uint32_t)FEATURE_DIRECTED_CPU_INT_MIN));
250 MSCM->IRCP1IR |= (1UL << ((uint32_t)irqNumber - (uint32_t)FEATURE_DIRECTED_CPU_INT_MIN));
258 S32_NVIC->ICPR[(uint32_t)(irqNumber) >> 5U] = (uint32_t)(1UL << ((uint32_t)(irqNumber) & (uint32_t)0x1FU));
276 S32_NVIC->ISPR[(uint32_t)(irqNumber) >> 5U] = (uint32_t)(1UL << ((uint32_t)(irqNumber) & (uint32_t)0x1FU));
295 #if FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER
297 if ((FEATURE_DIRECTED_CPU_INT_MIN <= irqNumber) && (irqNumber <= FEATURE_DIRECTED_CPU_INT_MAX))
299 return (((((
MSCM->CPXNUM != 0UL) ?
MSCM->IRCP1IR :
MSCM->IRCP0IR) &
300 (1UL << ((uint32_t)irqNumber - (uint32_t)FEATURE_DIRECTED_CPU_INT_MIN))) != 0UL) ? 1UL : 0UL);
305 return ((uint32_t)(((
S32_NVIC->ISPR[(((uint32_t)irqNumber) >> 5UL)] & (1UL << (((uint32_t)irqNumber) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
324 return ((uint32_t)(((
S32_NVIC->IABR[(((uint32_t)irqNumber) >> 5UL)] & (1UL << (((uint32_t)irqNumber) & 0x1FUL))) != 0UL) ? 1UL : 0UL));
327 #if FEATURE_MSCM_HAS_CPU_INTERRUPT_ROUTER
338 static inline void INT_SYS_GenerateDirectedCpuInterrupt(
IRQn_Type irqNumber, interrupt_manager_cpu_targets_t cpu_target)
341 DEV_ASSERT(FEATURE_DIRECTED_CPU_INT_MIN <= irqNumber);
342 DEV_ASSERT(irqNumber <= FEATURE_DIRECTED_CPU_INT_MAX);
344 uint32_t reg_val = MSCM_IRCPGIR_INTID((uint32_t)irqNumber - (uint32_t)FEATURE_DIRECTED_CPU_INT_MIN);
348 case INTERRUPT_MANAGER_TARGET_SELF:
349 reg_val |= MSCM_IRCPGIR_TLF(2);
351 case INTERRUPT_MANAGER_TARGET_OTHERS:
352 reg_val |= MSCM_IRCPGIR_TLF(1);
354 case INTERRUPT_MANAGER_TARGET_NONE:
355 case INTERRUPT_MANAGER_TARGET_CP0:
356 case INTERRUPT_MANAGER_TARGET_CP1:
357 case INTERRUPT_MANAGER_TARGET_CP0_CP1:
358 reg_val |= (MSCM_IRCPGIR_TLF(0) | MSCM_IRCPGIR_CPUTL(cpu_target));
366 MSCM->IRCPGIR = reg_val;
373 #if defined(__cplusplus)
static uint32_t INT_SYS_GetActive(IRQn_Type irqNumber)
Get Active Interrupt.
static void INT_SYS_ClearPending(IRQn_Type irqNumber)
Clear Pending Interrupt.
static void INT_SYS_SetPending(IRQn_Type irqNumber)
Set Pending Interrupt.
void DefaultISR(void)
Default ISR.
IRQn_Type
Defines the Interrupt Numbers definitions.
void INT_SYS_DisableIRQ(IRQn_Type irqNumber)
Disables an interrupt for a given IRQ number.
void INT_SYS_DisableIRQGlobal(void)
Disable system interrupt.
static uint8_t INT_SYS_GetPriority(IRQn_Type irqNumber)
Get Interrupt Priority.
#define FEATURE_INTERRUPT_IRQ_MAX
static void INT_SYS_SetPriority(IRQn_Type irqNumber, uint8_t priority)
Set Interrupt Priority.
void INT_SYS_EnableIRQGlobal(void)
Enables system interrupt.
static uint32_t INT_SYS_GetPending(IRQn_Type irqNumber)
Get Pending Interrupt.
#define FEATURE_NVIC_PRIO_BITS
void INT_SYS_EnableIRQ(IRQn_Type irqNumber)
Enables an interrupt for a given IRQ number.
void(* isr_t)(void)
Interrupt handler type.
void INT_SYS_InstallHandler(IRQn_Type irqNumber, const isr_t newHandler, isr_t *const oldHandler)
Installs an interrupt handler routine for a given IRQ number.