diff options
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/transport/if_addrs.cpp | 1 | ||||
-rw-r--r-- | host/lib/transport/udp_zero_copy_asio.cpp | 58 | ||||
-rw-r--r-- | host/lib/usrp/CMakeLists.txt | 1 | ||||
-rw-r--r-- | host/lib/usrp/gps_ctrl.cpp | 16 | ||||
-rw-r--r-- | host/lib/usrp/multi_usrp.cpp | 27 | ||||
-rw-r--r-- | host/lib/usrp/single_usrp.cpp | 339 | ||||
-rw-r--r-- | host/lib/usrp/subdev_spec.cpp | 2 | ||||
-rw-r--r-- | host/lib/usrp/usrp1/clock_ctrl.cpp | 21 | ||||
-rw-r--r-- | host/lib/usrp/usrp1/clock_ctrl.hpp | 7 | ||||
-rw-r--r-- | host/lib/usrp/usrp1/mboard_impl.cpp | 8 | ||||
-rw-r--r-- | host/lib/usrp/usrp1/soft_time_ctrl.cpp | 3 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 17 | ||||
-rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.cpp | 7 | ||||
-rw-r--r-- | host/lib/usrp/usrp_e100/usrp_e100_impl.hpp | 2 | ||||
-rw-r--r-- | host/lib/utils/paths.cpp | 1 |
15 files changed, 91 insertions, 419 deletions
diff --git a/host/lib/transport/if_addrs.cpp b/host/lib/transport/if_addrs.cpp index ad9a2325b..17cf8455b 100644 --- a/host/lib/transport/if_addrs.cpp +++ b/host/lib/transport/if_addrs.cpp @@ -42,6 +42,7 @@ std::vector<uhd::transport::if_addrs_t> uhd::transport::get_if_addrs(void){ if (getifaddrs(&ifap) == 0){ for (struct ifaddrs *iter = ifap; iter != NULL; iter = iter->ifa_next){ //ensure that the entries are valid + if (iter->ifa_addr == NULL) continue; if (iter->ifa_addr->sa_family != AF_INET) continue; if (iter->ifa_netmask->sa_family != AF_INET) continue; if (iter->ifa_broadaddr->sa_family != AF_INET) continue; diff --git a/host/lib/transport/udp_zero_copy_asio.cpp b/host/lib/transport/udp_zero_copy_asio.cpp index 5c049cfad..697e172cd 100644 --- a/host/lib/transport/udp_zero_copy_asio.cpp +++ b/host/lib/transport/udp_zero_copy_asio.cpp @@ -24,7 +24,7 @@ #include <uhd/utils/warning.hpp> #include <boost/asio.hpp> #include <boost/format.hpp> -#include <boost/thread.hpp> +#include <boost/thread/thread.hpp> #include <boost/enable_shared_from_this.hpp> #include <iostream> @@ -32,9 +32,6 @@ using namespace uhd; using namespace uhd::transport; namespace asio = boost::asio; -/*********************************************************************** - * Constants - **********************************************************************/ //Define this to the the boost async io calls to perform receive. //Otherwise, get_recv_buff uses a blocking receive with timeout. #define USE_ASIO_ASYNC_RECV @@ -43,32 +40,6 @@ namespace asio = boost::asio; //Otherwise, the commit callback uses a blocking send. //#define USE_ASIO_ASYNC_SEND -//By default, this buffer is sized insufficiently small. -//For peformance, this buffer should be 10s of megabytes. -static const size_t MIN_RECV_SOCK_BUFF_SIZE = size_t(10e3); - -//Large buffers cause more underflow at high rates. -//Perhaps this is due to the kernel scheduling, -//but may change with host-based flow control. -static const size_t MIN_SEND_SOCK_BUFF_SIZE = size_t(10e3); - -//The number of async frames to allocate for each send and recv: -//The non-async recv can have a very large number of recv frames -//because the CPU overhead is independent of the number of frames. -#ifdef USE_ASIO_ASYNC_RECV -static const size_t DEFAULT_NUM_RECV_FRAMES = 32; -#else -static const size_t DEFAULT_NUM_RECV_FRAMES = MIN_RECV_SOCK_BUFF_SIZE/udp_simple::mtu; -#endif - -//The non-async send only ever requires a single frame -//because the buffer will be committed before a new get. -#ifdef USE_ASIO_ASYNC_SEND -static const size_t DEFAULT_NUM_SEND_FRAMES = 32; -#else -static const size_t DEFAULT_NUM_SEND_FRAMES = MIN_SEND_SOCK_BUFF_SIZE/udp_simple::mtu; -#endif - //The number of service threads to spawn for async ASIO: //A single concurrent thread for io_service seems to be the fastest. //Threads are disabled when no async implementations are enabled. @@ -78,6 +49,9 @@ static const size_t CONCURRENCY_HINT = 1; static const size_t CONCURRENCY_HINT = 0; #endif +//A reasonable number of frames for send/recv and async/sync +static const size_t DEFAULT_NUM_FRAMES = 32; + /*********************************************************************** * Zero Copy UDP implementation with ASIO: * This is the portable zero copy implementation for systems @@ -95,9 +69,9 @@ public: const device_addr_t &hints ): _recv_frame_size(size_t(hints.cast<double>("recv_frame_size", udp_simple::mtu))), - _num_recv_frames(size_t(hints.cast<double>("num_recv_frames", DEFAULT_NUM_RECV_FRAMES))), + _num_recv_frames(size_t(hints.cast<double>("num_recv_frames", DEFAULT_NUM_FRAMES))), _send_frame_size(size_t(hints.cast<double>("send_frame_size", udp_simple::mtu))), - _num_send_frames(size_t(hints.cast<double>("num_send_frames", DEFAULT_NUM_SEND_FRAMES))), + _num_send_frames(size_t(hints.cast<double>("num_send_frames", DEFAULT_NUM_FRAMES))), _concurrency_hint(hints.cast<size_t>("concurrency_hint", CONCURRENCY_HINT)), _io_service(_concurrency_hint) { @@ -325,16 +299,11 @@ template<typename Opt> static void resize_buff_helper( const size_t target_size, const std::string &name ){ - size_t min_sock_buff_size = 0; - if (name == "recv") min_sock_buff_size = MIN_RECV_SOCK_BUFF_SIZE; - if (name == "send") min_sock_buff_size = MIN_SEND_SOCK_BUFF_SIZE; - min_sock_buff_size = std::max(min_sock_buff_size, target_size); - std::string help_message; #if defined(UHD_PLATFORM_LINUX) help_message = str(boost::format( "Please run: sudo sysctl -w net.core.%smem_max=%d\n" - ) % ((name == "recv")?"r":"w") % min_sock_buff_size); + ) % ((name == "recv")?"r":"w") % target_size); #endif /*defined(UHD_PLATFORM_LINUX)*/ //resize the buffer if size was provided @@ -348,19 +317,10 @@ template<typename Opt> static void resize_buff_helper( "Current %s sock buff size: %d bytes" ) % name % actual_size << std::endl; if (actual_size < target_size) uhd::warning::post(str(boost::format( - "The %s buffer is smaller than the requested size.\n" - "The minimum requested buffer size is %d bytes.\n" + "The %s buffer could not be resized sufficiently.\n" "See the transport application notes on buffer resizing.\n%s" - ) % name % min_sock_buff_size % help_message)); - } - - //only enable on platforms that are happy with the large buffer resize - #if defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32) - //otherwise, ensure that the buffer is at least the minimum size - else if (udp_trans->get_buff_size<Opt>() < min_sock_buff_size){ - resize_buff_helper<Opt>(udp_trans, min_sock_buff_size, name); + ) % name % help_message)); } - #endif /*defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32)*/ } udp_zero_copy::sptr udp_zero_copy::make( diff --git a/host/lib/usrp/CMakeLists.txt b/host/lib/usrp/CMakeLists.txt index bd25aec2b..97a54a798 100644 --- a/host/lib/usrp/CMakeLists.txt +++ b/host/lib/usrp/CMakeLists.txt @@ -29,7 +29,6 @@ LIBUHD_APPEND_SOURCES( ${CMAKE_CURRENT_SOURCE_DIR}/mboard_eeprom.cpp ${CMAKE_CURRENT_SOURCE_DIR}/misc_utils.cpp ${CMAKE_CURRENT_SOURCE_DIR}/multi_usrp.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/single_usrp.cpp ${CMAKE_CURRENT_SOURCE_DIR}/subdev_spec.cpp ${CMAKE_CURRENT_SOURCE_DIR}/tune_helper.cpp ${CMAKE_CURRENT_SOURCE_DIR}/wrapper_utils.hpp diff --git a/host/lib/usrp/gps_ctrl.cpp b/host/lib/usrp/gps_ctrl.cpp index 3c7c00134..b1062fa39 100644 --- a/host/lib/usrp/gps_ctrl.cpp +++ b/host/lib/usrp/gps_ctrl.cpp @@ -58,7 +58,7 @@ public: if(trim_right_copy(reply) == "Command Error") { gps_type = GPS_TYPE_JACKSON_LABS; break; - } + } else if(reply.substr(0, 3) == "$GP") i_heard_some_nmea = true; //but keep looking for that "Command Error" response else if(reply.length() != 0) i_heard_something_weird = true; //probably wrong baud rate boost::this_thread::sleep(boost::posix_time::milliseconds(200)); @@ -104,6 +104,7 @@ public: found_gprmc = true; break; } + boost::this_thread::sleep(boost::posix_time::milliseconds(200)); } if(!found_gprmc) { if(gps_type == GPS_TYPE_JACKSON_LABS) std::cout << "Firefly GPS not locked or warming up." << std::endl; @@ -127,16 +128,7 @@ public: //TODO: this isn't generalizeable to non-USRP2 USRPs. std::string safe_gps_read() { - std::string reply; - try { - reply = _recv(); - } catch (std::runtime_error err) { - if(err.what() != std::string("usrp2 no control response")) throw; //sorry can't cope with that - else { //we don't actually have a GPS installed - reply = std::string(); - } - } - return reply; + return _recv(); } ptime get_time(void) { @@ -196,7 +188,7 @@ private: GPS_TYPE_NONE } gps_type; - static const int GPS_TIMEOUT_TRIES = 5; + static const int GPS_TIMEOUT_TRIES = 10; static const int GPS_TIMEOUT_DELAY_MS = 200; static const int FIREFLY_STUPID_DELAY_MS = 200; diff --git a/host/lib/usrp/multi_usrp.cpp b/host/lib/usrp/multi_usrp.cpp index 48eec28c1..817d7b085 100644 --- a/host/lib/usrp/multi_usrp.cpp +++ b/host/lib/usrp/multi_usrp.cpp @@ -53,11 +53,26 @@ public: /******************************************************************* * Mboard methods ******************************************************************/ + void set_master_clock_rate(double rate, size_t mboard){ + if (mboard != ALL_MBOARDS){ + _mboard(mboard)[MBOARD_PROP_CLOCK_RATE] = rate; + return; + } + for (size_t m = 0; m < get_num_mboards(); m++){ + set_master_clock_rate(rate, m); + } + } + + double get_master_clock_rate(size_t mboard){ + return _mboard(mboard)[MBOARD_PROP_CLOCK_RATE].as<double>(); + } + std::string get_pp_string(void){ std::string buff = str(boost::format( - "Multi USRP:\n" + "%s USRP:\n" " Device: %s\n" ) + % ((get_num_mboards() > 1)? "Multi" : "Single") % (*_dev)[DEVICE_PROP_NAME].as<std::string>() ); for (size_t m = 0; m < get_num_mboards(); m++){ @@ -121,6 +136,16 @@ public: return _mboard(0)[MBOARD_PROP_TIME_PPS].as<time_spec_t>(); } + void set_time_now(const time_spec_t &time_spec, size_t mboard){ + if (mboard != ALL_MBOARDS){ + _mboard(mboard)[MBOARD_PROP_TIME_NOW] = time_spec; + return; + } + for (size_t m = 0; m < get_num_mboards(); m++){ + set_time_now(time_spec, m); + } + } + void set_time_next_pps(const time_spec_t &time_spec){ for (size_t m = 0; m < get_num_mboards(); m++){ _mboard(m)[MBOARD_PROP_TIME_PPS] = time_spec; diff --git a/host/lib/usrp/single_usrp.cpp b/host/lib/usrp/single_usrp.cpp deleted file mode 100644 index c37449c5f..000000000 --- a/host/lib/usrp/single_usrp.cpp +++ /dev/null @@ -1,339 +0,0 @@ -// -// Copyright 2010-2011 Ettus Research LLC -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with this program. If not, see <http://www.gnu.org/licenses/>. -// - -#include "wrapper_utils.hpp" -#include <uhd/usrp/single_usrp.hpp> -#include <uhd/usrp/tune_helper.hpp> -#include <uhd/utils/assert.hpp> -#include <uhd/utils/gain_group.hpp> -#include <uhd/usrp/subdev_props.hpp> -#include <uhd/usrp/mboard_props.hpp> -#include <uhd/usrp/device_props.hpp> -#include <uhd/usrp/dboard_props.hpp> -#include <uhd/usrp/dsp_props.hpp> -#include <boost/foreach.hpp> -#include <boost/format.hpp> -#include <stdexcept> -#include <iostream> - -using namespace uhd; -using namespace uhd::usrp; - -const std::string single_usrp::ALL_GAINS = ""; - -/*********************************************************************** - * Simple USRP Implementation - **********************************************************************/ -class single_usrp_impl : public single_usrp{ -public: - single_usrp_impl(const device_addr_t &addr){ - _dev = device::make(addr); - } - - device::sptr get_device(void){ - return _dev; - } - - /******************************************************************* - * Mboard methods - ******************************************************************/ - std::string get_pp_string(void){ - std::string buff = str(boost::format( - "Single USRP:\n" - " Device: %s\n" - " Mboard: %s\n" - ) - % (*_dev)[DEVICE_PROP_NAME].as<std::string>() - % _mboard()[MBOARD_PROP_NAME].as<std::string>() - ); - - //----------- rx side of life ---------------------------------- - buff += str(boost::format( - " RX DSP: %s\n" - ) - % _rx_dsp()[DSP_PROP_NAME].as<std::string>() - ); - for (size_t chan = 0; chan < this->get_rx_subdev_spec().size(); chan++){ - buff += str(boost::format( - " RX Channel: %u\n" - " RX Dboard: %s\n" - " RX Subdev: %s\n" - ) % chan - % _rx_dboard(chan)[DBOARD_PROP_NAME].as<std::string>() - % _rx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>() - ); - } - - //----------- tx side of life ---------------------------------- - buff += str(boost::format( - " TX DSP: %s\n" - ) - % _tx_dsp()[DSP_PROP_NAME].as<std::string>() - ); - for (size_t chan = 0; chan < this->get_tx_subdev_spec().size(); chan++){ - buff += str(boost::format( - " TX Channel: %u\n" - " TX Dboard: %s\n" - " TX Subdev: %s\n" - ) % chan - % _tx_dboard(chan)[DBOARD_PROP_NAME].as<std::string>() - % _tx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>() - ); - } - - return buff; - } - - std::string get_mboard_name(void){ - return _mboard()[MBOARD_PROP_NAME].as<std::string>(); - } - - time_spec_t get_time_now(void){ - return _mboard()[MBOARD_PROP_TIME_NOW].as<time_spec_t>(); - } - - time_spec_t get_time_last_pps(void){ - return _mboard()[MBOARD_PROP_TIME_PPS].as<time_spec_t>(); - } - - void set_time_now(const time_spec_t &time_spec){ - _mboard()[MBOARD_PROP_TIME_NOW] = time_spec; - } - - void set_time_next_pps(const time_spec_t &time_spec){ - _mboard()[MBOARD_PROP_TIME_PPS] = time_spec; - } - - void issue_stream_cmd(const stream_cmd_t &stream_cmd){ - _mboard()[MBOARD_PROP_STREAM_CMD] = stream_cmd; - } - - void set_clock_config(const clock_config_t &clock_config){ - _mboard()[MBOARD_PROP_CLOCK_CONFIG] = clock_config; - } - - /******************************************************************* - * RX methods - ******************************************************************/ - void set_rx_subdev_spec(const subdev_spec_t &spec){ - _mboard()[MBOARD_PROP_RX_SUBDEV_SPEC] = spec; - } - - subdev_spec_t get_rx_subdev_spec(void){ - return _mboard()[MBOARD_PROP_RX_SUBDEV_SPEC].as<subdev_spec_t>(); - } - - std::string get_rx_subdev_name(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>(); - } - - void set_rx_rate(double rate){ - _rx_dsp()[DSP_PROP_HOST_RATE] = rate; - do_samp_rate_warning_message(rate, get_rx_rate(), "RX"); - } - - double get_rx_rate(void){ - return _rx_dsp()[DSP_PROP_HOST_RATE].as<double>(); - } - - tune_result_t set_rx_freq(const tune_request_t &tune_request, size_t chan){ - tune_result_t r = tune_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(), chan, tune_request); - do_tune_freq_warning_message(tune_request.target_freq, get_rx_freq(chan), "RX"); - return r; - } - - double get_rx_freq(size_t chan){ - return derive_freq_from_rx_subdev_and_dsp(_rx_subdev(chan), _rx_dsp(), chan); - } - - freq_range_t get_rx_freq_range(size_t chan){ - return add_dsp_shift(_rx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _rx_dsp()); - } - - void set_rx_gain(double gain, const std::string &name, size_t chan){ - return _rx_gain_group(chan)->set_value(gain, name); - } - - double get_rx_gain(const std::string &name, size_t chan){ - return _rx_gain_group(chan)->get_value(name); - } - - gain_range_t get_rx_gain_range(const std::string &name, size_t chan){ - return _rx_gain_group(chan)->get_range(name); - } - - std::vector<std::string> get_rx_gain_names(size_t chan){ - return _rx_gain_group(chan)->get_names(); - } - - void set_rx_antenna(const std::string &ant, size_t chan){ - _rx_subdev(chan)[SUBDEV_PROP_ANTENNA] = ant; - } - - std::string get_rx_antenna(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_ANTENNA].as<std::string>(); - } - - std::vector<std::string> get_rx_antennas(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_ANTENNA_NAMES].as<prop_names_t>(); - } - - bool get_rx_lo_locked(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_LO_LOCKED].as<bool>(); - } - - void set_rx_bandwidth(double bandwidth, size_t chan){ - _rx_subdev(chan)[SUBDEV_PROP_BANDWIDTH] = bandwidth; - } - - double get_rx_bandwidth(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_BANDWIDTH].as<double>(); - } - - double read_rssi(size_t chan){ - return _rx_subdev(chan)[SUBDEV_PROP_RSSI].as<double>(); - } - - dboard_iface::sptr get_rx_dboard_iface(size_t chan){ - return _rx_dboard(chan)[DBOARD_PROP_DBOARD_IFACE].as<dboard_iface::sptr>(); - } - - /******************************************************************* - * TX methods - ******************************************************************/ - void set_tx_subdev_spec(const subdev_spec_t &spec){ - _mboard()[MBOARD_PROP_TX_SUBDEV_SPEC] = spec; - } - - subdev_spec_t get_tx_subdev_spec(void){ - return _mboard()[MBOARD_PROP_TX_SUBDEV_SPEC].as<subdev_spec_t>(); - } - - std::string get_tx_subdev_name(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_NAME].as<std::string>(); - } - - void set_tx_rate(double rate){ - _tx_dsp()[DSP_PROP_HOST_RATE] = rate; - do_samp_rate_warning_message(rate, get_tx_rate(), "TX"); - } - - double get_tx_rate(void){ - return _tx_dsp()[DSP_PROP_HOST_RATE].as<double>(); - } - - tune_result_t set_tx_freq(const tune_request_t &tune_request, size_t chan){ - tune_result_t r = tune_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(), chan, tune_request); - do_tune_freq_warning_message(tune_request.target_freq, get_tx_freq(chan), "TX"); - return r; - } - - double get_tx_freq(size_t chan){ - return derive_freq_from_tx_subdev_and_dsp(_tx_subdev(chan), _tx_dsp(), chan); - } - - freq_range_t get_tx_freq_range(size_t chan){ - return add_dsp_shift(_tx_subdev(chan)[SUBDEV_PROP_FREQ_RANGE].as<freq_range_t>(), _tx_dsp()); - } - - void set_tx_gain(double gain, const std::string &name, size_t chan){ - return _tx_gain_group(chan)->set_value(gain, name); - } - - double get_tx_gain(const std::string &name, size_t chan){ - return _tx_gain_group(chan)->get_value(name); - } - - gain_range_t get_tx_gain_range(const std::string &name, size_t chan){ - return _tx_gain_group(chan)->get_range(name); - } - - std::vector<std::string> get_tx_gain_names(size_t chan){ - return _tx_gain_group(chan)->get_names(); - } - - void set_tx_antenna(const std::string &ant, size_t chan){ - _tx_subdev(chan)[SUBDEV_PROP_ANTENNA] = ant; - } - - std::string get_tx_antenna(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_ANTENNA].as<std::string>(); - } - - std::vector<std::string> get_tx_antennas(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_ANTENNA_NAMES].as<prop_names_t>(); - } - - bool get_tx_lo_locked(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_LO_LOCKED].as<bool>(); - } - - void set_tx_bandwidth(double bandwidth, size_t chan){ - _tx_subdev(chan)[SUBDEV_PROP_BANDWIDTH] = bandwidth; - } - - double get_tx_bandwidth(size_t chan){ - return _tx_subdev(chan)[SUBDEV_PROP_BANDWIDTH].as<double>(); - } - - dboard_iface::sptr get_tx_dboard_iface(size_t chan){ - return _tx_dboard(chan)[DBOARD_PROP_DBOARD_IFACE].as<dboard_iface::sptr>(); - } - -private: - device::sptr _dev; - wax::obj _mboard(void){ - return (*_dev)[DEVICE_PROP_MBOARD]; - } - wax::obj _rx_dsp(void){ - return _mboard()[MBOARD_PROP_RX_DSP]; - } - wax::obj _tx_dsp(void){ - return _mboard()[MBOARD_PROP_TX_DSP]; - } - wax::obj _rx_dboard(size_t chan){ - std::string db_name = this->get_rx_subdev_spec().at(chan).db_name; - return _mboard()[named_prop_t(MBOARD_PROP_RX_DBOARD, db_name)]; - } - wax::obj _tx_dboard(size_t chan){ - std::string db_name = this->get_tx_subdev_spec().at(chan).db_name; - return _mboard()[named_prop_t(MBOARD_PROP_TX_DBOARD, db_name)]; - } - wax::obj _rx_subdev(size_t chan){ - std::string sd_name = this->get_rx_subdev_spec().at(chan).sd_name; - return _rx_dboard(chan)[named_prop_t(DBOARD_PROP_SUBDEV, sd_name)]; - } - wax::obj _tx_subdev(size_t chan){ - std::string sd_name = this->get_tx_subdev_spec().at(chan).sd_name; - return _tx_dboard(chan)[named_prop_t(DBOARD_PROP_SUBDEV, sd_name)]; - } - gain_group::sptr _rx_gain_group(size_t chan){ - std::string sd_name = this->get_rx_subdev_spec().at(chan).sd_name; - return _rx_dboard(chan)[named_prop_t(DBOARD_PROP_GAIN_GROUP, sd_name)].as<gain_group::sptr>(); - } - gain_group::sptr _tx_gain_group(size_t chan){ - std::string sd_name = this->get_tx_subdev_spec().at(chan).sd_name; - return _tx_dboard(chan)[named_prop_t(DBOARD_PROP_GAIN_GROUP, sd_name)].as<gain_group::sptr>(); - } -}; - -/*********************************************************************** - * The Make Function - **********************************************************************/ -single_usrp::sptr single_usrp::make(const device_addr_t &dev_addr){ - return sptr(new single_usrp_impl(dev_addr)); -} diff --git a/host/lib/usrp/subdev_spec.cpp b/host/lib/usrp/subdev_spec.cpp index 51c88bda3..d5d950f1f 100644 --- a/host/lib/usrp/subdev_spec.cpp +++ b/host/lib/usrp/subdev_spec.cpp @@ -46,7 +46,7 @@ bool usrp::operator==(const subdev_spec_pair_t &lhs, const subdev_spec_pair_t &r subdev_spec_t::subdev_spec_t(const std::string &markup){ BOOST_FOREACH(const std::string &pair, pair_tokenizer(markup)){ - if (pair == "") continue; + if (pair.empty()) continue; std::vector<std::string> db_sd; boost::split(db_sd, pair, boost::is_any_of(":")); switch(db_sd.size()){ case 1: this->push_back(subdev_spec_pair_t("", db_sd.front())); break; diff --git a/host/lib/usrp/usrp1/clock_ctrl.cpp b/host/lib/usrp/usrp1/clock_ctrl.cpp index 68c5f5320..156f2b0c4 100644 --- a/host/lib/usrp/usrp1/clock_ctrl.cpp +++ b/host/lib/usrp/usrp1/clock_ctrl.cpp @@ -29,32 +29,33 @@ using namespace uhd; /*********************************************************************** * Constants **********************************************************************/ -static const double master_clock_rate = 64e6; +static const double default_master_clock_rate = 64e6; /*********************************************************************** * Clock Control Implementation **********************************************************************/ class usrp1_clock_ctrl_impl : public usrp1_clock_ctrl { public: - usrp1_clock_ctrl_impl(usrp1_iface::sptr iface) - { - _iface = iface; + usrp1_clock_ctrl_impl(usrp1_iface::sptr iface): _iface(iface){ + this->set_master_clock_freq(default_master_clock_rate); } - double get_master_clock_freq(void) - { - return master_clock_rate; + void set_master_clock_freq(double freq){ + _freq = freq; + } + + double get_master_clock_freq(void){ + return _freq; } private: usrp1_iface::sptr _iface; - + double _freq; }; /*********************************************************************** * Clock Control Make **********************************************************************/ -usrp1_clock_ctrl::sptr usrp1_clock_ctrl::make(usrp1_iface::sptr iface) -{ +usrp1_clock_ctrl::sptr usrp1_clock_ctrl::make(usrp1_iface::sptr iface){ return sptr(new usrp1_clock_ctrl_impl(iface)); } diff --git a/host/lib/usrp/usrp1/clock_ctrl.hpp b/host/lib/usrp/usrp1/clock_ctrl.hpp index 366869dab..645472f02 100644 --- a/host/lib/usrp/usrp1/clock_ctrl.hpp +++ b/host/lib/usrp/usrp1/clock_ctrl.hpp @@ -40,6 +40,13 @@ public: static sptr make(usrp1_iface::sptr iface); /*! + * Set the rate of the fpga clock line. + * Note: does not really set, its all software. + * \param freq the new clock rate in Hz + */ + virtual void set_master_clock_freq(double freq) = 0; + + /*! * Get the rate of the fpga clock line. * \return the fpga clock rate in Hz */ diff --git a/host/lib/usrp/usrp1/mboard_impl.cpp b/host/lib/usrp/usrp1/mboard_impl.cpp index 23c8f03c4..6d5bf466d 100644 --- a/host/lib/usrp/usrp1/mboard_impl.cpp +++ b/host/lib/usrp/usrp1/mboard_impl.cpp @@ -317,6 +317,10 @@ void usrp1_impl::mboard_get(const wax::obj &key_, wax::obj &val) val = _soft_time_ctrl->get_time(); return; + case MBOARD_PROP_CLOCK_RATE: + val = _clock_ctrl->get_master_clock_freq(); + return; + default: UHD_THROW_PROP_GET_ERROR(); } } @@ -379,6 +383,10 @@ void usrp1_impl::mboard_set(const wax::obj &key, const wax::obj &val) _soft_time_ctrl->set_time(val.as<time_spec_t>()); return; + case MBOARD_PROP_CLOCK_RATE: + _clock_ctrl->set_master_clock_freq(val.as<double>()); + return; + default: UHD_THROW_PROP_SET_ERROR(); } } diff --git a/host/lib/usrp/usrp1/soft_time_ctrl.cpp b/host/lib/usrp/usrp1/soft_time_ctrl.cpp index 856faf89d..c91ecc7ed 100644 --- a/host/lib/usrp/usrp1/soft_time_ctrl.cpp +++ b/host/lib/usrp/usrp1/soft_time_ctrl.cpp @@ -69,6 +69,9 @@ public: _thread_group.create_thread(boost::bind(&soft_time_ctrl_impl::recv_cmd_dispatcher, this)); _update_mutex.lock(); //lock blocks until spawned _update_mutex.unlock(); //unlock mutex before done + + //initialize the time to something + this->set_time(time_spec_t(0.0)); } ~soft_time_ctrl_impl(void){ diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index 95f7013e7..784f662d9 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -66,9 +66,9 @@ usrp2_mboard_impl::usrp2_mboard_impl( //contruct the interfaces to mboard perifs _clock_ctrl = usrp2_clock_ctrl::make(_iface); _codec_ctrl = usrp2_codec_ctrl::make(_iface); - //_gps_ctrl = gps_ctrl::make( - // _iface->get_gps_write_fn(), - // _iface->get_gps_read_fn()); +// _gps_ctrl = gps_ctrl::make( +// _iface->get_gps_write_fn(), +// _iface->get_gps_read_fn()); //if(_gps_ctrl->gps_detected()) std::cout << "GPS time: " << _gps_ctrl->get_time() << std::endl; @@ -243,6 +243,9 @@ void usrp2_mboard_impl::update_clock_config(void){ } void usrp2_mboard_impl::set_time_spec(const time_spec_t &time_spec, bool now){ + //dont set the time for slave devices, they always take from mimo cable + if (not _mimo_clocking_mode_is_master) return; + //set the ticks _iface->poke32(_iface->regs.time64_ticks, time_spec.get_tick_count(get_master_clock_freq())); @@ -352,6 +355,10 @@ void usrp2_mboard_impl::get(const wax::obj &key_, wax::obj &val){ val = _iface->mb_eeprom; return; + case MBOARD_PROP_CLOCK_RATE: + val = this->get_master_clock_freq(); + return; + default: UHD_THROW_PROP_GET_ERROR(); } } @@ -409,6 +416,10 @@ void usrp2_mboard_impl::set(const wax::obj &key, const wax::obj &val){ _iface->mb_eeprom = mboard_eeprom_t(*_iface, mboard_eeprom_t::MAP_N100); return; + case MBOARD_PROP_CLOCK_RATE: + UHD_ASSERT_THROW(val.as<double>() == this->get_master_clock_freq()); + return; + default: UHD_THROW_PROP_SET_ERROR(); } } diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index 059ddf65f..9ce0f7359 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -202,8 +202,11 @@ static device::sptr usrp2_make(const device_addr_t &device_addr){ //setup the dsp transport hints (default to a large recv buff) device_addr_t dsp_xport_hints = device_addr; if (not dsp_xport_hints.has_key("recv_buff_size")){ - //set to half-a-second of buffering at max rate - dsp_xport_hints["recv_buff_size"] = "50e6"; + //only enable on platforms that are happy with the large buffer resize + #if defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32) + //set to half-a-second of buffering at max rate + dsp_xport_hints["recv_buff_size"] = "50e6"; + #endif /*defined(UHD_PLATFORM_LINUX) || defined(UHD_PLATFORM_WIN32)*/ } //create a ctrl and data transport for each address diff --git a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp index 864e82099..df8e5dc9f 100644 --- a/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp +++ b/host/lib/usrp/usrp_e100/usrp_e100_impl.hpp @@ -30,7 +30,7 @@ #ifndef INCLUDED_USRP_E100_IMPL_HPP #define INCLUDED_USRP_E100_IMPL_HPP -static const boost::uint16_t USRP_E_COMPAT_NUM = 0x03; +static const boost::uint16_t USRP_E_COMPAT_NUM = 0x02; //make this 3 then the mainline fpga image gets fixed for embedded //! load an fpga image from a bin file into the usrp-e fpga extern void usrp_e100_load_fpga(const std::string &bin_file); diff --git a/host/lib/utils/paths.cpp b/host/lib/utils/paths.cpp index 93d15d290..8d604d849 100644 --- a/host/lib/utils/paths.cpp +++ b/host/lib/utils/paths.cpp @@ -64,6 +64,7 @@ static std::vector<fs::path> get_env_paths(const std::string &var_name){ //convert to filesystem path, filter blank paths std::vector<fs::path> paths; + if (var_value.empty()) return paths; //FIXME boost tokenizer throws w/ blank strings on some platforms BOOST_FOREACH(const std::string &path_string, path_tokenizer(var_value)){ if (path_string.empty()) continue; paths.push_back(fs::system_complete(path_string)); |