~ubuntu-branches/ubuntu/trusty/gnuradio/trusty-updates

« back to all changes in this revision

Viewing changes to usrp/host/lib/legacy/usrp_basic.cc

  • Committer: Package Import Robot
  • Author(s): A. Maitland Bottoms
  • Date: 2012-02-26 21:26:16 UTC
  • mfrom: (1.1.4)
  • Revision ID: package-import@ubuntu.com-20120226212616-vsfkbi1158xshdql
Tags: 3.5.1-1
* new upstream version, re-packaged from scratch with modern tools
    closes: #642716, #645332, #394849, #616832, #590048, #642580,
    #647018, #557050, #559640, #631863
* CMake build

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
/* -*- c++ -*- */
2
 
/*
3
 
 * Copyright 2003,2004,2008 Free Software Foundation, Inc.
4
 
 * 
5
 
 * This file is part of GNU Radio
6
 
 * 
7
 
 * GNU Radio is free software; you can redistribute it and/or modify
8
 
 * it under the terms of the GNU General Public License as published by
9
 
 * the Free Software Foundation; either version 3, or (at your option)
10
 
 * any later version.
11
 
 * 
12
 
 * GNU Radio is distributed in the hope that it will be useful,
13
 
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14
 
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15
 
 * GNU General Public License for more details.
16
 
 * 
17
 
 * You should have received a copy of the GNU General Public License
18
 
 * along with GNU Radio; see the file COPYING.  If not, write to
19
 
 * the Free Software Foundation, Inc., 51 Franklin Street,
20
 
 * Boston, MA 02110-1301, USA.
21
 
 */
22
 
 
23
 
#ifdef HAVE_CONFIG_H
24
 
#include "config.h"
25
 
#endif
26
 
 
27
 
#include "usrp_basic.h"
28
 
#include "usrp_prims.h"
29
 
#include "usrp_interfaces.h"
30
 
#include "fpga_regs_common.h"
31
 
#include "fpga_regs_standard.h"
32
 
#include "fusb.h"
33
 
#include "db_boards.h"
34
 
#include <usb.h>
35
 
#include <stdexcept>
36
 
#include <assert.h>
37
 
#include <math.h>
38
 
#include <ad9862.h>
39
 
#include <string.h>
40
 
#include <cstdio>
41
 
 
42
 
using namespace ad9862;
43
 
 
44
 
#define NELEM(x) (sizeof (x) / sizeof (x[0]))
45
 
 
46
 
// These set the buffer size used for each end point using the fast
47
 
// usb interface.  The kernel ends up locking down this much memory.
48
 
 
49
 
static const int FUSB_BUFFER_SIZE = fusb_sysconfig::default_buffer_size();
50
 
static const int FUSB_BLOCK_SIZE = fusb_sysconfig::max_block_size();
51
 
static const int FUSB_NBLOCKS    = FUSB_BUFFER_SIZE / FUSB_BLOCK_SIZE;
52
 
 
53
 
 
54
 
static const double POLLING_INTERVAL = 0.1;     // seconds
55
 
 
56
 
////////////////////////////////////////////////////////////////
57
 
 
58
 
static struct usb_dev_handle *
59
 
open_rx_interface (struct usb_device *dev)
60
 
{
61
 
  struct usb_dev_handle *udh = usrp_open_rx_interface (dev);
62
 
  if (udh == 0){
63
 
    fprintf (stderr, "usrp_basic_rx: can't open rx interface\n");
64
 
    usb_strerror ();
65
 
  }
66
 
  return udh;
67
 
}
68
 
 
69
 
static struct usb_dev_handle *
70
 
open_tx_interface (struct usb_device *dev)
71
 
{
72
 
  struct usb_dev_handle *udh = usrp_open_tx_interface (dev);
73
 
  if (udh == 0){
74
 
    fprintf (stderr, "usrp_basic_tx: can't open tx interface\n");
75
 
    usb_strerror ();
76
 
  }
77
 
  return udh;
78
 
}
79
 
 
80
 
 
81
 
//////////////////////////////////////////////////////////////////
82
 
//
83
 
//                      usrp_basic
84
 
//
85
 
////////////////////////////////////////////////////////////////
86
 
 
87
 
 
88
 
// Given:
89
 
//   CLKIN = 64 MHz
90
 
//   CLKSEL pin = high 
91
 
//
92
 
// These settings give us:
93
 
//   CLKOUT1 = CLKIN = 64 MHz
94
 
//   CLKOUT2 = CLKIN = 64 MHz
95
 
//   ADC is clocked at  64 MHz
96
 
//   DAC is clocked at 128 MHz
97
 
 
98
 
static unsigned char common_regs[] = {
99
 
  REG_GENERAL,          0,
100
 
  REG_DLL,              (DLL_DISABLE_INTERNAL_XTAL_OSC
101
 
                         | DLL_MULT_2X
102
 
                         | DLL_FAST),
103
 
  REG_CLKOUT,           CLKOUT2_EQ_DLL_OVER_2,
104
 
  REG_AUX_ADC_CLK,      AUX_ADC_CLK_CLK_OVER_4
105
 
};
106
 
 
107
 
 
108
 
usrp_basic::usrp_basic (int which_board, 
109
 
                        struct usb_dev_handle *
110
 
                        open_interface (struct usb_device *dev),
111
 
                        const std::string fpga_filename,
112
 
                        const std::string firmware_filename)
113
 
  : d_udh (0),
114
 
    d_usb_data_rate (16000000), // SWAG, see below
115
 
    d_bytes_per_poll ((int) (POLLING_INTERVAL * d_usb_data_rate)),
116
 
    d_verbose (false), d_fpga_master_clock_freq(64000000), d_db(2)
117
 
{
118
 
  /*
119
 
   * SWAG: Scientific Wild Ass Guess.
120
 
   *
121
 
   * d_usb_data_rate is used only to determine how often to poll for over- and under-runs.
122
 
   * We defualt it to 1/2  of our best case.  Classes derived from usrp_basic (e.g., 
123
 
   * usrp_standard_tx and usrp_standard_rx) call set_usb_data_rate() to tell us the
124
 
   * actual rate.  This doesn't change our throughput, that's determined by the signal
125
 
   * processing code in the FPGA (which we know nothing about), and the system limits
126
 
   * determined by libusb, fusb_*, and the underlying drivers.
127
 
   */
128
 
  memset (d_fpga_shadows, 0, sizeof (d_fpga_shadows));
129
 
 
130
 
  usrp_one_time_init ();
131
 
 
132
 
  if (!usrp_load_standard_bits (which_board, false, fpga_filename, firmware_filename))
133
 
    throw std::runtime_error ("usrp_basic/usrp_load_standard_bits");
134
 
 
135
 
  struct usb_device *dev = usrp_find_device (which_board);
136
 
  if (dev == 0){
137
 
    fprintf (stderr, "usrp_basic: can't find usrp[%d]\n", which_board);
138
 
    throw std::runtime_error ("usrp_basic/usrp_find_device");
139
 
  }
140
 
 
141
 
  if (!(usrp_usrp_p(dev) && usrp_hw_rev(dev) >= 1)){
142
 
    fprintf (stderr, "usrp_basic: sorry, this code only works with USRP revs >= 1\n");
143
 
    throw std::runtime_error ("usrp_basic/bad_rev");
144
 
  }
145
 
 
146
 
  if ((d_udh = open_interface (dev)) == 0)
147
 
    throw std::runtime_error ("usrp_basic/open_interface");
148
 
 
149
 
  // initialize registers that are common to rx and tx
150
 
 
151
 
  if (!usrp_9862_write_many_all (d_udh, common_regs, sizeof (common_regs))){
152
 
    fprintf (stderr, "usrp_basic: failed to init common AD9862 regs\n");
153
 
    throw std::runtime_error ("usrp_basic/init_9862");
154
 
  }
155
 
 
156
 
  _write_fpga_reg (FR_MODE, 0);         // ensure we're in normal mode
157
 
  _write_fpga_reg (FR_DEBUG_EN, 0);     // disable debug outputs
158
 
}
159
 
 
160
 
void
161
 
usrp_basic::shutdown_daughterboards()
162
 
