diff options
| author | aozima <[email protected]> | 2013-03-23 17:03:09 +0800 |
|---|---|---|
| committer | aozima <[email protected]> | 2013-03-31 17:32:04 +0800 |
| commit | 29a3ae43680f50123dbe045605093b2c0fe9616e (patch) | |
| tree | 2513a85ccd563bd8e5ba84e0b8641687bd74eb18 /libcpu | |
| parent | fbc1b05dd8c07fb95d9d02a476a604252dbc7ac3 (diff) | |
update sep4020: Modify the interrupt interface implementations.
Diffstat (limited to 'libcpu')
| -rw-r--r-- | libcpu/arm/sep4020/interrupt.c | 86 | ||||
| -rw-r--r-- | libcpu/arm/sep4020/trap.c | 44 |
2 files changed, 76 insertions, 54 deletions
diff --git a/libcpu/arm/sep4020/interrupt.c b/libcpu/arm/sep4020/interrupt.c index 8ed22dc816..88130c1a33 100644 --- a/libcpu/arm/sep4020/interrupt.c +++ b/libcpu/arm/sep4020/interrupt.c @@ -10,9 +10,11 @@ * Change Logs: * Date Author Notes * 2006-03-13 Bernard first version + * 2013-03-29 aozima Modify the interrupt interface implementations. */ #include <rtthread.h> +#include <rthw.h> #include <sep4020.h> #define MAX_HANDLERS 32 @@ -20,7 +22,7 @@ extern rt_uint32_t rt_interrupt_nest; /* exception and interrupt handler table */ -rt_isr_handler_t isr_table[MAX_HANDLERS]; +struct rt_irq_desc isr_table[MAX_HANDLERS]; rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; rt_uint32_t rt_thread_switch_interrupt_flag; @@ -38,44 +40,45 @@ rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector) /** * This function will initialize hardware interrupt */ -void rt_hw_interrupt_init() +void rt_hw_interrupt_init(void) { - register rt_uint32_t idx; + register rt_uint32_t idx; - /*Make sure all intc registers in proper state*/ + /*Make sure all intc registers in proper state*/ - /*mask all the irq*/ - *(RP)(INTC_IMR) = 0xFFFFFFFF; + /*mask all the irq*/ + *(RP)(INTC_IMR) = 0xFFFFFFFF; - /*enable all the irq*/ - *(RP)(INTC_IER) = 0XFFFFFFFF; + /*enable all the irq*/ + *(RP)(INTC_IER) = 0XFFFFFFFF; - /*Dont use any forced irq*/ - *(RP)(INTC_IFR) = 0x0; + /*Dont use any forced irq*/ + *(RP)(INTC_IFR) = 0x0; - /*Disable all the fiq*/ - *(RP)(INTC_FIER) = 0x0; + /*Disable all the fiq*/ + *(RP)(INTC_FIER) = 0x0; - /*Mask all the fiq*/ - *(RP)(INTC_FIMR) = 0x0F; + /*Mask all the fiq*/ + *(RP)(INTC_FIMR) = 0x0F; - /*Dont use forced fiq*/ - *(RP)(INTC_FIFR) = 0x0; + /*Dont use forced fiq*/ + *(RP)(INTC_FIFR) = 0x0; - /*Intrrupt priority register*/ - *(RP)(INTC_IPLR) = 0x0; + /*Intrrupt priority register*/ + *(RP)(INTC_IPLR) = 0x0; - /* init exceptions table */ - for(idx=0; idx < MAX_HANDLERS; idx++) - { - isr_table[idx] = (rt_isr_handler_t)rt_hw_interrupt_handle; - } + /* init exceptions table */ + rt_memset(isr_table, 0x00, sizeof(isr_table)); + for(idx=0; idx < MAX_HANDLERS; idx++) + { + isr_table[idx].handler = rt_hw_interrupt_handle; + } - /* init interrupt nest, and context in thread sp */ - rt_interrupt_nest = 0; - rt_interrupt_from_thread = 0; - rt_interrupt_to_thread = 0; - rt_thread_switch_interrupt_flag = 0; + /* init interrupt nest, and context in thread sp */ + rt_interrupt_nest = 0; + rt_interrupt_from_thread = 0; + rt_interrupt_to_thread = 0; + rt_thread_switch_interrupt_flag = 0; } /** @@ -108,15 +111,26 @@ void rt_hw_interrupt_umask(rt_uint32_t vector) * @param new_handler the interrupt service routine to be installed * @param old_handler the old interrupt service routine */ -void rt_hw_interrupt_install(rt_uint32_t 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) { - if(vector < MAX_HANDLERS) - { - if (*old_handler != RT_NULL) - *old_handler = isr_table[vector]; - if (new_handler != RT_NULL) - isr_table[vector] = new_handler; - } + rt_isr_handler_t old_handler = RT_NULL; + + if(vector < MAX_HANDLERS) + { + old_handler = isr_table[vector].handler; + + if (handler != RT_NULL) + { +#ifdef RT_USING_INTERRUPT_INFO + rt_strncpy(isr_table[vector].name, name, RT_NAME_MAX); +#endif /* RT_USING_INTERRUPT_INFO */ + isr_table[vector].handler = handler; + isr_table[vector].param = param; + } + } + + return old_handler; } /*@}*/ diff --git a/libcpu/arm/sep4020/trap.c b/libcpu/arm/sep4020/trap.c index e7a6e369f9..33da0d9e98 100644 --- a/libcpu/arm/sep4020/trap.c +++ b/libcpu/arm/sep4020/trap.c @@ -12,6 +12,7 @@ * 2006-03-13 Bernard first version * 2006-05-27 Bernard add skyeye support * 2007-11-19 Yi.Qiu fix rt_hw_trap_irq function + * 2013-03-29 aozima Modify the interrupt interface implementations. */ #include <rtthread.h> @@ -131,31 +132,38 @@ void rt_hw_trap_resv(struct rt_hw_register *regs) rt_hw_cpu_shutdown(); } -extern rt_isr_handler_t isr_table[]; +extern struct rt_irq_desc isr_table[]; -void rt_hw_trap_irq() +void rt_hw_trap_irq(void) { - unsigned long intstat; - rt_uint32_t i = 0; - rt_isr_handler_t isr_func; + unsigned long intstat; + rt_uint32_t irq = 0; + rt_isr_handler_t isr_func; + void *param; - /*Get the final intrrupt source*/ - intstat = *(RP)(INTC_IFSR);; + /*Get the final intrrupt source*/ + intstat = *(RP)(INTC_IFSR);; - /*Shift to get the intrrupt number*/ - while(intstat != 1) - { - intstat = intstat >> 1; - i++; - } - /* get interrupt service routine */ - isr_func = isr_table[i]; + /*Shift to get the intrrupt number*/ + while(intstat != 1) + { + intstat = intstat >> 1; + irq++; + } - /* turn to interrupt service routine */ - isr_func(i); + /* get interrupt service routine */ + isr_func = isr_table[irq].isr_handle; + param = isr_table[irq].param; + + /* turn to interrupt service routine */ + isr_func(irq, param); + +#ifdef RT_USING_INTERRUPT_INFO + isr_table[irq].counter++; +#endif /* RT_USING_INTERRUPT_INFO */ } -void rt_hw_trap_fiq() +void rt_hw_trap_fiq(void) { rt_kprintf("fast interrupt request\n"); } |
