📄 ax88796_8c-source.html
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html><head><meta http-equiv="Content-Type" content="text/html;charset=iso-8859-1"><title>Procyon AVRlib: net/ax88796.c Source File</title><link href="dox.css" rel="stylesheet" type="text/css"></head><body><!-- Generated by Doxygen 1.4.2 --><div class="qindex"><a class="qindex" href="main.html">Main Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File List</a> | <a class="qindex" href="functions.html">Data Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related Pages</a></div><div class="nav"><a class="el" href="dir_000001.html">net</a></div><h1>ax88796.c</h1><a href="ax88796_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*! \file ax88796.c \brief ASIX AX88796 Ethernet Interface Driver. */</span>00002 <span class="comment">//*****************************************************************************</span>00003 <span class="comment">//</span>00004 <span class="comment">// File Name : 'ax88796.c'</span>00005 <span class="comment">// Title : ASIX AX88796 Ethernet Interface Driver</span>00006 <span class="comment">// Author : Pascal Stang</span>00007 <span class="comment">// Created : 10/22/2002</span>00008 <span class="comment">// Revised : 8/21/2005</span>00009 <span class="comment">// Version : 0.1</span>00010 <span class="comment">// Target MCU : Atmel AVR series</span>00011 <span class="comment">// Editor Tabs : 4</span>00012 <span class="comment">//</span>00013 <span class="comment">// Description : This driver provides initialization and transmit/receive</span>00014 <span class="comment">// functions for the ASIX AX88796 10/100Mb Ethernet Controller and PHY.</span>00015 <span class="comment">//</span>00016 <span class="comment">// Based in part on code by Louis Beaudoin (www.embedded-creations.com).</span>00017 <span class="comment">// Thanks to Adam Dunkels and Louis Beaudoin for providing the initial</span>00018 <span class="comment">// structure in which to write this driver.</span>00019 <span class="comment">//</span>00020 <span class="comment">//*****************************************************************************</span>00021 00022 <span class="preprocessor">#include "<a class="code" href="global_8h.html">global.h</a>"</span>00023 <span class="preprocessor">#include "<a class="code" href="timer_8h.html">timer.h</a>"</span>00024 <span class="preprocessor">#include "<a class="code" href="rprintf_8h.html">rprintf.h</a>"</span>00025 00026 <span class="preprocessor">#include "<a class="code" href="ax88796_8h.html">ax88796.h</a>"</span>00027 00028 <span class="comment">// include configuration</span>00029 <span class="preprocessor">#include "<a class="code" href="ax88796conf_8h.html">ax88796conf.h</a>"</span>00030 00031 <span class="comment">// pointers to locations in the ax88796 receive buffer</span>00032 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> NextPage; <span class="comment">// page pointer to next Rx packet</span>00033 <span class="keyword">static</span> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> CurrentRetreiveAddress; <span class="comment">// DMA address for read Rx packet location</span>00034 00035 <a name="l00036"></a><a class="code" href="group__nic.html#ga0">00036</a> <span class="keywordtype">void</span> <a class="code" href="group__nic.html#ga0">nicInit</a>(<span class="keywordtype">void</span>)00037 {00038 ax88796Init();00039 }00040 <a name="l00041"></a><a class="code" href="group__nic.html#ga1">00041</a> <span class="keywordtype">void</span> <a class="code" href="group__nic.html#ga1">nicSend</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> len, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* packet)00042 {00043 ax88796BeginPacketSend(len);00044 ax88796SendPacketData(packet, len);00045 ax88796EndPacketSend();00046 }00047 <a name="l00048"></a><a class="code" href="group__nic.html#ga2">00048</a> <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> <a class="code" href="group__nic.html#ga2">nicPoll</a>(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> maxlen, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>* packet)00049 {00050 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> packetLength;00051 00052 packetLength = ax88796BeginPacketRetreive();00053 00054 <span class="comment">// if there's no packet or an error - exit without ending the operation</span>00055 <span class="keywordflow">if</span>( !packetLength )00056 <span class="keywordflow">return</span> 0;00057 00058 <span class="comment">// drop anything too big for the buffer</span>00059 <span class="keywordflow">if</span>( packetLength > maxlen )00060 {00061 ax88796EndPacketRetreive();00062 <span class="keywordflow">return</span> 0;00063 }00064 00065 <span class="comment">// copy the packet data into the uIP packet buffer</span>00066 ax88796RetreivePacketData( packet, packetLength );00067 ax88796EndPacketRetreive();00068 00069 <span class="keywordflow">return</span> packetLength;00070 }00071 00072 <span class="keywordtype">void</span> nicGetMacAddress(u08* macaddr)00073 {00074 u08 tempCR;00075 <span class="comment">// switch register pages</span>00076 tempCR = ax88796Read(CR);00077 ax88796Write(CR,tempCR|PS0);00078 <span class="comment">// read MAC address registers</span>00079 *macaddr++ = ax88796Read(PAR0);00080 *macaddr++ = ax88796Read(PAR1);00081 *macaddr++ = ax88796Read(PAR2);00082 *macaddr++ = ax88796Read(PAR3);00083 *macaddr++ = ax88796Read(PAR4);00084 *macaddr++ = ax88796Read(PAR5);00085 <span class="comment">// switch register pages back</span>00086 ax88796Write(CR,tempCR);00087 }00088 00089 <span class="keywordtype">void</span> nicSetMacAddress(u08* macaddr)00090 {00091 u08 tempCR;00092 <span class="comment">// switch register pages</span>00093 tempCR = ax88796Read(CR);00094 ax88796Write(CR,tempCR|PS0);00095 <span class="comment">// write MAC address registers</span>00096 ax88796Write(PAR0, *macaddr++);00097 ax88796Write(PAR1, *macaddr++);00098 ax88796Write(PAR2, *macaddr++);00099 ax88796Write(PAR3, *macaddr++);00100 ax88796Write(PAR4, *macaddr++);00101 ax88796Write(PAR5, *macaddr++);00102 <span class="comment">// switch register pages back</span>00103 ax88796Write(CR,tempCR);00104 }00105 <a name="l00106"></a><a class="code" href="group__nic.html#ga5">00106</a> <span class="keywordtype">void</span> <a class="code" href="group__nic.html#ga5">nicRegDump</a>(<span class="keywordtype">void</span>)00107 {00108 ax88796RegDump();00109 }00110 00111 00112 <span class="keywordtype">void</span> ax88796SetupPorts(<span class="keywordtype">void</span>)00113 {00114 <span class="preprocessor">#if NIC_CONNECTION == MEMORY_MAPPED</span>00115 <span class="preprocessor"></span> <span class="comment">// enable external SRAM interface - no wait states</span>00116 sbi(MCUCR, SRE);00117 <span class="comment">// sbi(MCUCR, SRW10);</span>00118 <span class="comment">// sbi(XMCRA, SRW00);</span>00119 <span class="comment">// sbi(XMCRA, SRW01);</span>00120 <span class="comment">// sbi(XMCRA, SRW11);</span>00121 <span class="preprocessor">#else</span>00122 <span class="preprocessor"></span> <span class="comment">// set address port to output</span>00123 AX88796_ADDRESS_DDR = AX88796_ADDRESS_MASK;00124 00125 <span class="comment">// set data port to input with pull-ups</span>00126 AX88796_DATA_DDR = 0x00;00127 AX88796_DATA_PORT = 0xFF;00128 00129 <span class="comment">// initialize the control port read and write pins to de-asserted</span>00130 sbi( AX88796_CONTROL_PORT, AX88796_CONTROL_READPIN );00131 sbi( AX88796_CONTROL_PORT, AX88796_CONTROL_WRITEPIN );00132 <span class="comment">// set the read and write pins to output</span>00133 sbi( AX88796_CONTROL_DDR, AX88796_CONTROL_READPIN );00134 sbi( AX88796_CONTROL_DDR, AX88796_CONTROL_WRITEPIN );00135 <span class="preprocessor">#endif</span>00136 <span class="preprocessor"></span> <span class="comment">// set reset pin to output</span>00137 sbi( AX88796_RESET_DDR, AX88796_RESET_PIN );00138 }00139 00140 00141 <span class="preprocessor">#if NIC_CONNECTION == MEMORY_MAPPED</span>00142 <span class="preprocessor"></span><span class="keyword">inline</span> <span class="keywordtype">void</span> ax88796Write(u08 address, u08 data)00143 {00144 *(<span class="keyword">volatile</span> u08*)(AX88796_MEMORY_MAPPED_OFFSET + address) = data;00145 }00146 <span class="preprocessor">#else</span>00147 <span class="preprocessor"></span><span class="keywordtype">void</span> ax88796Write(u08 address, u08 data)00148 {00149 <span class="comment">// assert the address</span>00150 AX88796_ADDRESS_PORT = address | (AX88796_ADDRESS_PORT&~AX88796_ADDRESS_MASK);00151 00152 <span class="comment">// set data bus as output and place data on bus</span>00153 AX88796_DATA_DDR = 0xFF;00154 AX88796_DATA_PORT = data;00155 00156 <span class="comment">// clock write pin</span>00157 cbi(AX88796_CONTROL_PORT, AX88796_CONTROL_WRITEPIN);00158 nop();00159 nop();00160 sbi(AX88796_CONTROL_PORT, AX88796_CONTROL_WRITEPIN);00161 00162 <span class="comment">// set data bus back to input with pullups enabled</span>00163 AX88796_DATA_DDR = 0x00;00164 AX88796_DATA_PORT = 0xFF;00165 }00166 <span class="preprocessor">#endif</span>00167 <span class="preprocessor"></span>00168 00169 <span class="preprocessor">#if NIC_CONNECTION == MEMORY_MAPPED</span>00170 <span class="preprocessor"></span><span class="keyword">inline</span> u08 ax88796Read(u08 address)00171 {00172 <span class="keywordflow">return</span> *(<span class="keyword">volatile</span> u08*)(AX88796_MEMORY_MAPPED_OFFSET + address);00173 }00174 <span class="preprocessor">#else</span>00175 <span class="preprocessor"></span>u08 ax88796Read(u08 address)00176 {00177 u08 data;00178 00179 <span class="comment">// assert the address</span>00180 AX88796_ADDRESS_PORT = address | (AX88796_ADDRESS_PORT&~AX88796_ADDRESS_MASK);00181 00182 <span class="comment">// assert read</span>00183 cbi(AX88796_CONTROL_PORT, AX88796_CONTROL_READPIN);00184 nop();00185 nop();00186 <span class="comment">// read in the data</span>00187 data = AX88796_DATA_PIN;00188 00189 <span class="comment">// negate read</span>00190 sbi(AX88796_CONTROL_PORT, AX88796_CONTROL_READPIN);00191 00192 <span class="keywordflow">return</span> data;00193 }00194 <span class="preprocessor">#endif </span>00195 <span class="preprocessor"></span>00196 00197 <span class="keywordtype">void</span> ax88796Init(<span class="keywordtype">void</span>)00198 {00199 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> tcrFduFlag;00200 00201 <span class="comment">// initialize I/O ports</span>00202 ax88796SetupPorts();00203 00204 <span class="comment">// do a hard reset</span>00205 sbi(AX88796_RESET_PORT, AX88796_RESET_PIN);00206 delay_ms(100);00207 cbi(AX88796_RESET_PORT, AX88796_RESET_PIN);00208 00209 <span class="comment">// do soft reset</span>00210 ax88796Write(ISR, ax88796Read(ISR));00211 delay_ms(50);00212 00213 <span class="comment">// wait for PHY to come out of reset</span>00214 ax88796Read(RSTPORT);00215 <span class="keywordflow">while</span>(ax88796Read(TR) & RST_B);00216 00217 ax88796WriteMii(0x10,0x00,0x0800);00218 delay_ms(255);00219 ax88796WriteMii(0x10,0x00,0x1200);00220 00221 ax88796Write(CR,(RD2|STOP)); <span class="comment">// stop the NIC, abort DMA, page 0</span>00222 delay_ms(5); <span class="comment">// make sure nothing is coming in or going out</span>00223 ax88796Write(DCR,DCR_INIT); 00224 ax88796Write(RBCR0,0x00);00225 ax88796Write(RBCR1,0x00);00226 ax88796Write(IMR,0x00);00227 ax88796Write(ISR,0xFF);00228 ax88796Write(RCR,0x20);00229 ax88796Write(BNRY,RXSTART_INIT);00230 ax88796Write(PSTART,RXSTART_INIT);00231 ax88796Write(PSTOP,RXSTOP_INIT);00232 00233 <span class="comment">// switch to page 1</span>00234 ax88796Write(CR,(PS0|RD2|STOP));00235 <span class="comment">// write mac address</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -