⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 serial.c

📁 STM3240G-Eval_uCOS-III
💻 C
📖 第 1 页 / 共 5 页
字号:
CPU_BOOLEAN  Serial_IF_IsValid (SERIAL_IF_NBR   if_nbr,
                                SERIAL_ERR     *perr)
{
    SERIAL_IF  *pif;


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* -------------- VALIDATE SERIAL IF NBR -------------- */
    if (if_nbr >= SERIAL_IF_NBR_TOT) {
       *perr = SERIAL_ERR_IF_INVALID_NBR;
        return (DEF_NO);
    }
#endif

                                                                /* ---------------- VALIDATE SERIAL IF ---------------- */
    if (if_nbr >= SerialIF_NbrNext) {
       *perr = SERIAL_ERR_IF_INVALID_NBR;
        return (DEF_NO);
    }

    pif = &Serial_IF_Tbl[if_nbr];
    if (pif->Init != DEF_YES) {
       *perr = SERIAL_ERR_IF_INVALID_NBR;
        return (DEF_NO);
    }

    if (pif->State != SERIAL_STATE_OPENED) {
       *perr = SERIAL_ERR_IF_NOT_OPEN;
        return (DEF_NO);
    }


   *perr = SERIAL_ERR_NONE;
    return (DEF_YES);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                         Serial_SetLineDrv()
*
* Description : Set serial interface line driver.
*
* Argument(s) : if_nbr      Serial interface number to validate.
*
*               pline_api   Pointer to line driver API,
*                               OR
*                           Pointer to NULL, if the default line driver will be used.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Serial interface successfully validated.
*
*                                                               --- RETURNED BY Serial_IF_IsValid() : ---
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
* Return(s)   : None.
*
* Caller(s)   : Application.
*
* Note(s)     : None.
*********************************************************************************************************
*/

void  Serial_SetLineDrv (SERIAL_IF_NBR         if_nbr,
                         SERIAL_LINE_DRV_API  *pline_api,
                         SERIAL_ERR           *perr)
{
    SERIAL_IF    *pif;
    SERIAL_DEV   *pdev;
    CPU_BOOLEAN   valid;
    void         *pline_data;
    SERIAL_ERR    ser_err;
    CPU_SR_ALLOC();


    if (pline_api == (SERIAL_LINE_DRV_API *)0) {                /* Dflt line drv.                                       */
        pline_api  = (SERIAL_LINE_DRV_API *)&SerialLine_Dflt;
    }

                                                                /* ------------------ VALIDATE IF NBR ----------------- */
    CPU_CRITICAL_ENTER();
    valid = Serial_IF_IsValid(if_nbr, perr);
    if (valid != DEF_YES) {                                     /* Rtn err if IF not valid.                             */
        CPU_CRITICAL_EXIT();
        return;
    }

                                                                /* ----------------- GET LINE DRV INFO ---------------- */
    pif  = &Serial_IF_Tbl[if_nbr];
    pdev = &pif->Dev;

    pline_data = pline_api->Open(pdev, perr);                   /* 'Open' new line drv.                                 */
    if (*perr != SERIAL_ERR_NONE) {
        CPU_CRITICAL_EXIT();
        return;
    }

    pdev->LineDrv_API->Close(pdev, pdev->LineDrv_Data, perr);   /* 'Close' cur line drv.                                */
    if (*perr != SERIAL_ERR_NONE) {
        pline_api->Close(pdev, pline_data, &ser_err);           /* 'Close' new line drv.                                */
        CPU_CRITICAL_EXIT();
        return;
    }

#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)                       /* Flush rd buf.                                        */
    if (pif->RdBufEn == DEF_YES) {
        SerialBuf_Clr(&(pif->RdBuf));
    }
#endif

    pdev->LineDrv_API  = pline_api;
    pdev->LineDrv_Data = pline_data;
    CPU_CRITICAL_EXIT();

   *perr = SERIAL_ERR_NONE;
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                            Serial_Open()
*
* Description : Open a serial interface for communication.
*
* Argument(s) : pname       Pointer to device name.
*
*               pcfg        Pointer to serial port setup data.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Device successfully opened.
*                               SERIAL_ERR_NULL_PTR             NULL pointer passed for 'pname' or 'pcfg'.
*                               SERIAL_ERR_DEV_NOT_FOUND        Device not found.
*                               SERIAL_ERR_DEV_ALREADY_OPEN     Device is already open.
*                               SERIAL_ERR_DRV_OPEN             Driver could NOT be open or device
*                                                                   initialization NOT successful.
*
* Return(s)   : Interface number.
*
* Caller(s)   : Application.
*
* Note(s)     : (1) The serial interface is opened with the default line driver.
*********************************************************************************************************
*/

SERIAL_IF_NBR  Serial_Open (CPU_CHAR       *pname,
                            SERIAL_IF_CFG  *pcfg,
                            SERIAL_ERR     *perr)
{
    CPU_INT16S            cmp;
    SERIAL_IF_NBR         ix;
    CPU_BOOLEAN           found;
    SERIAL_IF            *pif;
    SERIAL_DEV           *pdev;
    SERIAL_LINE_DRV_API  *pline_api;
    void                 *pline_data;
    CPU_SR_ALLOC();


#if (SERIAL_CFG_ARG_CHK_EXT_EN == DEF_ENABLED)                  /* ------------------- VALIDATE ARGS ------------------ */
    if (pname == (CPU_CHAR *)0) {
       *perr = SERIAL_ERR_NULL_PTR;
        return (SERIAL_IF_NBR_NONE);
    }

    if (pcfg == (SERIAL_IF_CFG *)0) {
       *perr = SERIAL_ERR_NULL_PTR;
        return (SERIAL_IF_NBR_NONE);
    }
#endif

                                                                /* --------------------- FIND DEV --------------------- */
    pif   = (SERIAL_IF *)0;
    found = DEF_NO;
    for (ix = SERIAL_IF_NBR_MIN; ix < SerialIF_NbrNext; ix++) {
        pif = &Serial_IF_Tbl[ix];
        cmp =  Str_Cmp(pif->NamePtr, pname);
        if (cmp == 0) {
            found = DEF_YES;
            break;
        }
    }

    if (found == DEF_NO) {                                      /* IF not found.                                        */
       *perr = SERIAL_ERR_DEV_NOT_FOUND;
        return (SERIAL_IF_NBR_NONE);
    }


    pdev = &pif->Dev;

                                                                /* --------------------- OPEN DEV --------------------- */
    CPU_CRITICAL_ENTER();
    if (pif->State != SERIAL_STATE_CLOSED) {                    /* Chk if port already open.                            */
        CPU_CRITICAL_EXIT();
       *perr = SERIAL_ERR_DEV_ALREADY_OPEN;
        return (SERIAL_IF_NBR_NONE);
    }

    pline_api  = &SerialLine_Dflt;                              /* Dflt   line drv.                                     */
    pline_data =  pline_api->Open(pdev, perr);                  /* 'Open' line drv.                                     */
    if (*perr != SERIAL_ERR_NONE) {
        CPU_CRITICAL_EXIT();
        return (SERIAL_IF_NBR_NONE);
    }

    pdev->Dev_Cfg->Drv_API->Open(pdev, pcfg, perr);             /* Open dev with drv.                                   */
    if (*perr != SERIAL_ERR_NONE) {
        pline_api->Close(pdev, pline_data, perr);               /* 'Close' line drv.                                    */
        CPU_CRITICAL_EXIT();
       *perr = SERIAL_ERR_DRV_OPEN;
        return (SERIAL_IF_NBR_NONE);
    }

    pdev->LineDrv_API  = pline_api;
    pdev->LineDrv_Data = pline_data;

#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)
    if (pif->RdBufEn == DEF_YES) {                              /* Start rx'er (if rd buf en'd).                        */
        pif->RdBufErr = SERIAL_ERR_NONE;
        pdev->Dev_Cfg->Drv_API->RxStart(pdev, perr);

        if (*perr != SERIAL_ERR_NONE) {
            CPU_CRITICAL_EXIT();
            return (SERIAL_IF_NBR_NONE);
        }
    }
#endif

    pif->RdState = SERIAL_RD_STATE_OPENED;
    pif->WrState = SERIAL_WR_STATE_OPENED;
    pif->State   = SERIAL_STATE_OPENED;
    CPU_CRITICAL_EXIT();

    return (pif->Nbr);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                           Serial_Close()
*
* Description : Close a serial interface.
*
* Argument(s) : if_nbr      Interface number.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Device successfully closed.
*
*                                                               - RETURNED BY Serial_IF_IsValid() : -
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
* Return(s)   : None.
*
* Caller(s)   : Application.
*
* Note(s)     : None.
*********************************************************************************************************
*/

void  Serial_Close (SERIAL_IF_NBR   if_nbr,
                    SERIAL_ERR     *perr)
{
    SERIAL_IF             *pif;
    SERIAL_DEV            *pdev;
    CPU_BOOLEAN            valid;
    SERIAL_CALLBACK_FNCT  *rd_callback;
    void                  *rd_callback_arg;
    void                  *rd_callback_buf;
    SERIAL_CALLBACK_FNCT  *wr_callback;
    void                  *wr_callback_arg;
    void                  *wr_callback_buf;
#if (SERIAL_CFG_TX_DESC_NBR > 0)
    SERIAL_BUF_DESC       *pbuf;
    SERIAL_BUF_DESC       *pbuf_next;
    LIB_ERR                lib_err;
#endif
    CPU_SR_ALLOC();

                                                                /* ------------------ VALIDATE IF NBR ----------------- */
    CPU_CRITICAL_ENTER();
    valid = Serial_IF_IsValid(if_nbr, perr);
    if (valid != DEF_YES) {                                     /* Rtn err if IF not valid.                             */
        CPU_CRITICAL_EXIT();
        return;
    }

    pif  = &Serial_IF_Tbl[if_nbr];
    pdev = &pif->Dev;
                                                                /* ------------------- ABORT DEV I/O ------------------ */
    pdev->Dev_Cfg->Drv_API->RxStop(pdev, perr);                 /* Stop dev rx.                                         */
    pdev->Dev_Cfg->Drv_API->TxStop(pdev, perr);                 /* Stop dev tx.                                         */

                                                                /* --------------------- CLOSE DEV -------------------- */
    pif->State = SERIAL_STATE_CLOSING;
    pdev->Dev_Cfg->Drv_API->Close(pdev, perr);                  /* Close dev  drv.                                      */
    pdev->LineDrv_API->Close(pdev, pdev->LineDrv_Data, perr);   /* Close line drv.                                      */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -