From 155b37000d648447da71ba3fddd7b31d6051340d Mon Sep 17 00:00:00 2001 From: CYFS <2805686936@qq.com> Date: Fri, 28 Aug 2026 17:50:18 +0800 Subject: [PATCH] [libcpu] Fix RZ/N2L interrupt dispatch --- libcpu/arm/cortex-r52/trap.c | 52 +++++++++++++++++------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/libcpu/arm/cortex-r52/trap.c b/libcpu/arm/cortex-r52/trap.c index e5c217cb73eb..bdfba716ddec 100644 --- a/libcpu/arm/cortex-r52/trap.c +++ b/libcpu/arm/cortex-r52/trap.c @@ -12,7 +12,6 @@ #include #include #include -//#include #include "interrupt.h" @@ -257,16 +256,8 @@ void rt_hw_trap_irq(void) } #ifdef SOC_SERIES_R9A07G0 - extern fsp_vector_t g_vector_table[BSP_ICU_VECTOR_MAX_ENTRIES]; - bsp_common_interrupt_handler((uint32_t)ir); - if (ir < MAX_HANDLERS) - { - /* get interrupt service routine */ - isr_table[ir].handler = (rt_isr_handler_t)g_vector_table[ir]; - isr_table[ir].param = RT_NULL; - } -#endif +#else /* get interrupt service routine */ isr_func = isr_table[ir].handler; @@ -280,7 +271,7 @@ void rt_hw_trap_irq(void) /* turn to interrupt service routine */ isr_func(ir, param); } - +#endif /* end of interrupt */ rt_hw_interrupt_ack(int_ack); } @@ -288,31 +279,38 @@ void rt_hw_trap_irq(void) void rt_hw_trap_fiq(void) { void *param; + int int_ack; int ir; - rt_isr_handler_t isr_func; + volatile rt_isr_handler_t isr_func; extern struct rt_irq_desc isr_table[]; - ir = rt_hw_interrupt_get_irq(); - -#ifdef SOC_SERIES_R9A07G0 - extern fsp_vector_t g_vector_table[BSP_ICU_VECTOR_MAX_ENTRIES]; + int_ack = rt_hw_interrupt_get_irq(); - bsp_common_interrupt_handler((uint32_t)ir); - if (ir < MAX_HANDLERS) + ir = int_ack & GIC_ACK_INTID_MASK; + if (ir == 1023) { - /* get interrupt service routine */ - isr_table[ir].handler = (rt_isr_handler_t)g_vector_table[ir]; - isr_table[ir].param = RT_NULL; + /* Spurious interrupt */ + return; } -#endif + +#ifdef SOC_SERIES_R9A07G0 + bsp_common_interrupt_handler((uint32_t)ir); +#else /* get interrupt service routine */ isr_func = isr_table[ir].handler; - param = isr_table[ir].param; - - /* turn to interrupt service routine */ - isr_func(ir, param); +#ifdef RT_USING_INTERRUPT_INFO + isr_table[ir].counter++; +#endif + if (isr_func) + { + /* Interrupt for myself. */ + param = isr_table[ir].param; + /* turn to interrupt service routine */ + isr_func(ir, param); + } +#endif /* end of interrupt */ - rt_hw_interrupt_ack(ir); + rt_hw_interrupt_ack(int_ack); }