static void SerialDrv_ISR_Handler (SERIAL_DEV *pdev, CPU_INT08U type) { CPU_INT08U datum; CPU_INT32U lsr; CPU_INT32U iir; CPU_INT08U iir_int_id; SERIAL_DRV_REG *p_reg; SERIAL_DEV_CFG *p_cfg; (void)&type; p_cfg = pdev->Dev_Cfg; p_reg = (SERIAL_DRV_REG *)p_cfg->BaseAddr; iir = p_reg->IIR; /* Read te interrupt indentification register */ /* If at least one interrupt is pending ... */ while (DEF_BIT_IS_CLR(iir, SERIAL_DRV_LPCXXXX_BIT_IIR_INT_STAT)) { iir_int_id = (CPU_INT08U)((iir & SERIAL_DRV_LPCXXXX_MSK_IIR_INT_ID) >> 1u); switch (iir_int_id) { case SERIAL_DRV_LPCXXXX_BIT_IIR_INT_ID_RLS: /*Rx Line Status */ lsr = p_reg->LSR; break; case SERIAL_DRV_LPCXXXX_BIT_IIR_INT_ID_CTI: /* Character time-out */ case SERIAL_DRV_LPCXXXX_BIT_IIR_INT_ID_RDA: /* Rx data available */ lsr = p_reg->LSR; if (DEF_BIT_IS_CLR(lsr, SERIAL_DRV_LPCXXXX_BIT_LSR_RX_ERR)) { datum = (CPU_INT08U)(p_reg->RBR & DEF_INT_08_MASK); SerialIF_Rx(pdev, datum); } break; case SERIAL_DRV_LPCXXXX_BIT_IIR_INT_ID_THRE: /* Transmit Holding register */ SerialIF_Tx(pdev); /* Inform serial core of wr completion. */ break; default: break; } iir = p_reg->IIR; } }
static void SerialLine_RdOctet (SERIAL_DEV *pdev, SERIAL_BUF *pbuf, CPU_INT08U *pdatum, SERIAL_ERR *perr) { SERIAL_LINE_INFO *pinfo; CPU_BOOLEAN rd; pinfo = (SERIAL_LINE_INFO *)pdev->LineDrv_Data; switch (pinfo->TxState) { case SERIAL_LINE_TTY_TX_STATE_CR: /* ---------------- TX CARRIAGE RETURN ---------------- */ pinfo->TxState = SERIAL_LINE_TTY_TX_STATE_NORMAL; *pdatum = ASCII_CHAR_CARRIAGE_RETURN; *perr = SERIAL_ERR_NONE; return; case SERIAL_LINE_TTY_TX_STATE_NORMAL: /* --------------------- TX OCTETS -------------------- */ rd = SerialBuf_RdOctet(pbuf, pdatum); if (rd == DEF_NO) { *perr = SERIAL_ERR_UNDERFLOW; return; } if (*pdatum == ASCII_CHAR_LINE_FEED) { pinfo->TxState = SERIAL_LINE_TTY_TX_STATE_CR; } break; } #if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED) /* Echo data. */ pinfo = (SERIAL_LINE_INFO *)pdev->LineDrv_Data; if (pinfo->EchoTx == DEF_ENABLED) { SerialIF_Rx(pdev, *pdatum); } #endif *perr = SERIAL_ERR_NONE; }