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_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);
}
Exemplo n.º 3
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
}