[Top][All Lists]
[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
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Commit-gnuradio] r6008 - gnuradio/branches/developers/matt/u2f/firmware,
matt <=