{
163
 
  // nuke d'boards before we close down USB in ~usrp_basic
164
 
  // shutdown() will do any board shutdown while the USRP can still
165
 
  // be talked to
166
 
  for(size_t i = 0; i < d_db.size(); i++) 
167
 
    for(size_t j = 0; j < d_db[i].size(); j++) 
168
 
      d_db[i][j]->shutdown();
169
 
}
170
 
 
171
 
usrp_basic::~usrp_basic ()
172
 
{
173
 
  // shutdown_daughterboards();         // call from ~usrp_basic_{tx,rx}
174
 
 
175
 
  d_db.resize(0); // forget db shared ptrs
176
 
 
177
 
  if (d_udh)
178
 
    usb_close (d_udh);
179
 
}
180
 
 
181
 
void
182
 
usrp_basic::init_db(usrp_basic_sptr u)
183
 
{
184
 
  if (u.get() != this)
185
 
    throw std::invalid_argument("u is not this");
186
 
 
187
 
  d_db[0] = instantiate_dbs(d_dbid[0], u, 0);
188
 
  d_db[1] = instantiate_dbs(d_dbid[1], u, 1);
189
 
}
190
 
 
191
 
std::vector<db_base_sptr> 
192
 
usrp_basic::db(int which_side)
193
 
{
194
 
  which_side &= 0x1;    // clamp it to avoid any reporting any errors
195
 
  return d_db[which_side];
196
 
}
197
 
 
198
 
bool
199
 
usrp_basic::is_valid(const usrp_subdev_spec &ss)
200
 
{
201
 
  if (ss.side < 0 || ss.side > 1)
202
 
    return false;
203
 
 
204
 
  if (ss.subdev < 0 || ss.subdev >= d_db[ss.side].size())
205
 
    return false;
206
 
 
207
 
  return true;
208
 
}
209
 
 
210
 
db_base_sptr
211
 
usrp_basic::selected_subdev(const usrp_subdev_spec &ss)
212
 
{
213
 
  if (!is_valid(ss))
214
 
    throw std::invalid_argument("invalid subdev_spec");
215
 
 
216
 
  return d_db[ss.side][ss.subdev];
217
 
}
218
 
 
219
 
bool
220
 
usrp_basic::start ()
221
 
{
222
 
  return true;          // nop
223
 
}
224
 
 
225
 
bool
226
 
usrp_basic::stop ()
227
 
{
228
 
  return true;          // nop
229
 
}
230
 
 
231
 
void
232
 
usrp_basic::set_usb_data_rate (int usb_data_rate)
233
 
{
234
 
  d_usb_data_rate = usb_data_rate;
235
 
  d_bytes_per_poll = (int) (usb_data_rate * POLLING_INTERVAL);
236
 
}
237
 
 
238
 
bool
239
 
usrp_basic::_write_aux_dac (int slot, int which_dac, int value)
240
 
{
241
 
  return usrp_write_aux_dac (d_udh, slot, which_dac, value);
242
 
}
243
 
 
244
 
bool
245
 
usrp_basic::_read_aux_adc (int slot, int which_adc, int *value)
246
 
{
247
 
  return usrp_read_aux_adc (d_udh, slot, which_adc, value);
248
 
}
249
 
 
250
 
int
251
 
usrp_basic::_read_aux_adc (int slot, int which_adc)
252
 
{
253
 
  int   value;
254
 
  if (!_read_aux_adc (slot, which_adc, &value))
255
 
    return READ_FAILED;
256
 
 
257
 
  return value;
258
 
}
259
 
 
260
 
bool
261
 
usrp_basic::write_eeprom (int i2c_addr, int eeprom_offset, const std::string buf)
262
 
{
263
 
  return usrp_eeprom_write (d_udh, i2c_addr, eeprom_offset, buf.data (), buf.size ());
264
 
}
265
 
 
266
 
std::string
267
 
usrp_basic::read_eeprom (int i2c_addr, int eeprom_offset, int len)
268
 
{
269
 
  if (len <= 0)
270
 
    return "";
271
 
 
272
 
  char buf[len];
273
 
 
274
 
  if (!usrp_eeprom_read (d_udh, i2c_addr, eeprom_offset, buf, len))
275
 
    return "";
276
 
 
277
 
  return std::string (buf, len);
278
 
}
279
 
 
280
 
bool
281
 
usrp_basic::write_i2c (int i2c_addr, const std::string buf)
282
 
{
283
 
  return usrp_i2c_write (d_udh, i2c_addr, buf.data (), buf.size ());
284
 
}
285
 
 
286
 
std::string
287
 
usrp_basic::read_i2c (int i2c_addr, int len)
288
 
{
289
 
  if (len <= 0)
290
 
    return "";
291
 
 
292
 
  char buf[len];
293
 
 
294
 
  if (!usrp_i2c_read (d_udh, i2c_addr, buf, len))
295
 
    return "";
296
 
 
297
 
  return std::string (buf, len);
298
 
}
299
 
 
300
 
std::string
301
 
usrp_basic::serial_number()
302
 
{
303
 
  return usrp_serial_number(d_udh);
304
 
}
305
 
 
306
 
// ----------------------------------------------------------------
307
 
 
308
 
bool
309
 
usrp_basic::set_adc_offset (int which_adc, int offset)
310
 
{
311
 
  if (which_adc < 0 || which_adc > 3)
312
 
    return false;
313
 
 
314
 
  return _write_fpga_reg (FR_ADC_OFFSET_0 + which_adc, offset);
315
 
}
316
 
 
317
 
bool
318
 
usrp_basic::set_dac_offset (int which_dac, int offset, int offset_pin)
319
 
{
320
 
  if (which_dac < 0 || which_dac > 3)
321
 
    return false;
322
 
 
323
 
  int which_codec = which_dac >> 1;
324
 
  int tx_a = (which_dac & 0x1) == 0;
325
 
  int lo = ((offset & 0x3) << 6) | (offset_pin & 0x1);
326
 
  int hi = (offset >> 2);
327
 
  bool ok;
328
 
 
329
 
  if (tx_a){
330
 
    ok =  _write_9862 (which_codec, REG_TX_A_OFFSET_LO, lo);
331
 
    ok &= _write_9862 (which_codec, REG_TX_A_OFFSET_HI, hi);
332
 
  }
333
 
  else {
334
 
    ok =  _write_9862 (which_codec, REG_TX_B_OFFSET_LO, lo);
335
 
    ok &= _write_9862 (which_codec, REG_TX_B_OFFSET_HI, hi);
336
 
  }
337
 
  return ok;
338
 
}
339
 
 
340
 
bool
341
 
usrp_basic::set_adc_buffer_bypass (int which_adc, bool bypass)
342
 
{
343
 
  if (which_adc < 0 || which_adc > 3)
344
 
    return false;
345
 
 
346
 
  int codec = which_adc >> 1;
347
 
  int reg = (which_adc & 1) == 0 ? REG_RX_A : REG_RX_B;
348
 
 
349
 
  unsigned char cur_rx;
350
 
  unsigned char cur_pwr_dn;
351
 
 
352
 
  // If the input buffer is bypassed, we need to power it down too.
353
 
 
354
 
  bool ok = _read_9862 (codec, reg, &cur_rx);
355
 
  ok &= _read_9862 (codec, REG_RX_PWR_DN, &cur_pwr_dn);
356
 
  if (!ok)
357
 
    return false;
358
 
 
359
 
  if (bypass){
360
 
    cur_rx |= RX_X_BYPASS_INPUT_BUFFER;
361
 
    cur_pwr_dn |= ((which_adc & 1) == 0) ? RX_PWR_DN_BUF_A : RX_PWR_DN_BUF_B;
362
 
  }
363
 
  else {
364
 
    cur_rx &= ~RX_X_BYPASS_INPUT_BUFFER;
365
 
    cur_pwr_dn &= ~(((which_adc & 1) == 0) ? RX_PWR_DN_BUF_A : RX_PWR_DN_BUF_B);
366
 
  }
367
 
 
368
 
  ok &= _write_9862 (codec, reg, cur_rx);
369
 
  ok &= _write_9862 (codec, REG_RX_PWR_DN, cur_pwr_dn);
370
 
  return ok;
371
 
}
372
 
 
373
 
bool
374
 
usrp_basic::set_dc_offset_cl_enable(int bits, int mask)
375
 
