From bca5edb57979983a9eb8d6cd1016961552ad217c Mon Sep 17 00:00:00 2001 From: michael-west Date: Wed, 25 Jun 2014 14:56:20 -0700 Subject: Fix for BUG #492: UHD: set_time_unknown_pps() fails with GPSDO installed - Added polling for PPS time change after setting time from GPSDO. --- host/lib/usrp/b200/b200_impl.cpp | 5 +++++ host/lib/usrp/usrp2/usrp2_impl.cpp | 9 ++++++++- host/lib/usrp/x300/x300_impl.cpp | 6 ++++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp index 261183128..f2b3885e6 100644 --- a/host/lib/usrp/b200/b200_impl.cpp +++ b/host/lib/usrp/b200/b200_impl.cpp @@ -477,6 +477,11 @@ b200_impl::b200_impl(const device_addr_t &device_addr) UHD_MSG(status) << "Initializing time to the internal GPSDO" << std::endl; const time_t tp = time_t(_gps->get_sensor("gps_time").to_int()+1); _tree->access(mb_path / "time" / "pps").set(time_spec_t(tp)); + + //wait for next PPS edge (timeout after 1 second) + time_spec_t pps_time = _tree->access(mb_path / "time" / "pps").get(); + for (size_t i = 0; i < 10 && _tree->access(mb_path / "time" / "pps").get() == pps_time; i++) + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); } } diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index 918f3e892..7c478d8e1 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -35,6 +35,7 @@ #include #include #include //used for htonl and ntohl +#include using namespace uhd; using namespace uhd::usrp; @@ -760,7 +761,13 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){ _tree->access(root / "time_source/value").set("gpsdo"); _tree->access(root / "clock_source/value").set("gpsdo"); UHD_MSG(status) << "Initializing time to the internal GPSDO" << std::endl; - _mbc[mb].time64->set_time_next_pps(time_spec_t(time_t(_mbc[mb].gps->get_sensor("gps_time").to_int()+1))); + const time_t tp = time_t(_mbc[mb].gps->get_sensor("gps_time").to_int()+1); + _tree->access(root / "time" / "pps").set(time_spec_t(tp)); + + //wait for next PPS edge (timeout after 1 second) + time_spec_t pps_time = _tree->access(root / "time" / "pps").get(); + for (size_t i = 0; i < 10 && _tree->access(root / "time" / "pps").get() == pps_time; i++) + boost::this_thread::sleep(boost::posix_time::milliseconds(100)); } } diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index 2c291f422..fdf216cf2 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -831,8 +831,10 @@ void x300_impl::setup_mb(const size_t mb_i, const uhd::device_addr_t &dev_addr) UHD_MSG(status) << "Initializing time to the GPSDO time" << std::endl; const time_t tp = time_t(mb.gps->get_sensor("gps_time").to_int()+1); _tree->access(mb_path / "time" / "pps").set(time_spec_t(tp)); - //wait for time to be set (timeout after 1 second) - for (int i = 0; i < 10 && tp != (_tree->access(mb_path / "time" / "pps").get()).get_full_secs(); i++) + + //wait for next PPS edge (timeout after 1 second) + time_spec_t pps_time = _tree->access(mb_path / "time" / "pps").get(); + for (size_t i = 0; i < 10 && _tree->access(mb_path / "time" / "pps").get() == pps_time; i++) boost::this_thread::sleep(boost::posix_time::milliseconds(100)); } else { _tree->access(mb_path / "clock_source" / "value").set("internal"); -- cgit v1.2.3 From 42b47cea158d3a767a87ff4da71a00b3243e14f1 Mon Sep 17 00:00:00 2001 From: Ian Buckley Date: Mon, 16 Jun 2014 16:50:08 -0700 Subject: X300: Added UHD support for TX FE --- host/lib/usrp/x300/x300_impl.cpp | 13 ++++++++++++- host/lib/usrp/x300/x300_impl.hpp | 2 ++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index a624ebf6b..0c19e7b39 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -1077,11 +1077,17 @@ void x300_impl::setup_radio(const size_t mb_i, const std::string &slot_name) this->update_atr_leds(mb.radio_perifs[radio_index].leds, ""); //init anyway, even if never called //bind frontend corrections to the dboard freq props + const fs_path db_tx_fe_path = db_path / "tx_frontends"; + BOOST_FOREACH(const std::string &name, _tree->list(db_tx_fe_path)) + { + _tree->access(db_tx_fe_path / name / "freq" / "value") + .subscribe(boost::bind(&x300_impl::set_tx_fe_corrections, this, mb_path, slot_name, _1)); + } const fs_path db_rx_fe_path = db_path / "rx_frontends"; BOOST_FOREACH(const std::string &name, _tree->list(db_rx_fe_path)) { _tree->access(db_rx_fe_path / name / "freq" / "value") - .subscribe(boost::bind(&x300_impl::set_rx_fe_corrections, this, mb_path, slot_name, _1)); + .subscribe(boost::bind(&x300_impl::set_rx_fe_corrections, this, mb_path, slot_name, _1)); } } @@ -1090,6 +1096,11 @@ void x300_impl::set_rx_fe_corrections(const uhd::fs_path &mb_path, const std::st apply_rx_fe_corrections(this->get_tree()->subtree(mb_path), fe_name, lo_freq); } +void x300_impl::set_tx_fe_corrections(const uhd::fs_path &mb_path, const std::string &fe_name, const double lo_freq) +{ + apply_tx_fe_corrections(this->get_tree()->subtree(mb_path), fe_name, lo_freq); +} + boost::uint32_t get_pcie_dma_channel(boost::uint8_t destination, boost::uint8_t prefix) { static const boost::uint32_t RADIO_GRP_SIZE = 3; diff --git a/host/lib/usrp/x300/x300_impl.hpp b/host/lib/usrp/x300/x300_impl.hpp index 27f20fbd9..4108afbb0 100644 --- a/host/lib/usrp/x300/x300_impl.hpp +++ b/host/lib/usrp/x300/x300_impl.hpp @@ -321,6 +321,8 @@ private: uhd::dict _dboard_ifaces; void set_rx_fe_corrections(const uhd::fs_path &mb_path, const std::string &fe_name, const double lo_freq); + void set_tx_fe_corrections(const uhd::fs_path &mb_path, const std::string &fe_name, const double lo_freq); + /*! Update the IQ MUX settings for the radio peripheral according to given subdev spec. * -- cgit v1.2.3 From eafae66c030aa86e9da127de4f6d5ec4fd641c59 Mon Sep 17 00:00:00 2001 From: Ben Hilburn Date: Fri, 25 Jul 2014 09:44:07 -0700 Subject: tx fe corrections: fixing mixed tabs / spaces, other horrible whitespace cruft --- host/lib/usrp/x300/x300_impl.cpp | 23 ++++++++++------------- host/lib/usrp/x300/x300_impl.hpp | 2 +- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/host/lib/usrp/x300/x300_impl.cpp b/host/lib/usrp/x300/x300_impl.cpp index 28d5b49ee..31db04673 100644 --- a/host/lib/usrp/x300/x300_impl.cpp +++ b/host/lib/usrp/x300/x300_impl.cpp @@ -1079,16 +1079,14 @@ void x300_impl::setup_radio(const size_t mb_i, const std::string &slot_name) //bind frontend corrections to the dboard freq props const fs_path db_tx_fe_path = db_path / "tx_frontends"; - BOOST_FOREACH(const std::string &name, _tree->list(db_tx_fe_path)) - { - _tree->access(db_tx_fe_path / name / "freq" / "value") - .subscribe(boost::bind(&x300_impl::set_tx_fe_corrections, this, mb_path, slot_name, _1)); - } + BOOST_FOREACH(const std::string &name, _tree->list(db_tx_fe_path)) { + _tree->access(db_tx_fe_path / name / "freq" / "value") + .subscribe(boost::bind(&x300_impl::set_tx_fe_corrections, this, mb_path, slot_name, _1)); + } const fs_path db_rx_fe_path = db_path / "rx_frontends"; - BOOST_FOREACH(const std::string &name, _tree->list(db_rx_fe_path)) - { + BOOST_FOREACH(const std::string &name, _tree->list(db_rx_fe_path)) { _tree->access(db_rx_fe_path / name / "freq" / "value") - .subscribe(boost::bind(&x300_impl::set_rx_fe_corrections, this, mb_path, slot_name, _1)); + .subscribe(boost::bind(&x300_impl::set_rx_fe_corrections, this, mb_path, slot_name, _1)); } } @@ -1118,8 +1116,7 @@ x300_impl::both_xports_t x300_impl::make_transport( const boost::uint8_t& destination, const boost::uint8_t& prefix, const uhd::device_addr_t& args, - boost::uint32_t& sid -) + boost::uint32_t& sid) { mboard_members_t &mb = _mb[mb_index]; both_xports_t xports; @@ -1216,10 +1213,10 @@ x300_impl::both_xports_t x300_impl::make_transport( << std::endl; } - size_t system_max_send_frame_size = (size_t) _max_frame_sizes.send_frame_size; - size_t system_max_recv_frame_size = (size_t) _max_frame_sizes.recv_frame_size; + size_t system_max_send_frame_size = (size_t) _max_frame_sizes.send_frame_size; + size_t system_max_recv_frame_size = (size_t) _max_frame_sizes.recv_frame_size; - // Make sure frame sizes do not exceed the max available value supported by UHD + // Make sure frame sizes do not exceed the max available value supported by UHD default_buff_args.send_frame_size = (prefix == X300_RADIO_DEST_PREFIX_TX) ? std::min(system_max_send_frame_size, X300_10GE_DATA_FRAME_MAX_SIZE) diff --git a/host/lib/usrp/x300/x300_impl.hpp b/host/lib/usrp/x300/x300_impl.hpp index 4108afbb0..578e96383 100644 --- a/host/lib/usrp/x300/x300_impl.hpp +++ b/host/lib/usrp/x300/x300_impl.hpp @@ -211,7 +211,7 @@ private: //perifs in each radio radio_perifs_t radio_perifs[2]; //!< This is hardcoded s.t. radio_perifs[0] points to slot A and [1] to B uhd::usrp::dboard_eeprom_t db_eeproms[8]; - //! Return the index of a radio component, given a slot name. This means DSPs, radio_perifs + //! Return the index of a radio component, given a slot name. This means DSPs, radio_perifs size_t get_radio_index(const std::string &slot_name) { UHD_ASSERT_THROW(slot_name == "A" or slot_name == "B"); return slot_name == "A" ? 0 : 1; -- cgit v1.2.3 From fb47c829c2006ff42d5fc5e167060c801c463325 Mon Sep 17 00:00:00 2001 From: Nicholas Corgan Date: Mon, 28 Jul 2014 08:57:18 -0700 Subject: usrp_burn_mb_eeprom: write all changes to the EEPROM at once * Utility was unnecessarily wearing out EEPROMs by calling separate writes for each key --- host/utils/usrp_burn_mb_eeprom.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/host/utils/usrp_burn_mb_eeprom.cpp b/host/utils/usrp_burn_mb_eeprom.cpp index ce0879c8e..f3e12c765 100644 --- a/host/utils/usrp_burn_mb_eeprom.cpp +++ b/host/utils/usrp_burn_mb_eeprom.cpp @@ -81,11 +81,12 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ } std::cout << std::endl; if (vm.count("val")){ + mb_eeprom = uhd::usrp::mboard_eeprom_t(); for(size_t i = 0; i < vals_vec.size(); i++){ - uhd::usrp::mboard_eeprom_t mb_eeprom; mb_eeprom[keys_vec[i]] = vals_vec[i]; + mb_eeprom[keys_vec[i]] = vals_vec[i]; std::cout << boost::format("Setting EEPROM [\"%s\"] to \"%s\"...") % keys_vec[i] % vals_vec[i] << std::endl; - tree->access("/mboards/0/eeprom").set(mb_eeprom); } + tree->access("/mboards/0/eeprom").set(mb_eeprom); std::cout << "Power-cycle the USRP device for the changes to take effect." << std::endl; std::cout << std::endl; } -- cgit v1.2.3