commit-gnuradio
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Commit-gnuradio] r7102 - in usrp2/trunk/firmware: apps lib


From: eb
Subject: [Commit-gnuradio] r7102 - in usrp2/trunk/firmware: apps lib
Date: Mon, 10 Dec 2007 18:48:34 -0700 (MST)

Author: eb
Date: 2007-12-10 18:48:34 -0700 (Mon, 10 Dec 2007)
New Revision: 7102

Added:
   usrp2/trunk/firmware/apps/double_buffer_fragment.c
   usrp2/trunk/firmware/lib/memcpy_wa.c
   usrp2/trunk/firmware/lib/memcpy_wa.h
   usrp2/trunk/firmware/lib/print_mac_addr.c
   usrp2/trunk/firmware/lib/u2_eth_packet.h
Modified:
   usrp2/trunk/firmware/apps/gen_eth_packets.c
   usrp2/trunk/firmware/apps/gen_pause_frames.c
   usrp2/trunk/firmware/apps/rcv_eth_packets.c
   usrp2/trunk/firmware/apps/test_serdes.c
   usrp2/trunk/firmware/lib/Makefile.am
   usrp2/trunk/firmware/lib/nonstdio.h
Log:
work-in-progress on u2 firmware

Added: usrp2/trunk/firmware/apps/double_buffer_fragment.c
===================================================================
--- usrp2/trunk/firmware/apps/double_buffer_fragment.c                          
(rev 0)
+++ usrp2/trunk/firmware/apps/double_buffer_fragment.c  2007-12-11 01:48:34 UTC 
(rev 7102)
@@ -0,0 +1,135 @@
+#if 0
+void 
+double_buffering(int port) {
+  unsigned int localstatus = buffer_pool_status->status;
+
+  if(localstatus & BPS_DONE_0) {
+    bp_clear_buf(0);
+    if(buffer_state[0] == FILLING) {
+      buffer_state[0] = FULL;
+      if(buffer_state[1] == EMPTY) {
+       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
+       buffer_state[1] = FILLING;
+      }
+      else
+       dsp_rx_idle = 1;
+      if(serdes_tx_idle) {
+       serdes_tx_idle = 0;
+       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
+       buffer_state[0] = EMPTYING;
+      }
+    }
+    else {  // buffer was emptying
+      buffer_state[0] = EMPTY;
+      if(dsp_rx_idle) {
+       dsp_rx_idle = 0;
+       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 
lines
+       buffer_state[0] = FILLING;
+      }
+      if(buffer_state[1] == FULL) {
+       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
+       buffer_state[1] = EMPTYING;
+      }
+      else
+       serdes_tx_idle = 1;
+    }
+    putstr("Int Proc'ed 0\n");
+  }
+  if(localstatus & BPS_DONE_1) {
+    bp_clear_buf(1);
+    if(buffer_state[1] == FILLING) {
+      buffer_state[1] = FULL;
+      if(buffer_state[0] == EMPTY) {
+       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
+       buffer_state[0] = FILLING;
+      }
+      else
+       dsp_rx_idle = 1;
+      if(serdes_tx_idle) {
+       serdes_tx_idle = 0;
+       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
+       buffer_state[1] = EMPTYING;
+      }
+    }
+    else {  // buffer was emptying
+      buffer_state[1] = EMPTY;
+      if(dsp_rx_idle) {
+       dsp_rx_idle = 0;
+       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
+       buffer_state[1] = FILLING;
+      }
+      if(buffer_state[0] == FULL) {
+       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
+       buffer_state[0] = EMPTYING;
+      }
+      else
+       serdes_tx_idle = 1;
+    }
+  putstr("Int Proc'ed 1\n");
+  }
+  if(localstatus & BPS_DONE_2) {
+    bp_clear_buf(2);
+    if(buffer_state[2] == FILLING) {
+      buffer_state[2] = FULL;
+      if(buffer_state[3] == EMPTY) {
+       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3, use 
500 lines
+       buffer_state[3] = FILLING;
+      }
+      else
+       serdes_rx_idle = 1;
+      if(dsp_tx_idle) {
+       dsp_tx_idle = 0;
+       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
+       buffer_state[2] = EMPTYING;
+      }
+    }
+    else {  // buffer was emptying
+      buffer_state[2] = EMPTY;
+      if(serdes_rx_idle) {
+       serdes_rx_idle = 0;
+       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2
+       buffer_state[2] = FILLING;
+      }
+      if(buffer_state[3] == FULL) {
+       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
+       buffer_state[3] = EMPTYING;
+      }
+      else
+       dsp_tx_idle = 1;
+    }
+  putstr("Int Proc'ed 2\n");
+  }
+  if(localstatus & BPS_DONE_3) {
+    bp_clear_buf(3);
+    if(buffer_state[3] == FILLING) {
+      buffer_state[3] = FULL;
+      if(buffer_state[2] == EMPTY) {
+       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2, use 
500 lines
+       buffer_state[2] = FILLING;
+      }
+      else
+       serdes_rx_idle = 1;
+      if(dsp_tx_idle) {
+       dsp_tx_idle = 0;
+       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
+       buffer_state[3] = EMPTYING;
+      }
+    }
+    else {  // buffer was emptying
+      buffer_state[3] = EMPTY;
+      if(serdes_rx_idle) {
+       serdes_rx_idle = 0;
+       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3
+       buffer_state[3] = FILLING;
+      }
+      if(buffer_state[2] == FULL) {
+       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
+       buffer_state[2] = EMPTYING;
+      }
+      else
+       dsp_tx_idle = 1;
+    }
+  putstr("Int Proc'ed 3\n");
+  }
+}
+#endif


