Exemple #1
0
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
}
Exemple #2
0
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);
}
Exemple #8
0
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);
}
Exemple #10
0
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
}