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-&gt;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-&gt;Baud == <a href="D552_BAUD_50.FIND-DEF">D552_BAUD_50</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_75.FIND-DEF">D552_BAUD_75</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_110.FIND-DEF">D552_BAUD_110</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_134P5.FIND-DEF">D552_BAUD_134P5</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_150.FIND-DEF">D552_BAUD_150</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_300.FIND-DEF">D552_BAUD_300</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_600.FIND-DEF">D552_BAUD_600</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_1200.FIND-DEF">D552_BAUD_1200</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_1800.FIND-DEF">D552_BAUD_1800</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_2000.FIND-DEF">D552_BAUD_2000</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_2400.FIND-DEF">D552_BAUD_2400</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_3600.FIND-DEF">D552_BAUD_3600</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_4800.FIND-DEF">D552_BAUD_4800</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_7200.FIND-DEF">D552_BAUD_7200</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_9600.FIND-DEF">D552_BAUD_9600</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_19200.FIND-DEF">D552_BAUD_19200</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_38400.FIND-DEF">D552_BAUD_38400</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_56000.FIND-DEF">D552_BAUD_56000</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_128000.FIND-DEF">D552_BAUD_128000</a>) ||            (pDesc_a-&gt;Baud == <a href="D552_BAUD_5F256000.FIND-DEF">D552_BAUD_256000</a>) ||            (pDesc_a-&gt;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-&gt;Bits == <a href="D552_BIT_5.FIND-DEF">D552_BIT_5</a>) ||            (pDesc_a-&gt;Bits == <a href="D552_BIT_6.FIND-DEF">D552_BIT_6</a>) ||            (pDesc_a-&gt;Bits == <a href="D552_BIT_7.FIND-DEF">D552_BIT_7</a>) ||            (pDesc_a-&gt;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-&gt;Stop == <a href="D552_STOPBIT_1.FIND-DEF">D552_STOPBIT_1</a>) ||            (pDesc_a-&gt;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-&gt;CPUFrequency * 10 + pDesc_a-&gt;Baud * 8) /               (pDesc_a-&gt;Baud * 16));    <font color="#6920ac">/* set number of bits */</font>    pDesc_a-&gt;PortAddr[<a href="D552_REG_LCR.FIND-DEF">D552_REG_LCR</a>] =        ((<a href="D552_STOPBIT_MASK.FIND-DEF">D552_STOPBIT_MASK</a> &lt;&lt; <a href="D552_STOPBIT_SHIFT.FIND-DEF">D552_STOPBIT_SHIFT</a>) |         (pDesc_a-&gt;Bits &lt;&lt; <a href="D552_BIT_SHIFT.FIND-DEF">D552_BIT_SHIFT</a>) |         (pDesc_a-&gt;Stop &lt;&lt; <a href="D552_STOPBIT_SHIFT.FIND-DEF">D552_STOPBIT_SHIFT</a>));    <font color="#6920ac">/* set baud rate */</font>    pDesc_a-&gt;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-&gt;PortAddr[<a href="D552_REG_DLL.FIND-DEF">D552_REG_DLL</a>] = divisor &amp; 0xff;    pDesc_a-&gt;PortAddr[<a href="D552_REG_DLM.FIND-DEF">D552_REG_DLM</a>] = (divisor &gt;&gt; 8) &amp; 0xff;    pDesc_a-&gt;PortAddr[<a href="D552_REG_LCR.FIND-DEF">D552_REG_LCR</a>] &amp;= (~<a href="D552_BIT_DIVIS_LATCH.FIND-DEF">D552_BIT_DIVIS_LATCH</a>);    pDesc_a-&gt;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-&gt;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-&gt;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-&gt;PortAddr[3] &amp;= ~<a href="D552_BIT_DIVIS_LATCH.FIND-DEF">D552_BIT_DIVIS_LATCH</a>;    <font color="#6920ac">/* disable FIFO */</font>    pDesc_a-&gt;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-&gt;PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &amp;=        ~(<a href="D552_IER_ALL_EN.FIND-DEF">D552_IER_ALL_EN</a>);    D552Context = *pDesc_a;    pDrvDesc_a-&gt;pContext = (<i>void</i> *)&amp;D552Context;    pDrvDesc_a-&gt;InterIn = pDesc_a-&gt;InterNum;    pDrvDesc_a-&gt;InterOut = pDesc_a-&gt;InterNum;    pDrvDesc_a-&gt;Flags = <a href="SDRV_FLAG_ECHO.FIND-DEF">SDRV_FLAG_ECHO</a>;    pDrvDesc_a-&gt;SndByte = D552SndByte;    pDrvDesc_a-&gt;SndEnable = D552SndEnable;    pDrvDesc_a-&gt;RcvByte = D552RcvByte;    pDrvDesc_a-&gt;RcvEnable = D552RcvEnable;    pDrvDesc_a-&gt;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-&gt;PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &amp;= ~<a href="D552_IER_SND_EN.FIND-DEF">D552_IER_SND_EN</a>;    }    <b>else</b>    {        pDesc-&gt;PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &amp;= ~<a href="D552_IER_SND_EN.FIND-DEF">D552_IER_SND_EN</a>;        pDesc-&gt;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-&gt;PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &amp;= ~<a href="D552_IER_RCV_EN.FIND-DEF">D552_IER_RCV_EN</a>;    }    <b>else</b>    {        pDesc-&gt;PortAddr[<a href="D552_REG_IER.FIND-DEF">D552_REG_IER</a>] &amp;= ~<a href="D552_IER_RCV_EN.FIND-DEF">D552_IER_RCV_EN</a>;        pDesc-&gt;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-&gt;PortAddr[<a href="D552_REG_LSR.FIND-DEF">D552_REG_LSR</a>] &amp; <a href="D552_LSR_THRE.FIND-DEF">D552_LSR_THRE</a> ) != 0)    {        pDesc-&gt;PortAddr[<a href="D552_REG_THR.FIND-DEF">D552_REG_THR</a>] = Byte_a;        Report = ((<i>crtx_Int_t</i>)Byte_a) &amp; 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-&gt;PortAddr[<a href="D552_REG_RBR.FIND-DEF">D552_REG_RBR</a>] &amp; 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-&gt;PortAddr[<a href="D552_REG_IIR.FIND-DEF">D552_REG_IIR</a>];            <b>switch</b> (RegIIR &amp; <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 + -
显示快捷键?