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; } }
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); } }