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-&gt;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-&gt;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-&gt;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-&gt;LisrVector = LisrVector_a;    pDesc_a-&gt;pContext   = pContext;    pDesc_a-&gt;pDrvDesc   = pDrvDesc_a;    pDesc_a-&gt;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-&gt;RxFileDesc = 0;        <font color="#6920ac">/* stdin */</font>        pDesc_a-&gt;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-&gt;SigContext[saio_Rx_e].Code = saio_Rx_e;    pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_fildes = pDesc_a-&gt;RxFileDesc;    pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_offset = 0;    pContext-&gt;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-&gt;SigContext[saio_Rx_e].AioCB.aio_sigevent.sigev_signo =         <a href="psx4_VecToSignal.FIND-FUNC">psx4_VecToSignal</a>(pDesc_a-&gt;LisrVector);    pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_sigevent.sigev_value.sival_ptr =        (<i>crtx_Void_t</i>*)&amp;pContext-&gt;SigContext[saio_Rx_e];    pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_buf =         pContext-&gt;SigContext[saio_Rx_e].Buffer;    pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_nbytes = 1;    pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_reqprio = 0;    <font color="#6920ac">/* Tx signal context */</font>    pContext-&gt;SigContext[saio_Tx_e].Code = saio_Tx_e;    pContext-&gt;SigContext[saio_Tx_e].AioCB.aio_fildes = pDesc_a-&gt;TxFileDesc;    pContext-&gt;SigContext[saio_Tx_e].AioCB.aio_offset = 0;    pContext-&gt;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-&gt;SigContext[saio_Tx_e].AioCB.aio_sigevent.sigev_signo =         <a href="psx4_VecToSignal.FIND-FUNC">psx4_VecToSignal</a>(pDesc_a-&gt;LisrVector);    pContext-&gt;SigContext[saio_Tx_e].AioCB.aio_sigevent.sigev_value.sival_ptr =        (<i>crtx_Void_t</i>*)&amp;pContext-&gt;SigContext[saio_Tx_e];    pContext-&gt;SigContext[saio_Tx_e].AioCB.aio_buf =         pContext-&gt;SigContext[saio_Tx_e].Buffer;    pContext-&gt;SigContext[saio_Tx_e].AioCB.aio_nbytes = 1;    pContext-&gt;SigContext[saio_Tx_e].AioCB.aio_reqprio = 0;    pContext-&gt;LisrVector = LisrVector_a;    <font color="#6920ac">/* following field are provided for infomation and debugging only */</font>    pContext-&gt;pTtyLine = pDesc_a-&gt;Attr.pTtyLine;    pContext-&gt;Baud     = pDesc_a-&gt;Attr.Baud;    pContext-&gt;Bits     = pDesc_a-&gt;Attr.Bits;    pContext-&gt;Stop     = pDesc_a-&gt;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-&gt;InterIn      = LisrVector_a;    pDrvDesc_a-&gt;InterOut     = LisrVector_a;    pDrvDesc_a-&gt;pContext     = (<i>crtx_Void_t</i>*)pContext;    pDrvDesc_a-&gt;SndByte      = saio_TxByte;    pDrvDesc_a-&gt;SndEnable    = saio_TxEnable;    pDrvDesc_a-&gt;RcvByte      = saio_RxByte;    pDrvDesc_a-&gt;RcvEnable    = saio_TxEnable;    pDrvDesc_a-&gt;Ioctl        = saio_Ioctl;    pDrvDesc_a-&gt;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>(&amp;pContext-&gt;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-&gt;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-&gt;Flags &amp; <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-&gt;Flags &amp; <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-&gt;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-&gt;pDrvDesc);    <font color="#6920ac">/* cancel aio requests */</font>    <a href="aio_cancel.FIND-FUNC">aio_cancel</a>(pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_fildes,               &amp;pContext-&gt;SigContext[saio_Rx_e].AioCB);    <a href="aio_cancel.FIND-FUNC">aio_cancel</a>(pContext-&gt;SigContext[saio_Rx_e].AioCB.aio_fildes,               &amp;pContext-&gt;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-&gt;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 &gt; 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 &gt; 0 */</font></font>    <a href="dmem_Free.FIND-FUNC">dmem_Free</a>(pDesc_a-&gt;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-&gt;Flags &amp; <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-&gt;Attr.Segment, (<i>crtx_Void_t</i>*)pDesc_a-&gt;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 + -
显示快捷键?