diff options
| author | Josh Blum <josh@joshknows.com> | 2011-07-04 08:33:47 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-07-04 08:33:47 -0700 | 
| commit | df91040196c536c1cf0a57379b946c89ea73ae6b (patch) | |
| tree | 54fb6d34704c10bf6b00852094a3b437c08fbb53 | |
| parent | 729b284f628f3326d774262570b68540d7de9baa (diff) | |
| download | uhd-df91040196c536c1cf0a57379b946c89ea73ae6b.tar.gz uhd-df91040196c536c1cf0a57379b946c89ea73ae6b.tar.bz2 uhd-df91040196c536c1cf0a57379b946c89ea73ae6b.zip | |
usrp: added clipping to link max rate when setting sample rate
| -rw-r--r-- | host/lib/usrp/b100/b100_impl.cpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/b100/b100_impl.hpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/cores/rx_dsp_core_200.cpp | 11 | ||||
| -rw-r--r-- | host/lib/usrp/cores/rx_dsp_core_200.hpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/cores/tx_dsp_core_200.cpp | 11 | ||||
| -rw-r--r-- | host/lib/usrp/cores/tx_dsp_core_200.hpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/e100/e100_impl.cpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/e100/e100_impl.hpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/usrp1/io_impl.cpp | 14 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.cpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 1 | 
11 files changed, 37 insertions, 12 deletions
| diff --git a/host/lib/usrp/b100/b100_impl.cpp b/host/lib/usrp/b100/b100_impl.cpp index 5410f57e5..b58e70694 100644 --- a/host/lib/usrp/b100/b100_impl.cpp +++ b/host/lib/usrp/b100/b100_impl.cpp @@ -273,6 +273,7 @@ b100_impl::b100_impl(const device_addr_t &device_addr){          _fpga_ctrl, B100_REG_SR_ADDR(B100_SR_RX_DSP1), B100_REG_SR_ADDR(B100_SR_RX_CTRL1), B100_RX_SID_BASE + 1      ));      for (size_t dspno = 0; dspno < _rx_dsps.size(); dspno++){ +        _rx_dsps[dspno]->set_link_rate(B100_LINK_RATE_BPS);          _tree->access<double>(mb_path / "tick_rate")              .subscribe(boost::bind(&rx_dsp_core_200::set_tick_rate, _rx_dsps[dspno], _1));          property_tree::path_type rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno); @@ -293,6 +294,7 @@ b100_impl::b100_impl(const device_addr_t &device_addr){      _tx_dsp = tx_dsp_core_200::make(          _fpga_ctrl, B100_REG_SR_ADDR(B100_SR_TX_DSP), B100_REG_SR_ADDR(B100_SR_TX_CTRL), B100_TX_ASYNC_SID      ); +    _tx_dsp->set_link_rate(B100_LINK_RATE_BPS);      _tree->access<double>(mb_path / "tick_rate")          .subscribe(boost::bind(&tx_dsp_core_200::set_tick_rate, _tx_dsp, _1));      _tree->create<double>(mb_path / "tx_dsps/0/rate/value") diff --git a/host/lib/usrp/b100/b100_impl.hpp b/host/lib/usrp/b100/b100_impl.hpp index 115fba985..62a22674e 100644 --- a/host/lib/usrp/b100/b100_impl.hpp +++ b/host/lib/usrp/b100/b100_impl.hpp @@ -42,6 +42,7 @@  #include <uhd/usrp/dboard_manager.hpp>  #include <uhd/transport/usb_zero_copy.hpp> +static const double          B100_LINK_RATE_BPS = 256e6/8; //pratical link rate (< 480 Mbps)  static const std::string     B100_FW_FILE_NAME = "usrp_b100_fw.ihx";  static const std::string     B100_FPGA_FILE_NAME = "usrp_b100_fpga.bin";  static const boost::uint16_t B100_FW_COMPAT_NUM = 0x02; diff --git a/host/lib/usrp/cores/rx_dsp_core_200.cpp b/host/lib/usrp/cores/rx_dsp_core_200.cpp index 0c065e228..e059ddfca 100644 --- a/host/lib/usrp/cores/rx_dsp_core_200.cpp +++ b/host/lib/usrp/cores/rx_dsp_core_200.cpp @@ -18,6 +18,7 @@  #include "rx_dsp_core_200.hpp"  #include <uhd/types/dict.hpp>  #include <uhd/exception.hpp> +#include <uhd/utils/algorithm.hpp>  #include <boost/assign/list_of.hpp>  #include <boost/math/special_functions/round.hpp>  #include <boost/math/special_functions/sign.hpp> @@ -122,8 +123,14 @@ public:          _tick_rate = rate;      } +    void set_link_rate(const double rate){ +        _link_rate = rate/sizeof(boost::uint32_t); //in samps/s +    } +      double set_host_rate(const double rate){ -        const size_t decim_rate = boost::math::iround(_tick_rate/rate); +        const size_t decim_rate = uhd::clip<size_t>( +            boost::math::iround(_tick_rate/rate), size_t(std::ceil(_tick_rate/_link_rate)), 512 +        );          size_t decim = decim_rate;          //determine which half-band filters are activated @@ -172,7 +179,7 @@ public:  private:      wb_iface::sptr _iface;      const size_t _dsp_base, _ctrl_base; -    double _tick_rate; +    double _tick_rate, _link_rate;      bool _continuous_streaming;  }; diff --git a/host/lib/usrp/cores/rx_dsp_core_200.hpp b/host/lib/usrp/cores/rx_dsp_core_200.hpp index 72ed07230..abe7bf817 100644 --- a/host/lib/usrp/cores/rx_dsp_core_200.hpp +++ b/host/lib/usrp/cores/rx_dsp_core_200.hpp @@ -44,6 +44,8 @@ public:      virtual void set_tick_rate(const double rate) = 0; +    virtual void set_link_rate(const double rate) = 0; +      virtual double set_host_rate(const double rate) = 0;      virtual uhd::meta_range_t get_freq_range(void) = 0; diff --git a/host/lib/usrp/cores/tx_dsp_core_200.cpp b/host/lib/usrp/cores/tx_dsp_core_200.cpp index d2981bbdb..222ba589a 100644 --- a/host/lib/usrp/cores/tx_dsp_core_200.cpp +++ b/host/lib/usrp/cores/tx_dsp_core_200.cpp @@ -18,6 +18,7 @@  #include "tx_dsp_core_200.hpp"  #include <uhd/types/dict.hpp>  #include <uhd/exception.hpp> +#include <uhd/utils/algorithm.hpp>  #include <boost/assign/list_of.hpp>  #include <boost/math/special_functions/round.hpp>  #include <boost/math/special_functions/sign.hpp> @@ -68,8 +69,14 @@ public:          _tick_rate = rate;      } +    void set_link_rate(const double rate){ +        _link_rate = rate/sizeof(boost::uint32_t); //in samps/s +    } +      double set_host_rate(const double rate){ -        const size_t interp_rate = boost::math::iround(_tick_rate/rate); +        const size_t interp_rate = uhd::clip<size_t>( +            boost::math::iround(_tick_rate/rate), size_t(std::ceil(_tick_rate/_link_rate)), 512 +        );          size_t interp = interp_rate;          //determine which half-band filters are activated @@ -125,7 +132,7 @@ public:  private:      wb_iface::sptr _iface;      const size_t _dsp_base, _ctrl_base; -    double _tick_rate; +    double _tick_rate, _link_rate;  };  tx_dsp_core_200::sptr tx_dsp_core_200::make(wb_iface::sptr iface, const size_t dsp_base, const size_t ctrl_base, const boost::uint32_t sid){ diff --git a/host/lib/usrp/cores/tx_dsp_core_200.hpp b/host/lib/usrp/cores/tx_dsp_core_200.hpp index f74ec0bdb..65f822558 100644 --- a/host/lib/usrp/cores/tx_dsp_core_200.hpp +++ b/host/lib/usrp/cores/tx_dsp_core_200.hpp @@ -36,6 +36,8 @@ public:      virtual void set_tick_rate(const double rate) = 0; +    virtual void set_link_rate(const double rate) = 0; +      virtual double set_host_rate(const double rate) = 0;      virtual uhd::meta_range_t get_freq_range(void) = 0; diff --git a/host/lib/usrp/e100/e100_impl.cpp b/host/lib/usrp/e100/e100_impl.cpp index 8086eb985..a86a75816 100644 --- a/host/lib/usrp/e100/e100_impl.cpp +++ b/host/lib/usrp/e100/e100_impl.cpp @@ -232,6 +232,7 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){          _fpga_ctrl, E100_REG_SR_ADDR(UE_SR_RX_DSP1), E100_REG_SR_ADDR(UE_SR_RX_CTRL1), E100_RX_SID_BASE + 1      ));      for (size_t dspno = 0; dspno < _rx_dsps.size(); dspno++){ +        _rx_dsps[dspno]->set_link_rate(E100_LINK_RATE_BPS);          _tree->access<double>(mb_path / "tick_rate")              .subscribe(boost::bind(&rx_dsp_core_200::set_tick_rate, _rx_dsps[dspno], _1));          property_tree::path_type rx_dsp_path = mb_path / str(boost::format("rx_dsps/%u") % dspno); @@ -252,6 +253,7 @@ e100_impl::e100_impl(const uhd::device_addr_t &device_addr){      _tx_dsp = tx_dsp_core_200::make(          _fpga_ctrl, E100_REG_SR_ADDR(UE_SR_TX_DSP), E100_REG_SR_ADDR(UE_SR_TX_CTRL), E100_TX_ASYNC_SID      ); +    _tx_dsp->set_link_rate(E100_LINK_RATE_BPS);      _tree->access<double>(mb_path / "tick_rate")          .subscribe(boost::bind(&tx_dsp_core_200::set_tick_rate, _tx_dsp, _1));      _tree->create<double>(mb_path / "tx_dsps/0/rate/value") diff --git a/host/lib/usrp/e100/e100_impl.hpp b/host/lib/usrp/e100/e100_impl.hpp index a7051d497..e24360223 100644 --- a/host/lib/usrp/e100/e100_impl.hpp +++ b/host/lib/usrp/e100/e100_impl.hpp @@ -42,6 +42,7 @@  uhd::transport::zero_copy_if::sptr e100_make_mmap_zero_copy(e100_ctrl::sptr iface); +static const double          E100_LINK_RATE_BPS = 256e6/8;  static const std::string     E100_I2C_DEV_NODE = "/dev/i2c-3";  static const std::string     E100_FPGA_FILE_NAME = "usrp_e100_fpga_v2.bin";  static const boost::uint16_t E100_FPGA_COMPAT_NUM = 0x05; diff --git a/host/lib/usrp/usrp1/io_impl.cpp b/host/lib/usrp/usrp1/io_impl.cpp index bf34fde4f..b596bbd04 100644 --- a/host/lib/usrp/usrp1/io_impl.cpp +++ b/host/lib/usrp/usrp1/io_impl.cpp @@ -383,10 +383,9 @@ void usrp1_impl::update_tx_subdev_spec(const uhd::usrp::subdev_spec_t &spec){  double usrp1_impl::update_rx_samp_rate(const double samp_rate){      boost::mutex::scoped_lock lock = _io_impl->recv_handler.get_scoped_lock(); -    size_t rate = boost::math::iround(_master_clock_rate / samp_rate); - -    //clip the rate to something in range: -    rate = std::min<size_t>(std::max<size_t>(rate, 4), 256); +    const size_t rate = uhd::clip<size_t>( +        boost::math::iround(_master_clock_rate / samp_rate), size_t(std::ceil(_master_clock_rate / 8e6)), 256 +    );      bool s = this->disable_rx();      _iface->poke32(FR_DECIM_RATE, rate/2 - 1); @@ -399,10 +398,9 @@ double usrp1_impl::update_rx_samp_rate(const double samp_rate){  double usrp1_impl::update_tx_samp_rate(const double samp_rate){      boost::mutex::scoped_lock lock = _io_impl->send_handler.get_scoped_lock(); -    size_t rate = boost::math::iround(_master_clock_rate / samp_rate); - -    //clip the rate to something in range: -    rate = std::min<size_t>(std::max<size_t>(rate, 4), 256); +    const size_t rate = uhd::clip<size_t>( +        boost::math::iround(_master_clock_rate / samp_rate), size_t(std::ceil(_master_clock_rate / 8e6)), 256 +    );      bool s = this->disable_tx();      _iface->poke32(FR_INTERP_RATE, rate/2 - 1); diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp index 9741bec44..390d1813b 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.cpp +++ b/host/lib/usrp/usrp2/usrp2_impl.cpp @@ -445,6 +445,7 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){              _mbc[mb].iface, U2_REG_SR_ADDR(SR_RX_DSP1), U2_REG_SR_ADDR(SR_RX_CTRL1), USRP2_RX_SID_BASE + 1, true          ));          for (size_t dspno = 0; dspno < _mbc[mb].rx_dsps.size(); dspno++){ +            _mbc[mb].rx_dsps[dspno]->set_link_rate(USRP2_LINK_RATE_BPS);              _tree->access<double>(mb_path / "tick_rate")                  .subscribe(boost::bind(&rx_dsp_core_200::set_tick_rate, _mbc[mb].rx_dsps[dspno], _1));              //This is a hack/fix for the lingering packet problem. @@ -469,6 +470,7 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){          _mbc[mb].tx_dsp = tx_dsp_core_200::make(              _mbc[mb].iface, U2_REG_SR_ADDR(SR_TX_DSP), U2_REG_SR_ADDR(SR_TX_CTRL), USRP2_TX_ASYNC_SID          ); +        _mbc[mb].tx_dsp->set_link_rate(USRP2_LINK_RATE_BPS);          _tree->access<double>(mb_path / "tick_rate")              .subscribe(boost::bind(&tx_dsp_core_200::set_tick_rate, _mbc[mb].tx_dsp, _1));          _tree->create<double>(mb_path / "tx_dsps/0/rate/value") diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index eae7b7dcb..f2125e094 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -43,6 +43,7 @@  #include <uhd/usrp/dboard_manager.hpp>  #include <uhd/usrp/subdev_spec.hpp> +static const double USRP2_LINK_RATE_BPS = 1000e6/8;  static const double mimo_clock_delay_usrp2_rev4 = 4.18e-9;  static const double mimo_clock_delay_usrp_n2xx = 3.55e-9;  static const size_t mimo_clock_sync_delay_cycles = 137; | 