{
376
 
  return _write_fpga_reg(FR_DC_OFFSET_CL_EN, 
377
 
                         (d_fpga_shadows[FR_DC_OFFSET_CL_EN] & ~mask) | (bits & mask));
378
 
}
379
 
 
380
 
// ----------------------------------------------------------------
381
 
 
382
 
bool
383
 
usrp_basic::_write_fpga_reg (int regno, int value)
384
 
{
385
 
  if (d_verbose){
386
 
    fprintf (stdout, "_write_fpga_reg(%3d, 0x%08x)\n", regno, value);
387
 
    fflush (stdout);
388
 
  }
389
 
 
390
 
  if (regno >= 0 && regno < MAX_REGS)
391
 
    d_fpga_shadows[regno] = value;
392
 
 
393
 
  return usrp_write_fpga_reg (d_udh, regno, value);
394
 
}
395
 
 
396
 
bool
397
 
usrp_basic::_write_fpga_reg_masked (int regno, int value, int mask)
398
 
{
399
 
  //Only use this for registers who actually use a mask in the verilog firmware, like FR_RX_MASTER_SLAVE
400
 
  //value is a 16 bits value and mask is a 16 bits mask
401
 
  if (d_verbose){
402
 
    fprintf (stdout, "_write_fpga_reg_masked(%3d, 0x%04x,0x%04x)\n", regno, value, mask);
403
 
    fflush (stdout);
404
 
  }
405
 
 
406
 
  if (regno >= 0 && regno < MAX_REGS)
407
 
    d_fpga_shadows[regno] = value;
408
 
 
409
 
  return usrp_write_fpga_reg (d_udh, regno, (value & 0xffff) | ((mask & 0xffff)<<16));
410
 
}
411
 
 
412
 
 
413
 
bool
414
 
usrp_basic::_read_fpga_reg (int regno, int *value)
415
 
{
416
 
  return usrp_read_fpga_reg (d_udh, regno, value);
417
 
}
418
 
 
419
 
int
420
 
usrp_basic::_read_fpga_reg (int regno)
421
 
{
422
 
  int value;
423
 
  if (!_read_fpga_reg (regno, &value))
424
 
    return READ_FAILED;
425
 
  return value;
426
 
}
427
 
 
428
 
bool
429
 
usrp_basic::_write_9862 (int which_codec, int regno, unsigned char value)
430
 
{
431
 
  if (0 && d_verbose){
432
 
    // FIXME really want to enable logging in usrp_prims:usrp_9862_write
433
 
    fprintf(stdout, "_write_9862(codec = %d, regno = %2d, val = 0x%02x)\n", which_codec, regno, value);
434
 
    fflush(stdout);
435
 
  }
436
 
 
437
 
  return usrp_9862_write (d_udh, which_codec, regno, value);
438
 
}
439
 
 
440
 
 
441
 
bool
442
 
usrp_basic::_read_9862 (int which_codec, int regno, unsigned char *value) const
443
 
{
444
 
  return usrp_9862_read (d_udh, which_codec, regno, value);
445
 
}
446
 
 
447
 
int
448
 
usrp_basic::_read_9862 (int which_codec, int regno) const
449
 
{
450
 
  unsigned char value;
451
 
  if (!_read_9862 (which_codec, regno, &value))
452
 
    return READ_FAILED;
453
 
  return value;
454
 
}
455
 
 
456
 
bool
457
 
usrp_basic::_write_spi (int optional_header, int enables, int format, std::string buf)
458
 
{
459
 
  return usrp_spi_write (d_udh, optional_header, enables, format,
460
 
                         buf.data(), buf.size());
461
 
}
462
 
 
463
 
std::string
464
 
usrp_basic::_read_spi (int optional_header, int enables, int format, int len)
465
 
{
466
 
  if (len <= 0)
467
 
    return "";
468
 
  
469
 
  char buf[len];
470
 
 
471
 
  if (!usrp_spi_read (d_udh, optional_header, enables, format, buf, len))
472
 
    return "";
473
 
 
474
 
  return std::string (buf, len);
475
 
}
476
 
 
477
 
 
478
 
bool
479
 
usrp_basic::_set_led (int which_led, bool on)
480
 
{
481
 
  return usrp_set_led (d_udh, which_led, on);
482
 
}
483
 
 
484
 
bool
485
 
usrp_basic::write_atr_tx_delay(int value)
486
 
{
487
 
  return _write_fpga_reg(FR_ATR_TX_DELAY, value);
488
 
}
489
 
 
490
 
bool
491
 
usrp_basic::write_atr_rx_delay(int value)
492
 
{
493
 
  return _write_fpga_reg(FR_ATR_RX_DELAY, value);
494
 
}
495
 
 
496
 
/*
497
 
 * ----------------------------------------------------------------
498
 
 * Routines to access and control daughterboard specific i/o
499
 
 * ----------------------------------------------------------------
500
 
 */
501
 
static int
502
 
slot_id_to_oe_reg (int slot_id)
503
 
{
504
 
  static int reg[4]  = { FR_OE_0, FR_OE_1, FR_OE_2, FR_OE_3 };
505
 
  assert (0 <= slot_id && slot_id < 4);
506
 
  return reg[slot_id];
507
 
}
508
 
 
509
 
static int
510
 
slot_id_to_io_reg (int slot_id)
511
 
{
512
 
  static int reg[4]  = { FR_IO_0, FR_IO_1, FR_IO_2, FR_IO_3 };
513
 
  assert (0 <= slot_id && slot_id < 4);
514
 
  return reg[slot_id];
515
 
}
516
 
 
517
 
static int
518
 
slot_id_to_refclk_reg(int slot_id)
519
 
{
520
 
  static int reg[4]  = { FR_TX_A_REFCLK, FR_RX_A_REFCLK, FR_TX_B_REFCLK, FR_RX_B_REFCLK };
521
 
  assert (0 <= slot_id && slot_id < 4);
522
 
  return reg[slot_id];
523
 
}
524
 
 
525
 
static int
526
 
slot_id_to_atr_mask_reg(int slot_id)
527
 
{
528
 
  static int reg[4]  = { FR_ATR_MASK_0, FR_ATR_MASK_1, FR_ATR_MASK_2, FR_ATR_MASK_3 };
529
 
  assert (0 <= slot_id && slot_id < 4);
530
 
  return reg[slot_id];
531
 
}
532
 
 
533
 
static int
534
 
slot_id_to_atr_txval_reg(int slot_id)
535
 
{
536
 
  static int reg[4]  = { FR_ATR_TXVAL_0, FR_ATR_TXVAL_1, FR_ATR_TXVAL_2, FR_ATR_TXVAL_3 };
537
 
  assert (0 <= slot_id && slot_id < 4);
538
 
  return reg[slot_id];
539
 
}
540
 
 
541
 
static int
542
 
slot_id_to_atr_rxval_reg(int slot_id)
543
 
{
544
 
  static int reg[4]  = { FR_ATR_RXVAL_0, FR_ATR_RXVAL_1, FR_ATR_RXVAL_2, FR_ATR_RXVAL_3 };
545
 
  assert (0 <= slot_id && slot_id < 4);
546
 
  return reg[slot_id];
547
 
}
548
 
 
549
 
static int
550
 
to_slot(txrx_t txrx, int which_side)
551
 
{
552
 
  // TX_A = 0
553
 
  // RX_A = 1
554
 
  // TX_B = 2
555
 
  // RX_B = 3
556
 
  return ((which_side & 0x1) << 1) | ((txrx & 0x1) == C_RX);
557
 
}
558
 
 
559
 
bool
560
 
usrp_basic::common_set_pga(txrx_t txrx, int which_amp, double gain)
561
 
{
562
 
  if (which_amp < 0 || which_amp > 3)
563
 
    return false;
564
 
 
565
 
  gain = std::min(common_pga_max(txrx),
566
 
                  std::max(common_pga_min(txrx), gain));
567
 
 
568
 
  int codec = which_amp >> 1;   
569
 
  int int_gain = (int) rint((gain - common_pga_min(txrx)) / common_pga_db_per_step(txrx));
570
 
 
571
 
  if (txrx == C_TX){            // 0 and 1 are same, as are 2 and 3
572
 
    return _write_9862(codec, REG_TX_PGA, int_gain);
573
 
  }
574
 
  else {
575
 
    int reg = (which_amp & 1) == 0 ? REG_RX_A : REG_RX_B;
576
 
 
577
 
    // read current value to get input buffer bypass flag.
578
 
    unsigned char cur_rx;
579
 
    if (!_read_9862(codec, reg, &cur_rx))
580
 
      return false;
581
 
 
582
 
    cur_rx = (cur_rx & RX_X_BYPASS_INPUT_BUFFER) | (int_gain & 0x7f);
583
 
    return _write_9862(codec, reg, cur_rx);
584
 
  }
585
 
}
586
 
 
587
 
