<!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 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>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 <avr/io.h></span>
00019 <span class="preprocessor">#include <avr/interrupt.h></span>
00020 <span class="preprocessor">#include <string.h></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) & 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<6;++i)
00068 TxHeader[23+i] = packet[i*2+1]<<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]<<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, &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*)&packet[14], (len+1)>>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<22;i++)
00112 header[i] = 0x00;
00113
00114 <span class="comment">// set TxRate and retry count</span>
00115 header[5] = (0<<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 & PRISM2_EVENT_TX)
00144 {
00145 prism2Write16(PRISM2_REG_EVACK,PRISM2_EVENT_TX);
00146 }
00147
00148 <span class="keywordflow">if</span>(evstat_data & PRISM2_EVENT_TXEXEC)
00149 {
00150 prism2Write16(PRISM2_REG_EVACK,PRISM2_EVENT_TXEXEC);
00151 }
00152
00153 <span class="keywordflow">if</span>(evstat_data & PRISM2_EVENT_ALLOC)
00154 {
00155 prism2Write16(PRISM2_REG_EVACK, 0x0002);
00156 }
00157
00158 <span class="keywordflow">if</span>(evstat_data & PRISM2_EVENT_CMD)
00159 {
00160 prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_CMD);
00161 }
00162
00163 <span class="keywordflow">if</span>(evstat_data & 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 & PRISM2_EVENT_INFDROP)
00170 {
00171 prism2Write16(PRISM2_REG_EVACK, PRISM2_EVENT_INFDROP);
00172 }
00173
00174 <span class="keywordflow">if</span>(evstat_data & 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) & 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, &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 > 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*)&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*)&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]>>8;
00347 *macaddr++ = buffer[3];
00348 *macaddr++ = buffer[3]>>8;
00349 *macaddr++ = buffer[4];
00350 *macaddr++ = buffer[4]>>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>*)&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>*)&buffer[2], wepkey, 13);
00376 buffer[8] &= 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) & 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) & 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) & PRISM2_EVENT_CMD));
00417
00418 <span class="comment">// read status register</span>
00419 result = prism2Read16(PRISM2_REG_STATUS)>>8;
00420 <span class="comment">// rprintf("PRISM_CMD: Result = 0x%x\r\n", result>>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) & 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) & PRISM2_BAPOFFSET_BUSY);
00457 <span class="comment">// check for error</span>
00458 <span class="keywordflow">if</span>(prism2Read16(PRISM2_REG_BAP0OFFSET) & 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) & 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) & PRISM2_BAPOFFSET_BUSY);
00480 <span class="comment">// check for error</span>
00481 <span class="keywordflow">if</span>(prism2Read16(PRISM2_REG_BAP0OFFSET) & 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>>8) | (inb(PRISM2_HADDRESS_PORT)&~PRISM2_HADDRESS_MASK));
00496 outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&~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>>8) | (inb(PRISM2_HADDRESS_PORT)&~PRISM2_HADDRESS_MASK));
00519 outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&~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>>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)<<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>>8) | (inb(PRISM2_HADDRESS_PORT)&~PRISM2_HADDRESS_MASK));
00552 outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&~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>>8) | (inb(PRISM2_HADDRESS_PORT)&~PRISM2_HADDRESS_MASK));
00575 outb(PRISM2_ADDRESS_PORT, address | (inb(PRISM2_ADDRESS_PORT)&~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<0x100; i++)
00602 buffer[i] = prism2ReadMem(i<<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
<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>
|