From 29a3ae43680f50123dbe045605093b2c0fe9616e Mon Sep 17 00:00:00 2001 From: aozima Date: Sat, 23 Mar 2013 17:03:09 +0800 Subject: [PATCH] update sep4020: Modify the interrupt interface implementations. --- bsp/mini4020/drivers/board.c | 11 +++-- bsp/mini4020/drivers/dm9161.c | 6 +-- bsp/mini4020/rtconfig.h | 1 + bsp/mini4020/template.Uv2 | 4 +- libcpu/arm/sep4020/interrupt.c | 86 ++++++++++++++++++++-------------- libcpu/arm/sep4020/trap.c | 44 ++++++++++------- 6 files changed, 88 insertions(+), 64 deletions(-) diff --git a/bsp/mini4020/drivers/board.c b/bsp/mini4020/drivers/board.c index b8341b8054..72b75d4846 100644 --- a/bsp/mini4020/drivers/board.c +++ b/bsp/mini4020/drivers/board.c @@ -34,7 +34,7 @@ struct serial_device uart0 = /** * This function will handle rtos timer */ -void rt_timer_handler(int vector) +void rt_timer_handler(int vector, void *param) { rt_uint32_t clear_int; rt_tick_increase(); @@ -47,7 +47,7 @@ void rt_timer_handler(int vector) /** * This function will handle serial */ -void rt_serial_handler(int vector) +void rt_serial_handler(int vector, void *param) { //rt_kprintf("in rt_serial_handler\n"); rt_int32_t stat = *(RP)UART0_IIR ; @@ -78,16 +78,17 @@ static void rt_hw_board_led_init(void) *(RP)GPIO_PORTE_DATA &= ~0x38; /* low */ } + /** * This function will init timer4 for system ticks */ - void rt_hw_timer_init(void) +void rt_hw_timer_init(void) { /*Set timer1*/ *(RP)TIMER_T1LCR = 880000; *(RP)TIMER_T1CR = 0x06; - rt_hw_interrupt_install(INTSRC_TIMER1, rt_timer_handler, RT_NULL); + rt_hw_interrupt_install(INTSRC_TIMER1, rt_timer_handler, RT_NULL, "tick"); rt_hw_interrupt_umask(INTSRC_TIMER1); /*Enable timer1*/ @@ -119,7 +120,7 @@ void rt_hw_uart_init(void) /*Disable tx interrupt*/ *(RP)(UART0_IER) &= ~(0x1<<1); - rt_hw_interrupt_install(INTSRC_UART0, rt_serial_handler, RT_NULL); + rt_hw_interrupt_install(INTSRC_UART0, rt_serial_handler, RT_NULL, "UART0"); rt_hw_interrupt_umask(INTSRC_UART0); /* register uart0 */ rt_hw_serial_register(&uart0_device, "uart0", diff --git a/bsp/mini4020/drivers/dm9161.c b/bsp/mini4020/drivers/dm9161.c index ea8294575d..2b02650dde 100644 --- a/bsp/mini4020/drivers/dm9161.c +++ b/bsp/mini4020/drivers/dm9161.c @@ -81,7 +81,7 @@ struct rt_dm9161_eth static struct rt_dm9161_eth dm9161_device; static struct rt_semaphore sem_ack, sem_lock; -void rt_dm9161_isr(int irqno); +void rt_dm9161_isr(int irqno, void *param); static void udelay(unsigned long ns) { @@ -201,7 +201,7 @@ static void read_phy(unsigned char phy_addr, unsigned char address, unsigned int } /* interrupt service routine */ -void rt_dm9161_isr(int irqno) +void rt_dm9161_isr(int irqno, void *param) { unsigned long intstatus; rt_uint32_t address; @@ -469,7 +469,7 @@ static rt_err_t rt_dm9161_open(rt_device_t dev, rt_uint16_t oflag) *(volatile unsigned long*)GPIO_PORTA_INTRCLR |= 0x0080; //Çå³ýÖÐ¶Ï *(volatile unsigned long*)GPIO_PORTA_INTRCLR = 0x0000; //Çå³ýÖÐ¶Ï - rt_hw_interrupt_install(INTSRC_MAC, rt_dm9161_isr, RT_NULL); + rt_hw_interrupt_install(INTSRC_MAC, rt_dm9161_isr, RT_NULL, "EMAC"); enable_irq(INTSRC_EXINT7); diff --git a/bsp/mini4020/rtconfig.h b/bsp/mini4020/rtconfig.h index 2f0060b6aa..9385fe0056 100644 --- a/bsp/mini4020/rtconfig.h +++ b/bsp/mini4020/rtconfig.h @@ -20,6 +20,7 @@ /* #define RT_THREAD_DEBUG */ #define RT_USING_OVERFLOW_CHECK +#define RT_USING_INTERRUPT_INFO /* Using Hook */ #define RT_USING_HOOK diff --git a/bsp/mini4020/template.Uv2 b/bsp/mini4020/template.Uv2 index 6ad293a7b3..c64e205761 100644 --- a/bsp/mini4020/template.Uv2 +++ b/bsp/mini4020/template.Uv2 @@ -31,14 +31,14 @@ Options 1,0,0 // Target 'RT-Thread_Mini4020' EnvReg () OrgReg () TgStat=16 - OutDir (.\) + OutDir (.\build\) OutName (rtthread-mini4020) GenApp=1 GenLib=0 GenHex=0 Debug=1 Browse=0 - LstDir (.\) + LstDir (.\build\) HexSel=1 MG32K=0 TGMORE=0 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 +#include #include #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 @@ -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"); }