diff options
Diffstat (limited to 'usrp/host/lib/db_wbxng.cc')
-rw-r--r-- | usrp/host/lib/db_wbxng.cc | 227 |
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); -} -*/ - |