double
588
 
usrp_basic::common_pga(txrx_t txrx, int which_amp) const
589
 
{
590
 
  if (which_amp < 0 || which_amp > 3)
591
 
    return READ_FAILED;
592
 
 
593
 
  if (txrx == C_TX){
594
 
    int codec = which_amp >> 1;
595
 
    unsigned char v;
596
 
    bool ok = _read_9862 (codec, REG_TX_PGA, &v);
597
 
    if (!ok)
598
 
      return READ_FAILED;
599
 
 
600
 
    return (pga_db_per_step() * v) + pga_min();
601
 
  }
602
 
  else {
603
 
    int codec = which_amp >> 1;
604
 
    int reg = (which_amp & 1) == 0 ? REG_RX_A : REG_RX_B;
605
 
    unsigned char v;
606
 
    bool ok = _read_9862 (codec, reg, &v);
607
 
    if (!ok)
608
 
      return READ_FAILED;
609
 
 
610
 
    return (pga_db_per_step() * (v & 0x1f)) + pga_min();
611
 
  }
612
 
}
613
 
 
614
 
double
615
 
usrp_basic::common_pga_min(txrx_t txrx) const
616
 
{
617
 
  if (txrx == C_TX)
618
 
    return -20.0;
619
 
  else
620
 
    return   0.0;
621
 
}
622
 
 
623
 
double
624
 
usrp_basic::common_pga_max(txrx_t txrx) const
625
 
{
626
 
  if (txrx == C_TX)
627
 
    return   0.0;
628
 
  else
629
 
    return  20.0;
630
 
}
631
 
 
632
 
double
633
 
usrp_basic::common_pga_db_per_step(txrx_t txrx) const
634
 
{
635
 
  if (txrx == C_TX)
636
 
    return  20.0 / 255;
637
 
  else
638
 
    return  20.0 / 20;
639
 
}
640
 
 
641
 
bool
642
 
usrp_basic::_common_write_oe(txrx_t txrx, int which_side, int value, int mask)
643
 
{
644
 
  if (! (0 <= which_side && which_side <= 1))
645
 
    return false;
646
 
 
647
 
  return _write_fpga_reg(slot_id_to_oe_reg(to_slot(txrx, which_side)),
648
 
                         (mask << 16) | (value & 0xffff));
649
 
}
650
 
 
651
 
bool
652
 
usrp_basic::common_write_io(txrx_t txrx, int which_side, int value, int mask)
653
 
{
654
 
  if (! (0 <= which_side && which_side <= 1))
655
 
    return false;
656
 
 
657
 
  return _write_fpga_reg(slot_id_to_io_reg(to_slot(txrx, which_side)),
658
 
                         (mask << 16) | (value & 0xffff));
659
 
}
660
 
 
661
 
bool
662
 
usrp_basic::common_read_io(txrx_t txrx, int which_side, int *value)
663
 
{
664
 
  if (! (0 <= which_side && which_side <= 1))
665
 
    return false;
666
 
 
667
 
  int t;
668
 
  int reg = which_side + 1;     // FIXME, *very* magic number (fix in serial_io.v)
669
 
  bool ok = _read_fpga_reg(reg, &t);
670
 
  if (!ok)
671
 
    return false;
672
 
 
673
 
  if (txrx == C_TX){
674
 
    *value = t & 0xffff;                // FIXME, more magic
675
 
    return true;
676
 
  }
677
 
  else {
678
 
    *value = (t >> 16) & 0xffff;        // FIXME, more magic
679
 
    return true;
680
 
  }
681
 
}
682
 
 
683
 
int
684
 
usrp_basic::common_read_io(txrx_t txrx, int which_side)
685
 
{
686
 
  int   value;
687
 
  if (!common_read_io(txrx, which_side, &value))
688
 
    return READ_FAILED;
689
 
  return value;
690
 
}
691
 
 
692
 
bool
693
 
usrp_basic::common_write_refclk(txrx_t txrx, int which_side, int value)
694
 
{
695
 
  if (! (0 <= which_side && which_side <= 1))
696
 
    return false;
697
 
 
698
 
  return _write_fpga_reg(slot_id_to_refclk_reg(to_slot(txrx, which_side)),
699
 
                         value);
700
 
}
701
 
 
702
 
bool
703
 
usrp_basic::common_write_atr_mask(txrx_t txrx, int which_side, int value)
704
 
{
705
 
  if (! (0 <= which_side && which_side <= 1))
706
 
    return false;
707
 
 
708
 
  return _write_fpga_reg(slot_id_to_atr_mask_reg(to_slot(txrx, which_side)),
709
 
                         value);
710
 
}
711
 
 
712
 
bool
713
 
usrp_basic::common_write_atr_txval(txrx_t txrx, int which_side, int value)
714
 
{
715
 
  if (! (0 <= which_side && which_side <= 1))
716
 
    return false;
717
 
 
718
 
  return _write_fpga_reg(slot_id_to_atr_txval_reg(to_slot(txrx, which_side)),
719
 
                         value);
720
 
}
721
 
 
722
 
bool
723
 
usrp_basic::common_write_atr_rxval(txrx_t txrx, int which_side, int value)
724
 
{
725
 
  if (! (0 <= which_side && which_side <= 1))
726
 
    return false;
727
 
 
728
 
  return _write_fpga_reg(slot_id_to_atr_rxval_reg(to_slot(txrx, which_side)),
729
 
                         value);
730
 
}
731
 
 
732
 
bool
733
 
usrp_basic::common_write_aux_dac(txrx_t txrx, int which_side, int which_dac, int value)
734
 
{
735
 
  return _write_aux_dac(to_slot(txrx, which_side), which_dac, value);
736
 
}
737
 
 
738
 
bool
739
 
usrp_basic::common_read_aux_adc(txrx_t txrx, int which_side, int which_adc, int *value)
740
 
{
741
 
  return _read_aux_adc(to_slot(txrx, which_side), which_adc, value);
742
 
}
743
 
 
744
 
int
745
 
usrp_basic::common_read_aux_adc(txrx_t txrx, int which_side, int which_adc)
746
 
{
747
 
  return _read_aux_adc(to_slot(txrx, which_side), which_adc);
748
 
}
749
 
 
750
 
 
751
 
////////////////////////////////////////////////////////////////
752
 
//
753
 
//                         usrp_basic_rx
754
 
//
755
 
////////////////////////////////////////////////////////////////
756
 
 
757
 
static unsigned char rx_init_regs[] = {
758
 
  REG_RX_PWR_DN,        0,
759
 
  REG_RX_A,             0,      // minimum gain = 0x00 (max gain = 0x14)
760
 
  REG_RX_B,             0,      // minimum gain = 0x00 (max gain = 0x14)
761
 
  REG_RX_MISC,          (RX_MISC_HS_DUTY_CYCLE | RX_MISC_CLK_DUTY),
762
 
  REG_RX_IF,            (RX_IF_USE_CLKOUT1
763
 
                         | RX_IF_2S_COMP),
764
 
  REG_RX_DIGITAL,       (RX_DIGITAL_2_CHAN)
765
 
};
766
 
 
767
 
 
768
 
usrp_basic_rx::usrp_basic_rx (int which_board, int fusb_block_size, int fusb_nblocks,
769
 
                              const std::string fpga_filename,
770
 
                              const std::string firmware_filename
771
 
                              )
772
 
  : usrp_basic (which_board, open_rx_interface, fpga_filename, firmware_filename),
773
 
    d_devhandle (0), d_ephandle (0),
774
 
    d_bytes_seen (0), d_first_read (true),
775
 
    d_rx_enable (false)
776
 
