diff --git a/bsp/mini2440/board.c b/bsp/mini2440/board.c index 23e78e6c7ca31e3e29af86a09822a03239488775..fc623386b41488a795285bfd3f81ff39abad6c28 100644 --- a/bsp/mini2440/board.c +++ b/bsp/mini2440/board.c @@ -58,7 +58,7 @@ struct rt_device uart2_device; /** * This function will handle rtos timer */ -static void rt_timer_handler(int vector) +static void rt_timer_handler(int vector, void *param) { rt_tick_increase(); } @@ -66,7 +66,7 @@ static void rt_timer_handler(int vector) /** * This function will handle serial */ -static void rt_serial0_handler(int vector) +static void rt_serial0_handler(int vector, void *param) { INTSUBMSK |= (BIT_SUB_RXD0); @@ -81,7 +81,7 @@ static void rt_serial0_handler(int vector) /** * This function will handle serial */ -static void rt_serial2_handler(int vector) +static void rt_serial2_handler(int vector, void *param) { INTSUBMSK |= (BIT_SUB_RXD2); @@ -133,7 +133,7 @@ static void rt_hw_uart_init(void) uart2.uart_device->ucon = 0x245; /* Set uart0 bps */ uart2.uart_device->ubrd = (rt_int32_t)(PCLK / (BPS * 16)) - 1; - + for (i = 0; i < 100; i++); /* install uart0 isr */ @@ -141,18 +141,18 @@ static void rt_hw_uart_init(void) /* install uart2 isr */ INTSUBMSK &= ~(BIT_SUB_RXD2); - - rt_hw_interrupt_install(INTUART0, rt_serial0_handler, RT_NULL); + + rt_hw_interrupt_install(INTUART0, rt_serial0_handler, RT_NULL, "UART0"); rt_hw_interrupt_umask(INTUART0); - rt_hw_interrupt_install(INTUART2, rt_serial2_handler, RT_NULL); - rt_hw_interrupt_umask(INTUART2); + rt_hw_interrupt_install(INTUART2, rt_serial2_handler, RT_NULL, "UART2"); + rt_hw_interrupt_umask(INTUART2); } /** * This function will init timer4 for system ticks */ -static void rt_hw_timer_init() +static void rt_hw_timer_init(void) { /* timer4, pre = 15+1 */ TCFG0 &= 0xffff00ff; @@ -165,7 +165,7 @@ static void rt_hw_timer_init() /* manual update */ TCON = TCON & (~(0x0f<<20)) | (0x02<<20); /* install interrupt handler */ - rt_hw_interrupt_install(INTTIMER4, rt_timer_handler, RT_NULL); + rt_hw_interrupt_install(INTTIMER4, rt_timer_handler, RT_NULL, "tick"); rt_hw_interrupt_umask(INTTIMER4); /* start timer4, reload */ @@ -175,7 +175,7 @@ static void rt_hw_timer_init() /** * This function will init s3ceb2410 board */ -void rt_hw_board_init() +void rt_hw_board_init(void) { /* initialize the system clock */ rt_hw_clock_init(); diff --git a/bsp/mini2440/dm9000.c b/bsp/mini2440/dm9000.c index ee8e404c821b7d4586ef7cdf7135757fd68bf891..527be3b7b88cf80b66c2bb7ee4ffb16f376458f2 100644 --- a/bsp/mini2440/dm9000.c +++ b/bsp/mini2440/dm9000.c @@ -572,7 +572,7 @@ __error_retry: #define B4_Tacp 0x0 #define B4_PMC 0x0 -void INTEINT4_7_handler(int irqno) +void INTEINT4_7_handler(int irqno, void *param) { rt_uint32_t eint_pend; @@ -637,7 +637,7 @@ void rt_hw_dm9000_init() eth_device_init(&(dm9000_device.parent), "e0"); /* instal interrupt */ - rt_hw_interrupt_install(INTEINT4_7, INTEINT4_7_handler, RT_NULL); + rt_hw_interrupt_install(INTEINT4_7, INTEINT4_7_handler, RT_NULL, "EINT4_7"); rt_hw_interrupt_umask(INTEINT4_7); } diff --git a/bsp/mini2440/rtconfig.h b/bsp/mini2440/rtconfig.h index 3f87e450735113873fd612a66ee5ef4b63f6d035..2e4c05bbce68885ff85a800894536047040dcd5b 100644 --- a/bsp/mini2440/rtconfig.h +++ b/bsp/mini2440/rtconfig.h @@ -22,6 +22,8 @@ // #define RT_THREAD_DEBUG // #define RT_USING_OVERFLOW_CHECK +// +#define RT_USING_INTERRUPT_INFO // // diff --git a/libcpu/arm/s3c24x0/interrupt.c b/libcpu/arm/s3c24x0/interrupt.c index 18cdbaa09f6128e5fa0ec5be61eb592151e693c5..df0c1406d31384a67cec1ecb1b11c452e76db59e 100644 --- a/libcpu/arm/s3c24x0/interrupt.c +++ b/libcpu/arm/s3c24x0/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 "s3c24x0.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; @@ -29,10 +31,9 @@ rt_uint32_t rt_thread_switch_interrupt_flag; */ /*@{*/ -rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector) +static void rt_hw_interrupt_handle(int vector, void *param) { rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); - return RT_NULL; } /** @@ -40,37 +41,38 @@ rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector) */ void rt_hw_interrupt_init(void) { - register rt_uint32_t idx; + register rt_uint32_t idx; - /* all clear source pending */ - SRCPND = 0x0; + /* all clear source pending */ + SRCPND = 0x0; - /* all clear sub source pending */ - SUBSRCPND = 0x0; + /* all clear sub source pending */ + SUBSRCPND = 0x0; - /* all=IRQ mode */ - INTMOD = 0x0; + /* all=IRQ mode */ + INTMOD = 0x0; - /* all interrupt disabled include global bit */ - INTMSK = BIT_ALLMSK; + /* all interrupt disabled include global bit */ + INTMSK = BIT_ALLMSK; - /* all sub interrupt disable */ - INTSUBMSK = BIT_SUB_ALLMSK; + /* all sub interrupt disable */ + INTSUBMSK = BIT_SUB_ALLMSK; - /* all clear interrupt pending */ - INTPND = BIT_ALLMSK; + /* all clear interrupt pending */ + INTPND = BIT_ALLMSK; - /* 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; } /** @@ -105,13 +107,26 @@ void rt_hw_interrupt_umask(int vector) * @param new_handler the interrupt service routine to be installed * @param old_handler the old interrupt service routine */ -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) { - 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/s3c24x0/trap.c b/libcpu/arm/s3c24x0/trap.c index bdeae9aab02e93f95cf82c4451fe5380821f97d6..f1c81768c9928b7446fb6fdf52813dc867e4698d 100644 --- a/libcpu/arm/s3c24x0/trap.c +++ b/libcpu/arm/s3c24x0/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 @@ -140,29 +141,35 @@ 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_isr_handler_t isr_func; + unsigned long irq; + rt_isr_handler_t isr_func; + void *param; - intstat = INTOFFSET; + irq = INTOFFSET; - if (intstat == INTGLOBAL) return; + if (irq == INTGLOBAL) return; - /* get interrupt service routine */ - isr_func = isr_table[intstat]; + /* get interrupt service routine */ + isr_func = isr_table[irq].handler; + param = isr_table[irq].param; - /* turn to interrupt service routine */ - isr_func(intstat); + /* turn to interrupt service routine */ + isr_func(irq, param); - /* clear pending register */ - /* note: must be the last, if not, may repeat*/ - ClearPending(1 << intstat); + /* clear pending register */ + /* note: must be the last, if not, may repeat*/ + ClearPending(1 << irq); + +#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"); }