]> git.llucax.com Git - z.facultad/66.09/etherled.git/commitdiff
Arregla problema de la recepción de más de un paquete.
authorLeandro Lucarella <llucax@gmail.com>
Thu, 8 Dec 2005 07:40:24 +0000 (07:40 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 8 Dec 2005 07:40:24 +0000 (07:40 +0000)
En realidad no arregla nada, porque el problema era no terminar de leer todos
los datos del DMA y los datos se leen sólo a modo de prueba, pero la necesidad
de leer completo un DMA será tenida en cuenta cuando se implemente el protocolo
nuestro (o mejor aún en el módulo de la DP8390).

src/dp8390.c
src/main.c

index 946ebc7acb07952643cb15dbf76995f96113a775..3ca44fdfc026f199d1e4bc1308b2424f05580929 100644 (file)
@@ -318,9 +318,6 @@ void netdev_send_end()
  */
 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)
     {
@@ -378,7 +375,6 @@ 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;
@@ -401,30 +397,26 @@ byte netdev_recv_start()
         buf_hdr.next = read_reg(RDMA);
 
         // Indicamos cual es el próximo paquete para cuando termine
+        // FIXME poner más lindo para que consuma menos memoria
         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);
 
         // 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)
-                || (current = read_reg(RDMA))) // Parte alta del tamaño
+                || read_reg(RDMA)) // Parte alta del tamaño
         {
-            printb(buf_hdr.next,   0x1f);
-            printb(buf_hdr.status, 0x3f);
-            printb(buf_hdr.len,    0x7f);
-            printb(current,        0xff);
+            // Abort/ complete DMA operation.
+            ABORT_DMA(START);
+
+            // Advance boundary pointer to next packet start.
+            write_reg(BNRY, persistent.next_pkt);
+
             return 0;
         }
 
-        // Abort/ complete DMA operation.
-        ABORT_DMA(START);
-
         // Set remote DMA start address registers to packet data.
         write_reg(RSAR0, sizeof(struct buf_hdr_t));
         write_reg(RSAR1, bnry);
@@ -464,10 +456,9 @@ uint16 netdev_recv_word()
 void netdev_recv_end()
 {
     // Abort/ complete DMA operation.
-    ABORT_DMA(STOP);
+    ABORT_DMA(START);
 
     // Advance boundary pointer to next packet start.
-    if (persistent.next_pkt)
-        write_reg(BNRY, persistent.next_pkt);
+    write_reg(BNRY, persistent.next_pkt);
 }
 
index e0f6b2e7740006bdfd71f0a088ac563c9784679d..c679ac80ea11c951a31be02de362b761ba02ec0f 100644 (file)
@@ -30,10 +30,11 @@ void main(void)
 
     while (1) // Forever
     {
-        uint16 len = netdev_recv_start();
+        byte i;
+        byte len = netdev_recv_start();
         printb(len, 0x1);
-        if (!len) // no recibimos nada
-            goto drop; // Tiramos el paquete
+        if (!len) // no recibimos nada (válido)
+            continue; // Probamos de nuevo
 
         // Tenemos algo!
         //print(0x2);
@@ -71,10 +72,15 @@ void main(void)
                         printb(udp_dgram_len, 0x40);
                         // TODO
                         // Nuestro protocolo, por ahora un simple echo!
-                        for (len = 8; len < udp_dgram_len; len += 2) // 8 por la cabecera UDP
+                        for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP
                         {
-                            print(netdev_recv_word());
+                            leds0 = ~netdev_recv_byte();
+                            leds1 = ~i;
+                            sleep(8);
                         }
+                        i = (udp_dgram_len % 2) ? udp_dgram_len : (udp_dgram_len + 1);
+                        for (i += 34; i < len; ++i) // 8 por la cabecera UDP
+                            netdev_recv_byte();
 drop:
                         netdev_recv_end();
                 }