📄 serial.c
字号:
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 + -