]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/dp8390.c
La placa ya está recibiendo (es decir, recibiendo la placa y parseando Ethernet,
[z.facultad/66.09/etherled.git] / src / dp8390.c
index 63923077de072e4372eec425860de3e0480849db..946ebc7acb07952643cb15dbf76995f96113a775 100644 (file)
@@ -1,21 +1,11 @@
 // vim: set et sw=4 sts=4 :    
 
+#include "debug.h"
 #include "eth.h"
 #include "dp8390.h"
 
-#ifdef DEBUG
-void sleep(unsigned char);
-#ifdef SDCC
-static xdata at 0x0080 byte leds0;
-static xdata at 0x00c0 byte leds1;
-#else
-static byte xdata leds0 _at_ 0x0080;
-static byte xdata leds1 _at_ 0x00c0;
-#endif
-#endif
-
 /// Datos persistentes del módulo
-static union
+static union // Unión porque nunca se usan ambos juntos
 {
     byte send_len; ///> Tamaño del frame que será enviado
     byte next_pkt; ///> Próximo frame a obtener
@@ -274,7 +264,7 @@ void netdev_send_start()
     write_reg(RBCR1, 0u);
 
     // Initiate DMA transfer of uip_buf & uip_appdata buffers to RTL8019AS.
-    write_reg(CR, WRITE | STA);
+    write_reg(CR, WRITE);
 }
 
 /** Escribe un byte al buffer de la placa de red para ser enviado
@@ -327,7 +317,10 @@ void netdev_send_end()
  * @return Cantidad de bytes del frame leído
  */
 byte netdev_recv_start()
-{    
+{
+    // Indicamos que no se leyó el paquete
+    persistent.next_pkt = 0;
+
     // Check if the rx buffer has overflowed.
     if (read_reg(ISR) & OVW)
     {
@@ -344,17 +337,9 @@ byte netdev_recv_start()
 
         if (read_reg(BNRY) == current)
         {
-#ifdef DEBUG
-            leds1 = ~0x01;
-            leds2 = ~read_reg(ISR);
-            sleep(5);
-            leds1 = ~0x02;
-            leds2 = ~read_reg(BNRY);
-            sleep(5);
-            leds1 = ~0x04;
-            leds2 = ~current;
-            sleep(5);
-#endif
+            printb(read_reg(ISR), 0x01);
+            printb(read_reg(BNRY), 0x02);
+            printb(current, 0x04);
             reset();
         }
         return 0u;
@@ -393,6 +378,7 @@ byte netdev_recv_start()
         // Check if last packet has been removed from rx buffer.
         if(bnry == current)
         {
+            print(0x0000);
             // Clear packet received interrupt flag.
             write_reg(ISR, PRX | RXE);
             return 0u;
@@ -400,7 +386,7 @@ byte netdev_recv_start()
 
         // Set remote DMA byte count registers to packet header length.
         write_reg(RBCR0, sizeof(struct buf_hdr_t));
-        write_reg(RBCR1, 0u);
+        write_reg(RBCR1, 0x00);
 
         // Clear remote DMA complete interrupt status register bit.
         write_reg(ISR, RDC);
@@ -412,7 +398,14 @@ byte netdev_recv_start()
         buf_hdr.status = read_reg(RDMA);
 
         // Save next packet pointer.
-        buf_hdr.next = persistent.next_pkt = read_reg(RDMA);
+        buf_hdr.next = read_reg(RDMA);
+
+        // Indicamos cual es el próximo paquete para cuando termine
+        persistent.next_pkt = buf_hdr.next - 1;
+
+        printb(bnry,         0x03);
+        printb(current,      0x07);
+        printb(buf_hdr.next, 0x0f);
 
         // Retrieve packet data length and subtract CRC bytes.
         buf_hdr.len = read_reg(RDMA) - sizeof(struct buf_hdr_t);
@@ -420,10 +413,12 @@ byte netdev_recv_start()
         // Si es muy grande, muy chico o hubo error, lo descartamos
         if ((buf_hdr.len < MIN_PACKET_LEN) || (buf_hdr.len > MAX_PACKET_LEN)
                 || ((buf_hdr.status & 0x0F) != RXSOK)
-                || read_reg(RDMA)) // Parte alta del tamaño
+                || (current = read_reg(RDMA))) // Parte alta del tamaño
         {
-            ABORT_DMA(START); // Termina DMA
-            write_reg(BNRY, buf_hdr.next - 1); // Pasa al próximo frame
+            printb(buf_hdr.next,   0x1f);
+            printb(buf_hdr.status, 0x3f);
+            printb(buf_hdr.len,    0x7f);
+            printb(current,        0xff);
             return 0;
         }
 
@@ -469,9 +464,10 @@ uint16 netdev_recv_word()
 void netdev_recv_end()
 {
     // Abort/ complete DMA operation.
-    ABORT_DMA(START);
+    ABORT_DMA(STOP);
 
     // Advance boundary pointer to next packet start.
-    write_reg(BNRY, persistent.next_pkt - 1);
+    if (persistent.next_pkt)
+        write_reg(BNRY, persistent.next_pkt);
 }