{
777
 
  // initialize rx specific registers
778
 
 
779
 
  if (!usrp_9862_write_many_all (d_udh, rx_init_regs, sizeof (rx_init_regs))){
780
 
    fprintf (stderr, "usrp_basic_rx: failed to init AD9862 RX regs\n");
781
 
    throw std::runtime_error ("usrp_basic_rx/init_9862");
782
 
  }
783
 
 
784
 
  if (0){
785
 
    // FIXME power down 2nd codec rx path
786
 
    usrp_9862_write (d_udh, 1, REG_RX_PWR_DN, 0x1);     // power down everything
787
 
  }
788
 
 
789
 
  // Reset the rx path and leave it disabled.
790
 
  set_rx_enable (false);
791
 
  usrp_set_fpga_rx_reset (d_udh, true);
792
 
  usrp_set_fpga_rx_reset (d_udh, false);
793
 
 
794
 
  set_fpga_rx_sample_rate_divisor (2);  // usually correct
795
 
 
796
 
  set_dc_offset_cl_enable(0xf, 0xf);    // enable DC offset removal control loops
797
 
 
798
 
  probe_rx_slots (false);
799
 
 
800
 
  //d_db[0] = instantiate_dbs(d_dbid[0], this, 0);
801
 
  //d_db[1] = instantiate_dbs(d_dbid[1], this, 1);
802
 
 
803
 
  // check fusb buffering parameters
804
 
 
805
 
  if (fusb_block_size < 0 || fusb_block_size > FUSB_BLOCK_SIZE)
806
 
    throw std::out_of_range ("usrp_basic_rx: invalid fusb_block_size");
807
 
 
808
 
  if (fusb_nblocks < 0)
809
 
    throw std::out_of_range ("usrp_basic_rx: invalid fusb_nblocks");
810
 
  
811
 
  if (fusb_block_size == 0)
812
 
    fusb_block_size = fusb_sysconfig::default_block_size();
813
 
 
814
 
  if (fusb_nblocks == 0)
815
 
    fusb_nblocks = std::max (1, FUSB_BUFFER_SIZE / fusb_block_size);
816
 
 
817
 
  d_devhandle = fusb_sysconfig::make_devhandle (d_udh);
818
 
  d_ephandle = d_devhandle->make_ephandle (USRP_RX_ENDPOINT, true,
819
 
                                           fusb_block_size, fusb_nblocks);
820
 
 
821
 
  write_atr_mask(0, 0);         // zero Rx A Auto Transmit/Receive regs
822
 
  write_atr_txval(0, 0);
823
 
  write_atr_rxval(0, 0);
824
 
  write_atr_mask(1, 0);         // zero Rx B Auto Transmit/Receive regs
825
 
  write_atr_txval(1, 0);
826
 
  write_atr_rxval(1, 0);
827
 
}
828
 
 
829
 
static unsigned char rx_fini_regs[] = {
830
 
  REG_RX_PWR_DN,        0x1                             // power down everything
831
 
};
832
 
 
833
 
usrp_basic_rx::~usrp_basic_rx ()
834
 
{
835
 
  if (!set_rx_enable (false)){
836
 
    fprintf (stderr, "usrp_basic_rx: set_fpga_rx_enable failed\n");
837
 
    usb_strerror ();
838
 
  }
839
 
 
840
 
  d_ephandle->stop ();
841
 
  delete d_ephandle;
842
 
  delete d_devhandle;
843
 
 
844
 
  if (!usrp_9862_write_many_all (d_udh, rx_fini_regs, sizeof (rx_fini_regs))){
845
 
    fprintf (stderr, "usrp_basic_rx: failed to fini AD9862 RX regs\n");
846
 
  }
847
 
 
848
 
  shutdown_daughterboards();
849
 
}
850
 
 
851
 
 
852
 
bool
853
 
usrp_basic_rx::start ()
854
 
{
855
 
  if (!usrp_basic::start ())    // invoke parent's method
856
 
    return false;
857
 
 
858
 
  // fire off reads before asserting rx_enable
859
 
 
860
 
  if (!d_ephandle->start ()){
861
 
    fprintf (stderr, "usrp_basic_rx: failed to start end point streaming");
862
 
    usb_strerror ();
863
 
    return false;
864
 
  }
865
 
 
866
 
  if (!set_rx_enable (true)){
867
 
    fprintf (stderr, "usrp_basic_rx: set_rx_enable failed\n");
868
 
    usb_strerror ();
869
 
    return false;
870
 
  }
871
 
  
872
 
  return true;
873
 
}
874
 
 
875
 
bool
876
 
usrp_basic_rx::stop ()
877
 
{
878
 
  bool ok = usrp_basic::stop();
879
 
 
880
 
  if (!set_rx_enable(false)){
881
 
    fprintf (stderr, "usrp_basic_rx: set_rx_enable(false) failed\n");
882
 
    usb_strerror ();
883
 
    ok = false;
884
 
  }
885
 
 
886
 
  if (!d_ephandle->stop()){
887
 
    fprintf (stderr, "usrp_basic_rx: failed to stop end point streaming");
888
 
    usb_strerror ();
889
 
    ok = false;
890
 
  }
891
 
 
892
 
  return ok;
893
 
}
894
 
 
895
 
usrp_basic_rx *
896
 
usrp_basic_rx::make (int which_board, int fusb_block_size, int fusb_nblocks,
897
 
                     const std::string fpga_filename,
898
 
                     const std::string firmware_filename)
899
 
{
900
 
  usrp_basic_rx *u = 0;
901
 
  
902
 
  try {
903
 
    u = new usrp_basic_rx (which_board, fusb_block_size, fusb_nblocks,
904
 
                           fpga_filename, firmware_filename);
905
 
    return u;
906
 
  }
907
 
  catch (...){
908
 
    delete u;
909
 
    return 0;
910
 
  }
911
 
 
912
 
  return u;
913
 
}
914
 
 
915
 
bool
916
 
usrp_basic_rx::set_fpga_rx_sample_rate_divisor (unsigned int div)
917
 
{
918
 
  return _write_fpga_reg (FR_RX_SAMPLE_RATE_DIV, div - 1);
919
 
}
920
 
 
921
 
 
922
 
/*
923
 
 * \brief read data from the D/A's via the FPGA.
924
 
 * \p len must be a multiple of 512 bytes.
925
 
 *
926
 
 * \returns the number of bytes read, or -1 on error.
927
 
 *
928
 
 * If overrun is non-NULL it will be set true iff an RX overrun is detected.
929
 
 */
930
 
int
931
 
usrp_basic_rx::read (void *buf, int len, bool *overrun)
932
 
{
933
 
  int   r;
934
 
  
935
 
  if (overrun)
936
 
    *overrun = false;
937
 
  
938
 
  if (len < 0 || (len % 512) != 0){
939
 
    fprintf (stderr, "usrp_basic_rx::read: invalid length = %d\n", len);
940
 
    return -1;
941
 
  }
942
 
 
943
 
  r = d_ephandle->read (buf, len);
944
 
  if (r > 0)
945
 
    d_bytes_seen += r;
946
 
 
947
 
  /*
948
 
   * In many cases, the FPGA reports an rx overrun right after we
949
 
   * enable the Rx path.  If this is our first read, check for the
950
 
   * overrun to clear the condition, then ignore the result.
951
 
   */
952
 
  if (0 && d_first_read){       // FIXME
953
 
    d_first_read = false;
954
 
    bool bogus_overrun;
955
 
    usrp_check_rx_overrun (d_udh, &bogus_overrun);
956
 
  }
957
 
 
958
 
  if (overrun != 0 && d_bytes_seen >= d_bytes_per_poll){
959
 
    d_bytes_seen = 0;
960
 
    if (!usrp_check_rx_overrun (d_udh, overrun)){
961
 
      fprintf (stderr, "usrp_basic_rx: usrp_check_rx_overrun failed\n");
962
 
      usb_strerror ();
963
 
    }
964
 
  }
965
 
    
966
 
  return r;
967
 
}
968
 
 
969
 
bool
970
 
usrp_basic_rx::set_rx_enable (bool on)
971
 
{
972
 
  d_rx_enable = on;
973
 
  return usrp_set_fpga_rx_enable (d_udh, on);
974
 
}
975
 
 
976
 
// conditional disable, return prev state
977
 
bool
978
 
usrp_basic_rx::disable_rx ()
979
 
{
980
 
  bool enabled = rx_enable ();
981
 
  if (enabled)
982
 
    set_rx_enable (false);
983
 
  return enabled;
984
 
}
985
 
 
986
 
