diff options
| author | Bernard Xiong <[email protected]> | 2013-03-22 17:43:40 -0700 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2013-03-22 17:43:40 -0700 |
| commit | 5a4d0d533875cf06b27510e17fb8ca708b9dd98b (patch) | |
| tree | 2f9bc6a4bda2c520725d4ef972977b1e3ff498f0 /libcpu | |
| parent | a9074e2ccd07dac20c8dde09477359f82679b7c3 (diff) | |
| parent | 7917cf09e78636699ddea076d049324c9c303294 (diff) | |
Merge pull request #54 from weety/new-branch
Modify the interrupt interface implementations and changes some parameters definition
Diffstat (limited to 'libcpu')
| -rwxr-xr-x | libcpu/arm/at91sam926x/interrupt.c | 76 | ||||
| -rwxr-xr-x | libcpu/arm/at91sam926x/trap.c | 9 |
2 files changed, 69 insertions, 16 deletions
diff --git a/libcpu/arm/at91sam926x/interrupt.c b/libcpu/arm/at91sam926x/interrupt.c index 31e49283dd..012ecc66aa 100755 --- a/libcpu/arm/at91sam926x/interrupt.c +++ b/libcpu/arm/at91sam926x/interrupt.c @@ -20,7 +20,8 @@ extern rt_uint32_t rt_interrupt_nest; /* exception and interrupt handler table */ -rt_isr_handler_t isr_table[MAX_HANDLERS]; +struct rt_irq_desc irq_desc[MAX_HANDLERS]; + rt_uint32_t rt_interrupt_from_thread, rt_interrupt_to_thread; rt_uint32_t rt_thread_switch_interrupt_flag; @@ -79,15 +80,16 @@ static rt_uint32_t at91sam9260_default_irq_priority[MAX_HANDLERS] = { void rt_hw_interrupt_mask(int irq); void rt_hw_interrupt_umask(int irq); -rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector) +rt_isr_handler_t rt_hw_interrupt_handle(rt_uint32_t vector, void *param) { rt_kprintf("Unhandled interrupt %d occured!!!\n", vector); return RT_NULL; } -rt_isr_handler_t at91_gpio_irq_handle(rt_uint32_t vector) +rt_isr_handler_t at91_gpio_irq_handle(rt_uint32_t vector, void *param) { rt_uint32_t isr, pio, irq_n; + void *parameter; if (vector == AT91SAM9260_ID_PIOA) { @@ -111,7 +113,8 @@ rt_isr_handler_t at91_gpio_irq_handle(rt_uint32_t vector) { if (isr & 1) { - isr_table[irq_n](irq_n); + parameter = irq_desc[irq_n].param; + irq_desc[irq_n].isr_handle(irq_n, parameter); } isr >>= 1; irq_n++; @@ -160,13 +163,22 @@ void at91_aic_init(rt_uint32_t *priority) static void at91_gpio_irq_init() { + int i, idx; + char *name[] = {"PIOA", "PIOB", "PIOC"}; + at91_sys_write(AT91_PIOA+PIO_IDR, 0xffffffff); at91_sys_write(AT91_PIOB+PIO_IDR, 0xffffffff); at91_sys_write(AT91_PIOC+PIO_IDR, 0xffffffff); - isr_table[AT91SAM9260_ID_PIOA] = (rt_isr_handler_t)at91_gpio_irq_handle; - isr_table[AT91SAM9260_ID_PIOB] = (rt_isr_handler_t)at91_gpio_irq_handle; - isr_table[AT91SAM9260_ID_PIOC] = (rt_isr_handler_t)at91_gpio_irq_handle; + idx = AT91SAM9260_ID_PIOA; + for (i = 0; i < 3; i++) + { + rt_snprintf(irq_desc[idx].irq_name, RT_NAME_MAX - 1, name[i]); + irq_desc[idx].isr_handle = (rt_isr_handler_t)at91_gpio_irq_handle; + irq_desc[idx].param = RT_NULL; + irq_desc[idx].interrupt_cnt = 0; + idx++; + } rt_hw_interrupt_umask(AT91SAM9260_ID_PIOA); rt_hw_interrupt_umask(AT91SAM9260_ID_PIOB); @@ -192,7 +204,10 @@ void rt_hw_interrupt_init(void) /* init exceptions table */ for(idx=0; idx < MAX_HANDLERS; idx++) { - isr_table[idx] = (rt_isr_handler_t)rt_hw_interrupt_handle; + rt_snprintf(irq_desc[idx].irq_name, RT_NAME_MAX - 1, "default"); + irq_desc[idx].isr_handle = (rt_isr_handler_t)rt_hw_interrupt_handle; + irq_desc[idx].param = RT_NULL; + irq_desc[idx].interrupt_cnt = 0; } at91_gpio_irq_init(); @@ -289,16 +304,29 @@ void rt_hw_interrupt_umask(int irq) /** * 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 < MAX_HANDLERS) { - if (old_handler != RT_NULL) *old_handler = isr_table[vector]; - if (new_handler != RT_NULL) isr_table[vector] = new_handler; + old_handler = irq_desc[vector].isr_handle; + if (handler != RT_NULL) + { + rt_snprintf(irq_desc[vector].irq_name, RT_NAME_MAX - 1, "%s", name); + irq_desc[vector].isr_handle = (rt_isr_handler_t)handler; + irq_desc[vector].param = param; + irq_desc[vector].interrupt_cnt = 0; + } } + + return old_handler; } /*@}*/ @@ -335,3 +363,25 @@ static int at91_aic_set_type(unsigned irq, unsigned type) at91_sys_write(AT91_AIC_SMR(irq), smr | srctype); return 0; } + +#ifdef RT_USING_FINSH +void list_irq(void) +{ + int irq; + + rt_kprintf("number\tcount\tname\n"); + for (irq = 0; irq < MAX_HANDLERS; irq++) + { + if (rt_strncmp(irq_desc[irq].irq_name, "default", sizeof("default"))) + { + rt_kprintf("%02ld: %10ld %s\n", irq, irq_desc[irq].interrupt_cnt, irq_desc[irq].irq_name); + } + } +} + +#include <finsh.h> +FINSH_FUNCTION_EXPORT(list_irq, list system irq); + +#endif + + diff --git a/libcpu/arm/at91sam926x/trap.c b/libcpu/arm/at91sam926x/trap.c index 2d09c2d56e..841c8b6813 100755 --- a/libcpu/arm/at91sam926x/trap.c +++ b/libcpu/arm/at91sam926x/trap.c @@ -138,12 +138,13 @@ 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 irq_desc[]; void rt_hw_trap_irq() { rt_isr_handler_t isr_func; rt_uint32_t irqstat, irq, mask; + void *param; //rt_kprintf("irq interrupt request\n"); /* get irq number */ irq = at91_sys_read(AT91_AIC_IVR); @@ -158,11 +159,13 @@ void rt_hw_trap_irq() //at91_sys_write(AT91_AIC_EOICR, 0x55555555); /* get interrupt service routine */ - isr_func = isr_table[irq]; + isr_func = irq_desc[irq].isr_handle; + param = irq_desc[irq].param; /* turn to interrupt service routine */ - isr_func(irq); + isr_func(irq, param); at91_sys_write(AT91_AIC_EOICR, 0x55555555); //EIOCR must be write any value after interrupt, or else can't response next interrupt + irq_desc[irq].interrupt_cnt++; } void rt_hw_trap_fiq() |
