sdr_core.c

来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 666 行 · 第 1/2 页

C
666
字号
<font color="blue">ErrCreateLock_Exc:</font><font color="blue">ErrCreateEvent_Exc:</font><font color="blue">ErrCreateSoft_Exc:</font><font color="blue">ErrCreateHandle2_Exc:</font><font color="blue">ErrCreateHandle1_Exc:</font><font color="blue">ErrWrongDesc_Exc:</font><font color="blue">ErrNullDesc_Exc:</font>    <b>return</b>(<a href="SDRV_FALSE.FIND-DEF">SDRV_FALSE</a>);}<font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_Delete">sdrv_Delete</a></font></b>(<i>sdrv_Desc_t</i> *pDesc_a){</font>    <b>if</b> ( pDesc_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrNullDesc_Exc;    }    <b>return</b>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font>    <font color="#6920ac">/* deallocate interrupt service routines */</font><font color="blue">ErrNullDesc_Exc:</font>    <b>return</b>;}<font size="+1"><i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_Ioctl">sdrv_Ioctl</a></font></b>(    <i>crtx_Int_t</i>  Command_a,    <i>crtx_Void_t</i> *pAttr_a,     <i>crtx_Void_t</i> *pDesc_a){</font>    <i>sdrv_Desc_t</i>  *pDesc;    pDesc = (<i>sdrv_Desc_t</i> *)pDesc_a;    <b>if</b> ( pDesc == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrNullDesc_Exc;    }    <b>switch</b> (Command_a)    {        <b>case</b> <a href="SDRV_IOCTL_ECHO_ON.FIND-DEF">SDRV_IOCTL_ECHO_ON</a>:            pDesc-&gt;Flags |= <a href="SDRV_FLAG_ECHO.FIND-DEF">SDRV_FLAG_ECHO</a>;            <b>break</b>;        <b>case</b> <a href="SDRV_IOCTL_ECHO_OFF.FIND-DEF">SDRV_IOCTL_ECHO_OFF</a>:            pDesc-&gt;Flags &amp;= ~<a href="SDRV_FLAG_ECHO.FIND-DEF">SDRV_FLAG_ECHO</a>;            <b>break</b>;        <b>case</b> <a href="SDRV_IOCTL_GET_CONV.FIND-DEF">SDRV_IOCTL_GET_CONV</a>:            <b>if</b> (pAttr_a)                *((<i>crtx_Void_t</i>**)pAttr_a) = pDesc-&gt;pConvCode;            <b>break</b>;        <b>case</b> <a href="SDRV_IOCTL_SET_CONV.FIND-DEF">SDRV_IOCTL_SET_CONV</a>:            pDesc-&gt;pConvCode = pAttr_a;            <b>break</b>;        <font color="blue"><b>default</b>:</font>            <b>if</b> ( pDesc-&gt;Ioctl != <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)            {                (*pDesc-&gt;Ioctl)(pDesc-&gt;pContext, Command_a, pAttr_a);            }            <b>break</b>;    }    <b>return</b>;<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">ErrNullDesc_Exc:</font>    <b>return</b>;}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Getc">sdrv_Getc</a></font></b>(<i>sdrv_Desc_t</i> *pDesc_a){</font>    <b>return</b> <a href="#sdrv_Getct">sdrv_Getct</a>(pDesc_a, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>);}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Getct">sdrv_Getct</a></font></b>(    <i>sdrv_Desc_t</i>     *pDesc_a,     <i>tick_Timeout_t</i>  *pTimeout_a){</font>    <i>crtx_Int_t</i> <i>volatile</i> *pYesRcv;    <i>crtx_Int_t</i> <i>volatile</i> *pReadCount;    <i>crtx_Int_t</i> <i>volatile</i> *pWriteCount;    <i>crtx_Char_t</i> Result;    <a href="rrlc_Lock.FIND-FUNC">rrlc_Lock</a>(&amp;pDesc_a-&gt;InpLock);    <b>if</b> ( pDesc_a-&gt;pBufIn == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        pYesRcv = (<i>crtx_Int_t</i> <i>volatile</i> *)&amp;pDesc_a-&gt;BufInReadCount;        <font color="#6920ac">/* wait for character */</font>        <b>while</b> (*pYesRcv == 0)        {            <b>if</b> (<a href="evnt_Wait.FIND-FUNC">evnt_Wait</a>(&amp;pDesc_a-&gt;InpEvent, 1, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, <a href="EVNT_CONSUME.FIND-DEF">EVNT_CONSUME</a>,                          pTimeout_a) == <a href="EVNT_ERR_NO_EVENTS.FIND-DEF">EVNT_ERR_NO_EVENTS</a>)            {                <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;pDesc_a-&gt;InpLock);                <b>return</b> -1;            }        }        Result = ( <i>crtx_Char_t</i> )pDesc_a-&gt;BufInWriteCount;                <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a-&gt;SoftIntIn ));        pDesc_a-&gt;BufInReadCount = 0;        <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a-&gt;SoftIntIn ));    }    <b>else</b>    {        pReadCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&amp;pDesc_a-&gt;BufInReadCount;        pWriteCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&amp;pDesc_a-&gt;BufInWriteCount;        <font color="#6920ac">/* wait for character */</font>        <b>while</b> (*pReadCount == *pWriteCount)        {            <b>if</b> (<a href="evnt_Wait.FIND-FUNC">evnt_Wait</a>(&amp;pDesc_a-&gt;InpEvent, 1, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>, <a href="EVNT_CONSUME.FIND-DEF">EVNT_CONSUME</a>,                          pTimeout_a) == <a href="EVNT_ERR_NO_EVENTS.FIND-DEF">EVNT_ERR_NO_EVENTS</a>)            {                <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;pDesc_a-&gt;InpLock);                <b>return</b> -1;            }        }        Result = pDesc_a-&gt;pBufIn[pDesc_a-&gt;BufInReadCount];        <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a-&gt;SoftIntIn ));        pDesc_a-&gt;BufInReadCount = ( ( pDesc_a-&gt;BufInReadCount + 1) %                                    pDesc_a-&gt;BufInSize);        <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a-&gt;SoftIntIn ));    }    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;pDesc_a-&gt;InpLock);    <b>if</b> ((pDesc_a-&gt;Flags &amp; <a href="SDRV_FLAG_ECHO.FIND-DEF">SDRV_FLAG_ECHO</a>) != 0)    {        <a href="#sdrv_Putc">sdrv_Putc</a>((<i>crtx_Char_t</i>)Result, pDesc_a);    }    <b>return</b> (<i>crtx_Int_t</i>)Result;}<font size="+1"><i>static</i> <i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_PutcCore">sdrv_PutcCore</a></font></b>(<i>crtx_Char_t</i> Byte_a, <i>crtx_Void_t</i> *pDesc_a){</font>    <i>crtx_Int_t</i> <i>volatile</i> *pCanSnd;    <i>crtx_Int_t</i> <i>volatile</i> *pReadCount;    <i>crtx_Int_t</i> <i>volatile</i> *pWriteCount;    <i>sdrv_Desc_t</i>  *pDesc;    pDesc = (<i>sdrv_Desc_t</i> *)pDesc_a;        <b>if</b> ( pDesc-&gt;pBufOut == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        pCanSnd = (<i>crtx_Int_t</i> <i>volatile</i> *)&amp;pDesc-&gt;BufOutReadCount;        <font color="#6920ac">/* wait for character */</font>        <b>while</b> (*pCanSnd != 0)        {            <a href="evnt_Wait.FIND-FUNC">evnt_Wait</a>(&amp;pDesc-&gt;OutEvent, 1,<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>,<a href="EVNT_CONSUME.FIND-DEF">EVNT_CONSUME</a>,<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>);        }        <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>(<a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(pDesc-&gt;SoftIntOut));        pDesc-&gt;BufOutWriteCount = Byte_a;        pDesc-&gt;BufOutReadCount = 1;        <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc-&gt;SoftIntOut ));    }    <b>else</b>    {        pReadCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&amp;pDesc-&gt;BufOutReadCount;        pWriteCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&amp;pDesc-&gt;BufOutWriteCount;        <font color="#6920ac">/* wait for place ina buffer for character */</font>        <b>while</b> (*pReadCount == ((*pWriteCount + 1) % pDesc-&gt;BufOutSize))        {            <a href="evnt_Wait.FIND-FUNC">evnt_Wait</a>(&amp;pDesc-&gt;OutEvent, 1,<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>,<a href="EVNT_CONSUME.FIND-DEF">EVNT_CONSUME</a>,<a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>);        }        <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>(<a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(pDesc-&gt;SoftIntOut));        pDesc-&gt;pBufOut[pDesc-&gt;BufOutWriteCount] = Byte_a;        pDesc-&gt;BufOutWriteCount = ( ( pDesc-&gt;BufOutWriteCount + 1) %                                      pDesc-&gt;BufOutSize);        <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc-&gt;SoftIntOut ));    }    <b>return</b>(0);}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Putc">sdrv_Putc</a></font></b>(<i>crtx_Char_t</i> Byte_a, <i>crtx_Void_t</i> *pDesc_a){</font>    <i>sdrv_Desc_t</i>  *pDesc;    <i>crtx_Int_t</i>   Report;    <i>crtx_Int_t</i>   i;    <i>crtx_Int_t</i>   Number;    <i>crtx_Char_t</i>  *pOutStr;    pDesc = (<i>sdrv_Desc_t</i> *)pDesc_a;    <a href="rrlc_Lock.FIND-FUNC">rrlc_Lock</a>(&amp;pDesc-&gt;OutLock);    Number = 0;    pOutStr = &amp;Byte_a;    <b>if</b> (pDesc-&gt;pConvCode != <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a> )    {        <b>for</b> (i=0; ; )        {            Number = pDesc-&gt;pConvCode[i];            <b>if</b> (Number == 0)            {                <b>break</b>;            }            i++;            <b>if</b> (pDesc-&gt;pConvCode[i] == Byte_a)            {                pOutStr = &amp;pDesc-&gt;pConvCode[i + 1];                <b>break</b>;            }            i += 1 + Number;        }    }    <b>do</b>    {        Report = <a href="#sdrv_PutcCore">sdrv_PutcCore</a>( *pOutStr++, pDesc_a);        Number--;    } <b>while</b> (Number &gt; 0);    <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&amp;pDesc-&gt;OutLock);    <b>return</b>(Report);}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Read">sdrv_Read</a></font></b>(    <i>crtx_Char_t</i> *pBuf_a,    <i>crtx_Int_t</i> Size_a,     <i>sdrv_Desc_t</i> *pDesc_a){</font>    <i>crtx_Int_t</i> i;    <b>if</b> (pDesc_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongParam_Exc;    }    <b>if</b> (pBuf_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongParam_Exc;    }    <b>for</b> (i = 0; i &lt; Size_a; i++)    {        pBuf_a[i] = <a href="#sdrv_Getct">sdrv_Getct</a>( pDesc_a, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a> );    }    <b>return</b>(i);<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">ErrWrongParam_Exc:</font>    <b>return</b>(-1);}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Readt">sdrv_Readt</a></font></b>(    <i>crtx_Char_t</i> *pBuf_a,    <i>crtx_Int_t</i> Size_a,     <i>sdrv_Desc_t</i> *pDesc_a,    <i>tick_Timeout_t</i> *pTimeout_a){</font>    <i>crtx_Int_t</i> i, ch;    <b>if</b> (pDesc_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongParam_Exc;    }    <b>if</b> (pBuf_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongParam_Exc;    }    <b>for</b> (i = 0; i &lt; Size_a; i++)    {        ch = <a href="#sdrv_Getct">sdrv_Getct</a>(pDesc_a, pTimeout_a);        <b>if</b> (ch &lt; 0)            <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrTimeout_Exc;        pBuf_a[i] = ch;    }    <b>return</b>(i);<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">ErrWrongParam_Exc:</font><font color="blue">ErrTimeout_Exc:</font>    <b>return</b>(-1);}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Write">sdrv_Write</a></font></b>(<i>crtx_Char_t</i> *pBuf_a,                      <i>crtx_Int_t</i> Size_a, <i>sdrv_Desc_t</i> *pDesc_a){</font>    <i>crtx_Int_t</i> i;    <b>if</b> (pDesc_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongParam_Exc;    }    <b>if</b> (pBuf_a == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>)    {        <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongParam_Exc;    }    <b>for</b> (i = 0; i &lt; Size_a; i++)    {        <a href="#sdrv_Putc">sdrv_Putc</a>(pBuf_a[i], pDesc_a);    }    <b>return</b>(i);<font color="#6920ac">/************************ *  EXCEPTION HANDLING  * ************************/</font><font color="blue">ErrWrongParam_Exc:</font>    <b>return</b>(-1);}</pre></BODY></HTML>

⌨️ 快捷键说明

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