// conditional set
987
 
void
988
 
usrp_basic_rx::restore_rx (bool on)
989
 
{
990
 
  if (on != rx_enable ())
991
 
    set_rx_enable (on);
992
 
}
993
 
 
994
 
void
995
 
usrp_basic_rx::probe_rx_slots (bool verbose)
996
 
{
997
 
  struct usrp_dboard_eeprom     eeprom;
998
 
  static int slot_id_map[2] = { SLOT_RX_A, SLOT_RX_B };
999
 
  static const char *slot_name[2] = { "RX d'board A", "RX d'board B" };
1000
 
 
1001
 
  for (int i = 0; i < 2; i++){
1002
 
    int slot_id = slot_id_map [i];
1003
 
    const char *msg = 0;
1004
 
    usrp_dbeeprom_status_t s = usrp_read_dboard_eeprom (d_udh, slot_id, &eeprom);
1005
 
 
1006
 
    switch (s){
1007
 
    case UDBE_OK:
1008
 
      d_dbid[i] = eeprom.id;
1009
 
      msg = usrp_dbid_to_string (eeprom.id).c_str ();
1010
 
      set_adc_offset (2*i+0, eeprom.offset[0]);
1011
 
      set_adc_offset (2*i+1, eeprom.offset[1]);
1012
 
      _write_fpga_reg (slot_id_to_oe_reg(slot_id), (0xffff << 16) | eeprom.oe);
1013
 
      _write_fpga_reg (slot_id_to_io_reg(slot_id), (0xffff << 16) | 0x0000);
1014
 
      break;
1015
 
      
1016
 
    case UDBE_NO_EEPROM:
1017
 
      d_dbid[i] = -1;
1018
 
      msg = "<none>";
1019
 
      _write_fpga_reg (slot_id_to_oe_reg(slot_id), (0xffff << 16) | 0x0000);
1020
 
      _write_fpga_reg (slot_id_to_io_reg(slot_id), (0xffff << 16) | 0x0000);
1021
 
      break;
1022
 
      
1023
 
    case UDBE_INVALID_EEPROM:
1024
 
      d_dbid[i] = -2;
1025
 
      msg = "Invalid EEPROM contents";
1026
 
      _write_fpga_reg (slot_id_to_oe_reg(slot_id), (0xffff << 16) | 0x0000);
1027
 
      _write_fpga_reg (slot_id_to_io_reg(slot_id), (0xffff << 16) | 0x0000);
1028
 
      break;
1029
 
      
1030
 
    case UDBE_BAD_SLOT:
1031
 
    default:
1032
 
      assert (0);
1033
 
    }
1034
 
 
1035
 
    if (verbose){
1036
 
      fflush (stdout);
1037
 
      fprintf (stderr, "%s: %s\n", slot_name[i], msg);
1038
 
    }
1039
 
  }
1040
 
}
1041
 
 
1042
 
bool
1043
 
usrp_basic_rx::set_pga (int which_amp, double gain)
1044
 
{
1045
 
  return common_set_pga(C_RX, which_amp, gain);
1046
 
}
1047
 
 
1048
 
double
1049
 
usrp_basic_rx::pga(int which_amp) const
1050
 
{
1051
 
  return common_pga(C_RX, which_amp);
1052
 
}
1053
 
 
1054
 
double
1055
 
usrp_basic_rx::pga_min() const
1056
 
{
1057
 
  return common_pga_min(C_RX);
1058
 
}
1059
 
 
1060
 
double
1061
 
usrp_basic_rx::pga_max() const
1062
 
{
1063
 
  return common_pga_max(C_RX);
1064
 
}
1065
 
 
1066
 
double
1067
 
usrp_basic_rx::pga_db_per_step() const
1068
 
{
1069
 
  return common_pga_db_per_step(C_RX);
1070
 
}
1071
 
 
1072
 
bool
1073
 
usrp_basic_rx::_write_oe (int which_side, int value, int mask)
1074
 
{
1075
 
  return _common_write_oe(C_RX, which_side, value, mask);
1076
 
}
1077
 
 
1078
 
bool
1079
 
usrp_basic_rx::write_io (int which_side, int value, int mask)
1080
 
{
1081
 
  return common_write_io(C_RX, which_side, value, mask);
1082
 
}
1083
 
 
1084
 
bool
1085
 
usrp_basic_rx::read_io (int which_side, int *value)
1086
 
{
1087
 
  return common_read_io(C_RX, which_side, value);
1088
 
}
1089
 
 
1090
 
int
1091
 
usrp_basic_rx::read_io (int which_side)
1092
 
{
1093
 
  return common_read_io(C_RX, which_side);
1094
 
}
1095
 
 
1096
 
bool
1097
 
usrp_basic_rx::write_refclk(int which_side, int value)
1098
 
{
1099
 
  return common_write_refclk(C_RX, which_side, value);
1100
 
}
1101
 
 
1102
 
bool
1103
 
usrp_basic_rx::write_atr_mask(int which_side, int value)
1104
 
{
1105
 
  return common_write_atr_mask(C_RX, which_side, value);
1106
 
}
1107
 
 
1108
 
bool
1109
 
usrp_basic_rx::write_atr_txval(int which_side, int value)
1110
 
{
1111
 
  return common_write_atr_txval(C_RX, which_side, value);
1112
 
}
1113
 
 
1114
 
bool
1115
 
usrp_basic_rx::write_atr_rxval(int which_side, int value)
1116
 
{
1117
 
  return common_write_atr_rxval(C_RX, which_side, value);
1118
 
}
1119
 
 
1120
 
bool
1121
 
usrp_basic_rx::write_aux_dac (int which_side, int which_dac, int value)
1122
 
{
1123
 
  return common_write_aux_dac(C_RX, which_side, which_dac, value);
1124
 
}
1125
 
 
1126
 
bool
1127
 
usrp_basic_rx::read_aux_adc (int which_side, int which_adc, int *value)
1128
 
{
1129
 
  return common_read_aux_adc(C_RX, which_side, which_adc, value);
1130
 
}
1131
 
 
1132
 
int
1133
 
usrp_basic_rx::read_aux_adc (int which_side, int which_adc)
1134
 
{
1135
 
  return common_read_aux_adc(C_RX, which_side, which_adc);
1136
 
}
1137
 
 
1138
 
int
1139
 
usrp_basic_rx::block_size () const { return d_ephandle->block_size(); }
1140
 
 
1141
 
////////////////////////////////////////////////////////////////
1142
 
//
1143
 
//                         usrp_basic_tx
1144
 
//
1145
 
////////////////////////////////////////////////////////////////
1146
 
 
1147
 
 
1148
 
//
1149
 
// DAC input rate 64 MHz interleaved for a total input rate of 128 MHz
1150
 
// DAC input is latched on rising edge of CLKOUT2
1151
 
// NCO is disabled
1152
 
// interpolate 2x
1153
 
// coarse modulator disabled
1154
 
//
1155
 
 
1156
 
static unsigned char tx_init_regs[] = {
1157
 
  REG_TX_PWR_DN,        0,
1158
 
  REG_TX_A_OFFSET_LO,   0,
1159
 
  REG_TX_A_OFFSET_HI,   0,
1160
 
  REG_TX_B_OFFSET_LO,   0,
1161
 
  REG_TX_B_OFFSET_HI,   0,
1162
 
  REG_TX_A_GAIN,        (TX_X_GAIN_COARSE_FULL | 0),
1163
 
  REG_TX_B_GAIN,        (TX_X_GAIN_COARSE_FULL | 0),
1164
 
  REG_TX_PGA,           0xff,                   // maximum gain (0 dB)
1165
 
  REG_TX_MISC,          0,
1166
 
  REG_TX_IF,            (TX_IF_USE_CLKOUT1
1167
 
                         | TX_IF_I_FIRST
1168
 
                         | TX_IF_INV_TX_SYNC
1169
 
                         | TX_IF_2S_COMP
1170
 
                         | TX_IF_INTERLEAVED),
1171
 
  REG_TX_DIGITAL,       (TX_DIGITAL_2_DATA_PATHS
1172
 
                         | TX_DIGITAL_INTERPOLATE_4X),
1173
 
  REG_TX_MODULATOR,     (TX_MODULATOR_DISABLE_NCO
1174
 
                         | TX_MODULATOR_COARSE_MODULATION_NONE),
1175
 
  REG_TX_NCO_FTW_7_0,   0,
1176
 
  REG_TX_NCO_FTW_15_8,  0,
1177
 
  REG_TX_NCO_FTW_23_16, 0
1178
 
};
1179
 
 
1180
 
