diff options
| author | Josh Blum <josh@joshknows.com> | 2011-12-20 17:38:00 -0800 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2011-12-20 17:38:00 -0800 | 
| commit | 81289ab0510c847daacf75e261cad2de5cd7d508 (patch) | |
| tree | aa8a92f1dab55b9183f1bf14d78c25a3cde255f4 | |
| parent | cdf8de0ca34d787ee9b3fed543f5e45bc2df00fa (diff) | |
| download | uhd-81289ab0510c847daacf75e261cad2de5cd7d508.tar.gz uhd-81289ab0510c847daacf75e261cad2de5cd7d508.tar.bz2 uhd-81289ab0510c847daacf75e261cad2de5cd7d508.zip | |
usrp: added underflow_policy to tx streamer args
| -rw-r--r-- | host/include/uhd/stream.hpp | 6 | ||||
| -rw-r--r-- | host/lib/usrp/b100/io_impl.cpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/cores/tx_dsp_core_200.cpp | 12 | ||||
| -rw-r--r-- | host/lib/usrp/cores/tx_dsp_core_200.hpp | 2 | ||||
| -rw-r--r-- | host/lib/usrp/e100/io_impl.cpp | 1 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 1 | 
6 files changed, 22 insertions, 1 deletions
| diff --git a/host/include/uhd/stream.hpp b/host/include/uhd/stream.hpp index 8f3219dbd..b41c1733d 100644 --- a/host/include/uhd/stream.hpp +++ b/host/include/uhd/stream.hpp @@ -78,10 +78,16 @@ struct UHD_API stream_args_t{      /*!       * The args parameter is used to pass arbitrary key/value pairs.       * Possible keys used by args (depends on implementation): +     *       * - scalar: an integer scaling factor used with the sc8 wire format.       * The key/value pair scalar=1024 means that the sample in the DSP       * was multiplied by 1024 before its upper 8 bits were harvested.       * +     * - underflow_policy: how the TX DSP should recover from underflow. +     * Possible options are "next_burst" or "next_packet". +     * In the "next_burst" mode, the DSP drops incoming packets until a new burst is started. +     * In the "next_packet" mode, the DSP starts transmitting again at the next packet. +     *       * The following are not implemented, but are listed for conceptual purposes:       * - function: magnitude or phase/magnitude       * - units: numeric units like counts or dBm diff --git a/host/lib/usrp/b100/io_impl.cpp b/host/lib/usrp/b100/io_impl.cpp index 5b2fa4686..7e4cd6f8e 100644 --- a/host/lib/usrp/b100/io_impl.cpp +++ b/host/lib/usrp/b100/io_impl.cpp @@ -291,6 +291,7 @@ tx_streamer::sptr b100_impl::get_tx_stream(const uhd::stream_args_t &args_){          const size_t dsp = args.channels[chan_i];          UHD_ASSERT_THROW(dsp == 0); //always 0          if (not args.args.has_key("noclear")) _tx_dsp->clear(); +        if (args.args.has_key("underflow_policy")) _tx_dsp->set_underflow_policy(args.args["underflow_policy"]);          my_streamer->set_xport_chan_get_buff(chan_i, boost::bind(              &zero_copy_if::get_send_buff, _data_transport, _1          )); diff --git a/host/lib/usrp/cores/tx_dsp_core_200.cpp b/host/lib/usrp/cores/tx_dsp_core_200.cpp index 4e1a3e44d..c5de4e361 100644 --- a/host/lib/usrp/cores/tx_dsp_core_200.cpp +++ b/host/lib/usrp/cores/tx_dsp_core_200.cpp @@ -60,13 +60,23 @@ public:      {          //init the tx control registers          this->clear(); +        this->set_underflow_policy("next_packet");      }      void clear(void){          _iface->poke32(REG_TX_CTRL_CLEAR_STATE, 1); //reset          _iface->poke32(REG_TX_CTRL_NUM_CHAN, 0);    //1 channel          _iface->poke32(REG_TX_CTRL_REPORT_SID, _sid); -        _iface->poke32(REG_TX_CTRL_POLICY, FLAG_TX_CTRL_POLICY_NEXT_PACKET); +    } + +    void set_underflow_policy(const std::string &policy){ +        if (policy == "next_packet"){ +            _iface->poke32(REG_TX_CTRL_POLICY, FLAG_TX_CTRL_POLICY_NEXT_PACKET); +        } +        else if (policy == "next_burst"){ +            _iface->poke32(REG_TX_CTRL_POLICY, FLAG_TX_CTRL_POLICY_NEXT_BURST); +        } +        else throw uhd::value_error("USRP TX cannot handle requested underflow policy: " + policy);      }      void set_tick_rate(const double rate){ diff --git a/host/lib/usrp/cores/tx_dsp_core_200.hpp b/host/lib/usrp/cores/tx_dsp_core_200.hpp index 50d128df4..4b39a5b07 100644 --- a/host/lib/usrp/cores/tx_dsp_core_200.hpp +++ b/host/lib/usrp/cores/tx_dsp_core_200.hpp @@ -50,6 +50,8 @@ public:      virtual void set_updates(const size_t cycles_per_up, const size_t packets_per_up) = 0; +    virtual void set_underflow_policy(const std::string &policy) = 0; +  };  #endif /* INCLUDED_LIBUHD_USRP_TX_DSP_CORE_200_HPP */ diff --git a/host/lib/usrp/e100/io_impl.cpp b/host/lib/usrp/e100/io_impl.cpp index 5dddeef25..0cc09bd6d 100644 --- a/host/lib/usrp/e100/io_impl.cpp +++ b/host/lib/usrp/e100/io_impl.cpp @@ -367,6 +367,7 @@ tx_streamer::sptr e100_impl::get_tx_stream(const uhd::stream_args_t &args_){          const size_t dsp = args.channels[chan_i];          UHD_ASSERT_THROW(dsp == 0); //always 0          if (not args.args.has_key("noclear")) _tx_dsp->clear(); +        if (args.args.has_key("underflow_policy")) _tx_dsp->set_underflow_policy(args.args["underflow_policy"]);          my_streamer->set_xport_chan_get_buff(chan_i, boost::bind(              &zero_copy_if::get_send_buff, _data_transport, _1          )); diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index 62941ac79..44ab513ac 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -487,6 +487,7 @@ tx_streamer::sptr usrp2_impl::get_tx_stream(const uhd::stream_args_t &args_){                      _mbc[mb].tx_dsp->clear();                      _io_impl->fc_mons[abs]->clear();                  } +                if (args.args.has_key("underflow_policy")) _mbc[mb].tx_dsp->set_underflow_policy(args.args["underflow_policy"]);                  my_streamer->set_xport_chan_get_buff(chan_i, boost::bind(                      &usrp2_impl::io_impl::get_send_buff, _io_impl.get(), abs, _1                  )); | 
