aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp9
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp2
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp34
3 files changed, 33 insertions, 12 deletions
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
index d7d1b43de..f71b1aa4e 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
@@ -60,15 +60,6 @@ double magnesium_ad9371_iface::set_gain(
// return 0.0;
}
-
-double magnesium_ad9371_iface::set_master_clock_rate(const double freq)
-{
- const auto actual_freq = request<double>("set_master_clock_rate", freq);
- UHD_LOG_TRACE(
- _log_prefix, _rpc_prefix << "set_master_clock_rate returned successfully");
- return actual_freq;
-}
-
double magnesium_ad9371_iface::set_bandwidth(
const double bandwidth, const size_t chan, const direction_t dir)
{
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
index 63972a54c..2374a4503 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
@@ -28,8 +28,6 @@ public:
double get_gain(const size_t chan, const uhd::direction_t dir);
- double set_master_clock_rate(const double freq);
-
double set_bandwidth(
const double bandwidth, const size_t chan, const uhd::direction_t dir);
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp
index 32c16adc6..71e59891c 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_control.cpp
@@ -156,7 +156,39 @@ double magnesium_radio_control_impl::set_rate(double requested_rate)
// Now commit to device. First, disable LOs.
_lo_disable(_tx_lo);
_lo_disable(_rx_lo);
- _master_clock_rate = _ad9371->set_master_clock_rate(rate);
+ // DANGER ZONE! The only way we can change the master clock rate on N310 is
+ // if we first change the master clock rate on side A, then side B. We can't
+ // do it in the other order.
+ // When we change the other radio's clock rate, however, the other radio
+ // block controller doesn't know about that. So, we need to call set_rate()
+ // on both radios every time we call it on any radio, unless the other radio
+ // block is not participating in the graph.
+ // Note: Updating the master clock rate is a no-op on the second call.
+ const size_t num_dboards =
+ _rpcc->request<std::vector<std::map<std::string, std::string>>>("get_dboard_info")
+ .size();
+ // Explicitly go and update rate on radio 0
+ RFNOC_LOG_DEBUG("Setting master clock rate on DB0 to " << (rate / 1e6) << " MHz...");
+ _master_clock_rate = _rpcc->request_with_token<double>(
+ MAGNESIUM_TUNE_TIMEOUT, "db_0_set_master_clock_rate", rate);
+ // Now go to the other side
+ if (num_dboards == 2) {
+ RFNOC_LOG_DEBUG(
+ "Setting master clock rate on DB1 to " << (rate / 1e6) << " MHz...");
+ const double sideB_rate = _rpcc->request_with_token<double>(
+ MAGNESIUM_TUNE_TIMEOUT, "db_1_set_master_clock_rate", rate);
+ if (!math::frequencies_are_equal(sideB_rate, _master_clock_rate)) {
+ RFNOC_LOG_ERROR("set_rate(): Error updating rates. Slot A now has rate "
+ << (_master_clock_rate / 1e6) << " MHz, but slot B has "
+ << (sideB_rate / 1e6)
+ << " MHz. They should always be the same.");
+ throw uhd::runtime_error("Different rates on radios 0 and 1!");
+ }
+ }
+ RFNOC_LOG_DEBUG("Set MCR on both radios.");
+ // Now, both radios are running at the new rate. Update all dependent
+ // settings for this radio block. The other radio block needs to call
+ // set_rate() too before it is in a valid state.
_n3xx_timekeeper->update_tick_rate(_master_clock_rate);
radio_control_impl::set_rate(_master_clock_rate);
// Frequency settings apply to both channels, no loop needed. Will also