usrp_basic_tx::usrp_basic_tx (int which_board, int fusb_block_size, int fusb_nblocks,
1181
 
                              const std::string fpga_filename,
1182
 
                              const std::string firmware_filename)
1183
 
  : usrp_basic (which_board, open_tx_interface, fpga_filename, firmware_filename),
1184
 
    d_devhandle (0), d_ephandle (0),
1185
 
    d_bytes_seen (0), d_first_write (true),
1186
 
    d_tx_enable (false)
1187
 
{
1188
 
  if (!usrp_9862_write_many_all (d_udh, tx_init_regs, sizeof (tx_init_regs))){
1189
 
    fprintf (stderr, "usrp_basic_tx: failed to init AD9862 TX regs\n");
1190
 
    throw std::runtime_error ("usrp_basic_tx/init_9862");
1191
 
  }
1192
 
 
1193
 
  if (0){
1194
 
    // FIXME power down 2nd codec tx path
1195
 
    usrp_9862_write (d_udh, 1, REG_TX_PWR_DN,
1196
 
                     (TX_PWR_DN_TX_DIGITAL
1197
 
                      | TX_PWR_DN_TX_ANALOG_BOTH));
1198
 
  }
1199
 
 
1200
 
  // Reset the tx path and leave it disabled.
1201
 
  set_tx_enable (false);
1202
 
  usrp_set_fpga_tx_reset (d_udh, true);
1203
 
  usrp_set_fpga_tx_reset (d_udh, false);
1204
 
 
1205
 
  set_fpga_tx_sample_rate_divisor (4);  // we're using interp x4
1206
 
 
1207
 
  probe_tx_slots (false);
1208
 
 
1209
 
  //d_db[0] = instantiate_dbs(d_dbid[0], this, 0);
1210
 
  //d_db[1] = instantiate_dbs(d_dbid[1], this, 1);
1211
 
 
1212
 
  // check fusb buffering parameters
1213
 
 
1214
 
  if (fusb_block_size < 0 || fusb_block_size > FUSB_BLOCK_SIZE)
1215
 
    throw std::out_of_range ("usrp_basic_rx: invalid fusb_block_size");
1216
 
 
1217
 
  if (fusb_nblocks < 0)
1218
 
    throw std::out_of_range ("usrp_basic_rx: invalid fusb_nblocks");
1219
 
  
1220
 
  if (fusb_block_size == 0)
1221
 
    fusb_block_size = FUSB_BLOCK_SIZE;
1222
 
 
1223
 
  if (fusb_nblocks == 0)
1224
 
    fusb_nblocks = std::max (1, FUSB_BUFFER_SIZE / fusb_block_size);
1225
 
 
1226
 
  d_devhandle = fusb_sysconfig::make_devhandle (d_udh);
1227
 
  d_ephandle = d_devhandle->make_ephandle (USRP_TX_ENDPOINT, false,
1228
 
                                           fusb_block_size, fusb_nblocks);
1229
 
 
1230
 
  write_atr_mask(0, 0);         // zero Tx A Auto Transmit/Receive regs
1231
 
  write_atr_txval(0, 0);
1232
 
  write_atr_rxval(0, 0);
1233
 
  write_atr_mask(1, 0);         // zero Tx B Auto Transmit/Receive regs
1234
 
  write_atr_txval(1, 0);
1235
 
  write_atr_rxval(1, 0);
1236
 
}
1237
 
 
1238
 
 
1239
 
static unsigned char tx_fini_regs[] = {
1240
 
  REG_TX_PWR_DN,        (TX_PWR_DN_TX_DIGITAL
1241
 
                         | TX_PWR_DN_TX_ANALOG_BOTH),
1242
 
  REG_TX_MODULATOR,     (TX_MODULATOR_DISABLE_NCO
1243
 
                         | TX_MODULATOR_COARSE_MODULATION_NONE)
1244
 
};
1245
 
 
1246
 
usrp_basic_tx::~usrp_basic_tx ()
1247
 
{
1248
 
  d_ephandle->stop ();
1249
 
  delete d_ephandle;
1250
 
  delete d_devhandle;
1251
 
 
1252
 
  if (!usrp_9862_write_many_all (d_udh, tx_fini_regs, sizeof (tx_fini_regs))){
1253
 
    fprintf (stderr, "usrp_basic_tx: failed to fini AD9862 TX regs\n");
1254
 
  }
1255
 
 
1256
 
  shutdown_daughterboards();
1257
 
}
1258
 
 
1259
 
bool
1260
 
usrp_basic_tx::start ()
1261
 
{
1262
 
  if (!usrp_basic::start ())
1263
 
    return false;
1264
 
 
1265
 
  if (!set_tx_enable (true)){
1266
 
    fprintf (stderr, "usrp_basic_tx: set_tx_enable failed\n");
1267
 
    usb_strerror ();
1268
 
    return false;
1269
 
  }
1270
 
  
1271
 
  if (!d_ephandle->start ()){
1272
 
    fprintf (stderr, "usrp_basic_tx: failed to start end point streaming");
1273
 
    usb_strerror ();
1274
 
    return false;
1275
 
  }
1276
 
 
1277
 
  return true;
1278
 
}
1279
 
 
1280
 
bool
1281
 
usrp_basic_tx::stop ()
1282
 
{
1283
 
  bool ok = usrp_basic::stop ();
1284
 
 
1285
 
  if (!d_ephandle->stop ()){
1286
 
    fprintf (stderr, "usrp_basic_tx: failed to stop end point streaming");
1287
 
    usb_strerror ();
1288
 
    ok = false;
1289
 
  }
1290
 
 
1291
 
  if (!set_tx_enable (false)){
1292
 
    fprintf (stderr, "usrp_basic_tx: set_tx_enable(false) failed\n");
1293
 
    usb_strerror ();
1294
 
    ok = false;
1295
 
  }
1296
 
 
1297
 
  return ok;
1298
 
}
1299
 
 
1300
 
usrp_basic_tx *
1301
 
usrp_basic_tx::make (int which_board, int fusb_block_size, int fusb_nblocks,
1302
 
                     const std::string fpga_filename,
1303
 
                     const std::string firmware_filename)
1304
 
{
1305
 
  usrp_basic_tx *u = 0;
1306
 
  
1307
 
  try {
1308
 
    u = new usrp_basic_tx (which_board, fusb_block_size, fusb_nblocks,
1309
 
                           fpga_filename, firmware_filename);
1310
 
    return u;
1311
 
  }
1312
 
  catch (...){
1313
 
    delete u;
1314
 
    return 0;
1315
 
  }
1316
 
 
1317
 
  return u;
1318
 
}
1319
 
 
1320
 
bool
1321
 
usrp_basic_tx::set_fpga_tx_sample_rate_divisor (unsigned int div)
1322
 
{
1323
 
  return _write_fpga_reg (FR_TX_SAMPLE_RATE_DIV, div - 1);
1324
 
}
1325
 
 
1326
 
/*!
1327
 
 * \brief Write data to the A/D's via the FPGA.
1328
 
 *
1329
 
 * \p len must be a multiple of 512 bytes.
1330
 
 * \returns number of bytes written or -1 on error.
1331
 
 *
1332
 
 * if \p underrun is non-NULL, it will be set to true iff
1333
 
 * a transmit underrun condition is detected.
1334
 
 */
1335
 
int
1336
 
usrp_basic_tx::write (const void *buf, int len, bool *underrun)
1337
 
