diff --git a/bsp/jz47xx/board.c b/bsp/jz47xx/board.c index 439534ec8ccab7925181388b12bc044175881c3e..b2f1ba0092bd2ea2f2d0efc9006469581bad3238 100644 --- a/bsp/jz47xx/board.c +++ b/bsp/jz47xx/board.c @@ -27,7 +27,7 @@ /** * This is the timer interrupt service routine. */ -void rt_hw_timer_handler() +void rt_hw_timer_handler(int vector, void* param) { /* increase a OS tick */ rt_tick_increase(); @@ -52,33 +52,6 @@ void rt_hw_timer_init() /* clear counter */ OST_CNT = 0; -#if 0 - switch (RTC_DIV) - { - case 1: - val = OST_TCSR_PRESCALE1; - break; - case 4: - val = OST_TCSR_PRESCALE4; - break; - case 16: - val = OST_TCSR_PRESCALE16; - break; - case 64: - val = OST_TCSR_PRESCALE64; - break; - case 256: - val = OST_TCSR_PRESCALE256; - break; - case 1024: - val = OST_TCSR_PRESCALE1024; - break; - default: - val = OST_TCSR_PRESCALE4; - break; - } -#endif - #ifdef RTC_SRC_EXTAL OST_CSR = (val | OST_TCSR_EXT_EN); #else @@ -89,7 +62,7 @@ void rt_hw_timer_init() TCU_TMCR = TCU_TMCR_OSTMCL; TCU_TESR = TCU_TESR_OSTST; - rt_hw_interrupt_install(IRQ_TCU0, rt_hw_timer_handler, RT_NULL); + rt_hw_interrupt_install(IRQ_TCU0, rt_hw_timer_handler, RT_NULL, "tick"); rt_hw_interrupt_umask (IRQ_TCU0); } diff --git a/bsp/jz47xx/rtconfig.h b/bsp/jz47xx/rtconfig.h index d1457c486b63f878acd4637efb7ea6b54428098f..47f7beae7a12fb83abadd7f714389d8bc9f6eaec 100644 --- a/bsp/jz47xx/rtconfig.h +++ b/bsp/jz47xx/rtconfig.h @@ -18,6 +18,7 @@ /* Thread Debug */ #define RT_DEBUG #define RT_USING_OVERFLOW_CHECK +#define RT_USING_INTERRUPT_INFO /* Using Hook */ #define RT_USING_HOOK diff --git a/bsp/jz47xx/uart.c b/bsp/jz47xx/uart.c index eaa0a4cf72cf416d17d9515080ef980143ffb31b..309a89d63f5704c6feb2f81ac5f860add5aa6906 100644 --- a/bsp/jz47xx/uart.c +++ b/bsp/jz47xx/uart.c @@ -129,10 +129,10 @@ struct rt_uart_jz rt_uint8_t rx_buffer[RT_UART_RX_BUFFER_SIZE]; }uart_device; -static void rt_uart_irqhandler(int irqno) +static void rt_uart_irqhandler(int vector, void* param) { rt_ubase_t level, isr; - struct rt_uart_jz* uart = &uart_device; + struct rt_uart_jz* uart = param; /* read interrupt status and clear it */ isr = UART_ISR(uart->hw_base); @@ -212,7 +212,7 @@ static rt_err_t rt_uart_open(rt_device_t dev, rt_uint16_t oflag) UART_IER(uart->hw_base) |= (UARTIER_RIE | UARTIER_RTIE); /* install interrupt */ - rt_hw_interrupt_install(uart->irq, rt_uart_irqhandler, RT_NULL); + rt_hw_interrupt_install(uart->irq, rt_uart_irqhandler, uart, "uart"); rt_hw_interrupt_umask(uart->irq); } return RT_EOK; diff --git a/libcpu/mips/jz47xx/interrupt.c b/libcpu/mips/jz47xx/interrupt.c index 7d531cbd719c3683c5fdfbdeecd59b54a81f52d1..f9ada3254a74ace9d5302fc61ce0462b34b62f76 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 +#include #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<