aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authormichael-west <michael.west@ettus.com>2015-05-15 17:06:51 -0700
committerMartin Braun <martin.braun@ettus.com>2015-05-22 11:33:55 -0700
commitda7302cacbcdad59df01a7d7789db3c6fa9c6b24 (patch)
tree137b925f265572f59b4292cb4f2a26abf17dee1b
parentc9af74e569d0d61a008f5bf0257c860b2b473381 (diff)
downloaduhd-da7302cacbcdad59df01a7d7789db3c6fa9c6b24.tar.gz
uhd-da7302cacbcdad59df01a7d7789db3c6fa9c6b24.tar.bz2
uhd-da7302cacbcdad59df01a7d7789db3c6fa9c6b24.zip
B200/E300: Fix incorrect readback of frequency.
When the LO is tuned it changes the frequency on both channels. The frequency value read back for the first channel was not updated when the LO frequency for the other channel was tuned to a different value.
-rw-r--r--host/lib/usrp/b200/b200_impl.cpp1
-rw-r--r--host/lib/usrp/common/ad9361_ctrl.cpp9
-rw-r--r--host/lib/usrp/common/ad9361_ctrl.hpp3
-rw-r--r--host/lib/usrp/common/ad9361_driver/ad9361_device.cpp17
-rw-r--r--host/lib/usrp/common/ad9361_driver/ad9361_device.h3
-rw-r--r--host/lib/usrp/e300/e300_impl.cpp1
6 files changed, 31 insertions, 3 deletions
diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp
index bd07fcaee..bac904a31 100644
--- a/host/lib/usrp/b200/b200_impl.cpp
+++ b/host/lib/usrp/b200/b200_impl.cpp
@@ -684,6 +684,7 @@ void b200_impl::setup_radio(const size_t dspno)
_tree->create<meta_range_t>(rf_fe_path / "bandwidth" / "range")
.publish(boost::bind(&ad9361_ctrl::get_bw_filter_range, key));
_tree->create<double>(rf_fe_path / "freq" / "value")
+ .publish(boost::bind(&ad9361_ctrl::get_freq, _codec_ctrl, key))
.coerce(boost::bind(&ad9361_ctrl::tune, _codec_ctrl, key, _1))
.subscribe(boost::bind(&b200_impl::update_bandsel, this, key, _1))
.set(B200_DEFAULT_FREQ);
diff --git a/host/lib/usrp/common/ad9361_ctrl.cpp b/host/lib/usrp/common/ad9361_ctrl.cpp
index bedd2eb32..65e8e2df9 100644
--- a/host/lib/usrp/common/ad9361_ctrl.cpp
+++ b/host/lib/usrp/common/ad9361_ctrl.cpp
@@ -149,6 +149,15 @@ public:
return _device.tune(direction, value);
}
+ //! get the current frequency for the given frontend
+ double get_freq(const std::string &which)
+ {
+ boost::lock_guard<boost::mutex> lock(_mutex);
+
+ ad9361_device_t::direction_t direction = _get_direction_from_antenna(which);
+ return _device.get_freq(direction);
+ }
+
//! turn on/off data port loopback
void data_port_loopback(const bool on)
{
diff --git a/host/lib/usrp/common/ad9361_ctrl.hpp b/host/lib/usrp/common/ad9361_ctrl.hpp
index c5718302f..b7d7b8e26 100644
--- a/host/lib/usrp/common/ad9361_ctrl.hpp
+++ b/host/lib/usrp/common/ad9361_ctrl.hpp
@@ -95,6 +95,9 @@ public:
//! tune the given frontend, return the exact value
virtual double tune(const std::string &which, const double value) = 0;
+ //! get the current frequency for the given frontend
+ virtual double get_freq(const std::string &which) = 0;
+
//! turn on/off data port loopback
virtual void data_port_loopback(const bool on) = 0;
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
index 413ec75a2..e63460730 100644
--- a/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
+++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.cpp
@@ -1050,7 +1050,7 @@ double ad9361_device_t::_tune_bbvco(const double rate)
const double vcomin = 672e6;
double vcorate;
int vcodiv;
-
+
/* Iterate over VCO dividers until appropriate divider is found. */
int i = 1;
for (; i <= 6; i++) {
@@ -1855,10 +1855,21 @@ double ad9361_device_t::tune(direction_t direction, const double value)
return tune_freq;
}
+/* Get the current RX or TX frequency. */
+double ad9361_device_t::get_freq(direction_t direction)
+{
+ boost::lock_guard<boost::recursive_mutex> lock(_mutex);
+
+ if (direction == RX)
+ return _rx_freq;
+ else
+ return _tx_freq;
+}
+
/* Set the gain of RX1, RX2, TX1, or TX2.
*
- * Note that the 'value' passed to this function is the gain index
- * for RX. Also note that the RX chains are done in terms of gain, and
+ * Note that the 'value' passed to this function is the gain index
+ * for RX. Also note that the RX chains are done in terms of gain, and
* the TX chains are done in terms of attenuation. */
double ad9361_device_t::set_gain(direction_t direction, chain_t chain, const double value)
{
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.h b/host/lib/usrp/common/ad9361_driver/ad9361_device.h
index a42c5ac9a..71ce78da7 100644
--- a/host/lib/usrp/common/ad9361_driver/ad9361_device.h
+++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.h
@@ -49,6 +49,9 @@ public:
* After tuning, it runs any appropriate calibrations. */
double tune(direction_t direction, const double value);
+ /* Get the current RX or TX frequency. */
+ double get_freq(direction_t direction);
+
/* Set the gain of RX1, RX2, TX1, or TX2.
*
* Note that the 'value' passed to this function is the actual gain value,
diff --git a/host/lib/usrp/e300/e300_impl.cpp b/host/lib/usrp/e300/e300_impl.cpp
index 693aa5734..41e8eacf3 100644
--- a/host/lib/usrp/e300/e300_impl.cpp
+++ b/host/lib/usrp/e300/e300_impl.cpp
@@ -1053,6 +1053,7 @@ void e300_impl::_setup_radio(const size_t dspno)
_tree->create<meta_range_t>(rf_fe_path / "bandwidth" / "range")
.publish(boost::bind(&ad9361_ctrl::get_bw_filter_range, key));
_tree->create<double>(rf_fe_path / "freq" / "value")
+ .publish(boost::bind(&ad9361_ctrl::get_freq, _codec_ctrl, key))
.coerce(boost::bind(&ad9361_ctrl::tune, _codec_ctrl, key, _1))
.subscribe(boost::bind(&e300_impl::_update_fe_lo_freq, this, key, _1))
.set(e300::DEFAULT_FE_FREQ);