commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: eb
Subject: [Commit-gnuradio] r8011 - in usrp2/trunk/firmware: apps lib
Date: Wed, 12 Mar 2008 21:17:19 -0600 (MDT)

Author: eb
Date: 2008-03-12 21:17:17 -0600 (Wed, 12 Mar 2008)
New Revision: 8011

Modified:
   usrp2/trunk/firmware/apps/sd_bounce.c
   usrp2/trunk/firmware/lib/dbsm.c
Log:
sd_bounce reads packets from serdes and writes them to
serdes using the standard double-buffering state machine.
Checks received packets for expected content, prints 'r' for received
OK, or 'P' for received with payload error.  Errors from the serdes
are reported with 'E'.


Modified: usrp2/trunk/firmware/apps/sd_bounce.c
===================================================================
--- usrp2/trunk/firmware/apps/sd_bounce.c       2008-03-12 23:28:38 UTC (rev 
8010)
+++ usrp2/trunk/firmware/apps/sd_bounce.c       2008-03-13 03:17:17 UTC (rev 
8011)
@@ -27,44 +27,45 @@
 #include "bool.h"
 #include "nonstdio.h"
 #include "memset_wa.h"
+#include <dbsm.h>
 #include <stddef.h>
 #include <stdlib.h>
 #include <string.h>
 #include <ad9510.h>
 
+
 // ----------------------------------------------------------------
 
-int packet_number = 0;
-volatile bool send_packet_now = 0;
+#define SERDES_RX_BUF_0                0
+#define        SERDES_RX_BUF_1         1
 
-#define SERDES_TX_BUF  0
-#define        SERDES_RX_BUF   1
+/*
+ * ================================================================
+ *      configure SD RX double buffering state machine
+ * ================================================================
+ */
 
+// receive from SERDES
+buf_cmd_args_t sd_recv_args = {
+  PORT_SERDES,
+  0,
+  BP_LAST_LINE
+};
 
-#define NLINES_PER_PKT 380
+// send to SERDES
+buf_cmd_args_t sd_send_args = {
+  PORT_SERDES,
+  0,           // starts with packet in line 0
+  0,           // filled in from list_line register
+};
 
+dbsm_t sd_sm;  // the state machine
 
-// ----------------------------------------------------------------
 
-static int timer_delta = (int)(MASTER_CLK_RATE * 100e-6);
 
-void
-timer_irq_handler(unsigned irq)
-{
-  hal_set_timeout(timer_delta);        // schedule next timeout
-  send_packet_now = true;
-}
 
+// ----------------------------------------------------------------
 
-static void
-init_packet(int *buf)
-{
-  int i = 0;
-  for (i = 0; i < BP_NLINES; i++){
-    buf[i] = ((2*i + 0) << 16) | (2*i+1);
-  }
-}
-
 static bool
 check_packet(int *buf, int nlines)
 {
@@ -86,13 +87,32 @@
   memset_wa(buffer_ram(bufno), 0, BP_NLINES * 4);
 }
 
-static void
-init_packets(void)
+
+bool
+sd_rx_inspector(dbsm_t *sm, int buf_this)
 {
-  // init just the one we're using
-  init_packet(buffer_ram(SERDES_TX_BUF));
+  hal_toggle_leds(0x2);
+
+  int last_line = buffer_pool_status->last_line[buf_this];
+  bool ok = check_packet(buffer_ram(buf_this), last_line);
+      
+  if (ok)
+    putchar('r');
+  else
+    putchar('P');
+
+  return false;
 }
 
