diff options
-rw-r--r-- | CHANGELOG | 23 | ||||
-rw-r--r-- | README.md | 6 | ||||
-rw-r--r-- | host/CMakeLists.txt | 6 | ||||
-rw-r--r-- | host/cmake/Modules/UHDPackage.cmake | 4 | ||||
-rw-r--r-- | host/docs/gpsdo.rst | 3 | ||||
-rw-r--r-- | host/docs/gpsdo_b2x0.rst | 3 | ||||
-rw-r--r-- | host/docs/usrp_b200.rst | 4 | ||||
-rw-r--r-- | host/examples/test_timed_commands.cpp | 50 | ||||
-rw-r--r-- | host/include/uhd/usrp/gps_ctrl.hpp | 2 | ||||
-rw-r--r-- | host/lib/usrp/b200/b200_impl.cpp | 2 | ||||
-rw-r--r-- | host/lib/usrp/gps_ctrl.cpp | 40 |
11 files changed, 97 insertions, 46 deletions
@@ -1,6 +1,29 @@ Change Log for Releases ============================== +## 003.006.002 +* Fixed bug in timed commands example. +* Improved compatibility for older versions of Boost. +* Fixed segmentation fault issue in converter code. +* Fixed binary-stripping for ARM builds. +* B2xx: Further improvements to code and images. +* Documentation links now installed to Start Menu in Windows. +* B2xx: More robust error checking in host code. +* B2xx: Improved error reporting. +* B2xx: Increase FPGA loading speed on USB 3 +* B2xx: Re-programming FPGA without cycle now supported. +* B2xx: Larger RX SPP ceiling to support 16K transfers with larger RX FIFO in new FPGA image +* Updated internal READMEs and documentation. +* N-Series: netburner now accepts relative paths with '~' +* Completely re-written UHD Images Downloader, with numerous bug fixes and new features. + +## 003.006.001 +* B2xx: Fixed critical bug in 003.006.000 regarding USRP B2xx operation + +## 003.006.000 +* Many small fixes for bugs revealed by static analysis. +* Introduced support for the USRP B200 / B210 + ## 003.005.003 * E110: @@ -35,8 +35,8 @@ UHD is primarily developed on Linux, but we also test and support the following operating systems. * Linux (any distribution) -* Mac OSX (PPC and Intel) -* Windows 7/Vista/XP/2000 +* Mac OS X (PPC and Intel) +* Windows 7/Vista/XP ## Applications @@ -44,7 +44,7 @@ UHD can be used to build stand-alone applications with USRP™ hardware, or with third-party applications. Some common toolkits / frameworks are: * [GNURadio](http://code.ettus.com/redmine/ettus/projects/uhd/wiki/GNU_Radio_UHD) -* [LabVIEW](http://joule.ni.com/nidu/cds/view/p/id/2679/lang/en) +* [LabVIEW](http://www.ni.com/download/ni-usrp-1.2/3696/en/) * [Simulink](http://www.mathworks.com/discovery/sdr/usrp.html) * [OpenBTS](http://wush.net/trac/rangepublic/wiki/BuildInstallRun) * [Iris](http://www.softwareradiosystems.com/redmine/projects/iris/wiki) diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt index 0c7a59fed..ded4bb54c 100644 --- a/host/CMakeLists.txt +++ b/host/CMakeLists.txt @@ -1,5 +1,5 @@ # -# Copyright 2010-2013 Ettus Research LLC +# Copyright 2010-2014 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 @@ -213,8 +213,8 @@ UHD_INSTALL(FILES # Images download directory for utils/uhd_images_downloader.py ######################################################################## -SET(UHD_IMAGES_MD5SUM "61db1170aaaadd787f5150b3eceab6f2") -SET(UHD_IMAGES_DOWNLOAD_SRC "http://files.ettus.com/binaries/maint_images/archive/uhd-images_003.006.002-rc1.zip") +SET(UHD_IMAGES_MD5SUM "0bab468817baa28024c4bf966d923b31") +SET(UHD_IMAGES_DOWNLOAD_SRC "http://files.ettus.com/binaries/maint_images/archive/uhd-images_003.006.002-release.zip") ######################################################################## # Register top level components diff --git a/host/cmake/Modules/UHDPackage.cmake b/host/cmake/Modules/UHDPackage.cmake index 4968571b5..44a8f3622 100644 --- a/host/cmake/Modules/UHDPackage.cmake +++ b/host/cmake/Modules/UHDPackage.cmake @@ -149,7 +149,7 @@ SET(CPACK_COMPONENTS_ALL libraries headers utilities examples manual doxygen rea ######################################################################## # Setup CPack Debian ######################################################################## -SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libusb-1.0-0, libboost-all-dev") +SET(CPACK_DEBIAN_PACKAGE_DEPENDS "libboost-all-dev") SET(CPACK_DEBIAN_PACKAGE_RECOMMENDS "python, python-tk") FOREACH(filename preinst postinst prerm postrm) LIST(APPEND CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA ${CMAKE_BINARY_DIR}/debian/${filename}) @@ -167,7 +167,7 @@ CONFIGURE_FILE( ######################################################################## # Setup CPack RPM ######################################################################## -SET(CPACK_RPM_PACKAGE_REQUIRES "boost-devel, libusb1") +SET(CPACK_RPM_PACKAGE_REQUIRES "boost-devel") FOREACH(filename post_install post_uninstall pre_install pre_uninstall) STRING(TOUPPER ${filename} filename_upper) diff --git a/host/docs/gpsdo.rst b/host/docs/gpsdo.rst index 1cf1dae29..3b718fc20 100644 --- a/host/docs/gpsdo.rst +++ b/host/docs/gpsdo.rst @@ -5,8 +5,7 @@ UHD - Internal GPSDO Application Notes (USRP-N2x0/E1X0 Models) .. contents:: Table of Contents This application note describes the use of integrated GPS-disciplined -oscillators with Ettus Research USRP devices. It pertains specifically -to the Jackson Labs Firefly-1A device unless noted otherwise. +oscillators with Ettus Research USRP devices. ------------------------------------------------------------------------ Specifications diff --git a/host/docs/gpsdo_b2x0.rst b/host/docs/gpsdo_b2x0.rst index bca10e99a..8bc363e97 100644 --- a/host/docs/gpsdo_b2x0.rst +++ b/host/docs/gpsdo_b2x0.rst @@ -5,8 +5,7 @@ UHD - Internal GPSDO Application Notes (USRP-B2X0 Models) .. contents:: Table of Contents This application note describes the use of integrated GPS-disciplined -oscillators with Ettus Research USRP devices. It pertains specifically -to the Jackson Labs LC_XO device unless noted otherwise. +oscillators with Ettus Research USRP devices. ------------------------------------------------------------------------ Specifications diff --git a/host/docs/usrp_b200.rst b/host/docs/usrp_b200.rst index bb2a2876a..81e66684e 100644 --- a/host/docs/usrp_b200.rst +++ b/host/docs/usrp_b200.rst @@ -8,7 +8,7 @@ UHD - USRP-B2X0 Series Application Notes Comparative features list - B200 ------------------------------------------------------------------------ -* integrated RF frontend +* integrated RF frontend (RF coverage from 70 MHz - 6 GHz) * 1 RX DDC chain in FPGA * 1 TX DUC chain in FPGA * Timed commands in FPGA @@ -22,7 +22,7 @@ Comparative features list - B200 Comparative features list - B210 ------------------------------------------------------------------------ -* integrated MIMO frontend +* integrated MIMO frontend (RF coverage from 70 MHz - 6 GHz) * 2 RX DDC chains in FPGA * 2 TX DUC chains in FPGA * Timed commands in FPGA diff --git a/host/examples/test_timed_commands.cpp b/host/examples/test_timed_commands.cpp index 224961d04..8c6011c68 100644 --- a/host/examples/test_timed_commands.cpp +++ b/host/examples/test_timed_commands.cpp @@ -78,27 +78,57 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ total_time += (t1-t0); } std::cout << boost::format( - "Difference between paired reads: %f us" + " Difference between paired reads: %f us" ) % (total_time.get_real_secs()/100*1e6) << std::endl; + //test timed control command + //issues get_time_now() command twice a fixed time apart + //outputs difference for each response time vs. the expected time + //and difference between actual and expected time deltas + std::cout << std::endl; + std::cout << "Testing control timed command:" << std::endl; + const uhd::time_spec_t span = uhd::time_spec_t(0.1); + const uhd::time_spec_t now = usrp->get_time_now(); + const uhd::time_spec_t cmd_time1 = now + uhd::time_spec_t(0.1); + const uhd::time_spec_t cmd_time2 = cmd_time1 + span; + usrp->set_command_time(cmd_time1); + uhd::time_spec_t response_time1 = usrp->get_time_now(); + usrp->set_command_time(cmd_time2); + uhd::time_spec_t response_time2 = usrp->get_time_now(); + usrp->clear_command_time(); + std::cout << boost::format( + " Span : %f us\n" + " Now : %f us\n" + " Response 1: %f us\n" + " Response 2: %f us" + ) % (span.get_real_secs()*1e6) % (now.get_real_secs()*1e6) % (response_time1.get_real_secs()*1e6) % (response_time2.get_real_secs()*1e6) << std::endl; + std::cout << boost::format( + " Difference of response time 1: %f us" + ) % ((response_time1 - cmd_time1).get_real_secs()*1e6) << std::endl; + std::cout << boost::format( + " Difference of response time 2: %f us" + ) % ((response_time2 - cmd_time2).get_real_secs()*1e6) << std::endl; + std::cout << boost::format( + " Difference between actual and expected time delta: %f us" + ) % ((response_time2 - response_time1 - span).get_real_secs()*1e6) << std::endl; + //use a timed command to start a stream at a specific time //this is not the right way start streaming at time x, //but it should approximate it within control RTT/2 //setup streaming std::cout << std::endl; std::cout << "About to start streaming using timed command:" << std::endl; - + //create a receive streamer uhd::stream_args_t stream_args("fc32"); //complex floats uhd::rx_streamer::sptr rx_stream = usrp->get_rx_stream(stream_args); - + uhd::stream_cmd_t stream_cmd(uhd::stream_cmd_t::STREAM_MODE_NUM_SAMPS_AND_DONE); stream_cmd.num_samps = 100; - stream_cmd.stream_now = true; + stream_cmd.stream_now = false; const uhd::time_spec_t stream_time = usrp->get_time_now() + uhd::time_spec_t(0.1); - usrp->set_command_time(stream_time); + stream_cmd.time_spec = stream_time; rx_stream->issue_stream_cmd(stream_cmd); - usrp->clear_command_time(); //meta-data will be filled in by recv() uhd::rx_metadata_t md; @@ -113,14 +143,14 @@ int UHD_SAFE_MAIN(int argc, char *argv[]){ ) % md.error_code)); } std::cout << boost::format( - "Received packet: %u samples, %u full secs, %f frac secs" + " Received packet: %u samples, %u full secs, %f frac secs" ) % num_rx_samps % md.time_spec.get_full_secs() % md.time_spec.get_frac_secs() << std::endl; std::cout << boost::format( - "Stream time was: %u full secs, %f frac secs" + " Stream time was: %u full secs, %f frac secs" ) % stream_time.get_full_secs() % stream_time.get_frac_secs() << std::endl; std::cout << boost::format( - "Difference between stream time and first packet: %f us" - ) % ((md.time_spec-stream_time).get_real_secs()/100*1e6) << std::endl; + " Difference between stream time and first packet: %f us" + ) % ((md.time_spec-stream_time).get_real_secs()*1e6) << std::endl; //finished std::cout << std::endl << "Done!" << std::endl << std::endl; diff --git a/host/include/uhd/usrp/gps_ctrl.hpp b/host/include/uhd/usrp/gps_ctrl.hpp index 0c1389d48..abe5c37ba 100644 --- a/host/include/uhd/usrp/gps_ctrl.hpp +++ b/host/include/uhd/usrp/gps_ctrl.hpp @@ -32,7 +32,7 @@ public: typedef boost::shared_ptr<gps_ctrl> sptr; /*! - * Make a GPS config for Jackson Labs or generic NMEA GPS devices + * Make a GPS config for NMEA GPS devices */ static sptr make(uart_iface::sptr uart); diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp index 132b1198d..ab437af6b 100644 --- a/host/lib/usrp/b200/b200_impl.cpp +++ b/host/lib/usrp/b200/b200_impl.cpp @@ -501,6 +501,8 @@ void b200_impl::setup_radio(const size_t dspno) _async_task_data->radio_ctrl[dspno] = perif.ctrl; //weak _tree->access<time_spec_t>(mb_path / "time" / "cmd") .subscribe(boost::bind(&radio_ctrl_core_3000::set_time, perif.ctrl, _1)); + _tree->access<double>(mb_path / "tick_rate") + .subscribe(boost::bind(&radio_ctrl_core_3000::set_tick_rate, perif.ctrl, _1)); this->register_loopback_self_test(perif.ctrl); perif.atr = gpio_core_200_32wo::make(perif.ctrl, TOREG(SR_ATR)); diff --git a/host/lib/usrp/gps_ctrl.cpp b/host/lib/usrp/gps_ctrl.cpp index 105a52b30..98bc90a3f 100644 --- a/host/lib/usrp/gps_ctrl.cpp +++ b/host/lib/usrp/gps_ctrl.cpp @@ -38,7 +38,7 @@ using namespace boost::algorithm; using namespace boost::this_thread; /*! - * A GPS control for Jackson Labs devices (and other NMEA compatible GPS's) + * A GPS control for NMEA compatible GPSes */ class gps_ctrl_impl : public gps_ctrl{ @@ -63,7 +63,7 @@ private: } std::string update_cached_sensors(const std::string sensor) { - if(not gps_detected() || (gps_type != GPS_TYPE_JACKSON_LABS)) { + if(not gps_detected() || (gps_type != GPS_TYPE_ER_GPSDO)) { UHD_MSG(error) << "get_stat(): unsupported GPS or no GPS detected"; return std::string(); } @@ -105,19 +105,18 @@ public: bool i_heard_some_nmea = false, i_heard_something_weird = false; gps_type = GPS_TYPE_NONE; - //first we look for a Jackson Labs Firefly (since that's what we provide...) _flush(); //get whatever junk is in the rx buffer right now, and throw it away - _send("HAAAY GUYYYYS\n"); //to elicit a response from the Firefly + _send("HAAAY GUYYYYS\n"); //to elicit a response from the GPSDO //wait for _send(...) to return - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); //then we loop until we either timeout, or until we get a response that indicates we're a JL device const boost::system_time comm_timeout = boost::get_system_time() + milliseconds(GPS_COMM_TIMEOUT_MS); while(boost::get_system_time() < comm_timeout) { reply = _recv(); if(reply.find("Command Error") != std::string::npos) { - gps_type = GPS_TYPE_JACKSON_LABS; + gps_type = GPS_TYPE_ER_GPSDO; break; } else if(reply.substr(0, 3) == "$GP") i_heard_some_nmea = true; //but keep looking for that "Command Error" response @@ -125,16 +124,16 @@ public: sleep(milliseconds(GPS_TIMEOUT_DELAY_MS)); } - if((i_heard_some_nmea) && (gps_type != GPS_TYPE_JACKSON_LABS)) gps_type = GPS_TYPE_GENERIC_NMEA; + if((i_heard_some_nmea) && (gps_type != GPS_TYPE_ER_GPSDO)) gps_type = GPS_TYPE_GENERIC_NMEA; if((gps_type == GPS_TYPE_NONE) && i_heard_something_weird) { UHD_MSG(error) << "GPS invalid reply \"" << reply << "\", assuming none available" << std::endl; } switch(gps_type) { - case GPS_TYPE_JACKSON_LABS: - UHD_MSG(status) << "Found a Jackson Labs GPS" << std::endl; - init_firefly(); + case GPS_TYPE_ER_GPSDO: + UHD_MSG(status) << "Found an Ettus Research NMEA-capable GPSDO" << std::endl; + init_gpsdo(); break; case GPS_TYPE_GENERIC_NMEA: @@ -186,23 +185,23 @@ public: } private: - void init_firefly(void) { + void init_gpsdo(void) { //issue some setup stuff so it spits out the appropriate data //none of these should issue replies so we don't bother looking for them //we have to sleep between commands because the JL device, despite not acking, takes considerable time to process each command. - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); _send("SYST:COMM:SER:ECHO OFF\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); _send("SYST:COMM:SER:PRO OFF\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); _send("GPS:GPGGA 1\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); _send("GPS:GGAST 0\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); _send("GPS:GPRMC 1\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); _send("SERV:TRAC 0\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); } //retrieve a raw NMEA sentence @@ -305,7 +304,7 @@ private: //enable servo reporting _send("SERV:TRAC 1\n"); - sleep(milliseconds(FIREFLY_STUPID_DELAY_MS)); + sleep(milliseconds(200)); std::string reply; @@ -340,7 +339,7 @@ private: } enum { - GPS_TYPE_JACKSON_LABS, + GPS_TYPE_ER_GPSDO, GPS_TYPE_GENERIC_NMEA, GPS_TYPE_NONE } gps_type; @@ -352,7 +351,6 @@ private: static const int GPS_SERVO_FRESHNESS = 2500; static const int GPS_LOCK_FRESHNESS = 2500; static const int GPS_TIMEOUT_DELAY_MS = 200; - static const int FIREFLY_STUPID_DELAY_MS = 200; }; /*********************************************************************** |