diff options
Diffstat (limited to 'host/lib/usrp/b200/b200_impl.cpp')
-rw-r--r-- | host/lib/usrp/b200/b200_impl.cpp | 33 |
1 files changed, 18 insertions, 15 deletions
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); } |