diff options
author | Trung Tran <trung.tran@ettus.com> | 2017-11-10 07:34:54 -0800 |
---|---|---|
committer | Martin Braun <martin.braun@ettus.com> | 2017-12-22 15:05:05 -0800 |
commit | e88169017333f590ef6980652a8054a41f729568 (patch) | |
tree | 2e098b331767862adc4c75915c50307a5ecef553 | |
parent | 95545e393518d880eeb2833be12d98488c7f6e40 (diff) | |
download | uhd-e88169017333f590ef6980652a8054a41f729568.tar.gz uhd-e88169017333f590ef6980652a8054a41f729568.tar.bz2 uhd-e88169017333f590ef6980652a8054a41f729568.zip |
mg: master and slave radio sharing frequency
This addresses the fact that two Mg Radio RFNoC blocks share a single LO
in both Tx and Rx direction. When setting the frequency on one, the
appropriate actions are now triggered on the other side. The same goes
for getters, they now actually tell the truth.
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); *} */ |