Exemplo n.º 1
0
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;
    }
}
Exemplo n.º 2
0
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;
}