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

📄 serial.c

📁 STM3240G-Eval_uCOS-III
💻 C
📖 第 1 页 / 共 5 页
字号:

SERIAL_ERR  Serial_Init (void)
{
    SERIAL_IF_NBR   ix;
    SERIAL_IF      *pif;
    SERIAL_ERR      ser_err;
#if (SERIAL_CFG_TX_DESC_NBR > 0)
    LIB_ERR         lib_err;
#endif


                                                                /* -------------- PERFORM SERIAL/OS INIT -------------- */
    SerialOS_Init(&ser_err);
    if (ser_err != SERIAL_OS_ERR_NONE) {
        return (ser_err);
    }

                                                                /* ----------------- INIT IF DATA TBL ----------------- */
                                                                /* Clr all IF data.                                     */
    for (ix = SERIAL_IF_NBR_MIN; ix < SERIAL_IF_NBR_TOT; ix++) {
        pif = &Serial_IF_Tbl[ix];

        Serial_IF_Clr(pif);

        pif->Nbr     = (SERIAL_IF_NBR  )ix;
        pif->Init    = (CPU_BOOLEAN    )DEF_NO;
        pif->State   = (CPU_INT08U     )SERIAL_STATE_NONE;
        pif->NamePtr = (CPU_CHAR      *)0;

        pif->RdSem   = (void          *)0;
        pif->WrSem   = (void          *)0;


#if (SERIAL_CFG_TX_DESC_NBR > 0)
        Mem_PoolClr(&pif->TxBufPool, &lib_err);

        pif->TxBufListStart = (SERIAL_BUF_DESC *)0;
        pif->TxBufListEnd   = (SERIAL_BUF_DESC *)0;
#endif
    }

    SerialIF_NbrNext = SERIAL_IF_NBR_MIN;

    return (SERIAL_ERR_NONE);
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                         Serial_DevDrvAdd()
*
* Description : Add a serial device driver.
*
* Argument(s) : pname       Pointer to name that will be used to open the device.
*
*               pdev_cfg    Pointer to device configuration structure.
*
*               rd_buf_len  Length of read buffer.
*
*               wr_buf_len  Length of write buffer.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Serial device driver successfully added.
*                               SERIAL_ERR_NULL_PTR             NULL pointer passed for argument 'pname',
*                                                                   'pdev_cfg', 'pdev_cfg->Drv_API' or
*                                                                   'pdev_cfg->Dev_Cfg'.
*                               SERIAL_ERR_DRV_INVALID          NULL/invalid members in 'pdev_cfg->Drv_API'.
*                               SERIAL_ERR_DEV_DUP_NAME         'pname' duplicates name of existing device.
*                               SERIAL_ERR_IF_NOT_AVAIL         Resource for new interface NOT available.
*                               SERIAL_ERR_MEM_ALLOC            Memory could NOT be allocated for new interface
*                                                                   entry or read/write buffers.
*                               SERIAL_ERR_BUF_POOL_INIT        Buffer pool could NOT be initialized.
*
* Return(s)   : None.
*
* Caller(s)   : Application.
*
* Note(s)     : None.
*********************************************************************************************************
*/

void  Serial_DevDrvAdd (CPU_CHAR        *pname,
                        SERIAL_DEV_CFG  *pdev_cfg,
                        CPU_SIZE_T       rd_buf_len,
                        CPU_SIZE_T       wr_buf_len,
                        SERIAL_ERR      *perr)
{
    SERIAL_IF      *pif;
    SERIAL_DEV     *pdev;
    SERIAL_IF_NBR   ix;
    CPU_INT16S      cmp;
    CPU_BOOLEAN     init;
#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED) || \
    (SERIAL_CFG_WR_BUF_EN == DEF_ENABLED)
    CPU_INT08U     *pbuf_data;
#endif
#if (SERIAL_CFG_RD_BUF_EN       == DEF_ENABLED) || \
    (SERIAL_CFG_WR_BUF_EN       == DEF_ENABLED) || \
    (SERIAL_CFG_TX_DESC_NBR >  0)
    CPU_SIZE_T      octets_reqd;
    LIB_ERR         lib_err;
#endif
    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;
    }

    if (pdev_cfg == (SERIAL_DEV_CFG *)0) {
       *perr = SERIAL_ERR_NULL_PTR;
        return;
    }

    if (pdev_cfg->Drv_API == (SERIAL_DRV_API *)0) {
       *perr = SERIAL_ERR_NULL_PTR;
        return;
    }

    if ((pdev_cfg->Drv_API->Init        == (void *)0) ||        /* Validate drv API.                                    */
        (pdev_cfg->Drv_API->Open        == (void *)0) ||
        (pdev_cfg->Drv_API->Close       == (void *)0) ||
        (pdev_cfg->Drv_API->RxStart     == (void *)0) ||
        (pdev_cfg->Drv_API->RxStop      == (void *)0) ||
        (pdev_cfg->Drv_API->RxOctet     == (void *)0) ||
        (pdev_cfg->Drv_API->TxStart     == (void *)0) ||
        (pdev_cfg->Drv_API->TxStop      == (void *)0) ||
        (pdev_cfg->Drv_API->TxOctet     == (void *)0) ||
        (pdev_cfg->Drv_API->ISR_Handler == (void *)0)) {
        *perr = SERIAL_ERR_DRV_INVALID;
         return;
    }
#endif


    CPU_CRITICAL_ENTER();
                                                                /* ---------------------- INIT DEV -------------------- */
    if (SerialIF_NbrNext >= SERIAL_IF_NBR_TOT) {                /* Chk next IF nbr.                                     */
        CPU_CRITICAL_EXIT();
       *perr = SERIAL_ERR_IF_NOT_AVAIL;
        return;
    }

    for (ix = SERIAL_IF_NBR_MIN; ix < SerialIF_NbrNext; ix++) { /* Chk if dev name dup'd.                               */
        pif = &Serial_IF_Tbl[ix];
        cmp =  Str_Cmp(pif->NamePtr, pname);
        if (cmp == 0) {
            CPU_CRITICAL_EXIT();
           *perr = SERIAL_ERR_DEV_DUP_NAME;
            return;
        }
    }

                                                                /* --------------------- SEARCH DRV ------------------- */
    init = DEF_TRUE;
    for (ix = SERIAL_IF_NBR_MIN; ix < SerialIF_NbrNext; ix++) {
        pif = &Serial_IF_Tbl[ix];

        if ((pif->Init                 == DEF_YES) &&
            (pif->Dev.Dev_Cfg->Drv_API == pdev_cfg->Drv_API)) {
            init = DEF_FALSE;
            break;
        }
    }

                                                                /* ---------------------- INIT DRV -------------------- */
    if (init == DEF_TRUE) {
        pdev_cfg->Drv_API->Init(perr);
        if (*perr != SERIAL_ERR_NONE) {
             CPU_CRITICAL_EXIT();
             return;
        }
    }

    pif = &Serial_IF_Tbl[SerialIF_NbrNext];


#if (SERIAL_CFG_TX_DESC_NBR > 0)
    Mem_PoolCreate((MEM_POOL   *)&pif->TxBufPool,
                   (void       *) 0,
                   (CPU_SIZE_T  ) 0,
                   (CPU_SIZE_T  ) SERIAL_CFG_TX_DESC_NBR,
                   (CPU_SIZE_T  ) sizeof(SERIAL_BUF_DESC),
                   (CPU_SIZE_T  ) sizeof(CPU_DATA),
                   (CPU_SIZE_T *)&octets_reqd,
                   (LIB_ERR    *)&lib_err);

    if (lib_err != LIB_MEM_ERR_NONE) {
        CPU_CRITICAL_EXIT();
       *perr = SERIAL_ERR_BUF_POOL_INIT;
        return;
    }
#endif

    pif->WrSem = SerialOS_SemCreate(1 + SERIAL_CFG_TX_DESC_NBR);
    if (pif->WrSem == (void *)0) {
        CPU_CRITICAL_EXIT();
       *perr = SERIAL_ERR_SIGNAL;
        return;
    }

    pif->RdSem = SerialOS_SemCreate(1);
    if (pif->RdSem == (void *)0) {
        CPU_CRITICAL_EXIT();
       *perr = SERIAL_ERR_SIGNAL;
        return;
    }

    pif->NamePtr = pname;
    SerialIF_NbrNext++;                                         /* Update IF cnt.                                       */

    CPU_CRITICAL_EXIT();

                                                                /* ------------------- LINK DEV DESC ------------------ */
    pdev               = &pif->Dev;
    pdev->IF_Nbr       =  pif->Nbr;
    pdev->Dev_Cfg      =  pdev_cfg;
    pdev->Drv_Data     = (void                *)0;
    pdev->LineDrv_API  = (SERIAL_LINE_DRV_API *)0;
    pdev->LineDrv_Data = (void                *)0;

   *perr = SERIAL_ERR_NONE;

   (void)&rd_buf_len;
#if (SERIAL_CFG_RD_BUF_EN == DEF_ENABLED)                       /* -------------------- INIT RD BUF ------------------- */
    pif->RdBufEn = DEF_NO;

    if (rd_buf_len > 0) {                                       /* Alloc rd buf.                                        */
        pbuf_data = (CPU_INT08U *)Mem_HeapAlloc((CPU_SIZE_T  ) rd_buf_len,
                                                (CPU_SIZE_T  ) sizeof(CPU_ALIGN),
                                                (CPU_SIZE_T *)&octets_reqd,
                                                (LIB_ERR    *)&lib_err);
        if (pbuf_data == (CPU_INT08U *)0) {
           *perr = SERIAL_ERR_MEM_ALLOC;                        /* Indicate rd buf alloc failure, but continue add IF.  */
        } else {
            pif->RdBufEn  = DEF_YES;
            SerialBuf_Init((SERIAL_BUF  *)&(pif->RdBuf),
                           (CPU_INT08U  *)  pbuf_data,
                           (CPU_SIZE_T   )  rd_buf_len,
                           (CPU_BOOLEAN  )  DEF_NO);
        }
    }
#endif


   (void)&wr_buf_len;
#if (SERIAL_CFG_WR_BUF_EN == DEF_ENABLED)                       /* -------------------- INIT WR BUF ------------------- */
    pif->WrBufEn = DEF_NO;

    if (wr_buf_len > 0) {                                       /* Alloc wr buf.                                        */
        pbuf_data = (CPU_INT08U *)Mem_HeapAlloc((CPU_SIZE_T  ) wr_buf_len,
                                                (CPU_SIZE_T  ) sizeof(CPU_ALIGN),
                                                (CPU_SIZE_T *)&octets_reqd,
                                                (LIB_ERR    *)&lib_err);
        if (pbuf_data == (CPU_INT08U *)0) {
           *perr = SERIAL_ERR_MEM_ALLOC;                        /* Indicate wr buf alloc failure, but continue add IF.  */
        } else {
            pif->WrBufEn  = DEF_YES;
            SerialBuf_Init((SERIAL_BUF  *)&(pif->WrBuf),
                           (CPU_INT08U  *)  pbuf_data,
                           (CPU_SIZE_T   )  wr_buf_len,
                           (CPU_BOOLEAN  )  DEF_NO);
        }
    }
#endif


    CPU_CRITICAL_ENTER();
    pif->Init  = DEF_YES;
    pif->State = SERIAL_STATE_CLOSED;
    CPU_CRITICAL_EXIT();
}


/*$PAGE*/
/*
*********************************************************************************************************
*                                         Serial_IF_IsValid()
*
* Description : Validate serial interface number.
*
* Argument(s) : if_nbr      Serial interface number to validate.
*
*               perr        Pointer to variable that will receive the return error code from this function :
*
*                               SERIAL_ERR_NONE                 Serial interface successfully validated.
*                               SERIAL_ERR_IF_INVALID_NBR       Invalid serial interface number.
*                               SERIAL_ERR_IF_NOT_OPEN          Serial interface NOT open.
*
* Return(s)   : DEF_YES, serial interface number is valid.
*
*               DEF_NO,  otherwise.
*
* Caller(s)   : various.
*
* Note(s)     : None.
*********************************************************************************************************
*/

⌨️ 快捷键说明

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