commit-gnuradio
[Top][All Lists]
Advanced

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

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


From: eb
Subject: [Commit-gnuradio] r7594 - in usrp2/trunk/firmware: apps lib
Date: Wed, 6 Feb 2008 19:59:53 -0700 (MST)

Author: eb
Date: 2008-02-06 19:59:52 -0700 (Wed, 06 Feb 2008)
New Revision: 7594

Modified:
   usrp2/trunk/firmware/apps/app_common.c
   usrp2/trunk/firmware/apps/rx_only.c
   usrp2/trunk/firmware/apps/tx_only.c
   usrp2/trunk/firmware/lib/dbsm.c
   usrp2/trunk/firmware/lib/dbsm.h
Log:
revised error, underrun and overrun handling

Modified: usrp2/trunk/firmware/apps/app_common.c
===================================================================
--- usrp2/trunk/firmware/apps/app_common.c      2008-02-07 00:40:57 UTC (rev 
7593)
+++ usrp2/trunk/firmware/apps/app_common.c      2008-02-07 02:59:52 UTC (rev 
7594)
@@ -120,7 +120,7 @@
 eth_pkt_inspector(dbsm_t *sm, int bufno)
 {
   u2_eth_packet_t *pkt = (u2_eth_packet_t *) buffer_ram(bufno);
-  size_t byte_len = (buffer_pool_status->last_line[bufno] - 1) * 4;
+  size_t byte_len = (buffer_pool_status->last_line[bufno] - 3) * 4;
 
   // hal_toggle_leds(0x1);
 

Modified: usrp2/trunk/firmware/apps/rx_only.c
===================================================================
--- usrp2/trunk/firmware/apps/rx_only.c 2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/apps/rx_only.c 2008-02-07 02:59:52 UTC (rev 7594)
@@ -43,10 +43,6 @@
 static int fw_seqno;   // used when f/w is filling in sequence numbers
 #endif
 
-
-
-static int timer_delta = MASTER_CLK_RATE/1000; // tick at 1kHz
-
 /*
  * This program can respond to queries from the host
  * and stream rx samples.
@@ -102,24 +98,6 @@
 
 
 void
-timer_irq_handler(unsigned irq)
-{
-  hal_set_timeout(timer_delta);        // schedule next timeout
-}
-
-
-// Rx DSP overrun
-void
-overrun_irq_handler(unsigned irq)
-{
-  dsp_rx_regs->clear_state = 1;
-  dbsm_stop(&dsp_rx_sm);
-  // dbsm_start(&dsp_rx_sm);  // restart in start_rx_cmd
-
-  putstr("\nirq: overrun\n");
-}
-
-void
 start_rx_cmd(const u2_mac_addr_t *host, op_start_rx_t *p)
 {
   host_mac_addr = *host;       // remember who we're sending to
@@ -169,17 +147,15 @@
 {
   uint32_t  status = buffer_pool_status->status;
 
-  if (status & BPS_ERROR_ALL){
-    // FIXME rare path, handle error conditions
-  }
-
-  // FIXME probably ought to round-robin the check for done
-
   if (status & BPS_DONE(CPU_RX_BUF)){  // we've rcvd a frame from ethernet
     bp_clear_buf(CPU_RX_BUF);
     eth_pkt_inspector(0, CPU_RX_BUF);
     bp_receive_to_buf(CPU_RX_BUF, PORT_ETH, 1, 0, BP_LAST_LINE);
   }
+  if (status & BPS_ERROR(CPU_RX_BUF)){ // error from ethernet
+    bp_clear_buf(CPU_RX_BUF);
+    bp_receive_to_buf(CPU_RX_BUF, PORT_ETH, 1, 0, BP_LAST_LINE);
+  }
 
   dbsm_process_status(&dsp_rx_sm, status);
 
@@ -213,28 +189,38 @@
 #endif
 
 
+static void
+simulate_start_cmd(void)
+{
+  // If we're simulating, pretend that we got a start command from the host
+
+  int rx_scale = 256;
+  int decim = 64;
+
+  u2_mac_addr_t host = {{ 0x00, 0x0A, 0xE4, 0x3E, 0xD2, 0xD5 }};
+  op_start_rx_t def_config;
+  memset(&def_config, 0, sizeof(def_config));
+  def_config.phase_inc = 0;
+  def_config.scale_iq = (rx_scale << 16) | rx_scale;
+  def_config.decim = decim;
+  def_config.samples_per_frame = DSP_RX_SAMPLES_PER_FRAME;
+  def_config.total_samples = 10000 * DSP_RX_SAMPLES_PER_FRAME;
+  
+  start_rx_cmd(&host, &def_config);
+}
+
+
 int
 main(void)
 {
   u2_init();
 
-  // setup tx gpio bits for GPIOM_FPGA_1 -- fpga debug output
   hal_gpio_set_tx_mode(15, 0, GPIOM_FPGA_1);
-  hal_gpio_set_rx_mode(15, 0, GPIOM_FPGA_1);   // no printing...
+  hal_gpio_set_rx_mode(15, 0, GPIOM_FPGA_1);
 
   putstr("\nrx_only\n");
-  
-  // Control LEDs
-  hal_set_leds(0x0, 0x3);
 
-  pic_register_handler(IRQ_OVERRUN,  overrun_irq_handler);
-  // pic_register_handler(IRQ_UNDERRUN, underrun_irq_handler);
-
-  //pic_register_handler(IRQ_TIMER, timer_irq_handler);
-  //hal_set_timeout(timer_delta);
-
   ethernet_register_link_changed_callback(link_changed_callback);
-
   ethernet_init();
 
   // initialize double buffering state machine for DSP RX -> Ethernet
@@ -249,29 +235,21 @@
              dbsm_nop_inspector);
   }
 
-
   // setup receive from ETH
   bp_receive_to_buf(CPU_RX_BUF, PORT_ETH, 1, 0, BP_LAST_LINE);
 
-  if (hwconfig_simulation_p()){
-    // If we're simulating, pretend that we got a start command from the host
+  if (hwconfig_simulation_p())
+    simulate_start_cmd();
 
-    int rx_scale = 256;
-    int decim = 64;
+  while(1){
+    buffer_irq_handler(0);
 
-    u2_mac_addr_t host = {{ 0x00, 0x0A, 0xE4, 0x3E, 0xD2, 0xD5 }};
-    op_start_rx_t def_config;
-    memset(&def_config, 0, sizeof(def_config));
-    def_config.phase_inc = 0;
-    def_config.scale_iq = (rx_scale << 16) | rx_scale;
-    def_config.decim = decim;
-    def_config.samples_per_frame = DSP_RX_SAMPLES_PER_FRAME;
-    def_config.total_samples = 10000 * DSP_RX_SAMPLES_PER_FRAME;
+    int pending = pic_regs->pending;   // poll for under or overrun
 
-    start_rx_cmd(&host, &def_config);
+    if (pending & PIC_OVERRUN_INT){
+      dbsm_handle_rx_overrun(&dsp_rx_sm);
+      pic_regs->pending = PIC_OVERRUN_INT;     // clear pending interrupt
+      putchar('O');
+    }
   }
-
-  while(1){
-    buffer_irq_handler(0);
-  }
 }

Modified: usrp2/trunk/firmware/apps/tx_only.c
===================================================================
--- usrp2/trunk/firmware/apps/tx_only.c 2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/apps/tx_only.c 2008-02-07 02:59:52 UTC (rev 7594)
@@ -36,8 +36,6 @@
 #include <string.h>
 
 
-static int timer_delta = MASTER_CLK_RATE/1000; // tick at 1kHz
-
 /*
  * This program can respond to queries from the host
  * and stream rx samples.
@@ -92,26 +90,6 @@
 
 
 void
-timer_irq_handler(unsigned irq)
-{
-  hal_set_timeout(timer_delta);        // schedule next timeout
-}
-
-// Tx DSP underrun
-void
-underrun_irq_handler(unsigned irq)
-{
-  putchar('U');
-
-  dbsm_stop(&dsp_tx_sm);
-  dsp_tx_regs->clear_state = 1;
-  dbsm_start(&dsp_tx_sm);  // restart sm so we're listening to ethernet again
-
-  // putstr("\nirq: underrun\n");
-}
-
-
-void
 start_rx_cmd(const u2_mac_addr_t *host, op_start_rx_t *p)
 {
 }
@@ -128,7 +106,6 @@
   bp_clear_buf(DSP_TX_BUF_0);
   bp_clear_buf(DSP_TX_BUF_1);
 
-#if 1
   int tx_scale = 256;
   int interp = 32;
 
@@ -140,7 +117,6 @@
 
   // setup Tx DSP regs
   config_tx_cmd(&def_config);
-#endif
 }
 
 
@@ -151,23 +127,6 @@
 
   uint32_t  status = buffer_pool_status->status;
 
-  if (status & BPS_ERROR_ALL){
-    // FIXME rare path, handle error conditions
-    putstr("ERR = ");
-    puthex32_nl(status);
-
-    int r = ethernet_check_errors();
-    putstr("RME = ");
-    puthex8_nl(r);
-
-    if (status & (BPS_ERROR(DSP_TX_BUF_0) | BPS_ERROR(DSP_TX_BUF_1))){
-      dbsm_stop(&dsp_tx_sm);           
-      dsp_tx_regs->clear_state = 1; // try to restart
-      dbsm_start(&dsp_tx_sm);
-      return;
-    }
-  }
-
   dbsm_process_status(&dsp_tx_sm, status);
 
   if (status & BPS_DONE(CPU_TX_BUF)){
@@ -185,18 +144,8 @@
   hal_gpio_set_rx_mode(15, 0, GPIOM_FPGA_1);   // no printing...
 
   putstr("\ntx_only\n");
-  
-  // Control LEDs
-  hal_set_leds(0x0, 0x3);
 
-  // pic_register_handler(IRQ_OVERRUN,  overrun_irq_handler);
-  pic_register_handler(IRQ_UNDERRUN, underrun_irq_handler);
-
-  //pic_register_handler(IRQ_TIMER, timer_irq_handler);
-  //hal_set_timeout(timer_delta);
-
   ethernet_register_link_changed_callback(link_changed_callback);
-
   ethernet_init();
 
   // initialize double buffering state machine for ethernet -> DSP Tx
@@ -213,6 +162,14 @@
 
   while(1){
     buffer_irq_handler(0);
+
+    int pending = pic_regs->pending;   // poll for under or overrun
+
+    if (pending & PIC_UNDERRUN_INT){
+      dbsm_handle_tx_underrun(&dsp_tx_sm);
+      pic_regs->pending = PIC_UNDERRUN_INT;    // clear interrupt
+      putchar('U');
+    }
   }
 }
 

Modified: usrp2/trunk/firmware/lib/dbsm.c
===================================================================
--- usrp2/trunk/firmware/lib/dbsm.c     2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/lib/dbsm.c     2008-02-07 02:59:52 UTC (rev 7594)
@@ -147,6 +147,7 @@
 }
 
 static void dbsm_process_helper(dbsm_t *sm, int buf_this);
+static void dbsm_error_helper(dbsm_t *sm, int buf_this);
 
 void
 dbsm_process_status(dbsm_t *sm, uint32_t status)
@@ -154,6 +155,15 @@
   if (!sm->running)
     return;
 
+  if (status & (BPS_ERROR(sm->buf0) | BPS_ERROR(sm->buf0 ^ 1))){
+    // Most likely an ethernet Rx error.  We just restart the transfer.
+    if (status & (BPS_ERROR(sm->buf0)))
+      dbsm_error_helper(sm, sm->buf0);
+
+    if (status & (BPS_ERROR(sm->buf0 ^ 1)))
+      dbsm_error_helper(sm, sm->buf0 ^ 1);
+  }
+
   if (status & BPS_DONE(sm->buf0))
     dbsm_process_helper(sm, sm->buf0);
 
@@ -213,3 +223,57 @@
   }
 }
 
+static void
+dbsm_error_helper(dbsm_t *sm, int buf_this)
+{
+  bp_clear_buf(buf_this);              // clears ERROR flag
+
+  if (buffer_state[buf_this] == BS_FILLING){
+    dbsm_receive_to_buf(sm, buf_this);   // restart the xfer
+  }
+  else { // buffer was emptying
+    dbsm_send_from_buf(sm, buf_this);    // restart the xfer
+  }
+}
+
+/*
+ * Handle DSP Tx underrun
+ */
+void
+dbsm_handle_tx_underrun(dbsm_t *sm)
+{
+  // clear the DSP Tx state machine
+  dsp_tx_regs->clear_state = 1;
+
+  // If there's a buffer that's empyting (unlikely), clear it & restart xfer
+
+  if (buffer_state[sm->buf0] == BS_EMPTYING){
+    bp_clear_buf(sm->buf0);
+    dbsm_send_from_buf(sm, sm->buf0);
+  }
+
+  if (buffer_state[sm->buf0 ^ 1] == BS_EMPTYING){
+    bp_clear_buf(sm->buf0 ^ 1);
+    dbsm_send_from_buf(sm, sm->buf0 ^ 1);
+  }
+}
+
+/*
+ * Handle DSP Rx overrun
+ */
+void
+dbsm_handle_rx_overrun(dbsm_t *sm)
+{
+  dsp_rx_regs->clear_state = 1;
+
+  // If there's a buffer that's filling, clear it.
+  // Any restart will be the job of the caller.
+  
+  if (buffer_state[sm->buf0] == BS_FILLING)
+    bp_clear_buf(sm->buf0);
+
+  if (buffer_state[sm->buf0 ^1] == BS_FILLING)
+    bp_clear_buf(sm->buf0 ^ 1);
+
+  putchar('O');
+}

Modified: usrp2/trunk/firmware/lib/dbsm.h
===================================================================
--- usrp2/trunk/firmware/lib/dbsm.h     2008-02-07 00:40:57 UTC (rev 7593)
+++ usrp2/trunk/firmware/lib/dbsm.h     2008-02-07 02:59:52 UTC (rev 7594)
@@ -71,5 +71,7 @@
 void dbsm_start(dbsm_t *sm);
 void dbsm_stop(dbsm_t *sm);
 void dbsm_process_status(dbsm_t *sm, uint32_t status);
+void dbsm_handle_tx_underrun(dbsm_t *sm);
+void dbsm_handle_rx_overrun(dbsm_t *sm);
 
 #endif /* INCLUDED_DBSM_H */





reply via email to

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