552_core.c
来自「澳洲人写的Cortex,包括uC_IP协议栈」· C语言 代码 · 共 225 行
C
225 行
<HTML><HEAD><TITLE>/home/asysweb/public_html/cortex/exdevs/src/552_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><b><font color='DarkGreen'>#include</font></b> <a href="sdr_defs.h.FIND-INC"><font color="blue">"sdr_defs.h"</font></a><b><font color='DarkGreen'>#include</font></b> <a href="552_defs.h.FIND-INC"><font color="blue">"552_defs.h"</font></a><b><font color='DarkGreen'>#if</font></b><font color="maroon"> (CRTX_CPU_FAMILY==CRTX_TMS320C3X)</font><i>static</i> <i>D552_Desc_t</i> D552Context;<font size="+1"><i>static</i> <i>crtx_Int_t</i> <a href="D552SndByte.FIND-FUNC">D552SndByte</a>( <i>crtx_Void_t</i> *pContext_a, <i>crtx_Char_t</i> Byte_a);</font><font size="+1"><i>static</i> <i>crtx_Int_t</i> <a href="D552RcvByte.FIND-FUNC">D552RcvByte</a>( <i>crtx_Void_t</i> *pContext_a);</font><font size="+1"><i>static</i> <i>crtx_Int_t</i> <a href="D552Ioctl.FIND-FUNC">D552Ioctl</a>(<i>crtx_Void_t</i> *pContext_a, <i>crtx_Int_t</i> Command_a, <i>crtx_Void_t</i> *pAttr_a);</font><font size="+1"><i>static</i> <i>crtx_Void_t</i> <a href="D552SndEnable.FIND-FUNC">D552SndEnable</a>( <i>crtx_Void_t</i> *pContext_a, <i>crtx_Int_t</i> Enable_a);</font><font size="+1"><i>static</i> <i>crtx_Void_t</i> <a href="D552RcvEnable.FIND-FUNC">D552RcvEnable</a>( <i>crtx_Void_t</i> *pContext_a, <i>crtx_Int_t</i> Enable_a);</font><font size="+1"><i>sdrv_Desc_t</i> *<b><font color="azure1"><a name="CreateTms552Port">CreateTms552Port</a></font></b>(<i>D552_Desc_t</i> *pDesc_a, <i>sdrv_Desc_t</i> *pDrvDesc_a){</font> <i>crtx_Uint_t</i> divisor; <font color="#6920ac">/* check initial parameters */</font> <b>if</b> ( pDesc_a->PortAddr == <a href="SDRV_NULL.FIND-DEF">SDRV_NULL</a>) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongArg_Exc; } <b>if</b> ( !( (pDesc_a->Baud == <a href="D552_BAUD_50.FIND-DEF">D552_BAUD_50</a>) || (pDesc_a->Baud == <a href="D552_BAUD_75.FIND-DEF">D552_BAUD_75</a>) || (pDesc_a->Baud == <a href="D552_BAUD_110.FIND-DEF">D552_BAUD_110</a>) || (pDesc_a->Baud == <a href="D552_BAUD_134P5.FIND-DEF">D552_BAUD_134P5</a>) || (pDesc_a->Baud == <a href="D552_BAUD_150.FIND-DEF">D552_BAUD_150</a>) || (pDesc_a->Baud == <a href="D552_BAUD_300.FIND-DEF">D552_BAUD_300</a>) || (pDesc_a->Baud == <a href="D552_BAUD_600.FIND-DEF">D552_BAUD_600</a>) || (pDesc_a->Baud == <a href="D552_BAUD_1200.FIND-DEF">D552_BAUD_1200</a>) || (pDesc_a->Baud == <a href="D552_BAUD_1800.FIND-DEF">D552_BAUD_1800</a>) || (pDesc_a->Baud == <a href="D552_BAUD_2000.FIND-DEF">D552_BAUD_2000</a>) || (pDesc_a->Baud == <a href="D552_BAUD_2400.FIND-DEF">D552_BAUD_2400</a>) || (pDesc_a->Baud == <a href="D552_BAUD_3600.FIND-DEF">D552_BAUD_3600</a>) || (pDesc_a->Baud == <a href="D552_BAUD_4800.FIND-DEF">D552_BAUD_4800</a>) || (pDesc_a->Baud == <a href="D552_BAUD_7200.FIND-DEF">D552_BAUD_7200</a>) || (pDesc_a->Baud == <a href="D552_BAUD_9600.FIND-DEF">D552_BAUD_9600</a>) || (pDesc_a->Baud == <a href="D552_BAUD_19200.FIND-DEF">D552_BAUD_19200</a>) || (pDesc_a->Baud == <a href="D552_BAUD_38400.FIND-DEF">D552_BAUD_38400</a>) || (pDesc_a->Baud == <a href="D552_BAUD_56000.FIND-DEF">D552_BAUD_56000</a>) || (pDesc_a->Baud == <a href="D552_BAUD_128000.FIND-DEF">D552_BAUD_128000</a>) || (pDesc_a->Baud == <a href="D552_BAUD_5F256000.FIND-DEF">D552_BAUD_256000</a>) || (pDesc_a->Baud == <a href="D552_BAUD_512000.FIND-DEF">D552_BAUD_512000</a>) ) ) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongArg_Exc; } <b>if</b> ( !( (pDesc_a->Bits == <a href="D552_BIT_5.FIND-DEF">D552_BIT_5</a>) || (pDesc_a->Bits == <a href="D552_BIT_6.FIND-DEF">D552_BIT_6</a>) || (pDesc_a->Bits == <a href="D552_BIT_7.FIND-DEF">D552_BIT_7</a>) || (pDesc_a->Bits == <a href="D552_BIT_8.FIND-DEF">D552_BIT_8</a>) )) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongArg_Exc; } <b>if</b> ( !( (pDesc_a->Stop == <a href="D552_STOPBIT_1.FIND-DEF">D552_STOPBIT_1</a>) || (pDesc_a->Stop == <a href="D552_STOPBIT_2.FIND-DEF">D552_STOPBIT_2</a>) ) ) { <a href="SDRV_EXCEPTION.FIND-DEF">SDRV_EXCEPTION</a> ErrWrongArg_Exc; } <font color="#6920ac">/* calculate divisor to set baud rate later */</font> divisor = ((pDesc_a->CPUFrequency * 10 + pDesc_a->Baud * 8) / (pDesc_a->Baud * 16)); <font color="#6920ac">/* set number of bits */</font> pDesc_a->PortAddr[<a href="D552_REG_LCR.FIND-DEF">D552_REG_LCR</a>] = ((<a href="D552_STOPBIT_MASK.FIND-DEF">D552_STOPBIT_MASK</a> << <a href="D552_STOPBIT_SHIFT.FIND-DEF">D552_STOPBIT_SHIFT</a>) | (pDesc_a->Bits << <a href="D552_BIT_SHIFT.FIND-DEF">D552_BIT_SHIFT</a>) | (pDesc_a->Stop << <a href="D552_STOPBIT_SHIFT.FIND-DEF">D552_STOPBIT_SHIFT</a>)); <font color="#6920ac">/* set baud rate */</font> pDesc_a->PortAddr[<a href="D552_REG_LCR.FIND-DEF">D552_REG_LCR</a>] |= <a href="D552_BIT_DIVIS_LATCH.FIND-DEF">D552_BIT_DIVIS_LATCH</a>; pDesc_a->PortAddr[<a href="D552_REG_DLL.FIND-DEF">D552_REG_DLL</a>] = divisor & 0xff; pDesc_a->PortAddr[<a href="D552_REG_DLM.FIND-DEF">D552_REG_DLM</a>] = (divisor >> 8) & 0xff; pDesc_a->PortAddr[<a href="D552_REG_LCR.FIND-DEF">D552_REG_LCR</a>] &= (~<a href="D552_BIT_DIVIS_LATCH.FIND-DEF">D552_BIT_DIVIS_LATCH</a>); pDesc_a->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] = <a href="D552_IER_ALL_DIS.FIND-DEF">D552_IER_ALL_DIS</a>; pDesc_a->PortAddr[<a href="D552_REG_FCR.FIND-DEF">D552_REG_FCR</a>] = <a href="D552_FCR_FIFO8.FIND-DEF">D552_FCR_FIFO8</a>; pDesc_a->PortAddr[<a href="D552_REG_MCR.FIND-DEF">D552_REG_MCR</a>] = <a href="D552_MCR_RTS_LOW.FIND-DEF">D552_MCR_RTS_LOW</a> | <a href="D552_MCR_OUT2_LOW.FIND-DEF">D552_MCR_OUT2_LOW</a>; pDesc_a->PortAddr[3] &= ~<a href="D552_BIT_DIVIS_LATCH.FIND-DEF">D552_BIT_DIVIS_LATCH</a>; <font color="#6920ac">/* disable FIFO */</font> pDesc_a->PortAddr[<a href="D552_REG_FCR.FIND-DEF">D552_REG_FCR</a>] = <a href="D552_FCR_FIFO_OFF.FIND-DEF">D552_FCR_FIFO_OFF</a>; <font color="#6920ac">/* disable all interrupts */</font> pDesc_a->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &= ~(<a href="D552_IER_ALL_EN.FIND-DEF">D552_IER_ALL_EN</a>); D552Context = *pDesc_a; pDrvDesc_a->pContext = (<i>void</i> *)&D552Context; pDrvDesc_a->InterIn = pDesc_a->InterNum; pDrvDesc_a->InterOut = pDesc_a->InterNum; pDrvDesc_a->Flags = <a href="SDRV_FLAG_ECHO.FIND-DEF">SDRV_FLAG_ECHO</a>; pDrvDesc_a->SndByte = D552SndByte; pDrvDesc_a->SndEnable = D552SndEnable; pDrvDesc_a->RcvByte = D552RcvByte; pDrvDesc_a->RcvEnable = D552RcvEnable; pDrvDesc_a->Ioctl = D552Ioctl; <b>return</b>( pDrvDesc_a );<font color="blue">ErrWrongArg_Exc:</font> <b>return</b>( <a href="CRTX_NULL.FIND-DEF">CRTX_NULL</a> );}<font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="D552SndEnable">D552SndEnable</a></font></b>( <i>crtx_Void_t</i> *pContext_a, <i>crtx_Int_t</i> Enable_a){</font> <i>D552_Desc_t</i> *pDesc; pDesc = (<i>D552_Desc_t</i> *)pContext_a; <b>if</b> (Enable_a == 0) { pDesc->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &= ~<a href="D552_IER_SND_EN.FIND-DEF">D552_IER_SND_EN</a>; } <b>else</b> { pDesc->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &= ~<a href="D552_IER_SND_EN.FIND-DEF">D552_IER_SND_EN</a>; pDesc->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] |= <a href="D552_IER_SND_EN.FIND-DEF">D552_IER_SND_EN</a>; }}<font size="+1"><i>static</i> <i>crtx_Void_t</i> <b><font color="azure1"><a name="D552RcvEnable">D552RcvEnable</a></font></b>( <i>crtx_Void_t</i> *pContext_a, <i>crtx_Int_t</i> Enable_a){</font> <i>D552_Desc_t</i> *pDesc; pDesc = (<i>D552_Desc_t</i> *)pContext_a; <b>if</b> (Enable_a == 0) { pDesc->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &= ~<a href="D552_IER_RCV_EN.FIND-DEF">D552_IER_RCV_EN</a>; } <b>else</b> { pDesc->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &= ~<a href="D552_IER_RCV_EN.FIND-DEF">D552_IER_RCV_EN</a>; pDesc->PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] |= <a href="D552_IER_RCV_EN.FIND-DEF">D552_IER_RCV_EN</a>; }}<font size="+1"><i>static</i> <i>crtx_Int_t</i> <b><font color="azure1"><a name="D552SndByte">D552SndByte</a></font></b>( <i>crtx_Void_t</i> *pContext_a, <i>crtx_Char_t</i> Byte_a){</font> <i>D552_Desc_t</i> *pDesc; <i>crtx_Int_t</i> Report; pDesc = (<i>D552_Desc_t</i> *)pContext_a; <b>if</b> ((pDesc->PortAddr[<a href="D552_REG_LSR.FIND-DEF">D552_REG_LSR</a>] & <a href="D552_LSR_THRE.FIND-DEF">D552_LSR_THRE</a> ) != 0) { pDesc->PortAddr[<a href="D552_REG_THR.FIND-DEF">D552_REG_THR</a>] = Byte_a; Report = ((<i>crtx_Int_t</i>)Byte_a) & 0xff; } <b>else</b> { Report = <a href="SDRV_ERROR_OUTPUT_CLOSED.FIND-DEF">SDRV_ERROR_OUTPUT_CLOSED</a>; } <b>return</b>(Report);}<font size="+1"><i>static</i> <i>crtx_Int_t</i> <b><font color="azure1"><a name="D552RcvByte">D552RcvByte</a></font></b>( <i>crtx_Void_t</i> *pContext_a){</font> <i>D552_Desc_t</i> *pDesc; pDesc = (<i>D552_Desc_t</i> *)pContext_a; <b>return</b>(pDesc->PortAddr[<a href="D552_REG_RBR.FIND-DEF">D552_REG_RBR</a>] & 0xff);}<font size="+1"><i>static</i> <i>crtx_Int_t</i> <b><font color="azure1"><a name="D552Ioctl">D552Ioctl</a></font></b>(<i>crtx_Void_t</i> *pContext_a, <i>crtx_Int_t</i> Command_a, <i>crtx_Void_t</i> *pAttr_a){</font> <i>D552_Desc_t</i> *pDesc; <i>crtx_Int_t</i> Result; <i>crtx_Byte_t</i> RegIIR; pDesc = (<i>D552_Desc_t</i> *)pContext_a; Result = 1; <b>switch</b> (Command_a) { <b>case</b> <a href="SDRV_IOCTL_DETECT_INT_TYPE.FIND-DEF">SDRV_IOCTL_DETECT_INT_TYPE</a>: RegIIR = pDesc->PortAddr[<a href="D552_REG_IIR.FIND-DEF">D552_REG_IIR</a>]; <b>switch</b> (RegIIR & <a href="D552_IIR_INT_MASK.FIND-DEF">D552_IIR_INT_MASK</a>) { <b>case</b> <a href="D552_IIR_RCV_INT.FIND-DEF">D552_IIR_RCV_INT</a>: *((<i>crtx_Int_t</i> *)pAttr_a) = <a href="SDRV_INPUT_DETECTED.FIND-DEF">SDRV_INPUT_DETECTED</a>; <b>break</b>; <b>case</b> <a href="D552_IIR_SND_INT.FIND-DEF">D552_IIR_SND_INT</a>: *((<i>crtx_Int_t</i> *)pAttr_a) = <a href="SDRV_OUTPUT_DETECTED.FIND-DEF">SDRV_OUTPUT_DETECTED</a>; <b>break</b>; <font color="blue"><b>default</b>:</font> Result = 0; <b>break</b>; } <b>break</b>; <font color="blue"><b>default</b>:</font> Result = 0; <b>break</b>; } <b>return</b>(Result);}<b><font color='DarkGreen'>#endif</font></b><font color="maroon"> <font color="#6920ac">/* (CRTX_CPU_FAMILY==CRTX_TMS320C3X) */</font></font></pre></BODY></HTML>
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?