aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/dboard')
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp62
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp7
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp122
3 files changed, 62 insertions, 129 deletions
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 495eca3b0..e2fe1e51b 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
@@ -73,6 +73,17 @@ namespace {
lo_iface->set_output_enable(adf435x_iface::RF_OUTPUT_B, false);
lo_iface->commit();
}
+
+ // TODO: remove this helper when there are only 2 radios
+ fs_path master_fe_base_path(const std::string &radio_slot)
+ {
+ if (radio_slot == "B") {
+ return fs_path("dboards") / "A";
+ }
+ if (radio_slot == "D") {
+ return fs_path("dboards") / "C";
+ }
+ }
}
@@ -141,13 +152,6 @@ void magnesium_radio_ctrl_impl::set_rx_antenna(
% ant
));
}
-
- // TODO: When we go to 1 block per dboard, this entire if statement can go
- // away.
- if (not _master) {
- // tbi
- }
-
UHD_LOG_TRACE(unique_id(),
"Setting RX antenna to " << ant << " for chan " << chan);
magnesium_cpld_ctrl::chan_sel_t chan_sel =
@@ -167,6 +171,14 @@ double magnesium_radio_ctrl_impl::set_tx_frequency(
// bands.
UHD_LOG_TRACE(unique_id(),
"set_tx_frequency(f=" << freq << ", chan=" << chan << ")");
+ if (not _master) {
+ const fs_path master_tx_fe_path =
+ master_fe_base_path(_radio_slot) / fs_path("tx_frontends") / chan;
+ UHD_LOG_DEBUG(unique_id(),
+ "Slave setting TX frequency");
+ _tree->access<double>(master_tx_fe_path / "freq" / "value").set(freq);
+ return _tree->access<double>(master_tx_fe_path / "freq" / "value").get();
+ }
_update_tx_freq_switches(freq, _tx_bypass_amp, chan);
//double ad9371_freq = freq;
double if_freq = 0.0;
@@ -200,6 +212,14 @@ double magnesium_radio_ctrl_impl::set_rx_frequency(
// bands.
UHD_LOG_TRACE(unique_id(),
"set_rx_frequency(f=" << freq << ", chan=" << chan << ")");
+ if (not _master) {
+ const fs_path master_rx_fe_path =
+ master_fe_base_path(_radio_slot) / fs_path("rx_frontends") / chan;
+ UHD_LOG_DEBUG(unique_id(),
+ "Slave setting RX frequency");
+ _tree->access<double>(master_rx_fe_path / "freq" / "value").set(freq);
+ return _tree->access<double>(master_rx_fe_path / "freq" / "value").get();
+ }
_update_rx_freq_switches(freq, _rx_bypass_lnas, chan);
//double ad9371_freq = freq;
double if_freq = 0.0;
@@ -223,6 +243,34 @@ double magnesium_radio_ctrl_impl::set_rx_frequency(
return freq; // FIXME calc the actual frequency
}
+double magnesium_radio_ctrl_impl::get_tx_frequency(
+ const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(),
+ "get_tx_frequency(chan=" << chan << ")");
+ if (not _master) {
+ const fs_path master_tx_fe_path =
+ master_fe_base_path(_radio_slot) / fs_path("tx_frontends") / chan;
+ UHD_LOG_TRACE(unique_id(), "Slave getting TX frequency");
+ return _tree->access<double>(master_tx_fe_path / "freq" / "value").get();
+ }
+ return radio_ctrl_impl::get_tx_frequency(chan);
+}
+
+double magnesium_radio_ctrl_impl::get_rx_frequency(
+ const size_t chan)
+{
+ UHD_LOG_TRACE(unique_id(),
+ "get_rx_frequency(chan=" << chan << ")");
+ if (not _master) {
+ const fs_path master_rx_fe_path =
+ master_fe_base_path(_radio_slot) / fs_path("rx_frontends") / chan;
+ UHD_LOG_TRACE(unique_id(), "Slave getting RX frequency");
+ return _tree->access<double>(master_rx_fe_path / "freq" / "value").get();
+ }
+ return radio_ctrl_impl::get_rx_frequency(chan);
+}
+
double magnesium_radio_ctrl_impl::set_rx_bandwidth(
const double bandwidth,
const size_t chan
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 c8597fdf7..7d67a7263 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
@@ -48,7 +48,7 @@ public:
/************************************************************************
* API calls
***********************************************************************/
- // Note: We use the cached values in radio_ctrl_impl, so most getters are
+ // Note: We use the cached values in radio_ctrl_impl, so most getters are
// not reimplemented here
double set_rate(double rate);
@@ -57,9 +57,10 @@ public:
double set_tx_frequency(const double freq, const size_t chan);
double set_rx_frequency(const double freq, const size_t chan);
+ double get_rx_frequency(const size_t chan);
+ double get_tx_frequency(const size_t chan);
double set_tx_bandwidth(const double bandwidth, const size_t chan);
double set_rx_bandwidth(const double bandwidth, const size_t chan);
-
std::vector<std::string> get_rx_lo_names(const size_t chan);
std::vector<std::string> get_rx_lo_sources(
const std::string &name,
@@ -89,7 +90,6 @@ 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);
std::string get_dboard_fe_from_chan(const size_t chan, const direction_t dir);
@@ -113,7 +113,6 @@ private:
//! Init a subtree for the RF frontends
void _init_frontend_subtree(
uhd::property_tree::sptr subtree,
- const size_t fe_chan_idx,
const size_t chan_idx
);
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 0d047c5d9..dfa4482b4 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_init.cpp
@@ -185,11 +185,10 @@ void magnesium_radio_ctrl_impl::_init_defaults()
void magnesium_radio_ctrl_impl::_init_frontend_subtree(
uhd::property_tree::sptr subtree,
- const size_t fe_chan_idx,
const size_t chan_idx
) {
- const fs_path tx_fe_path = fs_path("tx_frontends") / fe_chan_idx;
- const fs_path rx_fe_path = fs_path("rx_frontends") / fe_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);
@@ -342,127 +341,14 @@ void magnesium_radio_ctrl_impl::_init_frontend_subtree(
void magnesium_radio_ctrl_impl::_init_prop_tree()
{
- fs_path gain_mode_path =
- _root_path.branch_path()
- / str(boost::format("Radio_%d") % ((get_block_id().get_block_count()/2)*2))
- / "args/0/gain_mode/value";
- UHD_LOG_DEBUG("GAIN_MODE_STRING","Gain mode path " << gain_mode_path);
- std::string gain_mode = _tree->access<std::string>(gain_mode_path).get();
- UHD_LOG_DEBUG("GAIN_MODE_STRING","Gain mode string" << gain_mode);
-
- /**** Set up legacy compatible properties ******************************/
- // For use with multi_usrp APIs etc.
- // For legacy prop tree init:
- // TODO: determine DB number
const fs_path fe_base = fs_path("dboards") / _radio_slot;
- const std::vector<uhd::direction_t> dir({ RX_DIRECTION, TX_DIRECTION });
- const std::vector<std::string> fe({ "rx_frontends", "tx_frontends" });
- const std::vector<std::string> ant({ "RX" , "TX" });
- //const size_t RX_IDX = 0;
- // const size_t TX_IDX = 1;
- //this->_dsa_set_gain(0.5,0,RX_DIRECTION);
- for (size_t fe_idx = 0; fe_idx < fe.size(); ++fe_idx)
- {
- const fs_path fe_direction_path = fe_base / fe[fe_idx];
- for (size_t chan = 0; chan < MAGNESIUM_NUM_CHANS; ++chan)
- {
- const fs_path fe_path = fe_direction_path / chan;
- UHD_LOG_TRACE(unique_id(), "Adding FE at " << fe_path);
- // Shared TX/RX attributes
- //{
- //auto ad9371_min_gain = (fe_idx == RX_IDX) ? AD9371_MIN_RX_GAIN : AD9371_MIN_TX_GAIN;
- //auto ad9371_max_gain = (fe_idx == RX_IDX) ? AD9371_MAX_RX_GAIN : AD9371_MAX_TX_GAIN;
- //auto ad9371_gain_step = (fe_idx == RX_IDX) ? AD9371_RX_GAIN_STEP : AD9371_TX_GAIN_STEP;
- //auto dsa_min_gain = DSA_MIN_GAIN;
- //auto dsa_max_gain = DSA_MAX_GAIN;
- //auto dsa_gain_step = DSA_GAIN_STEP;
- //auto all_min_gain = (fe_idx == RX_IDX) ? ALL_RX_MIN_GAIN : ALL_TX_MIN_GAIN;
- //auto all_max_gain = (fe_idx == RX_IDX) ? ALL_TX_MAX_GAIN : ALL_TX_MAX_GAIN;
- //auto all_gain_step = 0.5;
- //if (gain_mode == "auto"){
- //ad9371_min_gain = 0;
- //ad9371_max_gain = 0;
- //ad9371_gain_step = 0;
- //dsa_min_gain = 0;
- //dsa_max_gain = 0;
- //dsa_gain_step = 0;
- //}
- //if (gain_mode == "manual")
- //{
- //all_min_gain = 0 ;
- //all_max_gain = 0 ;
- //all_gain_step = 0 ;
-
- //}
- //auto dir_ = dir[fe_idx];
- ////Create gain property for mykonos
- //auto myk_set_gain_func = [this, chan, dir_](const double gain)
- //{
- //return this->_myk_set_gain(gain, chan, dir_);
- //};
- //auto myk_get_gain_func = [this, chan, dir_]()
- //{
- //return this->_myk_get_gain(chan, dir_);
- //};
-
- //_tree->create<double>(fe_path / "gains" / "ad9371" / "value")
- //.set(0)
- //.set_coercer(myk_set_gain_func)
- //.set_publisher(myk_get_gain_func);
- //_tree->create<meta_range_t>(fe_path / "gains" / "ad9371" / "range")
- //.set(meta_range_t(ad9371_min_gain, ad9371_max_gain, ad9371_gain_step));
- //// Create gain property for DSA
- //auto dsa_set_gain_func = [this, chan, dir_](const double gain)
- //{
- //return this->_dsa_set_gain(gain, chan, dir_);
- //};
- //auto dsa_get_gain_func = [this, chan, dir_]()
- //{
- //return this->_dsa_get_gain(chan, dir_);
- //};
- //_tree->create<double>(fe_path / "gains" / "dsa" / "value")
- //.set(0)
- //.set_coercer(dsa_set_gain_func)
- //.set_publisher(dsa_get_gain_func);
- //_tree->create<meta_range_t>(fe_path / "gains" / "dsa" / "range")
- //.set(meta_range_t(dsa_min_gain, dsa_max_gain, dsa_gain_step));
-
- //// Create gain property for all gains
- //auto set_all_gain_func = [this, chan, dir_](const double gain)
- //{
- //return this->_set_all_gain(gain, chan, dir_);
- //};
- //auto get_all_gain_func = [this, chan, dir_]()
- //{
- //return this->_get_all_gain(chan, dir_);
- //};
- //_tree->create<double>(fe_path / "gains" / "all" / "value")
- //.set(0)
- //.set_coercer(set_all_gain_func)
- //.set_publisher(get_all_gain_func);
- //_tree->create<meta_range_t>(fe_path / "gains" / "all" / "range")
- //.set(meta_range_t(all_min_gain, all_max_gain, all_gain_step));
-
- //}
- }
- }
-
-
- // TODO this might be wrong
- if (_master) {
- this->_init_frontend_subtree(_tree->subtree(fe_base), 0, 0);
- std::string slave_slot = (_radio_slot == "A") ? "B" : "D";
- UHD_LOG_TRACE(unique_id(),
- "Also registering props for slave radio " << slave_slot);
- this->_init_frontend_subtree(
- _tree->subtree(fs_path("dboards") / slave_slot), 0, 1);
- }
+ this->_init_frontend_subtree(_tree->subtree(fe_base), 0);
// TODO: When we go to one radio per dboard, the above if statement goes
// away, and instead we have something like this:
/*
*for (chan_idx = 0; chan_idx < MAGNESIUM_NUM_CHANS; chan_idx++) {
* this->_init_frontend_subtree(
- * _tree->get_subtree(fe_base), chan_idx, chan_idx);
+ * _tree->get_subtree(fe_base), chan_idx);
*}
*/