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
288279void 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