summaryrefslogtreecommitdiff
path: root/usrp/host/lib/db_wbxng.cc
diff options
context:
space:
mode:
Diffstat (limited to 'usrp/host/lib/db_wbxng.cc')
-rw-r--r--usrp/host/lib/db_wbxng.cc227
1 files changed, 29 insertions, 198 deletions
diff --git a/usrp/host/lib/db_wbxng.cc b/usrp/host/lib/db_wbxng.cc
index 0dd8b0d38..c23fc47ed 100644
--- a/usrp/host/lib/db_wbxng.cc
+++ b/usrp/host/lib/db_wbxng.cc
@@ -1,25 +1,25 @@
//
-// Copyright 2008 Free Software Foundation, Inc.
-//
+// Copyright 2008,2009 Free Software Foundation, Inc.
+//
// This file is part of GNU Radio
-//
+//
// GNU Radio is free software; you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation; either asversion 3, or (at your option)
// any later version.
-//
+//
// GNU Radio is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
-//
+//
// You should have received a copy of the GNU General Public License
// along with GNU Radio; see the file COPYING. If not, write to
// the Free Software Foundation, Inc., 51 Franklin Street,
// Boston, MA 02110-1301, USA.
#include <usrp/db_wbxng.h>
-#include <usrp/db_wbxng_adf4350.h>
+#include "db_wbxng_adf4350.h"
#include <db_base_impl.h>
#include <stdio.h>
@@ -61,143 +61,8 @@ wbxng_base::wbxng_base(usrp_basic_sptr _usrp, int which, int _power_on)
wbxng_base::~wbxng_base()
{
- delete d_common;
-}
-
-void
-wbxng_base::_write_all(int R, int control, int N)
-{
- /*
- Write R counter latch, control latch and N counter latch to VCO.
-
- Adds 10ms delay between writing control and N if this is first call.
- This is the required power-up sequence.
-
- @param R: 24-bit R counter latch
- @type R: int
- @param control: 24-bit control latch
- @type control: int
- @param N: 24-bit N counter latch
- @type N: int
- */
- timespec t;
- t.tv_sec = 0;
- t.tv_nsec = 10000000;
-
- /*
- _write_R(R);
- _write_control(control);
- if(d_first) {
- //time.sleep(0.010);
- nanosleep(&t, NULL);
- d_first = false;
- }
- _write_N(N);
- */
-}
-
-void
-wbxng_base::_write_control(int control)
-{
- //_write_it((control & ~0x3) | 0);
-}
-
-void
-wbxng_base::_write_R(int R)
-{
- //_write_it((R & ~0x3) | 1);
-}
-
-void
-wbxng_base::_write_N(int N)
-{
- //_write_it((N & ~0x3) | 2);
-}
-
-void
-wbxng_base::_write_it(int v)
-{
- char s[3];
- s[0] = (char)((v >> 16) & 0xff);
- s[1] = (char)((v >> 8) & 0xff);
- s[2] = (char)(v & 0xff);
- std::string str(s, 3);
- //usrp()->_write_spi(0, d_spi_enable, d_spi_format, str);
-}
-
-bool
-wbxng_base::_lock_detect()
-{
- /*
- @returns: the value of the VCO/PLL lock detect bit.
- @rtype: 0 or 1
- */
-
- if(d_common->_get_locked()){
- return true;
- }
- else { // Give it a second chance
- return false;
- /*
- // FIXME: make portable sleep
- timespec t;
- t.tv_sec = 0;
- t.tv_nsec = 100000000;
- nanosleep(&t, NULL);
-
- if(usrp()->read_io(d_which) & PLL_LOCK_DETECT) {
- return true;
- }
- else {
- return false;
- }
- */
- }
-
- throw std::runtime_error("_lock_detect called from wbxng_base\n");
-}
-
-/*
-bool
-wbxng_base::_compute_regs(double freq, int &retR, int &retcontrol,
- int &retN, double &retfreq)
-{
- **COMMENT**
- Determine values of R, control, and N registers, along with actual freq.
-
- @param freq: target frequency in Hz
- @type freq: float
- @returns: (R, control, N, actual_freq)
- @rtype: tuple(int, int, int, float)
-
- Override this in derived classes.
- **COMMENT**
-
- //raise NotImplementedError;
- throw std::runtime_error("_compute_regs called from wbxng_base\n");
-}
-*/
-
-int
-wbxng_base::_compute_control_reg()
-{
- throw std::runtime_error("_compute_control_reg called from wbxng_base\n");
- //return d_common->_compute_control_reg();
-}
-
-int
-wbxng_base::_refclk_divisor()
-{
- throw std::runtime_error("_refclk_divisor called from wbxng_base\n");
- //return d_common->_refclk_divisor();
-}
-
-double
-wbxng_base::_refclk_freq()
-{
- throw std::runtime_error("_refclk_divisor called from wbxng_base\n");
- // *** TODO *** Magic Number 64e6?
- //return 64e6/_refclk_divisor();
+ if (d_common)
+ delete d_common;
}
struct freq_result_t
@@ -220,27 +85,17 @@ wbxng_base::set_freq(double freq)
t.tv_nsec = 10000000;
nanosleep(&t, NULL);
- fprintf(stderr,"Setting WBXNG frequency, requested %d, obtained %f, lock_detect %d\n",
+ fprintf(stderr,"Setting WBXNG frequency, requested %d, obtained %f, lock_detect %d\n",
int_freq, freq_result, _lock_detect());
+ // FIXME
// Offsetting the LO helps get the Tx carrier leakage out of the way.
// This also ensures that on Rx, we're not getting hosed by the
// FPGA's DC removal loop's time constant. We were seeing a
// problem when running with discontinuous transmission.
// Offsetting the LO made the problem go away.
//freq += d_lo_offset;
-
- //int R, control, N;
- //double actual_freq;
- //_compute_regs(freq, R, control, N, actual_freq);
-
- //if(R==0) {
- // return args;
- //}
-
- //_write_all(R, control, N);
- //args.ok = _lock_detect();
- //args.baseband_freq = actual_freq;
+
return args;
}
@@ -263,7 +118,7 @@ wbxng_base::is_quadrature()
{
/*
Return True if this board requires both I & Q analog channels.
-
+
This bit of info is useful when setting up the USRP Rx mux register.
*/
return true;
@@ -290,7 +145,7 @@ wbxng_base_tx::wbxng_base_tx(usrp_basic_sptr _usrp, int which, int _power_on)
@param usrp: instance of usrp.sink_c
@param which: 0 or 1 corresponding to side TX_A or TX_B respectively.
*/
-
+
if(which == 0) {
d_spi_enable = SPI_ENABLE_TX_A;
}
@@ -299,11 +154,11 @@ wbxng_base_tx::wbxng_base_tx(usrp_basic_sptr _usrp, int which, int _power_on)
}
d_common = new adf4350(_usrp, d_which, d_spi_enable);
-
- // power up the transmit side, but don't enable the mixer
+
+ // FIXME: power up the transmit side, but don't enable the mixer
usrp()->_write_oe(d_which,(RX_TXN|TXMOD_EN|ENABLE_33|ENABLE_5), (RX_TXN|TXMOD_EN|ENABLE_33|ENABLE_5));
usrp()->write_io(d_which, (power_on()|RX_TXN|TXMOD_EN|ENABLE_33|ENABLE_5), (RX_TXN|TXMOD_EN|ENABLE_33|ENABLE_5));
- fprintf(stderr,"Setting WBXNG TXMOD on");
+ fprintf(stderr,"Setting WBXNG TXMOD on");
//set_lo_offset(4e6);
set_gain((gain_min() + gain_max()) / 2.0); // initialize gain
@@ -329,7 +184,7 @@ wbxng_base_tx::shutdown()
// Power down VCO/PLL
d_common->_enable(false);
-
+
/*
_write_control(_compute_control_reg());
*/
@@ -396,11 +251,11 @@ wbxng_base_tx::set_gain(float gain)
{
/*
Set the gain.
-
+
@param gain: gain in decibels
@returns True/False
*/
-
+
// clamp gain
gain = std::max(gain_min(), std::min(gain, gain_max()));
@@ -418,7 +273,7 @@ wbxng_base_tx::set_gain(float gain)
pga_gain = 0;
agc_gain = gain;
}
-
+
V_maxgain = 0.7;
V_mingain = 1.4;
V_fullscale = 3.3;
@@ -454,14 +309,14 @@ wbxng_base_rx::wbxng_base_rx(usrp_basic_sptr _usrp, int which, int _power_on)
usrp()->_write_oe(d_which, (RX2_RX1N|RXBB_EN|ATTN_MASK|ENABLE_33|ENABLE_5), (RX2_RX1N|RXBB_EN|ATTN_MASK|ENABLE_33|ENABLE_5));
usrp()->write_io(d_which, (power_on()|RX2_RX1N|RXBB_EN|ENABLE_33|ENABLE_5), (RX2_RX1N|RXBB_EN|ATTN_MASK|ENABLE_33|ENABLE_5));
- fprintf(stderr,"Setting WBXNG RXBB on");
-
+ fprintf(stderr,"Setting WBXNG RXBB on");
+
// set up for RX on TX/RX port
select_rx_antenna("TX/RX");
-
+
bypass_adc_buffers(true);
- /*
+ /*
set_lo_offset(-4e6);
*/
}
@@ -532,7 +387,6 @@ wbxng_base_rx::select_rx_antenna(int which_antenna)
}
else {
return false;
- // throw std::invalid_argument("which_antenna must be either 'TX/RX' or 'RX2'\n");
}
return true;
}
@@ -545,7 +399,7 @@ wbxng_base_rx::select_rx_antenna(const std::string &which_antenna)
@param which_antenna: either 'TX/RX' or 'RX2'
*/
-
+
if(which_antenna == "TX/RX") {
usrp()->write_io(d_which, 0, RX2_RX1N);
}
@@ -553,10 +407,9 @@ wbxng_base_rx::select_rx_antenna(const std::string &which_antenna)
usrp()->write_io(d_which, RX2_RX1N, RX2_RX1N);
}
else {
- // throw std::invalid_argument("which_antenna must be either 'TX/RX' or 'RX2'\n");
return false;
}
-
+
return true;
}
@@ -565,11 +418,11 @@ wbxng_base_rx::set_gain(float gain)
{
/*
Set the gain.
-
+
@param gain: gain in decibels
@returns True/False
*/
-
+
// clamp gain
gain = std::max(gain_min(), std::min(gain, gain_max()));
@@ -586,7 +439,7 @@ wbxng_base_rx::set_gain(float gain)
pga_gain = 0;
agc_gain = gain;
}
-
+
return _set_attn(maxgain-agc_gain) && _set_pga(int(pga_gain));
}
@@ -610,17 +463,6 @@ db_wbxng_tx::~db_wbxng_tx()
{
}
-/*
-bool
-db_wbxng_tx::_compute_regs(double freq, int &retR, int &retcontrol,
- int &retN, double &retfreq)
-{
- return d_common->_compute_regs(_refclk_freq(), freq, retR,
- retcontrol, retN, retfreq);
-}
-*/
-
-
db_wbxng_rx::db_wbxng_rx(usrp_basic_sptr usrp, int which)
: wbxng_base_rx(usrp, which)
{
@@ -655,14 +497,3 @@ db_wbxng_rx::i_and_q_swapped()
{
return false;
}
-
-/*
-bool
-db_wbxng_rx::_compute_regs(double freq, int &retR, int &retcontrol,
- int &retN, double &retfreq)
-{
- return d_common->_compute_regs(_refclk_freq(), freq, retR,
- retcontrol, retN, retfreq);
-}
-*/
-