aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp40
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp2
2 files changed, 37 insertions, 5 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 ae7f68710..090281d82 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
@@ -97,14 +97,24 @@ namespace {
// 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") {
+ if (radio_slot == "B" or radio_slot == "A") {
return fs_path("dboards") / "A";
}
- if (radio_slot == "D") {
+ if (radio_slot == "D" or radio_slot == "C") {
return fs_path("dboards") / "C";
}
UHD_THROW_INVALID_CODE_PATH();
}
+ fs_path slave_fe_base_path(const std::string &radio_slot)
+ {
+ if (radio_slot == "B" or radio_slot == "A") {
+ return fs_path("dboards") / "B";
+ }
+ if (radio_slot == "D" or radio_slot == "C") {
+ return fs_path("dboards") / "D";
+ }
+ UHD_THROW_INVALID_CODE_PATH();
+ }
}
@@ -202,6 +212,7 @@ double magnesium_radio_ctrl_impl::set_tx_frequency(
master_fe_base_path(_radio_slot) / fs_path("tx_frontends") / chan;
UHD_LOG_DEBUG(unique_id(),
"Slave setting TX frequency");
+
return _tree->access<double>(master_tx_fe_path / "freq" / "value")
.set(freq)
.get();
@@ -228,11 +239,29 @@ double magnesium_radio_ctrl_impl::set_tx_frequency(
}
//const double actual_ad9371_freq =
- _ad9371->set_frequency(freq, chan, TX_DIRECTION);
- radio_ctrl_impl::set_tx_frequency(freq, chan);
+ _ad9371->set_frequency(freq, chan, TX_DIRECTION);
+ this->_update_gain(chan, TX_DIRECTION);
return freq; // FIXME calc the actual 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 fs_path slave_fe_path =
+ slave_fe_base_path(_radio_slot) / fs_path(fe) / chan;
+ const double freq = (dir == TX_DIRECTION) ?
+ this->get_tx_frequency(chan) :
+ this->get_rx_frequency(chan);
+ // "this" here is always master
+ this->_set_all_gain(this->_get_all_gain(chan, dir), freq, chan, dir);
+ // now we need update gain on slave
+ _tree->access<double>(slave_fe_path / "gains" / "all" / "value").update();
+
+}
+
double magnesium_radio_ctrl_impl::set_rx_frequency(
const double freq,
const size_t chan
@@ -252,7 +281,7 @@ double magnesium_radio_ctrl_impl::set_rx_frequency(
.set(freq)
.get();
}
- // If we're on the slave, we use the master lock or we get a deadlock
+ // If we're on the slave, we use the master lock or we'd get a deadlock
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
@@ -276,6 +305,7 @@ double magnesium_radio_ctrl_impl::set_rx_frequency(
//const double actual_ad9371_freq =
_ad9371->set_frequency(freq, chan, RX_DIRECTION);
radio_ctrl_impl::set_rx_frequency(freq, chan);
+ this->_update_gain(chan, RX_DIRECTION);
return freq; // FIXME calc the actual frequency
}
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 ce96eb200..c4c07cf97 100644
--- a/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
@@ -169,6 +169,8 @@ private:
const direction_t dir
);
+ void _update_gain(const size_t chan, direction_t dir);
+
/**************************************************************************
* CPLD Controls (implemented in magnesium_radio_ctrl_cpld.cpp)
*************************************************************************/