]> git.llucax.com Git - z.facultad/66.09/etherled.git/commitdiff
Bugfixes:
authorLeandro Lucarella <llucax@gmail.com>
Thu, 8 Dec 2005 20:47:35 +0000 (20:47 +0000)
committerLeandro Lucarella <llucax@gmail.com>
Thu, 8 Dec 2005 20:47:35 +0000 (20:47 +0000)
1) Se arregla problema con paquetes con tamaño impar.
2) Se vuelve para atrás el cambio del OVW (estaba basado en el driver de Linux
   que hace un manejo MUCHO más elegante del OVW porque puede darse el lujo de
   usar mucha memoria =)
3) Se obtiene la MAC de la placa de forma un poco más elegante.

src/dp8390.c
src/dp8390.h
src/main.c

index 642c36fc676b16539f32fc54265cd129ca3bbe38..30b3fb53468977e1ac9713b84bdb3d47a3809c57 100644 (file)
@@ -121,7 +121,7 @@ static void reset()
     SELECT_REG_PAGE(0);
 
     // Clear rx buffer overflow & packet received interrupt flags.
     SELECT_REG_PAGE(0);
 
     // Clear rx buffer overflow & packet received interrupt flags.
-    write_reg(ISR, OVW);
+    write_reg(ISR, PRX | OVW);
 
     // Re-itialise transmit configuration reg for normal operation.
     write_reg(TCR, MODE0);
 
     // Re-itialise transmit configuration reg for normal operation.
     write_reg(TCR, MODE0);
@@ -139,6 +139,8 @@ static void reset()
  */
 bool netdev_init()
 {
  */
 bool netdev_init()
 {
+    byte i;
+
     // Set IOR & IOW as they're active low.
     IOR = 1;
     IOW = 1;
     // Set IOR & IOW as they're active low.
     IOR = 1;
     IOW = 1;
@@ -191,18 +193,11 @@ bool netdev_init()
     write_reg(RSAR0, 0u); // En la dirección 0x0000
     write_reg(RSAR1, 0u);
     write_reg(CR, READ); // Comienza lectura
     write_reg(RSAR0, 0u); // En la dirección 0x0000
     write_reg(RSAR1, 0u);
     write_reg(CR, READ); // Comienza lectura
-    eth_addr_local[0] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[1] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[2] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[3] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[4] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
-    eth_addr_local[5] = read_reg(RDMA);
-    read_reg(RDMA); // Ignoramos porque viene como un word
+    for (i = 0; i < ETH_ADDR_SIZE; ++i)
+    {
+        eth_addr_local[i] = read_reg(RDMA);
+        read_reg(RDMA); // Ignoramos porque viene como un word
+    }
 
     // Abort/ complete DMA operation.
     ABORT_DMA(STOP);
 
     // Abort/ complete DMA operation.
     ABORT_DMA(STOP);
@@ -226,12 +221,8 @@ bool netdev_init()
     write_reg(CURR, RX_PAGE_START + 1);
 
     // Set physical address
     write_reg(CURR, RX_PAGE_START + 1);
 
     // Set physical address
-    write_reg(PAR0, eth_addr_local[0]);
-    write_reg(PAR1, eth_addr_local[1]);
-    write_reg(PAR2, eth_addr_local[2]);
-    write_reg(PAR3, eth_addr_local[3]);
-    write_reg(PAR4, eth_addr_local[4]);
-    write_reg(PAR5, eth_addr_local[5]);
+    for (i = 0; i < ETH_ADDR_SIZE; ++i)
+        write_reg(PAR_BASE + i, eth_addr_local[i]);
 
     // Restart RTL8019AS. 
     write_reg(CR, START);
 
     // Restart RTL8019AS. 
     write_reg(CR, START);
@@ -427,7 +418,7 @@ byte netdev_recv_start()
 
         // Initiate DMA transfer of packet data.
         write_reg(CR, READ);
 
         // Initiate DMA transfer of packet data.
         write_reg(CR, READ);
-
+    
         return buf_hdr.len;
     }
     return 0;
         return buf_hdr.len;
     }
     return 0;
index 2f0f9b8ed9e0ca04387a7af55097fbcbab3c5a2a..a11854cfc839e711e3eb862dcf4871b004df1563 100644 (file)
@@ -137,6 +137,7 @@ sbit NICE = CTRL_PORT^2;    // A7, usado para activar placa de red
     // Each enable bit correspons with an interrupt flag in ISR
 
 // Page 1 read/write registers.
     // Each enable bit correspons with an interrupt flag in ISR
 
 // Page 1 read/write registers.
+#define PAR_BASE     REG_BASE + 0x01   // Physical address register base address
 #define PAR0         REG_BASE + 0x01   // Physical address register 0
 #define PAR1         REG_BASE + 0x02   // Physical address register 1
 #define PAR2         REG_BASE + 0x03   // Physical address register 2
 #define PAR0         REG_BASE + 0x01   // Physical address register 0
 #define PAR1         REG_BASE + 0x02   // Physical address register 1
 #define PAR2         REG_BASE + 0x03   // Physical address register 2
index c679ac80ea11c951a31be02de362b761ba02ec0f..419ad419adc697d59decf92c10c12573575da747 100644 (file)
@@ -74,12 +74,10 @@ void main(void)
                         // Nuestro protocolo, por ahora un simple echo!
                         for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP
                         {
                         // Nuestro protocolo, por ahora un simple echo!
                         for (i = 8; i < udp_dgram_len; ++i) // 8 por la cabecera UDP
                         {
-                            leds0 = ~netdev_recv_byte();
-                            leds1 = ~i;
-                            sleep(8);
+                            printb(netdev_recv_byte(), 0x00);
                         }
                         }
-                        i = (udp_dgram_len % 2) ? udp_dgram_len : (udp_dgram_len + 1);
-                        for (i += 34; i < len; ++i) // 8 por la cabecera UDP
+                        //i = (udp_dgram_len % 2) ? (udp_dgram_len - 1) : udp_dgram_len;
+                        for (i += 34; i < len; ++i) // 8 por las cabeceras eth+IP
                             netdev_recv_byte();
 drop:
                         netdev_recv_end();
                             netdev_recv_byte();
 drop:
                         netdev_recv_end();