diff options
| author | Bernard Xiong <[email protected]> | 2013-03-26 09:08:25 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2013-03-26 09:08:25 +0800 |
| commit | 8e6a534fa3411d86ca61c1291fde39d0b893094e (patch) | |
| tree | 50fec5f77c0fd63b112952118a7a81056a981cb6 /libcpu | |
| parent | e9c86a175016568fed2e45fd6f2ffa4c7c77bffb (diff) | |
fix compiling issue in Jz47XX
Diffstat (limited to 'libcpu')
| -rw-r--r-- | libcpu/mips/jz47xx/interrupt.c | 35 |
1 files changed, 23 insertions, 12 deletions
diff --git a/libcpu/mips/jz47xx/interrupt.c b/libcpu/mips/jz47xx/interrupt.c index 7d531cbd71..f9ada3254a 100644 --- a/libcpu/mips/jz47xx/interrupt.c +++ b/libcpu/mips/jz47xx/interrupt.c @@ -11,7 +11,7 @@ * Date Author Notes * 2010-07-09 Bernard first version */ -#include <rtthread.h> +#include <rthw.h> #include "jz47xx.h" #define JZ47XX_MAX_INTR 32 @@ -20,7 +20,7 @@ extern rt_uint32_t rt_interrupt_nest; rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; rt_uint32_t rt_thread_switch_interrupt_flag; -static rt_isr_handler_t irq_handle_table[JZ47XX_MAX_INTR]; +static struct rt_irq_desc irq_handle_table[JZ47XX_MAX_INTR]; /** * @addtogroup Jz47xx @@ -39,9 +39,10 @@ void rt_hw_interrupt_init() { rt_int32_t index; + rt_memset(irq_handle_table, 0x00, sizeof(irq_handle_table)); for (index = 0; index < JZ47XX_MAX_INTR; index ++) { - irq_handle_table[index] = (rt_isr_handler_t)rt_hw_interrupt_handler; + irq_handle_table[index].handler = (rt_isr_handler_t)rt_hw_interrupt_handler; } /* init interrupt nest, and context in thread sp */ @@ -73,18 +74,28 @@ void rt_hw_interrupt_umask(int vector) /** * This function will install a interrupt service routine to a interrupt. * @param vector the interrupt number - * @param new_handler the interrupt service routine to be installed - * @param old_handler the old interrupt service routine + * @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 new_handler, rt_isr_handler_t *old_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 >= 0 && vector < JZ47XX_MAX_INTR) { - if (old_handler != RT_NULL) - *old_handler = irq_handle_table[vector]; - if (new_handler != RT_NULL) - irq_handle_table[vector] = (rt_isr_handler_t)new_handler; + old_handler = irq_handle_table[vector].handler; + + rt_strncpy(irq_handle_table[vector].name, name, RT_NAME_MAX); + irq_handle_table[vector].handler = handler; + irq_handle_table[vector].param = param; } + + return old_handler; } void rt_interrupt_dispatch(void *ptreg) @@ -102,10 +113,10 @@ void rt_interrupt_dispatch(void *ptreg) if ((pending & (1<<i))) { pending &= ~(1<<i); - irq_func = irq_handle_table[i]; + irq_func = irq_handle_table[i].handler; /* do interrupt */ - (*irq_func)(i); + (*irq_func)(i, irq_handle_table[i].param); /* ack interrupt */ INTC_IPR = (1 << i); |