+
+inline static void
+buffer_irq_handler(void)
+{
+  uint32_t  status = buffer_pool_status->status;
+  dbsm_process_status(&sd_sm, status);
+}
+
+
 int
 main(void)
 {
@@ -121,92 +141,15 @@
   //output_regs->serdes_ctrl = (SERDES_ENABLE | SERDES_RXEN | SERDES_LOOPEN);
   output_regs->serdes_ctrl = (SERDES_ENABLE | SERDES_RXEN);
 
-  init_packets();
+  
+  dbsm_init(&sd_sm, SERDES_RX_BUF_0,
+           &sd_recv_args, &sd_send_args,
+           sd_rx_inspector);
 
-  // pic_register_handler(IRQ_TIMER, timer_irq_handler);
+  // kick off the state machine
+  dbsm_start(&sd_sm);
 
-  //if (hwconfig_simulation_p())
-  //  timer_delta = sim_timer_delta;
-
-  // start a receive from sd
-  zero_buffer(SERDES_RX_BUF);
-  bp_receive_to_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, BP_LAST_LINE);
-
-  // fire off the first packet
-  //bp_send_from_buf(SERDES_TX_BUF, PORT_SERDES, 1, 0, NLINES_PER_PKT);
-  //hal_set_timeout(timer_delta);
-
-
-  int counter = 0;
-
-#define EXPECTING_PKT() ((counter & 0x1) == 0)
-#define        SEND_PKT()      ((counter & 0x1) != 0)
-
-  bool got_packet = false;
-
   while(1){
-    uint32_t status = buffer_pool_status->status;
-
-    if (status & (BPS_DONE(SERDES_RX_BUF))){
-      if(EXPECTING_PKT()) {
-       hal_toggle_leds(0x2);
-       
-       // check packet
-       int last_line = buffer_pool_status->last_line[SERDES_RX_BUF]-1;
-       bool ok = check_packet(buffer_ram(SERDES_RX_BUF), last_line);
-      
-       if (ok)
-         putchar('r');
-       else
-         putchar('P');
-       
-       bp_clear_buf(SERDES_RX_BUF);
-       got_packet = true;
-
-       bp_send_from_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, last_line);
-       counter++;
-      }
-      else {
-       // start a receive from sd
-       bp_clear_buf(SERDES_RX_BUF);
-       zero_buffer(SERDES_RX_BUF);
-       bp_receive_to_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, BP_LAST_LINE);
-       counter++;
-      } 
-    }
-    else if (status & (BPS_ERROR(SERDES_RX_BUF))){
-      bp_clear_buf(SERDES_RX_BUF);
-      got_packet = true;
-
-      putchar('E');
-
-      // start a receive from sd
-      zero_buffer(SERDES_RX_BUF);
-      bp_receive_to_buf(SERDES_RX_BUF, PORT_SERDES, 1, 0, BP_LAST_LINE);
-      counter = 0;
-    }
-
-#if 0
-    int pending = pic_regs->pending;
-    if (pending & PIC_TIMER_INT){
-      hal_set_timeout(timer_delta);
-
-      if (EXPECTING_PKT()){
-       if (!got_packet)
-         putchar('T');
-       got_packet = false;
-      }
-
-      if (SEND_PKT()){
-       if (status & BPS_IDLE(SERDES_TX_BUF))
-         bp_send_from_buf(SERDES_TX_BUF, PORT_SERDES, 1, 0, NLINES_PER_PKT);
-      }
-      counter++;
-
-      pic_regs->pending = PIC_TIMER_INT;       // clear pending interrupt
-    }
-#endif
+    buffer_irq_handler();
   }
-
-  return 1;
 }

Modified: usrp2/trunk/firmware/lib/dbsm.c
===================================================================
--- usrp2/trunk/firmware/lib/dbsm.c     2008-03-12 23:28:38 UTC (rev 8010)
+++ usrp2/trunk/firmware/lib/dbsm.c     2008-03-13 03:17:17 UTC (rev 8011)
@@ -156,7 +156,7 @@
     return;
 
   if (status & (BPS_ERROR(sm->buf0) | BPS_ERROR(sm->buf0 ^ 1))){
-    // putchar('E');
+    putchar('E');
     // Most likely an ethernet Rx error.  We just restart the transfer.
     if (status & (BPS_ERROR(sm->buf0)))
       dbsm_error_helper(sm, sm->buf0);





reply via email to

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