aio_core.c
来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 626 行 · 第 1/2 页
C
626 行
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/exports/posix4/src/aio_core.c</TITLE></HEAD><BODY><pre><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/* */</font><font color="#6920ac">/* Copyright (c) 1997-1999 Australian Real Time Embedded Systems */</font><font color="#6920ac">/* */</font><font color="#6920ac">/* PROPRIETARY RIGHTS of Australian Real Time Embedded Systems */</font><font color="#6920ac">/* are involved in the subject matter of this material. All reproduction,*/</font><font color="#6920ac">/* manufacturing, use, and sales rights pertaining to this subject matter*/</font><font color="#6920ac">/* are governed by the license agreement. The recipient of this software */</font><font color="#6920ac">/* implicitly accepts the terms of the license. */</font><font color="#6920ac">/* */</font><font color="#6920ac">/*************************************************************************/</font><font color="#6920ac">/************************************************************************* * * FILE NAME * * aio_core.c * * SYSTEM COMPONENT * * serial device for posix4 platform * * DESCRIPTION * * This file contains all core services for for serial device * on posix4 platform * * SERVICES * * Public services * --------------- * saio_Create - create serial aio device * saio_Delete - delete saio device * * Internal services * ----------------- * saio_TxEnable - enable/disable Tx mode * saio_RxEnable - enable/disable Rx mode * saio_TxByte - Tx byte * saio_RxByte - Rx byte * saio_Ioctl - i/o control service * saio_OpenTtyLine - open tty line * saio_closeTtyLine - close tty line * * SCCS HISTORY * * @(#)aio_core.c 1.5, 01/25/99, 00:44:02 * * AUTHOR * * Vadim N. Azarovsky * * CREATED * * 10-Jul-1998 by Vadim N. Azarovsky * * REVISION HISTORY * * NAME DATE REMARKS * **************************************************************************/</font><b><font color='DarkGreen'>#include</font></b> <a href="crt_defs.h.FIND-INC"><font color="blue">"crt_defs.h"</font></a><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (CRTX_CPU_FAMILY==CRTX_POSIX4)</font><b><font color='DarkGreen'>#include</font></b> <a href="ass_defs.h.FIND-INC"><font color="blue">"ass_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="aio_priv.h.FIND-INC"><font color="blue">"aio_priv.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="mem_defs.h.FIND-INC"><font color="blue">"mem_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="seg_defs.h.FIND-INC"><font color="blue">"seg_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="sys_defs.h.FIND-INC"><font color="blue">"sys_defs.h"</font></a><font color="#6920ac">/* create serial async device */</font><font size="+1"><i>sdrv_Desc_t</i> *<b><font color="azure1"><a name="saio_Create">saio_Create</a></font></b>( <i>saio_Desc_t</i> *pDesc_a, <i>sdrv_Desc_t</i> *pDrvDesc_a, <i>hrdi_Vector_t</i> LisrVector_a, <i>saio_Attr_t</i> *pAttr_a){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>saio_Attr_t</i> Attr; <font color="#6920ac">/* device attribute set */</font> <i>saio_Context_t</i> *pContext; <font color="#6920ac">/* device context */</font><font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <b>if</b> (pAttr_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { <font color="#6920ac">/* make default attributes */</font> Attr.pTtyLine = <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>; <font color="#6920ac">/* use stdio */</font> Attr.Segment = <a href="SEGM_DEF_SEGMENT.FIND-DEF">SEGM_DEF_SEGMENT</a>; <font color="#6920ac">/* default memory segment */</font> } <b>else</b> { Attr = *pAttr_a; <font color="#6920ac">/* use attribute set provided */</font> } <font color="#6920ac">/* allocate device descriptor */</font> <b>if</b> (pDesc_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { pDesc_a = (<i>saio_Desc_t</i>*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(Attr.Segment, <i>sizeof</i>(<i>saio_Desc_t</i>), <i>sizeof</i>(<i>crtx_Unsigned_t</i>)); <b>if</b> ((<i>crtx_Void_t</i>*)pDesc_a == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>) { <font color="#6920ac">/* memory allocation error */</font> <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> DescAllocError_Exc; } pDesc_a->Flags = <a href="SAIO_FLAG_INIT.FIND-DEF">SAIO_FLAG_INIT</a> | <a href="SAIO_FLAG_DESC_ALLOC.FIND-DEF">SAIO_FLAG_DESC_ALLOC</a>; } <b>else</b> { pDesc_a->Flags = <a href="SAIO_FLAG_INIT.FIND-DEF">SAIO_FLAG_INIT</a>; } <a href="SAIO_SET_DESC_ID.FIND-DEF">SAIO_SET_DESC_ID</a>(pDesc_a); <font color="#6920ac">/* allocate driver's descriptor */</font> <b>if</b> (pDrvDesc_a == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { pDrvDesc_a = (<i>sdrv_Desc_t</i>*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(Attr.Segment, <i>sizeof</i>(<i>sdrv_Desc_t</i>), <i>sizeof</i>(<i>crtx_Unsigned_t</i>)); <b>if</b> ((<i>crtx_Void_t</i>*)pDrvDesc_a == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>) { <font color="#6920ac">/* memory allocation error */</font> <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> DrvDescAllocError_Exc; } pDesc_a->Flags |= <a href="SAIO_FLAG_DRV_DESC_ALLOC.FIND-DEF">SAIO_FLAG_DRV_DESC_ALLOC</a>; } <font color="#6920ac">/* allocate context structure */</font> pContext = (<i>saio_Context_t</i>*)<a href="dmem_Alloc.FIND-FUNC">dmem_Alloc</a>(Attr.Segment, <i>sizeof</i>(<i>saio_Context_t</i>), <i>sizeof</i>(<i>crtx_Unsigned_t</i>)); <b>if</b> ((<i>crtx_Void_t</i>*)pContext == (<i>crtx_Void_t</i>*)<a href="DMEM_ILLEGAL.FIND-DEF">DMEM_ILLEGAL</a>) { <font color="#6920ac">/* memory allocation error */</font> <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> ContextAllocError_Exc; } <a href="SAIO_SET_CONTEXT_ID.FIND-DEF">SAIO_SET_CONTEXT_ID</a>(pContext); <font color="#6920ac">/* initialide descriptor */</font> pDesc_a->LisrVector = LisrVector_a; pDesc_a->pContext = pContext; pDesc_a->pDrvDesc = pDrvDesc_a; pDesc_a->Attr = Attr; <b>if</b> (Attr.pTtyLine == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { <font color="#6920ac">/* use stdio files */</font> pDesc_a->RxFileDesc = 0; <font color="#6920ac">/* stdin */</font> pDesc_a->TxFileDesc = 1; <font color="#6920ac">/* stdout */</font> } <b>else</b> { <font color="#6920ac">/* open tty line */</font> <b>if</b> (<a href="#saio_OpenTtyLine">saio_OpenTtyLine</a>(pDesc_a) == <a href="CRTX_FALSE.FIND-DEF">CRTX_FALSE</a>) <a href="CRTX_EXCEPTION.FIND-DEF">CRTX_EXCEPTION</a> TtyLineError_Exc; } <font color="#6920ac">/* initialise contexts */</font> <font color="#6920ac">/* Rx signal context */</font> pContext->SigContext[saio_Rx_e].Code = saio_Rx_e; pContext->SigContext[saio_Rx_e].AioCB.aio_fildes = pDesc_a->RxFileDesc; pContext->SigContext[saio_Rx_e].AioCB.aio_offset = 0; pContext->SigContext[saio_Rx_e].AioCB.aio_sigevent.sigev_notify = <a href="SIGEV_SIGNAL.FIND-DEF">SIGEV_SIGNAL</a>; <font color="#6920ac">/* use signals to simulate hardware interrupts */</font> pContext->SigContext[saio_Rx_e].AioCB.aio_sigevent.sigev_signo = <a href="psx4_VecToSignal.FIND-FUNC">psx4_VecToSignal</a>(pDesc_a->LisrVector); pContext->SigContext[saio_Rx_e].AioCB.aio_sigevent.sigev_value.sival_ptr = (<i>crtx_Void_t</i>*)&pContext->SigContext[saio_Rx_e]; pContext->SigContext[saio_Rx_e].AioCB.aio_buf = pContext->SigContext[saio_Rx_e].Buffer; pContext->SigContext[saio_Rx_e].AioCB.aio_nbytes = 1; pContext->SigContext[saio_Rx_e].AioCB.aio_reqprio = 0; <font color="#6920ac">/* Tx signal context */</font> pContext->SigContext[saio_Tx_e].Code = saio_Tx_e; pContext->SigContext[saio_Tx_e].AioCB.aio_fildes = pDesc_a->TxFileDesc; pContext->SigContext[saio_Tx_e].AioCB.aio_offset = 0; pContext->SigContext[saio_Tx_e].AioCB.aio_sigevent.sigev_notify = <a href="SIGEV_SIGNAL.FIND-DEF">SIGEV_SIGNAL</a>; <font color="#6920ac">/* use signals to simulate hardware interrupts */</font> pContext->SigContext[saio_Tx_e].AioCB.aio_sigevent.sigev_signo = <a href="psx4_VecToSignal.FIND-FUNC">psx4_VecToSignal</a>(pDesc_a->LisrVector); pContext->SigContext[saio_Tx_e].AioCB.aio_sigevent.sigev_value.sival_ptr = (<i>crtx_Void_t</i>*)&pContext->SigContext[saio_Tx_e]; pContext->SigContext[saio_Tx_e].AioCB.aio_buf = pContext->SigContext[saio_Tx_e].Buffer; pContext->SigContext[saio_Tx_e].AioCB.aio_nbytes = 1; pContext->SigContext[saio_Tx_e].AioCB.aio_reqprio = 0; pContext->LisrVector = LisrVector_a; <font color="#6920ac">/* following field are provided for infomation and debugging only */</font> pContext->pTtyLine = pDesc_a->Attr.pTtyLine; pContext->Baud = pDesc_a->Attr.Baud; pContext->Bits = pDesc_a->Attr.Bits; pContext->Stop = pDesc_a->Attr.Stop; <font color="#6920ac">/* setup tty mode */</font> <font color="#6920ac">/* FIX ME: to be done */</font> <font color="#6920ac">/* initialise driver's descriptor */</font> pDrvDesc_a->InterIn = LisrVector_a; pDrvDesc_a->InterOut = LisrVector_a; pDrvDesc_a->pContext = (<i>crtx_Void_t</i>*)pContext; pDrvDesc_a->SndByte = saio_TxByte; pDrvDesc_a->SndEnable = saio_TxEnable; pDrvDesc_a->RcvByte = saio_RxByte; pDrvDesc_a->RcvEnable = saio_TxEnable; pDrvDesc_a->Ioctl = saio_Ioctl; pDrvDesc_a->Flags = ( <a href="SDRV_FLAG_DEFAULT.FIND-DEF">SDRV_FLAG_DEFAULT</a> ); <font color="#6920ac">/* activate Rx interrupts */</font> <b>if</b> (<a href="aio_read.FIND-FUNC">aio_read</a>(&pContext->SigContext[saio_Rx_e].AioCB) != 0) { <a href="syst_Fatal.FIND-FUNC">syst_Fatal</a>(<font color="DarkGreen">"saio_Create: aio_read: errno=%d %s\n"</font>, errno, <a href="strerror.FIND-FUNC">strerror</a>(errno)); } <b>return</b> pDrvDesc_a;<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font><font color="#6920ac">#if 0SerDrvCreateError_Exc: /* restore tty mode */ /* FIX ME: to be done */ /* close tty line */ if (pDesc_a->Attr.pTtyLine) saio_CloseTtyLine(pDesc_a); /* FALL-THROUGH */#endif</font><font color="blue">TtyLineError_Exc:</font> <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(Attr.Segment, (<i>crtx_Void_t</i>*)pContext, <i>sizeof</i>(<i>saio_Context_t</i>)); <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">ContextAllocError_Exc:</font> <b>if</b> (pDesc_a->Flags & <a href="SAIO_FLAG_DRV_DESC_ALLOC.FIND-DEF">SAIO_FLAG_DRV_DESC_ALLOC</a>) <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(Attr.Segment, (<i>crtx_Void_t</i>*)pDrvDesc_a, <i>sizeof</i>(<i>sdrv_Desc_t</i>)); <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">DrvDescAllocError_Exc:</font> <b>if</b> (pDesc_a->Flags & <a href="SAIO_FLAG_DESC_ALLOC.FIND-DEF">SAIO_FLAG_DESC_ALLOC</a>) <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(Attr.Segment, (<i>crtx_Void_t</i>*)pDesc_a, <i>sizeof</i>(<i>saio_Desc_t</i>)); <font color="#6920ac">/* FALL-THROUGH */</font><font color="blue">DescAllocError_Exc:</font> <b>return</b> <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>;}<font color="#6920ac">/* delete serial i/o device */</font><font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="saio_Delete">saio_Delete</a></font></b>( <i>saio_Desc_t</i> *pDesc_a){</font><font color="#6920ac">/********************* * LOCAL VARIABLES * *********************/</font> <i>saio_Context_t</i> *pContext;<font color="#6920ac">/********************* * PROCEDURE LOGIC * *********************/</font> <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(pDesc_a) <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="SAIO_CHECK_DESC_ID.FIND-DEF">SAIO_CHECK_DESC_ID</a>(pDesc_a)) pContext = (<i>saio_Context_t</i>*)pDesc_a->pContext; <a href="CRTX_ASSERT.FIND-DEF">CRTX_ASSERT</a>(<a href="SAIO_CHECK_CONTEXT_ID.FIND-DEF">SAIO_CHECK_CONTEXT_ID</a>(pContext)) <font color="#6920ac">/* delete seral driver */</font> <a href="sdrv_Delete.FIND-FUNC">sdrv_Delete</a>(pDesc_a->pDrvDesc); <font color="#6920ac">/* cancel aio requests */</font> <a href="aio_cancel.FIND-FUNC">aio_cancel</a>(pContext->SigContext[saio_Rx_e].AioCB.aio_fildes, &pContext->SigContext[saio_Rx_e].AioCB); <a href="aio_cancel.FIND-FUNC">aio_cancel</a>(pContext->SigContext[saio_Rx_e].AioCB.aio_fildes, &pContext->SigContext[saio_Tx_e].AioCB); <font color="#6920ac">/* reset I/O files status */</font> <font color="#6920ac">/* FIX ME: to be done */</font> <font color="#6920ac">/* close tty line */</font> <b>if</b> (pDesc_a->Attr.pTtyLine) <a href="#saio_CloseTtyLine">saio_CloseTtyLine</a>(pDesc_a); <font color="#6920ac">/* release context structure */</font><b><font color='DarkGreen'>#if</font></b><font color="maroon"> ENVI_CRTX_ERR_CHECK_LEVEL > 0</font> <a href="CRTX_SET_NO_ID.FIND-DEF">CRTX_SET_NO_ID</a>(pContext); <font color="#6920ac">/* no id */</font><b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* ENVI_CRTX_ERR_CHECK_LEVEL > 0 */</font></font> <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pDesc_a->Attr.Segment, (<i>crtx_Void_t</i>*)pContext, <i>sizeof</i>(<i>saio_Context_t</i>)); <font color="#6920ac">/* release driver descriptor */</font> <b>if</b> (pDesc_a->Flags & <a href="SAIO_FLAG_DRV_DESC_ALLOC.FIND-DEF">SAIO_FLAG_DRV_DESC_ALLOC</a>) <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pDesc_a->Attr.Segment, (<i>crtx_Void_t</i>*)pDesc_a->pDrvDesc, <i>sizeof</i>(<i>sdrv_Desc_t</i>)); <font color="#6920ac">/* release device descriptor */</font><b><font color='DarkGreen'>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?