📄 ax88796_8c-source.html
字号:
00230 00231 <span class="keywordflow">if</span>(ax88796Read(GPI) & I_SPD) <span class="comment">// check PHY speed setting</span>00232 tcrFduFlag = FDU; <span class="comment">// if 100base, do full duplex</span>00233 <span class="keywordflow">else</span>00234 tcrFduFlag = 0; <span class="comment">// if 10base, do half duplex</span>00235 00236 ax88796Write(TCR,(tcrFduFlag|TCR_INIT));00237 00238 ax88796Write(GPOC,MPSEL); <span class="comment">// select media interface</span>00239 00240 ax88796Write(TPSR,TXSTART_INIT);00241 00242 ax88796Write(CR,(RD2|STOP));00243 ax88796Write(DCR,DCR_INIT);00244 ax88796Write(CR,(RD2|START));00245 ax88796Write(ISR,0xFF);00246 ax88796Write(IMR,IMR_INIT);00247 ax88796Write(TCR,(tcrFduFlag|TCR_INIT));00248 00249 <span class="comment">//test</span>00250 <span class="comment">/*</span>00251 <span class="comment"> while(1)</span>00252 <span class="comment"> {</span>00253 <span class="comment"> vt100SetCursorPos(18,0);</span>00254 <span class="comment"> ax88796RegDump();</span>00255 <span class="comment"> }</span>00256 <span class="comment">*/</span>00257 }00258 00259 00260 <span class="keywordtype">void</span> ax88796BeginPacketSend(<span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> packetLength)00261 {00262 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> sendPacketLength;00263 sendPacketLength = (packetLength>=ETHERNET_MIN_PACKET_LENGTH)?00264 (packetLength):(ETHERNET_MIN_PACKET_LENGTH);00265 00266 <span class="comment">//start the NIC</span>00267 ax88796Write(CR,(RD2|START));00268 00269 <span class="comment">// still transmitting a packet - wait for it to finish</span>00270 <span class="keywordflow">while</span>( ax88796Read(CR) & TXP );00271 00272 <span class="comment">//load beginning page for transmit buffer</span>00273 ax88796Write(TPSR,TXSTART_INIT);00274 00275 <span class="comment">//set start address for remote DMA operation</span>00276 ax88796Write(RSAR0,0x00);00277 ax88796Write(RSAR1,0x40);00278 00279 <span class="comment">//clear the packet stored interrupt</span>00280 ax88796Write(ISR, PTX);00281 00282 <span class="comment">//load data byte count for remote DMA</span>00283 ax88796Write(RBCR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(packetLength));00284 ax88796Write(RBCR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(packetLength>>8));00285 00286 ax88796Write(TBCR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(sendPacketLength));00287 ax88796Write(TBCR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)((sendPacketLength)>>8));00288 00289 <span class="comment">//do remote write operation</span>00290 ax88796Write(CR,0x12);00291 }00292 00293 00294 <span class="keywordtype">void</span> ax88796SendPacketData(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * localBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00295 {00296 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00297 00298 <span class="keywordflow">for</span>(i=0;i<length;i++)00299 ax88796Write(RDMAPORT, localBuffer[i]);00300 }00301 00302 00303 <span class="keywordtype">void</span> ax88796EndPacketSend(<span class="keywordtype">void</span>)00304 {00305 <span class="comment">//send the contents of the transmit buffer onto the network</span>00306 ax88796Write(CR,(RD2|TXP));00307 00308 <span class="comment">// clear the remote DMA interrupt</span>00309 ax88796Write(ISR, RDC);00310 }00311 00312 00313 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> ax88796BeginPacketRetreive(<span class="keywordtype">void</span>)00314 {00315 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> writePagePtr;00316 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> readPagePtr;00317 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bnryPagePtr;00318 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;00319 00320 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> pageheader[4];00321 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> rxlen;00322 00323 <span class="comment">// check for and handle an overflow</span>00324 ax88796ProcessInterrupt();00325 00326 <span class="comment">// read CURR from page 1</span>00327 ax88796Write(CR,(PS0|RD2|START));00328 writePagePtr = ax88796Read(CURR);00329 <span class="comment">// read the boundary register from page 0</span>00330 ax88796Write(CR,(RD2|START));00331 bnryPagePtr = ax88796Read(BNRY);00332 00333 <span class="comment">// first packet is at page bnryPtr+1</span>00334 readPagePtr = bnryPagePtr+1;00335 <span class="keywordflow">if</span>(readPagePtr >= RXSTOP_INIT) readPagePtr = RXSTART_INIT;00336 00337 <span class="comment">// return if there is no packet in the buffer</span>00338 <span class="keywordflow">if</span>( readPagePtr == writePagePtr )00339 {00340 <span class="keywordflow">return</span> 0;00341 }00342 00343 <span class="comment">// clear the packet received interrupt flag</span>00344 ax88796Write(ISR, PRX);00345 00346 <span class="comment">// if the boundary pointer is invalid,</span>00347 <span class="comment">// reset the contents of the buffer and exit</span>00348 <span class="keywordflow">if</span>( (bnryPagePtr < RXSTART_INIT) || (bnryPagePtr >= RXSTOP_INIT) )00349 {00350 ax88796Write(BNRY, RXSTART_INIT);00351 ax88796Write(CR, (PS0|RD2|START));00352 ax88796Write(CURR, RXSTART_INIT+1);00353 ax88796Write(CR, (RD2|START));00354 00355 <span class="comment">// rprintf("B");</span>00356 <span class="keywordflow">return</span> 0;00357 }00358 00359 <span class="comment">// initiate DMA to transfer the RTL8019 packet header</span>00360 ax88796Write(RBCR0, 4);00361 ax88796Write(RBCR1, 0);00362 ax88796Write(RSAR0, 0);00363 ax88796Write(RSAR1, readPagePtr);00364 ax88796Write(CR, (RD0|START));00365 <span class="keywordflow">for</span>(i=0;i<4;i++)00366 pageheader[i] = ax88796Read(RDMAPORT);00367 00368 <span class="comment">// end the DMA operation</span>00369 ax88796Write(CR, (RD2|START));00370 <span class="keywordflow">for</span>(i = 0; i <= 20; i++)00371 <span class="keywordflow">if</span>(ax88796Read(ISR) & RDC)00372 <span class="keywordflow">break</span>;00373 ax88796Write(ISR, RDC);00374 00375 rxlen = (pageheader[PKTHEADER_PKTLENH]<<8) + pageheader[PKTHEADER_PKTLENL];00376 NextPage = pageheader[PKTHEADER_NEXTPAGE];00377 00378 CurrentRetreiveAddress = (readPagePtr<<8) + 4;00379 00380 <span class="comment">// if the NextPage pointer is invalid, the packet is not ready yet - exit</span>00381 <span class="keywordflow">if</span>( (NextPage >= RXSTOP_INIT) || (NextPage < RXSTART_INIT) )00382 {00383 <span class="comment">// rprintf("N");</span>00384 <span class="comment">// rprintfu08(nextPage);</span>00385 <span class="keywordflow">return</span> 0;00386 }00387 00388 <span class="keywordflow">return</span> rxlen-4;00389 }00390 00391 00392 <span class="keywordtype">void</span> ax88796RetreivePacketData(<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> * localBuffer, <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> length)00393 {00394 <span class="keywordtype">unsigned</span> <span class="keywordtype">int</span> i;00395 00396 <span class="comment">// initiate DMA to transfer the data</span>00397 ax88796Write(RBCR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)length);00398 ax88796Write(RBCR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(length>>8));00399 ax88796Write(RSAR0, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)CurrentRetreiveAddress);00400 ax88796Write(RSAR1, (<span class="keywordtype">unsigned</span> <span class="keywordtype">char</span>)(CurrentRetreiveAddress>>8));00401 ax88796Write(CR, (RD0|START));00402 <span class="keywordflow">for</span>(i=0;i<length;i++)00403 localBuffer[i] = ax88796Read(RDMAPORT);00404 00405 <span class="comment">// end the DMA operation</span>00406 ax88796Write(CR, (RD2|START));00407 <span class="keywordflow">for</span>(i = 0; i <= 20; i++)00408 <span class="keywordflow">if</span>(ax88796Read(ISR) & RDC)00409 <span class="keywordflow">break</span>;00410 ax88796Write(ISR, RDC);00411 00412 CurrentRetreiveAddress += length;00413 <span class="keywordflow">if</span>( CurrentRetreiveAddress >= 0x6000 )00414 CurrentRetreiveAddress -= (0x6000-0x4600) ;00415 }00416 00417 00418 <span class="keywordtype">void</span> ax88796EndPacketRetreive(<span class="keywordtype">void</span>)00419 {00420 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> i;00421 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> bnryPagePtr;00422 00423 <span class="comment">// end the DMA operation</span>00424 ax88796Write(CR, (RD2|START));00425 <span class="keywordflow">for</span>(i = 0; i <= 20; i++)00426 <span class="keywordflow">if</span>(ax88796Read(ISR) & RDC)00427 <span class="keywordflow">break</span>;00428 ax88796Write(ISR, RDC);00429 00430 <span class="comment">// set the boundary register to point</span>00431 <span class="comment">// to the start of the next packet-1</span>00432 bnryPagePtr = NextPage-1;00433 <span class="keywordflow">if</span>(bnryPagePtr < RXSTART_INIT) bnryPagePtr = RXSTOP_INIT-1;00434 00435 ax88796Write(BNRY, bnryPagePtr);00436 }00437 00438 00439 <span class="keywordtype">void</span> ax88796ProcessInterrupt(<span class="keywordtype">void</span>)00440 {00441 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> intr = ax88796Read(ISR);00442 00443 <span class="comment">// check for receive overflow</span>00444 <span class="keywordflow">if</span>( intr & OVW )00445 ax88796ReceiveOverflowRecover();00446 }00447 00448 00449 <span class="keywordtype">void</span> ax88796ReceiveOverflowRecover(<span class="keywordtype">void</span>)00450 {00451 <span class="comment">// receive buffer overflow handling procedure</span>00452 <span class="comment">// as specified in the AX88796 datasheet</span>00453 00454 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> cmdReg;00455 <span class="keywordtype">unsigned</span> <span class="keywordtype">char</span> resend=0;00456 00457 <span class="comment">// check if we were transmitting something</span>00458 cmdReg = ax88796Read(CR);00459 <span class="comment">// stop the interface</span>00460 ax88796Write(CR, (RD2|STOP));00461 <span class="comment">// wait for timeout</span>00462 delay_ms(2);00463 <span class="comment">// clear remote byte count registers</span>00464 ax88796Write(RBCR0, 0x00);00465 ax88796Write(RBCR1, 0x00);00466 00467 <span class="comment">// if we were transmitting something</span>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -