aboutsummaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorAshish Chaudhari <ashish@ettus.com>2015-07-07 17:01:10 -0700
committerAshish Chaudhari <ashish@ettus.com>2015-07-07 17:01:10 -0700
commit273fb752fb14e0ebf3b04e0729f6545a54baf2c6 (patch)
tree55a5bbb92a6be36d27cf6e9d5755dbacd2b5e114 /host
parenta44f791a44fc248f82da070cd6ea2405cf4532f6 (diff)
parent984575c9f1ca18c3d97ba730e20bdbe7b7614c1e (diff)
downloaduhd-273fb752fb14e0ebf3b04e0729f6545a54baf2c6.tar.gz
uhd-273fb752fb14e0ebf3b04e0729f6545a54baf2c6.tar.bz2
uhd-273fb752fb14e0ebf3b04e0729f6545a54baf2c6.zip
Merge branch 'master' into x300/rev7_support
Diffstat (limited to 'host')
-rw-r--r--host/CMakeLists.txt3
-rw-r--r--host/cmake/Modules/FindORC.cmake36
-rw-r--r--host/cmake/Toolchains/oe-sdk_cross.cmake2
-rw-r--r--host/docs/usrp_x3x0.dox2
-rw-r--r--host/docs/usrp_x3x0_config.dox34
-rw-r--r--host/lib/convert/CMakeLists.txt34
-rw-r--r--host/lib/convert/convert_common.hpp5
-rw-r--r--host/lib/convert/convert_orc.orc79
-rw-r--r--host/lib/convert/convert_with_orc.cpp65
-rw-r--r--host/lib/uhd.rc.in2
-rw-r--r--host/lib/usrp/b200/b200_impl.cpp33
-rw-r--r--host/lib/usrp/b200/b200_impl.hpp3
-rw-r--r--host/lib/usrp/b200/b200_io_impl.cpp22
-rw-r--r--host/lib/usrp/common/ad9361_driver/ad9361_device.h15
14 files changed, 47 insertions, 288 deletions
diff --git a/host/CMakeLists.txt b/host/CMakeLists.txt
index b0a00db40..31ca0172c 100644
--- a/host/CMakeLists.txt
+++ b/host/CMakeLists.txt
@@ -385,9 +385,6 @@ ENDFOREACH(Boost_Comp)
IF(ENABLE_USB)
LIST(APPEND UHD_LINK_LIST_STATIC "usb-1.0")
ENDIF(ENABLE_USB)
-IF(ENABLE_ORC)
- LIST(APPEND UHD_LINK_LIST_STATIC "orc-0.4")
-ENDIF(ENABLE_ORC)
CONFIGURE_FILE(
${CMAKE_SOURCE_DIR}/cmake/Modules/UHDConfigVersion.cmake.in
diff --git a/host/cmake/Modules/FindORC.cmake b/host/cmake/Modules/FindORC.cmake
deleted file mode 100644
index e13eae235..000000000
--- a/host/cmake/Modules/FindORC.cmake
+++ /dev/null
@@ -1,36 +0,0 @@
-########################################################################
-# Find the library for ORC development files
-########################################################################
-
-INCLUDE(FindPkgConfig)
-PKG_CHECK_MODULES(PC_ORC "orc-0.4")
-PKG_CHECK_MODULES(PC_ORC_V4_11 "orc-0.4 > 0.4.11")
-
-#we are using the pkg config as a version check
-#if we have pkg config, the right version must be found
-#the alternative is that no pkg config orc is found
-if (PC_ORC_V4_11_FOUND OR NOT PC_ORC_FOUND)
-
-FIND_PATH(
- ORC_INCLUDE_DIRS
- NAMES orc/orc.h
- HINTS $ENV{ORC_DIR}/include/orc-0.4
- ${PC_ORC_INCLUDEDIR}
- PATHS /usr/local/include/orc-0.4
- /usr/include/orc-0.4
-)
-
-FIND_LIBRARY(
- ORC_LIBRARIES
- NAMES orc-0.4
- HINTS $ENV{ORC_DIR}/lib
- ${PC_ORC_LIBDIR}
- PATHS /usr/local/lib
- /usr/lib
-)
-
-endif() #both PC ORC FOUND
-
-INCLUDE(FindPackageHandleStandardArgs)
-FIND_PACKAGE_HANDLE_STANDARD_ARGS(ORC DEFAULT_MSG ORC_LIBRARIES ORC_INCLUDE_DIRS)
-MARK_AS_ADVANCED(ORC_LIBRARIES ORC_INCLUDE_DIRS)
diff --git a/host/cmake/Toolchains/oe-sdk_cross.cmake b/host/cmake/Toolchains/oe-sdk_cross.cmake
index ea77815c9..f8ef0157c 100644
--- a/host/cmake/Toolchains/oe-sdk_cross.cmake
+++ b/host/cmake/Toolchains/oe-sdk_cross.cmake
@@ -9,5 +9,3 @@ set( CMAKE_FIND_ROOT_PATH $ENV{OECORE_NATIVE_SYSROOT} $ENV{OECORE_TARGET_SYSROOT
set( CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER )
set( CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY )
set( CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY )
-set ( ORC_INCLUDE_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/include/orc-0.4 )
-set ( ORC_LIBRARY_DIRS $ENV{OECORE_TARGET_SYSROOT}/usr/lib )
diff --git a/host/docs/usrp_x3x0.dox b/host/docs/usrp_x3x0.dox
index a9b31df57..98e21a4d0 100644
--- a/host/docs/usrp_x3x0.dox
+++ b/host/docs/usrp_x3x0.dox
@@ -1,4 +1,4 @@
-/*! \page page_usrp_x3x0 X3x0 Series
+/*! \page page_usrp_x3x0 USRP X3x0 Series
\tableofcontents
diff --git a/host/docs/usrp_x3x0_config.dox b/host/docs/usrp_x3x0_config.dox
index 2ee449cc2..ed80c31de 100644
--- a/host/docs/usrp_x3x0_config.dox
+++ b/host/docs/usrp_x3x0_config.dox
@@ -320,38 +320,12 @@ Real-time scheduling is enabled via different methods depending on your
application and operating system. In GNU Radio Companion, it can be
turned on in each individual flowgraph.
-\subsection x3x0cfg_hostpc_volk Building with ORC & Volk
+\subsection x3x0cfg_hostpc_volk SIMD Acceleration
Especially when running high-performance applications, processing
-performance can be dramatically improved by SIMD instructions. UHD uses
-ORC to provide SIMD capability, and GNU Radio includes a SIMD library
-called "Volk". These should both be used to guarantee optimum
-performance.
-
-\subsubsection x3x0cfg_hostpc_volk_orc Compiling UHD with ORC
-
-ORC, the <a href="http://code.entropywave.com/orc/">Oil Runtime Compiler</a>,
-is a third-party compiler that UHD uses to create efficient SIMD code for
-your particular computer. ORC is generally easily installed from your
-OS's package manager.
-
-On Fedora:
-
- $ sudo yum update; sudo yum install orc-compiler orc-devel
-
-On Ubuntu:
-
- $ sudo apt-get update; sudo apt-get install liborc-<version> liborc-<version>-dev
-
-After installing ORC, when building UHD from source, you should see
-"ORC" as one of the configured UHD components.
-
- -- ######################################################
- -- # UHD enabled components
- -- ######################################################
- -- * LibUHD
- <cut for brevity>
- -- * ORC
+performance can be dramatically improved by SIMD instructions.
+GNU Radio includes a SIMD library
+called "Volk", which should be used to guarantee optimum performance.
\subsubsection x3x0cfg_hostpc_volk_volk Compiling GNURadio with Volk
diff --git a/host/lib/convert/CMakeLists.txt b/host/lib/convert/CMakeLists.txt
index 5204c29ea..024c2260b 100644
--- a/host/lib/convert/CMakeLists.txt
+++ b/host/lib/convert/CMakeLists.txt
@@ -22,40 +22,6 @@ INCLUDE(CheckIncludeFileCXX)
MESSAGE(STATUS "")
########################################################################
-# Look for Orc support
-########################################################################
-FIND_PACKAGE(ORC)
-
-IF(NOT ORCC_EXECUTABLE)
- FIND_PROGRAM(ORCC_EXECUTABLE orcc)
-ENDIF()
-
-LIBUHD_REGISTER_COMPONENT("ORC" ENABLE_ORC ON "ENABLE_LIBUHD;ORC_FOUND;ORCC_EXECUTABLE" OFF)
-
-IF(ENABLE_ORC)
- INCLUDE_DIRECTORIES(${ORC_INCLUDE_DIRS})
- LINK_DIRECTORIES(${ORC_LIBRARY_DIRS})
- ENABLE_LANGUAGE(C)
-
- SET(orcc_src ${CMAKE_CURRENT_SOURCE_DIR}/convert_orc.orc)
-
- GET_FILENAME_COMPONENT(orc_file_name_we ${orcc_src} NAME_WE)
- SET(orcc_gen ${CMAKE_CURRENT_BINARY_DIR}/${orc_file_name_we}.c)
- MESSAGE(STATUS "Orc found, enabling Orc support.")
- ADD_CUSTOM_COMMAND(
- COMMAND ${ORCC_EXECUTABLE} --implementation -o ${orcc_gen} ${orcc_src}
- DEPENDS ${orcc_src} OUTPUT ${orcc_gen}
- )
- LIBUHD_APPEND_SOURCES(${orcc_gen})
- LIBUHD_APPEND_SOURCES(
- ${CMAKE_CURRENT_SOURCE_DIR}/convert_with_orc.cpp
- )
- LIBUHD_APPEND_LIBS(${ORC_LIBRARIES})
-ELSE(ENABLE_ORC)
- MESSAGE(STATUS "Orc not found, disabling orc support.")
-ENDIF(ENABLE_ORC)
-
-########################################################################
# Check for SSE2 SIMD headers
########################################################################
IF(CMAKE_COMPILER_IS_GNUCXX)
diff --git a/host/lib/convert/convert_common.hpp b/host/lib/convert/convert_common.hpp
index 6c2ea9fec..65fdcbea2 100644
--- a/host/lib/convert/convert_common.hpp
+++ b/host/lib/convert/convert_common.hpp
@@ -65,11 +65,10 @@ static const int PRIORITY_GENERAL = 0;
static const int PRIORITY_EMPTY = -1;
#ifdef __ARM_NEON__
-static const int PRIORITY_LIBORC = 3;
-static const int PRIORITY_SIMD = 2; //neon conversions could be implemented better, orc wins
+static const int PRIORITY_SIMD = 2;
static const int PRIORITY_TABLE = 1; //tables require large cache, so they are slower on arm
#else
-static const int PRIORITY_LIBORC = 2;
+// We used to have ORC, too, so SIMD is 3
static const int PRIORITY_SIMD = 3;
static const int PRIORITY_TABLE = 1;
#endif
diff --git a/host/lib/convert/convert_orc.orc b/host/lib/convert/convert_orc.orc
deleted file mode 100644
index ffb298f26..000000000
--- a/host/lib/convert/convert_orc.orc
+++ /dev/null
@@ -1,79 +0,0 @@
-.function _convert_fc32_1_to_item32_1_nswap_orc
-.source 8 src
-.dest 4 dst
-.floatparam 4 scalar
-.temp 8 scaled
-.temp 8 converted
-.temp 4 short
-x2 mulf scaled, src, scalar
-x2 convfl converted, scaled
-x2 convlw short, converted
-swapl short, short
-x2 swapw dst, short
-
-.function _convert_fc32_1_to_item32_1_bswap_orc
-.source 8 src
-.dest 4 dst
-.floatparam 4 scalar
-.temp 8 scaled
-.temp 8 converted
-.temp 4 short
-x2 mulf scaled, src, scalar
-x2 convfl converted, scaled
-x2 convlw short, converted
-x2 swapw dst, short
-
-.function _convert_item32_1_to_fc32_1_nswap_orc
-.source 4 src
-.dest 8 dst
-.floatparam 4 scalar
-.temp 4 tmp1
-.temp 8 tmp2
-x2 swapw tmp1, src
-swapl tmp1, tmp1
-x2 convswl tmp2, tmp1
-x2 convlf tmp2, tmp2
-x2 mulf dst, tmp2, scalar
-
-.function _convert_item32_1_to_fc32_1_bswap_orc
-.source 4 src
-.dest 8 dst
-.floatparam 4 scalar
-.temp 4 tmp1
-.temp 8 tmp2
-x2 swapw tmp1, src
-x2 convswl tmp2, tmp1
-x2 convlf tmp2, tmp2
-x2 mulf dst, tmp2, scalar
-
-.function _convert_sc16_1_to_item32_1_nswap_orc
-.source 4 src
-.dest 4 dst
-.temp 4 tmp
-.floatparam 4 scalar
-swapl tmp, src
-x2 swapw dst, tmp
-
-.function _convert_item32_1_to_sc16_1_nswap_orc
-.source 4 src
-.dest 4 dst
-.floatparam 4 scalar
-.temp 4 tmp
-x2 swapw tmp, src
-swapl dst, tmp
-
-.function _convert_swap_byte_pairs_orc
-.source 4 src
-.dest 4 dst
-swapl dst, src
-
-.function _convert_fc32_1_to_sc8_1_nswap_orc
-.source 8 src
-.dest 2 dst
-.temp 8 tmp
-.temp 4 tmp2
-.floatparam 4 scalar
-x2 mulf tmp, src, scalar
-x2 convfl tmp, tmp
-x2 convlw tmp2, tmp
-x2 convwb dst, tmp2
diff --git a/host/lib/convert/convert_with_orc.cpp b/host/lib/convert/convert_with_orc.cpp
deleted file mode 100644
index 19755fa44..000000000
--- a/host/lib/convert/convert_with_orc.cpp
+++ /dev/null
@@ -1,65 +0,0 @@
-//
-// Copyright 2011-2013 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 "convert_common.hpp"
-#include <uhd/utils/byteswap.hpp>
-
-using namespace uhd::convert;
-
-extern "C" {
-extern void _convert_fc32_1_to_item32_1_nswap_orc(void *, const void *, float, int);
-extern void _convert_fc32_1_to_item32_1_bswap_orc(void *, const void *, float, int);
-extern void _convert_item32_1_to_fc32_1_nswap_orc(void *, const void *, float, int);
-extern void _convert_item32_1_to_fc32_1_bswap_orc(void *, const void *, float, int);
-extern void _convert_sc16_1_to_item32_1_nswap_orc(void *, const void *, float, int);
-extern void _convert_item32_1_to_sc16_1_nswap_orc(void *, const void *, float, int);
-extern void _convert_fc32_1_to_sc8_1_nswap_orc(void *, const void *, float, int);
-extern void _convert_swap_byte_pairs_orc(void *, const void *, int);
-}
-
-DECLARE_CONVERTER(fc32, 1, sc16_item32_le, 1, PRIORITY_LIBORC){
- _convert_fc32_1_to_item32_1_nswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(fc32, 1, sc16_item32_be, 1, PRIORITY_LIBORC){
- _convert_fc32_1_to_item32_1_bswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(sc16_item32_le, 1, fc32, 1, PRIORITY_LIBORC){
- _convert_item32_1_to_fc32_1_nswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(sc16_item32_be, 1, fc32, 1, PRIORITY_LIBORC){
- _convert_item32_1_to_fc32_1_bswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(sc16, 1, sc16_item32_le, 1, PRIORITY_LIBORC){
- _convert_sc16_1_to_item32_1_nswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(sc16_item32_le, 1, sc16, 1, PRIORITY_LIBORC){
- _convert_item32_1_to_sc16_1_nswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(fc32, 1, sc8_item32_be, 1, PRIORITY_LIBORC){
- _convert_fc32_1_to_sc8_1_nswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
-}
-
-DECLARE_CONVERTER(fc32, 1, sc8_item32_le, 1, PRIORITY_LIBORC){
- _convert_fc32_1_to_sc8_1_nswap_orc(outputs[0], inputs[0], scale_factor, nsamps);
- _convert_swap_byte_pairs_orc(outputs[0], outputs[0], (nsamps + 1)/2);
-}
diff --git a/host/lib/uhd.rc.in b/host/lib/uhd.rc.in
index a0eb27b8c..051511327 100644
--- a/host/lib/uhd.rc.in
+++ b/host/lib/uhd.rc.in
@@ -1,4 +1,4 @@
-#include <afxres.h>
+#include <windows.h>
VS_VERSION_INFO VERSIONINFO
FILEVERSION @TRIMMED_VERSION_MAJOR@,@TRIMMED_VERSION_MINOR@,@RC_TRIMMED_VERSION_PATCH@,@UHD_GIT_COUNT@
diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp
index 768fde313..abddd1747 100644
--- a/host/lib/usrp/b200/b200_impl.cpp
+++ b/host/lib/usrp/b200/b200_impl.cpp
@@ -578,8 +578,8 @@ b200_impl::b200_impl(const device_addr_t &device_addr) :
////////////////////////////////////////////////////////////////////
//init the clock rate to something reasonable
- _tree->access<double>(mb_path / "tick_rate").set(
- device_addr.cast<double>("master_clock_rate", B200_DEFAULT_TICK_RATE));
+ double default_tick_rate = device_addr.cast<double>("master_clock_rate", B200_DEFAULT_TICK_RATE);
+ _tree->access<double>(mb_path / "tick_rate").set(default_tick_rate);
//subdev spec contains full width of selections
subdev_spec_t rx_spec, tx_spec;
@@ -598,10 +598,10 @@ b200_impl::b200_impl(const device_addr_t &device_addr) :
_tree->access<std::string>(mb_path / "clock_source/value").set("internal");
_tree->access<std::string>(mb_path / "time_source/value").set("none");
- // Set default rates (can't be done in setup_radio() because tick rate is not yet set)
+ // Set the DSP chains to some safe value
for (size_t i = 0; i < _radio_perifs.size(); i++) {
- _tree->access<double>(mb_path / "rx_dsps" / str(boost::format("%u") % i)/ "rate/value").set(B200_DEFAULT_RATE);
- _tree->access<double>(mb_path / "tx_dsps" / str(boost::format("%u") % i) / "rate/value").set(B200_DEFAULT_RATE);
+ _radio_perifs[i].ddc->set_host_rate(default_tick_rate / B200_DEFAULT_DECIM);
+ _radio_perifs[i].duc->set_host_rate(default_tick_rate / B200_DEFAULT_INTERP);
}
// We can automatically choose a master clock rate, but not if the user specifies one
_tree->access<bool>(mb_path / "auto_tick_rate").set(not device_addr.has_key("master_clock_rate"));
@@ -630,7 +630,7 @@ b200_impl::~b200_impl(void)
{
UHD_SAFE_CALL
(
- _async_task.reset();
+ _async_task.reset();
)
}
@@ -667,13 +667,14 @@ void b200_impl::setup_radio(const size_t dspno)
_tree->access<double>(mb_path / "tick_rate")
.subscribe(boost::bind(&rx_vita_core_3000::set_tick_rate, perif.framer, _1))
.subscribe(boost::bind(&rx_dsp_core_3000::set_tick_rate, perif.ddc, _1));
- const fs_path rx_dsp_path = mb_path / "rx_dsps" / str(boost::format("%u") % dspno);
+ const fs_path rx_dsp_path = mb_path / "rx_dsps" / dspno;
_tree->create<meta_range_t>(rx_dsp_path / "rate" / "range")
.publish(boost::bind(&rx_dsp_core_3000::get_host_rates, perif.ddc));
_tree->create<double>(rx_dsp_path / "rate" / "value")
+ .set(0.0) // We can only load a sensible value after the tick rate was set
.coerce(boost::bind(&b200_impl::coerce_rx_samp_rate, this, perif.ddc, dspno, _1))
.subscribe(boost::bind(&b200_impl::update_rx_samp_rate, this, dspno, _1))
- .set(0.0); // Can only set this after tick rate is initialized.
+ ;
_tree->create<double>(rx_dsp_path / "freq" / "value")
.coerce(boost::bind(&rx_dsp_core_3000::set_freq, perif.ddc, _1))
.set(0.0);
@@ -691,13 +692,14 @@ void b200_impl::setup_radio(const size_t dspno)
_tree->access<double>(mb_path / "tick_rate")
.subscribe(boost::bind(&tx_vita_core_3000::set_tick_rate, perif.deframer, _1))
.subscribe(boost::bind(&tx_dsp_core_3000::set_tick_rate, perif.duc, _1));
- const fs_path tx_dsp_path = mb_path / "tx_dsps" / str(boost::format("%u") % dspno);
+ const fs_path tx_dsp_path = mb_path / "tx_dsps" / dspno;
_tree->create<meta_range_t>(tx_dsp_path / "rate" / "range")
.publish(boost::bind(&tx_dsp_core_3000::get_host_rates, perif.duc));
_tree->create<double>(tx_dsp_path / "rate" / "value")
+ .set(0.0) // We can only load a sensible value after the tick rate was set
.coerce(boost::bind(&b200_impl::coerce_tx_samp_rate, this, perif.duc, dspno, _1))
.subscribe(boost::bind(&b200_impl::update_tx_samp_rate, this, dspno, _1))
- .set(0.0); // Can only set this after tick rate is initialized.
+ ;
_tree->create<double>(tx_dsp_path / "freq" / "value")
.coerce(boost::bind(&tx_dsp_core_3000::set_freq, perif.duc, _1))
.set(0.0);
@@ -823,7 +825,6 @@ void b200_impl::register_loopback_self_test(wb_iface::sptr iface)
void b200_impl::codec_loopback_self_test(wb_iface::sptr iface)
{
- bool test_fail = false;
UHD_MSG(status) << "Performing CODEC loopback test... " << std::flush;
size_t hash = size_t(time(NULL));
for (size_t i = 0; i < 100; i++)
@@ -835,11 +836,13 @@ void b200_impl::codec_loopback_self_test(wb_iface::sptr iface)
const boost::uint64_t rb_word64 = iface->peek64(RB64_CODEC_READBACK);
const boost::uint32_t rb_tx = boost::uint32_t(rb_word64 >> 32);
const boost::uint32_t rb_rx = boost::uint32_t(rb_word64 & 0xffffffff);
- test_fail = word32 != rb_tx or word32 != rb_rx;
- if (test_fail) break; //exit loop on any failure
+ bool test_fail = word32 != rb_tx or word32 != rb_rx;
+ if (test_fail) {
+ UHD_MSG(status) << "fail" << std::endl;
+ throw uhd::runtime_error("CODEC loopback test failed.");
+ }
}
- UHD_MSG(status) << ((test_fail)? "fail" : "pass") << std::endl;
-
+ UHD_MSG(status) << "pass" << std::endl;
/* Zero out the idle data. */
iface->poke32(TOREG(SR_CODEC_IDLE), 0);
}
diff --git a/host/lib/usrp/b200/b200_impl.hpp b/host/lib/usrp/b200/b200_impl.hpp
index 2491b36ad..57c68be71 100644
--- a/host/lib/usrp/b200/b200_impl.hpp
+++ b/host/lib/usrp/b200/b200_impl.hpp
@@ -51,7 +51,8 @@ static const boost::uint16_t B200_FPGA_COMPAT_NUM = 7;
static const double B200_BUS_CLOCK_RATE = 100e6;
static const double B200_DEFAULT_TICK_RATE = 32e6;
static const double B200_DEFAULT_FREQ = 100e6; // Hz
-static const double B200_DEFAULT_RATE = 250e3; // Sps
+static const double B200_DEFAULT_DECIM = 128;
+static const double B200_DEFAULT_INTERP = 128;
static const double B200_DEFAULT_RX_GAIN = 0; // dB
static const double B200_DEFAULT_TX_GAIN = 0; // dB
static const boost::uint32_t B200_GPSDO_ST_NONE = 0x83;
diff --git a/host/lib/usrp/b200/b200_io_impl.cpp b/host/lib/usrp/b200/b200_io_impl.cpp
index 3171e25c3..c4e04f70a 100644
--- a/host/lib/usrp/b200/b200_io_impl.cpp
+++ b/host/lib/usrp/b200/b200_io_impl.cpp
@@ -111,16 +111,9 @@ void b200_impl::set_auto_tick_rate(
% (this_dsp_rate / 1e6) % (max_tick_rate / 1e6)
));
}
- // If this_dsp_rate == B200_DEFAULT_RATE, we assume the user did not actually set
- // the sampling rate. If the user *did* set the rate to
- // B200_DEFAULT_RATE on all DSPs, then this will still work (see below).
- // If the user set one DSP to B200_DEFAULT_RATE and the other to
- // a different rate, this also works if the rates are integer multiples
- // of one another. Only for certain configurations of B200_DEFAULT_RATE
- // and another rate that is not an integer multiple, this will be problematic.
- // Since this case is less common than the case where a rate is left unset,
- // we don't handle that but rather explain that corner case in the documentation.
- if (this_dsp_rate == B200_DEFAULT_RATE) {
+ // If this_dsp_rate == 0.0, the sampling rate for this DSP hasn't been set, so
+ // we don't take that into consideration.
+ if (this_dsp_rate == 0.0) {
continue;
}
lcm_rate = boost::math::lcm<boost::uint32_t>(
@@ -130,11 +123,11 @@ void b200_impl::set_auto_tick_rate(
}
}
if (lcm_rate == 1) {
- lcm_rate = static_cast<boost::uint32_t>(B200_DEFAULT_RATE);
+ // In this case, no one has ever set a sampling rate.
+ return;
}
- // Step 2: Determine whether if we can use lcm_rate (preferred),
- // or have to give up because too large:
+ // Step 2: Check if the lcm_rate is within available limits:
double base_rate = static_cast<double>(lcm_rate);
if (uhd::math::fp_compare::fp_compare_delta<double>(base_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ) >
uhd::math::fp_compare::fp_compare_delta<double>(max_tick_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ)) {
@@ -152,6 +145,7 @@ void b200_impl::set_auto_tick_rate(
// An equation that does all that is:
//
// f_auto = r * 2^floor(log2(f_max/r))
+ // = base_rate * multiplier
//
// where r is the base rate and f_max is the maximum tick rate. The case
// where floor() yields 1 must be caught.
@@ -173,7 +167,7 @@ void b200_impl::set_auto_tick_rate(
uhd::math::fp_compare::fp_compare_delta<double>(max_tick_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ)
);
- if (_tree->access<double>("/mboards/0/tick_rate").get() != new_rate) {
+ if (!uhd::math::frequencies_are_equal(_tree->access<double>("/mboards/0/tick_rate").get(), new_rate)) {
_tree->access<double>("/mboards/0/tick_rate").set(new_rate);
}
}
diff --git a/host/lib/usrp/common/ad9361_driver/ad9361_device.h b/host/lib/usrp/common/ad9361_driver/ad9361_device.h
index 1c5c97829..a2038ea01 100644
--- a/host/lib/usrp/common/ad9361_driver/ad9361_device.h
+++ b/host/lib/usrp/common/ad9361_driver/ad9361_device.h
@@ -29,7 +29,14 @@ public:
ad9361_device_t(ad9361_params::sptr client, ad9361_io::sptr io_iface) :
_client_params(client), _io_iface(io_iface) {
- _rx_filters = boost::assign::map_list_of("LPF_TIA", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_lp_tia_sec, this, _1),
+ /*
+ * This Boost.Assign to_container() workaround is necessary because STL containers
+ * apparently confuse newer versions of MSVC.
+ *
+ * Source: http://www.boost.org/doc/libs/1_55_0/libs/assign/doc/#portability
+ */
+
+ _rx_filters = (boost::assign::map_list_of("LPF_TIA", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_lp_tia_sec, this, _1),
boost::bind(&ad9361_device_t::_set_filter_lp_tia_sec, this, _1, _3)))
("LPF_BB", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_lp_bb, this, _1),
boost::bind(&ad9361_device_t::_set_filter_lp_bb, this, _1, _3)))
@@ -38,9 +45,9 @@ public:
("HB_2", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_hb_2, this, _1), 0))
("HB_1", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_hb_1, this, _1), 0))
("FIR_1", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_fir, this, _1, _2),
- boost::bind(&ad9361_device_t::_set_filter_fir, this, _1, _2, _3)));
+ boost::bind(&ad9361_device_t::_set_filter_fir, this, _1, _2, _3)))).to_container(_rx_filters);
- _tx_filters = boost::assign::map_list_of("LPF_SECONDARY", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_lp_tia_sec, this, _1),
+ _tx_filters = (boost::assign::map_list_of("LPF_SECONDARY", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_lp_tia_sec, this, _1),
boost::bind(&ad9361_device_t::_set_filter_lp_tia_sec, this, _1, _3)))
("LPF_BB", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_lp_bb, this, _1),
boost::bind(&ad9361_device_t::_set_filter_lp_bb, this, _1, _3)))
@@ -49,7 +56,7 @@ public:
("HB_2", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_hb_2, this, _1), 0))
("HB_1", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_hb_1, this, _1), 0))
("FIR_1", filter_query_helper(boost::bind(&ad9361_device_t::_get_filter_fir, this, _1, _2),
- boost::bind(&ad9361_device_t::_set_filter_fir, this, _1, _2, _3)));
+ boost::bind(&ad9361_device_t::_set_filter_fir, this, _1, _2, _3)))).to_container(_tx_filters);
}
/* Initialize the AD9361 codec. */