aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard
diff options
context:
space:
mode:
authorBrent Stapleton <brent.stapleton@ettus.com>2019-01-14 10:35:25 -0800
committerBrent Stapleton <brent.stapleton@ettus.com>2019-01-16 11:40:23 -0800
commit967be2a4e82b1a125b26bb72a60318a4fb2b50c4 (patch)
tree8a24954b54d1546dc8049a17e485adb0a605f74f /host/lib/usrp/dboard
parentaafe4e8b742a0e21d3818f21f34e3c8613132530 (diff)
downloaduhd-967be2a4e82b1a125b26bb72a60318a4fb2b50c4.tar.gz
uhd-967be2a4e82b1a125b26bb72a60318a4fb2b50c4.tar.bz2
uhd-967be2a4e82b1a125b26bb72a60318a4fb2b50c4.zip
uhd: mpm: apply clang-format to all files
Applying formatting changes to all .cpp and .hpp files in the following directories: ``` find host/examples/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/tests/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/dboard/neon/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/dboard/magnesium/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/device3/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/mpmd/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/lib/usrp/x300/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find host/utils/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file find mpm/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file ``` Also formatted host/include/, except Cpp03 was used as a the language standard instead of Cpp11. ``` sed -i 's/ Cpp11/ Cpp03/g' .clang-format find host/include/ -iname *.hpp -o -iname *.cpp | \ xargs clang-format -i -style=file ``` Formatting style was designated by the .clang-format file.
Diffstat (limited to 'host/lib/usrp/dboard')
-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
-rw-r--r--host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp69
-rw-r--r--host/lib/usrp/dboard/neon/neon_bands.cpp101
-rw-r--r--host/lib/usrp/dboard/neon/neon_constants.hpp38
-rw-r--r--host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp519
-rw-r--r--host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp127
-rw-r--r--host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp477
-rw-r--r--host/lib/usrp/dboard/neon/neon_regs.hpp17
20 files changed, 1926 insertions, 2574 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));
+ });
}
}
diff --git a/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp b/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp
index e19f890ca..a9cf28fc2 100644
--- a/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp
+++ b/host/lib/usrp/dboard/neon/neon_ad9361_iface.cpp
@@ -14,38 +14,33 @@ using namespace uhd;
class neon_ad9361_iface : public ad9361_ctrl
{
public:
- neon_ad9361_iface(
- rpc_client::sptr rpcc
- ) : _rpcc(rpcc)
- , _rpc_prefix("db_0_")
- , _log_prefix("AD9361")
+ neon_ad9361_iface(rpc_client::sptr rpcc)
+ : _rpcc(rpcc), _rpc_prefix("db_0_"), _log_prefix("AD9361")
{
- UHD_LOG_TRACE(_log_prefix,
- "Initialized controls with RPC prefix " << _rpc_prefix);
+ UHD_LOG_TRACE(
+ _log_prefix, "Initialized controls with RPC prefix " << _rpc_prefix);
}
- double set_bw_filter(const std::string &which, const double bw)
+ double set_bw_filter(const std::string& which, const double bw)
{
return _rpcc->request_with_token<double>(
this->_rpc_prefix + "set_bw_filter", which, bw);
}
- double set_gain(const std::string &which, const double value)
+ double set_gain(const std::string& which, const double value)
{
return _rpcc->request_with_token<double>(
this->_rpc_prefix + "set_gain", which, value);
}
- void set_agc(const std::string &which, bool enable)
+ void set_agc(const std::string& which, bool enable)
{
- _rpcc->request_with_token<void>(
- this->_rpc_prefix + "set_agc", which, enable);
+ _rpcc->request_with_token<void>(this->_rpc_prefix + "set_agc", which, enable);
}
- void set_agc_mode(const std::string &which, const std::string &mode)
+ void set_agc_mode(const std::string& which, const std::string& mode)
{
- _rpcc->request_with_token<void>(
- this->_rpc_prefix + "set_agc_mode", which, mode);
+ _rpcc->request_with_token<void>(this->_rpc_prefix + "set_agc_mode", which, mode);
}
double set_clock_rate(const double rate)
@@ -60,43 +55,41 @@ public:
this->_rpc_prefix + "set_active_chains", tx1, tx2, rx1, rx2);
}
- double tune(const std::string &which, const double value)
+ double tune(const std::string& which, const double value)
{
return _rpcc->request_with_token<double>(
this->_rpc_prefix + "tune", which, value);
}
- void set_dc_offset_auto(const std::string &which, const bool on)
+ void set_dc_offset_auto(const std::string& which, const bool on)
{
_rpcc->request_with_token<void>(
this->_rpc_prefix + "set_dc_offset_auto", which, on);
}
- void set_timing_mode(const std::string &timing_mode)
+ void set_timing_mode(const std::string& timing_mode)
{
_rpcc->request_with_token<void>(
this->_rpc_prefix + "set_timing_mode", timing_mode);
}
- void set_iq_balance_auto(const std::string &which, const bool on)
+ void set_iq_balance_auto(const std::string& which, const bool on)
{
_rpcc->request_with_token<void>(
this->_rpc_prefix + "set_iq_balance_auto", which, on);
}
- double get_freq(const std::string &which)
+ double get_freq(const std::string& which)
{
- return _rpcc->request_with_token<double>(
- this->_rpc_prefix + "get_freq", which);
+ return _rpcc->request_with_token<double>(this->_rpc_prefix + "get_freq", which);
}
void data_port_loopback(const bool on)
{
- _rpcc->request_with_token<void>(
- this->_rpc_prefix + "data_port_loopback", on);
+ _rpcc->request_with_token<void>(this->_rpc_prefix + "data_port_loopback", on);
}
- sensor_value_t get_rssi(const std::string &which)
+ sensor_value_t get_rssi(const std::string& which)
{
return sensor_value_t(_rpcc->request_with_token<sensor_value_t::sensor_map_t>(
this->_rpc_prefix + "get_rssi", which));
@@ -108,23 +101,25 @@ public:
this->_rpc_prefix + "get_temperature"));
}
- std::vector<std::string> get_filter_names(const std::string &which)
+ std::vector<std::string> get_filter_names(const std::string& which)
{
return _rpcc->request_with_token<std::vector<std::string>>(
this->_rpc_prefix + "get_filter_names", which);
}
- filter_info_base::sptr get_filter(const std::string &/*which*/,
- const std::string &/*filter_name*/)
+ filter_info_base::sptr get_filter(
+ const std::string& /*which*/, const std::string& /*filter_name*/)
{
- throw uhd::runtime_error("ad9361_ctrl::get_filter is not supported over an RPC connection");
+ throw uhd::runtime_error(
+ "ad9361_ctrl::get_filter is not supported over an RPC connection");
}
- void set_filter(const std::string &/*which*/,
- const std::string &/*filter_name*/,
- const filter_info_base::sptr /*filter*/)
+ void set_filter(const std::string& /*which*/,
+ const std::string& /*filter_name*/,
+ const filter_info_base::sptr /*filter*/)
{
- throw uhd::runtime_error("ad9361_ctrl::set_filter is not supported over an RPC connection");
+ throw uhd::runtime_error(
+ "ad9361_ctrl::set_filter is not supported over an RPC connection");
}
void output_digital_test_tone(bool enb)
@@ -150,13 +145,11 @@ ad9361_ctrl::sptr make_rpc(rpc_client::sptr rpcc)
return ad9361_ctrl::sptr(new neon_ad9361_iface(rpcc));
}
-/*! Helper function to convert direction and channel to the 'which' required by most Catalina
- driver functions */
+/*! Helper function to convert direction and channel to the 'which' required by most
+ Catalina driver functions */
std::string get_which_ad9361_chain(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 str(boost::format("%s%d") % (dir == RX_DIRECTION ? "RX" : "TX") % (chan + 1));
}
diff --git a/host/lib/usrp/dboard/neon/neon_bands.cpp b/host/lib/usrp/dboard/neon/neon_bands.cpp
index 25aa0a181..303d2801d 100644
--- a/host/lib/usrp/dboard/neon/neon_bands.cpp
+++ b/host/lib/usrp/dboard/neon/neon_bands.cpp
@@ -4,8 +4,8 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "neon_radio_ctrl_impl.hpp"
#include "neon_constants.hpp"
+#include "neon_radio_ctrl_impl.hpp"
#include <uhd/utils/math.hpp>
/*
@@ -51,54 +51,55 @@ 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 LB_B2, B3, .. HB same as
- * the schematic.
- *
- * The following constants define lower cutoff frequencies for each band.
- * LB_B2 does not have a lower cutoff frequency, it is implied by
- * AD9361_MIN_FREQ. NEON_RX_BAND1_MIN_FREQ is the cutover frequency
- * for switching from LB_B2 to LB_B3, 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 NEON_RX_LB_BAND3_MIN_FREQ = 450e6;
- constexpr double NEON_RX_LB_BAND4_MIN_FREQ = 700e6;
- constexpr double NEON_RX_LB_BAND5_MIN_FREQ = 1200e6;
- constexpr double NEON_RX_LB_BAND6_MIN_FREQ = 1800e6;
- constexpr double NEON_RX_LB_BAND7_MIN_FREQ = 2350e6;
- constexpr double NEON_RX_HB_MIN_FREQ = 2600e6;
+/* Note on the RX filter bank:
+ *
+ * The RX path has 7 bands, which we call LB_B2, B3, .. HB same as
+ * the schematic.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * LB_B2 does not have a lower cutoff frequency, it is implied by
+ * AD9361_MIN_FREQ. NEON_RX_BAND1_MIN_FREQ is the cutover frequency
+ * for switching from LB_B2 to LB_B3, 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 NEON_RX_LB_BAND3_MIN_FREQ = 450e6;
+constexpr double NEON_RX_LB_BAND4_MIN_FREQ = 700e6;
+constexpr double NEON_RX_LB_BAND5_MIN_FREQ = 1200e6;
+constexpr double NEON_RX_LB_BAND6_MIN_FREQ = 1800e6;
+constexpr double NEON_RX_LB_BAND7_MIN_FREQ = 2350e6;
+constexpr double NEON_RX_HB_MIN_FREQ = 2600e6;
- /* Note on the TX filter bank:
- *
- * The TX path has 9 bands, which we name according to the schematic.
- *
- * The following constants define lower cutoff frequencies for each band.
- * LB_80 does not have a lower cutoff frequency, it is implied by
- * AD9361_MIN_FREQ. NEON_TX_LB_160_MIN_FREQ is the cutover frequency
- * for switching from LB_80 to LB_160, and so on.
- *
- * On current Neon 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).
- */
- constexpr double NEON_TX_LB_160_MIN_FREQ = 117.7e6;
- constexpr double NEON_TX_LB_225_MIN_FREQ = 178.2e6;
- constexpr double NEON_TX_LB_400_MIN_FREQ = 284.3e6;
- constexpr double NEON_TX_LB_575_MIN_FREQ = 453.7e6;
- constexpr double NEON_TX_LB_1000_MIN_FREQ = 723.8e6;
- constexpr double NEON_TX_LB_1700_MIN_FREQ = 1154.9e6;
- constexpr double NEON_TX_LB_2750_MIN_FREQ = 1842.6e6;
- constexpr double NEON_TX_HB_MIN_FREQ = 2940.0e6;
-}
+/* Note on the TX filter bank:
+ *
+ * The TX path has 9 bands, which we name according to the schematic.
+ *
+ * The following constants define lower cutoff frequencies for each band.
+ * LB_80 does not have a lower cutoff frequency, it is implied by
+ * AD9361_MIN_FREQ. NEON_TX_LB_160_MIN_FREQ is the cutover frequency
+ * for switching from LB_80 to LB_160, and so on.
+ *
+ * On current Neon 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).
+ */
+constexpr double NEON_TX_LB_160_MIN_FREQ = 117.7e6;
+constexpr double NEON_TX_LB_225_MIN_FREQ = 178.2e6;
+constexpr double NEON_TX_LB_400_MIN_FREQ = 284.3e6;
+constexpr double NEON_TX_LB_575_MIN_FREQ = 453.7e6;
+constexpr double NEON_TX_LB_1000_MIN_FREQ = 723.8e6;
+constexpr double NEON_TX_LB_1700_MIN_FREQ = 1154.9e6;
+constexpr double NEON_TX_LB_2750_MIN_FREQ = 1842.6e6;
+constexpr double NEON_TX_HB_MIN_FREQ = 2940.0e6;
+} // namespace
-neon_radio_ctrl_impl::rx_band
-neon_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
+neon_radio_ctrl_impl::rx_band neon_radio_ctrl_impl::_map_freq_to_rx_band(
+ const double freq)
+{
neon_radio_ctrl_impl::rx_band band;
if (fp_compare_epsilon<double>(freq) < AD9361_RX_MIN_FREQ) {
@@ -124,8 +125,9 @@ neon_radio_ctrl_impl::_map_freq_to_rx_band(const double freq) {
return band;
}
-neon_radio_ctrl_impl::tx_band
-neon_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
+neon_radio_ctrl_impl::tx_band neon_radio_ctrl_impl::_map_freq_to_tx_band(
+ const double freq)
+{
neon_radio_ctrl_impl::tx_band band;
if (fp_compare_epsilon<double>(freq) < AD9361_TX_MIN_FREQ) {
@@ -154,4 +156,3 @@ neon_radio_ctrl_impl::_map_freq_to_tx_band(const double freq) {
return band;
}
-
diff --git a/host/lib/usrp/dboard/neon/neon_constants.hpp b/host/lib/usrp/dboard/neon/neon_constants.hpp
index 58e5244fc..42cfb6579 100644
--- a/host/lib/usrp/dboard/neon/neon_constants.hpp
+++ b/host/lib/usrp/dboard/neon/neon_constants.hpp
@@ -7,16 +7,16 @@
#ifndef INCLUDED_LIBUHD_NEON_CONSTANTS_HPP
#define INCLUDED_LIBUHD_NEON_CONSTANTS_HPP
-#include <vector>
-#include <string>
#include <cstddef>
+#include <string>
+#include <vector>
-static constexpr size_t FPGPIO_MASTER_RADIO = 0;
-static constexpr size_t TOTAL_RADIO_PORTS = 2;
-static constexpr double AD9361_RX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr size_t FPGPIO_MASTER_RADIO = 0;
+static constexpr size_t TOTAL_RADIO_PORTS = 2;
+static constexpr double AD9361_RX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9361_RX_MAX_BANDWIDTH = 40.0e6; // HZ
-static constexpr double AD9361_TX_MIN_BANDWIDTH = 20.0e6; // HZ
+static constexpr double AD9361_TX_MIN_BANDWIDTH = 20.0e6; // HZ
static constexpr double AD9361_TX_MAX_BANDWIDTH = 40.0e6; // HZ
static constexpr double AD9361_TX_MIN_FREQ = 47.0e6; // Hz
@@ -27,27 +27,25 @@ static constexpr double AD9361_RX_MAX_FREQ = 6.0e9; // Hz
static constexpr double NEON_RADIO_RATE = 16e6; // Hz
-static constexpr double AD9361_MIN_RX_GAIN = 0.0; // dB
-static constexpr double AD9361_MAX_RX_GAIN = 76; // dB
+static constexpr double AD9361_MIN_RX_GAIN = 0.0; // dB
+static constexpr double AD9361_MAX_RX_GAIN = 76; // dB
static constexpr double AD9361_RX_GAIN_STEP = 1.0; // dB
-static constexpr double AD9361_MIN_TX_GAIN = 0.0; // dB
-static constexpr double AD9361_MAX_TX_GAIN = 89.75; // dB
+static constexpr double AD9361_MIN_TX_GAIN = 0.0; // dB
+static constexpr double AD9361_MAX_TX_GAIN = 89.75; // dB
static constexpr double AD9361_TX_GAIN_STEP = 0.25; // dB
-static constexpr bool NEON_DEFAULT_AUTO_DC_OFFSET = true;
+static constexpr bool NEON_DEFAULT_AUTO_DC_OFFSET = true;
static constexpr bool NEON_DEFAULT_AUTO_IQ_BALANCE = true;
-static constexpr bool NEON_DEFAULT_AGC_ENABLE = false;
+static constexpr bool NEON_DEFAULT_AGC_ENABLE = false;
-static constexpr double NEON_DEFAULT_GAIN = 0.0;
-static constexpr double NEON_DEFAULT_FREQ = 2.4e9; // Hz
-static constexpr double NEON_DEFAULT_BANDWIDTH = 40e6; // Hz
-static constexpr char NEON_DEFAULT_RX_ANTENNA[] = "RX2";
-static constexpr char NEON_DEFAULT_TX_ANTENNA[] = "TX/RX";
+static constexpr double NEON_DEFAULT_GAIN = 0.0;
+static constexpr double NEON_DEFAULT_FREQ = 2.4e9; // Hz
+static constexpr double NEON_DEFAULT_BANDWIDTH = 40e6; // Hz
+static constexpr char NEON_DEFAULT_RX_ANTENNA[] = "RX2";
+static constexpr char NEON_DEFAULT_TX_ANTENNA[] = "TX/RX";
-static const std::vector<std::string> NEON_RX_ANTENNAS = {
- "RX2", "TX/RX"
-};
+static const std::vector<std::string> NEON_RX_ANTENNAS = {"RX2", "TX/RX"};
static constexpr size_t NEON_NUM_CHANS = 2;
diff --git a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp
index 71e467848..d8fabcee0 100644
--- a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.cpp
@@ -7,20 +7,20 @@
#include "neon_radio_ctrl_impl.hpp"
#include "neon_constants.hpp"
#include "neon_regs.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;
@@ -34,7 +34,7 @@ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(neon_radio_ctrl)
{
UHD_LOG_TRACE(unique_id(), "Entering neon_radio_ctrl_impl ctor...");
const char radio_slot_name[1] = {'A'};
- _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 = "db_0_";
@@ -58,38 +58,39 @@ bool neon_radio_ctrl_impl::check_radio_config()
// mapping of frontend to radio perif index
static const size_t FE0 = 0;
static const size_t FE1 = 1;
- const size_t num_rx = _is_streamer_active(RX_DIRECTION, FE0) + _is_streamer_active(RX_DIRECTION, FE1);
- const size_t num_tx = _is_streamer_active(TX_DIRECTION, FE0) + _is_streamer_active(TX_DIRECTION, FE1);
+ const size_t num_rx =
+ _is_streamer_active(RX_DIRECTION, FE0) + _is_streamer_active(RX_DIRECTION, FE1);
+ const size_t num_tx =
+ _is_streamer_active(TX_DIRECTION, FE0) + _is_streamer_active(TX_DIRECTION, FE1);
- //setup the active chains in the codec
+ // setup the active chains in the codec
if ((num_rx + num_tx) == 0) {
// Ensure at least one RX chain is enabled so AD9361 outputs a sample clock
this->set_streaming_mode(false, false, true, false);
} else {
- this->set_streaming_mode(
- _is_streamer_active(TX_DIRECTION, FE0),
- _is_streamer_active(TX_DIRECTION, FE1),
- _is_streamer_active(RX_DIRECTION, FE0),
- _is_streamer_active(RX_DIRECTION, FE1)
- );
+ this->set_streaming_mode(_is_streamer_active(TX_DIRECTION, FE0),
+ _is_streamer_active(TX_DIRECTION, FE1),
+ _is_streamer_active(RX_DIRECTION, FE0),
+ _is_streamer_active(RX_DIRECTION, FE1));
}
return true;
}
-void neon_radio_ctrl_impl::set_streaming_mode(const bool tx1, const bool tx2, const bool rx1, const bool rx2)
+void neon_radio_ctrl_impl::set_streaming_mode(
+ const bool tx1, const bool tx2, const bool rx1, const bool rx2)
{
UHD_LOG_TRACE(unique_id(), "Setting up streaming ...")
const size_t num_rx = rx1 + rx2;
const size_t num_tx = tx1 + tx2;
- //setup the active chains in the codec
+ // setup the active chains in the codec
_ad9361->set_active_chains(tx1, tx2, rx1, rx2);
const std::string TIMING_MODE_2R2T = "2R2T";
const std::string TIMING_MODE_1R1T = "1R1T";
- const std::string MIMO = "MIMO"; // 2R2T
- const std::string SISO_TX1 = "SISO_TX1"; // 1R1T
- const std::string SISO_TX0 = "SISO_TX0"; // 1R1T
+ const std::string MIMO = "MIMO"; // 2R2T
+ const std::string SISO_TX1 = "SISO_TX1"; // 1R1T
+ const std::string SISO_TX0 = "SISO_TX0"; // 1R1T
// setup 1R1T/2R2T mode in catalina and fpga
// The Catalina interface in the fpga needs to know which TX channel to use for
// the data on the LVDS lines.
@@ -107,11 +108,11 @@ void neon_radio_ctrl_impl::set_streaming_mode(const bool tx1, const bool tx2, co
}
}
-void neon_radio_ctrl_impl::set_channel_mode(const std::string &channel_mode)
+void neon_radio_ctrl_impl::set_channel_mode(const std::string& channel_mode)
{
- //MIMO for 2R2T mode for 2 channels
- //SISO_TX1 for 1R1T mode for 1 channel - TX1
- //SISO_TX0 for 1R1T mode for 1 channel - TX0
+ // MIMO for 2R2T mode for 2 channels
+ // SISO_TX1 for 1R1T mode for 1 channel - TX1
+ // SISO_TX0 for 1R1T mode for 1 channel - TX0
_rpcc->request_with_token<void>("set_channel_mode", channel_mode);
}
@@ -127,9 +128,8 @@ void neon_radio_ctrl_impl::set_channel_mode(const std::string &channel_mode)
Note: This currently only tests 2R2T mode
*/
void neon_radio_ctrl_impl::loopback_self_test(
- std::function<void(uint32_t)> poker_functor,
- std::function<uint64_t()> peeker_functor
-) {
+ std::function<void(uint32_t)> poker_functor, std::function<uint64_t()> peeker_functor)
+{
// Save current rate before running this test
const double current_rate = this->get_rate();
// Set 2R2T mode, stream on all channels
@@ -139,7 +139,7 @@ void neon_radio_ctrl_impl::loopback_self_test(
// Put AD936x in loopback mode
_ad9361->data_port_loopback(true);
UHD_LOG_INFO(unique_id(), "Performing CODEC loopback test... ");
- size_t hash = size_t(time(NULL));
+ size_t hash = size_t(time(NULL));
constexpr size_t loopback_count = 100;
// Allow some time for AD936x to enter loopback mode.
@@ -150,27 +150,26 @@ void neon_radio_ctrl_impl::loopback_self_test(
// Sleeping 1ms is far more than enough.
std::this_thread::sleep_for(std::chrono::milliseconds(1));
- for (size_t i = 0; i < loopback_count; i++)
- {
+ for (size_t i = 0; i < loopback_count; i++) {
// Create test word
boost::hash_combine(hash, i);
const uint32_t word32 = uint32_t(hash) & 0xfff0fff0;
- //const uint32_t word32 = 0xCA00C100;
+ // const uint32_t word32 = 0xCA00C100;
// Write test word to codec_idle idle register (on TX side)
poker_functor(word32);
// Read back values - TX is lower 32-bits and RX is upper 32-bits
const uint64_t rb_word64 = peeker_functor();
- const uint32_t rb_tx = uint32_t(rb_word64 >> 32);
- const uint32_t rb_rx = uint32_t(rb_word64 & 0xffffffff);
+ const uint32_t rb_tx = uint32_t(rb_word64 >> 32);
+ const uint32_t rb_rx = uint32_t(rb_word64 & 0xffffffff);
// Compare TX and RX values to test word
bool test_fail = word32 != rb_tx or word32 != rb_rx;
- if(test_fail)
- {
- UHD_LOG_WARNING(unique_id(), "CODEC loopback test failed! "
- << boost::format("Expected: 0x%08X Received (TX/RX): 0x%08X/0x%08X")
- % word32 % rb_tx % rb_rx);
+ if (test_fail) {
+ UHD_LOG_WARNING(unique_id(),
+ "CODEC loopback test failed! "
+ << boost::format("Expected: 0x%08X Received (TX/RX): 0x%08X/0x%08X")
+ % word32 % rb_tx % rb_rx);
throw uhd::runtime_error("CODEC loopback test failed.");
}
}
@@ -189,63 +188,50 @@ void neon_radio_ctrl_impl::loopback_self_test(
double neon_radio_ctrl_impl::set_rate(const double rate)
{
std::lock_guard<std::mutex> l(_set_lock);
- UHD_LOG_DEBUG(unique_id(), "Asking for clock rate " << rate/1e6 << " MHz\n");
+ UHD_LOG_DEBUG(unique_id(), "Asking for clock rate " << rate / 1e6 << " MHz\n");
double actual_tick_rate = _ad9361->set_clock_rate(rate);
- UHD_LOG_DEBUG(unique_id(), "Actual clock rate " << actual_tick_rate/1e6 << " MHz\n");
+ UHD_LOG_DEBUG(
+ unique_id(), "Actual clock rate " << actual_tick_rate / 1e6 << " MHz\n");
radio_ctrl_impl::set_rate(rate);
return rate;
}
-void neon_radio_ctrl_impl::set_tx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void neon_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));
}
radio_ctrl_impl::set_tx_antenna(ant, chan);
// We can't actually set the TX antenna, so let's stop here.
}
-void neon_radio_ctrl_impl::set_rx_antenna(
- const std::string &ant,
- const size_t chan
-) {
+void neon_radio_ctrl_impl::set_rx_antenna(const std::string& ant, const size_t chan)
+{
UHD_ASSERT_THROW(chan <= NEON_NUM_CHANS);
- if (std::find(NEON_RX_ANTENNAS.begin(),
- NEON_RX_ANTENNAS.end(),
- ant) == NEON_RX_ANTENNAS.end()) {
- throw uhd::value_error(str(
- boost::format("[%s] Requesting invalid RX antenna value: %s")
- % unique_id()
- % ant
- ));
+ if (std::find(NEON_RX_ANTENNAS.begin(), NEON_RX_ANTENNAS.end(), ant)
+ == NEON_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);
+ UHD_LOG_TRACE(unique_id(), "Setting RX antenna to " << ant << " for chan " << chan);
radio_ctrl_impl::set_rx_antenna(ant, chan);
_set_atr_bits(chan);
}
-double neon_radio_ctrl_impl::set_tx_frequency(
- const double freq,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(),
- "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
+double neon_radio_ctrl_impl::set_tx_frequency(const double freq, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
std::lock_guard<std::mutex> l(_set_lock);
double clipped_freq = uhd::clip(freq, AD9361_TX_MIN_FREQ, AD9361_TX_MAX_FREQ);
- double coerced_freq = _ad9361->tune(
- get_which_ad9361_chain(TX_DIRECTION, chan),
- clipped_freq);
+ double coerced_freq =
+ _ad9361->tune(get_which_ad9361_chain(TX_DIRECTION, chan), clipped_freq);
radio_ctrl_impl::set_tx_frequency(coerced_freq, chan);
// Front-end switching
_set_atr_bits(chan);
@@ -253,19 +239,15 @@ double neon_radio_ctrl_impl::set_tx_frequency(
return coerced_freq;
}
-double neon_radio_ctrl_impl::set_rx_frequency(
- const double freq,
- const size_t chan
-) {
- UHD_LOG_TRACE(unique_id(),
- "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
+double neon_radio_ctrl_impl::set_rx_frequency(const double freq, const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(), "set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
std::lock_guard<std::mutex> l(_set_lock);
double clipped_freq = uhd::clip(freq, AD9361_RX_MIN_FREQ, AD9361_RX_MAX_FREQ);
- double coerced_freq = _ad9361->tune(
- get_which_ad9361_chain(RX_DIRECTION, chan),
- clipped_freq);
+ double coerced_freq =
+ _ad9361->tune(get_which_ad9361_chain(RX_DIRECTION, chan), clipped_freq);
radio_ctrl_impl::set_rx_frequency(coerced_freq, chan);
// Front-end switching
_set_atr_bits(chan);
@@ -273,63 +255,48 @@ double neon_radio_ctrl_impl::set_rx_frequency(
return coerced_freq;
}
-double neon_radio_ctrl_impl::set_rx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+double neon_radio_ctrl_impl::set_rx_bandwidth(const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- double clipped_bw = _ad9361->set_bw_filter(
- get_which_ad9361_chain(RX_DIRECTION, chan),
- bandwidth);
+ double clipped_bw =
+ _ad9361->set_bw_filter(get_which_ad9361_chain(RX_DIRECTION, chan), bandwidth);
return radio_ctrl_impl::set_rx_bandwidth(clipped_bw, chan);
}
-double neon_radio_ctrl_impl::set_tx_bandwidth(
- const double bandwidth,
- const size_t chan
-) {
+double neon_radio_ctrl_impl::set_tx_bandwidth(const double bandwidth, const size_t chan)
+{
std::lock_guard<std::mutex> l(_set_lock);
- double clipped_bw = _ad9361->set_bw_filter(
- get_which_ad9361_chain(TX_DIRECTION, chan),
- bandwidth);
+ double clipped_bw =
+ _ad9361->set_bw_filter(get_which_ad9361_chain(TX_DIRECTION, chan), bandwidth);
return radio_ctrl_impl::set_tx_bandwidth(clipped_bw, chan);
}
-double neon_radio_ctrl_impl::set_tx_gain(
- const double gain,
- const size_t chan
-) {
+double neon_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 << ")");
+ UHD_LOG_TRACE(unique_id(), "set_tx_gain(gain=" << gain << ", chan=" << chan << ")");
double clip_gain = uhd::clip(gain, AD9361_MIN_TX_GAIN, AD9361_MAX_TX_GAIN);
- _ad9361->set_gain(
- get_which_ad9361_chain(TX_DIRECTION, chan),
- clip_gain);
+ _ad9361->set_gain(get_which_ad9361_chain(TX_DIRECTION, chan), clip_gain);
radio_ctrl_impl::set_tx_gain(clip_gain, chan);
return clip_gain;
}
-double neon_radio_ctrl_impl::set_rx_gain(
- const double gain,
- const size_t chan
-) {
+double neon_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 << ")");
+ UHD_LOG_TRACE(unique_id(), "set_rx_gain(gain=" << gain << ", chan=" << chan << ")");
double clip_gain = uhd::clip(gain, AD9361_MIN_RX_GAIN, AD9361_MAX_RX_GAIN);
- _ad9361->set_gain(
- get_which_ad9361_chain(RX_DIRECTION, chan),
- clip_gain);
+ _ad9361->set_gain(get_which_ad9361_chain(RX_DIRECTION, chan), clip_gain);
radio_ctrl_impl::set_rx_gain(clip_gain, chan);
return clip_gain;
}
size_t neon_radio_ctrl_impl::get_chan_from_dboard_fe(
- const std::string &fe, const direction_t /* dir */
-) {
+ const std::string& fe, const direction_t /* dir */
+)
+{
const size_t chan = boost::lexical_cast<size_t>(fe);
- if (chan > _get_num_radios()-1) {
+ if (chan > _get_num_radios() - 1) {
UHD_LOG_WARNING(unique_id(),
boost::format("Invalid channel determined from dboard frontend %s.") % fe);
}
@@ -337,122 +304,107 @@ size_t neon_radio_ctrl_impl::get_chan_from_dboard_fe(
}
std::string neon_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 neon_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 AD9361 control object...");
_ad9361 = make_rpc(_rpcc);
UHD_LOG_TRACE(unique_id(), "Setting Catalina Defaults... ");
- //Initialize catalina
+ // Initialize catalina
this->_init_codec();
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);
}
// Note: MCR gets set during the init() call (prior to this), which takes
// 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.");
this->set_rate(_master_clock_rate);
// Loopback test
for (size_t chan = 0; chan < _get_num_radios(); chan++) {
loopback_self_test(
- [this, chan](const uint32_t value){
- this->sr_write(regs::CODEC_IDLE, value, chan);
- },
- [this, chan](){
+ [this, chan](
+ const uint32_t value) { this->sr_write(regs::CODEC_IDLE, value, chan); },
+ [this, chan]() {
return this->user_reg_read64(regs::RB_CODEC_READBACK, chan);
- }
- );
+ });
}
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 < NEON_NUM_CHANS; chan_idx++) {
_init_mpm_sensors(dir, chan_idx);
}
}
}
-bool neon_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 neon_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";
- bool lo_lock = _rpcc->request_with_token<bool>(
- _rpc_prefix + "get_ad9361_lo_lock", trx);
+ bool lo_lock =
+ _rpcc->request_with_token<bool>(_rpc_prefix + "get_ad9361_lo_lock", trx);
UHD_LOG_TRACE(unique_id(),
"AD9361 " << trx << " LO reports lock: " << (lo_lock ? "Yes" : "No"));
return lo_lock;
}
-void neon_radio_ctrl_impl::_set_atr_bits(
- const size_t chan
-) {
- const auto rx_freq = radio_ctrl_impl::get_rx_frequency(chan);
- const auto tx_freq = radio_ctrl_impl::get_tx_frequency(chan);
- const auto rx_ant = radio_ctrl_impl::get_rx_antenna(chan);
- const uint32_t rx_regs = _get_rx_switches(chan, rx_freq, rx_ant);
- const uint32_t tx_regs = _get_tx_switches(chan, tx_freq);
- const uint32_t idle_regs = TX_AMP_OFF << TX_AMP_SHIFT |
- TRX1_SW_TX_HB << TRX_SW_SHIFT |
- TX_SW2_LB_80 << TX_SW2_SHIFT |
- TX_SW1_LB_80 << TX_SW1_SHIFT |
- RX_SW3_OFF << RX_SW3_SHIFT |
- RX_SW2_OFF << RX_SW2_SHIFT |
- RX_SW1_OFF << RX_SW1_SHIFT;
+void neon_radio_ctrl_impl::_set_atr_bits(const size_t chan)
+{
+ const auto rx_freq = radio_ctrl_impl::get_rx_frequency(chan);
+ const auto tx_freq = radio_ctrl_impl::get_tx_frequency(chan);
+ const auto rx_ant = radio_ctrl_impl::get_rx_antenna(chan);
+ const uint32_t rx_regs = _get_rx_switches(chan, rx_freq, rx_ant);
+ const uint32_t tx_regs = _get_tx_switches(chan, tx_freq);
+ const uint32_t idle_regs = TX_AMP_OFF << TX_AMP_SHIFT | TRX1_SW_TX_HB << TRX_SW_SHIFT
+ | TX_SW2_LB_80 << TX_SW2_SHIFT
+ | TX_SW1_LB_80 << TX_SW1_SHIFT | RX_SW3_OFF << RX_SW3_SHIFT
+ | RX_SW2_OFF << RX_SW2_SHIFT | RX_SW1_OFF << RX_SW1_SHIFT;
_db_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_IDLE, idle_regs);
_db_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_RX_ONLY, rx_regs);
@@ -462,21 +414,21 @@ void neon_radio_ctrl_impl::_set_atr_bits(
// The LED signal names are reversed, but are consistent with the schematic
const int idle_led = 0;
const bool is_txrx = rx_ant == "TX/RX";
- const int rx_led = 1 << TRX_LED_GRN_SHIFT;
- const int tx_led = 1 << TX_LED_RED_SHIFT;
+ const int rx_led = 1 << TRX_LED_GRN_SHIFT;
+ const int tx_led = 1 << TX_LED_RED_SHIFT;
const int txrx_led = 1 << RX_LED_GRN_SHIFT;
_leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_IDLE, idle_led);
- _leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_RX_ONLY, is_txrx ? txrx_led : rx_led);
+ _leds_gpio[chan]->set_atr_reg(
+ usrp::gpio_atr::ATR_REG_RX_ONLY, is_txrx ? txrx_led : rx_led);
_leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_TX_ONLY, tx_led);
_leds_gpio[chan]->set_atr_reg(usrp::gpio_atr::ATR_REG_FULL_DUPLEX, rx_led | tx_led);
}
-void neon_radio_ctrl_impl::_identify_with_leds(
- const int identify_duration
-) {
- auto end_time = std::chrono::steady_clock::now()
- + std::chrono::seconds(identify_duration);
+void neon_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) {
// Add update_leds
@@ -485,141 +437,126 @@ void neon_radio_ctrl_impl::_identify_with_leds(
}
}
-uint32_t neon_radio_ctrl_impl::_get_tx_switches(
- const size_t chan,
- const double freq
-) {
-
- UHD_LOG_TRACE(unique_id(),
- "Update all TX freq related switches. f=" << freq << " Hz, "
- );
+uint32_t neon_radio_ctrl_impl::_get_tx_switches(const size_t chan, const double freq)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Update all TX freq related switches. f=" << freq << " Hz, ");
auto tx_sw1 = TX_SW1_LB_160;
auto tx_sw2 = TX_SW2_LB_160;
- auto trx_sw = (chan == 0) ? TRX1_SW_TX_LB: TRX2_SW_TX_LB;
+ auto trx_sw = (chan == 0) ? TRX1_SW_TX_LB : TRX2_SW_TX_LB;
auto tx_amp = TX_AMP_LF_ON;
const auto band = _map_freq_to_tx_band(freq);
- switch(band) {
- case tx_band::LB_80:
- tx_sw1 = TX_SW1_LB_80;
- tx_sw2 = TX_SW2_LB_80;
- break;
- case tx_band::LB_160:
- tx_sw1 = TX_SW1_LB_160;
- tx_sw2 = TX_SW2_LB_160;
- break;
- case tx_band::LB_225:
- tx_sw1 = TX_SW1_LB_225;
- tx_sw2 = TX_SW2_LB_225;
- break;
- case tx_band::LB_400:
- tx_sw1 = TX_SW1_LB_400;
- tx_sw2 = TX_SW2_LB_400;
- break;
- case tx_band::LB_575:
- tx_sw1 = TX_SW1_LB_575;
- tx_sw2 = TX_SW2_LB_575;
- break;
- case tx_band::LB_1000:
- tx_sw1 = TX_SW1_LB_1000;
- tx_sw2 = TX_SW2_LB_1000;
- break;
- case tx_band::LB_1700:
- tx_sw1 = TX_SW1_LB_1700;
- tx_sw2 = TX_SW2_LB_1700;
- break;
- case tx_band::LB_2750:
- tx_sw1 = TX_SW1_LB_2750;
- tx_sw2 = TX_SW2_LB_2750;
- break;
- case tx_band::HB:
- trx_sw = (chan == 0) ? TRX1_SW_TX_HB: TRX2_SW_TX_HB;
- tx_amp = TX_AMP_HF_ON;
- break;
- case tx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map TX frequency to band: " << freq);
- UHD_THROW_INVALID_CODE_PATH();
- break;
+ switch (band) {
+ case tx_band::LB_80:
+ tx_sw1 = TX_SW1_LB_80;
+ tx_sw2 = TX_SW2_LB_80;
+ break;
+ case tx_band::LB_160:
+ tx_sw1 = TX_SW1_LB_160;
+ tx_sw2 = TX_SW2_LB_160;
+ break;
+ case tx_band::LB_225:
+ tx_sw1 = TX_SW1_LB_225;
+ tx_sw2 = TX_SW2_LB_225;
+ break;
+ case tx_band::LB_400:
+ tx_sw1 = TX_SW1_LB_400;
+ tx_sw2 = TX_SW2_LB_400;
+ break;
+ case tx_band::LB_575:
+ tx_sw1 = TX_SW1_LB_575;
+ tx_sw2 = TX_SW2_LB_575;
+ break;
+ case tx_band::LB_1000:
+ tx_sw1 = TX_SW1_LB_1000;
+ tx_sw2 = TX_SW2_LB_1000;
+ break;
+ case tx_band::LB_1700:
+ tx_sw1 = TX_SW1_LB_1700;
+ tx_sw2 = TX_SW2_LB_1700;
+ break;
+ case tx_band::LB_2750:
+ tx_sw1 = TX_SW1_LB_2750;
+ tx_sw2 = TX_SW2_LB_2750;
+ break;
+ case tx_band::HB:
+ trx_sw = (chan == 0) ? TRX1_SW_TX_HB : TRX2_SW_TX_HB;
+ tx_amp = TX_AMP_HF_ON;
+ break;
+ case tx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map TX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
}
- auto tx_regs = tx_amp << TX_AMP_SHIFT |
- trx_sw << TRX_SW_SHIFT |
- tx_sw2 << TX_SW2_SHIFT |
- tx_sw1 << TX_SW1_SHIFT;
+ auto tx_regs = tx_amp << TX_AMP_SHIFT | trx_sw << TRX_SW_SHIFT
+ | tx_sw2 << TX_SW2_SHIFT | tx_sw1 << TX_SW1_SHIFT;
return tx_regs;
}
uint32_t neon_radio_ctrl_impl::_get_rx_switches(
- const size_t chan,
- const double freq,
- const std::string &ant
-){
- UHD_LOG_TRACE(unique_id(),
- "Update all RX freq related switches. f=" << freq << " Hz, "
- );
+ const size_t chan, const double freq, const std::string& ant)
+{
+ UHD_LOG_TRACE(
+ unique_id(), "Update all RX freq related switches. f=" << freq << " Hz, ");
// Default to OFF
auto rx_sw1 = RX_SW1_OFF;
auto rx_sw2 = RX_SW2_OFF;
auto rx_sw3 = RX_SW3_OFF;
- auto trx_sw = (chan == 0) ? TRX1_SW_RX: TRX2_SW_RX;
+ auto trx_sw = (chan == 0) ? TRX1_SW_RX : TRX2_SW_RX;
if (ant == "TX/RX") {
rx_sw3 = RX_SW3_HBRX_LBTRX;
- trx_sw = (chan == 0) ? TRX1_SW_RX: TRX2_SW_RX;
- }
- else if (ant == "RX2") {
+ trx_sw = (chan == 0) ? TRX1_SW_RX : TRX2_SW_RX;
+ } else if (ant == "RX2") {
rx_sw3 = RX_SW3_HBTRX_LBRX;
// Set TRX switch to TX when receiving on RX2
trx_sw = TRX1_SW_TX_HB;
}
const auto band = _map_freq_to_rx_band(freq);
- switch(band) {
- case rx_band::LB_B2:
- rx_sw1 = RX_SW1_LB_B2;
- rx_sw2 = RX_SW2_LB_B2;
- break;
- case rx_band::LB_B3:
- rx_sw1 = RX_SW1_LB_B3;
- rx_sw2 = RX_SW2_LB_B3;
- break;
- case rx_band::LB_B4:
- rx_sw1 = RX_SW1_LB_B4;
- rx_sw2 = RX_SW2_LB_B4;
- break;
- case rx_band::LB_B5:
- rx_sw1 = RX_SW1_LB_B5;
- rx_sw2 = RX_SW2_LB_B5;
- break;
- case rx_band::LB_B6:
- rx_sw1 = RX_SW1_LB_B6;
- rx_sw2 = RX_SW2_LB_B6;
- break;
- case rx_band::LB_B7:
- rx_sw1 = RX_SW1_LB_B7;
- rx_sw2 = RX_SW2_LB_B7;
- break;
- case rx_band::HB:
- rx_sw1 = RX_SW1_OFF;
- rx_sw2 = RX_SW2_OFF;
- if (ant == "TX/RX") {
- rx_sw3 = RX_SW3_HBTRX_LBRX;
- }
- else if (ant == "RX2") {
- rx_sw3 = RX_SW3_HBRX_LBTRX;
- }
- break;
- case rx_band::INVALID_BAND:
- UHD_LOG_ERROR(unique_id(),
- "Cannot map RX frequency to band: " << freq);
- UHD_THROW_INVALID_CODE_PATH();
- break;
+ switch (band) {
+ case rx_band::LB_B2:
+ rx_sw1 = RX_SW1_LB_B2;
+ rx_sw2 = RX_SW2_LB_B2;
+ break;
+ case rx_band::LB_B3:
+ rx_sw1 = RX_SW1_LB_B3;
+ rx_sw2 = RX_SW2_LB_B3;
+ break;
+ case rx_band::LB_B4:
+ rx_sw1 = RX_SW1_LB_B4;
+ rx_sw2 = RX_SW2_LB_B4;
+ break;
+ case rx_band::LB_B5:
+ rx_sw1 = RX_SW1_LB_B5;
+ rx_sw2 = RX_SW2_LB_B5;
+ break;
+ case rx_band::LB_B6:
+ rx_sw1 = RX_SW1_LB_B6;
+ rx_sw2 = RX_SW2_LB_B6;
+ break;
+ case rx_band::LB_B7:
+ rx_sw1 = RX_SW1_LB_B7;
+ rx_sw2 = RX_SW2_LB_B7;
+ break;
+ case rx_band::HB:
+ rx_sw1 = RX_SW1_OFF;
+ rx_sw2 = RX_SW2_OFF;
+ if (ant == "TX/RX") {
+ rx_sw3 = RX_SW3_HBTRX_LBRX;
+ } else if (ant == "RX2") {
+ rx_sw3 = RX_SW3_HBRX_LBTRX;
+ }
+ break;
+ case rx_band::INVALID_BAND:
+ UHD_LOG_ERROR(unique_id(), "Cannot map RX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
}
- auto rx_regs = trx_sw << TRX_SW_SHIFT |
- rx_sw3 << RX_SW3_SHIFT |
- rx_sw2 << RX_SW2_SHIFT |
- rx_sw1 << RX_SW1_SHIFT;
+ auto rx_regs = trx_sw << TRX_SW_SHIFT | rx_sw3 << RX_SW3_SHIFT
+ | rx_sw2 << RX_SW2_SHIFT | rx_sw1 << RX_SW1_SHIFT;
return rx_regs;
}
diff --git a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp
index ac7fd70e9..88d1eed73 100644
--- a/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/neon/neon_radio_ctrl_impl.hpp
@@ -11,13 +11,12 @@
#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/cores/gpio_atr_3000.hpp>
#include <mutex>
-namespace uhd {
- namespace rfnoc {
+namespace uhd { namespace rfnoc {
/*! \brief Provide access to an Magnesium radio.
*/
@@ -27,16 +26,7 @@ public:
typedef boost::shared_ptr<neon_radio_ctrl_impl> sptr;
//! Frequency bands for RX. Bands are a function of the analog filter banks
- enum class rx_band {
- INVALID_BAND,
- LB_B2,
- LB_B3,
- LB_B4,
- LB_B5,
- LB_B6,
- LB_B7,
- HB
- };
+ enum class rx_band { INVALID_BAND, LB_B2, LB_B3, LB_B4, LB_B5, LB_B6, LB_B7, HB };
//! Frequency bands for TX. Bands are a function of the analog filter banks
enum class tx_band {
@@ -56,37 +46,28 @@ public:
* ATR/ Switches Types
*************************************************************************/
//! ATR state
- enum atr_state_t {
- IDLE,
- RX_ONLY,
- TX_ONLY,
- FULL_DUPLEX
- };
+ enum atr_state_t { IDLE, RX_ONLY, TX_ONLY, FULL_DUPLEX };
//! Channel select:
- enum chan_sel_t {
- CHAN1,
- CHAN2,
- BOTH
- };
+ enum chan_sel_t { CHAN1, CHAN2, BOTH };
enum tx_sw1_t {
- TX_SW1_LB_80 = 3,
- TX_SW1_LB_160 = 7,
- TX_SW1_LB_225 = 1,
- TX_SW1_LB_400 = 5,
- TX_SW1_LB_575 = 2,
+ TX_SW1_LB_80 = 3,
+ TX_SW1_LB_160 = 7,
+ TX_SW1_LB_225 = 1,
+ TX_SW1_LB_400 = 5,
+ TX_SW1_LB_575 = 2,
TX_SW1_LB_1000 = 6,
TX_SW1_LB_1700 = 0,
TX_SW1_LB_2750 = 4
};
enum tx_sw2_t {
- TX_SW2_LB_80 = 7,
- TX_SW2_LB_160 = 3,
- TX_SW2_LB_225 = 5,
- TX_SW2_LB_400 = 1,
- TX_SW2_LB_575 = 6,
+ TX_SW2_LB_80 = 7,
+ TX_SW2_LB_160 = 3,
+ TX_SW2_LB_225 = 5,
+ TX_SW2_LB_400 = 1,
+ TX_SW2_LB_575 = 6,
TX_SW2_LB_1000 = 2,
TX_SW2_LB_1700 = 4,
TX_SW2_LB_2750 = 0
@@ -95,10 +76,10 @@ public:
enum trx_sw_t {
TRX1_SW_TX_HB = 2,
TRX1_SW_TX_LB = 1,
- TRX1_SW_RX = 4,
+ TRX1_SW_RX = 4,
TRX2_SW_TX_HB = 2,
TRX2_SW_TX_LB = 4,
- TRX2_SW_RX = 1
+ TRX2_SW_RX = 1
};
enum rx_sw1_t {
@@ -108,7 +89,7 @@ public:
RX_SW1_LB_B5 = 3,
RX_SW1_LB_B6 = 0,
RX_SW1_LB_B7 = 1,
- RX_SW1_OFF = 7
+ RX_SW1_OFF = 7
};
@@ -119,20 +100,16 @@ public:
RX_SW2_LB_B5 = 2,
RX_SW2_LB_B6 = 1,
RX_SW2_LB_B7 = 0,
- RX_SW2_OFF = 7
+ RX_SW2_OFF = 7
};
enum rx_sw3_t {
RX_SW3_HBRX_LBTRX = 1,
RX_SW3_HBTRX_LBRX = 2,
- RX_SW3_OFF = 0 //or 3
+ RX_SW3_OFF = 0 // or 3
};
- enum tx_amp_t {
- TX_AMP_HF_ON = 2,
- TX_AMP_LF_ON = 1,
- TX_AMP_OFF = 3
- };
+ enum tx_amp_t { TX_AMP_HF_ON = 2, TX_AMP_LF_ON = 1, TX_AMP_OFF = 3 };
/************************************************************************
* Structors
@@ -149,10 +126,11 @@ public:
virtual bool check_radio_config();
//! Set which channel mode is used
- void set_channel_mode(const std::string &channel_mode);
+ void set_channel_mode(const std::string& channel_mode);
//! Set streaming mode - active chains, channel_mode, timing_mode
- void set_streaming_mode(const bool tx1, const bool tx2, const bool rx1, const bool rx2);
+ void set_streaming_mode(
+ const bool tx1, const bool tx2, const bool rx1, const bool rx2);
/*! Run a loopback self test.
*
@@ -163,19 +141,18 @@ public:
*
* \param iface An interface to the associated radio control core
* \param iface The radio control core's address to write the loopback value
- * \param iface The radio control core's readback address to read back the returned value
+ * \param iface The radio control core's readback address to read back the returned
+ * value
*
* \throws a uhd::runtime_error if the loopback value didn't match.
*/
- void loopback_self_test(
- std::function<void(uint32_t)> poker_functor,
- std::function<uint64_t()> peeker_functor
- );
+ void loopback_self_test(std::function<void(uint32_t)> poker_functor,
+ std::function<uint64_t()> peeker_functor);
double set_rate(const 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);
@@ -186,13 +163,10 @@ public:
double set_tx_gain(const double gain, const size_t chan);
double set_rx_gain(const double gain, 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:
/**************************************************************************
@@ -205,10 +179,7 @@ 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 Catalina defaults
void _init_codec();
@@ -216,10 +187,7 @@ private:
//! 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.
@@ -233,33 +201,21 @@ 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);
/**************************************************************************
* Misc Controls
*************************************************************************/
//! Blink the front-panel LEDs for \p identify_duration,
// and resume normal operation.
- void _identify_with_leds(
- const int identify_duration
- );
+ void _identify_with_leds(const int identify_duration);
uint32_t _get_rx_switches(
- const size_t chan,
- const double freq,
- const std::string &ant
- );
+ const size_t chan, const double freq, const std::string& ant);
- uint32_t _get_tx_switches(
- const size_t chan,
- const double freq
- );
+ uint32_t _get_tx_switches(const size_t chan, const double freq);
- void _set_atr_bits(
- const size_t chan
- );
+ void _set_atr_bits(const size_t chan);
/**************************************************************************
* Private attributes
@@ -283,7 +239,7 @@ private:
uhd::spi_iface::sptr _spi;
//! Reference to the AD9361 controls
- //neon_ad9361_iface::uptr _ad9361;
+ // neon_ad9361_iface::uptr _ad9361;
ad9361_ctrl::sptr _ad9361;
//! ATR controls. These control the AD9361 gain
@@ -305,4 +261,3 @@ private:
}} /* namespace uhd::rfnoc */
#endif /* INCLUDED_LIBUHD_RFNOC_NEON_RADIO_CTRL_IMPL_HPP */
-
diff --git a/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp b/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp
index c71fd0169..783f0c7b2 100644
--- a/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp
+++ b/host/lib/usrp/dboard/neon/neon_radio_ctrl_init.cpp
@@ -4,17 +4,17 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
-#include "neon_radio_ctrl_impl.hpp"
#include "neon_constants.hpp"
-#include <uhd/utils/log.hpp>
+#include "neon_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 <boost/algorithm/string.hpp>
-#include <boost/algorithm/string/split.hpp>
#include <boost/algorithm/string/case_conv.hpp>
-#include <vector>
+#include <boost/algorithm/string/split.hpp>
#include <string>
+#include <vector>
using namespace uhd;
using namespace uhd::rfnoc;
@@ -25,32 +25,35 @@ using namespace uhd::rfnoc;
// 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 neon_radio_ctrl_impl::_init_defaults()
@@ -60,8 +63,7 @@ void neon_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(NEON_DEFAULT_FREQ, chan);
@@ -83,8 +85,7 @@ void neon_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);
}
@@ -92,255 +93,181 @@ void neon_radio_ctrl_impl::_init_peripherals()
{
UHD_LOG_TRACE(unique_id(), "Initializing peripherals...");
- _db_gpio.clear(); // Following the as-if rule, this can get optimized out
+ _db_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);
- _db_gpio.emplace_back(
- usrp::gpio_atr::gpio_atr_3000::make_write_only(
- _get_ctrl(radio_idx),
- regs::sr_addr(regs::GPIO)
- )
- );
- _db_gpio[radio_idx]->set_atr_mode(usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ UHD_LOG_TRACE(unique_id(), "Initializing GPIOs for channel " << radio_idx);
+ _db_gpio.emplace_back(usrp::gpio_atr::gpio_atr_3000::make_write_only(
+ _get_ctrl(radio_idx), regs::sr_addr(regs::GPIO)));
+ _db_gpio[radio_idx]->set_atr_mode(
+ usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
}
- _leds_gpio.clear(); // Following the as-if rule, this can get optimized out
+ _leds_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);
- _leds_gpio.emplace_back(
- usrp::gpio_atr::gpio_atr_3000::make_write_only(
- _get_ctrl(radio_idx),
- regs::sr_addr(regs::LEDS)
- )
- );
+ UHD_LOG_TRACE(unique_id(), "Initializing GPIOs for channel " << radio_idx);
+ _leds_gpio.emplace_back(usrp::gpio_atr::gpio_atr_3000::make_write_only(
+ _get_ctrl(radio_idx), regs::sr_addr(regs::LEDS)));
- _leds_gpio[radio_idx]->set_atr_mode(usrp::gpio_atr::MODE_ATR, usrp::gpio_atr::gpio_atr_3000::MASK_SET_ALL);
+ _leds_gpio[radio_idx]->set_atr_mode(
+ usrp::gpio_atr::MODE_ATR, 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 neon_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("Neon")))
- ;
- subtree->create<std::string>(tx_fe_path / "connection")
- .set("IQ")
- ;
+ subtree->create<std::string>(tx_fe_path / "name").set(str(boost::format("Neon")));
+ 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("Neon")))
- ;
- subtree->create<std::string>(rx_fe_path / "connection")
- .set("IQ")
- ;
+ subtree->create<std::string>(rx_fe_path / "name").set(str(boost::format("Neon")));
+ 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({NEON_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(NEON_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(AD9361_TX_MIN_FREQ, AD9361_TX_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(AD9361_RX_MIN_FREQ, AD9361_RX_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(AD9361_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(AD9361_TX_MIN_BANDWIDTH, AD9361_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(AD9361_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(AD9361_RX_MIN_BANDWIDTH, AD9361_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
const std::vector<std::string> tx_gain_names = ad9361_ctrl::get_gain_names("TX1");
for (auto tx_gain_name : tx_gain_names) {
subtree->create<double>(tx_fe_path / "gains" / tx_gain_name / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .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_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_tx_gain(chan_idx); });
subtree->create<meta_range_t>(tx_fe_path / "gains" / tx_gain_name / "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](){
- return meta_range_t(
- AD9361_MIN_TX_GAIN,
- AD9361_MAX_TX_GAIN,
- AD9361_TX_GAIN_STEP
- );
- })
- ;
+ .set_publisher([this]() {
+ return meta_range_t(
+ AD9361_MIN_TX_GAIN, AD9361_MAX_TX_GAIN, AD9361_TX_GAIN_STEP);
+ });
}
// RX gains
const std::vector<std::string> rx_gain_names = ad9361_ctrl::get_gain_names("RX1");
for (auto rx_gain_name : rx_gain_names) {
subtree->create<double>(rx_fe_path / "gains" / rx_gain_name / "value")
- .set_coercer([this, chan_idx](const double gain){
+ .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_publisher(
+ [this, chan_idx]() { return radio_ctrl_impl::get_rx_gain(chan_idx); });
subtree->create<meta_range_t>(rx_fe_path / "gains" / rx_gain_name / "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]() {
return meta_range_t(
- AD9361_MIN_RX_GAIN,
- AD9361_MAX_RX_GAIN,
- AD9361_RX_GAIN_STEP
- );
- })
- ;
+ AD9361_MIN_RX_GAIN, AD9361_MAX_RX_GAIN, AD9361_RX_GAIN_STEP);
+ });
}
// TX LO lock sensor //////////////////////////////////////////////////////
// Note: The AD9361 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"
- );
- })
- ;
+ "all_los", this->get_lo_lock_status(RX_DIRECTION), "locked", "unlocked");
+ });
}
void neon_radio_ctrl_impl::_init_prop_tree()
{
const fs_path fe_base = fs_path("dboards") / _radio_slot;
for (size_t chan_idx = 0; chan_idx < NEON_NUM_CHANS; chan_idx++) {
- this->_init_frontend_subtree(
- _tree->subtree(fe_base), chan_idx);
+ this->_init_frontend_subtree(_tree->subtree(fe_base), chan_idx);
}
- _tree->create<eeprom_map_t>(_root_path / "eeprom")
- .set(eeprom_map_t());
+ _tree->create<eeprom_map_t>(_root_path / "eeprom").set(eeprom_map_t());
_tree->create<int>("rx_codecs" / _radio_slot / "gains");
_tree->create<int>("tx_codecs" / _radio_slot / "gains");
@@ -349,98 +276,108 @@ void neon_radio_ctrl_impl::_init_prop_tree()
if (not _tree->exists("tick_rate")) {
_tree->create<double>("tick_rate")
- .set_coercer([this](double tick_rate){
- return this->set_rate(tick_rate);
- })
- .set_publisher([this](){
- return this->get_rate();
- })
- ;
+ .set_coercer([this](double tick_rate) { return this->set_rate(tick_rate); })
+ .set_publisher([this]() { return this->get_rate(); });
} else {
UHD_LOG_WARNING(unique_id(), "Cannot set tick_rate again");
}
// *****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);
+ });
}
}
}
@@ -464,35 +401,27 @@ void neon_radio_ctrl_impl::_init_codec()
}
}
-void neon_radio_ctrl_impl::_init_mpm_sensors(
- const direction_t dir,
- const size_t chan_idx
-) {
+void neon_radio_ctrl_impl::_init_mpm_sensors(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));
+ });
}
}
diff --git a/host/lib/usrp/dboard/neon/neon_regs.hpp b/host/lib/usrp/dboard/neon/neon_regs.hpp
index 39ceca01c..d1ff940c6 100644
--- a/host/lib/usrp/dboard/neon/neon_regs.hpp
+++ b/host/lib/usrp/dboard/neon/neon_regs.hpp
@@ -10,17 +10,16 @@
#include <uhd/config.hpp>
#include <cstdint>
-static const uint32_t TX_AMP_SHIFT = 17;
-static const uint32_t TRX_SW_SHIFT = 14;
-static const uint32_t RX_SW1_SHIFT = 0;
-static const uint32_t RX_SW2_SHIFT = 3;
-static const uint32_t RX_SW3_SHIFT = 6;
-static const uint32_t TX_SW1_SHIFT = 8;
-static const uint32_t TX_SW2_SHIFT = 11;
+static const uint32_t TX_AMP_SHIFT = 17;
+static const uint32_t TRX_SW_SHIFT = 14;
+static const uint32_t RX_SW1_SHIFT = 0;
+static const uint32_t RX_SW2_SHIFT = 3;
+static const uint32_t RX_SW3_SHIFT = 6;
+static const uint32_t TX_SW1_SHIFT = 8;
+static const uint32_t TX_SW2_SHIFT = 11;
-static const uint32_t TRX_LED_GRN_SHIFT = 0;
+static const uint32_t TRX_LED_GRN_SHIFT = 0;
static const uint32_t TX_LED_RED_SHIFT = 1;
static const uint32_t RX_LED_GRN_SHIFT = 2;
#endif /* INCLUDED_NEON_REGS_HPP */
-