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->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->Flags &= ~<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->pConvCode; <b>break</b>; <b>case</b> <a href="SDRV_IOCTL_SET_CONV.FIND-DEF">SDRV_IOCTL_SET_CONV</a>: pDesc->pConvCode = pAttr_a; <b>break</b>; <font color="blue"><b>default</b>:</font> <b>if</b> ( pDesc->Ioctl != <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) { (*pDesc->Ioctl)(pDesc->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>(&pDesc_a->InpLock); <b>if</b> ( pDesc_a->pBufIn == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) { pYesRcv = (<i>crtx_Int_t</i> <i>volatile</i> *)&pDesc_a->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>(&pDesc_a->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>(&pDesc_a->InpLock); <b>return</b> -1; } } Result = ( <i>crtx_Char_t</i> )pDesc_a->BufInWriteCount; <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a->SoftIntIn )); pDesc_a->BufInReadCount = 0; <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a->SoftIntIn )); } <b>else</b> { pReadCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&pDesc_a->BufInReadCount; pWriteCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&pDesc_a->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>(&pDesc_a->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>(&pDesc_a->InpLock); <b>return</b> -1; } } Result = pDesc_a->pBufIn[pDesc_a->BufInReadCount]; <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a->SoftIntIn )); pDesc_a->BufInReadCount = ( ( pDesc_a->BufInReadCount + 1) % pDesc_a->BufInSize); <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a->SoftIntIn )); } <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&pDesc_a->InpLock); <b>if</b> ((pDesc_a->Flags & <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->pBufOut == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) { pCanSnd = (<i>crtx_Int_t</i> <i>volatile</i> *)&pDesc->BufOutReadCount; <font color="#6920ac">/* wait for character */</font> <b>while</b> (*pCanSnd != 0) { <a href="evnt_Wait.FIND-FUNC">evnt_Wait</a>(&pDesc->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->SoftIntOut)); pDesc->BufOutWriteCount = Byte_a; pDesc->BufOutReadCount = 1; <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc->SoftIntOut )); } <b>else</b> { pReadCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&pDesc->BufOutReadCount; pWriteCount = (<i>crtx_Int_t</i> <i>volatile</i> *)&pDesc->BufOutWriteCount; <font color="#6920ac">/* wait for place ina buffer for character */</font> <b>while</b> (*pReadCount == ((*pWriteCount + 1) % pDesc->BufOutSize)) { <a href="evnt_Wait.FIND-FUNC">evnt_Wait</a>(&pDesc->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->SoftIntOut)); pDesc->pBufOut[pDesc->BufOutWriteCount] = Byte_a; pDesc->BufOutWriteCount = ( ( pDesc->BufOutWriteCount + 1) % pDesc->BufOutSize); <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc->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>(&pDesc->OutLock); Number = 0; pOutStr = &Byte_a; <b>if</b> (pDesc->pConvCode != <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a> ) { <b>for</b> (i=0; ; ) { Number = pDesc->pConvCode[i]; <b>if</b> (Number == 0) { <b>break</b>; } i++; <b>if</b> (pDesc->pConvCode[i] == Byte_a) { pOutStr = &pDesc->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 > 0); <a href="rrlc_Unlock.FIND-FUNC">rrlc_Unlock</a>(&pDesc->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 < 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 < Size_a; i++) { ch = <a href="#sdrv_Getct">sdrv_Getct</a>(pDesc_a, pTimeout_a); <b>if</b> (ch < 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 < 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 + -
显示快捷键?