sdr_core.c
来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 666 行 · 第 1/2 页
C
666 行
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/excore/src/sdr_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 * * sdr_core.c * * SYSTEM COMPONENT * * Thread Management Component * * DESCRIPTION * * This file contains all core services for * serial driver * * SERVICES * * * SCCS HISTORY * * @(#)sdr_core.c 1.11, 03/06/00, 19:46:24 * * AUTHOR * * Victor Gorine * * CREATED * * 10-Apr-1998 by Victor Gorine * * REVISION HISTORY * * NAME DATE REMARKS * **************************************************************************/</font><b><font color='DarkGreen'>#include</font></b> <a href="hwi_defs.h.FIND-INC"><font color="blue">"hwi_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="swi_defs.h.FIND-INC"><font color="blue">"swi_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="sdr_defs.h.FIND-INC"><font color="blue">"sdr_defs.h"</font></a><font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_IsrPutByte">sdrv_IsrPutByte</a></font></b>(<i>crtx_Void_t</i> *pContext_a){</font> <i>sdrv_Desc_t</i> *pDesc; pDesc = (<i>sdrv_Desc_t</i> *)pContext_a; <b>if</b> (pDesc->HisrComplete != <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { (*pDesc->HisrComplete)(pDesc->pContext); } <a href="sfti_Trigger.FIND-FUNC">sfti_Trigger</a>(pDesc->SoftIntOut); <b>return</b>;}<font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_SftiHandlerOut">sdrv_SftiHandlerOut</a></font></b>(<i>crtx_Void_t</i> *pContext_a){</font> <i>sdrv_Desc_t</i> *pDesc; <i>crtx_Bool_t</i> NeedEvent; pDesc = (<i>sdrv_Desc_t</i> *)pContext_a; NeedEvent = ( ((pDesc->pBufOut == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) && (pDesc->BufOutReadCount != 0)) || ((pDesc->pBufOut != <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) && (pDesc->BufOutReadCount == ((pDesc->BufOutWriteCount + 1) % pDesc->BufOutSize)))); <font color="#6920ac">/* interrupt is disabled at this point */</font> <b>if</b> (pDesc->pBufOut == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) { <b>if</b> (pDesc->BufOutReadCount != 0) { <font color="#6920ac">/* send a byte, it was */</font> (*pDesc->SndByte)(pDesc->pContext, (<i>crtx_Char_t</i>)pDesc->BufOutWriteCount); pDesc->BufOutReadCount = 0; <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>(<a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(pDesc->SoftIntOut)); } } <b>else</b> { <b>if</b> (pDesc->BufOutReadCount != pDesc->BufOutWriteCount) { <i>crtx_Byte_t</i> Byte = pDesc->pBufOut[pDesc->BufOutReadCount]; (*pDesc->SndByte)(pDesc->pContext, Byte); pDesc->BufOutReadCount = ((pDesc->BufOutReadCount + 1) % pDesc->BufOutSize); } <b>if</b> (pDesc->BufOutReadCount == pDesc->BufOutWriteCount) { <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>(<a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>(pDesc->SoftIntOut)); } } <b>if</b> ( NeedEvent ) { <a href="evnt_Set.FIND-FUNC">evnt_Set</a>(&pDesc->OutEvent,1); } <b>return</b>;} <font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_IsrGetByte">sdrv_IsrGetByte</a></font></b>(<i>crtx_Void_t</i> *pContext_a){</font> <i>sdrv_Desc_t</i> *pDesc; <i>crtx_Int_t</i> Report; pDesc = (<i>sdrv_Desc_t</i> *)pContext_a; Report = (*pDesc->RcvByte)(pDesc->pContext); <b>if</b> (pDesc->pBufIn == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) { <b>if</b> (pDesc->BufInReadCount == 0) { pDesc->BufInWriteCount = Report; pDesc->BufInReadCount = 1; } } <b>else</b> { <b>if</b> (pDesc->BufInReadCount != ((pDesc->BufInWriteCount + 1) % pDesc->BufInSize)) { pDesc->pBufIn[pDesc->BufInWriteCount] = Report; pDesc->BufInWriteCount = ((pDesc->BufInWriteCount + 1) % pDesc->BufInSize); } } <a href="sfti_Trigger.FIND-FUNC">sfti_Trigger</a>(pDesc->SoftIntIn); <b>return</b>;}<font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_SftiHandlerIn">sdrv_SftiHandlerIn</a></font></b>(<i>crtx_Void_t</i> *pContext_a){</font> <i>sdrv_Desc_t</i> *pDesc; <i>crtx_Bool_t</i> NeedEvent; pDesc = (<i>sdrv_Desc_t</i> *)pContext_a; <font color="#6920ac">/* disable input interrupt */</font> NeedEvent = ( ((pDesc->pBufIn == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) && (pDesc->BufInReadCount != 0)) || ((pDesc->pBufIn != <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) && (pDesc->BufInReadCount != pDesc->BufInWriteCount))); <b>if</b> ( NeedEvent ) { <a href="evnt_Set.FIND-FUNC">evnt_Set</a>(&pDesc->InpEvent,1); } <b>return</b>;}<font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="sdrv_IsrGetPutByte">sdrv_IsrGetPutByte</a></font></b>(<i>crtx_Void_t</i> *pContext_a){</font> <i>sdrv_Desc_t</i> *pDesc; <i>crtx_Int_t</i> IntType; pDesc = (<i>sdrv_Desc_t</i> *)pContext_a; <font color="#6920ac">/* check that there is something to be received */</font> <b>if</b> ((*pDesc->Ioctl)(pDesc->pContext, <a href="SDRV_IOCTL_DETECT_INT_TYPE.FIND-DEF">SDRV_IOCTL_DETECT_INT_TYPE</a>, &IntType)) { <b>switch</b> (IntType) { <b>case</b> <a href="SDRV_INPUT_DETECTED.FIND-DEF">SDRV_INPUT_DETECTED</a>: <a href="#sdrv_IsrGetByte">sdrv_IsrGetByte</a>(pContext_a); <b>break</b>; <b>case</b> <a href="SDRV_OUTPUT_DETECTED.FIND-DEF">SDRV_OUTPUT_DETECTED</a>: <a href="#sdrv_IsrPutByte">sdrv_IsrPutByte</a>(pContext_a); <b>break</b>; <font color="blue"><b>default</b>:</font> <b>break</b>; } } <b>return</b>;}<font size="+1"><i>crtx_Int_t</i> <b><font color="azure1"><a name="sdrv_Create">sdrv_Create</a></font></b>(<i>sdrv_Desc_t</i> *pDesc_a ){</font> <i>crtx_Status_t</i> Status; <i>crtx_Int_t</i> OneInterrupt; <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>if</b> ( pDesc_a->SndByte == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> || pDesc_a->RcvByte == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> ) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongDesc_Exc; } <b>if</b> ( (pDesc_a->pBufIn != <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> && pDesc_a->BufInSize <= 1) || (pDesc_a->pBufOut != <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> && pDesc_a->BufOutSize <= 1) ) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongDesc_Exc; } pDesc_a->BufInReadCount = 0; pDesc_a->BufInWriteCount = 0; pDesc_a->BufOutReadCount = 0; pDesc_a->BufOutWriteCount = 0; OneInterrupt = (pDesc_a->InterIn == pDesc_a->InterOut); <b>if</b> (OneInterrupt == <a href="SDRV_TRUE.FIND-DEF">SDRV_TRUE</a>) { <font color="#6920ac">/* check for the Ioctl if one interrupt only */</font> <b>if</b> ( pDesc_a->Ioctl == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> ) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongDesc_Exc; } } <b>if</b> ( pDesc_a->SndEnable == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> || pDesc_a->RcvEnable == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a> ) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongDesc_Exc; } <font color="#6920ac">/* create separate events for input and output event descriptors */</font> <b>if</b> (<a href="evnt_Create.FIND-FUNC">evnt_Create</a>( &pDesc_a->InpEvent, 0, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateEvent_Exc; } <b>if</b> (<a href="evnt_Create.FIND-FUNC">evnt_Create</a>( &pDesc_a->OutEvent, 0, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateEvent_Exc; } <font color="#6920ac">/* create separate resource locks for input and output event descriptors */</font> <b>if</b> (<a href="rrlc_Create.FIND-FUNC">rrlc_Create</a>(&pDesc_a->InpLock, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateLock_Exc; } <b>if</b> (<a href="rrlc_Create.FIND-FUNC">rrlc_Create</a>(&pDesc_a->OutLock, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) == <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateLock_Exc; } <font color="#6920ac">/* create software interrupt handlers */</font> Status = <a href="sfti_Create.FIND-FUNC">sfti_Create</a>(&pDesc_a->SoftIntIn, (<i>sfti_Handler_t</i>)sdrv_SftiHandlerIn, (<i>sfti_Context_t</i>)pDesc_a, <a href="SFTI_FLAG_HANDLER_TYPE_2.FIND-DEF">SFTI_FLAG_HANDLER_TYPE_2</a>, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); <b>if</b> (Status != <a href="SFTI_SUCCESS.FIND-DEF">SFTI_SUCCESS</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateSoft_Exc; } Status = <a href="sfti_Create.FIND-FUNC">sfti_Create</a>(&pDesc_a->SoftIntOut, (<i>sfti_Handler_t</i>)sdrv_SftiHandlerOut, (<i>sfti_Context_t</i>)pDesc_a, <a href="SFTI_FLAG_HANDLER_TYPE_2.FIND-DEF">SFTI_FLAG_HANDLER_TYPE_2</a>, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); <b>if</b> (Status != <a href="SFTI_SUCCESS.FIND-DEF">SFTI_SUCCESS</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateSoft_Exc; } <font color="#6920ac">/* set interrupt vectors */</font> <b>if</b> (OneInterrupt == <a href="SDRV_FALSE.FIND-DEF">SDRV_FALSE</a>) { Status = <a href="hrdi_Install.FIND-FUNC">hrdi_Install</a>(pDesc_a->InterIn, (<i>hrdi_Handler_t</i>)sdrv_IsrGetByte, (<i>hrdi_Context_t</i>)pDesc_a, <a href="HRDI_FLAG_HANDLER_TYPE_2.FIND-DEF">HRDI_FLAG_HANDLER_TYPE_2</a>, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); <b>if</b> (Status != <a href="HRDI_SUCCESS.FIND-DEF">HRDI_SUCCESS</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateHandle1_Exc; } Status = <a href="hrdi_Install.FIND-FUNC">hrdi_Install</a>(pDesc_a->InterOut, (<i>hrdi_Handler_t</i>)sdrv_IsrPutByte, (<i>hrdi_Context_t</i>)pDesc_a, <a href="HRDI_FLAG_HANDLER_TYPE_2.FIND-DEF">HRDI_FLAG_HANDLER_TYPE_2</a>, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); } <b>else</b> { Status = <a href="hrdi_Install.FIND-FUNC">hrdi_Install</a>(pDesc_a->InterOut, (<i>hrdi_Handler_t</i>)sdrv_IsrGetPutByte, (<i>hrdi_Context_t</i>)pDesc_a, <a href="HRDI_FLAG_HANDLER_TYPE_2.FIND-DEF">HRDI_FLAG_HANDLER_TYPE_2</a>, <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a>); } <b>if</b> (Status != <a href="HRDI_SUCCESS.FIND-DEF">HRDI_SUCCESS</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrCreateHandle2_Exc; } <font color="#6920ac">/* enable all interrupts from devices */</font> (*pDesc_a->RcvEnable)( pDesc_a->pContext, <a href="SDRV_TRUE.FIND-DEF">SDRV_TRUE</a>); (*pDesc_a->SndEnable)(pDesc_a->pContext, <a href="SDRV_TRUE.FIND-DEF">SDRV_TRUE</a>); <font color="#6920ac">/* enable software input interrupt */</font> <a href="sfti_Enable.FIND-FUNC">sfti_Enable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a->SoftIntIn )); <font color="#6920ac">/* disable software output interrupt */</font> <a href="sfti_Disable.FIND-FUNC">sfti_Disable</a>( <a href="sfti_Mask.FIND-FUNC">sfti_Mask</a>( pDesc_a->SoftIntOut )); <font color="#6920ac">/* trigger software interrupt to be able to send first byte */</font> <a href="sfti_Trigger.FIND-FUNC">sfti_Trigger</a>(pDesc_a->SoftIntOut); <b>return</b>(<a href="SDRV_TRUE.FIND-DEF">SDRV_TRUE</a>);<font color="#6920ac">/************************ * EXCEPTION HANDLING * ************************/</font>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?