aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard/magnesium
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/dboard/magnesium')
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp104
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp62
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_bands.cpp125
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_constants.hpp60
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp183
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp96
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp125
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp8
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp370
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp119
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp790
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp222
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp888
13 files changed, 1346 insertions, 1806 deletions
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
index 8fd82cbc8..6a14f3976 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.cpp
@@ -6,93 +6,79 @@
#include "magnesium_ad9371_iface.hpp"
#include <uhd/utils/log.hpp>
-#include <uhd/utils/log.hpp>
using namespace uhd;
namespace {
- /*! Return a valid 'which' string for use with AD9371 API calls
- *
- * These strings take the form of "RX1", "TX2", ...
- */
- std::string _get_which(
- const direction_t dir,
- const size_t chan
- ) {
- UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
- UHD_ASSERT_THROW(chan == 0 or chan == 1);
- return str(boost::format("%s%d")
- % (dir == RX_DIRECTION ? "RX" : "TX")
- % (chan+1)
- );
- }
+/*! Return a valid 'which' string for use with AD9371 API calls
+ *
+ * These strings take the form of "RX1", "TX2", ...
+ */
+std::string _get_which(const direction_t dir, const size_t chan)
+{
+ UHD_ASSERT_THROW(dir == RX_DIRECTION or dir == TX_DIRECTION);
+ UHD_ASSERT_THROW(chan == 0 or chan == 1);
+ return str(boost::format("%s%d") % (dir == RX_DIRECTION ? "RX" : "TX") % (chan + 1));
}
+} // namespace
/******************************************************************************
* Structors
*****************************************************************************/
magnesium_ad9371_iface::magnesium_ad9371_iface(
- uhd::rpc_client::sptr rpcc,
- const size_t slot_idx
-) : _rpcc(rpcc)
- , _slot_idx(slot_idx)
- , _rpc_prefix((slot_idx == 0) ? "db_0_" : "db_1_")
- , _log_prefix((slot_idx == 0) ? "AD9371-0" : "AD9371-1")
+ uhd::rpc_client::sptr rpcc, const size_t slot_idx)
+ : _rpcc(rpcc)
+ , _slot_idx(slot_idx)
+ , _rpc_prefix((slot_idx == 0) ? "db_0_" : "db_1_")
+ , _log_prefix((slot_idx == 0) ? "AD9371-0" : "AD9371-1")
{
UHD_LOG_TRACE(_log_prefix,
- "Initialized controls with RPC prefix " << _rpc_prefix <<
- " for slot " << _slot_idx);
+ "Initialized controls with RPC prefix " << _rpc_prefix << " for slot "
+ << _slot_idx);
}
double magnesium_ad9371_iface::set_frequency(
- const double freq,
- const size_t chan,
- const direction_t dir
-) {
+ const double freq, const size_t chan, const direction_t dir)
+{
// Note: This sets the frequency for both channels (1 and 2).
- auto which = _get_which(dir, chan);
+ auto which = _get_which(dir, chan);
auto actual_freq = request<double>("set_freq", which, freq, false);
- UHD_LOG_TRACE(_log_prefix,
- _rpc_prefix << "set_freq returned " << actual_freq);
+ UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_freq returned " << actual_freq);
return actual_freq;
}
double magnesium_ad9371_iface::set_gain(
- const double gain,
- const size_t chan,
- const direction_t dir
-) {
- auto which = _get_which(dir, chan);
+ const double gain, const size_t chan, const direction_t dir)
+{
+ auto which = _get_which(dir, chan);
auto retval = request<double>("set_gain", which, gain);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_gain returned " << retval);
return retval;
- //return 0.0;
+ // return 0.0;
}
-double magnesium_ad9371_iface::set_master_clock_rate(
- const double freq
-) {
+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");
+ 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)
+double magnesium_ad9371_iface::set_bandwidth(
+ const double bandwidth, const size_t chan, const direction_t dir)
{
auto const which = _get_which(dir, chan);
- auto retval = request<double>("set_bw_filter", which, bandwidth);
+ auto retval = request<double>("set_bw_filter", which, bandwidth);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_bw_filter returned " << retval);
return retval;
}
-double magnesium_ad9371_iface::get_frequency(
- const size_t chan,
- const direction_t dir
-) {
- auto which = _get_which(dir, chan);
+double magnesium_ad9371_iface::get_frequency(const size_t chan, const direction_t dir)
+{
+ auto which = _get_which(dir, chan);
auto retval = request<double>("get_freq", which);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "get_freq returned " << retval);
return retval;
@@ -100,13 +86,14 @@ double magnesium_ad9371_iface::get_frequency(
double magnesium_ad9371_iface::get_gain(const size_t chan, const direction_t dir)
{
- auto which = _get_which(dir, chan);
+ auto which = _get_which(dir, chan);
auto retval = request<double>("get_gain", which);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "get_gain returned " << retval);
return retval;
}
-double magnesium_ad9371_iface::get_bandwidth(const size_t /*chan*/, const direction_t /*dir*/)
+double magnesium_ad9371_iface::get_bandwidth(
+ const size_t /*chan*/, const direction_t /*dir*/)
{
// TODO: implement
UHD_LOG_WARNING(_log_prefix, "Ignoring attempt to get bandwidth");
@@ -114,23 +101,20 @@ double magnesium_ad9371_iface::get_bandwidth(const size_t /*chan*/, const direct
}
std::string magnesium_ad9371_iface::set_lo_source(
- const std::string &source,
- const uhd::direction_t dir
-) {
+ const std::string& source, const uhd::direction_t dir)
+{
// There is only one LO for 2 channels. Using channel 0 for 'which'
- auto which = _get_which(dir, 0);
+ auto which = _get_which(dir, 0);
auto retval = request<std::string>("set_lo_source", which, source);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "set_lo_source returned " << retval);
return retval;
}
-std::string magnesium_ad9371_iface::get_lo_source(
- const uhd::direction_t dir
-) {
+std::string magnesium_ad9371_iface::get_lo_source(const uhd::direction_t dir)
+{
// There is only one LO for 2 channels. Using channel 0 for 'which'
- auto which = _get_which(dir, 0);
+ auto which = _get_which(dir, 0);
auto retval = request<std::string>("get_lo_source", which);
UHD_LOG_TRACE(_log_prefix, _rpc_prefix << "get_lo_source returned " << retval);
return retval;
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
index acfecf2df..245c302ba 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_ad9371_iface.hpp
@@ -17,56 +17,27 @@ class magnesium_ad9371_iface
public:
using uptr = std::unique_ptr<magnesium_ad9371_iface>;
- magnesium_ad9371_iface(
- uhd::rpc_client::sptr rpcc,
- const size_t slot_idx
- );
+ magnesium_ad9371_iface(uhd::rpc_client::sptr rpcc, const size_t slot_idx);
double set_frequency(
- const double freq,
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double get_frequency(
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double set_gain(
- const double gain,
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double get_gain(
- const size_t chan,
- const uhd::direction_t dir
- );
-
- double set_master_clock_rate(
- const double freq
- );
+ const double freq, const size_t chan, const uhd::direction_t dir);
+
+ double get_frequency(const size_t chan, const uhd::direction_t dir);
+
+ double set_gain(const double gain, const size_t chan, const uhd::direction_t dir);
+
+ 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
- );
+ const double bandwidth, const size_t chan, const uhd::direction_t dir);
- double get_bandwidth(
- const size_t chan,
- const uhd::direction_t dir
- );
+ double get_bandwidth(const size_t chan, const uhd::direction_t dir);
- std::string set_lo_source(
- const std::string &source,
- const uhd::direction_t dir
- );
+ std::string set_lo_source(const std::string& source, const uhd::direction_t dir);
- std::string get_lo_source(
- const uhd::direction_t dir
- );
+ std::string get_lo_source(const uhd::direction_t dir);
private:
/*! Shorthand to perform an RPC request. Saves some typing.
@@ -76,9 +47,7 @@ private:
{
UHD_LOG_TRACE(_log_prefix, "[RPC] Calling " << func_name);
return _rpcc->request_with_token<return_type>(
- _rpc_prefix + func_name,
- std::forward<Args>(args)...
- );
+ _rpc_prefix + func_name, std::forward<Args>(args)...);
};
//! Reference to the RPC client
@@ -92,7 +61,6 @@ private:
//! Logger prefix
const std::string _log_prefix;
-
};
#endif /* INCLUDED_LIBUHD_RFNOC_MAGNESIUM_AD9371_IFACE_HPP */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp b/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp
index 656543653..4792dcac6 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_bands.cpp
@@ -6,8 +6,8 @@
// The band plan
-#include "magnesium_radio_ctrl_impl.hpp"
#include "magnesium_constants.hpp"
+#include "magnesium_radio_ctrl_impl.hpp"
#include <uhd/utils/math.hpp>
/*
@@ -43,66 +43,67 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- /* Note on the RX filter bank:
- *
- * The RX path has 7 bands, which we call BAND0 through BAND7. BAND0 is the
- * lowest frequency band (it goes through F44, the 490 MHz low pass filter,
- * on the first channel). BAND7 is the highest frequency band, it goes
- * through the 2.7 GHz high pass filter (F43 on the first channel).
- *
- * For all frequencies, there are gain values where we bypass the filter
- * bank. In this case, the band setting does not apply (does not have any
- * meaning).
- *
- * The lowband, when not disabling the filter bank, always goes through
- * BAND0, but there are non-lowband frequencies which can also go through
- * BAND0.
- *
- * The following constants define lower cutoff frequencies for each band.
- * BAND0 does not have a lower cutoff frequency, it is implied by
- * MAGNESIUM_MIN_FREQ. MAGNESIUM_RX_BAND1_MIN_FREQ is the cutover frequency
- * for switching from BAND0 to BAND1, and so on.
- *
- * Bands 1-6 have both high- and low-pass filters (effectively band
- * passes). Frequencies need to be chosen to allow as much of the full
- * bandwidth through unattenuated.
- */
- constexpr double MAGNESIUM_RX_BAND1_MIN_FREQ = 430e6;
- constexpr double MAGNESIUM_RX_BAND2_MIN_FREQ = 600e6;
- constexpr double MAGNESIUM_RX_BAND3_MIN_FREQ = 1050e6;
- constexpr double MAGNESIUM_RX_BAND4_MIN_FREQ = 1600e6;
- constexpr double MAGNESIUM_RX_BAND5_MIN_FREQ = 2100e6;
- constexpr double MAGNESIUM_RX_BAND6_MIN_FREQ = 2700e6;
+/* Note on the RX filter bank:
+ *
+ * The RX path has 7 bands, which we call BAND0 through BAND7. BAND0 is the
+ * lowest frequency band (it goes through F44, the 490 MHz low pass filter,
+ * on the first channel). BAND7 is the highest frequency band, it goes
+ * through the 2.7 GHz high pass filter (F43 on the first channel).
+ *
+ * For all frequencies, there are gain values where we bypass the filter
+ * bank. In this case, the band setting does not apply (does not have any
+ * meaning).
+ *
+ * The lowband, when not disabling the filter bank, always goes through
+ * BAND0, but there are non-lowband frequencies which can also go through
+ * BAND0.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * BAND0 does not have a lower cutoff frequency, it is implied by
+ * MAGNESIUM_MIN_FREQ. MAGNESIUM_RX_BAND1_MIN_FREQ is the cutover frequency
+ * for switching from BAND0 to BAND1, and so on.
+ *
+ * Bands 1-6 have both high- and low-pass filters (effectively band
+ * passes). Frequencies need to be chosen to allow as much of the full
+ * bandwidth through unattenuated.
+ */
+constexpr double MAGNESIUM_RX_BAND1_MIN_FREQ = 430e6;
+constexpr double MAGNESIUM_RX_BAND2_MIN_FREQ = 600e6;
+constexpr double MAGNESIUM_RX_BAND3_MIN_FREQ = 1050e6;
+constexpr double MAGNESIUM_RX_BAND4_MIN_FREQ = 1600e6;
+constexpr double MAGNESIUM_RX_BAND5_MIN_FREQ = 2100e6;
+constexpr double MAGNESIUM_RX_BAND6_MIN_FREQ = 2700e6;
- /* Note on the TX filter bank:
- *
- * The TX path has 4 bands, which we call BAND0 through BAND3.
- * For all frequencies, there are gain values where we bypass the filter
- * bank. In this case, the band setting does not apply (does not have any
- * meaning).
- *
- * The lowband, when not disabling the filter bank, always goes through
- * BAND0, but there are non-lowband frequencies which can also go through
- * BAND0.
- *
- * The following constants define lower cutoff frequencies for each band.
- * BAND0 does not have a lower cutoff frequency, it is implied by
- * MAGNESIUM_MIN_FREQ. MAGNESIUM_TX_BAND1_MIN_FREQ is the cutover frequency
- * for switching from BAND0 to BAND1, and so on.
- *
- * On current Magnesium revisions, all filters on the TX filter bank are
- * low pass filters (no high pass filters).
- * Frequencies need to be chosen to allow as much of the full bandwidth
- * through unattenuated (so don't go all the way up to the cutoff frequency
- * of that filter, OK).
- */
- constexpr double MAGNESIUM_TX_BAND1_MIN_FREQ = 723.17e6;
- constexpr double MAGNESIUM_TX_BAND2_MIN_FREQ = 1623.17e6;
- constexpr double MAGNESIUM_TX_BAND3_MIN_FREQ = 3323.17e6;
-}
+/* Note on the TX filter bank:
+ *
+ * The TX path has 4 bands, which we call BAND0 through BAND3.
+ * For all frequencies, there are gain values where we bypass the filter
+ * bank. In this case, the band setting does not apply (does not have any
+ * meaning).
+ *
+ * The lowband, when not disabling the filter bank, always goes through
+ * BAND0, but there are non-lowband frequencies which can also go through
+ * BAND0.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * BAND0 does not have a lower cutoff frequency, it is implied by
+ * MAGNESIUM_MIN_FREQ. MAGNESIUM_TX_BAND1_MIN_FREQ is the cutover frequency
+ * for switching from BAND0 to BAND1, and so on.
+ *
+ * On current Magnesium revisions, all filters on the TX filter bank are
+ * low pass filters (no high pass filters).
+ * Frequencies need to be chosen to allow as much of the full bandwidth
+ * through unattenuated (so don't go all the way up to the cutoff frequency
+ * of that filter, OK).
+ */
+constexpr double MAGNESIUM_TX_BAND1_MIN_FREQ = 723.17e6;
+constexpr double MAGNESIUM_TX_BAND2_MIN_FREQ = 1623.17e6;
+constexpr double MAGNESIUM_TX_BAND3_MIN_FREQ = 3323.17e6;
+} // namespace
-magnesium_radio_ctrl_impl::rx_band
-magnesium_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
+magnesium_radio_ctrl_impl::rx_band magnesium_radio_ctrl_impl::_map_freq_to_rx_band(
+ const double freq)
+{
magnesium_radio_ctrl_impl::rx_band band;
if (fp_compare_epsilon<double>(freq) < MAGNESIUM_MIN_FREQ) {
@@ -130,8 +131,9 @@ magnesium_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
return band;
}
-magnesium_radio_ctrl_impl::tx_band
-magnesium_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
+magnesium_radio_ctrl_impl::tx_band magnesium_radio_ctrl_impl::_map_freq_to_tx_band(
+ const double freq)
+{
magnesium_radio_ctrl_impl::tx_band band;
if (fp_compare_epsilon<double>(freq) < MAGNESIUM_MIN_FREQ) {
@@ -152,4 +154,3 @@ magnesium_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
return band;
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp b/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
index e19603b94..a045d0558 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_constants.hpp
@@ -7,17 +7,17 @@
#ifndef INCLUDED_LIBUHD_MAGNESIUM_CONSTANTS_HPP
#define INCLUDED_LIBUHD_MAGNESIUM_CONSTANTS_HPP
-#include <vector>
-#include <string>
-#include <cstddef>
#include <uhd/types/ranges.hpp>
+#include <cstddef>
+#include <string>
+#include <vector>
-static constexpr size_t FPGPIO_MASTER_RADIO = 0;
-static constexpr size_t TOTAL_RADIO_PORTS = 4;
-static constexpr double AD9371_RX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr size_t FPGPIO_MASTER_RADIO = 0;
+static constexpr size_t TOTAL_RADIO_PORTS = 4;
+static constexpr double AD9371_RX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9371_RX_MAX_BANDWIDTH = 100.0e6; // HZ
-static constexpr double AD9371_TX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr double AD9371_TX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9371_TX_MAX_BANDWIDTH = 100.0e6; // HZ
static constexpr double AD9371_MIN_FREQ = 300.0e6; // Hz
@@ -27,36 +27,36 @@ static constexpr double ADF4351_MIN_FREQ = 35.0e6;
static constexpr double ADF4351_MAX_FREQ = 4.4e9;
static const std::vector<double> MAGNESIUM_RADIO_RATES = {122.88e6, 125e6, 153.6e6};
-static constexpr double MAGNESIUM_RADIO_RATE = 125e6; // Hz
-static constexpr double MAGNESIUM_MIN_FREQ = 1e6; // Hz
-static constexpr double MAGNESIUM_MAX_FREQ = 6e9; // Hz
+static constexpr double MAGNESIUM_RADIO_RATE = 125e6; // Hz
+static constexpr double MAGNESIUM_MIN_FREQ = 1e6; // Hz
+static constexpr double MAGNESIUM_MAX_FREQ = 6e9; // Hz
static constexpr double MAGNESIUM_LOWBAND_FREQ = 300e6;
-static constexpr double AD9371_MIN_RX_GAIN = 0.0; // dB
-static constexpr double AD9371_MAX_RX_GAIN = 30.0; // dB
+static constexpr double AD9371_MIN_RX_GAIN = 0.0; // dB
+static constexpr double AD9371_MAX_RX_GAIN = 30.0; // dB
static constexpr double AD9371_RX_GAIN_STEP = 0.5;
-static constexpr double DSA_MIN_GAIN = 0; // dB
-static constexpr double DSA_MAX_GAIN = 31.5; // dB
-static constexpr double DSA_GAIN_STEP = 0.5; // db
-static constexpr double AMP_MIN_GAIN = 0; // dB
-static constexpr double AMP_MAX_GAIN = 10; // dB
-static constexpr double AMP_GAIN_STEP = 10;// dB
-static constexpr double AD9371_MIN_TX_GAIN = 0.0; // dB
-static constexpr double AD9371_MAX_TX_GAIN = 41.95; // dB
+static constexpr double DSA_MIN_GAIN = 0; // dB
+static constexpr double DSA_MAX_GAIN = 31.5; // dB
+static constexpr double DSA_GAIN_STEP = 0.5; // db
+static constexpr double AMP_MIN_GAIN = 0; // dB
+static constexpr double AMP_MAX_GAIN = 10; // dB
+static constexpr double AMP_GAIN_STEP = 10; // dB
+static constexpr double AD9371_MIN_TX_GAIN = 0.0; // dB
+static constexpr double AD9371_MAX_TX_GAIN = 41.95; // dB
static constexpr double AD9371_TX_GAIN_STEP = 0.05;
-static constexpr double ALL_RX_MIN_GAIN = 0.0;
-static constexpr double ALL_RX_MAX_GAIN = 75.0;
-static constexpr double ALL_RX_GAIN_STEP = 0.5;
-static constexpr double ALL_TX_MIN_GAIN = 0.0;
-static constexpr double ALL_TX_MAX_GAIN = 65.0;
-static constexpr double ALL_TX_GAIN_STEP = 0.5;
+static constexpr double ALL_RX_MIN_GAIN = 0.0;
+static constexpr double ALL_RX_MAX_GAIN = 75.0;
+static constexpr double ALL_RX_GAIN_STEP = 0.5;
+static constexpr double ALL_TX_MIN_GAIN = 0.0;
+static constexpr double ALL_TX_MAX_GAIN = 65.0;
+static constexpr double ALL_TX_GAIN_STEP = 0.5;
-static const uhd::freq_range_t MAGNESIUM_FREQ_RANGE(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ);
+static const uhd::freq_range_t MAGNESIUM_FREQ_RANGE(
+ MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ);
static const std::vector<std::string> MAGNESIUM_RX_ANTENNAS = {
- "TX/RX", "RX2", "CAL", "LOCAL"
-};
+ "TX/RX", "RX2", "CAL", "LOCAL"};
//! AD9371 LO (for direct conversion)
static constexpr char MAGNESIUM_LO1[] = "rfic";
@@ -72,7 +72,7 @@ static constexpr char MAGNESIUM_AMP[] = "amp";
// Note: MAGNESIUM_NUM_CHANS is independent of the number of chans per
// RFNoC block. TODO: When we go to one radio per dboard, this comment can
// be deleted.
-static constexpr size_t MAGNESIUM_NUM_CHANS = 2;
+static constexpr size_t MAGNESIUM_NUM_CHANS = 2;
static constexpr double MAGNESIUM_RX_IF_FREQ = 2.44e9;
static constexpr double MAGNESIUM_TX_IF_FREQ = 1.95e9;
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp
index 3e68e2011..172f26390 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.cpp
@@ -11,35 +11,26 @@
#include <chrono>
namespace {
- //! Address of the CPLD scratch register
- const uint8_t CPLD_REGS_SCRATCH = 0x0040;
+//! Address of the CPLD scratch register
+const uint8_t CPLD_REGS_SCRATCH = 0x0040;
- //! Address of the CPLD reset register
- const uint8_t CPLD_REGS_RESET = 0x0041;
-}
+//! Address of the CPLD reset register
+const uint8_t CPLD_REGS_RESET = 0x0041;
+} // namespace
-magnesium_cpld_ctrl::magnesium_cpld_ctrl(
- write_spi_t write_fn,
- read_spi_t read_fn
-)
+magnesium_cpld_ctrl::magnesium_cpld_ctrl(write_spi_t write_fn, read_spi_t read_fn)
{
- _write_fn = [write_fn](const uint8_t addr, const uint32_t data){
+ _write_fn = [write_fn](const uint8_t addr, const uint32_t data) {
UHD_LOG_TRACE("MG_CPLD",
- str(boost::format("Writing to CPLD: 0x%02X -> 0x%04X")
- % uint32_t(addr) % data));
- const uint32_t spi_transaction = 0
- | ((addr & 0x7F) << 16)
- | data
- ;
+ str(boost::format("Writing to CPLD: 0x%02X -> 0x%04X") % uint32_t(addr)
+ % data));
+ const uint32_t spi_transaction = 0 | ((addr & 0x7F) << 16) | data;
write_fn(spi_transaction);
};
- _read_fn = [read_fn](const uint8_t addr){
+ _read_fn = [read_fn](const uint8_t addr) {
UHD_LOG_TRACE("MG_CPLD",
- str(boost::format("Reading from CPLD address 0x%02X")
- % uint32_t(addr)));
- const uint32_t spi_transaction = (1<<23)
- | ((addr & 0x7F) << 16)
- ;
+ str(boost::format("Reading from CPLD address 0x%02X") % uint32_t(addr)));
+ const uint32_t spi_transaction = (1 << 23) | ((addr & 0x7F) << 16);
return read_fn(spi_transaction);
};
@@ -82,23 +73,24 @@ uint16_t magnesium_cpld_ctrl::get_scratch()
return get_reg(CPLD_REGS_SCRATCH);
}
-void magnesium_cpld_ctrl::set_tx_switches(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_tx_switches(const chan_sel_t chan,
const tx_sw1_t tx_sw1,
const tx_sw2_t tx_sw2,
const tx_sw3_t tx_sw3,
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
_regs.ch1_idle_tx_sw1 = magnesium_cpld_regs_t::ch1_idle_tx_sw1_t(tx_sw1);
_regs.ch1_idle_tx_sw2 = magnesium_cpld_regs_t::ch1_idle_tx_sw2_t(tx_sw2);
_regs.ch1_idle_tx_sw3 = magnesium_cpld_regs_t::ch1_idle_tx_sw3_t(tx_sw3);
- _regs.ch1_idle_tx_lowband_mixer_path_select = magnesium_cpld_regs_t::ch1_idle_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ _regs.ch1_idle_tx_lowband_mixer_path_select =
+ magnesium_cpld_regs_t::ch1_idle_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch1_idle_tx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -106,7 +98,8 @@ void magnesium_cpld_ctrl::set_tx_switches(
_regs.ch1_on_tx_sw2 = magnesium_cpld_regs_t::ch1_on_tx_sw2_t(tx_sw2);
_regs.ch1_on_tx_sw3 = magnesium_cpld_regs_t::ch1_on_tx_sw3_t(tx_sw3);
_regs.ch1_on_tx_lowband_mixer_path_select =
- magnesium_cpld_regs_t::ch1_on_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch1_on_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch1_on_tx_mixer_en = enb_lowband_mixer;
}
}
@@ -116,7 +109,8 @@ void magnesium_cpld_ctrl::set_tx_switches(
_regs.ch2_idle_tx_sw2 = magnesium_cpld_regs_t::ch2_idle_tx_sw2_t(tx_sw1);
_regs.ch2_idle_tx_sw3 = magnesium_cpld_regs_t::ch2_idle_tx_sw3_t(tx_sw1);
_regs.ch2_idle_tx_lowband_mixer_path_select =
- magnesium_cpld_regs_t::ch2_idle_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch2_idle_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch2_idle_tx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -124,7 +118,8 @@ void magnesium_cpld_ctrl::set_tx_switches(
_regs.ch2_on_tx_sw2 = magnesium_cpld_regs_t::ch2_on_tx_sw2_t(tx_sw2);
_regs.ch2_on_tx_sw3 = magnesium_cpld_regs_t::ch2_on_tx_sw3_t(tx_sw3);
_regs.ch2_on_tx_lowband_mixer_path_select =
- magnesium_cpld_regs_t::ch2_on_tx_lowband_mixer_path_select_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch2_on_tx_lowband_mixer_path_select_t(
+ select_lowband_mixer_path);
_regs.ch2_on_tx_mixer_en = enb_lowband_mixer;
}
}
@@ -134,8 +129,7 @@ void magnesium_cpld_ctrl::set_tx_switches(
}
}
-void magnesium_cpld_ctrl::set_rx_switches(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_switches(const chan_sel_t chan,
const rx_sw2_t rx_sw2,
const rx_sw3_t rx_sw3,
const rx_sw4_t rx_sw4,
@@ -144,8 +138,8 @@ void magnesium_cpld_ctrl::set_rx_switches(
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
@@ -154,7 +148,9 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch1_idle_rx_sw4 = magnesium_cpld_regs_t::ch1_idle_rx_sw4_t(rx_sw4);
_regs.ch1_idle_rx_sw5 = magnesium_cpld_regs_t::ch1_idle_rx_sw5_t(rx_sw5);
_regs.ch1_idle_rx_sw6 = magnesium_cpld_regs_t::ch1_idle_rx_sw6_t(rx_sw6);
- _regs.ch1_idle_rx_loband_mixer_path_sel = magnesium_cpld_regs_t::ch1_idle_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ _regs.ch1_idle_rx_loband_mixer_path_sel =
+ magnesium_cpld_regs_t::ch1_idle_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch1_idle_rx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -163,7 +159,9 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch1_on_rx_sw4 = magnesium_cpld_regs_t::ch1_on_rx_sw4_t(rx_sw4);
_regs.ch1_on_rx_sw5 = magnesium_cpld_regs_t::ch1_on_rx_sw5_t(rx_sw5);
_regs.ch1_on_rx_sw6 = magnesium_cpld_regs_t::ch1_on_rx_sw6_t(rx_sw6);
- _regs.ch1_on_rx_loband_mixer_path_sel = magnesium_cpld_regs_t::ch1_on_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ _regs.ch1_on_rx_loband_mixer_path_sel =
+ magnesium_cpld_regs_t::ch1_on_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch1_on_rx_mixer_en = enb_lowband_mixer;
}
}
@@ -175,7 +173,8 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch2_idle_rx_sw5 = magnesium_cpld_regs_t::ch2_idle_rx_sw5_t(rx_sw5);
_regs.ch2_idle_rx_sw6 = magnesium_cpld_regs_t::ch2_idle_rx_sw6_t(rx_sw6);
_regs.ch2_idle_rx_loband_mixer_path_sel =
- magnesium_cpld_regs_t::ch2_idle_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ magnesium_cpld_regs_t::ch2_idle_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch2_idle_rx_mixer_en = enb_lowband_mixer;
}
if (atr_state == ON or atr_state == ANY) {
@@ -184,7 +183,9 @@ void magnesium_cpld_ctrl::set_rx_switches(
_regs.ch2_on_rx_sw4 = magnesium_cpld_regs_t::ch2_on_rx_sw4_t(rx_sw4);
_regs.ch2_on_rx_sw5 = magnesium_cpld_regs_t::ch2_on_rx_sw5_t(rx_sw5);
_regs.ch2_on_rx_sw6 = magnesium_cpld_regs_t::ch2_on_rx_sw6_t(rx_sw6);
- _regs.ch2_on_rx_loband_mixer_path_sel = magnesium_cpld_regs_t::ch2_on_rx_loband_mixer_path_sel_t(select_lowband_mixer_path);
+ _regs.ch2_on_rx_loband_mixer_path_sel =
+ magnesium_cpld_regs_t::ch2_on_rx_loband_mixer_path_sel_t(
+ select_lowband_mixer_path);
_regs.ch2_on_rx_mixer_en = enb_lowband_mixer;
}
}
@@ -193,40 +194,39 @@ void magnesium_cpld_ctrl::set_rx_switches(
}
}
-void magnesium_cpld_ctrl::set_tx_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_tx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool tx_led,
const bool tx_pa_enb,
const bool tx_amp_enb,
const bool tx_myk_en,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch1_idle_tx_led = tx_led;
- _regs.ch1_idle_tx_pa_en = tx_pa_enb;
+ _regs.ch1_idle_tx_led = tx_led;
+ _regs.ch1_idle_tx_pa_en = tx_pa_enb;
_regs.ch1_idle_tx_amp_en = tx_amp_enb;
_regs.ch1_idle_tx_myk_en = tx_myk_en;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch1_on_tx_led = tx_led;
- _regs.ch1_on_tx_pa_en = tx_pa_enb;
+ _regs.ch1_on_tx_led = tx_led;
+ _regs.ch1_on_tx_pa_en = tx_pa_enb;
_regs.ch1_on_tx_amp_en = tx_amp_enb;
_regs.ch1_on_tx_myk_en = tx_myk_en;
}
}
if (chan == CHAN2 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch2_idle_tx_led = tx_led;
- _regs.ch2_idle_tx_pa_en = tx_pa_enb;
+ _regs.ch2_idle_tx_led = tx_led;
+ _regs.ch2_idle_tx_pa_en = tx_pa_enb;
_regs.ch2_idle_tx_amp_en = tx_amp_enb;
_regs.ch2_idle_tx_myk_en = tx_myk_en;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch2_on_tx_led = tx_led;
- _regs.ch2_on_tx_pa_en = tx_pa_enb;
+ _regs.ch2_on_tx_led = tx_led;
+ _regs.ch2_on_tx_pa_en = tx_pa_enb;
_regs.ch2_on_tx_amp_en = tx_amp_enb;
_regs.ch2_on_tx_myk_en = tx_myk_en;
}
@@ -236,31 +236,26 @@ void magnesium_cpld_ctrl::set_tx_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_trx_sw_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_trx_sw_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const sw_trx_t trx_sw,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch1_idle_sw_trx =
- magnesium_cpld_regs_t::ch1_idle_sw_trx_t(trx_sw);
+ _regs.ch1_idle_sw_trx = magnesium_cpld_regs_t::ch1_idle_sw_trx_t(trx_sw);
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch1_on_sw_trx =
- magnesium_cpld_regs_t::ch1_on_sw_trx_t(trx_sw);
+ _regs.ch1_on_sw_trx = magnesium_cpld_regs_t::ch1_on_sw_trx_t(trx_sw);
}
}
if (chan == CHAN2 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch2_idle_sw_trx =
- magnesium_cpld_regs_t::ch2_idle_sw_trx_t(trx_sw);
+ _regs.ch2_idle_sw_trx = magnesium_cpld_regs_t::ch2_idle_sw_trx_t(trx_sw);
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch2_on_sw_trx =
- magnesium_cpld_regs_t::ch2_on_sw_trx_t(trx_sw);
+ _regs.ch2_on_sw_trx = magnesium_cpld_regs_t::ch2_on_sw_trx_t(trx_sw);
}
}
if (not defer_commit) {
@@ -268,40 +263,35 @@ void magnesium_cpld_ctrl::set_trx_sw_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_rx_input_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_input_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const rx_sw1_t rx_sw1,
const bool rx_led,
const bool rx2_led,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch1_idle_rx_sw1 =
- magnesium_cpld_regs_t::ch1_idle_rx_sw1_t(rx_sw1);
- _regs.ch1_idle_rx_led = rx_led;
+ _regs.ch1_idle_rx_sw1 = magnesium_cpld_regs_t::ch1_idle_rx_sw1_t(rx_sw1);
+ _regs.ch1_idle_rx_led = rx_led;
_regs.ch1_idle_rx2_led = rx2_led;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch1_on_rx_sw1 =
- magnesium_cpld_regs_t::ch1_on_rx_sw1_t(rx_sw1);
- _regs.ch1_on_rx_led = rx_led;
+ _regs.ch1_on_rx_sw1 = magnesium_cpld_regs_t::ch1_on_rx_sw1_t(rx_sw1);
+ _regs.ch1_on_rx_led = rx_led;
_regs.ch1_on_rx2_led = rx2_led;
}
}
if (chan == CHAN2 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
- _regs.ch2_idle_rx_sw1 =
- magnesium_cpld_regs_t::ch2_idle_rx_sw1_t(rx_sw1);
- _regs.ch2_idle_rx_led = rx_led;
+ _regs.ch2_idle_rx_sw1 = magnesium_cpld_regs_t::ch2_idle_rx_sw1_t(rx_sw1);
+ _regs.ch2_idle_rx_led = rx_led;
_regs.ch2_idle_rx2_led = rx2_led;
}
if (atr_state == ON or atr_state == ANY) {
- _regs.ch2_on_rx_sw1 =
- magnesium_cpld_regs_t::ch2_on_rx_sw1_t(rx_sw1);
- _regs.ch2_on_rx_led = rx_led;
+ _regs.ch2_on_rx_sw1 = magnesium_cpld_regs_t::ch2_on_rx_sw1_t(rx_sw1);
+ _regs.ch2_on_rx_led = rx_led;
_regs.ch2_on_rx2_led = rx2_led;
}
}
@@ -311,13 +301,12 @@ void magnesium_cpld_ctrl::set_rx_input_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_rx_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_amp_enb,
const bool rx_myk_en,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
@@ -345,13 +334,12 @@ void magnesium_cpld_ctrl::set_rx_atr_bits(
}
}
-void magnesium_cpld_ctrl::set_rx_lna_atr_bits(
- const chan_sel_t chan,
+void magnesium_cpld_ctrl::set_rx_lna_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_lna1_enb,
const bool rx_lna2_enb,
- const bool defer_commit
-) {
+ const bool defer_commit)
+{
std::lock_guard<std::mutex> l(_set_mutex);
if (chan == CHAN1 or chan == BOTH) {
if (atr_state == IDLE or atr_state == ANY) {
@@ -394,9 +382,7 @@ void magnesium_cpld_ctrl::_loopback_test()
if (actual != random_number) {
UHD_LOGGER_ERROR("MG_CPLD")
<< "CPLD scratch loopback failed! "
- << boost::format("Expected: 0x%04X Got: 0x%04X")
- % random_number % actual
- ;
+ << boost::format("Expected: 0x%04X Got: 0x%04X") % random_number % actual;
throw uhd::runtime_error("CPLD scratch loopback failed!");
}
UHD_LOG_TRACE("MG_CPLD", "CPLD scratch loopback test passed!");
@@ -406,19 +392,16 @@ void magnesium_cpld_ctrl::_loopback_test()
void magnesium_cpld_ctrl::commit(const bool save_all)
{
UHD_LOGGER_TRACE("MG_CPLD")
- << "Storing register cache "
- << (save_all ? "completely" : "selectively")
- << " to CPLD via SPI..."
- ;
- auto changed_addrs = save_all ?
- _regs.get_all_addrs() :
- _regs.get_changed_addrs<size_t>();
- for (const auto addr: changed_addrs) {
+ << "Storing register cache " << (save_all ? "completely" : "selectively")
+ << " to CPLD via SPI...";
+ auto changed_addrs = save_all ? _regs.get_all_addrs()
+ : _regs.get_changed_addrs<size_t>();
+ for (const auto addr : changed_addrs) {
_write_fn(addr, _regs.get_reg(addr));
}
_regs.save_state();
UHD_LOG_TRACE("MG_CPLD",
- "Storing cache complete: " \
- "Updated " << changed_addrs.size() << " registers.");
+ "Storing cache complete: "
+ "Updated "
+ << changed_addrs.size() << " registers.");
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
index fc3af77de..05455e3fd 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_cpld_ctrl.hpp
@@ -8,10 +8,10 @@
#define INCLUDED_LIBUHD_MAGNESIUM_CPLD_CTRL_HPP
#include "adf4351_regs.hpp"
-#include <uhd/types/serial.hpp>
#include "magnesium_cpld_regs.hpp"
-#include <mutex>
+#include <uhd/types/serial.hpp>
#include <memory>
+#include <mutex>
//! Controls the CPLD on a Magnesium daughterboard
//
@@ -31,21 +31,13 @@ public:
//! ATR state: The CPLD has 2 states for RX and TX each, not like the radio
// which has 4 states (one for every RX/TX state combo).
- enum atr_state_t {
- IDLE,
- ON,
- ANY
- };
+ enum atr_state_t { IDLE, ON, ANY };
//! Channel select: One CPLD controls both channels on a daughterboard
- enum chan_sel_t {
- CHAN1,
- CHAN2,
- BOTH
- };
+ enum chan_sel_t { CHAN1, CHAN2, BOTH };
enum tx_sw1_t {
- TX_SW1_SHUTDOWNTXSW1 = 0,
+ TX_SW1_SHUTDOWNTXSW1 = 0,
TX_SW1_FROMTXFILTERLP1700MHZ = 1,
TX_SW1_FROMTXFILTERLP3400MHZ = 2,
TX_SW1_FROMTXFILTERLP0800MHZ = 3
@@ -58,59 +50,56 @@ public:
TX_SW2_TOTXFILTERLP6400MHZ = 8
};
- enum tx_sw3_t {
- TX_SW3_TOTXFILTERBANKS = 0,
- TX_SW3_BYPASSPATHTOTRXSW = 1
- };
+ enum tx_sw3_t { TX_SW3_TOTXFILTERBANKS = 0, TX_SW3_BYPASSPATHTOTRXSW = 1 };
enum sw_trx_t {
- SW_TRX_FROMLOWERFILTERBANKTXSW1 = 0,
+ SW_TRX_FROMLOWERFILTERBANKTXSW1 = 0,
SW_TRX_FROMTXUPPERFILTERBANKLP6400MHZ = 1,
- SW_TRX_RXCHANNELPATH = 2,
- SW_TRX_BYPASSPATHTOTXSW3 = 3
+ SW_TRX_RXCHANNELPATH = 2,
+ SW_TRX_BYPASSPATHTOTXSW3 = 3
};
enum rx_sw1_t {
- RX_SW1_TXRXINPUT = 0,
- RX_SW1_RXLOCALINPUT = 1,
+ RX_SW1_TXRXINPUT = 0,
+ RX_SW1_RXLOCALINPUT = 1,
RX_SW1_TRXSWITCHOUTPUT = 2,
- RX_SW1_RX2INPUT = 3
+ RX_SW1_RX2INPUT = 3
};
enum rx_sw2_t {
- RX_SW2_SHUTDOWNSW2 = 0,
+ RX_SW2_SHUTDOWNSW2 = 0,
RX_SW2_LOWERFILTERBANKTOSWITCH3 = 1,
- RX_SW2_BYPASSPATHTOSWITCH6 = 2,
+ RX_SW2_BYPASSPATHTOSWITCH6 = 2,
RX_SW2_UPPERFILTERBANKTOSWITCH4 = 3
};
enum rx_sw3_t {
RX_SW3_FILTER2100X2850MHZ = 0,
- RX_SW3_FILTER0490LPMHZ = 1,
+ RX_SW3_FILTER0490LPMHZ = 1,
RX_SW3_FILTER1600X2250MHZ = 2,
RX_SW3_FILTER0440X0530MHZ = 4,
RX_SW3_FILTER0650X1000MHZ = 5,
RX_SW3_FILTER1100X1575MHZ = 6,
- RX_SW3_SHUTDOWNSW3 = 7
+ RX_SW3_SHUTDOWNSW3 = 7
};
enum rx_sw4_t {
RX_SW4_FILTER2100X2850MHZFROM = 1,
RX_SW4_FILTER1600X2250MHZFROM = 2,
- RX_SW4_FILTER2700HPMHZ = 4
+ RX_SW4_FILTER2700HPMHZ = 4
};
enum rx_sw5_t {
RX_SW5_FILTER0440X0530MHZFROM = 1,
RX_SW5_FILTER1100X1575MHZFROM = 2,
- RX_SW5_FILTER0490LPMHZFROM = 4,
+ RX_SW5_FILTER0490LPMHZFROM = 4,
RX_SW5_FILTER0650X1000MHZFROM = 8
};
enum rx_sw6_t {
RX_SW6_LOWERFILTERBANKFROMSWITCH5 = 1,
RX_SW6_UPPERFILTERBANKFROMSWITCH4 = 2,
- RX_SW6_BYPASSPATHFROMSWITCH2 = 4
+ RX_SW6_BYPASSPATHFROMSWITCH2 = 4
};
enum lowband_mixer_path_sel_t {
@@ -124,10 +113,7 @@ public:
* \param write_spi_fn SPI write functor
* \param read_spi_fn SPI read functor
*/
- magnesium_cpld_ctrl(
- write_spi_t write_spi_fn,
- read_spi_t read_spi_fn
- );
+ magnesium_cpld_ctrl(write_spi_t write_spi_fn, read_spi_t read_spi_fn);
/**************************************************************************
* API
@@ -167,16 +153,14 @@ public:
* \param atr_state If IDLE, only update the idle register. If ON, only
* enable the on register. If ANY, update both.
*/
- void set_tx_switches(
- const chan_sel_t chan,
+ void set_tx_switches(const chan_sel_t chan,
const tx_sw1_t tx_sw1,
const tx_sw2_t tx_sw2,
const tx_sw3_t tx_sw3,
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state = ANY,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! Frequency-related settings, receive side
*
@@ -194,8 +178,7 @@ public:
* \param atr_state If IDLE, only update the idle register. If ON, only
* enable the on register. If ANY, update both.
*/
- void set_rx_switches(
- const chan_sel_t chan,
+ void set_rx_switches(const chan_sel_t chan,
const rx_sw2_t rx_sw2,
const rx_sw3_t rx_sw3,
const rx_sw4_t rx_sw4,
@@ -204,8 +187,7 @@ public:
const lowband_mixer_path_sel_t select_lowband_mixer_path,
const bool enb_lowband_mixer,
const atr_state_t atr_state = ANY,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: LEDs, PAs, LNAs, ... for TX side
*
@@ -223,15 +205,13 @@ public:
* \param tx_amp_enb State of the TX amp for this ATR state (on or off)
* \param tx_myk_enb State of the AD9371 TX enable pin for this ATR state
*/
- void set_tx_atr_bits(
- const chan_sel_t chan,
+ void set_tx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool tx_led,
const bool tx_pa_enb,
const bool tx_amp_enb,
const bool tx_myk_enb,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: TRX switch
*
@@ -242,12 +222,10 @@ public:
* \param atr_state TX state for which these settings apply.
* \param trx_sw State of the TRX switch for this ATR state
*/
- void set_trx_sw_atr_bits(
- const chan_sel_t chan,
+ void set_trx_sw_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const sw_trx_t trx_sw,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: LEDs, input switches for RX side
*
@@ -263,14 +241,12 @@ public:
* \param rx2_led State of the RX LED for this ATR state (on or off). This
* is the LED on the RX2 port.
*/
- void set_rx_input_atr_bits(
- const chan_sel_t chan,
+ void set_rx_input_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const rx_sw1_t rx_sw1,
const bool rx_led,
const bool rx2_led,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: Amp, Mykonos settings for RX side
*
@@ -287,13 +263,11 @@ public:
* \param rx_amp_enb State of RX amp for this ATR state (on or off).
* \param rx_myk_enb State of the AD9371 RX enable pin for this ATR state
*/
- void set_rx_atr_bits(
- const chan_sel_t chan,
+ void set_rx_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_amp_enb,
const bool rx_myk_en,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
/*! ATR settings: LNAs for RX side
*
@@ -311,13 +285,11 @@ public:
* \param rx_lna2_enb State of RX LNA 2 for this ATR state (on or off).
* This is the low-band LNA.
*/
- void set_rx_lna_atr_bits(
- const chan_sel_t chan,
+ void set_rx_lna_atr_bits(const chan_sel_t chan,
const atr_state_t atr_state,
const bool rx_lna1_enb,
const bool rx_lna2_enb,
- const bool defer_commit = false
- );
+ const bool defer_commit = false);
private:
//! Write functor: Take address / data pair, craft SPI transaction
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp
index 05b6dbe8f..67b20f5fa 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.cpp
@@ -15,47 +15,45 @@ using namespace uhd::rfnoc;
using namespace magnesium;
namespace {
- typedef magnesium_radio_ctrl_impl::rx_band rx_band;
- typedef magnesium_radio_ctrl_impl::tx_band tx_band;
+typedef magnesium_radio_ctrl_impl::rx_band rx_band;
+typedef magnesium_radio_ctrl_impl::tx_band tx_band;
- const size_t TX_LOWBAND = 0;
- const size_t TX_HIGHBAND = 1;
- const size_t RX_LOWBAND = 0;
- const size_t RX_MIDBAND = 1;
- const size_t RX_HIGHBAND = 2;
+const size_t TX_LOWBAND = 0;
+const size_t TX_HIGHBAND = 1;
+const size_t RX_LOWBAND = 0;
+const size_t RX_MIDBAND = 1;
+const size_t RX_HIGHBAND = 2;
- size_t map_tx_band(const tx_band band)
- {
- if (band == tx_band::LOWBAND) {
- return TX_LOWBAND;
- }
- return TX_HIGHBAND;
+size_t map_tx_band(const tx_band band)
+{
+ if (band == tx_band::LOWBAND) {
+ return TX_LOWBAND;
}
+ return TX_HIGHBAND;
+}
- size_t map_rx_band(const rx_band band)
- {
- if (band == rx_band::LOWBAND) {
- return RX_LOWBAND;
- }
- if (band == rx_band::BAND0 or
- band == rx_band::BAND1 or
- band == rx_band::BAND2 or
- band == rx_band::BAND3) {
- return RX_MIDBAND;
- }
- return RX_HIGHBAND;
+size_t map_rx_band(const rx_band band)
+{
+ if (band == rx_band::LOWBAND) {
+ return RX_LOWBAND;
+ }
+ if (band == rx_band::BAND0 or band == rx_band::BAND1 or band == rx_band::BAND2
+ or band == rx_band::BAND3) {
+ return RX_MIDBAND;
}
+ return RX_HIGHBAND;
+}
- //! Maps gain index -> gain_tuple_t
- //
- // Note: This is an int, for easier lookups. We're basically hardcoding the
- // knowledge that the gain map has a 1 dB granularity.
- using gain_tuple_map_t = std::map<int, gain_tuple_t>;
+//! Maps gain index -> gain_tuple_t
+//
+// Note: This is an int, for easier lookups. We're basically hardcoding the
+// knowledge that the gain map has a 1 dB granularity.
+using gain_tuple_map_t = std::map<int, gain_tuple_t>;
- //! Maps band -> gain_tuple_map_t
- using gain_tables_t = std::map<size_t, gain_tuple_map_t>;
+//! Maps band -> gain_tuple_map_t
+using gain_tables_t = std::map<size_t, gain_tuple_map_t>;
- // clang-format off
+// clang-format off
/*! RX gain tables
*/
const gain_tables_t rx_gain_tables = {
@@ -437,53 +435,38 @@ namespace {
{65, {0, 0, false}}
}}
}; /* tx_gain_tables */
- // clang-format on
+// clang-format on
- gain_tuple_t fine_tune_ad9371_att(
- const gain_tuple_t gain_tuple,
- const double gain_index
- ) {
- // Here, we hardcode the half-dB steps. We soak up all half-dB
- // steps by twiddling the AD9371 attenuation, but we need to make
- // sure we don't make it negative.
- if (gain_index - int(gain_index) >= .5) {
- gain_tuple_t gt2 = gain_tuple;
- gt2.ad9371_att = std::max(0.0, gain_tuple.ad9371_att - .5);
- return gt2;
- }
- return gain_tuple;
+gain_tuple_t fine_tune_ad9371_att(const gain_tuple_t gain_tuple, const double gain_index)
+{
+ // Here, we hardcode the half-dB steps. We soak up all half-dB
+ // steps by twiddling the AD9371 attenuation, but we need to make
+ // sure we don't make it negative.
+ if (gain_index - int(gain_index) >= .5) {
+ gain_tuple_t gt2 = gain_tuple;
+ gt2.ad9371_att = std::max(0.0, gain_tuple.ad9371_att - .5);
+ return gt2;
}
+ return gain_tuple;
+}
-} /* namespace ANON */
+} // namespace
gain_tuple_t magnesium::get_rx_gain_tuple(
- const double gain_index,
- const magnesium_radio_ctrl_impl::rx_band band
-) {
- UHD_ASSERT_THROW(
- gain_index <= ALL_RX_MAX_GAIN and gain_index >= ALL_RX_MIN_GAIN
- );
- auto &gain_table = rx_gain_tables.at(map_rx_band(band));
+ const double gain_index, const magnesium_radio_ctrl_impl::rx_band band)
+{
+ UHD_ASSERT_THROW(gain_index <= ALL_RX_MAX_GAIN and gain_index >= ALL_RX_MIN_GAIN);
+ auto& gain_table = rx_gain_tables.at(map_rx_band(band));
const int gain_index_truncd = int(gain_index);
- return fine_tune_ad9371_att(
- gain_table.at(gain_index_truncd),
- gain_index
- );
+ return fine_tune_ad9371_att(gain_table.at(gain_index_truncd), gain_index);
}
gain_tuple_t magnesium::get_tx_gain_tuple(
- const double gain_index,
- const magnesium_radio_ctrl_impl::tx_band band
-) {
- UHD_ASSERT_THROW(
- gain_index <= ALL_TX_MAX_GAIN and gain_index >= ALL_TX_MIN_GAIN
- );
- auto &gain_table = tx_gain_tables.at(map_tx_band(band));
+ const double gain_index, const magnesium_radio_ctrl_impl::tx_band band)
+{
+ UHD_ASSERT_THROW(gain_index <= ALL_TX_MAX_GAIN and gain_index >= ALL_TX_MIN_GAIN);
+ auto& gain_table = tx_gain_tables.at(map_tx_band(band));
const int gain_index_truncd = int(gain_index);
- return fine_tune_ad9371_att(
- gain_table.at(gain_index_truncd),
- gain_index
- );
+ return fine_tune_ad9371_att(gain_table.at(gain_index_truncd), gain_index);
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
index e36bdd59c..8769b44ac 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_gain_table.hpp
@@ -31,16 +31,12 @@ struct gain_tuple_t
/*! Given a gain index, return a tuple of gain-related settings (Rx)
*/
gain_tuple_t get_rx_gain_tuple(
- const double gain_index,
- const uhd::rfnoc::magnesium_radio_ctrl_impl::rx_band band_
-);
+ const double gain_index, const uhd::rfnoc::magnesium_radio_ctrl_impl::rx_band band_);
/*! Given a gain index, return a tuple of gain-related settings (Tx)
*/
gain_tuple_t get_tx_gain_tuple(
- const double gain_index,
- const uhd::rfnoc::magnesium_radio_ctrl_impl::tx_band band_
-);
+ const double gain_index, const uhd::rfnoc::magnesium_radio_ctrl_impl::tx_band band_);
} /* namespace magnesium */
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp
index 9ddb2cfcb..3c66a3b62 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_cpld.cpp
@@ -4,37 +4,32 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "magnesium_radio_ctrl_impl.hpp"
-#include "magnesium_cpld_ctrl.hpp"
#include "magnesium_constants.hpp"
+#include "magnesium_cpld_ctrl.hpp"
+#include "magnesium_radio_ctrl_impl.hpp"
#include <uhd/utils/log.hpp>
using namespace uhd;
using namespace uhd::usrp;
using namespace uhd::rfnoc;
-void magnesium_radio_ctrl_impl::_identify_with_leds(
- const int identify_duration
-) {
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::seconds(identify_duration);
+void magnesium_radio_ctrl_impl::_identify_with_leds(const int identify_duration)
+{
+ auto end_time =
+ std::chrono::steady_clock::now() + std::chrono::seconds(identify_duration);
bool led_state = true;
while (std::chrono::steady_clock::now() < end_time) {
- _cpld->set_tx_atr_bits(
- magnesium_cpld_ctrl::BOTH,
+ _cpld->set_tx_atr_bits(magnesium_cpld_ctrl::BOTH,
magnesium_cpld_ctrl::ANY,
led_state,
false,
false,
- true
- );
- _cpld->set_rx_input_atr_bits(
- magnesium_cpld_ctrl::BOTH,
+ true);
+ _cpld->set_rx_input_atr_bits(magnesium_cpld_ctrl::BOTH,
magnesium_cpld_ctrl::ANY,
magnesium_cpld_ctrl::RX_SW1_TXRXINPUT, /* whatever */
led_state,
- led_state
- );
+ led_state);
led_state = !led_state;
std::this_thread::sleep_for(std::chrono::milliseconds(500));
}
@@ -44,27 +39,26 @@ void magnesium_radio_ctrl_impl::_identify_with_leds(
void magnesium_radio_ctrl_impl::_update_atr_switches(
const magnesium_cpld_ctrl::chan_sel_t chan,
const direction_t dir,
- const std::string &ant
-){
+ const std::string& ant)
+{
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
// These default values work for RX2
bool trx_led = false;
bool rx2_led = true;
- auto rx_sw1 = magnesium_cpld_ctrl::RX_SW1_RX2INPUT;
+ auto rx_sw1 = magnesium_cpld_ctrl::RX_SW1_RX2INPUT;
// The TRX switch in TX-idle mode defaults to TX-on mode. When TX is
// off, and we're receiving on TX/RX however, we need to point TRX to
// RX SW1. In all other cases, a TX state toggle (on to idle or vice
// versa) won't trigger a change of the TRX switch.
auto sw_trx = _sw_trx[chan];
- UHD_LOG_TRACE(unique_id(),
- "Updating all RX-ATR related switches for antenna==" << ant);
+ UHD_LOG_TRACE(
+ unique_id(), "Updating all RX-ATR related switches for antenna==" << ant);
if (ant == "TX/RX") {
- rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TRXSWITCHOUTPUT;
- sw_trx = magnesium_cpld_ctrl::SW_TRX_RXCHANNELPATH;
+ rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TRXSWITCHOUTPUT;
+ sw_trx = magnesium_cpld_ctrl::SW_TRX_RXCHANNELPATH;
trx_led = true;
rx2_led = false;
- }
- else if (ant == "CAL") {
+ } else if (ant == "CAL") {
// It makes intuitive sense to illuminate the green TX/RX LED when
// receiving on CAL (because it goes over to the TX/RX port), but
// the problem is that CAL is only useful when we're both TXing and
@@ -72,35 +66,30 @@ void magnesium_radio_ctrl_impl::_update_atr_switches(
// So, for CAL, we light up the green RX2 LED.
trx_led = false;
rx2_led = true;
- rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TXRXINPUT;
- }
- else if (ant == "LOCAL") {
+ rx_sw1 = magnesium_cpld_ctrl::RX_SW1_TXRXINPUT;
+ } else if (ant == "LOCAL") {
rx_sw1 = magnesium_cpld_ctrl::RX_SW1_RXLOCALINPUT;
}
- _cpld->set_rx_input_atr_bits(
- chan,
+ _cpld->set_rx_input_atr_bits(chan,
magnesium_cpld_ctrl::ON,
rx_sw1,
trx_led,
rx2_led,
true /* defer commit */
);
- _cpld->set_rx_atr_bits(
- chan,
+ _cpld->set_rx_atr_bits(chan,
magnesium_cpld_ctrl::ON,
- true, /* amp on */
- true, /* mykonos on */
- true /* defer commit */
+ true, /* amp on */
+ true, /* mykonos on */
+ true /* defer commit */
);
- _cpld->set_rx_atr_bits(
- chan,
+ _cpld->set_rx_atr_bits(chan,
magnesium_cpld_ctrl::IDLE,
- true, /* amp stays on */
- true, /* mykonos on */
- true /* defer commit */
+ true, /* amp stays on */
+ true, /* mykonos on */
+ true /* defer commit */
);
- _cpld->set_trx_sw_atr_bits(
- chan,
+ _cpld->set_trx_sw_atr_bits(chan,
magnesium_cpld_ctrl::IDLE, /* idle here means TX is off */
sw_trx,
false /* don't defer commit */
@@ -108,220 +97,203 @@ void magnesium_radio_ctrl_impl::_update_atr_switches(
}
if (dir == TX_DIRECTION or dir == DX_DIRECTION) {
UHD_LOG_TRACE(unique_id(), "Updating all TX-ATR related switches...");
- _cpld->set_tx_atr_bits(
- chan,
+ _cpld->set_tx_atr_bits(chan,
magnesium_cpld_ctrl::ON,
true, /* LED on */
true, /* PA on */
true, /* AMP on */
true, /* Myk on */
- true /* defer commit */
+ true /* defer commit */
);
// Leaving PA on since we want shorter tx settling time.
- _cpld->set_tx_atr_bits(
- chan,
+ _cpld->set_tx_atr_bits(chan,
magnesium_cpld_ctrl::IDLE,
false, /* LED off */
true, /* PA on */
true, /* AMP on */
- true, /* Myk on */
- false /* don't defer commit */
+ true, /* Myk on */
+ false /* don't defer commit */
);
};
}
-void magnesium_radio_ctrl_impl::_update_rx_freq_switches(
- const double freq,
+void magnesium_radio_ctrl_impl::_update_rx_freq_switches(const double freq,
const bool bypass_lnas,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
-) {
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel)
+{
UHD_LOG_TRACE(unique_id(),
- "Update all RX freq related switches. f=" << freq << " Hz, "
- "bypass LNAS: " << (bypass_lnas ? "Yes" : "No") << ", chan=" << chan_sel
- );
- auto rx_sw2 = magnesium_cpld_ctrl::RX_SW2_BYPASSPATHTOSWITCH6;
- auto rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
- auto rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
- auto rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
- auto rx_sw6 = magnesium_cpld_ctrl::RX_SW6_BYPASSPATHFROMSWITCH2;
- const auto band = _map_freq_to_rx_band(freq);
+ "Update all RX freq related switches. f=" << freq
+ << " Hz, "
+ "bypass LNAS: "
+ << (bypass_lnas ? "Yes" : "No")
+ << ", chan=" << chan_sel);
+ auto rx_sw2 = magnesium_cpld_ctrl::RX_SW2_BYPASSPATHTOSWITCH6;
+ auto rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
+ auto rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
+ auto rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
+ auto rx_sw6 = magnesium_cpld_ctrl::RX_SW6_BYPASSPATHFROMSWITCH2;
+ const auto band = _map_freq_to_rx_band(freq);
const bool is_lowband = (band == rx_band::LOWBAND);
- const auto select_lowband_mixer_path = is_lowband ?
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND :
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
+ const auto select_lowband_mixer_path =
+ is_lowband ? magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND
+ : magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
const bool enable_lowband_mixer = is_lowband;
const bool rx_lna1_enable =
- not bypass_lnas and (
- band == rx_band::BAND4 or
- band == rx_band::BAND5 or
- band == rx_band::BAND6);
+ not bypass_lnas
+ and (band == rx_band::BAND4 or band == rx_band::BAND5 or band == rx_band::BAND6);
const bool rx_lna2_enable = not bypass_lnas and not rx_lna1_enable;
UHD_LOG_TRACE(unique_id(),
- " Enabling LNA1: " << (rx_lna1_enable ? "Yes" : "No") <<
- " Enabling LNA2: " << (rx_lna2_enable ? "Yes" : "No"));
+ " Enabling LNA1: " << (rx_lna1_enable ? "Yes" : "No")
+ << " Enabling LNA2: " << (rx_lna2_enable ? "Yes" : "No"));
// All the defaults are OK when using the bypass path.
if (not bypass_lnas) {
- switch(band) {
- case rx_band::LOWBAND:
- case rx_band::BAND0:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0490LPMHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0490LPMHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND1:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0440X0530MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND2:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0650X1000MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0650X1000MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND3:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1100X1575MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
- break;
- case rx_band::BAND4:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1600X2250MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER1600X2250MHZFROM;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
- break;
- case rx_band::BAND5:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER2100X2850MHZ;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
- break;
- case rx_band::BAND6:
- rx_sw2 = magnesium_cpld_ctrl::RX_SW2_UPPERFILTERBANKTOSWITCH4;
- rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
- rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
- rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
- rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
- break;
- case rx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map RX frequency to band: " << freq);
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ switch (band) {
+ case rx_band::LOWBAND:
+ case rx_band::BAND0:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0490LPMHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0490LPMHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND1:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0440X0530MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND2:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER0650X1000MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0650X1000MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND3:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1100X1575MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER1100X1575MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_LOWERFILTERBANKFROMSWITCH5;
+ break;
+ case rx_band::BAND4:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER1600X2250MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER1600X2250MHZFROM;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
+ break;
+ case rx_band::BAND5:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_LOWERFILTERBANKTOSWITCH3;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_FILTER2100X2850MHZ;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2100X2850MHZFROM;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
+ break;
+ case rx_band::BAND6:
+ rx_sw2 = magnesium_cpld_ctrl::RX_SW2_UPPERFILTERBANKTOSWITCH4;
+ rx_sw3 = magnesium_cpld_ctrl::RX_SW3_SHUTDOWNSW3;
+ rx_sw4 = magnesium_cpld_ctrl::RX_SW4_FILTER2700HPMHZ;
+ rx_sw5 = magnesium_cpld_ctrl::RX_SW5_FILTER0440X0530MHZFROM;
+ rx_sw6 = magnesium_cpld_ctrl::RX_SW6_UPPERFILTERBANKFROMSWITCH4;
+ break;
+ case rx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map RX frequency to band: " << freq);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
- _cpld->set_rx_lna_atr_bits(
- chan_sel,
+ _cpld->set_rx_lna_atr_bits(chan_sel,
magnesium_cpld_ctrl::ANY,
rx_lna1_enable,
rx_lna2_enable,
true /* defer commit */
);
- _cpld->set_rx_switches(
- chan_sel,
+ _cpld->set_rx_switches(chan_sel,
rx_sw2,
rx_sw3,
rx_sw4,
rx_sw5,
rx_sw6,
select_lowband_mixer_path,
- enable_lowband_mixer
- );
+ enable_lowband_mixer);
}
-void magnesium_radio_ctrl_impl::_update_tx_freq_switches(
- const double freq,
+void magnesium_radio_ctrl_impl::_update_tx_freq_switches(const double freq,
const bool bypass_amp,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
-){
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel)
+{
UHD_LOG_TRACE(unique_id(),
- "Update all TX freq related switches. f=" << freq << " Hz, "
- "bypass amp: " << (bypass_amp ? "Yes" : "No") << ", chan=" << chan_sel
- );
- auto tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
- auto tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
- auto tx_sw3 = magnesium_cpld_ctrl::TX_SW3_BYPASSPATHTOTRXSW;
- const auto band = _map_freq_to_tx_band(freq);
+ "Update all TX freq related switches. f=" << freq
+ << " Hz, "
+ "bypass amp: "
+ << (bypass_amp ? "Yes" : "No")
+ << ", chan=" << chan_sel);
+ auto tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
+ auto tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
+ auto tx_sw3 = magnesium_cpld_ctrl::TX_SW3_BYPASSPATHTOTRXSW;
+ const auto band = _map_freq_to_tx_band(freq);
const bool is_lowband = (band == tx_band::LOWBAND);
- const auto select_lowband_mixer_path = is_lowband ?
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND :
- magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
+ const auto select_lowband_mixer_path =
+ is_lowband ? magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_LOBAND
+ : magnesium_cpld_ctrl::LOWBAND_MIXER_PATH_SEL_BYPASS;
const bool enable_lowband_mixer = is_lowband;
// Defaults are fine for bypassing the amp stage
if (bypass_amp) {
_sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_BYPASSPATHTOTXSW3;
} else {
- // Set filters based on frequency
- switch(band) {
- case tx_band::LOWBAND:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND0:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND1:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP1700MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP1700MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND2:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP3400MHZ;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP3400MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::BAND3:
- _sw_trx[chan_sel] =
- magnesium_cpld_ctrl::SW_TRX_FROMTXUPPERFILTERBANKLP6400MHZ;
- tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
- tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
- tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
- break;
- case tx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map TX frequency to band: " << freq);
- break;
- default:
- UHD_THROW_INVALID_CODE_PATH();
+ // Set filters based on frequency
+ switch (band) {
+ case tx_band::LOWBAND:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND0:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP0800MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP0800MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND1:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP1700MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP1700MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND2:
+ _sw_trx[chan_sel] = magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_FROMTXFILTERLP3400MHZ;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP3400MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::BAND3:
+ _sw_trx[chan_sel] =
+ magnesium_cpld_ctrl::SW_TRX_FROMTXUPPERFILTERBANKLP6400MHZ;
+ tx_sw1 = magnesium_cpld_ctrl::TX_SW1_SHUTDOWNTXSW1;
+ tx_sw2 = magnesium_cpld_ctrl::TX_SW2_TOTXFILTERLP6400MHZ;
+ tx_sw3 = magnesium_cpld_ctrl::TX_SW3_TOTXFILTERBANKS;
+ break;
+ case tx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map TX frequency to band: " << freq);
+ break;
+ default:
+ UHD_THROW_INVALID_CODE_PATH();
}
}
_cpld->set_trx_sw_atr_bits(
- chan_sel,
- magnesium_cpld_ctrl::ON,
- _sw_trx[chan_sel],
- true /* defer commit */
+ chan_sel, magnesium_cpld_ctrl::ON, _sw_trx[chan_sel], true /* defer commit */
);
- _cpld->set_tx_switches(
- chan_sel,
+ _cpld->set_tx_switches(chan_sel,
tx_sw1,
tx_sw2,
tx_sw3,
select_lowband_mixer_path,
enable_lowband_mixer,
- magnesium_cpld_ctrl::ON
- );
+ magnesium_cpld_ctrl::ON);
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp
index e58e1706e..1370fde3a 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_gain.cpp
@@ -4,9 +4,9 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "magnesium_radio_ctrl_impl.hpp"
-#include "magnesium_gain_table.hpp"
#include "magnesium_constants.hpp"
+#include "magnesium_gain_table.hpp"
+#include "magnesium_radio_ctrl_impl.hpp"
#include <uhd/utils/log.hpp>
using namespace uhd;
@@ -15,72 +15,69 @@ using namespace uhd::rfnoc;
using namespace magnesium;
double magnesium_radio_ctrl_impl::_set_all_gain(
- const double gain,
- const double freq,
- const size_t chan,
- const direction_t dir
-) {
+ const double gain, const double freq, const size_t chan, const direction_t dir)
+{
UHD_LOG_TRACE(unique_id(),
- __func__ << "(gain=" << gain << "dB, "
- "freq=" << freq << " Hz, "
- "chan=" << chan << ", "
- "dir=" << dir);
+ __func__ << "(gain=" << gain
+ << "dB, "
+ "freq="
+ << freq
+ << " Hz, "
+ "chan="
+ << chan
+ << ", "
+ "dir="
+ << dir);
const size_t ad9371_chan = chan;
- auto chan_sel = static_cast<magnesium_cpld_ctrl::chan_sel_t>(chan);
- gain_tuple_t gain_tuple = (dir == RX_DIRECTION) ?
- get_rx_gain_tuple(gain, _map_freq_to_rx_band(freq)):
- get_tx_gain_tuple(gain, _map_freq_to_tx_band(freq));
+ auto chan_sel = static_cast<magnesium_cpld_ctrl::chan_sel_t>(chan);
+ gain_tuple_t gain_tuple = (dir == RX_DIRECTION)
+ ? get_rx_gain_tuple(gain, _map_freq_to_rx_band(freq))
+ : get_tx_gain_tuple(gain, _map_freq_to_tx_band(freq));
- if (_gain_profile[dir] == "manual"){
+ if (_gain_profile[dir] == "manual") {
UHD_LOG_TRACE(unique_id(), "Manual gain mode. Getting gain from property tree.");
- gain_tuple = {
- DSA_MAX_GAIN - _dsa_att[dir],
- ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN) - _ad9371_att[dir],
+ gain_tuple = {DSA_MAX_GAIN - _dsa_att[dir],
+ ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
+ - _ad9371_att[dir],
_amp_bypass[dir]};
- }else if (_gain_profile[dir] == "default"){
+ } else if (_gain_profile[dir] == "default") {
UHD_LOG_TRACE(unique_id(), "Getting gain from gain table.");
- }else {
- UHD_LOG_ERROR(unique_id(), "Unsupported gain mode: " << _gain_profile[dir])
+ } else {
+ UHD_LOG_ERROR(unique_id(), "Unsupported gain mode: " << _gain_profile[dir])
}
const double ad9371_gain =
- ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
+ ((dir == RX_DIRECTION) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN)
- gain_tuple.ad9371_att;
UHD_LOG_TRACE(unique_id(),
- "AD9371 attenuation==" << gain_tuple.ad9371_att << " dB, "
- "AD9371 gain==" << ad9371_gain << " dB, "
- "DSA attenuation == " << gain_tuple.dsa_att << " dB."
- );
+ "AD9371 attenuation==" << gain_tuple.ad9371_att
+ << " dB, "
+ "AD9371 gain=="
+ << ad9371_gain
+ << " dB, "
+ "DSA attenuation == "
+ << gain_tuple.dsa_att << " dB.");
_ad9371->set_gain(ad9371_gain, ad9371_chan, dir);
_dsa_set_att(gain_tuple.dsa_att, chan, dir);
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
- _all_rx_gain = gain;
+ _all_rx_gain = gain;
_rx_bypass_lnas = gain_tuple.bypass;
- _update_rx_freq_switches(
- this->get_rx_frequency(chan),
- _rx_bypass_lnas,
- chan_sel
- );
+ _update_rx_freq_switches(this->get_rx_frequency(chan), _rx_bypass_lnas, chan_sel);
}
if (dir == TX_DIRECTION or dir == DX_DIRECTION) {
- _all_tx_gain = gain;
+ _all_tx_gain = gain;
_tx_bypass_amp = gain_tuple.bypass;
- _update_tx_freq_switches(
- this->get_tx_frequency(chan),
- _tx_bypass_amp,
- chan_sel
- );
+ _update_tx_freq_switches(this->get_tx_frequency(chan), _tx_bypass_amp, chan_sel);
}
return gain;
}
double magnesium_radio_ctrl_impl::_get_all_gain(
- const size_t /* chan */,
- const direction_t dir
-) {
+ const size_t /* chan */, const direction_t dir)
+{
UHD_LOG_TRACE(unique_id(), "Getting all gain ");
if (dir == RX_DIRECTION) {
- return _all_rx_gain;
+ return _all_rx_gain;
}
return _all_tx_gain;
}
@@ -89,14 +86,12 @@ double magnesium_radio_ctrl_impl::_get_all_gain(
* DSA Controls
*****************************************************************************/
double magnesium_radio_ctrl_impl::_dsa_set_att(
- const double att,
- const size_t chan,
- const direction_t dir
-) {
+ const double att, const size_t chan, const direction_t dir)
+{
UHD_LOG_TRACE(unique_id(),
- __func__ <<
- "(att=" << "att dB, chan=" << chan << ", dir=" << dir << ")")
- const uint32_t dsa_val = 2*att;
+ __func__ << "(att="
+ << "att dB, chan=" << chan << ", dir=" << dir << ")")
+ const uint32_t dsa_val = 2 * att;
_set_dsa_val(chan, dir, dsa_val);
if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
@@ -109,33 +104,29 @@ double magnesium_radio_ctrl_impl::_dsa_set_att(
}
double magnesium_radio_ctrl_impl::_dsa_get_att(
- const size_t /*chan*/,
- const direction_t dir
-) {
+ const size_t /*chan*/, const direction_t dir)
+{
if (dir == RX_DIRECTION) {
- return _dsa_rx_att;
+ return _dsa_rx_att;
}
return _dsa_tx_att;
}
void magnesium_radio_ctrl_impl::_set_dsa_val(
- const size_t chan,
- const direction_t dir,
- const uint32_t dsa_val
-) {
+ const size_t chan, const direction_t dir, const uint32_t dsa_val)
+{
// The DSA register holds 12 bits. The lower 6 bits are for RX, the upper
// 6 bits are for TX.
- if (dir == RX_DIRECTION or dir == DX_DIRECTION){
+ if (dir == RX_DIRECTION or dir == DX_DIRECTION) {
UHD_LOG_TRACE(unique_id(),
__func__ << "(chan=" << chan << ", dir=RX"
- << ", dsa_val=" << dsa_val << ")")
+ << ", dsa_val=" << dsa_val << ")")
_gpio[chan]->set_gpio_out(dsa_val, 0x003F);
}
- if (dir == TX_DIRECTION or dir == DX_DIRECTION){
+ if (dir == TX_DIRECTION or dir == DX_DIRECTION) {
UHD_LOG_TRACE(unique_id(),
__func__ << "(chan=" << chan << ", dir=TX"
- << ", dsa_val=" << dsa_val << ")")
- _gpio[chan]->set_gpio_out(dsa_val<<6, 0x0FC0);
+ << ", dsa_val=" << dsa_val << ")")
+ _gpio[chan]->set_gpio_out(dsa_val << 6, 0x0FC0);
}
}
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
index 952cebdf8..c216b0777 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
@@ -7,20 +7,20 @@
#include "magnesium_radio_ctrl_impl.hpp"
#include "magnesium_constants.hpp"
#include "magnesium_gain_table.hpp"
-#include <uhd/utils/log.hpp>
+#include <uhd/exception.hpp>
#include <uhd/rfnoc/node_ctrl_base.hpp>
#include <uhd/transport/chdr.hpp>
-#include <uhd/utils/algorithm.hpp>
-#include <uhd/utils/math.hpp>
#include <uhd/types/direction.hpp>
#include <uhd/types/eeprom.hpp>
-#include <uhd/exception.hpp>
+#include <uhd/utils/algorithm.hpp>
+#include <uhd/utils/log.hpp>
+#include <uhd/utils/math.hpp>
#include <boost/algorithm/string.hpp>
-#include <boost/make_shared.hpp>
#include <boost/format.hpp>
-#include <sstream>
+#include <boost/make_shared.hpp>
#include <cmath>
#include <cstdlib>
+#include <sstream>
using namespace uhd;
using namespace uhd::usrp;
@@ -28,76 +28,69 @@ using namespace uhd::rfnoc;
using namespace uhd::math::fp_compare;
namespace {
- /**************************************************************************
- * ADF4351 Controls
- *************************************************************************/
- /*!
- * \param lo_iface Reference to the LO object
- * \param freq Frequency (in Hz) of the tone to be generated from the LO
- * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
- * PLL input of the LO
- * \param int_n_mode Integer-N mode on or off
- */
- double _lo_set_frequency(
- adf435x_iface::sptr lo_iface,
- const double freq,
- const double ref_clock_freq,
- const bool int_n_mode
- ) {
- UHD_LOG_TRACE("MG/ADF4351",
- "Attempting to tune low band LO to " << freq <<
- " Hz with ref clock freq " << ref_clock_freq);
- lo_iface->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
- lo_iface->set_reference_freq(ref_clock_freq);
- lo_iface->set_prescaler(adf435x_iface::PRESCALER_4_5);
- const double actual_freq = lo_iface->set_frequency(freq, int_n_mode);
- lo_iface->set_output_power(
- adf435x_iface::RF_OUTPUT_A,
- adf435x_iface::OUTPUT_POWER_2DBM
- );
- lo_iface->set_output_power(
- adf435x_iface::RF_OUTPUT_B,
- adf435x_iface::OUTPUT_POWER_2DBM
- );
- lo_iface->set_charge_pump_current(
- adf435x_iface::CHARGE_PUMP_CURRENT_0_31MA);
- return actual_freq;
- }
-
- /*! Configure and enable LO
- *
- * Will tune it to requested frequency and enable outputs.
- *
- * \param lo_iface Reference to the LO object
- * \param lo_freq Frequency (in Hz) of the tone to be generated from the LO
- * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
- * PLL input of the LO
- * \param int_n_mode Integer-N mode on or off
- * \returns the actual frequency the LO is running at
- */
- double _lo_enable(
- adf435x_iface::sptr lo_iface,
- const double lo_freq,
- const double ref_clock_freq,
- const bool int_n_mode
- ) {
- const double actual_lo_freq =
- _lo_set_frequency(lo_iface, lo_freq, ref_clock_freq, int_n_mode);
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, true);
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, true);
- lo_iface->commit();
- return actual_lo_freq;
- }
+/**************************************************************************
+ * ADF4351 Controls
+ *************************************************************************/
+/*!
+ * \param lo_iface Reference to the LO object
+ * \param freq Frequency (in Hz) of the tone to be generated from the LO
+ * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
+ * PLL input of the LO
+ * \param int_n_mode Integer-N mode on or off
+ */
+double _lo_set_frequency(adf435x_iface::sptr lo_iface,
+ const double freq,
+ const double ref_clock_freq,
+ const bool int_n_mode)
+{
+ UHD_LOG_TRACE("MG/ADF4351",
+ "Attempting to tune low band LO to " << freq << " Hz with ref clock freq "
+ << ref_clock_freq);
+ lo_iface->set_feedback_select(adf435x_iface::FB_SEL_DIVIDED);
+ lo_iface->set_reference_freq(ref_clock_freq);
+ lo_iface->set_prescaler(adf435x_iface::PRESCALER_4_5);
+ const double actual_freq = lo_iface->set_frequency(freq, int_n_mode);
+ lo_iface->set_output_power(
+ adf435x_iface::RF_OUTPUT_A, adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_output_power(
+ adf435x_iface::RF_OUTPUT_B, adf435x_iface::OUTPUT_POWER_2DBM);
+ lo_iface->set_charge_pump_current(adf435x_iface::CHARGE_PUMP_CURRENT_0_31MA);
+ return actual_freq;
+}
+
+/*! Configure and enable LO
+ *
+ * Will tune it to requested frequency and enable outputs.
+ *
+ * \param lo_iface Reference to the LO object
+ * \param lo_freq Frequency (in Hz) of the tone to be generated from the LO
+ * \param ref_clock_freq Frequency (in Hz) of the reference clock at the
+ * PLL input of the LO
+ * \param int_n_mode Integer-N mode on or off
+ * \returns the actual frequency the LO is running at
+ */
+double _lo_enable(adf435x_iface::sptr lo_iface,
+ const double lo_freq,
+ const double ref_clock_freq,
+ const bool int_n_mode)
+{
+ const double actual_lo_freq =
+ _lo_set_frequency(lo_iface, lo_freq, ref_clock_freq, int_n_mode);
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, true);
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, true);
+ lo_iface->commit();
+ return actual_lo_freq;
+}
- /*! Disable LO
- */
- void _lo_disable(adf435x_iface::sptr lo_iface)
- {
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, false);
- lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, false);
- lo_iface->commit();
- }
+/*! Disable LO
+ */
+void _lo_disable(adf435x_iface::sptr lo_iface)
+{
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_A, false);
+ lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, false);
+ lo_iface->commit();
}
+} // namespace
/******************************************************************************
@@ -107,10 +100,9 @@ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(magnesium_radio_ctrl)
{
UHD_LOG_TRACE(unique_id(), "Entering magnesium_radio_ctrl_impl ctor...");
const char radio_slot_name[2] = {'A', 'B'};
- _radio_slot = radio_slot_name[get_block_id().get_block_count()];
+ _radio_slot = radio_slot_name[get_block_id().get_block_count()];
UHD_LOG_TRACE(unique_id(), "Radio slot: " << _radio_slot);
- _rpc_prefix =
- (_radio_slot == "A") ? "db_0_" : "db_1_";
+ _rpc_prefix = (_radio_slot == "A") ? "db_0_" : "db_1_";
_init_defaults();
_init_peripherals();
@@ -135,17 +127,16 @@ double magnesium_radio_ctrl_impl::set_rate(double requested_rate)
const double rate = rates.clip(requested_rate);
if (!math::frequencies_are_equal(requested_rate, rate)) {
- UHD_LOG_WARNING(unique_id(),
- "Coercing requested sample rate from " << (requested_rate/1e6) <<
- " to " << (rate/1e6)
- );
+ UHD_LOG_WARNING(unique_id(),
+ "Coercing requested sample rate from " << (requested_rate / 1e6) << " to "
+ << (rate / 1e6));
}
const double current_rate = get_rate();
if (math::frequencies_are_equal(current_rate, rate)) {
- UHD_LOG_DEBUG(unique_id(),
- "Rate is already at " << rate << ". Skipping set_rate()");
- return current_rate;
+ UHD_LOG_DEBUG(
+ unique_id(), "Rate is already at " << rate << ". Skipping set_rate()");
+ return current_rate;
}
std::lock_guard<std::mutex> l(_set_lock);
@@ -159,84 +150,72 @@ double magnesium_radio_ctrl_impl::set_rate(double requested_rate)
set_tx_frequency(get_tx_frequency(0), 0);
// Gain and bandwidth need to be looped:
for (size_t radio_idx = 0; radio_idx < _get_num_radios(); radio_idx++) {
- set_rx_gain(get_rx_gain(radio_idx), radio_idx);
- set_tx_gain(get_rx_gain(radio_idx), radio_idx);
- set_rx_bandwidth(get_rx_bandwidth(radio_idx), radio_idx);
- set_tx_bandwidth(get_tx_bandwidth(radio_idx), radio_idx);
+ set_rx_gain(get_rx_gain(radio_idx), radio_idx);
+ set_tx_gain(get_rx_gain(radio_idx), radio_idx);
+ set_rx_bandwidth(get_rx_bandwidth(radio_idx), radio_idx);
+ set_tx_bandwidth(get_tx_bandwidth(radio_idx), radio_idx);
}
radio_ctrl_impl::set_rate(new_rate);
return new_rate;
}
-void magnesium_radio_ctrl_impl::set_tx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void magnesium_radio_ctrl_impl::set_tx_antenna(const std::string& ant, const size_t chan)
+{
if (ant != get_tx_antenna(chan)) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid TX antenna value: %s")
- % unique_id()
- % ant
- ));
+ throw uhd::value_error(
+ str(boost::format("[%s] Requesting invalid TX antenna value: %s")
+ % unique_id() % ant));
}
// We can't actually set the TX antenna, so let's stop here.
}
-void magnesium_radio_ctrl_impl::set_rx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void magnesium_radio_ctrl_impl::set_rx_antenna(const std::string& ant, const size_t chan)
+{
UHD_ASSERT_THROW(chan <= MAGNESIUM_NUM_CHANS);
- if (std::find(MAGNESIUM_RX_ANTENNAS.begin(),
- MAGNESIUM_RX_ANTENNAS.end(),
- ant) == MAGNESIUM_RX_ANTENNAS.end()) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid RX antenna value: %s")
- % unique_id()
- % ant
- ));
- }
- UHD_LOG_TRACE(unique_id(),
- "Setting RX antenna to " << ant << " for chan " << chan);
- magnesium_cpld_ctrl::chan_sel_t chan_sel =
- chan == 0 ? magnesium_cpld_ctrl::CHAN1 : magnesium_cpld_ctrl::CHAN2;
+ if (std::find(MAGNESIUM_RX_ANTENNAS.begin(), MAGNESIUM_RX_ANTENNAS.end(), ant)
+ == MAGNESIUM_RX_ANTENNAS.end()) {
+ throw uhd::value_error(
+ str(boost::format("[%s] Requesting invalid RX antenna value: %s")
+ % unique_id() % ant));
+ }
+ UHD_LOG_TRACE(unique_id(), "Setting RX antenna to " << ant << " for chan " << chan);
+ magnesium_cpld_ctrl::chan_sel_t chan_sel = chan == 0 ? magnesium_cpld_ctrl::CHAN1
+ : magnesium_cpld_ctrl::CHAN2;
_update_atr_switches(chan_sel, RX_DIRECTION, ant);
radio_ctrl_impl::set_rx_antenna(ant, chan);
}
double magnesium_radio_ctrl_impl::set_tx_frequency(
- const double req_freq,
- const size_t chan
-) {
+ const double req_freq, const size_t chan)
+{
const double freq = MAGNESIUM_FREQ_RANGE.clip(req_freq);
- UHD_LOG_TRACE(unique_id(),
- "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
- _desired_rf_freq[TX_DIRECTION]=freq;
+ UHD_LOG_TRACE(unique_id(), "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
+ _desired_rf_freq[TX_DIRECTION] = freq;
std::lock_guard<std::mutex> l(_set_lock);
// We need to set the switches on both channels, because they share an LO.
// This way, if we tune channel 0 it will not put channel 1 into a bad
// state.
_update_tx_freq_switches(freq, _tx_bypass_amp, magnesium_cpld_ctrl::BOTH);
- const std::string ad9371_source = this->get_tx_lo_source(MAGNESIUM_LO1, chan);
+ const std::string ad9371_source = this->get_tx_lo_source(MAGNESIUM_LO1, chan);
const std::string adf4351_source = this->get_tx_lo_source(MAGNESIUM_LO2, chan);
UHD_ASSERT_THROW(adf4351_source == "internal");
double coerced_if_freq = freq;
if (_map_freq_to_tx_band(freq) == tx_band::LOWBAND) {
- _is_low_band[TX_DIRECTION] = true;
+ _is_low_band[TX_DIRECTION] = true;
const double desired_low_freq = MAGNESIUM_TX_IF_FREQ - freq;
coerced_if_freq =
- this->_set_tx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan) + freq;
+ this->_set_tx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan)
+ + freq;
UHD_LOG_TRACE(unique_id(), "coerced_if_freq = " << coerced_if_freq);
} else {
_is_low_band[TX_DIRECTION] = false;
_lo_disable(_tx_lo);
}
// external LO required to tune at 2xdesired_frequency.
- const double desired_if_freq = (ad9371_source == "internal") ?
- coerced_if_freq :
- 2*coerced_if_freq;
+ const double desired_if_freq = (ad9371_source == "internal") ? coerced_if_freq
+ : 2 * coerced_if_freq;
this->_set_tx_lo_freq(ad9371_source, MAGNESIUM_LO1, desired_if_freq, chan);
this->_update_freq(chan, TX_DIRECTION);
@@ -245,81 +224,69 @@ double magnesium_radio_ctrl_impl::set_tx_frequency(
}
void magnesium_radio_ctrl_impl::_update_gain(
- const size_t chan,
- const uhd::direction_t dir
-) {
- const std::string fe =
- (dir == TX_DIRECTION) ? "tx_frontends" : "rx_frontends";
- const double freq = (dir == TX_DIRECTION) ?
- this->get_tx_frequency(chan) :
- this->get_rx_frequency(chan);
+ const size_t chan, const uhd::direction_t dir)
+{
+ const std::string fe = (dir == TX_DIRECTION) ? "tx_frontends" : "rx_frontends";
+ const double freq = (dir == TX_DIRECTION) ? this->get_tx_frequency(chan)
+ : this->get_rx_frequency(chan);
this->_set_all_gain(this->_get_all_gain(chan, dir), freq, chan, dir);
}
void magnesium_radio_ctrl_impl::_update_freq(
- const size_t chan,
- const uhd::direction_t dir
-) {
- const std::string ad9371_source = dir == TX_DIRECTION ?
- this->get_tx_lo_source(MAGNESIUM_LO1, chan) :
- this->get_rx_lo_source(MAGNESIUM_LO1, chan)
- ;
-
- const double ad9371_freq = ad9371_source == "external" ?
- _ad9371_freq[dir]/2 :
- _ad9371_freq[dir]
- ;
- const double rf_freq = _is_low_band[dir] ?
- ad9371_freq - _adf4351_freq[dir] :
- ad9371_freq
- ;
-
- UHD_LOG_TRACE(unique_id(),
- "RF freq = " << rf_freq);
- UHD_ASSERT_THROW(fp_compare_epsilon<double>(rf_freq) >= 0);
- UHD_ASSERT_THROW(
- fp_compare_epsilon<double>(std::abs(rf_freq - _desired_rf_freq[dir])) <= _master_clock_rate/2);
- if (dir == RX_DIRECTION){
+ const size_t chan, const uhd::direction_t dir)
+{
+ const std::string ad9371_source = dir == TX_DIRECTION
+ ? this->get_tx_lo_source(MAGNESIUM_LO1, chan)
+ : this->get_rx_lo_source(MAGNESIUM_LO1, chan);
+
+ const double ad9371_freq = ad9371_source == "external" ? _ad9371_freq[dir] / 2
+ : _ad9371_freq[dir];
+ const double rf_freq = _is_low_band[dir] ? ad9371_freq - _adf4351_freq[dir]
+ : ad9371_freq;
+
+ UHD_LOG_TRACE(unique_id(), "RF freq = " << rf_freq);
+ UHD_ASSERT_THROW(fp_compare_epsilon<double>(rf_freq) >= 0);
+ UHD_ASSERT_THROW(fp_compare_epsilon<double>(std::abs(rf_freq - _desired_rf_freq[dir]))
+ <= _master_clock_rate / 2);
+ if (dir == RX_DIRECTION) {
radio_ctrl_impl::set_rx_frequency(rf_freq, chan);
- }else if (dir == TX_DIRECTION){
+ } else if (dir == TX_DIRECTION) {
radio_ctrl_impl::set_tx_frequency(rf_freq, chan);
- }else{
+ } else {
UHD_THROW_INVALID_CODE_PATH();
}
}
double magnesium_radio_ctrl_impl::set_rx_frequency(
- const double req_freq,
- const size_t chan
-) {
+ const double req_freq, const size_t chan)
+{
const double freq = MAGNESIUM_FREQ_RANGE.clip(req_freq);
- UHD_LOG_TRACE(unique_id(),
- "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
- _desired_rf_freq[RX_DIRECTION]=freq;
+ UHD_LOG_TRACE(unique_id(), "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
+ _desired_rf_freq[RX_DIRECTION] = freq;
std::lock_guard<std::mutex> l(_set_lock);
// We need to set the switches on both channels, because they share an LO.
// This way, if we tune channel 0 it will not put channel 1 into a bad
// state.
_update_rx_freq_switches(freq, _rx_bypass_lnas, magnesium_cpld_ctrl::BOTH);
- const std::string ad9371_source = this->get_rx_lo_source(MAGNESIUM_LO1, chan);
+ const std::string ad9371_source = this->get_rx_lo_source(MAGNESIUM_LO1, chan);
const std::string adf4351_source = this->get_rx_lo_source(MAGNESIUM_LO2, chan);
UHD_ASSERT_THROW(adf4351_source == "internal");
double coerced_if_freq = freq;
if (_map_freq_to_rx_band(freq) == rx_band::LOWBAND) {
- _is_low_band[RX_DIRECTION] = true;
+ _is_low_band[RX_DIRECTION] = true;
const double desired_low_freq = MAGNESIUM_RX_IF_FREQ - freq;
coerced_if_freq =
- this->_set_rx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan) + freq;
+ this->_set_rx_lo_freq(adf4351_source, MAGNESIUM_LO2, desired_low_freq, chan)
+ + freq;
UHD_LOG_TRACE(unique_id(), "coerced_if_freq = " << coerced_if_freq);
} else {
_is_low_band[RX_DIRECTION] = false;
_lo_disable(_rx_lo);
}
// external LO required to tune at 2xdesired_frequency.
- const double desired_if_freq = ad9371_source == "internal" ?
- coerced_if_freq :
- 2*coerced_if_freq;
+ const double desired_if_freq = ad9371_source == "internal" ? coerced_if_freq
+ : 2 * coerced_if_freq;
this->_set_rx_lo_freq(ad9371_source, MAGNESIUM_LO1, desired_if_freq, chan);
@@ -329,25 +296,20 @@ double magnesium_radio_ctrl_impl::set_rx_frequency(
return radio_ctrl_impl::get_rx_frequency(chan);
}
-double magnesium_radio_ctrl_impl::get_tx_frequency(
- const size_t chan)
+double magnesium_radio_ctrl_impl::get_tx_frequency(const size_t chan)
{
- UHD_LOG_TRACE(unique_id(),
- "get_tx_frequency(chan=" << chan << ")");
+ UHD_LOG_TRACE(unique_id(), "get_tx_frequency(chan=" << chan << ")");
return radio_ctrl_impl::get_tx_frequency(chan);
}
-double magnesium_radio_ctrl_impl::get_rx_frequency(
- const size_t chan)
+double magnesium_radio_ctrl_impl::get_rx_frequency(const size_t chan)
{
- UHD_LOG_TRACE(unique_id(),
- "get_rx_frequency(chan=" << chan << ")");
+ UHD_LOG_TRACE(unique_id(), "get_rx_frequency(chan=" << chan << ")");
return radio_ctrl_impl::get_rx_frequency(chan);
}
double magnesium_radio_ctrl_impl::set_rx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+ const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
_ad9371->set_bandwidth(bandwidth, chan, RX_DIRECTION);
// FIXME: setting analog bandwidth on AD9371 take no effect.
@@ -359,9 +321,8 @@ double magnesium_radio_ctrl_impl::set_rx_bandwidth(
}
double magnesium_radio_ctrl_impl::set_tx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+ const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
_ad9371->set_bandwidth(bandwidth, chan, TX_DIRECTION);
// FIXME: setting analog bandwidth on AD9371 take no effect.
@@ -369,182 +330,155 @@ double magnesium_radio_ctrl_impl::set_tx_bandwidth(
UHD_LOG_WARNING(unique_id(),
"set_tx_bandwidth take no effect on AD9371. "
"Default analog bandwidth is 100MHz");
- return AD9371_TX_MAX_BANDWIDTH ;
+ return AD9371_TX_MAX_BANDWIDTH;
}
-double magnesium_radio_ctrl_impl::set_tx_gain(
- const double gain,
- const size_t chan
-) {
+double magnesium_radio_ctrl_impl::set_tx_gain(const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_TRACE(unique_id(),
- "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
- const double coerced_gain = _set_all_gain(
- gain,
- this->get_tx_frequency(chan),
- chan,
- TX_DIRECTION
- );
+ UHD_LOG_TRACE(unique_id(), "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
+ const double coerced_gain =
+ _set_all_gain(gain, this->get_tx_frequency(chan), chan, TX_DIRECTION);
radio_ctrl_impl::set_tx_gain(coerced_gain, chan);
return coerced_gain;
}
double magnesium_radio_ctrl_impl::_set_tx_gain(
- const std::string &name,
- const double gain,
- const size_t chan
-) {
+ const std::string& name, const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(),
"_set_tx_gain(name=" << name << ", gain=" << gain << ", chan=" << chan << ")");
- UHD_LOG_TRACE(unique_id(),
+ UHD_LOG_TRACE(unique_id(),
"_set_tx_gain(name=" << name << ", gain=" << gain << ", chan=" << chan << ")");
double clip_gain = 0;
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
clip_gain = uhd::clip(gain, AD9371_MIN_TX_GAIN, AD9371_MAX_TX_GAIN);
_ad9371_att[TX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_GAIN2){
- clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
+ } else if (name == MAGNESIUM_GAIN2) {
+ clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
_dsa_att[TX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_AMP){
- clip_gain = gain > 0.0 ? AMP_MAX_GAIN: AMP_MIN_GAIN;
+ } else if (name == MAGNESIUM_AMP) {
+ clip_gain = gain > 0.0 ? AMP_MAX_GAIN : AMP_MIN_GAIN;
_amp_bypass[TX_DIRECTION] = clip_gain == 0.0;
- }else {
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
- UHD_LOG_TRACE(unique_id(),
- "_set_tx_gain calling update gain");
- this->_set_all_gain(
- this->_get_all_gain(chan, TX_DIRECTION),
+ UHD_LOG_TRACE(unique_id(), "_set_tx_gain calling update gain");
+ this->_set_all_gain(this->_get_all_gain(chan, TX_DIRECTION),
this->get_tx_frequency(chan),
chan,
- TX_DIRECTION
- );
+ TX_DIRECTION);
return clip_gain;
}
double magnesium_radio_ctrl_impl::_get_tx_gain(
- const std::string &name,
- const size_t /*chan*/
-) {
+ const std::string& name, const size_t /*chan*/
+)
+{
std::lock_guard<std::mutex> l(_set_lock);
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
return _ad9371_att[TX_DIRECTION];
- }else if (name == MAGNESIUM_GAIN2){
+ } else if (name == MAGNESIUM_GAIN2) {
return _dsa_att[TX_DIRECTION];
- }else if (name == MAGNESIUM_AMP){
- return _amp_bypass[TX_DIRECTION]? AMP_MIN_GAIN : AMP_MAX_GAIN;
- }else {
+ } else if (name == MAGNESIUM_AMP) {
+ return _amp_bypass[TX_DIRECTION] ? AMP_MIN_GAIN : AMP_MAX_GAIN;
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
}
-double magnesium_radio_ctrl_impl::set_rx_gain(
- const double gain,
- const size_t chan
-) {
+double magnesium_radio_ctrl_impl::set_rx_gain(const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_TRACE(unique_id(),
- "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
- const double coerced_gain = _set_all_gain(
- gain,
- this->get_rx_frequency(chan),
- chan,
- RX_DIRECTION
- );
+ UHD_LOG_TRACE(unique_id(), "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
+ const double coerced_gain =
+ _set_all_gain(gain, this->get_rx_frequency(chan), chan, RX_DIRECTION);
radio_ctrl_impl::set_rx_gain(coerced_gain, chan);
return coerced_gain;
}
double magnesium_radio_ctrl_impl::_set_rx_gain(
- const std::string &name,
- const double gain,
- const size_t chan
-) {
+ const std::string& name, const double gain, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(),
"_set_rx_gain(name=" << name << ", gain=" << gain << ", chan=" << chan << ")");
double clip_gain = 0;
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
clip_gain = uhd::clip(gain, AD9371_MIN_RX_GAIN, AD9371_MAX_RX_GAIN);
_ad9371_att[RX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_GAIN2){
- clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
+ } else if (name == MAGNESIUM_GAIN2) {
+ clip_gain = uhd::clip(gain, DSA_MIN_GAIN, DSA_MAX_GAIN);
_dsa_att[RX_DIRECTION] = clip_gain;
- }else if (name == MAGNESIUM_AMP){
- clip_gain = gain > 0.0 ? AMP_MAX_GAIN: AMP_MIN_GAIN;
+ } else if (name == MAGNESIUM_AMP) {
+ clip_gain = gain > 0.0 ? AMP_MAX_GAIN : AMP_MIN_GAIN;
_amp_bypass[RX_DIRECTION] = clip_gain == 0.0;
- }else {
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
- UHD_LOG_TRACE(unique_id(),
- "_set_rx_gain calling update gain");
- this->_set_all_gain(
- this->_get_all_gain(chan, RX_DIRECTION),
+ UHD_LOG_TRACE(unique_id(), "_set_rx_gain calling update gain");
+ this->_set_all_gain(this->_get_all_gain(chan, RX_DIRECTION),
this->get_rx_frequency(chan),
chan,
- RX_DIRECTION
- );
+ RX_DIRECTION);
return clip_gain; // not really any coreced here (only clip) for individual gain
}
double magnesium_radio_ctrl_impl::_get_rx_gain(
- const std::string &name,
- const size_t /*chan*/
-) {
+ const std::string& name, const size_t /*chan*/
+)
+{
std::lock_guard<std::mutex> l(_set_lock);
- if (name == MAGNESIUM_GAIN1){
+ if (name == MAGNESIUM_GAIN1) {
return _ad9371_att[RX_DIRECTION];
- }else if (name == MAGNESIUM_GAIN2){
+ } else if (name == MAGNESIUM_GAIN2) {
return _dsa_att[RX_DIRECTION];
- }else if (name == MAGNESIUM_AMP){
- return _amp_bypass[RX_DIRECTION]? AMP_MIN_GAIN : AMP_MAX_GAIN;
- }else{
+ } else if (name == MAGNESIUM_AMP) {
+ return _amp_bypass[RX_DIRECTION] ? AMP_MIN_GAIN : AMP_MAX_GAIN;
+ } else {
throw uhd::value_error("Could not find gain element " + name);
}
}
-std::vector<std::string> magnesium_radio_ctrl_impl::get_rx_lo_names(
- const size_t /*chan*/
-) {
- return std::vector<std::string> {MAGNESIUM_LO1, MAGNESIUM_LO2};
+std::vector<std::string> magnesium_radio_ctrl_impl::get_rx_lo_names(const size_t /*chan*/
+)
+{
+ return std::vector<std::string>{MAGNESIUM_LO1, MAGNESIUM_LO2};
}
std::vector<std::string> magnesium_radio_ctrl_impl::get_rx_lo_sources(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO2){
- return std::vector<std::string> { "internal" };
- }else if (name == MAGNESIUM_LO1){
- return std::vector<std::string> { "internal", "external" };
- }else {
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO2) {
+ return std::vector<std::string>{"internal"};
+ } else if (name == MAGNESIUM_LO1) {
+ return std::vector<std::string>{"internal", "external"};
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
- }
+ }
}
freq_range_t magnesium_radio_ctrl_impl::get_rx_lo_freq_range(
- const std::string & name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO1){
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO1) {
return freq_range_t{ADF4351_MIN_FREQ, ADF4351_MAX_FREQ};
- }
- else if(name == MAGNESIUM_LO2){
+ } else if (name == MAGNESIUM_LO2) {
return freq_range_t{AD9371_MIN_FREQ, AD9371_MAX_FREQ};
- }
- else {
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
}
}
void magnesium_radio_ctrl_impl::set_rx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t /*chan*/
-) {
- //TODO: checking what options are there
+ const std::string& src, const std::string& name, const size_t /*chan*/
+)
+{
+ // TODO: checking what options are there
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(), "Setting RX LO " << name << " to " << src);
@@ -552,180 +486,179 @@ void magnesium_radio_ctrl_impl::set_rx_lo_source(
_ad9371->set_lo_source(src, RX_DIRECTION);
} else {
UHD_LOG_ERROR(unique_id(),
- "RX LO " << name << " does not support setting source to " << src);
+ "RX LO " << name << " does not support setting source to " << src);
}
}
const std::string magnesium_radio_ctrl_impl::get_rx_lo_source(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO1){
- //TODO: should we use this from cache?
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO1) {
+ // TODO: should we use this from cache?
return _ad9371->get_lo_source(RX_DIRECTION);
}
return "internal";
}
-double magnesium_radio_ctrl_impl::_set_rx_lo_freq(
- const std::string source,
+double magnesium_radio_ctrl_impl::_set_rx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
-){
+ const size_t chan)
+{
double coerced_lo_freq = freq;
- if (source != "internal"){
- UHD_LOG_WARNING(unique_id(), "LO source is not internal. This set frequency will be ignored");
- if(name == MAGNESIUM_LO1){
+ if (source != "internal") {
+ UHD_LOG_WARNING(
+ unique_id(), "LO source is not internal. This set frequency will be ignored");
+ if (name == MAGNESIUM_LO1) {
// handle ad9371 external LO case
- coerced_lo_freq = freq;
+ coerced_lo_freq = freq;
_ad9371_freq[RX_DIRECTION] = coerced_lo_freq;
}
- }else {
- if(name == MAGNESIUM_LO1){
- coerced_lo_freq = _ad9371->set_frequency(freq, chan, RX_DIRECTION);
+ } else {
+ if (name == MAGNESIUM_LO1) {
+ coerced_lo_freq = _ad9371->set_frequency(freq, chan, RX_DIRECTION);
_ad9371_freq[RX_DIRECTION] = coerced_lo_freq;
- }else if (name == MAGNESIUM_LO2 ){
+ } else if (name == MAGNESIUM_LO2) {
// TODO: no hardcode the init_n_mode
- coerced_lo_freq = _lo_enable(_rx_lo, freq, _master_clock_rate, false);
+ coerced_lo_freq = _lo_enable(_rx_lo, freq, _master_clock_rate, false);
_adf4351_freq[RX_DIRECTION] = coerced_lo_freq;
- }else {
- UHD_LOG_WARNING(unique_id(), "There's no LO with this name of "<<name << " in the system. This set rx lo freq will be ignored");
+ } else {
+ UHD_LOG_WARNING(unique_id(),
+ "There's no LO with this name of "
+ << name << " in the system. This set rx lo freq will be ignored");
};
}
return coerced_lo_freq;
}
double magnesium_radio_ctrl_impl::set_rx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(), "Setting rx lo frequency for " <<name << " with freq = " <<freq);
+ double freq, const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Setting rx lo frequency for " << name << " with freq = " << freq);
std::lock_guard<std::mutex> l(_set_lock);
- std::string source = this->get_rx_lo_source(name, chan);
+ std::string source = this->get_rx_lo_source(name, chan);
const double coerced_lo_freq = this->_set_rx_lo_freq(source, name, freq, chan);
- this->_update_freq(chan,RX_DIRECTION);
- this->_update_gain(chan,RX_DIRECTION);
+ this->_update_freq(chan, RX_DIRECTION);
+ this->_update_gain(chan, RX_DIRECTION);
return coerced_lo_freq;
}
double magnesium_radio_ctrl_impl::get_rx_lo_freq(
- const std::string & name,
- const size_t chan
-) {
-
- UHD_LOG_TRACE(unique_id(),"Getting rx lo frequency for " <<name);
- std::string source = this->get_rx_lo_source(name,chan);
- if(name == MAGNESIUM_LO1){
+ const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "Getting rx lo frequency for " << name);
+ std::string source = this->get_rx_lo_source(name, chan);
+ if (name == MAGNESIUM_LO1) {
return _ad9371_freq[RX_DIRECTION];
- }else if (name == "adf4531" ){
+ } else if (name == "adf4531") {
return _adf4351_freq[RX_DIRECTION];
- }else {
- UHD_LOG_ERROR(unique_id(), "There's no LO with this name of "<<name << " in the system. This set rx lo freq will be ignored");
+ } else {
+ UHD_LOG_ERROR(unique_id(),
+ "There's no LO with this name of "
+ << name << " in the system. This set rx lo freq will be ignored");
}
UHD_THROW_INVALID_CODE_PATH();
}
-//TX LO
-std::vector<std::string> magnesium_radio_ctrl_impl::get_tx_lo_names(
- const size_t /*chan*/
-) {
- return std::vector<std::string> {MAGNESIUM_LO1, MAGNESIUM_LO2};
+// TX LO
+std::vector<std::string> magnesium_radio_ctrl_impl::get_tx_lo_names(const size_t /*chan*/
+)
+{
+ return std::vector<std::string>{MAGNESIUM_LO1, MAGNESIUM_LO2};
}
std::vector<std::string> magnesium_radio_ctrl_impl::get_tx_lo_sources(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO2){
- return std::vector<std::string> { "internal" };
- }else if (name == MAGNESIUM_LO1){
- return std::vector<std::string> { "internal", "external" };
- }else {
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO2) {
+ return std::vector<std::string>{"internal"};
+ } else if (name == MAGNESIUM_LO1) {
+ return std::vector<std::string>{"internal", "external"};
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
- }
+ }
}
freq_range_t magnesium_radio_ctrl_impl::get_tx_lo_freq_range(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO2){
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO2) {
return freq_range_t{ADF4351_MIN_FREQ, ADF4351_MAX_FREQ};
- }
- else if(name == MAGNESIUM_LO1){
+ } else if (name == MAGNESIUM_LO1) {
return freq_range_t{AD9371_MIN_FREQ, AD9371_MAX_FREQ};
- }
- else {
+ } else {
throw uhd::value_error("Could not find LO stage " + name);
}
}
void magnesium_radio_ctrl_impl::set_tx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t /*chan*/
-) {
- //TODO: checking what options are there
+ const std::string& src, const std::string& name, const size_t /*chan*/
+)
+{
+ // TODO: checking what options are there
std::lock_guard<std::mutex> l(_set_lock);
UHD_LOG_TRACE(unique_id(), "Setting TX LO " << name << " to " << src);
if (name == MAGNESIUM_LO1) {
_ad9371->set_lo_source(src, TX_DIRECTION);
} else {
UHD_LOG_ERROR(unique_id(),
- "TX LO " << name << " does not support setting source to " << src);
+ "TX LO " << name << " does not support setting source to " << src);
}
}
const std::string magnesium_radio_ctrl_impl::get_tx_lo_source(
- const std::string &name,
- const size_t /*chan*/
-) {
- if (name == MAGNESIUM_LO1){
- //TODO: should we use this from cache?
+ const std::string& name, const size_t /*chan*/
+)
+{
+ if (name == MAGNESIUM_LO1) {
+ // TODO: should we use this from cache?
return _ad9371->get_lo_source(TX_DIRECTION);
}
return "internal";
}
-double magnesium_radio_ctrl_impl::_set_tx_lo_freq(
- const std::string source,
+double magnesium_radio_ctrl_impl::_set_tx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
-){
+ const size_t chan)
+{
double coerced_lo_freq = freq;
- if (source != "internal"){
- UHD_LOG_WARNING(unique_id(), "LO source is not internal. This set frequency will be ignored");
- if(name == MAGNESIUM_LO1){
+ if (source != "internal") {
+ UHD_LOG_WARNING(
+ unique_id(), "LO source is not internal. This set frequency will be ignored");
+ if (name == MAGNESIUM_LO1) {
// handle ad9371 external LO case
- coerced_lo_freq = freq;
+ coerced_lo_freq = freq;
_ad9371_freq[TX_DIRECTION] = coerced_lo_freq;
}
- }else {
- if(name == MAGNESIUM_LO1){
- coerced_lo_freq = _ad9371->set_frequency(freq, chan, TX_DIRECTION);
+ } else {
+ if (name == MAGNESIUM_LO1) {
+ coerced_lo_freq = _ad9371->set_frequency(freq, chan, TX_DIRECTION);
_ad9371_freq[TX_DIRECTION] = coerced_lo_freq;
- }else if (name == MAGNESIUM_LO2 ){
+ } else if (name == MAGNESIUM_LO2) {
// TODO: no hardcode the int_n_mode
const bool int_n_mode = false;
coerced_lo_freq = _lo_enable(_tx_lo, freq, _master_clock_rate, int_n_mode);
_adf4351_freq[TX_DIRECTION] = coerced_lo_freq;
- }else {
- UHD_LOG_WARNING(unique_id(), "There's no LO with this name of "<<name << " in the system. This set tx lo freq will be ignored");
+ } else {
+ UHD_LOG_WARNING(unique_id(),
+ "There's no LO with this name of "
+ << name << " in the system. This set tx lo freq will be ignored");
};
}
return coerced_lo_freq;
}
double magnesium_radio_ctrl_impl::set_tx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(), "Setting tx lo frequency for " <<name << " with freq = " <<freq);
- std::string source = this->get_tx_lo_source(name,chan);
+ double freq, const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Setting tx lo frequency for " << name << " with freq = " << freq);
+ std::string source = this->get_tx_lo_source(name, chan);
const double return_freq = this->_set_tx_lo_freq(source, name, freq, chan);
this->_update_freq(chan, TX_DIRECTION);
this->_update_gain(chan, TX_DIRECTION);
@@ -733,61 +666,56 @@ double magnesium_radio_ctrl_impl::set_tx_lo_freq(
}
double magnesium_radio_ctrl_impl::get_tx_lo_freq(
- const std::string & name,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(),"Getting tx lo frequency for " <<name);
- std::string source = this->get_tx_lo_source(name,chan);
- if(name == MAGNESIUM_LO1){
+ const std::string& name, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "Getting tx lo frequency for " << name);
+ std::string source = this->get_tx_lo_source(name, chan);
+ if (name == MAGNESIUM_LO1) {
return _ad9371_freq[TX_DIRECTION];
- }else if (name == MAGNESIUM_LO2){
+ } else if (name == MAGNESIUM_LO2) {
return _adf4351_freq[TX_DIRECTION];
- }else {
- UHD_LOG_ERROR(unique_id(), "There's no LO with this name of "<<name << " in the system.");
+ } else {
+ UHD_LOG_ERROR(
+ unique_id(), "There's no LO with this name of " << name << " in the system.");
};
UHD_THROW_INVALID_CODE_PATH();
}
-
size_t magnesium_radio_ctrl_impl::get_chan_from_dboard_fe(
- const std::string &fe, const direction_t /* dir */
-) {
+ const std::string& fe, const direction_t /* dir */
+)
+{
return boost::lexical_cast<size_t>(fe);
}
std::string magnesium_radio_ctrl_impl::get_dboard_fe_from_chan(
- const size_t chan,
- const direction_t /* dir */
-) {
+ const size_t chan, const direction_t /* dir */
+)
+{
return std::to_string(chan);
}
void magnesium_radio_ctrl_impl::set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
-) {
- _rpcc = rpcc;
+ uhd::rpc_client::sptr rpcc, const uhd::device_addr_t& block_args)
+{
+ _rpcc = rpcc;
_block_args = block_args;
UHD_LOG_TRACE(unique_id(), "Instantiating AD9371 control object...");
_ad9371 = magnesium_ad9371_iface::uptr(
- new magnesium_ad9371_iface(
- _rpcc,
- (_radio_slot == "A") ? 0 : 1
- )
- );
+ new magnesium_ad9371_iface(_rpcc, (_radio_slot == "A") ? 0 : 1));
if (block_args.has_key("identify")) {
const std::string identify_val = block_args.get("identify");
- int identify_duration = std::atoi(identify_val.c_str());
+ int identify_duration = std::atoi(identify_val.c_str());
if (identify_duration == 0) {
identify_duration = 5;
}
UHD_LOG_INFO(unique_id(),
"Running LED identification process for " << identify_duration
- << " seconds.");
+ << " seconds.");
_identify_with_leds(identify_duration);
}
@@ -795,68 +723,60 @@ void magnesium_radio_ctrl_impl::set_rpc_client(
// in arguments from the device args. So if block_args contains a
// master_clock_rate key, then it should better be whatever the device is
// configured to do.
- _master_clock_rate = _rpcc->request_with_token<double>(
- _rpc_prefix + "get_master_clock_rate");
+ _master_clock_rate =
+ _rpcc->request_with_token<double>(_rpc_prefix + "get_master_clock_rate");
if (block_args.cast<double>("master_clock_rate", _master_clock_rate)
- != _master_clock_rate) {
+ != _master_clock_rate) {
throw uhd::runtime_error(str(
boost::format("Master clock rate mismatch. Device returns %f MHz, "
"but should have been %f MHz.")
% (_master_clock_rate / 1e6)
- % (block_args.cast<double>(
- "master_clock_rate", _master_clock_rate) / 1e6)
- ));
+ % (block_args.cast<double>("master_clock_rate", _master_clock_rate) / 1e6)));
}
- UHD_LOG_DEBUG(unique_id(),
- "Master Clock Rate is: " << (_master_clock_rate / 1e6) << " MHz.");
+ UHD_LOG_DEBUG(
+ unique_id(), "Master Clock Rate is: " << (_master_clock_rate / 1e6) << " MHz.");
radio_ctrl_impl::set_rate(_master_clock_rate);
// EEPROM paths subject to change FIXME
const size_t db_idx = get_block_id().get_block_count();
_tree->access<eeprom_map_t>(_root_path / "eeprom")
- .add_coerced_subscriber([this, db_idx](const eeprom_map_t& db_eeprom){
+ .add_coerced_subscriber([this, db_idx](const eeprom_map_t& db_eeprom) {
this->_rpcc->notify_with_token("set_db_eeprom", db_idx, db_eeprom);
})
- .set_publisher([this, db_idx](){
- return this->_rpcc->request_with_token<eeprom_map_t>(
- "get_db_eeprom", db_idx
- );
- })
- ;
+ .set_publisher([this, db_idx]() {
+ return this->_rpcc->request_with_token<eeprom_map_t>("get_db_eeprom", db_idx);
+ });
// Init sensors
- for (const auto &dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
+ for (const auto& dir : std::vector<direction_t>{RX_DIRECTION, TX_DIRECTION}) {
for (size_t chan_idx = 0; chan_idx < MAGNESIUM_NUM_CHANS; chan_idx++) {
_init_mpm_sensors(dir, chan_idx);
}
}
}
-bool magnesium_radio_ctrl_impl::get_lo_lock_status(
- const direction_t dir
-) {
- if (not (bool(_rpcc))) {
- UHD_LOG_DEBUG(unique_id(),
- "Reported no LO lock due to lack of RPC connection.");
+bool magnesium_radio_ctrl_impl::get_lo_lock_status(const direction_t dir)
+{
+ if (not(bool(_rpcc))) {
+ UHD_LOG_DEBUG(unique_id(), "Reported no LO lock due to lack of RPC connection.");
return false;
}
const std::string trx = (dir == RX_DIRECTION) ? "rx" : "tx";
- const size_t chan = 0; // They're the same after all
- const double freq = (dir == RX_DIRECTION) ?
- get_rx_frequency(chan) :
- get_tx_frequency(chan);
+ const size_t chan = 0; // They're the same after all
+ const double freq = (dir == RX_DIRECTION) ? get_rx_frequency(chan)
+ : get_tx_frequency(chan);
- bool lo_lock = _rpcc->request_with_token<bool>(
- _rpc_prefix + "get_ad9371_lo_lock", trx);
+ bool lo_lock =
+ _rpcc->request_with_token<bool>(_rpc_prefix + "get_ad9371_lo_lock", trx);
UHD_LOG_TRACE(unique_id(),
"AD9371 " << trx << " LO reports lock: " << (lo_lock ? "Yes" : "No"));
if (lo_lock and _map_freq_to_rx_band(freq) == rx_band::LOWBAND) {
- lo_lock = lo_lock && _rpcc->request_with_token<bool>(
- _rpc_prefix + "get_lowband_lo_lock", trx);
+ lo_lock =
+ lo_lock
+ && _rpcc->request_with_token<bool>(_rpc_prefix + "get_lowband_lo_lock", trx);
UHD_LOG_TRACE(unique_id(),
- "ADF4351 " << trx << " LO reports lock: "
- << (lo_lock ? "Yes" : "No"));
+ "ADF4351 " << trx << " LO reports lock: " << (lo_lock ? "Yes" : "No"));
}
return lo_lock;
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
index 3d35206ed..dcadb5dea 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
@@ -11,20 +11,19 @@
#ifndef INCLUDED_LIBUHD_RFNOC_MAGNESIUM_RADIO_CTRL_IMPL_HPP
#define INCLUDED_LIBUHD_RFNOC_MAGNESIUM_RADIO_CTRL_IMPL_HPP
+#include "magnesium_ad9371_iface.hpp"
#include "magnesium_cpld_ctrl.hpp"
#include "magnesium_cpld_regs.hpp"
-#include "magnesium_ad9371_iface.hpp"
#include <uhd/types/serial.hpp>
#include <uhd/usrp/dboard_manager.hpp>
#include <uhd/usrp/gpio_defs.hpp>
-#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
-#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
#include <uhdlib/rfnoc/radio_ctrl_impl.hpp>
+#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
#include <uhdlib/usrp/common/adf435x.hpp>
+#include <uhdlib/usrp/cores/gpio_atr_3000.hpp>
#include <mutex>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief RFNoC block / daughterboard driver for a "Magnesium" daughterboard.
*
@@ -49,14 +48,7 @@ public:
};
//! Frequency bands for TX. Bands are a function of the analog filter banks
- enum class tx_band {
- INVALID_BAND,
- LOWBAND,
- BAND0,
- BAND1,
- BAND2,
- BAND3
- };
+ enum class tx_band { INVALID_BAND, LOWBAND, BAND0, BAND1, BAND2, BAND3 };
/************************************************************************
* Structors
@@ -71,8 +63,8 @@ public:
// not reimplemented here
double set_rate(double rate);
- void set_tx_antenna(const std::string &ant, const size_t chan);
- void set_rx_antenna(const std::string &ant, const size_t chan);
+ void set_tx_antenna(const std::string& ant, const size_t chan);
+ void set_rx_antenna(const std::string& ant, const size_t chan);
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
@@ -84,90 +76,59 @@ public:
// RX LO
std::vector<std::string> get_rx_lo_names(const size_t chan);
std::vector<std::string> get_rx_lo_sources(
- const std::string &name,
- const size_t chan
- );
- freq_range_t get_rx_lo_freq_range(
- const std::string &name,
- const size_t chan
- );
+ const std::string& name, const size_t chan);
+ freq_range_t get_rx_lo_freq_range(const std::string& name, const size_t chan);
void set_rx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t chan
- );
- const std::string get_rx_lo_source(
- const std::string &name,
- const size_t chan
- );
-
- double set_rx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
- );
- double get_rx_lo_freq(const std::string &name, const size_t chan);
+ const std::string& src, const std::string& name, const size_t chan);
+ const std::string get_rx_lo_source(const std::string& name, const size_t chan);
+
+ double set_rx_lo_freq(double freq, const std::string& name, const size_t chan);
+ double get_rx_lo_freq(const std::string& name, const size_t chan);
// TX LO
std::vector<std::string> get_tx_lo_names(const size_t chan);
std::vector<std::string> get_tx_lo_sources(
- const std::string &name,
- const size_t chan
- );
- freq_range_t get_tx_lo_freq_range(
- const std::string &name,
- const size_t chan
- );
+ const std::string& name, const size_t chan);
+ freq_range_t get_tx_lo_freq_range(const std::string& name, const size_t chan);
void set_tx_lo_source(
- const std::string &src,
- const std::string &name,
- const size_t chan
- );
- const std::string get_tx_lo_source(
- const std::string &name,
- const size_t chan
- );
-
- double set_tx_lo_freq(
- double freq,
- const std::string &name,
- const size_t chan
- );
- double get_tx_lo_freq(const std::string &name, const size_t chan);
+ const std::string& src, const std::string& name, const size_t chan);
+ const std::string get_tx_lo_source(const std::string& name, const size_t chan);
+
+ double set_tx_lo_freq(double freq, const std::string& name, const size_t chan);
+ double get_tx_lo_freq(const std::string& name, const size_t chan);
// gain
double set_tx_gain(const double gain, const size_t chan);
double set_rx_gain(const double gain, const size_t chan);
- void set_tx_gain_source(const std::string& src, const std::string& name, const size_t chan);
+ void set_tx_gain_source(
+ const std::string& src, const std::string& name, const size_t chan);
std::string get_tx_gain_source(const std::string& name, const size_t chan);
- void set_rx_gain_source(const std::string& src, const std::string& name, const size_t chan);
+ void set_rx_gain_source(
+ const std::string& src, const std::string& name, const size_t chan);
std::string get_rx_gain_source(const std::string& name, const size_t chan);
- size_t get_chan_from_dboard_fe(const std::string &fe, const direction_t dir);
+ size_t get_chan_from_dboard_fe(const std::string& fe, const direction_t dir);
std::string get_dboard_fe_from_chan(const size_t chan, const direction_t dir);
- void set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
- );
+ void set_rpc_client(uhd::rpc_client::sptr rpcc, const uhd::device_addr_t& block_args);
private:
/**************************************************************************
* Helpers
*************************************************************************/
//! Set tx gain on each gain element
- double _set_tx_gain(const std::string &name, const double gain, const size_t chan);
+ double _set_tx_gain(const std::string& name, const double gain, const size_t chan);
//! Set rx gain on each gain element
- double _set_rx_gain(const std::string &name, const double gain, const size_t chan);
+ double _set_rx_gain(const std::string& name, const double gain, const size_t chan);
//! Get tx gain on each gain element
- double _get_tx_gain(const std::string &name, const size_t chan);
+ double _get_tx_gain(const std::string& name, const size_t chan);
//! Get rx gain on each gain element
- double _get_rx_gain(const std::string &name, const size_t chan);
+ double _get_rx_gain(const std::string& name, const size_t chan);
//! Initialize all the peripherals connected to this block
void _init_peripherals();
@@ -176,18 +137,12 @@ private:
void _init_defaults();
//! Init a subtree for the RF frontends
- void _init_frontend_subtree(
- uhd::property_tree::sptr subtree,
- const size_t chan_idx
- );
+ void _init_frontend_subtree(uhd::property_tree::sptr subtree, const size_t chan_idx);
//! Initialize property tree
void _init_prop_tree();
- void _init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
- );
+ void _init_mpm_sensors(const direction_t dir, const size_t chan_idx);
//! Map a frequency in Hz to an rx_band value. Will return
// rx_band::INVALID_BAND if the frequency is out of range.
@@ -201,92 +156,57 @@ private:
*************************************************************************/
//! Return LO lock status. Factors in current band (low/high) and
// direction (TX/RX)
- bool get_lo_lock_status(
- const direction_t dir
- );
+ bool get_lo_lock_status(const direction_t dir);
/**************************************************************************
* Gain Controls (implemented in magnesium_radio_ctrl_gain.cpp)
*************************************************************************/
//! Set the attenuation of the DSA
- double _dsa_set_att(
- const double att,
- const size_t chan,
- const direction_t dir
- );
+ double _dsa_set_att(const double att, const size_t chan, const direction_t dir);
- double _dsa_get_att(
- const size_t chan,
- const direction_t dir
- );
+ double _dsa_get_att(const size_t chan, const direction_t dir);
//! Write the DSA word
- void _set_dsa_val(
- const size_t chan,
- const direction_t dir,
- const uint32_t dsa_val
- );
+ void _set_dsa_val(const size_t chan, const direction_t dir, const uint32_t dsa_val);
double _set_all_gain(
- const double gain,
- const double freq,
- const size_t chan,
- const direction_t dir
- );
+ const double gain, const double freq, const size_t chan, const direction_t dir);
- double _get_all_gain(
- const size_t chan,
- const direction_t dir
- );
+ double _get_all_gain(const size_t chan, const direction_t dir);
void _update_gain(const size_t chan, direction_t dir);
- void _update_freq(
- const size_t chan,
- const uhd::direction_t dir
- );
+ void _update_freq(const size_t chan, const uhd::direction_t dir);
/**************************************************************************
* CPLD Controls (implemented in magnesium_radio_ctrl_cpld.cpp)
*************************************************************************/
//! Blink the front-panel LEDs for \p identify_duration, then reset CPLD
// and resume normal operation.
- void _identify_with_leds(
- const int identify_duration
- );
+ void _identify_with_leds(const int identify_duration);
- void _update_rx_freq_switches(
- const double freq,
+ void _update_rx_freq_switches(const double freq,
const bool bypass_lnas,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
- );
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel);
- void _update_tx_freq_switches(
- const double freq,
+ void _update_tx_freq_switches(const double freq,
const bool bypass_amps,
- const magnesium_cpld_ctrl::chan_sel_t chan_sel
- );
+ const magnesium_cpld_ctrl::chan_sel_t chan_sel);
- void _update_atr_switches(
- const magnesium_cpld_ctrl::chan_sel_t chan,
+ void _update_atr_switches(const magnesium_cpld_ctrl::chan_sel_t chan,
const direction_t dir,
- const std::string &ant
- );
+ const std::string& ant);
- double _set_rx_lo_freq(
- const std::string source,
+ double _set_rx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
- );
+ const size_t chan);
- double _set_tx_lo_freq(
- const std::string source,
+ double _set_tx_lo_freq(const std::string source,
const std::string name,
const double freq,
- const size_t chan
- );
+ const size_t chan);
/**************************************************************************
* Private attributes
*************************************************************************/
@@ -334,30 +254,37 @@ private:
//! Sampling rate, and also ref clock frequency for the lowband LOs.
double _master_clock_rate = 1.0;
- //! Desired RF frequency
- std::map<direction_t,double> _desired_rf_freq = { {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9} };
+ //! Desired RF frequency
+ std::map<direction_t, double> _desired_rf_freq = {
+ {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Coerced adf4351 frequency
//! Coerced ad9371 frequency
- std::map<direction_t,double> _ad9371_freq = { {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9} };
+ std::map<direction_t, double> _ad9371_freq = {
+ {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Coerced adf4351 frequency
- std::map<direction_t,double> _adf4351_freq = { {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9} };
+ std::map<direction_t, double> _adf4351_freq = {
+ {RX_DIRECTION, 2.44e9}, {TX_DIRECTION, 2.44e9}};
//! Low band enable
- std::map<direction_t,bool> _is_low_band = { {RX_DIRECTION, false}, {TX_DIRECTION, false} };
+ std::map<direction_t, bool> _is_low_band = {
+ {RX_DIRECTION, false}, {TX_DIRECTION, false}};
//! AD9371 gain
- double _ad9371_rx_gain = 0.0;
- double _ad9371_tx_gain = 0.0;
- std::map<direction_t,double> _ad9371_att = { {RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0} };
+ double _ad9371_rx_gain = 0.0;
+ double _ad9371_tx_gain = 0.0;
+ std::map<direction_t, double> _ad9371_att = {
+ {RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0}};
//! DSA attenuation
- double _dsa_rx_att = 0.0;
- double _dsa_tx_att = 0.0;
- std::map<direction_t,double> _dsa_att = { {RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0} };
+ double _dsa_rx_att = 0.0;
+ double _dsa_tx_att = 0.0;
+ std::map<direction_t, double> _dsa_att = {{RX_DIRECTION, 0.0}, {TX_DIRECTION, 0.0}};
//! amp gain
- std::map<direction_t,bool> _amp_bypass = { {RX_DIRECTION, true}, {TX_DIRECTION, true} };
+ std::map<direction_t, bool> _amp_bypass = {
+ {RX_DIRECTION, true}, {TX_DIRECTION, true}};
//! All gain
double _all_rx_gain = 0.0;
double _all_tx_gain = 0.0;
//! Gain profile
- std::map<direction_t,std::string> _gain_profile = { {RX_DIRECTION, "default"}, {TX_DIRECTION, "default"} };
+ std::map<direction_t, std::string> _gain_profile = {
+ {RX_DIRECTION, "default"}, {TX_DIRECTION, "default"}};
bool _rx_bypass_lnas = true;
bool _tx_bypass_amp = true;
@@ -367,11 +294,11 @@ private:
{magnesium_cpld_ctrl::CHAN1,
magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1},
{magnesium_cpld_ctrl::CHAN2,
- magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1}
- };
+ magnesium_cpld_ctrl::SW_TRX_FROMLOWERFILTERBANKTXSW1}};
//! RX LO SOURCE
- // NOTE for magnesium only ad9371 LO that can be connected to the external LO so we only need one var here
+ // NOTE for magnesium only ad9371 LO that can be connected to the external LO so we
+ // only need one var here
std::string _rx_lo_source = "internal";
}; /* class radio_ctrl_impl */
@@ -379,4 +306,3 @@ private:
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RFNOC_MAGNESIUM_RADIO_CTRL_IMPL_HPP */
-
diff --git a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
index 901bb1474..422b07ebb 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
@@ -4,40 +4,32 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "magnesium_radio_ctrl_impl.hpp"
#include "magnesium_constants.hpp"
-#include <uhd/utils/log.hpp>
+#include "magnesium_radio_ctrl_impl.hpp"
+#include <uhd/transport/chdr.hpp>
#include <uhd/types/eeprom.hpp>
#include <uhd/types/sensors.hpp>
-#include <uhd/transport/chdr.hpp>
+#include <uhd/utils/log.hpp>
#include <uhdlib/usrp/cores/spi_core_3000.hpp>
-#include <vector>
-#include <string>
#include <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/case_conv.hpp>
+#include <boost/algorithm/string/split.hpp>
+#include <string>
+#include <vector>
using namespace uhd;
using namespace uhd::rfnoc;
namespace {
- enum slave_select_t {
- SEN_CPLD = 1,
- SEN_TX_LO = 2,
- SEN_RX_LO = 4,
- SEN_PHASE_DAC = 8
- };
-
- constexpr double MAGNESIUM_DEFAULT_FREQ = 2.5e9; // Hz
- constexpr double MAGNESIUM_DEFAULT_BANDWIDTH = 100e6; // Hz
- constexpr char MAGNESIUM_DEFAULT_RX_ANTENNA[] = "RX2";
- constexpr char MAGNESIUM_DEFAULT_TX_ANTENNA[] = "TX/RX";
-
- //! Magnesium gain profile options
- const std::vector<std::string> MAGNESIUM_GP_OPTIONS = {
- "manual",
- "default"
- };
-}
+enum slave_select_t { SEN_CPLD = 1, SEN_TX_LO = 2, SEN_RX_LO = 4, SEN_PHASE_DAC = 8 };
+
+constexpr double MAGNESIUM_DEFAULT_FREQ = 2.5e9; // Hz
+constexpr double MAGNESIUM_DEFAULT_BANDWIDTH = 100e6; // Hz
+constexpr char MAGNESIUM_DEFAULT_RX_ANTENNA[] = "RX2";
+constexpr char MAGNESIUM_DEFAULT_TX_ANTENNA[] = "TX/RX";
+
+//! Magnesium gain profile options
+const std::vector<std::string> MAGNESIUM_GP_OPTIONS = {"manual", "default"};
+} // namespace
//! Helper function to extract single value of port number.
//
@@ -45,32 +37,34 @@ namespace {
// This function convert the format of attribute "Radio_N_M"
// to a single value port number = N*number_of_port_per_radio + M
-uint32_t extract_port_number(std::string radio_src_string, uhd::property_tree::sptr ptree){
+uint32_t extract_port_number(std::string radio_src_string, uhd::property_tree::sptr ptree)
+{
std::string s_val = "0";
std::vector<std::string> radio_strings;
- boost::algorithm::split(
- radio_strings,
+ boost::algorithm::split(radio_strings,
radio_src_string,
boost::is_any_of("_/"),
boost::token_compress_on);
boost::to_lower(radio_strings[0]);
- if (radio_strings.size()<3) {
- throw uhd::runtime_error(str(boost::format("%s is an invalid GPIO source string.") % radio_src_string));
+ if (radio_strings.size() < 3) {
+ throw uhd::runtime_error(str(
+ boost::format("%s is an invalid GPIO source string.") % radio_src_string));
}
size_t radio_num = std::stoi(radio_strings[1]);
- size_t port_num = std::stoi(radio_strings[2]);
+ size_t port_num = std::stoi(radio_strings[2]);
if (radio_strings[0] != "radio") {
- throw uhd::runtime_error("Front panel GPIO bank can only accept a radio block as its driver.");
+ throw uhd::runtime_error(
+ "Front panel GPIO bank can only accept a radio block as its driver.");
}
- std::string radio_port_out = "Radio_"+ radio_strings[1] + "/ports/out";
- std::string radio_port_path = radio_port_out + "/"+ radio_strings[2];
- auto found = ptree->exists(fs_path("xbar")/ radio_port_path);
- if (not found){
- throw uhd::runtime_error(str(boost::format(
- "Could not find radio port %s.\n") % radio_port_path));
+ std::string radio_port_out = "Radio_" + radio_strings[1] + "/ports/out";
+ std::string radio_port_path = radio_port_out + "/" + radio_strings[2];
+ auto found = ptree->exists(fs_path("xbar") / radio_port_path);
+ if (not found) {
+ throw uhd::runtime_error(
+ str(boost::format("Could not find radio port %s.\n") % radio_port_path));
}
- size_t port_size = ptree->list(fs_path("xbar")/ radio_port_out).size();
- return radio_num*port_size + port_num;
+ size_t port_size = ptree->list(fs_path("xbar") / radio_port_out).size();
+ return radio_num * port_size + port_num;
}
void magnesium_radio_ctrl_impl::_init_defaults()
@@ -80,8 +74,7 @@ void magnesium_radio_ctrl_impl::_init_defaults()
const size_t num_tx_chans = get_input_ports().size();
UHD_LOG_TRACE(unique_id(),
- "Num TX chans: " << num_tx_chans
- << " Num RX chans: " << num_rx_chans);
+ "Num TX chans: " << num_tx_chans << " Num RX chans: " << num_rx_chans);
for (size_t chan = 0; chan < num_rx_chans; chan++) {
radio_ctrl_impl::set_rx_frequency(MAGNESIUM_DEFAULT_FREQ, chan);
@@ -104,8 +97,7 @@ void magnesium_radio_ctrl_impl::_init_defaults()
const size_t default_spp =
(_tree->access<size_t>("mtu/recv").get() - max_bytes_header)
/ (2 * sizeof(int16_t));
- UHD_LOG_DEBUG(unique_id(),
- "Setting default spp to " << default_spp);
+ UHD_LOG_DEBUG(unique_id(), "Setting default spp to " << default_spp);
_tree->access<int>(get_arg_path("spp") / "value").set(default_spp);
}
@@ -113,606 +105,453 @@ void magnesium_radio_ctrl_impl::_init_peripherals()
{
UHD_LOG_TRACE(unique_id(), "Initializing peripherals...");
UHD_LOG_TRACE(unique_id(), "Initializing SPI core...");
- _spi = spi_core_3000::make(_get_ctrl(0),
- regs::sr_addr(regs::SPI),
- regs::rb_addr(regs::RB_SPI)
- );
+ _spi = spi_core_3000::make(
+ _get_ctrl(0), regs::sr_addr(regs::SPI), regs::rb_addr(regs::RB_SPI));
UHD_LOG_TRACE(unique_id(), "Initializing CPLD...");
UHD_LOG_TRACE(unique_id(), "Creating new CPLD object...");
spi_config_t spi_config;
spi_config.use_custom_divider = true;
- spi_config.divider = 125;
- spi_config.mosi_edge = spi_config_t::EDGE_RISE;
- spi_config.miso_edge = spi_config_t::EDGE_FALL;
+ spi_config.divider = 125;
+ spi_config.mosi_edge = spi_config_t::EDGE_RISE;
+ spi_config.miso_edge = spi_config_t::EDGE_FALL;
UHD_LOG_TRACE(unique_id(), "Making CPLD object...");
_cpld = std::make_shared<magnesium_cpld_ctrl>(
- [this, spi_config](const uint32_t transaction){ // Write functor
- this->_spi->write_spi(
- SEN_CPLD,
- spi_config,
- transaction,
- 24
- );
+ [this, spi_config](const uint32_t transaction) { // Write functor
+ this->_spi->write_spi(SEN_CPLD, spi_config, transaction, 24);
},
- [this, spi_config](const uint32_t transaction){ // Read functor
- return this->_spi->read_spi(
- SEN_CPLD,
- spi_config,
- transaction,
- 24
- );
- }
- );
+ [this, spi_config](const uint32_t transaction) { // Read functor
+ return this->_spi->read_spi(SEN_CPLD, spi_config, transaction, 24);
+ });
_update_atr_switches(
- magnesium_cpld_ctrl::BOTH,
- DX_DIRECTION,
- radio_ctrl_impl::get_rx_antenna(0)
- );
+ magnesium_cpld_ctrl::BOTH, DX_DIRECTION, radio_ctrl_impl::get_rx_antenna(0));
UHD_LOG_TRACE(unique_id(), "Initializing TX LO...");
- _tx_lo = adf435x_iface::make_adf4351(
- [this](const std::vector<uint32_t> transactions){
- for (const uint32_t transaction: transactions) {
- this->_spi->write_spi(
- SEN_TX_LO,
- spi_config_t::EDGE_RISE,
- transaction,
- 32
- );
- }
+ _tx_lo = adf435x_iface::make_adf4351([this](
+ const std::vector<uint32_t> transactions) {
+ for (const uint32_t transaction : transactions) {
+ this->_spi->write_spi(SEN_TX_LO, spi_config_t::EDGE_RISE, transaction, 32);
}
- );
+ });
UHD_LOG_TRACE(unique_id(), "Initializing RX LO...");
- _rx_lo = adf435x_iface::make_adf4351(
- [this](const std::vector<uint32_t> transactions){
- for (const uint32_t transaction: transactions) {
- this->_spi->write_spi(
- SEN_RX_LO,
- spi_config_t::EDGE_RISE,
- transaction,
- 32
- );
- }
+ _rx_lo = adf435x_iface::make_adf4351([this](
+ const std::vector<uint32_t> transactions) {
+ for (const uint32_t transaction : transactions) {
+ this->_spi->write_spi(SEN_RX_LO, spi_config_t::EDGE_RISE, transaction, 32);
}
- );
+ });
_gpio.clear(); // Following the as-if rule, this can get optimized out
for (size_t radio_idx = 0; radio_idx < _get_num_radios(); radio_idx++) {
- UHD_LOG_TRACE(unique_id(),
- "Initializing GPIOs for channel " << radio_idx);
- _gpio.emplace_back(
- usrp::gpio_atr::gpio_atr_3000::make(
- _get_ctrl(radio_idx),
- regs::sr_addr(regs::GPIO),
- regs::rb_addr(regs::RB_DB_GPIO)
- )
- );
+ UHD_LOG_TRACE(unique_id(), "Initializing GPIOs for channel " << radio_idx);
+ _gpio.emplace_back(usrp::gpio_atr::gpio_atr_3000::make(_get_ctrl(radio_idx),
+ regs::sr_addr(regs::GPIO),
+ regs::rb_addr(regs::RB_DB_GPIO)));
// DSA and AD9371 gain bits do *not* toggle on ATR modes. If we ever
// connect anything else to this core, we might need to set_atr_mode()
// to MODE_ATR on those bits. For now, all bits simply do what they're
// told, and don't toggle on RX/TX state changes.
- _gpio.back()->set_atr_mode(
- usrp::gpio_atr::MODE_GPIO, // Disable ATR mode
- usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL
- );
- _gpio.back()->set_gpio_ddr(
- usrp::gpio_atr::DDR_OUTPUT, // Make all GPIOs outputs
- usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL
- );
+ _gpio.back()->set_atr_mode(usrp::gpio_atr::MODE_GPIO, // Disable ATR mode
+ usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ _gpio.back()->set_gpio_ddr(usrp::gpio_atr::DDR_OUTPUT, // Make all GPIOs outputs
+ usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
}
UHD_LOG_TRACE(unique_id(), "Initializing front-panel GPIO control...")
_fp_gpio = usrp::gpio_atr::gpio_atr_3000::make(
- _get_ctrl(0),
- regs::sr_addr(regs::FP_GPIO),
- regs::rb_addr(regs::RB_FP_GPIO)
- );
+ _get_ctrl(0), regs::sr_addr(regs::FP_GPIO), regs::rb_addr(regs::RB_FP_GPIO));
}
void magnesium_radio_ctrl_impl::_init_frontend_subtree(
- uhd::property_tree::sptr subtree,
- const size_t chan_idx
-) {
+ uhd::property_tree::sptr subtree, const size_t chan_idx)
+{
const fs_path tx_fe_path = fs_path("tx_frontends") / chan_idx;
const fs_path rx_fe_path = fs_path("rx_frontends") / chan_idx;
UHD_LOG_TRACE(unique_id(),
- "Adding non-RFNoC block properties for channel " << chan_idx <<
- " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
+ "Adding non-RFNoC block properties for channel "
+ << chan_idx << " to prop tree path " << tx_fe_path << " and " << rx_fe_path);
// TX Standard attributes
subtree->create<std::string>(tx_fe_path / "name")
- .set(str(boost::format("Magnesium")))
- ;
- subtree->create<std::string>(tx_fe_path / "connection")
- .set("IQ")
- ;
+ .set(str(boost::format("Magnesium")));
+ subtree->create<std::string>(tx_fe_path / "connection").set("IQ");
// RX Standard attributes
subtree->create<std::string>(rx_fe_path / "name")
- .set(str(boost::format("Magnesium")))
- ;
- subtree->create<std::string>(rx_fe_path / "connection")
- .set("IQ")
- ;
+ .set(str(boost::format("Magnesium")));
+ subtree->create<std::string>(rx_fe_path / "connection").set("IQ");
// TX Antenna
subtree->create<std::string>(tx_fe_path / "antenna" / "value")
- .add_coerced_subscriber([this, chan_idx](const std::string &ant){
+ .add_coerced_subscriber([this, chan_idx](const std::string& ant) {
this->set_tx_antenna(ant, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_antenna(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(tx_fe_path / "antenna" / "options")
.set({MAGNESIUM_DEFAULT_TX_ANTENNA})
- .add_coerced_subscriber([](const std::vector<std::string> &){
- throw uhd::runtime_error(
- "Attempting to update antenna options!");
- })
- ;
+ .add_coerced_subscriber([](const std::vector<std::string>&) {
+ throw uhd::runtime_error("Attempting to update antenna options!");
+ });
// RX Antenna
subtree->create<std::string>(rx_fe_path / "antenna" / "value")
- .add_coerced_subscriber([this, chan_idx](const std::string &ant){
+ .add_coerced_subscriber([this, chan_idx](const std::string& ant) {
this->set_rx_antenna(ant, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_rx_antenna(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_rx_antenna(chan_idx); });
subtree->create<std::vector<std::string>>(rx_fe_path / "antenna" / "options")
.set(MAGNESIUM_RX_ANTENNAS)
- .add_coerced_subscriber([](const std::vector<std::string> &){
- throw uhd::runtime_error(
- "Attempting to update antenna options!");
- })
- ;
+ .add_coerced_subscriber([](const std::vector<std::string>&) {
+ throw uhd::runtime_error("Attempting to update antenna options!");
+ });
// TX frequency
subtree->create<double>(tx_fe_path / "freq" / "value")
- .set_coercer([this, chan_idx](const double freq){
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_tx_frequency(freq, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_frequency(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_frequency(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "freq" / "range")
.set(meta_range_t(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ, 1.0))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update freq range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update freq range!");
+ });
// RX frequency
subtree->create<double>(rx_fe_path / "freq" / "value")
- .set_coercer([this, chan_idx](const double freq){
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_rx_frequency(freq, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_rx_frequency(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_rx_frequency(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "freq" / "range")
.set(meta_range_t(MAGNESIUM_MIN_FREQ, MAGNESIUM_MAX_FREQ, 1.0))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update freq range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update freq range!");
+ });
// TX bandwidth
subtree->create<double>(tx_fe_path / "bandwidth" / "value")
.set(AD9371_TX_MAX_BANDWIDTH)
- .set_coercer([this, chan_idx](const double bw){
+ .set_coercer([this, chan_idx](const double bw) {
return this->set_tx_bandwidth(bw, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->get_tx_bandwidth(chan_idx);
- })
- ;
+ .set_publisher([this, chan_idx]() { return this->get_tx_bandwidth(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "bandwidth" / "range")
.set(meta_range_t(AD9371_TX_MIN_BANDWIDTH, AD9371_TX_MAX_BANDWIDTH))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update bandwidth range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update bandwidth range!");
+ });
// RX bandwidth
subtree->create<double>(rx_fe_path / "bandwidth" / "value")
.set(AD9371_RX_MAX_BANDWIDTH)
- .set_coercer([this, chan_idx](const double bw){
+ .set_coercer([this, chan_idx](const double bw) {
return this->set_rx_bandwidth(bw, chan_idx);
- })
- ;
+ });
subtree->create<meta_range_t>(rx_fe_path / "bandwidth" / "range")
.set(meta_range_t(AD9371_RX_MIN_BANDWIDTH, AD9371_RX_MAX_BANDWIDTH))
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update bandwidth range!");
- })
- ;
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update bandwidth range!");
+ });
// TX gains
subtree->create<double>(tx_fe_path / "gains" / "all" / "value")
- .set_coercer([this, chan_idx](const double gain){
- return this->set_tx_gain(gain, chan_idx);
- })
- .set_publisher([this, chan_idx](){
- return radio_ctrl_impl::get_tx_gain(chan_idx);
- })
- ;
+ .set_coercer([this, chan_idx](
+ const double gain) { return this->set_tx_gain(gain, chan_idx); })
+ .set_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_tx_gain(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / "all" / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(0.0, 0.0, 0.0);
} else {
- return meta_range_t(
- ALL_TX_MIN_GAIN,
- ALL_TX_MAX_GAIN,
- ALL_TX_GAIN_STEP
- );
+ return meta_range_t(ALL_TX_MIN_GAIN, ALL_TX_MAX_GAIN, ALL_TX_GAIN_STEP);
}
- })
- ;
+ });
subtree->create<std::vector<std::string>>(tx_fe_path / "gains/all/profile/options")
.set({"manual", "default"});
subtree->create<std::string>(tx_fe_path / "gains/all/profile/value")
- .set_coercer([this](const std::string& profile){
+ .set_coercer([this](const std::string& profile) {
std::string return_profile = profile;
- if (std::find(MAGNESIUM_GP_OPTIONS.begin(),
- MAGNESIUM_GP_OPTIONS.end(),
- profile
- ) == MAGNESIUM_GP_OPTIONS.end())
- {
+ if (std::find(
+ MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
+ == MAGNESIUM_GP_OPTIONS.end()) {
return_profile = "default";
}
_gain_profile[TX_DIRECTION] = return_profile;
return return_profile;
})
- .set_publisher([this](){
- return _gain_profile[TX_DIRECTION];
- })
- ;
+ .set_publisher([this]() { return _gain_profile[TX_DIRECTION]; });
// RX gains
subtree->create<double>(rx_fe_path / "gains" / "all" / "value")
- .set_coercer([this, chan_idx](const double gain){
- return this->set_rx_gain(gain, chan_idx);
- })
- .set_publisher([this, chan_idx](){
- return radio_ctrl_impl::get_rx_gain(chan_idx);
- })
- ;
+ .set_coercer([this, chan_idx](
+ const double gain) { return this->set_rx_gain(gain, chan_idx); })
+ .set_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_rx_gain(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / "all" / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(0.0, 0.0, 0.0);
} else {
- return meta_range_t(
- ALL_RX_MIN_GAIN,
- ALL_RX_MAX_GAIN,
- ALL_RX_GAIN_STEP
- );
+ return meta_range_t(ALL_RX_MIN_GAIN, ALL_RX_MAX_GAIN, ALL_RX_GAIN_STEP);
}
- })
- ;
+ });
- subtree->create<std::vector<std::string> >(rx_fe_path / "gains/all/profile/options")
- .set(MAGNESIUM_GP_OPTIONS);
+ subtree->create<std::vector<std::string>>(rx_fe_path / "gains/all/profile/options")
+ .set(MAGNESIUM_GP_OPTIONS);
subtree->create<std::string>(rx_fe_path / "gains/all/profile/value")
- .set_coercer([this](const std::string& profile){
+ .set_coercer([this](const std::string& profile) {
std::string return_profile = profile;
- if (std::find(MAGNESIUM_GP_OPTIONS.begin(),
- MAGNESIUM_GP_OPTIONS.end(),
- profile
- ) == MAGNESIUM_GP_OPTIONS.end())
- {
+ if (std::find(
+ MAGNESIUM_GP_OPTIONS.begin(), MAGNESIUM_GP_OPTIONS.end(), profile)
+ == MAGNESIUM_GP_OPTIONS.end()) {
return_profile = "default";
}
_gain_profile[RX_DIRECTION] = return_profile;
return return_profile;
})
- .set_publisher([this](){
- return _gain_profile[RX_DIRECTION];
- })
- ;
+ .set_publisher([this]() { return _gain_profile[RX_DIRECTION]; });
// TX mykonos attenuation
subtree->create<double>(tx_fe_path / "gains" / MAGNESIUM_GAIN1 / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .set_coercer([this, chan_idx](const double gain) {
return _set_tx_gain(MAGNESIUM_GAIN1, gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->_get_tx_gain(MAGNESIUM_GAIN1, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_tx_gain(MAGNESIUM_GAIN1, chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / MAGNESIUM_GAIN1 / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(
- AD9371_MIN_TX_GAIN,
- AD9371_MAX_TX_GAIN,
- AD9371_TX_GAIN_STEP
- );
+ AD9371_MIN_TX_GAIN, AD9371_MAX_TX_GAIN, AD9371_TX_GAIN_STEP);
} else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
- // TX DSA
+ });
+ // TX DSA
subtree->create<double>(tx_fe_path / "gains" / MAGNESIUM_GAIN2 / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .set_coercer([this, chan_idx](const double gain) {
return this->_set_tx_gain(MAGNESIUM_GAIN2, gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->_get_tx_gain(MAGNESIUM_GAIN2, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_tx_gain(MAGNESIUM_GAIN2, chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / MAGNESIUM_GAIN2 / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(DSA_MIN_GAIN, DSA_MAX_GAIN, DSA_GAIN_STEP);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
- //TX amp
+ });
+ // TX amp
subtree->create<double>(tx_fe_path / "gains" / MAGNESIUM_AMP / "value")
.set_coercer([this, chan_idx](const double gain) {
return this->_set_tx_gain(MAGNESIUM_AMP, gain, chan_idx);
})
- .set_publisher([this, chan_idx]() {
- return this->_get_tx_gain(MAGNESIUM_AMP, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_tx_gain(MAGNESIUM_AMP, chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / MAGNESIUM_AMP / "range")
- .add_coerced_subscriber([](const meta_range_t &) {
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[TX_DIRECTION] == "manual") {
return meta_range_t(AMP_MIN_GAIN, AMP_MAX_GAIN, AMP_GAIN_STEP);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
+ });
// RX mykonos attenuation
subtree->create<double>(rx_fe_path / "gains" / MAGNESIUM_GAIN1 / "value")
- .set_coercer([this, chan_idx](const double gain){
- UHD_VAR(gain);
+ .set_coercer([this, chan_idx](const double gain) {
+ UHD_VAR(gain);
return this->_set_rx_gain(MAGNESIUM_GAIN1, gain, chan_idx);
})
- .set_publisher([this, chan_idx](){
- return this->_get_rx_gain(MAGNESIUM_GAIN1, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_rx_gain(MAGNESIUM_GAIN1, chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / MAGNESIUM_GAIN1 / "range")
- .add_coerced_subscriber([](const meta_range_t &) {
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(
- AD9371_MIN_RX_GAIN,
- AD9371_MAX_RX_GAIN,
- AD9371_RX_GAIN_STEP
- );
+ AD9371_MIN_RX_GAIN, AD9371_MAX_RX_GAIN, AD9371_RX_GAIN_STEP);
} else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
- //RX DSA
+ });
+ // RX DSA
subtree->create<double>(rx_fe_path / "gains" / MAGNESIUM_GAIN2 / "value")
.set_coercer([this, chan_idx](const double gain) {
UHD_VAR(gain);
return this->_set_rx_gain(MAGNESIUM_GAIN2, gain, chan_idx);
})
- .set_publisher([this, chan_idx]() {
- return this->_get_rx_gain(MAGNESIUM_GAIN2, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_rx_gain(MAGNESIUM_GAIN2, chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / MAGNESIUM_GAIN2 / "range")
- .add_coerced_subscriber([](const meta_range_t &){
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(DSA_MIN_GAIN, DSA_MAX_GAIN, DSA_MAX_GAIN);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
+ });
- //RX amp
+ // RX amp
subtree->create<double>(rx_fe_path / "gains" / MAGNESIUM_AMP / "value")
.set_coercer([this, chan_idx](const double gain) {
return this->_set_rx_gain(MAGNESIUM_AMP, gain, chan_idx);
})
- .set_publisher([this, chan_idx]() {
- return this->_get_rx_gain(MAGNESIUM_AMP, chan_idx);
- })
- ;
+ .set_publisher(
+ [this, chan_idx]() { return this->_get_rx_gain(MAGNESIUM_AMP, chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / MAGNESIUM_AMP / "range")
- .add_coerced_subscriber([](const meta_range_t &) {
- throw uhd::runtime_error(
- "Attempting to update gain range!");
+ .add_coerced_subscriber([](const meta_range_t&) {
+ throw uhd::runtime_error("Attempting to update gain range!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
if (_gain_profile[RX_DIRECTION] == "manual") {
return meta_range_t(AMP_MIN_GAIN, AMP_MAX_GAIN, AMP_GAIN_STEP);
- }else{
+ } else {
return meta_range_t(0.0, 0.0, 0.0);
}
- })
- ;
+ });
// TX LO lock sensor //////////////////////////////////////////////////////
// Note: The lowband and AD9371 LO lock sensors are generated
// programmatically in set_rpc_client(). The actual lo_locked publisher is
// also set there.
subtree->create<sensor_value_t>(tx_fe_path / "sensors" / "lo_locked")
- .set(sensor_value_t("all_los", false, "locked", "unlocked"))
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .set(sensor_value_t("all_los", false, "locked", "unlocked"))
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return sensor_value_t(
- "all_los",
- this->get_lo_lock_status(TX_DIRECTION),
- "locked", "unlocked"
- );
- })
- ;
+ "all_los", this->get_lo_lock_status(TX_DIRECTION), "locked", "unlocked");
+ });
// RX LO lock sensor (see not on TX LO lock sensor)
subtree->create<sensor_value_t>(rx_fe_path / "sensors" / "lo_locked")
- .set(sensor_value_t("all_los", false, "locked", "unlocked"))
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .set(sensor_value_t("all_los", false, "locked", "unlocked"))
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this](){
+ .set_publisher([this]() {
return sensor_value_t(
- "all_los",
- this->get_lo_lock_status(RX_DIRECTION),
- "locked", "unlocked"
- );
- })
- ;
- //LO Specific
- //RX LO
- subtree->create<meta_range_t>(rx_fe_path / "los"/MAGNESIUM_LO1/"freq/range")
- .set_publisher([this,chan_idx](){
+ "all_los", this->get_lo_lock_status(RX_DIRECTION), "locked", "unlocked");
+ });
+ // LO Specific
+ // RX LO
+ subtree->create<meta_range_t>(rx_fe_path / "los" / MAGNESIUM_LO1 / "freq/range")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_freq_range(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(rx_fe_path / "los"/MAGNESIUM_LO1/"source/options")
- .set_publisher([this,chan_idx](){
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ rx_fe_path / "los" / MAGNESIUM_LO1 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_sources(MAGNESIUM_LO1, chan_idx);
+ });
+ subtree->create<std::string>(rx_fe_path / "los" / MAGNESIUM_LO1 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
+ this->set_rx_lo_source(src, MAGNESIUM_LO1, chan_idx);
})
- ;
- subtree->create<std::string>(rx_fe_path / "los"/MAGNESIUM_LO1/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
- this->set_rx_lo_source(src, MAGNESIUM_LO1,chan_idx);
- })
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_source(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<double>(rx_fe_path / "los"/MAGNESIUM_LO1/"freq/value")
- .set_publisher([this,chan_idx](){
- return this->get_rx_lo_freq(MAGNESIUM_LO1, chan_idx);
- })
- .set_coercer([this,chan_idx](const double freq){
+ });
+ subtree->create<double>(rx_fe_path / "los" / MAGNESIUM_LO1 / "freq/value")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_rx_lo_freq(MAGNESIUM_LO1, chan_idx); })
+ .set_coercer([this, chan_idx](const double freq) {
return this->set_rx_lo_freq(freq, MAGNESIUM_LO1, chan_idx);
- })
- ;
+ });
- subtree->create<meta_range_t>(rx_fe_path / "los"/MAGNESIUM_LO2/"freq/range")
- .set_publisher([this,chan_idx](){
+ subtree->create<meta_range_t>(rx_fe_path / "los" / MAGNESIUM_LO2 / "freq/range")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_freq_range(MAGNESIUM_LO2, chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(rx_fe_path / "los"/MAGNESIUM_LO2/"source/options")
- .set_publisher([this,chan_idx](){
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ rx_fe_path / "los" / MAGNESIUM_LO2 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_sources(MAGNESIUM_LO2, chan_idx);
- })
- ;
+ });
- subtree->create<std::string>(rx_fe_path / "los"/MAGNESIUM_LO2/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
+ subtree->create<std::string>(rx_fe_path / "los" / MAGNESIUM_LO2 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
this->set_rx_lo_source(src, MAGNESIUM_LO2, chan_idx);
})
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_source(MAGNESIUM_LO2, chan_idx);
- })
- ;
- subtree->create<double>(rx_fe_path / "los"/MAGNESIUM_LO2/"freq/value")
- .set_publisher([this,chan_idx](){
- return this->get_rx_lo_freq(MAGNESIUM_LO2, chan_idx);
- })
- .set_coercer([this,chan_idx](double freq){
+ });
+ subtree->create<double>(rx_fe_path / "los" / MAGNESIUM_LO2 / "freq/value")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_rx_lo_freq(MAGNESIUM_LO2, chan_idx); })
+ .set_coercer([this, chan_idx](double freq) {
return this->set_rx_lo_freq(freq, MAGNESIUM_LO2, chan_idx);
});
- //TX LO
- subtree->create<meta_range_t>(tx_fe_path / "los"/MAGNESIUM_LO1/"freq/range")
- .set_publisher([this,chan_idx](){
+ // TX LO
+ subtree->create<meta_range_t>(tx_fe_path / "los" / MAGNESIUM_LO1 / "freq/range")
+ .set_publisher([this, chan_idx]() {
return this->get_rx_lo_freq_range(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(tx_fe_path / "los"/MAGNESIUM_LO1/"source/options")
- .set_publisher([this,chan_idx](){
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ tx_fe_path / "los" / MAGNESIUM_LO1 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_sources(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<std::string>(tx_fe_path / "los"/MAGNESIUM_LO1/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
+ });
+ subtree->create<std::string>(tx_fe_path / "los" / MAGNESIUM_LO1 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
this->set_tx_lo_source(src, MAGNESIUM_LO1, chan_idx);
})
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_source(MAGNESIUM_LO1, chan_idx);
- })
- ;
- subtree->create<double>(tx_fe_path / "los"/MAGNESIUM_LO1/"freq/value ")
- .set_publisher([this,chan_idx](){
- return this->get_tx_lo_freq(MAGNESIUM_LO1, chan_idx);
- })
- .set_coercer([this,chan_idx](double freq){
+ });
+ subtree->create<double>(tx_fe_path / "los" / MAGNESIUM_LO1 / "freq/value ")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_tx_lo_freq(MAGNESIUM_LO1, chan_idx); })
+ .set_coercer([this, chan_idx](double freq) {
return this->set_tx_lo_freq(freq, MAGNESIUM_LO1, chan_idx);
- })
- ;
+ });
- subtree->create<meta_range_t>(tx_fe_path / "los"/MAGNESIUM_LO2/"freq/range")
- .set_publisher([this,chan_idx](){
- return this->get_tx_lo_freq_range(MAGNESIUM_LO2,chan_idx);
- })
- ;
- subtree->create<std::vector<std::string>>(tx_fe_path / "los"/MAGNESIUM_LO2/"source/options")
- .set_publisher([this,chan_idx](){
+ subtree->create<meta_range_t>(tx_fe_path / "los" / MAGNESIUM_LO2 / "freq/range")
+ .set_publisher([this, chan_idx]() {
+ return this->get_tx_lo_freq_range(MAGNESIUM_LO2, chan_idx);
+ });
+ subtree
+ ->create<std::vector<std::string>>(
+ tx_fe_path / "los" / MAGNESIUM_LO2 / "source/options")
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_sources(MAGNESIUM_LO2, chan_idx);
- })
- ;
+ });
- subtree->create<std::string>(tx_fe_path / "los"/MAGNESIUM_LO2/"source/value")
- .add_coerced_subscriber([this,chan_idx](std::string src){
+ subtree->create<std::string>(tx_fe_path / "los" / MAGNESIUM_LO2 / "source/value")
+ .add_coerced_subscriber([this, chan_idx](std::string src) {
this->set_tx_lo_source(src, MAGNESIUM_LO2, chan_idx);
})
- .set_publisher([this,chan_idx](){
+ .set_publisher([this, chan_idx]() {
return this->get_tx_lo_source(MAGNESIUM_LO2, chan_idx);
- })
- ;
- subtree->create<double>(tx_fe_path / "los"/MAGNESIUM_LO2/"freq/value")
- .set_publisher([this,chan_idx](){
- return this->get_tx_lo_freq(MAGNESIUM_LO2, chan_idx);
- })
- .set_coercer([this,chan_idx](double freq){
+ });
+ subtree->create<double>(tx_fe_path / "los" / MAGNESIUM_LO2 / "freq/value")
+ .set_publisher(
+ [this, chan_idx]() { return this->get_tx_lo_freq(MAGNESIUM_LO2, chan_idx); })
+ .set_coercer([this, chan_idx](double freq) {
return this->set_tx_lo_freq(freq, MAGNESIUM_LO2, chan_idx);
});
}
@@ -721,13 +560,11 @@ void magnesium_radio_ctrl_impl::_init_prop_tree()
{
const fs_path fe_base = fs_path("dboards") / _radio_slot;
for (size_t chan_idx = 0; chan_idx < MAGNESIUM_NUM_CHANS; chan_idx++) {
- this->_init_frontend_subtree(
- _tree->subtree(fe_base), chan_idx);
+ this->_init_frontend_subtree(_tree->subtree(fe_base), chan_idx);
}
// EEPROM paths subject to change FIXME
- _tree->create<eeprom_map_t>(_root_path / "eeprom")
- .set(eeprom_map_t());
+ _tree->create<eeprom_map_t>(_root_path / "eeprom").set(eeprom_map_t());
// TODO change codec names
_tree->create<int>("rx_codecs" / _radio_slot / "gains");
@@ -736,94 +573,108 @@ void magnesium_radio_ctrl_impl::_init_prop_tree()
_tree->create<std::string>("tx_codecs" / _radio_slot / "name").set("AD9371 Dual DAC");
// TODO remove this dirty hack
- if (not _tree->exists("tick_rate"))
- {
- _tree->create<double>("tick_rate")
- .set_publisher([this](){ return this->get_rate(); })
- ;
+ if (not _tree->exists("tick_rate")) {
+ _tree->create<double>("tick_rate").set_publisher([this]() {
+ return this->get_rate();
+ });
}
// *****FP_GPIO************************
- for(const auto& attr: usrp::gpio_atr::gpio_attr_map) {
- if (not _tree->exists(fs_path("gpio") / "FP0" / attr.second)){
- switch (attr.first){
+ for (const auto& attr : usrp::gpio_atr::gpio_attr_map) {
+ if (not _tree->exists(fs_path("gpio") / "FP0" / attr.second)) {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- //FIXME: move this creation of this branch of ptree out side of radio impl;
- // since there's no data dependency between radio and SRC setting for FP0
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(
- 32,
- usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](
- const std::vector<std::string> str_val){
- uint32_t radio_src_value = 0;
- uint32_t master_value = 0;
- for(size_t i = 0 ; i<str_val.size(); i++){
- if(str_val[i] == "PS"){
- master_value += 1<<i;;
- }else{
- auto port_num = extract_port_number(str_val[i],_tree);
- radio_src_value =(1<<(2*i))*port_num + radio_src_value;
+ // FIXME: move this creation of this branch of ptree out side of
+ // radio impl;
+ // since there's no data dependency between radio and SRC setting for
+ // FP0
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t radio_src_value = 0;
+ uint32_t master_value = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ if (str_val[i] == "PS") {
+ master_value += 1 << i;
+ ;
+ } else {
+ auto port_num =
+ extract_port_number(str_val[i], _tree);
+ radio_src_value =
+ (1 << (2 * i)) * port_num + radio_src_value;
+ }
}
- }
- _rpcc->notify_with_token("set_fp_gpio_master", master_value);
- _rpcc->notify_with_token("set_fp_gpio_radio_src", radio_src_value);
- });
- break;
+ _rpcc->notify_with_token(
+ "set_fp_gpio_master", master_value);
+ _rpcc->notify_with_token(
+ "set_fp_gpio_radio_src", radio_src_value);
+ });
+ break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->create<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(
- 32,
- usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](
- const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->create<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
- case usrp::gpio_atr::GPIO_READBACK:{
+ case usrp::gpio_atr::GPIO_READBACK: {
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set_publisher([this](){
- return _fp_gpio->read_gpio();
- }
- );
- }
- break;
+ .set_publisher([this]() { return _fp_gpio->read_gpio(); });
+ } break;
default:
_tree->create<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
- }else{
- switch (attr.first){
+ } else {
+ switch (attr.first) {
case usrp::gpio_atr::GPIO_SRC:
- break;
+ break;
case usrp::gpio_atr::GPIO_CTRL:
case usrp::gpio_atr::GPIO_DDR:
- _tree->access<std::vector<std::string>>(fs_path("gpio") / "FP0" / attr.second)
- .set(std::vector<std::string>(32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
- .add_coerced_subscriber([this, attr](const std::vector<std::string> str_val){
- uint32_t val = 0;
- for(size_t i = 0 ; i < str_val.size() ; i++){
- val += usrp::gpio_atr::gpio_attr_value_pair.at(attr.second).at(str_val[i])<<i;
- }
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ _tree
+ ->access<std::vector<std::string>>(
+ fs_path("gpio") / "FP0" / attr.second)
+ .set(std::vector<std::string>(
+ 32, usrp::gpio_atr::default_attr_value_map.at(attr.first)))
+ .add_coerced_subscriber(
+ [this, attr](const std::vector<std::string> str_val) {
+ uint32_t val = 0;
+ for (size_t i = 0; i < str_val.size(); i++) {
+ val += usrp::gpio_atr::gpio_attr_value_pair
+ .at(attr.second)
+ .at(str_val[i])
+ << i;
+ }
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
break;
case usrp::gpio_atr::GPIO_READBACK:
break;
default:
_tree->access<uint32_t>(fs_path("gpio") / "FP0" / attr.second)
- .set(0)
- .add_coerced_subscriber([this, attr](const uint32_t val){
- _fp_gpio->set_gpio_attr(attr.first, val);
- });
+ .set(0)
+ .add_coerced_subscriber([this, attr](const uint32_t val) {
+ _fp_gpio->set_gpio_attr(attr.first, val);
+ });
}
}
}
@@ -831,34 +682,27 @@ void magnesium_radio_ctrl_impl::_init_prop_tree()
void magnesium_radio_ctrl_impl::_init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
-) {
+ const direction_t dir, const size_t chan_idx)
+{
const std::string trx = (dir == RX_DIRECTION) ? "RX" : "TX";
- const fs_path fe_path =
- fs_path("dboards") / _radio_slot /
- (dir == RX_DIRECTION ? "rx_frontends" : "tx_frontends") / chan_idx;
- auto sensor_list =
- _rpcc->request_with_token<std::vector<std::string>>(
- this->_rpc_prefix + "get_sensors", trx);
+ const fs_path fe_path = fs_path("dboards") / _radio_slot
+ / (dir == RX_DIRECTION ? "rx_frontends" : "tx_frontends")
+ / chan_idx;
+ auto sensor_list = _rpcc->request_with_token<std::vector<std::string>>(
+ this->_rpc_prefix + "get_sensors", trx);
UHD_LOG_TRACE(unique_id(),
- "Chan " << chan_idx << ": Found "
- << sensor_list.size() << " " << trx << " sensors.");
- for (const auto &sensor_name : sensor_list) {
- UHD_LOG_TRACE(unique_id(),
- "Adding " << trx << " sensor " << sensor_name);
+ "Chan " << chan_idx << ": Found " << sensor_list.size() << " " << trx
+ << " sensors.");
+ for (const auto& sensor_name : sensor_list) {
+ UHD_LOG_TRACE(unique_id(), "Adding " << trx << " sensor " << sensor_name);
_tree->create<sensor_value_t>(fe_path / "sensors" / sensor_name)
- .add_coerced_subscriber([](const sensor_value_t &){
- throw uhd::runtime_error(
- "Attempting to write to sensor!");
+ .add_coerced_subscriber([](const sensor_value_t&) {
+ throw uhd::runtime_error("Attempting to write to sensor!");
})
- .set_publisher([this, trx, sensor_name, chan_idx](){
+ .set_publisher([this, trx, sensor_name, chan_idx]() {
return sensor_value_t(
this->_rpcc->request_with_token<sensor_value_t::sensor_map_t>(
- this->_rpc_prefix + "get_sensor",
- trx, sensor_name, chan_idx)
- );
- })
- ;
+ this->_rpc_prefix + "get_sensor", trx, sensor_name, chan_idx));
+ });
}
}