aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2016-04-22 09:45:44 -0700
committerMartin Braun <martin.braun@ettus.com>2016-04-22 11:14:54 -0700
commitd010b3e4d4327f3db10147c67ec47b85b89fe0fd (patch)
treec5d8f5f07935865302ff4a45dac22f56d556931a
parentaae93861a042e18b34871e36e8e66004f777396a (diff)
downloaduhd-d010b3e4d4327f3db10147c67ec47b85b89fe0fd.tar.gz
uhd-d010b3e4d4327f3db10147c67ec47b85b89fe0fd.tar.bz2
uhd-d010b3e4d4327f3db10147c67ec47b85b89fe0fd.zip
b200: Fixed setting of max rate
DSP rates are now being tracked as in whether or not they've been set. We can disregard unset DSPs for the automatic clock rate calculation. Reviewed-By: Derek Kozel <derek.kozel@ettus.com>
-rw-r--r--host/lib/usrp/b200/b200_impl.cpp9
-rw-r--r--host/lib/usrp/b200/b200_io_impl.cpp19
2 files changed, 18 insertions, 10 deletions
diff --git a/host/lib/usrp/b200/b200_impl.cpp b/host/lib/usrp/b200/b200_impl.cpp
index 18dcdadba..327d7760d 100644
--- a/host/lib/usrp/b200/b200_impl.cpp
+++ b/host/lib/usrp/b200/b200_impl.cpp
@@ -731,6 +731,11 @@ b200_impl::~b200_impl(void)
* setup radio control objects
**********************************************************************/
+void lambda_set_bool_prop(property_tree::sptr tree, fs_path path, bool value, double)
+{
+ tree->access<bool>(path).set(value);
+}
+
void b200_impl::setup_radio(const size_t dspno)
{
radio_perifs_t &perif = _radio_perifs[dspno];
@@ -788,8 +793,10 @@ void b200_impl::setup_radio(const size_t dspno)
.subscribe(boost::bind(&rx_dsp_core_3000::set_tick_rate, perif.ddc, _1));
const fs_path rx_dsp_path = mb_path / "rx_dsps" / dspno;
perif.ddc->populate_subtree(_tree->subtree(rx_dsp_path));
+ _tree->create<bool>(rx_dsp_path / "rate" / "set").set(false);
_tree->access<double>(rx_dsp_path / "rate" / "value")
.coerce(boost::bind(&b200_impl::coerce_rx_samp_rate, this, perif.ddc, dspno, _1))
+ .subscribe(boost::bind(&lambda_set_bool_prop, _tree, rx_dsp_path / "rate" / "set", true, _1))
.subscribe(boost::bind(&b200_impl::update_rx_samp_rate, this, dspno, _1))
;
_tree->create<stream_cmd_t>(rx_dsp_path / "stream_cmd")
@@ -803,8 +810,10 @@ void b200_impl::setup_radio(const size_t dspno)
.subscribe(boost::bind(&tx_dsp_core_3000::set_tick_rate, perif.duc, _1));
const fs_path tx_dsp_path = mb_path / "tx_dsps" / dspno;
perif.duc->populate_subtree(_tree->subtree(tx_dsp_path));
+ _tree->create<bool>(tx_dsp_path / "rate" / "set").set(false);
_tree->access<double>(tx_dsp_path / "rate" / "value")
.coerce(boost::bind(&b200_impl::coerce_tx_samp_rate, this, perif.duc, dspno, _1))
+ .subscribe(boost::bind(&lambda_set_bool_prop, _tree, tx_dsp_path / "rate" / "set", true, _1))
.subscribe(boost::bind(&b200_impl::update_tx_samp_rate, this, dspno, _1))
;
diff --git a/host/lib/usrp/b200/b200_io_impl.cpp b/host/lib/usrp/b200/b200_io_impl.cpp
index 93f5b22fc..ec37f2f6f 100644
--- a/host/lib/usrp/b200/b200_io_impl.cpp
+++ b/host/lib/usrp/b200/b200_io_impl.cpp
@@ -82,9 +82,9 @@ void b200_impl::set_auto_tick_rate(
num_chans = std::max(size_t(1), max_chan_count());
}
const double max_tick_rate = ad9361_device_t::AD9361_MAX_CLOCK_RATE/num_chans;
+ using namespace uhd::math;
if (rate != 0.0 and
- (uhd::math::fp_compare::fp_compare_delta<double>(rate, uhd::math::FREQ_COMPARISON_DELTA_HZ) >
- uhd::math::fp_compare::fp_compare_delta<double>(max_tick_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ))) {
+ (fp_compare::fp_compare_delta<double>(rate, FREQ_COMPARISON_DELTA_HZ) > max_tick_rate)) {
throw uhd::value_error(str(
boost::format("Requested sampling rate (%.2f Msps) exceeds maximum tick rate of %.2f MHz.")
% (rate / 1e6) % (max_tick_rate / 1e6)
@@ -96,26 +96,25 @@ void b200_impl::set_auto_tick_rate(
boost::uint32_t lcm_rate = (rate == 0) ? 1 : static_cast<boost::uint32_t>(floor(rate + 0.5));
for (int i = 0; i < 2; i++) { // Loop through rx and tx
std::string dir = (i == 0) ? "tx" : "rx";
- // We have no way of knowing which DSPs are used, so we check them all.
+ // We assume all 'set' DSPs are being used.
BOOST_FOREACH(const std::string &dsp_no, _tree->list(str(boost::format("/mboards/0/%s_dsps") % dir))) {
fs_path dsp_path = str(boost::format("/mboards/0/%s_dsps/%s") % dir % dsp_no);
if (dsp_path == tree_dsp_path) {
continue;
}
+ if (not _tree->access<bool>(dsp_path / "rate/set").get()) {
+ continue;
+ }
double this_dsp_rate = _tree->access<double>(dsp_path / "rate/value").get();
// Check if the user selected something completely unreasonable:
- if (uhd::math::fp_compare::fp_compare_delta<double>(this_dsp_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ) >
- uhd::math::fp_compare::fp_compare_delta<double>(max_tick_rate, uhd::math::FREQ_COMPARISON_DELTA_HZ)) {
+ if (fp_compare::fp_compare_delta<double>(this_dsp_rate, FREQ_COMPARISON_DELTA_HZ) > max_tick_rate) {
throw uhd::value_error(str(
boost::format("Requested sampling rate (%.2f Msps) exceeds maximum tick rate of %.2f MHz.")
% (this_dsp_rate / 1e6) % (max_tick_rate / 1e6)
));
}
- // 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;
- }
+ // Clean up floating point rounding errors if they crept in
+ this_dsp_rate = std::min(max_tick_rate, this_dsp_rate);
lcm_rate = boost::math::lcm<boost::uint32_t>(
lcm_rate,
static_cast<boost::uint32_t>(floor(this_dsp_rate + 0.5))