Imported Upstream version 3.2.2
[debian/gnuradio] / usrp2 / firmware / apps / test1.c
1 #include "u2_init.h"
2 #include "memory_map.h"
3 #include "spi.h"
4 #include "hal_io.h"
5 #include "buffer_pool.h"
6 #include "pic.h"
7 #include "nonstdio.h"
8
9 // Globals
10 #define EMPTY 0
11 #define FILLING 1
12 #define FULL 2
13 #define EMPTYING 3
14
15 #define PORT 2    // ethernet = 2, serdes = 0
16 int dsp_rx_buf, dsp_tx_buf, serdes_rx_buf, serdes_tx_buf;
17 int dsp_rx_idle, dsp_tx_idle, serdes_rx_idle, serdes_tx_idle;
18
19 int buffer_state[4];
20
21
22 void double_buffering(int port);
23
24 //
25 // We register this in the secondary interrupt vector.
26 // It's called on buffer manager interrupts
27 //
28 void
29 buffer_irq_handler(unsigned irq)
30 {
31   double_buffering(PORT);
32 }
33
34 int
35 main(void)
36 {
37   int i;
38
39   u2_init();
40
41   // Control LEDs
42   output_regs->leds = 0x02;
43
44   // Turn on ADCs
45   output_regs->adc_ctrl = 0x0A;
46
47   // Set up TX Chain
48   dsp_tx_regs->freq = 0;
49   dsp_tx_regs->scale_iq = (1 << 16) | 1;
50   dsp_tx_regs->interp_rate = 8;
51
52   // Set up RX Chain
53   dsp_rx_regs->freq = 0;
54   dsp_rx_regs->scale_iq = (1 << 16) | 1;
55   dsp_rx_regs->decim_rate = 8;
56
57   // Set up buffer control, using only 4 for now
58   for(i=0;i<4;i++) 
59     buffer_state[i] = EMPTY;
60
61   // Set up DSP RX
62   buffer_state[0] = FILLING;
63   serdes_tx_idle = 1;
64   bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 lines
65
66   //dsp_rx_regs->run_rx = 1;           // Start DSP_RX
67   putstr("Done DSP RX setup\n");
68
69   // Set up serdes RX
70   buffer_state[2] = FILLING;
71   dsp_tx_idle = 1;
72   bp_receive_to_buf(2, PORT, 1, 5, 504);
73
74   while (buffer_pool_status->status == 0)  // wait for completion of DSP RX
75     ;
76
77   putstr("Done DSP TX setup\n");
78   //dsp_tx_regs->run_tx = 1;
79
80   // register interrupt handler
81   pic_register_handler(IRQ_BUFFER, buffer_irq_handler);
82
83   while (1)
84     ;
85
86   hal_finish();
87   return 1;
88 }
89
90 void 
91 double_buffering(int port) {
92   unsigned int localstatus = buffer_pool_status->status;
93
94   if(localstatus & BPS_DONE_0) {
95     bp_clear_buf(0);
96     if(buffer_state[0] == FILLING) {
97       buffer_state[0] = FULL;
98       if(buffer_state[1] == EMPTY) {
99         bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 lines
100         buffer_state[1] = FILLING;
101       }
102       else
103         dsp_rx_idle = 1;
104       if(serdes_tx_idle) {
105         serdes_tx_idle = 0;
106         bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
107         buffer_state[0] = EMPTYING;
108       }
109     }
110     else {  // buffer was emptying
111       buffer_state[0] = EMPTY;
112       if(dsp_rx_idle) {
113         dsp_rx_idle = 0;
114         bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 0, use 500 lines
115         buffer_state[0] = FILLING;
116       }
117       if(buffer_state[1] == FULL) {
118         bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
119         buffer_state[1] = EMPTYING;
120       }
121       else
122         serdes_tx_idle = 1;
123     }
124     putstr("Int Proc'ed 0\n");
125   }
126   if(localstatus & BPS_DONE_1) {
127     bp_clear_buf(1);
128     if(buffer_state[1] == FILLING) {
129       buffer_state[1] = FULL;
130       if(buffer_state[0] == EMPTY) {
131         bp_receive_to_buf(0, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 lines
132         buffer_state[0] = FILLING;
133       }
134       else
135         dsp_rx_idle = 1;
136       if(serdes_tx_idle) {
137         serdes_tx_idle = 0;
138         bp_send_from_buf(1, port, 1, 10, 509);  // SERDES_TX from buffer 1
139         buffer_state[1] = EMPTYING;
140       }
141     }
142     else {  // buffer was emptying
143       buffer_state[1] = EMPTY;
144       if(dsp_rx_idle) {
145         dsp_rx_idle = 0;
146         bp_receive_to_buf(1, 1, 1, 10, 509);  // DSP_RX to buffer 1, use 500 lines
147         buffer_state[1] = FILLING;
148       }
149       if(buffer_state[0] == FULL) {
150         bp_send_from_buf(0, port, 1, 10, 509);  // SERDES_TX from buffer 0
151         buffer_state[0] = EMPTYING;
152       }
153       else
154         serdes_tx_idle = 1;
155     }
156   putstr("Int Proc'ed 1\n");
157   }
158   if(localstatus & BPS_DONE_2) {
159     bp_clear_buf(2);
160     if(buffer_state[2] == FILLING) {
161       buffer_state[2] = FULL;
162       if(buffer_state[3] == EMPTY) {
163         bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3, use 500 lines
164         buffer_state[3] = FILLING;
165       }
166       else
167         serdes_rx_idle = 1;
168       if(dsp_tx_idle) {
169         dsp_tx_idle = 0;
170         bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
171         buffer_state[2] = EMPTYING;
172       }
173     }
174     else {  // buffer was emptying
175       buffer_state[2] = EMPTY;
176       if(serdes_rx_idle) {
177         serdes_rx_idle = 0;
178         bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2
179         buffer_state[2] = FILLING;
180       }
181       if(buffer_state[3] == FULL) {
182         bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
183         buffer_state[3] = EMPTYING;
184       }
185       else
186         dsp_tx_idle = 1;
187     }
188   putstr("Int Proc'ed 2\n");
189   }
190   if(localstatus & BPS_DONE_3) {
191     bp_clear_buf(3);
192     if(buffer_state[3] == FILLING) {
193       buffer_state[3] = FULL;
194       if(buffer_state[2] == EMPTY) {
195         bp_receive_to_buf(2, port, 1, 5, 504);  // SERDES_RX to buffer 2, use 500 lines
196         buffer_state[2] = FILLING;
197       }
198       else
199         serdes_rx_idle = 1;
200       if(dsp_tx_idle) {
201         dsp_tx_idle = 0;
202         bp_send_from_buf(3, 1, 1, 5, 504);  // DSP_TX from buffer 3
203         buffer_state[3] = EMPTYING;
204       }
205     }
206     else {  // buffer was emptying
207       buffer_state[3] = EMPTY;
208       if(serdes_rx_idle) {
209         serdes_rx_idle = 0;
210         bp_receive_to_buf(3, port, 1, 5, 504);  // SERDES_RX to buffer 3
211         buffer_state[3] = FILLING;
212       }
213       if(buffer_state[2] == FULL) {
214         bp_send_from_buf(2, 1, 1, 5, 504);  // DSP_TX from buffer 2
215         buffer_state[2] = EMPTYING;
216       }
217       else
218         dsp_tx_idle = 1;
219     }
220   putstr("Int Proc'ed 3\n");
221   }
222 }
223
224 // Spare Code
225
226 #if 0  
227   // Set up LSDAC
228   int i = 0;
229   while(1) {
230     int command = (3 << 19) | (0 << 16) |  (i & 0xffff);
231     spi_transact(SPI_TXONLY, SPI_SS_TX_DAC, command, 24, 1); // negate TX phase
232     i++;
233   }
234 #endif
235
236 #if 0  
237   // Write to buffer 0
238   int *buf = (int *)(BUFFER_BASE + BUFFER_0);
239   puthex_nl((int)buf);
240
241   for(i=0;i<BUFFER_SIZE;i++)
242     buf[i] = i;
243
244   putstr("Filled buffer 0\n");
245
246   // Write to buffer 1
247   buf = (int *)(BUFFER_BASE + BUFFER_1);
248   puthex_nl((int)buf);
249   for(i=0;i<BUFFER_SIZE;i++)
250     buf[i] =  i + ((i^0xFFFF) << 16);
251
252   putstr("Filled buffer 1\n");
253
254 #endif
255
256 #if 0
257   // rx SERDES into buffer #2  (buf,port,step,fl,ll)
258   bp_receive_to_buf(2, 0, 1, 10, 300);
259   putstr("SERDES RX buffer setup\n");
260
261   // send SERDES from buffer #0 (buf,port,step,fl,ll)
262   bp_send_from_buf(0, 0, 1, 20, 200);
263   putstr("SERDES TX buffer setup\n");
264
265 #endif
266
267 #if 0
268   // send to DACs from buffer #1
269   bp_send_from_buf(1 /*buf#*/, 1 /*port*/, 1 /*step*/, 20 /*fl*/, 250 /*ll*/);
270   putstr("DAC Buffer setup\n");
271 #endif
272
273 #if 0
274   //putstr("ENTER INT\n");
275   for(i=0;i<8;i++)
276     if(*status & (1<<i)) {
277       //putstr("Clearing buf ");
278       puthex_nl(i);
279       bp_clear_buf(i);
280     }
281   //putstr("EXIT INT\n");
282 #endif