Skip to content

Commit 155b370

Browse files
committed
[libcpu] Fix RZ/N2L interrupt dispatch
1 parent bf38ee2 commit 155b370

1 file changed

Lines changed: 25 additions & 27 deletions

File tree

libcpu/arm/cortex-r52/trap.c

Lines changed: 25 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,6 @@
1212
#include <gicv3.h>
1313
#include <rtthread.h>
1414
#include <rthw.h>
15-
//#include <board.h>
1615

1716
#include "interrupt.h"
1817

@@ -257,16 +256,8 @@ void rt_hw_trap_irq(void)
257256
}
258257

259258
#ifdef SOC_SERIES_R9A07G0
260-
extern fsp_vector_t g_vector_table[BSP_ICU_VECTOR_MAX_ENTRIES];
261-
262259
bsp_common_interrupt_handler((uint32_t)ir);
263-
if (ir < MAX_HANDLERS)
264-
{
265-
/* get interrupt service routine */
266-
isr_table[ir].handler = (rt_isr_handler_t)g_vector_table[ir];
267-
isr_table[ir].param = RT_NULL;
268-
}
269-
#endif
260+
#else
270261
/* get interrupt service routine */
271262
isr_func = isr_table[ir].handler;
272263

@@ -280,39 +271,46 @@ void rt_hw_trap_irq(void)
280271
/* turn to interrupt service routine */
281272
isr_func(ir, param);
282273
}
283-
274+
#endif
284275
/* end of interrupt */
285276
rt_hw_interrupt_ack(int_ack);
286277
}
287278

288279
void rt_hw_trap_fiq(void)
289280
{
290281
void *param;
282+
int int_ack;
291283
int ir;
292-
rt_isr_handler_t isr_func;
284+
volatile rt_isr_handler_t isr_func;
293285
extern struct rt_irq_desc isr_table[];
294286

295-
ir = rt_hw_interrupt_get_irq();
296-
297-
#ifdef SOC_SERIES_R9A07G0
298-
extern fsp_vector_t g_vector_table[BSP_ICU_VECTOR_MAX_ENTRIES];
287+
int_ack = rt_hw_interrupt_get_irq();
299288

300-
bsp_common_interrupt_handler((uint32_t)ir);
301-
if (ir < MAX_HANDLERS)
289+
ir = int_ack & GIC_ACK_INTID_MASK;
290+
if (ir == 1023)
302291
{
303-
/* get interrupt service routine */
304-
isr_table[ir].handler = (rt_isr_handler_t)g_vector_table[ir];
305-
isr_table[ir].param = RT_NULL;
292+
/* Spurious interrupt */
293+
return;
306294
}
307-
#endif
295+
296+
#ifdef SOC_SERIES_R9A07G0
297+
bsp_common_interrupt_handler((uint32_t)ir);
298+
#else
308299
/* get interrupt service routine */
309300
isr_func = isr_table[ir].handler;
310-
param = isr_table[ir].param;
311-
312-
/* turn to interrupt service routine */
313-
isr_func(ir, param);
314301

302+
#ifdef RT_USING_INTERRUPT_INFO
303+
isr_table[ir].counter++;
304+
#endif
305+
if (isr_func)
306+
{
307+
/* Interrupt for myself. */
308+
param = isr_table[ir].param;
309+
/* turn to interrupt service routine */
310+
isr_func(ir, param);
311+
}
312+
#endif
315313
/* end of interrupt */
316-
rt_hw_interrupt_ack(ir);
314+
rt_hw_interrupt_ack(int_ack);
317315
}
318316

0 commit comments

Comments
 (0)