?lang_form? ?lang_select? ?lang_submit? ?lang_endform?
{HEADER END}
{FILE START}

library

?curdirlinks? - Rev 6

?prevdifflink? - Blame - ?getfile?

<!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/prism2.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&nbsp;Page</a> | <a class="qindex" href="modules.html">Modules</a> | <a class="qindex" href="annotated.html">Data&nbsp;Structures</a> | <a class="qindex" href="dirs.html">Directories</a> | <a class="qindex" href="files.html">File&nbsp;List</a> | <a class="qindex" href="functions.html">Data&nbsp;Fields</a> | <a class="qindex" href="globals.html">Globals</a> | <a class="qindex" href="pages.html">Related&nbsp;Pages</a></div>
<div class="nav">
<a class="el" href="dir_000001.html">net</a></div>
<h1>prism2.c</h1><a href="prism2_8c.html">Go to the documentation of this file.</a><div class="fragment"><pre class="fragment">00001 <span class="comment">/*! \file prism2.c \brief Prism2 802.11b Wireless-LAN Interface Driver. */</span>
00002 <span class="comment">//*****************************************************************************</span>
00003 <span class="comment">//</span>
00004 <span class="comment">// File Name    : 'prism2.c'</span>
00005 <span class="comment">// Title        : Prism2 802.11b Wireless-LAN Interface Driver</span>
00006 <span class="comment">// Author       : Pascal Stang</span>
00007 <span class="comment">// Created      : 12/27/2004</span>
00008 <span class="comment">// Revised      : 1/7/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 Prism2 802.11b Wireless-LAN Controller.</span>
00015 <span class="comment">//</span>
00016 <span class="comment">//*****************************************************************************</span>
00017 
00018 <span class="preprocessor">#include &lt;avr/io.h&gt;</span>
00019 <span class="preprocessor">#include &lt;avr/interrupt.h&gt;</span>
00020 <span class="preprocessor">#include &lt;string.h&gt;</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 <span class="preprocessor">#include "<a class="code" href="debug_8h.html">debug.h</a>"</span>
00026 
00027 <span class="preprocessor">#include "<a class="code" href="net_8h.html">net.h</a>"</span>
00028 <span class="preprocessor">#include "<a class="code" href="prism2_8h.html">prism2.h</a>"</span>
00029 
00030 <span class="comment">// include configuration</span>
00031 <span class="preprocessor">#include "<a class="code" href="prism2conf_8h.html">prism2conf.h</a>"</span>
00032 
00033 u16 TxHeader[34];
00034 
<a name="l00035"></a><a class="code" href="group__nic.html#ga0">00035</a> <span class="keywordtype">void</span> <a class="code" href="group__nic.html#ga0">nicInit</a>(<span class="keywordtype">void</span>)
00036 {
00037     prism2Init();
00038 }
00039 
<a name="l00040"></a><a class="code" href="group__nic.html#ga1">00040</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)
00041 {
00042     u16 i;
00043     u16 txfid;
00044     u08 stat;
00045     <span class="comment">// request free buffer space to store outgoing frame</span>
00046     prism2Command(PRISM2_CMD_ALLOC, len+44+14+6);
00047     <span class="comment">// wait for buffer to be allocated</span>
00048     <span class="keywordflow">while</span>( !(prism2Read16(PRISM2_REG_EVSTAT) &amp; PRISM2_EVENT_ALLOC) );
00049     <span class="comment">// get the buffer FID</span>
00050     txfid = prism2Read16(PRISM2_REG_ALLOCFID);
00051     <span class="comment">// ACK the alloc event</span>
00052     prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_ALLOC);
00053 
00054 <span class="comment">//  rprintf("PRISM2: TxFID=0x");</span>
00055 <span class="comment">//  rprintfu16(txfid);</span>
00056 <span class="comment">//  rprintfCRLF();</span>
00057 
00058     <span class="comment">// adjust packet length because MAC addresses and type</span>
00059     <span class="comment">// will be written seperately from packet payload</span>
00060     len-=14;
00061 
00062     <span class="comment">// write the outgoing frame to BAP</span>
00063     <span class="comment">// begin with control structure</span>
00064     prism2SetupTxHeader(TxHeader);
00065     
00066     <span class="comment">// write dest and src MAC addresses</span>
00067     <span class="keywordflow">for</span>(i=0;i&lt;6;++i)
00068         TxHeader[23+i] = packet[i*2+1]&lt;&lt;8 | packet[i*2];
00069     <span class="comment">// write length</span>
00070     TxHeader[29] = <a class="code" href="group__net.html#ga2">htons</a>(len+8);
00071     <span class="comment">// write type</span>
00072     TxHeader[33] = packet[13]&lt;&lt;8 | packet[12];
00073 
00074 <span class="comment">//  debugPrintHexTable(34*2, (u08*)TxHeader);</span>
00075 <span class="comment">//  rprintfCRLF();</span>
00076 <span class="comment">//  debugPrintHexTable(len, &amp;packet[14]);</span>
00077 
00078     <span class="comment">// write Tx header out to BAP</span>
00079     prism2WriteBAP0(txfid, 0, TxHeader, 34);
00080     <span class="comment">// write packet out to BAP</span>
00081     prism2WriteBAP0(txfid, 68, (u16*)&amp;packet[14], (len+1)&gt;&gt;1);
00082     <span class="comment">// issue transmit command   </span>
00083     stat = prism2Command(PRISM2_CMD_TX, txfid);
00084     <span class="keywordflow">if</span>(stat)
00085         rprintf(<span class="stringliteral">"Transmit failed: 0x%x\r\n"</span>, stat);
00086     <span class="comment">// do cleanup</span>
00087     prism2EventCheck();
00088 }
00089 
00090 <span class="keywordtype">void</span> nicGetMacAddress(u08* macaddr)
00091 {
00092     prism2GetMacAddress(macaddr);
00093 }
00094 
00095 <span class="keywordtype">void</span> nicSetMacAddress(u08* macaddr)
00096 {
00097     <span class="comment">// not yet supported</span>
00098 }
00099 
<a name="l00100"></a><a class="code" href="group__nic.html#ga5">00100</a> <span class="keywordtype">void</span> <a class="code" href="group__nic.html#ga5">nicRegDump</a>(<span class="keywordtype">void</span>)
00101 {
00102     prism2CardRegDump();
00103     prism2RegDump();
00104 }
00105 
00106 <span class="keywordtype">void</span> prism2SetupTxHeader(u16* header)
00107 {
00108     u16 i;
00109     
00110     <span class="comment">// clear out header</span>
00111     <span class="keywordflow">for</span>(i=0;i&lt;22;i++)
00112         header[i] = 0x00;
00113 
00114     <span class="comment">// set TxRate and retry count</span>
00115     header[5] = (0&lt;&lt;8) | 0;
00116     <span class="comment">// 0x00 = automatic selection</span>
00117     <span class="comment">// 0x0A = 10  = 1.0Mbit/s</span>
00118     <span class="comment">// 0x14 = 20  = 2.0Mbit/s</span>
00119     <span class="comment">// 0x37 = 55  = 5.5Mbit/s</span>
00120     <span class="comment">// 0x6E = 110 = 11 Mbit/s</span>
00121 
00122     <span class="comment">// set TxControl</span>
00123     header[6] = 0x0004;
00124 
00125     <span class="comment">// write length</span>
00126     <span class="comment">// (not really needed since card will pull info from 802.3 header)</span>
00127     <span class="comment">//TxHeader[22] = len+8;</span>
00128 
00129     <span class="comment">// fill in 802.3 header fields</span>
00130     TxHeader[30] = 0xAAAA;
00131     TxHeader[31] = 0x0003;
00132     TxHeader[32] = 0x0000;
00133 
00134     <span class="comment">// src mac address @ byte offset 52</span>
00135 }
00136 
00137 <span class="keywordtype">void</span> prism2EventCheck(<span class="keywordtype">void</span>)
00138 {
00139     <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> evstat_data;
00140 
00141     evstat_data = prism2Read16(PRISM2_REG_EVSTAT);
00142     
00143     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_TX)
00144     {
00145         prism2Write16(PRISM2_REG_EVACK,PRISM2_EVENT_TX);
00146     }
00147 
00148     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_TXEXEC)
00149     {
00150         prism2Write16(PRISM2_REG_EVACK,PRISM2_EVENT_TXEXEC);
00151     }
00152 
00153     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_ALLOC)
00154     {
00155         prism2Write16(PRISM2_REG_EVACK, 0x0002);
00156     }
00157 
00158     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_CMD)
00159     {
00160         prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_CMD);
00161     }
00162 
00163     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_INFO)
00164     {
00165         prism2Read16(PRISM2_REG_INFOFID);
00166         prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_INFO);
00167     }
00168 
00169     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_INFDROP)
00170     {
00171         prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_INFDROP);
00172     }
00173 
00174     <span class="keywordflow">if</span>(evstat_data &amp; PRISM2_EVENT_WTERR)
00175     {
00176         prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_WTERR);
00177     }
00178 }
00179 
00180 
<a name="l00181"></a><a class="code" href="group__nic.html#ga2">00181</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)
00182 {
00183     u16 rxfid=0;
00184     u16 packetLength=0;
00185 
00186     <span class="comment">// check if packets have been received</span>
00187     <span class="keywordflow">if</span>(prism2Read16(PRISM2_REG_EVSTAT) &amp; PRISM2_EVENT_RX)
00188     {
00189         <span class="comment">// we have a receive event</span>
00190         <span class="comment">// get RxFID</span>
00191         rxfid = prism2Read16(PRISM2_REG_RXFID);
00192         <span class="comment">// read the packet length</span>
00193         prism2ReadBAP0(rxfid, 44, &amp;packetLength, 1);
00194     }
00195 
00196     <span class="comment">// if there's no packet or an error - exit</span>
00197     <span class="keywordflow">if</span>( !packetLength )
00198         <span class="keywordflow">return</span> 0;
00199     
00200     <span class="comment">// drop anything too big for the buffer</span>
00201     <span class="keywordflow">if</span>( packetLength &gt; maxlen )
00202     {
00203         <span class="comment">// ACK the receive event to finish up</span>
00204         prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_RX);
00205         <span class="keywordflow">return</span> 0;
00206     }
00207 
00208     <span class="comment">// packet is available, retrieve data</span>
00209     <span class="comment">// this is a hack: while reading in data,</span>
00210     <span class="comment">// convert 802.2/3 header to ethernet header</span>
00211     <span class="comment">// first get dest and src MAC addresses</span>
00212     prism2ReadBAP0(rxfid, 46, (u16*)&amp;packet[0], 6);
00213     <span class="comment">// skip length, snap, and ctrl fields</span>
00214     <span class="comment">// begin data copy again at type field</span>
00215     prism2ReadBAP0(rxfid, 46+12+8, (u16*)&amp;packet[12], packetLength-6);
00216     <span class="comment">// ACK the receive event to finish up</span>
00217     prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_RX);
00218 
00219     <span class="keywordflow">return</span> packetLength;
00220 }
00221 
00222 <span class="keywordtype">void</span> prism2InitPorts(<span class="keywordtype">void</span>)
00223 {
00224 <span class="preprocessor">#if NIC_CONNECTION == MEMORY_MAPPED</span>
00225 <span class="preprocessor"></span>    <span class="comment">// enable external SRAM interface - no wait states</span>
00226     sbi(MCUSR, SRE);
00227 <span class="preprocessor">#else</span>
00228 <span class="preprocessor"></span>    <span class="comment">// set address port to output</span>
00229     outb(PRISM2_ADDRESS_DDR, PRISM2_ADDRESS_MASK);
00230     outb(PRISM2_HADDRESS_DDR, PRISM2_HADDRESS_MASK);
00231     
00232     <span class="comment">// set data port to input with pull-ups</span>
00233     outb(PRISM2_DATA_DDR, 0x00);
00234     outb(PRISM2_DATA_PORT, 0xFF);
00235 
00236     <span class="comment">// initialize the control port read and write pins to de-asserted</span>
00237     sbi( PRISM2_CONTROL_PORT, PRISM2_CONTROL_IORD );
00238     sbi( PRISM2_CONTROL_PORT, PRISM2_CONTROL_IOWR );
00239     sbi( PRISM2_CONTROL_PORT, PRISM2_CONTROL_MEMRD );
00240     sbi( PRISM2_CONTROL_PORT, PRISM2_CONTROL_MEMWR );
00241     <span class="comment">// set the read and write pins to output</span>
00242     sbi( PRISM2_CONTROL_DDR, PRISM2_CONTROL_IORD );
00243     sbi( PRISM2_CONTROL_DDR, PRISM2_CONTROL_IOWR );
00244     sbi( PRISM2_CONTROL_DDR, PRISM2_CONTROL_MEMRD );
00245     sbi( PRISM2_CONTROL_DDR, PRISM2_CONTROL_MEMWR );
00246 <span class="preprocessor">#endif</span>
00247 <span class="preprocessor"></span>    <span class="comment">// set reset pin to output</span>
00248     sbi( PRISM2_RESET_DDR, PRISM2_RESET_PIN );
00249 
00250     <span class="comment">// clear -REG pin</span>
00251     sbi(DDRB, 6);
00252     cbi(PORTB, 6);
00253     <span class="comment">// setup IREQ pin</span>
00254     cbi(DDRB, 7);
00255     sbi(PORTB, 7);
00256 }
00257 
00258 <span class="keywordtype">void</span> prism2Init(<span class="keywordtype">void</span>)
00259 {
00260     u08 result;
00261     u16 buffer[20];
00262 
00263 <span class="comment">//  rprintf("Init ports\r\n");</span>
00264     prism2InitPorts();
00265 
00266     <span class="comment">// assert hardware reset</span>
00267     sbi( PRISM2_RESET_PORT, PRISM2_RESET_PIN );
00268     <span class="comment">// wait</span>
00269     delay_ms(10);
00270     <span class="comment">// release hardware reset</span>
00271     cbi( PRISM2_RESET_PORT, PRISM2_RESET_PIN );
00272     delay_ms(100);
00273 
00274 <span class="comment">/*</span>
00275 <span class="comment">    // soft-reset card</span>
00276 <span class="comment">    prism2WriteMem(0x3E0+PCMCIA_ATTR_COR, 0x80);</span>
00277 <span class="comment">    delay_ms(10);</span>
00278 <span class="comment">    prism2WriteMem(0x3E0+PCMCIA_ATTR_COR, 0x00);</span>
00279 <span class="comment">    // wait until soft-reset is done</span>
00280 <span class="comment">    delay_ms(500);</span>
00281 <span class="comment"></span>
00282 <span class="comment">    // set 8-bit PCMCIA I/O mode</span>
00283 <span class="comment">    prism2WriteMem(0x3E0+PCMCIA_ATTR_CSR, 0x20);</span>
00284 <span class="comment"></span>
00285 <span class="comment">    prism2WriteMem(0x3E0+PCMCIA_ATTR_CSR, 0x04);</span>
00286 <span class="comment">    timerPause(1000);</span>
00287 <span class="comment">    prism2WriteMem(0x3E0+PCMCIA_ATTR_CSR, 0x00);</span>
00288 <span class="comment">*/</span>
00289     <span class="comment">// enable PCMCIA I/O mode</span>
00290     prism2WriteMem(0x3E0+PCMCIA_ATTR_COR, prism2ReadMem(0x3E0+PCMCIA_ATTR_COR) | 0x01);
00291 <span class="comment">//  prism2CardRegDump();</span>
00292 
00293     rprintf(<span class="stringliteral">"Prism2 Initializing...\r\n"</span>);
00294     <span class="keywordflow">if</span>( (result = prism2Command(PRISM2_CMD_INIT,0)) )
00295     {
00296         rprintf(<span class="stringliteral">"Prism2 Initialization Failure\r\n"</span>);
00297         rprintf(<span class="stringliteral">"Result Code = %x\r\n"</span>,result);
00298     }
00299     
00300     rprintf(<span class="stringliteral">"Prism2 Initialized\r\n"</span>);
00301 
00302     <span class="comment">// set SSID</span>
00303     prism2SetSSID(<span class="stringliteral">"airdrop"</span>);
00304 
00305     <span class="comment">// set max packet size</span>
00306     buffer[0] = 0x0002;
00307     buffer[1] = PRISM2_RID_CNFMAXDATALEN;
00308     buffer[2] = 0x05DC;
00309     prism2WriteRID(PRISM2_RID_CNFMAXDATALEN, 0, buffer, 3);
00310 
00311     <span class="comment">// set operating mode / port type</span>
00312     buffer[0] = 0x0002;
00313     buffer[1] = PRISM2_RID_CNFPORTTYPE;
00314     <span class="comment">//buffer[2] = 0x0000; // IBSS</span>
00315     buffer[2] = 0x0001; <span class="comment">// BSS</span>
00316     prism2WriteRID(PRISM2_RID_CNFPORTTYPE, 0, buffer, 3);
00317 
00318     <span class="comment">// set channel</span>
00319 <span class="comment">//  buffer[0] = 0x0002;</span>
00320 <span class="comment">//  buffer[1] = 0xFC03;</span>
00321 <span class="comment">//  buffer[2] = 0x0001;</span>
00322 <span class="comment">//  prism2WriteRID(0xFC00, 0, buffer, 3);</span>
00323 
00324     <span class="comment">// enable the interface</span>
00325     prism2Command(PRISM2_CMD_ENABLE_MAC0,0);
00326 }
00327 
00328 <span class="keywordtype">void</span> prism2Off(<span class="keywordtype">void</span>)
00329 {
00330     <span class="comment">// turn off communication</span>
00331     prism2Command(PRISM2_CMD_DISABLE_MAC0,0);
00332     <span class="comment">// wait for all events to complete</span>
00333     delay_ms(100);
00334     <span class="comment">// reset card</span>
00335     prism2Command(PRISM2_CMD_INIT,0);
00336 }
00337 
00338 <span class="keywordtype">void</span> prism2GetMacAddress(u08* macaddr)
00339 {
00340     u16 buffer[5];
00341 
00342     <span class="comment">// read MAC address register</span>
00343     prism2ReadRID(PRISM2_RID_CNFOWNMACADDR, 0, buffer, 5);
00344 
00345     *macaddr++ = buffer[2];
00346     *macaddr++ = buffer[2]&gt;&gt;8;
00347     *macaddr++ = buffer[3];
00348     *macaddr++ = buffer[3]&gt;&gt;8;
00349     *macaddr++ = buffer[4];
00350     *macaddr++ = buffer[4]&gt;&gt;8;
00351 }
00352 
00353 <span class="keywordtype">void</span> prism2SetSSID(u08* ssid)
00354 {
00355     u16 buffer[12];
00356 
00357     <span class="comment">// prepare buffer for SSID write</span>
00358     buffer[0] = 0x0012;
00359     buffer[1] = PRISM2_RID_CNFDESIREDSSID;
00360     buffer[2] = strlen(ssid);
00361     <span class="comment">// copy ssid string to buffer</span>
00362     strcpy((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;buffer[3], ssid);
00363     <span class="comment">// write SSID</span>
00364     prism2WriteRID(PRISM2_RID_CNFDESIREDSSID, 0, buffer, buffer[0]);
00365 }
00366 
00367 <span class="keywordtype">void</span> prism2SetWEPKey(u08* wepkey)
00368 {
00369     u16 buffer[9];
00370 
00371     <span class="comment">// prepare buffer for SSID write</span>
00372     buffer[0] = 0x0008;
00373     buffer[1] = PRISM2_RID_CNFWEPDEFAULTKEY0;
00374     <span class="comment">// copy ssid string to buffer</span>
00375     strncpy((<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>*)&amp;buffer[2], wepkey, 13);
00376     buffer[8] &amp;= 0x00FF;
00377     <span class="comment">// write SSID</span>
00378     prism2WriteRID(PRISM2_RID_CNFWEPDEFAULTKEY0, 0, buffer, buffer[0]);
00379 
00380     <span class="comment">// set WEP active</span>
00381     buffer[0] = 0x0002;
00382     buffer[1] = PRISM2_RID_CNFWEPFLAGS;
00383     buffer[2] = 0x0001;
00384     prism2WriteRID(PRISM2_RID_CNFWEPFLAGS, 0, buffer, buffer[0]);
00385     <span class="comment">// set WEP active</span>
00386     buffer[0] = 0x0002;
00387     buffer[1] = 0xfc2a;
00388     buffer[2] = 0x0001;
00389     prism2WriteRID(0xfc2a, 0, buffer, buffer[0]);
00390     <span class="comment">// set WEP active</span>
00391     buffer[0] = 0x0002;
00392     buffer[1] = 0xfc23;
00393     buffer[2] = 0x0000;
00394     prism2WriteRID(0xfc23, 0, buffer, buffer[0]);
00395 
00396 }
00397 
00398 u08 prism2Command(u16 cmd, u16 param0)
00399 {
00400     u16 result;
00401 
00402     <span class="comment">// wait until card not busy</span>
00403 <span class="comment">//  rprintf("PRISM_CMD: Wait until card ready\r\n");</span>
00404     <span class="keywordflow">while</span>(prism2Read16(PRISM2_REG_CMD) &amp; PRISM2_CMD_BUSY);
00405     
00406 <span class="comment">//  rprintf("PRISM_CMD: Issue Command = 0x%x\r\n", cmd);</span>
00407     prism2Write16(PRISM2_REG_PARAM0, param0);
00408     prism2Write16(PRISM2_REG_CMD, cmd);
00409     
00410     <span class="comment">// wait until card not busy</span>
00411 <span class="comment">//  rprintf("PRISM_CMD: Wait until card ready\r\n");</span>
00412     <span class="keywordflow">while</span>(prism2Read16(PRISM2_REG_CMD) &amp; PRISM2_CMD_BUSY);
00413     
00414     <span class="comment">// read event register - wait for command to complete</span>
00415 <span class="comment">//  rprintf("PRISM_CMD: Wait for command to complete\r\n");</span>
00416     <span class="keywordflow">while</span>(!(prism2Read16(PRISM2_REG_EVSTAT) &amp; PRISM2_EVENT_CMD));
00417 
00418     <span class="comment">// read status register</span>
00419     result = prism2Read16(PRISM2_REG_STATUS)&gt;&gt;8;
00420 <span class="comment">//  rprintf("PRISM_CMD: Result  = 0x%x\r\n", result&gt;&gt;8);</span>
00421 <span class="comment">//  rprintf("PRISM_CMD: CmdCode = 0x%x\r\n", result);</span>
00422     
00423     <span class="comment">// acknowledge event</span>
00424 <span class="comment">//  rprintf("PRISM_CMD: Ack command event\r\n");</span>
00425     prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_CMD);
00426 
00427     <span class="comment">// return command result</span>
00428     <span class="keywordflow">return</span> result;
00429 }
00430 
00431 u08 prism2ReadRID(u16 <span class="keywordtype">id</span>, u16 offset, u16* data, u16 len)
00432 {
00433     prism2Command(PRISM2_CMD_ACCESS_RD, <span class="keywordtype">id</span>);
00434     <span class="keywordflow">return</span> prism2ReadBAP0(<span class="keywordtype">id</span>, offset, data, len);
00435 }
00436 
00437 u08 prism2WriteRID(u16 <span class="keywordtype">id</span>, u16 offset, u16* data, u16 len)
00438 {
00439     u08 result;
00440     result = prism2WriteBAP0(<span class="keywordtype">id</span>, offset, data, len);
00441     prism2Command(PRISM2_CMD_ACCESS_WR, <span class="keywordtype">id</span>);
00442     <span class="keywordflow">return</span> result;
00443 }
00444 
00445 u08 prism2ReadBAP0(u16 <span class="keywordtype">id</span>, u16 offset, u16* data, u16 len)
00446 {
00447     <span class="comment">// wait for BAP to be ready</span>
00448     <span class="comment">//rprintf("PRISM_BAP: Wait1\r\n");</span>
00449     <span class="keywordflow">while</span>( prism2Read16(PRISM2_REG_BAP0OFFSET) &amp; PRISM2_BAPOFFSET_BUSY);
00450     <span class="comment">// set ID</span>
00451     prism2Write16(PRISM2_REG_BAP0SEL, <span class="keywordtype">id</span>);
00452     <span class="comment">// set offset</span>
00453     prism2Write16(PRISM2_REG_BAP0OFFSET, offset);
00454     <span class="comment">// wait for BAP to be ready</span>
00455     <span class="comment">//rprintf("PRISM_BAP: Wait2\r\n");</span>
00456     <span class="keywordflow">while</span>( prism2Read16(PRISM2_REG_BAP0OFFSET) &amp; PRISM2_BAPOFFSET_BUSY);
00457     <span class="comment">// check for error</span>
00458     <span class="keywordflow">if</span>(prism2Read16(PRISM2_REG_BAP0OFFSET) &amp; PRISM2_BAPOFFSET_ERROR)
00459         <span class="keywordflow">return</span> -1;
00460     <span class="comment">// read data</span>
00461     <span class="comment">//rprintf("PRISM_BAP: Read\r\n");</span>
00462     <span class="keywordflow">while</span>(len--)
00463         *data++ = prism2Read16(PRISM2_REG_BAP0DATA);
00464     <span class="comment">// return success</span>
00465     <span class="keywordflow">return</span> 0;
00466 }
00467 
00468 u08 prism2WriteBAP0(u16 <span class="keywordtype">id</span>, u16 offset, u16* data, u16 len)
00469 {
00470     <span class="comment">// wait for BAP to be ready</span>
00471     <span class="comment">//rprintf("PRISM_BAP: Wait1\r\n");</span>
00472     <span class="keywordflow">while</span>( prism2Read16(PRISM2_REG_BAP0OFFSET) &amp; PRISM2_BAPOFFSET_BUSY);
00473     <span class="comment">// set ID</span>
00474     prism2Write16(PRISM2_REG_BAP0SEL, <span class="keywordtype">id</span>);
00475     <span class="comment">// set offset</span>
00476     prism2Write16(PRISM2_REG_BAP0OFFSET, offset);
00477     <span class="comment">// wait for BAP to be ready</span>
00478     <span class="comment">//rprintf("PRISM_BAP: Wait2\r\n");</span>
00479     <span class="keywordflow">while</span>( prism2Read16(PRISM2_REG_BAP0OFFSET) &amp; PRISM2_BAPOFFSET_BUSY);
00480     <span class="comment">// check for error</span>
00481     <span class="keywordflow">if</span>(prism2Read16(PRISM2_REG_BAP0OFFSET) &amp; PRISM2_BAPOFFSET_ERROR)
00482         <span class="keywordflow">return</span> -1;
00483     <span class="comment">// write data</span>
00484     <span class="comment">//rprintf("PRISM_BAP: Write\r\n");</span>
00485     <span class="keywordflow">while</span>(len--)
00486         prism2Write16(PRISM2_REG_BAP0DATA, *data++);
00487     <span class="comment">// return success</span>
00488     <span class="keywordflow">return</span> 0;
00489 }
00490 
00491 <span class="keywordtype">void</span> prism2Write(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> address, <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> data)
00492 {
00493     cli();
00494     <span class="comment">// assert the address</span>
00495     outb(PRISM2_HADDRESS_PORT, (address&gt;&gt;8) | (inb(PRISM2_HADDRESS_PORT)&amp;~PRISM2_HADDRESS_MASK));
00496     outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&amp;~PRISM2_ADDRESS_MASK));
00497     <span class="comment">// set data bus as output</span>
00498     outb(PRISM2_DATA_DDR, 0xFF);
00499     <span class="comment">// place data on bus</span>
00500     outb(PRISM2_DATA_PORT, data);
00501     <span class="comment">// assert write</span>
00502     cbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_IOWR);
00503     <span class="comment">// delay</span>
00504     PRISM2_IO_ACCESS_DELAY;
00505     <span class="comment">// negate write</span>
00506     sbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_IOWR);
00507     <span class="comment">// set data bus back to input with pullups enabled</span>
00508     outb(PRISM2_DATA_DDR, 0x00);
00509     outb(PRISM2_DATA_PORT, 0xFF);
00510     sei();
00511 }
00512 
00513 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> prism2Read(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> address)
00514 {
00515     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> data;
00516     cli();
00517     <span class="comment">// assert the address</span>
00518     outb(PRISM2_HADDRESS_PORT, (address&gt;&gt;8) | (inb(PRISM2_HADDRESS_PORT)&amp;~PRISM2_HADDRESS_MASK));
00519     outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&amp;~PRISM2_ADDRESS_MASK));
00520     <span class="comment">// set data bus to input with pullups enabled</span>
00521     outb(PRISM2_DATA_DDR, 0x00);
00522     outb(PRISM2_DATA_PORT, 0xFF);
00523     <span class="comment">// assert read</span>
00524     cbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_IORD);
00525     <span class="comment">// delay</span>
00526     PRISM2_IO_ACCESS_DELAY;
00527     <span class="comment">// read in the data</span>
00528     data = inb( PRISM2_DATA_PIN );
00529     <span class="comment">// negate read</span>
00530     sbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_IORD);
00531     <span class="comment">// return data</span>
00532     sei();
00533     <span class="keywordflow">return</span> data;
00534 }
00535 
00536 <span class="keywordtype">void</span> prism2Write16(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> address, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> data)
00537 {
00538     prism2Write(address, data);
00539     prism2Write(address+1, data&gt;&gt;8);
00540 }
00541 
00542 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> prism2Read16(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> address)
00543 {
00544     <span class="keywordflow">return</span> prism2Read(address) | (prism2Read(address+1)&lt;&lt;8);
00545 }
00546 
00547 <span class="keywordtype">void</span> prism2WriteMem(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> address, <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> data)
00548 {
00549     cli();
00550     <span class="comment">// assert the address</span>
00551     outb(PRISM2_HADDRESS_PORT, (address&gt;&gt;8) | (inb(PRISM2_HADDRESS_PORT)&amp;~PRISM2_HADDRESS_MASK));
00552     outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&amp;~PRISM2_ADDRESS_MASK));
00553     <span class="comment">// set data bus as output</span>
00554     outb(PRISM2_DATA_DDR, 0xFF);
00555     <span class="comment">// place data on bus</span>
00556     outb(PRISM2_DATA_PORT, data);
00557     <span class="comment">// assert write</span>
00558     cbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_MEMWR);
00559     <span class="comment">// delay</span>
00560     PRISM2_MEM_ACCESS_DELAY;
00561     <span class="comment">// negate write</span>
00562     sbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_MEMWR);
00563     <span class="comment">// set data bus back to input with pullups enabled</span>
00564     outb(PRISM2_DATA_DDR, 0x00);
00565     outb(PRISM2_DATA_PORT, 0xFF);
00566     sei();
00567 }
00568 
00569 <span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> prism2ReadMem(<span class="keywordtype">unsigned</span> <span class="keywordtype">short</span> address)
00570 {
00571     <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> data;
00572     cli();
00573     <span class="comment">// assert the address</span>
00574     outb(PRISM2_HADDRESS_PORT, (address&gt;&gt;8) | (inb(PRISM2_HADDRESS_PORT)&amp;~PRISM2_HADDRESS_MASK));
00575     outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&amp;~PRISM2_ADDRESS_MASK));
00576     <span class="comment">// set data bus to input with pullups enabled</span>
00577     outb(PRISM2_DATA_DDR, 0x00);
00578     outb(PRISM2_DATA_PORT, 0xFF);
00579     <span class="comment">// assert read</span>
00580     cbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_MEMRD);
00581     <span class="comment">// delay</span>
00582     PRISM2_MEM_ACCESS_DELAY;
00583     <span class="comment">// read in the data</span>
00584     data = inb( PRISM2_DATA_PIN );
00585     <span class="comment">// negate read</span>
00586     sbi(PRISM2_CONTROL_PORT, PRISM2_CONTROL_MEMRD);
00587     sei();
00588     <span class="comment">// return data</span>
00589     <span class="keywordflow">return</span> data;
00590 }
00591 
00592 <span class="keywordtype">void</span> prism2CardRegDump(<span class="keywordtype">void</span>)
00593 {
00594     u16 i;
00595     u08 buffer[0x100];
00596 
00597     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Card Config Registers\r\n"</span>);
00598     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"-------------------------------\r\n"</span>);
00599     <span class="comment">// read card CIS (16 bytes)</span>
00600     rprintf(<span class="stringliteral">"CIS : \r\n"</span>);
00601     <span class="keywordflow">for</span>(i=0; i&lt;0x100; i++)
00602         buffer[i] = prism2ReadMem(i&lt;&lt;1);
00603     <a class="code" href="debug_8c.html#a0">debugPrintHexTable</a>(0x100, buffer);
00604 
00605     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00606 
00607     rprintf(<span class="stringliteral">"COR : "</span>); <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(prism2ReadMem(0x3E0+PCMCIA_ATTR_COR)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00608     rprintf(<span class="stringliteral">"CSR : "</span>); <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(prism2ReadMem(0x3E0+PCMCIA_ATTR_CSR)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00609     rprintf(<span class="stringliteral">"PRR : "</span>); <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(prism2ReadMem(0x3E0+PCMCIA_ATTR_PRR)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00610     rprintf(<span class="stringliteral">"SCR : "</span>); <a class="code" href="group__rprintf.html#ga7">rprintfu08</a>(prism2ReadMem(0x3E0+PCMCIA_ATTR_SCR)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00611 }
00612 
00613 <span class="keywordtype">void</span> prism2RegDump(<span class="keywordtype">void</span>)
00614 {
00615     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"Prism2 Registers\r\n"</span>);
00616     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"CMD     : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_CMD));        <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00617     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"PARAM0  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_PARAM0));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00618     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"PARAM1  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_PARAM1));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00619     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"PARAM2  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_PARAM2));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00620     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"STATUS  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_STATUS));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00621     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"RESP0   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_RESP0));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00622     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"RESP1   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_RESP1));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00623     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"RESP2   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_RESP2));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00624 
00625     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"INFOFID : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_INFOFID));    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00626     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"RXFID   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_RXFID));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00627     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"ALLOCFID: "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_ALLOCFID));   <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00628     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"TXFID   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_TXFID));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00629 
00630     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BAP0SEL : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_BAP0SEL));    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00631     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BAP0OFFS: "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_BAP0OFFSET)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00632     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BAP0DATA: "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_BAP0DATA));   <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00633 
00634     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BAP1SEL : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_BAP1SEL));    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00635     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BAP1OFFS: "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_BAP1OFFSET)); <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00636     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"BAP1DATA: "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_BAP1DATA));   <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00637 
00638     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"EVSTAT  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_EVSTAT));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00639     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"INTEN   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_INTEN));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00640     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"EVACK   : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_EVACK));      <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00641 
00642     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"SWSUP0  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_SWSUP0));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00643     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"SWSUP0  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_SWSUP1));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00644     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"SWSUP0  : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_SWSUP2));     <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00645 
00646     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"AUXPAGE : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_AUXPAGE));    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00647     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"AUXOFFS : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_AUXOFFSET));  <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00648     <a class="code" href="group__rprintf.html#ga15">rprintfProgStrM</a>(<span class="stringliteral">"AUXDATA : "</span>); <a class="code" href="group__rprintf.html#ga8">rprintfu16</a>(prism2Read16(PRISM2_REG_AUXDATA));    <a class="code" href="group__rprintf.html#ga5">rprintfCRLF</a>();
00649 
00650     delay_ms(25);
00651 }
</pre></div><hr size="1"><address style="align: right;"><small>Generated on Sun Oct 29 03:41:07 2006 for Procyon AVRlib by&nbsp;
<a href="http://www.doxygen.org/index.html">
<img src="doxygen.png" alt="doxygen" align="middle" border="0"></a> 1.4.2 </small></address>
</body>
</html>
{FILE END}
{FOOTER START}

Powered by WebSVN v2.8.3