]> git.llucax.com Git - z.facultad/66.09/etherled.git/blobdiff - src/dp8390.c
Se implementa un sistema primitivo de 'locking' para los leds. Cada vez que se
[z.facultad/66.09/etherled.git] / src / dp8390.c
index c56bb843a2a81658ee69d32ad963944a680c2730..76d0c6d3a292d321eb74457c11df9aadcba48809 100644 (file)
@@ -40,6 +40,7 @@ recv_state;
 
 static void write_reg(unsigned char reg, unsigned char wr_data)
 {
+    leds_lock();
     // Select register address.
     ADDR_PORT &= ~ADDR_PORT_MASK; 
     ADDR_PORT |= reg;
@@ -56,11 +57,13 @@ static void write_reg(unsigned char reg, unsigned char wr_data)
 
     // Set register data port as input again.
     DATA_PORT = DATA_PORT_MASK;
+    leds_unlock();
 } 
 
 
 static unsigned char read_reg(unsigned char reg)
 {
+    leds_lock();
     // Select register address.
     ADDR_PORT &= ~ADDR_PORT_MASK;
     ADDR_PORT |= reg;
@@ -76,6 +79,7 @@ static unsigned char read_reg(unsigned char reg)
     IOR = 1; 
     NICE = 1;   
 
+    leds_unlock();
     return reg;
 } 
 
@@ -247,6 +251,10 @@ bool netdev_init()
 /** Comienza el envío de un nuevo frame */
 void netdev_send_start()
 {
+    // Wait until pending transmit operation completes.
+    while (read_reg(CR) & TXP) continue;
+    write_reg(ISR, PTX); // Limpio bit de interrupción
+
     // Set remote DMA start address registers to indicate where to load packet.
     write_reg(RSAR0, 0u);
     write_reg(RSAR1, TX_PAGE_START);
@@ -272,15 +280,26 @@ void netdev_send_end(byte len)
 
     // Issue command for RTL8019AS to transmit packet from it's local buffer.
     write_reg(CR, START | TXP);
-
-    // Wait until pending transmit operation completes.
-    while(read_reg(CR) & TXP) continue;
 }
 
 void netdev_write_start(byte len)
 {
     // Set remote DMA byte count registers to indicate length of packet load.
-    write_reg(RBCR0, len); // Tamaño máximo en principio
+    write_reg(RBCR0, len);
+    write_reg(RBCR1, 0u);
+
+    // Initiate DMA transfer of uip_buf & uip_appdata buffers to RTL8019AS.
+    write_reg(CR, WRITE);
+}
+
+void netdev_write_start_at(byte offset, byte len)
+{
+    // Set remote DMA start address registers to packet data.
+    write_reg(RSAR0, offset);
+    write_reg(RSAR1, TX_PAGE_START);
+
+    // Set remote DMA byte count registers to indicate length of packet load.
+    write_reg(RBCR0, len);
     write_reg(RBCR1, 0u);
 
     // Initiate DMA transfer of uip_buf & uip_appdata buffers to RTL8019AS.
@@ -333,7 +352,7 @@ byte netdev_recv_start()
             printb(read_reg(ISR), 0x01);
             printb(read_reg(BNRY), 0x02);
             printb(current, 0x04);
-            ledsb(0x00, 0x00);
+            printb(0x00, 0x00);
             reset();
         }
         return 0;