void rt_interrupt_dispatch(void) { void *param; int vector; rt_isr_handler_t isr_func; rt_uint32_t pend_addr, data; vector = INTC->vector_reg - INTC->base_addr_reg; vector = vector >> 2; isr_func = isr_table[vector].handler; param = isr_table[vector].param; /* jump to fun */ isr_func(vector, param); /* clear pend bit */ pend_addr = (rt_uint32_t)(&INTC->pend_reg0); pend_addr += vector & 0xE0 ? sizeof(rt_uint32_t *) : 0; vector &= 0x1F; data = readl(pend_addr); data &= ~(0x1 << vector); writel(data, pend_addr); #ifdef RT_USING_INTERRUPT_INFO isr_table[vector].counter ++; #endif }
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); /* clear pending register */ irqstat = at91_sys_read(AT91_AIC_ISR); if (irqstat == 0) { rt_kprintf("No interrupt occur\n"); at91_sys_write(AT91_AIC_EOICR, 0); return; } /* get interrupt service routine */ isr_func = irq_desc[irq].handler; param = irq_desc[irq].param; /* turn to interrupt service routine */ 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].counter ++; }
void rt_hw_trap_irq() { void *param; unsigned long ir; rt_isr_handler_t isr_func; extern struct rt_irq_desc isr_table[]; ir = rt_hw_interrupt_get_active(INT_IRQ); if (ir == 127) { /* new IRQ generation */ rt_hw_interrupt_ack(INT_IRQ); ir = rt_hw_interrupt_get_active(INT_IRQ); if (ir == 127) { /* still spurious interrupt, get out */ /*rt_kprintf("still spurious interrupt\n");*/ return; } /*rt_kprintf("new IRQ: %d\n", ir);*/ } /* get interrupt service routine */ isr_func = isr_table[ir].handler; param = isr_table[ir].param; /* turn to interrupt service routine */ if (isr_func != RT_NULL) isr_func(ir, param); /* new IRQ generation */ rt_hw_interrupt_ack(INT_IRQ); }
void rt_hw_trap_irq(void) { 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);; /*Shift to get the intrrupt number*/ while(intstat != 1) { intstat = intstat >> 1; irq++; } /* get interrupt service routine */ isr_func = isr_table[irq].handler; 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_irq() { rt_isr_handler_t isr_func; isr_func = (rt_isr_handler_t) VICVectAddr; isr_func(0); /* acknowledge Interrupt */ // VICVectAddr = 0; }
void rt_hw_trap_fiq() { void *param; unsigned long ir; rt_isr_handler_t isr_func; extern struct rt_irq_desc isr_table[]; ir = rt_hw_interrupt_get_active(INT_FIQ); /* get interrupt service routine */ isr_func = isr_table[ir].handler; param = isr_table[ir].param; /* turn to interrupt service routine */ isr_func(ir, param); /* new FIQ generation */ rt_hw_interrupt_ack(INT_FIQ); }
void rt_hw_trap_irq(void) { void *param; unsigned long ir; unsigned long fullir; rt_isr_handler_t isr_func; extern struct rt_irq_desc isr_table[]; fullir = arm_gic_get_active_irq(0); ir = fullir & GIC_ACK_INTID_MASK; if (ir == 1023) { /* Spurious interrupt */ return; } /* get interrupt service routine */ isr_func = isr_table[ir].handler; #ifdef RT_USING_INTERRUPT_INFO isr_table[ir].counter++; #endif if (isr_func) { /* Interrupt for myself. */ param = isr_table[ir].param; /* turn to interrupt service routine */ isr_func(ir, param); } #ifdef RT_USING_VMM else { /* We have to EOI before masking the interrupts */ arm_gic_ack(0, fullir); vmm_virq_pending(ir); return; } #endif /* end of interrupt */ arm_gic_ack(0, fullir); }
void rt_hw_trap_irq(void) { unsigned long intstat; rt_uint32_t irq = 0; rt_isr_handler_t isr_func; void *param; /* get the interrupt number */ irq = *(RP)(SEP6200_VIC_IRQ_VECTOR_NUM); /* get interrupt service routine */ isr_func = isr_table[irq].handler; 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) { void *param; unsigned long ir; unsigned long fullir; rt_isr_handler_t isr_func; extern struct rt_irq_desc isr_table[]; fullir = arm_gic_get_active_irq(0); ir = fullir & GIC_ACK_INTID_MASK; /* get interrupt service routine */ isr_func = isr_table[ir].handler; param = isr_table[ir].param; /* turn to interrupt service routine */ isr_func(ir, param); /* end of interrupt */ arm_gic_ack(0, fullir); }
void rt_hw_trap_irq() { rt_isr_handler_t isr_func; rt_uint32_t irq; void *param; /* get irq number */ irq = rt_hw_interrupt_get_active(0); /* get interrupt service routine */ isr_func = irq_desc[irq].handler; param = irq_desc[irq].param; /* turn to interrupt service routine */ isr_func(irq, param); rt_hw_interrupt_ack(0, irq); #ifdef RT_USING_INTERRUPT_INFO irq_desc[irq].counter ++; #endif }