Property changes on: usrp2/trunk/firmware/apps/double_buffer_fragment.c
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: usrp2/trunk/firmware/apps/gen_eth_packets.c
===================================================================
--- usrp2/trunk/firmware/apps/gen_eth_packets.c 2007-12-10 22:35:17 UTC (rev 
7101)
+++ usrp2/trunk/firmware/apps/gen_eth_packets.c 2007-12-11 01:48:34 UTC (rev 
7102)
@@ -25,10 +25,11 @@
 #include "eth_driver.h"
 #include "eth_mac.h"
 #include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
 
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
 
 // ----------------------------------------------------------------
 
@@ -36,22 +37,7 @@
   0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
-#define U2_ETHERTYPE 0xBEEF
 
-
-typedef struct {
-  unsigned char dst_addr[6];
-  unsigned char src_addr[6];
-  unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
-  ethernet_hdr_t       ehdr;
-  unsigned short       pktno;
-  unsigned char                data[];
-} ethernet_packet_t;           // gives us 32-bit aligned packet
-
-
 // ----------------------------------------------------------------
 
 // #define     PACKET_SIZE 1500                // bytes
@@ -125,30 +111,9 @@
   // FIXME
 }
 
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
-{
-  if (((intptr_t) dst & 0x3)
-      || ((intptr_t) src & 0x3)
-      || (nbytes & 0x3))
-    exit(1);                   /* die! */
 
-  int *dp = (int *) dst;
-  int *sp = (int *) src;
-  unsigned  nw = nbytes/4;
-
-  unsigned i;
-  for (i = 0; i < nw; i++)
-    dp[i] = sp[i];
-}
-
-
 static void
