diff --git a/include/rthw.h b/include/rthw.h index 808639c951308fcedf261e61de92ea3d5b51ba57..817b9f40f2a44436149449a0d17508fa82186891 100644 --- a/include/rthw.h +++ b/include/rthw.h @@ -41,9 +41,10 @@ rt_uint8_t *rt_hw_stack_init(void *entry, void rt_hw_interrupt_init(void); void rt_hw_interrupt_mask(int vector); void rt_hw_interrupt_umask(int vector); -void rt_hw_interrupt_install(int vector, +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, - void *param, char *name); + void *param, + char *name); void rt_hw_interrupt_handle(int vector); rt_base_t rt_hw_interrupt_disable(void); diff --git a/include/rtthread.h b/include/rtthread.h index 53111b8465b73e3bd8be755c8aa59ac36ab05a1d..dbe48b492e710a8ce8e58f9e35ab385b6502981a 100644 --- a/include/rtthread.h +++ b/include/rtthread.h @@ -427,6 +427,14 @@ void rt_module_unload_sethook(void (*hook)(rt_module_t module)); */ typedef void (*rt_isr_handler_t)(int vector, void *param); +struct rt_irq_desc { + char irq_name[RT_NAME_MAX]; + rt_isr_handler_t isr_handle; + void *param; + rt_uint32_t interrupt_cnt; +}; + + /* * rt_interrupt_enter and rt_interrupt_leave only can be called by BSP */ diff --git a/libcpu/arm/at91sam926x/interrupt.c b/libcpu/arm/at91sam926x/interrupt.c index 206444b3aae2f918390d05ccc72fa78938f68236..012ecc66aaac42fdf6dcddc601d4ef589cd0c1a1 100755 --- a/libcpu/arm/at91sam926x/interrupt.c +++ b/libcpu/arm/at91sam926x/interrupt.c @@ -14,7 +14,6 @@ #include #include "at91sam926x.h" -#include "interrupt.h" #define MAX_HANDLERS (AIC_IRQS + PIN_IRQS) @@ -308,17 +307,26 @@ void rt_hw_interrupt_umask(int irq) * @param handler the interrupt service routine to be installed * @param param the interrupt service function parameter * @param name the interrupt name + * @return old handler */ -void rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, +rt_isr_handler_t rt_hw_interrupt_install(int vector, rt_isr_handler_t handler, void *param, char *name) { + rt_isr_handler_t old_handler = RT_NULL; + if(vector < MAX_HANDLERS) { - rt_snprintf(irq_desc[vector].irq_name, RT_NAME_MAX - 1, "%s", name); - irq_desc[vector].isr_handle = (rt_isr_handler_t)handler; - irq_desc[vector].param = param; - irq_desc[vector].interrupt_cnt = 0; + old_handler = irq_desc[vector].isr_handle; + if (handler != RT_NULL) + { + rt_snprintf(irq_desc[vector].irq_name, RT_NAME_MAX - 1, "%s", name); + irq_desc[vector].isr_handle = (rt_isr_handler_t)handler; + irq_desc[vector].param = param; + irq_desc[vector].interrupt_cnt = 0; + } } + + return old_handler; } /*@}*/ diff --git a/libcpu/arm/at91sam926x/interrupt.h b/libcpu/arm/at91sam926x/interrupt.h deleted file mode 100644 index 582f279f1a6a7978fb8f1eb0e886b4e408fac5d2..0000000000000000000000000000000000000000 --- a/libcpu/arm/at91sam926x/interrupt.h +++ /dev/null @@ -1,11 +0,0 @@ -#ifndef __INTERRUPT_H__ -#define __INTERRUPT_H__ - -struct rt_irq_desc { - char irq_name[RT_NAME_MAX]; - rt_isr_handler_t isr_handle; - void *param; - rt_uint32_t interrupt_cnt; -}; - -#endif \ No newline at end of file diff --git a/libcpu/arm/at91sam926x/trap.c b/libcpu/arm/at91sam926x/trap.c index de53fe61af4ee5ff2a58bd6efd988b37abe6eceb..841c8b68137743aef256e3da94bb864e27947fab 100755 --- a/libcpu/arm/at91sam926x/trap.c +++ b/libcpu/arm/at91sam926x/trap.c @@ -16,7 +16,6 @@ #include #include "at91sam926x.h" -#include "interrupt.h" /** * @addtogroup AT91SAM926X