Пример #1
0
void LPC24XX_GPIO_Driver::PIN_ISR_DESCRIPTOR::Fire( void* arg )
{
    PIN_ISR_DESCRIPTOR* desc = (PIN_ISR_DESCRIPTOR*)arg;
    
    //debug_printf("Servicing GPIO. m_pin=%u, m_status=%u\r\n",desc->m_pin,desc->m_status);
    desc->m_isr( desc->m_pin, desc->m_status, desc->m_param );

}
void AT91_GPIO_Driver::PIN_ISR_DESCRIPTOR::Fire( void* arg )
{
    PIN_ISR_DESCRIPTOR* desc = (PIN_ISR_DESCRIPTOR*)arg;
        
    desc->m_isr( desc->m_pin, (desc->m_status & c_Status_AllowHighEdge) != 0, desc->m_param );

    if(desc->m_intEdge == GPIO_INT_EDGE_BOTH)
    {
        desc->m_status ^= PIN_ISR_DESCRIPTOR::c_Status_AllowLowEdge | PIN_ISR_DESCRIPTOR::c_Status_AllowHighEdge;
    }
}
Пример #3
0
void LPC24XX_GPIO_Driver::GPIO_ISR( void* Param )
{
    //manage all flagged pin IRQs on port 0
    LPC24XX_GPIOIRQ& GPIOIRQ = LPC24XX::GPIOIRQ();
    LPC24XX_GPIO& GPIO = LPC24XX::GPIO();
    
    UINT32 bit;
    PIN_ISR_DESCRIPTOR* pinIsr = NULL;
    
    for(bit = 0; (GPIOIRQ.IOIntStatus & 0x1) && (bit < 32); bit++) //exit when there are no pending IRQs or we reach P0.31 (should always be the first)
    {
        if(!(GPIOIRQ.IO0IntStatR & 0x1<<bit)&&!(GPIOIRQ.IO0IntStatF & 0x1<<bit)) //this is not the pin that detected an edge
            continue;
        
        //clear this pin's IRQ
        GPIOIRQ.IO0IntClr |= 0x1 << bit;
        
        pinIsr = &g_LPC24XX_GPIO_Driver.m_PinIsr[ bit /*+ 0 * LPC24XX_GPIO_Driver::c_PinsPerPort*/ ];
        
        //Debounce
        if( (pinIsr->m_flags & PIN_ISR_DESCRIPTOR::c_Flags_Debounce)&&
            (Time_CurrentTicks() - pinIsr->m_lastExecTicks < g_LPC24XX_GPIO_Driver.m_DebounceTicks))
            continue; //ignore this request
        
        //call this pin's ISR
            
        pinIsr->m_status = ((GPIO.Regs[0].FIOPIN_PX) >> bit) & 0x1;
        pinIsr->m_lastExecTicks = Time_CurrentTicks();
        pinIsr->Fire((void*)pinIsr);

        //clear this pin's IRQ
        GPIOIRQ.IO0IntClr |= 0x1 << bit;
    }
    
    //manage all flagged pin IRQs on port 2
    for(bit = 0; (GPIOIRQ.IOIntStatus & 0x4) && (bit < 32); bit++) // as above, but the guard value is P2.31
    {
        if(!(GPIOIRQ.IO2IntStatR & 0x1<<bit)&&!(GPIOIRQ.IO2IntStatF & 0x1<<bit)) //this is not the pin that detected an edge
            continue;
        
        //clear this pin's IRQ
        GPIOIRQ.IO2IntClr |= 0x1 << bit;
        
        pinIsr = &g_LPC24XX_GPIO_Driver.m_PinIsr[ bit + 2 * LPC24XX_GPIO_Driver::c_PinsPerPort ];
        
        //Debounce
        if( (pinIsr->m_flags & PIN_ISR_DESCRIPTOR::c_Flags_Debounce)&&
            (Time_CurrentTicks() - pinIsr->m_lastExecTicks < g_LPC24XX_GPIO_Driver.m_DebounceTicks))
            {
                //debug_printf(" ignoring.\r\n");
                continue; //ignore this request
            }
        
        //call this pin's ISR
        pinIsr->m_status = ((GPIO.Regs[2].FIOPIN_PX) >> bit) & 0x1;
        pinIsr->m_lastExecTicks = Time_CurrentTicks();
        pinIsr->Fire((void*)pinIsr);

    }
    
    
    
}