-init_packet(int *buf, const ethernet_packet_t *pkt, int bufnum)
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
 {
   int i = 0;
   int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
@@ -167,7 +132,7 @@
 {
   int  i;
   
-  ethernet_packet_t    pkt __attribute__((aligned (4)));
+  u2_eth_packet_t      pkt __attribute__((aligned (4)));
 
   for (i = 0; i < 6; i++){
     pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
@@ -229,139 +194,3 @@
   hal_finish();
   return 1;
 }
-
-#if 0
-void 
-double_buffering(int port) {
-  unsigned int localstatus = buffer_pool_status->status;
-
-  if(localstatus & BPS_DONE_0) {
-    bp_clear_buf(0);
-    if(buffer_state[0] == FILLING) {
-      buffer_state[0] = FULL;
-      if(buffer_state[1] == EMPTY) {
-       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[1] = FILLING;
-      }
-      else
-       dsp_rx_idle = 1;
-      if(serdes_tx_idle) {
-       serdes_tx_idle = 0;
-       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
-       buffer_state[0] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[0] = EMPTY;
-      if(dsp_rx_idle) {
-       dsp_rx_idle = 0;
-       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 
lines
-       buffer_state[0] = FILLING;
-      }
-      if(buffer_state[1] == FULL) {
-       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
-       buffer_state[1] = EMPTYING;
-      }
-      else
-       serdes_tx_idle = 1;
-    }
-    putstr("Int Proc'ed 0\n");
-  }
-  if(localstatus & BPS_DONE_1) {
-    bp_clear_buf(1);
-    if(buffer_state[1] == FILLING) {
-      buffer_state[1] = FULL;
-      if(buffer_state[0] == EMPTY) {
-       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[0] = FILLING;
-      }
-      else
-       dsp_rx_idle = 1;
-      if(serdes_tx_idle) {
-       serdes_tx_idle = 0;
-       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
-       buffer_state[1] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[1] = EMPTY;
-      if(dsp_rx_idle) {
-       dsp_rx_idle = 0;
-       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[1] = FILLING;
-      }
-      if(buffer_state[0] == FULL) {
-       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
-       buffer_state[0] = EMPTYING;
-      }
-      else
-       serdes_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 1\n");
-  }
-  if(localstatus & BPS_DONE_2) {
-    bp_clear_buf(2);
-    if(buffer_state[2] == FILLING) {
-      buffer_state[2] = FULL;
-      if(buffer_state[3] == EMPTY) {
-       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3, use 
500 lines
-       buffer_state[3] = FILLING;
-      }
-      else
-       serdes_rx_idle = 1;
-      if(dsp_tx_idle) {
-       dsp_tx_idle = 0;
-       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
-       buffer_state[2] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[2] = EMPTY;
-      if(serdes_rx_idle) {
-       serdes_rx_idle = 0;
-       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2
-       buffer_state[2] = FILLING;
-      }
-      if(buffer_state[3] == FULL) {
-       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
-       buffer_state[3] = EMPTYING;
-      }
-      else
-       dsp_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 2\n");
-  }
-  if(localstatus & BPS_DONE_3) {
-    bp_clear_buf(3);
-    if(buffer_state[3] == FILLING) {
-      buffer_state[3] = FULL;
-      if(buffer_state[2] == EMPTY) {
-       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2, use 
500 lines
-       buffer_state[2] = FILLING;
-      }
-      else
-       serdes_rx_idle = 1;
-      if(dsp_tx_idle) {
-       dsp_tx_idle = 0;
-       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
-       buffer_state[3] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[3] = EMPTY;
-      if(serdes_rx_idle) {
-       serdes_rx_idle = 0;
-       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3
-       buffer_state[3] = FILLING;
-      }
-      if(buffer_state[2] == FULL) {
-       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
-       buffer_state[2] = EMPTYING;
-      }
-      else
-       dsp_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 3\n");
-  }
-}
-#endif

Modified: usrp2/trunk/firmware/apps/gen_pause_frames.c
===================================================================
--- usrp2/trunk/firmware/apps/gen_pause_frames.c        2007-12-10 22:35:17 UTC 
(rev 7101)
+++ usrp2/trunk/firmware/apps/gen_pause_frames.c        2007-12-11 01:48:34 UTC 
(rev 7102)
@@ -25,10 +25,11 @@
 #include "eth_driver.h"
 #include "eth_mac.h"
 #include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
 
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
 
 // ----------------------------------------------------------------
 
@@ -36,22 +37,6 @@
   0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
-#define U2_ETHERTYPE 0xBEEF
-
-
-typedef struct {
-  unsigned char dst_addr[6];
-  unsigned char src_addr[6];
-  unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
-  ethernet_hdr_t       ehdr;
-  unsigned short       pktno;
-  unsigned char                data[];
-} ethernet_packet_t;           // gives us 32-bit aligned packet
-
-
 // ----------------------------------------------------------------
 
 // #define     PACKET_SIZE 1500                // bytes
@@ -125,30 +110,8 @@
   // FIXME
 }
 
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
-{
-  if (((intptr_t) dst & 0x3)
-      || ((intptr_t) src & 0x3)
-      || (nbytes & 0x3))
-    exit(1);                   /* die! */
-
-  int *dp = (int *) dst;
-  int *sp = (int *) src;
-  unsigned  nw = nbytes/4;
-
-  unsigned i;
-  for (i = 0; i < nw; i++)
-    dp[i] = sp[i];
-}
-
-
 static void
-init_packet(int *buf, const ethernet_packet_t *pkt, int bufnum)
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
 {
   int i = 0;
   int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
@@ -167,7 +130,7 @@
 {
   int  i;
   
-  ethernet_packet_t    pkt __attribute__((aligned (4)));
+  u2_eth_packet_t      pkt __attribute__((aligned (4)));
 
   for (i = 0; i < 6; i++){
     pkt.ehdr.dst_addr[i] = dst_mac_addr[i];

Modified: usrp2/trunk/firmware/apps/rcv_eth_packets.c
===================================================================
--- usrp2/trunk/firmware/apps/rcv_eth_packets.c 2007-12-10 22:35:17 UTC (rev 
7101)
+++ usrp2/trunk/firmware/apps/rcv_eth_packets.c 2007-12-11 01:48:34 UTC (rev 
7102)
@@ -25,34 +25,19 @@
 #include "eth_driver.h"
 #include "eth_mac.h"
 #include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
 
 
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
-
 // ----------------------------------------------------------------
 
 unsigned char dst_mac_addr[6] = {
   0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
-#define U2_ETHERTYPE 0xBEEF
 
-
-typedef struct {
-  unsigned char dst_addr[6];
-  unsigned char src_addr[6];
-  unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
-  ethernet_hdr_t       ehdr;
-  unsigned short       pktno;
-  unsigned char                data[];
-} ethernet_packet_t;           // gives us 32-bit aligned packet
-
-
 // ----------------------------------------------------------------
 
 #define        PACKET_SIZE 1500                // bytes
@@ -126,56 +111,19 @@
   // FIXME
 }
 
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
+static void
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
 {
-  if (((intptr_t) dst & 0x3)
-      || ((intptr_t) src & 0x3)
-      || (nbytes & 0x3))
-    exit(1);                   /* die! */
+  int i = 0;
+  int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
 
-  int *dp = (int *) dst;
-  int *sp = (int *) src;
-  unsigned  nw = nbytes/4;
+  for (i = 0; i < BUFFER_POOL_BUFFER_SIZE; i++){
+    buf[i] = mark | i;
+    mark ^= 0x00FF0000;
+  }
 
-  unsigned i;
-  for (i = 0; i < nw; i++)
-    dp[i] = sp[i];
-}
-
-
-static void
-init_packet(int *buf, const ethernet_packet_t *pkt)
-{
-#if 1
   // copy header into buffer
   memcpy_wordaligned(buf, pkt, sizeof(*pkt));
-#else
-  buf[1] = 0xffff000A;
-  buf[2] = 0x35987654;
-  buf[3] = 0xBEEF0000;
-#endif
-
-  union {
-    int         i;
-    char c[4];
-  } u;
-
-  int *p = (int *)((char *) buf + sizeof(*pkt));
-  int *end = buf + BUFFER_POOL_BUFFER_SIZE;
-
-  int i = 0;
-  for (; p < end; p++, i += 4){
-    u.c[0] = i;
-    u.c[1] = i+1;
-    u.c[2] = i+2;
-    u.c[3] = i+3;
-    *p = u.i;
-  }
 }
 
 static void
@@ -183,30 +131,19 @@
 {
   int  i;
   
-  ethernet_packet_t    pkt __attribute__((aligned (4)));
+  u2_eth_packet_t      pkt __attribute__((aligned (4)));
 
   for (i = 0; i < 6; i++){
     pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
-    pkt.ehdr.src_addr[i] = 0;              // filled in by mac
+    pkt.ehdr.src_addr[i] = 0;                  // filled in by mac
   }
   pkt.ehdr.ethertype = U2_ETHERTYPE;
 
-  init_packet((void *) buffer_ram(0), &pkt);
-  init_packet((void *) buffer_ram(1), &pkt);
+  // fill ALL buffers for debugging
+  for (i = 0; i < 8; i++)
+    init_packet((void *)buffer_ram(i), &pkt, i);
 }
 
-void
-print_mac_addr(const char *addr)  /* 6-bytes */
-{
-  puthex8(addr[0]); putchar(':');
-  puthex8(addr[1]); putchar(':');
-  puthex8(addr[2]); putchar(':');
-  puthex8(addr[3]); putchar(':');
-  puthex8(addr[4]); putchar(':');
-  puthex8(addr[5]);
-}
-
-
 int
 main(void)
 {
@@ -242,7 +179,7 @@
   bp_receive_to_buf(2, PORT_ETH, 1, 0, 511);
 
   while(1){
-    ethernet_packet_t  pkt __attribute__((aligned (4)));
+    u2_eth_packet_t    pkt __attribute__((aligned (4)));
 
     new_leds = 0;
     if (link_is_up)
@@ -295,139 +232,3 @@
   hal_finish();
   return 1;
 }
-
-#if 0
-void 
-double_buffering(int port) {
-  unsigned int localstatus = buffer_pool_status->status;
-
-  if(localstatus & BPS_DONE_0) {
-    bp_clear_buf(0);
-    if(buffer_state[0] == FILLING) {
-      buffer_state[0] = FULL;
-      if(buffer_state[1] == EMPTY) {
-       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[1] = FILLING;
-      }
-      else
-       dsp_rx_idle = 1;
-      if(serdes_tx_idle) {
-       serdes_tx_idle = 0;
-       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
-       buffer_state[0] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[0] = EMPTY;
-      if(dsp_rx_idle) {
-       dsp_rx_idle = 0;
-       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 
lines
-       buffer_state[0] = FILLING;
-      }
-      if(buffer_state[1] == FULL) {
-       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
-       buffer_state[1] = EMPTYING;
-      }
-      else
-       serdes_tx_idle = 1;
-    }
-    putstr("Int Proc'ed 0\n");
-  }
-  if(localstatus & BPS_DONE_1) {
-    bp_clear_buf(1);
-    if(buffer_state[1] == FILLING) {
-      buffer_state[1] = FULL;
-      if(buffer_state[0] == EMPTY) {
-       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[0] = FILLING;
-      }
-      else
-       dsp_rx_idle = 1;
-      if(serdes_tx_idle) {
-       serdes_tx_idle = 0;
-       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
-       buffer_state[1] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[1] = EMPTY;
-      if(dsp_rx_idle) {
-       dsp_rx_idle = 0;
-       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[1] = FILLING;
-      }
-      if(buffer_state[0] == FULL) {
-       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
-       buffer_state[0] = EMPTYING;
-      }
-      else
-       serdes_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 1\n");
-  }
-  if(localstatus & BPS_DONE_2) {
-    bp_clear_buf(2);
-    if(buffer_state[2] == FILLING) {
-      buffer_state[2] = FULL;
-      if(buffer_state[3] == EMPTY) {
-       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3, use 
500 lines
-       buffer_state[3] = FILLING;
-      }
-      else
-       serdes_rx_idle = 1;
-      if(dsp_tx_idle) {
-       dsp_tx_idle = 0;
-       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
-       buffer_state[2] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[2] = EMPTY;
-      if(serdes_rx_idle) {
-       serdes_rx_idle = 0;
-       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2
-       buffer_state[2] = FILLING;
-      }
-      if(buffer_state[3] == FULL) {
-       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
-       buffer_state[3] = EMPTYING;
-      }
-      else
-       dsp_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 2\n");
-  }
-  if(localstatus & BPS_DONE_3) {
-    bp_clear_buf(3);
-    if(buffer_state[3] == FILLING) {
-      buffer_state[3] = FULL;
-      if(buffer_state[2] == EMPTY) {
-       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2, use 
500 lines
-       buffer_state[2] = FILLING;
-      }
-      else
-       serdes_rx_idle = 1;
-      if(dsp_tx_idle) {
-       dsp_tx_idle = 0;
-       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
-       buffer_state[3] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[3] = EMPTY;
-      if(serdes_rx_idle) {
-       serdes_rx_idle = 0;
-       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3
-       buffer_state[3] = FILLING;
-      }
-      if(buffer_state[2] == FULL) {
-       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
-       buffer_state[2] = EMPTYING;
-      }
-      else
-       dsp_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 3\n");
-  }
-}
-#endif

Modified: usrp2/trunk/firmware/apps/test_serdes.c
===================================================================
--- usrp2/trunk/firmware/apps/test_serdes.c     2007-12-10 22:35:17 UTC (rev 
7101)
+++ usrp2/trunk/firmware/apps/test_serdes.c     2007-12-11 01:48:34 UTC (rev 
7102)
@@ -25,10 +25,11 @@
 #include "eth_driver.h"
 #include "eth_mac.h"
 #include "nonstdio.h"
+#include "u2_eth_packet.h"
+#include "memcpy_wa.h"
+#include <stddef.h>
+#include <stdlib.h>
 
-typedef int intptr_t;
-typedef unsigned size_t;
-void exit(int status);
 
 // ----------------------------------------------------------------
 
@@ -36,22 +37,7 @@
   0xff, 0xff, 0xff, 0xff, 0xff, 0xff
 };
 
-#define U2_ETHERTYPE 0xBEEF
 
-
-typedef struct {
-  unsigned char dst_addr[6];
-  unsigned char src_addr[6];
-  unsigned short ethertype;
-} ethernet_hdr_t;
-
-typedef struct {
-  ethernet_hdr_t       ehdr;
-  unsigned short       pktno;
-  unsigned char                data[];
-} ethernet_packet_t;           // gives us 32-bit aligned packet
-
-
 // ----------------------------------------------------------------
 
 // #define     PACKET_SIZE 1500                // bytes
@@ -125,30 +111,8 @@
   // FIXME
 }
 
-/*
- * For copying to/from non-byte-adressable memory, such as
- * the buffers
- */
-void
-memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
-{
-  if (((intptr_t) dst & 0x3)
-      || ((intptr_t) src & 0x3)
-      || (nbytes & 0x3))
-    exit(1);                   /* die! */
-
-  int *dp = (int *) dst;
-  int *sp = (int *) src;
-  unsigned  nw = nbytes/4;
-
-  unsigned i;
-  for (i = 0; i < nw; i++)
-    dp[i] = sp[i];
-}
-
-
 static void
-init_packet(int *buf, const ethernet_packet_t *pkt, int bufnum)
+init_packet(int *buf, const u2_eth_packet_t *pkt, int bufnum)
 {
   int i = 0;
   int mark = ((bufnum & 0xff) << 24) | 0x005A0000;
@@ -167,7 +131,7 @@
 {
   int  i;
   
-  ethernet_packet_t    pkt __attribute__((aligned (4)));
+  u2_eth_packet_t      pkt __attribute__((aligned (4)));
 
   for (i = 0; i < 6; i++){
     pkt.ehdr.dst_addr[i] = dst_mac_addr[i];
@@ -232,139 +196,3 @@
   hal_finish();
   return 1;
 }
-
-#if 0
-void 
-double_buffering(int port) {
-  unsigned int localstatus = buffer_pool_status->status;
-
-  if(localstatus & BPS_DONE_0) {
-    bp_clear_buf(0);
-    if(buffer_state[0] == FILLING) {
-      buffer_state[0] = FULL;
-      if(buffer_state[1] == EMPTY) {
-       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[1] = FILLING;
-      }
-      else
-       dsp_rx_idle = 1;
-      if(serdes_tx_idle) {
-       serdes_tx_idle = 0;
-       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
-       buffer_state[0] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[0] = EMPTY;
-      if(dsp_rx_idle) {
-       dsp_rx_idle = 0;
-       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 
lines
-       buffer_state[0] = FILLING;
-      }
-      if(buffer_state[1] == FULL) {
-       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
-       buffer_state[1] = EMPTYING;
-      }
-      else
-       serdes_tx_idle = 1;
-    }
-    putstr("Int Proc'ed 0\n");
-  }
-  if(localstatus & BPS_DONE_1) {
-    bp_clear_buf(1);
-    if(buffer_state[1] == FILLING) {
-      buffer_state[1] = FULL;
-      if(buffer_state[0] == EMPTY) {
-       bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[0] = FILLING;
-      }
-      else
-       dsp_rx_idle = 1;
-      if(serdes_tx_idle) {
-       serdes_tx_idle = 0;
-       bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
-       buffer_state[1] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[1] = EMPTY;
-      if(dsp_rx_idle) {
-       dsp_rx_idle = 0;
-       bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 
lines
-       buffer_state[1] = FILLING;
-      }
-      if(buffer_state[0] == FULL) {
-       bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
-       buffer_state[0] = EMPTYING;
-      }
-      else
-       serdes_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 1\n");
-  }
-  if(localstatus & BPS_DONE_2) {
-    bp_clear_buf(2);
-    if(buffer_state[2] == FILLING) {
-      buffer_state[2] = FULL;
-      if(buffer_state[3] == EMPTY) {
-       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3, use 
500 lines
-       buffer_state[3] = FILLING;
-      }
-      else
-       serdes_rx_idle = 1;
-      if(dsp_tx_idle) {
-       dsp_tx_idle = 0;
-       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
-       buffer_state[2] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[2] = EMPTY;
-      if(serdes_rx_idle) {
-       serdes_rx_idle = 0;
-       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2
-       buffer_state[2] = FILLING;
-      }
-      if(buffer_state[3] == FULL) {
-       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
-       buffer_state[3] = EMPTYING;
-      }
-      else
-       dsp_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 2\n");
-  }
-  if(localstatus & BPS_DONE_3) {
-    bp_clear_buf(3);
-    if(buffer_state[3] == FILLING) {
-      buffer_state[3] = FULL;
-      if(buffer_state[2] == EMPTY) {
-       bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2, use 
500 lines
-       buffer_state[2] = FILLING;
-      }
-      else
-       serdes_rx_idle = 1;
-      if(dsp_tx_idle) {
-       dsp_tx_idle = 0;
-       bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
-       buffer_state[3] = EMPTYING;
-      }
-    }
-    else {  // buffer was emptying
-      buffer_state[3] = EMPTY;
-      if(serdes_rx_idle) {
-       serdes_rx_idle = 0;
-       bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3
-       buffer_state[3] = FILLING;
-      }
-      if(buffer_state[2] == FULL) {
-       bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
-       buffer_state[2] = EMPTYING;
-      }
-      else
-       dsp_tx_idle = 1;
-    }
-  putstr("Int Proc'ed 3\n");
-  }
-}
-#endif

Modified: usrp2/trunk/firmware/lib/Makefile.am
===================================================================
--- usrp2/trunk/firmware/lib/Makefile.am        2007-12-10 22:35:17 UTC (rev 
7101)
+++ usrp2/trunk/firmware/lib/Makefile.am        2007-12-11 01:48:34 UTC (rev 
7102)
@@ -29,8 +29,10 @@
        hal_uart.c \
        i2c.c \
        mdelay.c \
+       memcpy_wa.c \
        nonstdio.c \
        pic.c \
+       print_mac_addr.c \
        printf.c \
        spi.c \
        u2_init.c       

Added: usrp2/trunk/firmware/lib/memcpy_wa.c
===================================================================
--- usrp2/trunk/firmware/lib/memcpy_wa.c                                (rev 0)
+++ usrp2/trunk/firmware/lib/memcpy_wa.c        2007-12-11 01:48:34 UTC (rev 
7102)
@@ -0,0 +1,42 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include "memcpy_wa.h"
+#include <stdint.h>
+#include <stdlib.h>
+
+/*
+ * For copying to/from non-byte-adressable memory, such as
+ * the buffers
+ */
+void
+memcpy_wordaligned(void *dst, const void *src, size_t nbytes)
+{
+  if (((intptr_t) dst & 0x3)
+      || ((intptr_t) src & 0x3)
+      || (nbytes & 0x3))
+    exit(1);                   /* die! */
+
+  int *dp = (int *) dst;
+  int *sp = (int *) src;
+  unsigned  nw = nbytes/4;
+
+  unsigned i;
+  for (i = 0; i < nw; i++)
+    dp[i] = sp[i];
+}


Property changes on: usrp2/trunk/firmware/lib/memcpy_wa.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: usrp2/trunk/firmware/lib/memcpy_wa.h
===================================================================
--- usrp2/trunk/firmware/lib/memcpy_wa.h                                (rev 0)
+++ usrp2/trunk/firmware/lib/memcpy_wa.h        2007-12-11 01:48:34 UTC (rev 
7102)
@@ -0,0 +1,32 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef INCLUDED_MEMCPY_WA_H
+#define INCLUDED_MEMCPY_WA_H
+
+#include <stddef.h>
+
+/*
+ * For copying to/from non-byte-adressable memory, such as
+ * the buffers
+ */
+void memcpy_wordaligned(void *dst, const void *src, size_t nbytes);
+
+#endif /* INCLUDED_MEMCPY_WA_H */
+
+


Property changes on: usrp2/trunk/firmware/lib/memcpy_wa.h
___________________________________________________________________
Name: svn:eol-style
   + native

Modified: usrp2/trunk/firmware/lib/nonstdio.h
===================================================================
--- usrp2/trunk/firmware/lib/nonstdio.h 2007-12-10 22:35:17 UTC (rev 7101)
+++ usrp2/trunk/firmware/lib/nonstdio.h 2007-12-11 01:48:34 UTC (rev 7102)
@@ -34,4 +34,6 @@
 #define puthex_nl puthex32_nl
 void newline();                                // putchar('\n')
 
+void print_mac_addr(const unsigned char addr[6]);
+
 #endif /* INCLUDED_NONSTDIO_H */

Added: usrp2/trunk/firmware/lib/print_mac_addr.c
===================================================================
--- usrp2/trunk/firmware/lib/print_mac_addr.c                           (rev 0)
+++ usrp2/trunk/firmware/lib/print_mac_addr.c   2007-12-11 01:48:34 UTC (rev 
7102)
@@ -0,0 +1,30 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+#include "nonstdio.h"
+
+void
+print_mac_addr(const unsigned char addr[6])
+{
+  puthex8(addr[0]); putchar(':');
+  puthex8(addr[1]); putchar(':');
+  puthex8(addr[2]); putchar(':');
+  puthex8(addr[3]); putchar(':');
+  puthex8(addr[4]); putchar(':');
+  puthex8(addr[5]);
+}
+


Property changes on: usrp2/trunk/firmware/lib/print_mac_addr.c
___________________________________________________________________
Name: svn:eol-style
   + native

Added: usrp2/trunk/firmware/lib/u2_eth_packet.h
===================================================================
--- usrp2/trunk/firmware/lib/u2_eth_packet.h                            (rev 0)
+++ usrp2/trunk/firmware/lib/u2_eth_packet.h    2007-12-11 01:48:34 UTC (rev 
7102)
@@ -0,0 +1,114 @@
+/* -*- c++ -*- */
+/*
+ * Copyright 2007 Free Software Foundation, Inc.
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef INCLUDED_U2_ETH_PACKET_H
+#define INCLUDED_U2_ETH_PACKET_H
+
+#include <stdint.h>
+
+#define U2_ETHERTYPE           0xBEEF  // used in our frames
+#define        MAC_CTRL_ETHERTYPE      0x8808  // used in PAUSE frames
+
+/*
+ * All these data structures are BIG-ENDIAN on the wire
+ */
+
+/* The classic 14-byte ethernet header */
+
+typedef struct {
+  uint8_t      dst_addr[6];
+  uint8_t      src_addr[6];
+  uint16_t     ethertype;
+} u2_eth_hdr_t;
+
+/* 
+ * The classic ethernet header + 2 bytes of pad so that our payload
+ * (at least inside the U2) is 32-bit aligned.  (The buffer memory
+ * in the U2 is only word addressable...)
+ */
+typedef struct {
+  uint8_t      dst_addr[6];
+  uint8_t      src_addr[6];
+  uint16_t     ethertype;
+  uint16_t     _pad;       // MBZ. force 32-bit alignment for payload
+} u2_eth_hdr_with_pad_t;
+
+
+/*
+ * The payload of a USRP2 ethernet packet...
+ *
+ * Basically there's 1 word of flags and routing info, and 1 word
+ * of timestamp that specifies when the data was received, or
+ * when it should be transmitted. The data samples follow immediately.
+ *
+ * Transmit packets (from host to U2)
+ * 
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Chan   |                    mbz                        |I|S|E|
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                           Timestamp                           |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *
+ *
+ * Received packets (from U2 to host)
+ *
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |  Chan   |                    mbz                              |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ *  |                           Timestamp                           |
+ *  +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
+ */
+
+typedef struct {
+  uint32_t     word0;          // flags etc
+  uint32_t     timestamp;      // time of rx or tx (100 MHz)
+  uint32_t     samples[];      // samples, typically ((I << 16) | Q)
+} u2_eth_payload_t;
+
+
+#define U2P_CHAN_MASK          0x1f
+#define        U2P_CHAN_SHIFT          27
+
+#define U2P_TX_IMMEDIATE       0x00000004  // send samples NOW, else at 
timestamp
+#define U2P_TX_START_OF_BURST  0x00000002  // this frame is the start of a 
burst
+#define        U2P_TX_END_OF_BURST     0x00000001  // this frame is the end of 
a burst
+
+#define        U2P_ALL_FLAGS           0x00000007
+
+static inline int
+u2p_chan(u2_eth_payload_t *p)
+{
+  return (p->word0 >> U2P_CHAN_SHIFT) & U2P_CHAN_MASK;
+}
+
+inline static void
+u2p_set_word0(u2_eth_payload_t *p, int flags, int chan)
+{
+  p->word0 = ((flags & U2P_ALL_FLAGS)
+             | ((chan & U2P_CHAN_MASK) << U2P_CHAN_SHIFT));
+}
+
+/*
+ * consolidated packet: ethernet header + pad + payload
+ */
+typedef struct {
+  u2_eth_hdr_with_pad_t        ehdr;
+  u2_eth_payload_t     payload;
+} u2_eth_packet_t;
+
+#endif /* INCLUDED_U2_ETH_PACKET_H */


Property changes on: usrp2/trunk/firmware/lib/u2_eth_packet.h
___________________________________________________________________
Name: svn:eol-style
   + native





reply via email to

[Prev in Thread] Current Thread [Next in Thread]