aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/b200
diff options
context:
space:
mode:
authormichael-west <michael.west@ettus.com>2021-10-19 12:20:33 -0700
committerAaron Rossetto <aaron.rossetto@ni.com>2021-11-10 13:43:48 -0800
commit91a4f628828358267f5c0b0719da65dd34234196 (patch)
tree9c1c036fff0091510106608e1bbc151d0ea9fb05 /host/lib/usrp/b200
parent7f8e7f97c82923b2011c905e8a1374a8718b1230 (diff)
downloaduhd-91a4f628828358267f5c0b0719da65dd34234196.tar.gz
uhd-91a4f628828358267f5c0b0719da65dd34234196.tar.bz2
uhd-91a4f628828358267f5c0b0719da65dd34234196.zip
B200: Re-sync times
The times on the device can glitch if either the tick rate changes or the number of active chains changes. This throws off the time if the user gets streamers, changes the sample rate, or changes the tick rate after synchronizing the time. This change re-synchronizes the times automatically in those cases. Signed-off-by: michael-west <michael.west@ettus.com>
Diffstat (limited to 'host/lib/usrp/b200')
-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);