commit-gnuradio
[Top][All Lists]
Advanced

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

[Commit-gnuradio] r6008 - gnuradio/branches/developers/matt/u2f/firmware


From: matt
Subject: [Commit-gnuradio] r6008 - gnuradio/branches/developers/matt/u2f/firmware
Date: Tue, 17 Jul 2007 16:56:40 -0600 (MDT)

Author: matt
Date: 2007-07-17 16:56:40 -0600 (Tue, 17 Jul 2007)
New Revision: 6008

Modified:
   gnuradio/branches/developers/matt/u2f/firmware/test1_main.c
Log:
very simple double buffering in interrupt handler -- somewhat slow


Modified: gnuradio/branches/developers/matt/u2f/firmware/test1_main.c
===================================================================
--- gnuradio/branches/developers/matt/u2f/firmware/test1_main.c 2007-07-17 
22:54:36 UTC (rev 6007)
+++ gnuradio/branches/developers/matt/u2f/firmware/test1_main.c 2007-07-17 
22:56:40 UTC (rev 6008)
@@ -4,27 +4,151 @@
 #include "sim_io.h"
 #include "buffer_pool.h"
 
+// Globals
+#define EMPTY 0
+#define FILLING 1
+#define FULL 2
+#define EMPTYING 3
+
+int dsp_rx_buf, dsp_tx_buf, serdes_rx_buf, serdes_tx_buf;
+int dsp_rx_idle, dsp_tx_idle, serdes_rx_idle, serdes_tx_idle;
+
+int buffer_state[4];
+
 void int_handler_func () __attribute__ ((interrupt_handler));
+
 void int_handler_func () {
   int i;
   unsigned int *status = (unsigned int *) 0xB020;
-  //sim_puts("ENTER INT\n");
-  for(i=0;i<8;i++)
-    if(*status & (1<<i)) {
-      //sim_puts("Clearing buf ");
-      sim_puthex_nl(i);
-      clear_buf(i);
+  unsigned int localstatus = *status;
+
+  if(localstatus & 1) {
+    clear_buf(0);
+    
+    if(buffer_state[0] == FILLING) {
+      buffer_state[0] = FULL;
+      if(buffer_state[1] == EMPTY) {
+       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;
+       send_from_buf(0, 0, 1, 10, 509);  // SERDES_TX from buffer 0
+       buffer_state[0] = EMPTYING;
+      }
     }
-  //sim_puts("EXIT INT\n");
+    else {  // buffer was emptying
+      buffer_state[0] = EMPTY;
+      if(dsp_rx_idle) {
+       dsp_rx_idle = 0;
+       receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 lines
+       buffer_state[0] = FILLING;
+      }
+      if(buffer_state[1] == FULL) {
+       send_from_buf(1, 0, 1, 10, 509);  // SERDES_TX from buffer 1
+       buffer_state[1] = EMPTYING;
+      }
+      else
+       serdes_tx_idle = 1;
+    }
+  }
+  if(localstatus & 2) {
+    clear_buf(1);
+    if(buffer_state[1] == FILLING) {
+      buffer_state[1] = FULL;
+      if(buffer_state[0] == EMPTY) {
+       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;
+       send_from_buf(1, 0, 1, 10, 509);  // SERDES_TX from buffer 0
+       buffer_state[1] = EMPTYING;
+      }
+    }
+    else {  // buffer was emptying
+      buffer_state[1] = EMPTY;
+      if(dsp_rx_idle) {
+       dsp_rx_idle = 0;
+       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) {
+       send_from_buf(0, 0, 1, 10, 509);  // SERDES_TX from buffer 1
+       buffer_state[0] = EMPTYING;
+      }
+      else
+       serdes_tx_idle = 1;
+    }
+  }
+  sim_puts("Int Proc'ed\n");
 }
 
 int
 main(void)
 {
+  int i;
+
   u2_init();
 
+  // Control LEDs
+  output_regs->leds = 0x02;
+
+  // Turn on ADCs
+  output_regs->adc_ctrl = 0x0A;
+
+  // Set up TX Chain
+  dsp_tx_regs->freq = 0;
+  dsp_tx_regs->scale_i = 1;
+  dsp_tx_regs->scale_q = 1;
+  dsp_tx_regs->interp_rate = 32;
+
+  // Set up RX Chain
+  dsp_rx_regs->freq = 0;
+  dsp_rx_regs->scale_i = 1;
+  dsp_rx_regs->scale_q = 1;
+  dsp_rx_regs->decim_rate = 32;
+
+  // Set up buffer control, using only 4 for now
+  for(i=0;i<4;i++) 
+    buffer_state[i] = EMPTY;
+  dsp_rx_buf = -1;
+  dsp_tx_buf = -1;
+  serdes_rx_buf = -1;
+  serdes_tx_buf = -1;
+
+  // Set up DSP RX
+  dsp_rx_buf = 0;
+  buffer_state[0] = FILLING;
+  serdes_tx_idle = 1;
+  receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 lines
+
+  dsp_rx_regs->run_rx = 1;           // Start DSP_RX
+  sim_puts("Done DSP RX setup\n");
+
+  // Set up serdes TX
+  serdes_tx_buf = 0;
+
+
+  // Set SERDES RX
+  //receive_to_buf(2, 0, 1, 5, 504);   // SERDES_RX to buffer 2, use 500 lines
+
+  //dsp_tx_regs->run_tx = 1;
+  
+  while(1) {};
+  sim_finish();
+  return 1;
+}
+
+
+// Spare Code
+
 #if 0  
-  // Set up DAC
+  // Set up LSDAC
   int i = 0;
   while(1) {
     int command = (3 << 19) | (0 << 16) |  (i & 0xffff);
@@ -32,12 +156,8 @@
     i++;
   }
 #endif
-  
-  // Control LEDs
-  output_regs->leds = 0x02;
 
-  int i;
-
+#if 0  
   // Write to buffer 0
   int *buf = (int *)(BUFFER_BASE + BUFFER_0);
   sim_puthex_nl((int)buf);
@@ -55,6 +175,9 @@
 
   sim_puts("Filled buffer 1\n");
 
+#endif
+
+#if 0
   // rx SERDES into buffer #2  (buf,port,step,fl,ll)
   receive_to_buf(2, 0, 1, 10, 300);
   sim_puts("SERDES RX buffer setup\n");
@@ -63,20 +186,21 @@
   send_from_buf(0, 0, 1, 20, 200);
   sim_puts("SERDES TX buffer setup\n");
 
-  // Set up TX Chain
-  dsp_tx_regs->freq = 0;
-  dsp_tx_regs->scale_i = 1;
-  dsp_tx_regs->scale_q = 1;
-  dsp_tx_regs->interp_rate = 32;
+#endif
 
+#if 0
   // send to DACs from buffer #1
   send_from_buf(1 /*buf#*/, 1 /*port*/, 1 /*step*/, 20 /*fl*/, 250 /*ll*/);
   sim_puts("DAC Buffer setup\n");
+#endif
 
-  dsp_tx_regs->run_tx = 1;
-  
-  while(1) {};
-  sim_finish();
-  
-  return 1;
-}
+#if 0
+  //sim_puts("ENTER INT\n");
+  for(i=0;i<8;i++)
+    if(*status & (1<<i)) {
+      //sim_puts("Clearing buf ");
+      sim_puthex_nl(i);
+      clear_buf(i);
+    }
+  //sim_puts("EXIT INT\n");
+#endif





reply via email to

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