int res = 0;
channel_data_t* chan = (channel_data_t*)__ch_data;
cyg_uint8 c;
- cyg_uint8 stat;
+ cyg_uint8 iir;
+
CYGARC_HAL_SAVE_GP();
*__ctrlc = 0;
- HAL_READ_UINT32(chan->base+CYGARC_HAL_LPC2XXX_REG_UxLSR, stat);
- if ( (stat & CYGARC_HAL_LPC2XXX_REG_UxLSR_RDR) != 0 ) {
+ HAL_READ_UINT32(chan->base + CYGARC_HAL_LPC2XXX_REG_UxIIR, iir);
+
+ if((iir & (CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR0 | CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR1 |
+ CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR2)) == CYGARC_HAL_LPC2XXX_REG_UxIIR_IIR2)
+ {
+ // Rx data available or character timeout
+ // Read data in order to clear interrupt
HAL_READ_UINT32(chan->base+CYGARC_HAL_LPC2XXX_REG_UxRBR, c);
- if( cyg_hal_is_break( &c , 1 ) )
- *__ctrlc = 1;
+ if( cyg_hal_is_break( &c , 1 ) ) *__ctrlc = 1;
res = CYG_ISR_HANDLED;
}