{
1338
 
  int   r;
1339
 
  
1340
 
  if (underrun)
1341
 
    *underrun = false;
1342
 
  
1343
 
  if (len < 0 || (len % 512) != 0){
1344
 
    fprintf (stderr, "usrp_basic_tx::write: invalid length = %d\n", len);
1345
 
    return -1;
1346
 
  }
1347
 
 
1348
 
  r = d_ephandle->write (buf, len);
1349
 
  if (r > 0)
1350
 
    d_bytes_seen += r;
1351
 
    
1352
 
  /*
1353
 
   * In many cases, the FPGA reports an tx underrun right after we
1354
 
   * enable the Tx path.  If this is our first write, check for the
1355
 
   * underrun to clear the condition, then ignore the result.
1356
 
   */
1357
 
  if (d_first_write && d_bytes_seen >= 4 * FUSB_BLOCK_SIZE){
1358
 
    d_first_write = false;
1359
 
    bool bogus_underrun;
1360
 
    usrp_check_tx_underrun (d_udh, &bogus_underrun);
1361
 
  }
1362
 
 
1363
 
  if (underrun != 0 && d_bytes_seen >= d_bytes_per_poll){
1364
 
    d_bytes_seen = 0;
1365
 
    if (!usrp_check_tx_underrun (d_udh, underrun)){
1366
 
      fprintf (stderr, "usrp_basic_tx: usrp_check_tx_underrun failed\n");
1367
 
      usb_strerror ();
1368
 
    }
1369
 
  }
1370
 
 
1371
 
  return r;
1372
 
}
1373
 
 
1374
 
void
1375
 
usrp_basic_tx::wait_for_completion ()
1376
 
{
1377
 
  d_ephandle->wait_for_completion ();
1378
 
}
1379
 
 
1380
 
bool
1381
 
usrp_basic_tx::set_tx_enable (bool on)
1382
 
{
1383
 
  d_tx_enable = on;
1384
 
  // fprintf (stderr, "set_tx_enable %d\n", on);
1385
 
  return usrp_set_fpga_tx_enable (d_udh, on);
1386
 
}
1387
 
 
1388
 
// conditional disable, return prev state
1389
 
bool
1390
 
usrp_basic_tx::disable_tx ()
1391
 
{
1392
 
  bool enabled = tx_enable ();
1393
 
  if (enabled)
1394
 
    set_tx_enable (false);
1395
 
  return enabled;
1396
 
}
1397
 
 
1398
 
// conditional set
1399
 
void
1400
 
usrp_basic_tx::restore_tx (bool on)
1401
 
{
1402
 
  if (on != tx_enable ())
1403
 
    set_tx_enable (on);
1404
 
}
1405
 
 
1406
 
void
1407
 
usrp_basic_tx::probe_tx_slots (bool verbose)
1408
 
{
1409
 
  struct usrp_dboard_eeprom     eeprom;
1410
 
  static int slot_id_map[2] = { SLOT_TX_A, SLOT_TX_B };
1411
 
  static const char *slot_name[2] = { "TX d'board A", "TX d'board B" };
1412
 
 
1413
 
  for (int i = 0; i < 2; i++){
1414
 
    int slot_id = slot_id_map [i];
1415
 
    const char *msg = 0;
1416
 
    usrp_dbeeprom_status_t s = usrp_read_dboard_eeprom (d_udh, slot_id, &eeprom);
1417
 
 
1418
 
    switch (s){
1419
 
    case UDBE_OK:
1420
 
      d_dbid[i] = eeprom.id;
1421
 
      msg = usrp_dbid_to_string (eeprom.id).c_str ();
1422
 
      // FIXME, figure out interpretation of dc offset for TX d'boards
1423
 
      // offset = (eeprom.offset[1] << 16) | (eeprom.offset[0] & 0xffff);
1424
 
      _write_fpga_reg (slot_id_to_oe_reg(slot_id), (0xffff << 16) | eeprom.oe);
1425
 
      _write_fpga_reg (slot_id_to_io_reg(slot_id), (0xffff << 16) | 0x0000);
1426
 
      break;
1427
 
      
1428
 
    case UDBE_NO_EEPROM:
1429
 
      d_dbid[i] = -1;
1430
 
      msg = "<none>";
1431
 
      _write_fpga_reg (slot_id_to_oe_reg(slot_id), (0xffff << 16) | 0x0000);
1432
 
      _write_fpga_reg (slot_id_to_io_reg(slot_id), (0xffff << 16) | 0x0000);
1433
 
      break;
1434
 
      
1435
 
    case UDBE_INVALID_EEPROM:
1436
 
      d_dbid[i] = -2;
1437
 
      msg = "Invalid EEPROM contents";
1438
 
      _write_fpga_reg (slot_id_to_oe_reg(slot_id), (0xffff << 16) | 0x0000);
1439
 
      _write_fpga_reg (slot_id_to_io_reg(slot_id), (0xffff << 16) | 0x0000);
1440
 
      break;
1441
 
      
1442
 
    case UDBE_BAD_SLOT:
1443
 
    default:
1444
 
      assert (0);
1445
 
    }
1446
 
 
1447
 
    if (verbose){
1448
 
      fflush (stdout);
1449
 
      fprintf (stderr, "%s: %s\n", slot_name[i], msg);
1450
 
    }
1451
 
  }
1452
 
}
1453
 
 
1454
 
bool
1455
 
usrp_basic_tx::set_pga (int which_amp, double gain)
1456
 
{
1457
 
  return common_set_pga(C_TX, which_amp, gain);
1458
 
}
1459
 
 
1460
 
double
1461
 
usrp_basic_tx::pga (int which_amp) const
1462
 
{
1463
 
  return common_pga(C_TX, which_amp);
1464
 
}
1465
 
 
1466
 
double
1467
 
usrp_basic_tx::pga_min() const
1468
 
{
1469
 
  return common_pga_min(C_TX);
1470
 
}
1471
 
 
1472
 
double
1473
 
usrp_basic_tx::pga_max() const
1474
 
{
1475
 
  return common_pga_max(C_TX);
1476
 
}
1477
 
 
1478
 
double
1479
 
usrp_basic_tx::pga_db_per_step() const
1480
 
{
1481
 
  return common_pga_db_per_step(C_TX);
1482
 
}
1483
 
 
1484
 
bool
1485
 
usrp_basic_tx::_write_oe (int which_side, int value, int mask)
1486
 
{
1487
 
  return _common_write_oe(C_TX, which_side, value, mask);
1488
 
}
1489
 
 
1490
 
bool
1491
 
usrp_basic_tx::write_io (int which_side, int value, int mask)
1492
 
{
1493
 
  return common_write_io(C_TX, which_side, value, mask);
1494
 
}
1495
 
 
1496
 
bool
1497
 
usrp_basic_tx::read_io (int which_side, int *value)
1498
 
{
1499
 
  return common_read_io(C_TX, which_side, value);
1500
 
}
1501
 
 
1502
 
int
1503
 
usrp_basic_tx::read_io (int which_side)
1504
 
{
1505
 
  return common_read_io(C_TX, which_side);
1506
 
}
1507
 
 
1508
 
bool
1509
 
usrp_basic_tx::write_refclk(int which_side, int value)
1510
 
{
1511
 
  return common_write_refclk(C_TX, which_side, value);
1512
 
}
1513
 
 
1514
 
bool
1515
 
usrp_basic_tx::write_atr_mask(int which_side, int value)
1516
 
{
1517
 
  return common_write_atr_mask(C_TX, which_side, value);
1518
 
}
1519
 
 
1520
 
bool
1521
 
usrp_basic_tx::write_atr_txval(int which_side, int value)
1522
 
{
1523
 
  return common_write_atr_txval(C_TX, which_side, value);
1524
 
}
1525
 
 
1526
 
bool
1527
 
usrp_basic_tx::write_atr_rxval(int which_side, int value)
1528
 
{
1529
 
  return common_write_atr_rxval(C_TX, which_side, value);
1530
 
}
1531
 
 
1532
 
bool
1533
 
usrp_basic_tx::write_aux_dac (int which_side, int which_dac, int value)
1534
 
{
1535
 
  return common_write_aux_dac(C_TX, which_side, which_dac, value);
1536
 
}
1537
 
 
1538
 
bool
1539
 
usrp_basic_tx::read_aux_adc (int which_side, int which_adc, int *value)
1540
 
{
1541
 
  return common_read_aux_adc(C_TX, which_side, which_adc, value);
1542
 
}
1543
 
 
1544
 
int
1545
 
usrp_basic_tx::read_aux_adc (int which_side, int which_adc)
1546
 
{
1547
 
  return common_read_aux_adc(C_TX, which_side, which_adc);
1548
 
}
1549
 
 
1550
 
int
1551
 
usrp_basic_tx::block_size () const { return d_ephandle->block_size(); }
1552