aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--host/lib/usrp/b200/b200_impl.cpp39
-rw-r--r--host/lib/usrp/b200/b200_impl.hpp2
2 files changed, 31 insertions, 10 deletions
diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp
index ed685d536..6de161e87 100644
--- a/host/lib/usrp/b200/b200_impl.cpp
+++ b/host/lib/usrp/b200/b200_impl.cpp
@@ -301,6 +301,7 @@ b200_impl::b200_impl(
_revision(0)
, _enable_user_regs(device_addr.has_key("enable_user_regs"))
, _time_source(UNKNOWN)
+ , _time_set_with_pps(false)
, _tick_rate(0.0) // Forces a clock initialization at startup
{
_tree = property_tree::make();
@@ -715,11 +716,9 @@ b200_impl::b200_impl(
_tree->create<time_spec_t>(mb_path / "time" / "pps")
.set_publisher(
std::bind(&time_core_3000::get_time_last_pps, _radio_perifs[0].time64));
- for (radio_perifs_t& perif : _radio_perifs) {
- _tree->access<time_spec_t>(mb_path / "time" / "pps")
- .add_coerced_subscriber(std::bind(
- &time_core_3000::set_time_next_pps, perif.time64, std::placeholders::_1));
- }
+ _tree->access<time_spec_t>(mb_path / "time" / "pps")
+ .add_coerced_subscriber(std::bind(
+ &b200_impl::set_time_next_pps, this, std::placeholders::_1));
// setup time source props
const std::vector<std::string> time_sources =
@@ -1305,11 +1304,28 @@ void b200_impl::set_time(const uhd::time_spec_t& t)
perif.time64->set_time_sync(t);
_local_ctrl->poke32(TOREG(SR_CORE_SYNC), 1 << 2 | uint32_t(_time_source));
_local_ctrl->poke32(TOREG(SR_CORE_SYNC), _time_source);
+ _time_set_with_pps = false;
+}
+
+void b200_impl::set_time_next_pps(const uhd::time_spec_t& t)
+{
+ for (radio_perifs_t& perif : _radio_perifs)
+ perif.time64->set_time_next_pps(t);
+ _time_set_with_pps = true;
}
void b200_impl::sync_times()
{
- set_time(_radio_perifs[0].time64->get_time_now());
+ if (_time_set_with_pps) {
+ UHD_LOG_DEBUG("B200", "Re-synchronizing time using PPS");
+ uhd::time_spec_t time_last_pps = _radio_perifs[0].time64->get_time_last_pps();
+ while (_radio_perifs[0].time64->get_time_last_pps() == time_last_pps) {
+ std::this_thread::sleep_for(std::chrono::milliseconds(1));
+ }
+ set_time_next_pps(time_last_pps + 2.0);
+ } else {
+ set_time(_radio_perifs[0].time64->get_time_now());
+ }
}
/***********************************************************************
@@ -1443,7 +1459,7 @@ void b200_impl::update_enables(void)
and bool(_radio_perifs[_fe2].rx_streamer.lock());
const size_t num_rx = (enb_rx1 ? 1 : 0) + (enb_rx2 ? 1 : 0);
const size_t num_tx = (enb_tx1 ? 1 : 0) + (enb_tx2 ? 1 : 0);
- const bool mimo = num_rx == 2 or num_tx == 2;
+ const uint32_t mimo = (num_rx == 2 or num_tx == 2) ? 1 : 0;
if ((num_rx + num_tx) == 3) {
throw uhd::runtime_error(
@@ -1455,9 +1471,12 @@ void b200_impl::update_enables(void)
if ((num_rx + num_tx) == 0)
_codec_ctrl->set_active_chains(true, false, true, false); // enable something
- // figure out if mimo is enabled based on new state
- _gpio_state.mimo = (mimo) ? 1 : 0;
- update_gpio_state();
+ // update MIMO state and re-sync times if necessary
+ if (_gpio_state.mimo != mimo) {
+ _gpio_state.mimo = mimo;
+ update_gpio_state();
+ sync_times();
+ }
// atrs change based on enables
this->update_atrs();
diff --git a/host/lib/usrp/b200/b200_impl.hpp b/host/lib/usrp/b200/b200_impl.hpp
index b280bcc87..11bfa112a 100644
--- a/host/lib/usrp/b200/b200_impl.hpp
+++ b/host/lib/usrp/b200/b200_impl.hpp
@@ -182,6 +182,7 @@ private:
void update_subdev_spec(const std::string& tx_rx, const uhd::usrp::subdev_spec_t&);
void update_time_source(const std::string&);
void set_time(const uhd::time_spec_t&);
+ void set_time_next_pps(const uhd::time_spec_t&);
void sync_times(void);
void update_clock_source(const std::string&);
void update_bandsel(const std::string& which, double freq);
@@ -248,6 +249,7 @@ private:
NONE = 3,
UNKNOWN = 4
} _time_source;
+ bool _time_set_with_pps;
void update_gpio_state(void);