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