diff options
Diffstat (limited to 'host/lib')
| -rw-r--r-- | host/lib/simple_device.cpp | 13 | ||||
| -rw-r--r-- | host/lib/time_spec.cpp | 5 | ||||
| -rw-r--r-- | host/lib/transport/udp_zero_copy_asio.cpp | 2 | ||||
| -rw-r--r-- | host/lib/types.cpp | 15 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/dsp_impl.cpp | 42 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/fw_common.h | 16 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/io_impl.cpp | 8 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/mboard_impl.cpp | 77 | ||||
| -rw-r--r-- | host/lib/usrp/usrp2/usrp2_impl.hpp | 10 | 
9 files changed, 81 insertions, 107 deletions
| diff --git a/host/lib/simple_device.cpp b/host/lib/simple_device.cpp index bb7ddfc68..a25cb12e0 100644 --- a/host/lib/simple_device.cpp +++ b/host/lib/simple_device.cpp @@ -167,17 +167,8 @@ public:      /*******************************************************************       * Streaming       ******************************************************************/ -    void set_streaming_at(const time_spec_t &time_spec){ -        _rx_ddc[std::string("stream_at")] = time_spec; -        _rx_ddc[std::string("enabled")] = true; -    } - -    void set_streaming(bool enb){ -        _rx_ddc[std::string("enabled")] = enb; -    } - -    bool get_streaming(void){ -        return _rx_ddc[std::string("enabled")].as<bool>(); +    void issue_stream_cmd(const stream_cmd_t &stream_cmd){ +        _rx_ddc[std::string("stream_cmd")] = stream_cmd;      }      /******************************************************************* diff --git a/host/lib/time_spec.cpp b/host/lib/time_spec.cpp index 210010394..98bf28077 100644 --- a/host/lib/time_spec.cpp +++ b/host/lib/time_spec.cpp @@ -19,11 +19,6 @@  using namespace uhd; -time_spec_t::time_spec_t(void){ -    secs = ~0; -    ticks = ~0; -} -  time_spec_t::time_spec_t(boost::uint32_t new_secs, boost::uint32_t new_ticks){      secs = new_secs;      ticks = new_ticks; diff --git a/host/lib/transport/udp_zero_copy_asio.cpp b/host/lib/transport/udp_zero_copy_asio.cpp index 219ae8720..9436f2a13 100644 --- a/host/lib/transport/udp_zero_copy_asio.cpp +++ b/host/lib/transport/udp_zero_copy_asio.cpp @@ -115,7 +115,7 @@ smart_buffer::sptr udp_zero_copy_impl::recv(void){      //implement timeout through polling and sleeping      boost::asio::deadline_timer timer(_socket->get_io_service()); -    timer.expires_from_now(boost::posix_time::milliseconds(50)); +    timer.expires_from_now(boost::posix_time::milliseconds(100));      while (not ((available = _socket->available()) or timer.expires_from_now().is_negative())){          boost::this_thread::sleep(boost::posix_time::milliseconds(1));      } diff --git a/host/lib/types.cpp b/host/lib/types.cpp index f8a9a9b36..273f87a2d 100644 --- a/host/lib/types.cpp +++ b/host/lib/types.cpp @@ -51,7 +51,16 @@ tune_result_t::tune_result_t(void){   * clock config   **********************************************************************/  clock_config_t::clock_config_t(void){ -    ref_source = ""; //not a valid setting -    pps_source = ""; //not a valid setting -    pps_polarity = POLARITY_NEG; +    ref_source = REF_INT, +    pps_source = PPS_INT, +    pps_polarity = PPS_NEG; +} + +/*********************************************************************** + * stream command + **********************************************************************/ +stream_cmd_t::stream_cmd_t(void){ +    stream_now = true; +    continuous = false; +    num_samps = 0;  } diff --git a/host/lib/usrp/usrp2/dsp_impl.cpp b/host/lib/usrp/usrp2/dsp_impl.cpp index 34cce0afb..44f654863 100644 --- a/host/lib/usrp/usrp2/dsp_impl.cpp +++ b/host/lib/usrp/usrp2/dsp_impl.cpp @@ -63,9 +63,8 @@ void usrp2_impl::init_ddc_config(void){      _ddc_freq = 0;      update_ddc_config(); -    _ddc_stream_at = time_spec_t(); -    _ddc_enabled = false; -    update_ddc_enabled(); +    //initial command that kills streaming (in case if was left on) +    //issue_ddc_stream_cmd(TODO)  }  void usrp2_impl::update_ddc_config(void){ @@ -86,21 +85,19 @@ void usrp2_impl::update_ddc_config(void){      ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_TOTALLY_SETUP_THE_DDC_DUDE);  } -void usrp2_impl::update_ddc_enabled(void){ +void usrp2_impl::issue_ddc_stream_cmd(const stream_cmd_t &stream_cmd){      //setup the out data      usrp2_ctrl_data_t out_data; -    out_data.id = htonl(USRP2_CTRL_ID_CONFIGURE_STREAMING_FOR_ME_BRO); -    out_data.data.streaming.enabled = (_ddc_enabled)? 1 : 0; -    out_data.data.streaming.secs =  htonl(_ddc_stream_at.secs); -    out_data.data.streaming.ticks = htonl(_ddc_stream_at.ticks); -    out_data.data.streaming.samples = htonl(_max_rx_samples_per_packet); +    out_data.id = htonl(USRP2_CTRL_ID_SEND_STREAM_COMMAND_FOR_ME_BRO); +    out_data.data.stream_cmd.now = (stream_cmd.stream_now)? 1 : 0; +    out_data.data.stream_cmd.continuous = (stream_cmd.continuous)? 1 : 0; +    out_data.data.stream_cmd.secs = htonl(stream_cmd.time_spec.secs); +    out_data.data.stream_cmd.ticks = htonl(stream_cmd.time_spec.ticks); +    out_data.data.stream_cmd.num_samps = htonl(stream_cmd.num_samps);      //send and recv      usrp2_ctrl_data_t in_data = ctrl_send_and_recv(out_data); -    ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_CONFIGURED_THAT_STREAMING_DUDE); - -    //clear the stream at time spec (it must be set for the next round of enable/disable) -    _ddc_stream_at = time_spec_t(); +    ASSERT_THROW(htonl(in_data.id) == USRP2_CTRL_ID_GOT_THAT_STREAM_COMMAND_DUDE);  }  /*********************************************************************** @@ -120,8 +117,7 @@ void usrp2_impl::ddc_get(const wax::obj &key, wax::obj &val){                      ("decim")                      ("decims")                      ("freq") -                    ("enabled") -                    ("stream_at") +                    ("stream_cmd")                  ;                  val = others;              } @@ -147,10 +143,6 @@ void usrp2_impl::ddc_get(const wax::obj &key, wax::obj &val){          val = _ddc_freq;          return;      } -    else if (key_name == "enabled"){ -        val = _ddc_enabled; -        return; -    }      throw std::invalid_argument(str(          boost::format("error getting: unknown key with name %s") % key_name @@ -178,16 +170,8 @@ void usrp2_impl::ddc_set(const wax::obj &key, const wax::obj &val){          update_ddc_config();          return;      } -    else if (key_name == "enabled"){ -        bool new_enabled = val.as<bool>(); -        _ddc_enabled = new_enabled; //shadow -        update_ddc_enabled(); -        return; -    } -    else if (key_name == "stream_at"){ -        time_spec_t new_stream_at = val.as<time_spec_t>(); -        _ddc_stream_at = new_stream_at; //shadow -        //update_ddc_enabled(); //dont update from here +    else if (key_name == "stream_cmd"){ +        issue_ddc_stream_cmd(val.as<stream_cmd_t>());          return;      } diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h index 7fcae6fb2..30fee6c32 100644 --- a/host/lib/usrp/usrp2/fw_common.h +++ b/host/lib/usrp/usrp2/fw_common.h @@ -32,6 +32,9 @@ extern "C" {  #define _SINS_  #endif +//used to differentiate control packets over data port +#define USRP2_INVALID_VRT_HEADER 0 +  // size of the vrt header and trailer to the host  #define USRP2_HOST_RX_VRT_HEADER_WORDS32 5  #define USRP2_HOST_RX_VRT_TRAILER_WORDS32 1 //FIXME fpga sets wrong header size when no trailer present @@ -90,8 +93,8 @@ typedef enum{      USRP2_CTRL_ID_SETUP_THIS_DDC_FOR_ME_BRO,      USRP2_CTRL_ID_TOTALLY_SETUP_THE_DDC_DUDE, -    USRP2_CTRL_ID_CONFIGURE_STREAMING_FOR_ME_BRO, -    USRP2_CTRL_ID_CONFIGURED_THAT_STREAMING_DUDE, +    USRP2_CTRL_ID_SEND_STREAM_COMMAND_FOR_ME_BRO, +    USRP2_CTRL_ID_GOT_THAT_STREAM_COMMAND_DUDE,      USRP2_CTRL_ID_SETUP_THIS_DUC_FOR_ME_BRO,      USRP2_CTRL_ID_TOTALLY_SETUP_THE_DUC_DUDE, @@ -186,12 +189,13 @@ typedef struct{              _SINS_ uint32_t scale_iq;          } ddc_args;          struct { -            _SINS_ uint8_t enabled; -            _SINS_ uint8_t _pad[3]; +            _SINS_ uint8_t now; //stream now? +            _SINS_ uint8_t continuous; //auto-reload commmands? +            _SINS_ uint8_t _pad[2];              _SINS_ uint32_t secs;              _SINS_ uint32_t ticks; -            _SINS_ uint32_t samples; -        } streaming; +            _SINS_ uint32_t num_samps; +        } stream_cmd;          struct {              _SINS_ uint32_t freq_word;              _SINS_ uint32_t interp; diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp index df0736863..280f124d2 100644 --- a/host/lib/usrp/usrp2/io_impl.cpp +++ b/host/lib/usrp/usrp2/io_impl.cpp @@ -41,8 +41,12 @@ void usrp2_impl::io_init(void){      _rx_copy_buff = asio::buffer("", 0);      //send a small data packet so the usrp2 knows the udp source port -    boost::uint32_t zero_data = 0; -    _data_transport->send(asio::buffer(&zero_data, sizeof(zero_data))); +    //and the maximum number of lines (32 bit words) per packet +    boost::uint32_t data[2] = { +        htonl(USRP2_INVALID_VRT_HEADER), +        htonl(_max_rx_samples_per_packet) +    }; +    _data_transport->send(asio::buffer(&data, sizeof(data)));  }  #define unrolled_loop(__inst, __len){ \ diff --git a/host/lib/usrp/usrp2/mboard_impl.cpp b/host/lib/usrp/usrp2/mboard_impl.cpp index cbca8eec7..c56782c4b 100644 --- a/host/lib/usrp/usrp2/mboard_impl.cpp +++ b/host/lib/usrp/usrp2/mboard_impl.cpp @@ -35,27 +35,10 @@ void usrp2_impl::mboard_init(void){  }  void usrp2_impl::init_clock_config(void){ -    //init the ref source clock config -    _ref_source_dict = boost::assign::map_list_of -        ("int", USRP2_REF_SOURCE_INT) -        ("sma", USRP2_REF_SOURCE_SMA) -        ("mimo", USRP2_REF_SOURCE_MIMO) -    ; -    _clock_config.ref_source = "int"; - -    //init the pps source clock config -    _pps_source_dict = boost::assign::map_list_of -        ("sma", USRP2_PPS_SOURCE_SMA) -        ("mimo", USRP2_PPS_SOURCE_MIMO) -    ; -    _clock_config.pps_source = "sma"; - -    //init the pps polarity clock config -    _pps_polarity_dict = boost::assign::map_list_of -        (clock_config_t::POLARITY_POS, USRP2_PPS_POLARITY_POS) -        (clock_config_t::POLARITY_NEG, USRP2_PPS_POLARITY_NEG) -    ; -    _clock_config.pps_polarity = clock_config_t::POLARITY_NEG; +    //setup the clock configuration settings +    _clock_config.ref_source = clock_config_t::REF_INT; +    _clock_config.pps_source = clock_config_t::PPS_SMA; +    _clock_config.pps_polarity = clock_config_t::PPS_NEG;      //update the clock config (sends a control packet)      update_clock_config(); @@ -65,9 +48,35 @@ void usrp2_impl::update_clock_config(void){      //setup the out data      usrp2_ctrl_data_t out_data;      out_data.id = htonl(USRP2_CTRL_ID_HERES_A_NEW_CLOCK_CONFIG_BRO); -    out_data.data.clock_config.ref_source   = _ref_source_dict  [_clock_config.ref_source]; -    out_data.data.clock_config.pps_source   = _pps_source_dict  [_clock_config.pps_source]; -    out_data.data.clock_config.pps_polarity = _pps_polarity_dict[_clock_config.pps_polarity]; + +    //translate ref source enums +    switch(_clock_config.ref_source){ +    case clock_config_t::REF_INT: +        out_data.data.clock_config.ref_source = USRP2_REF_SOURCE_INT; break; +    case clock_config_t::REF_SMA: +        out_data.data.clock_config.ref_source = USRP2_REF_SOURCE_SMA; break; +    case clock_config_t::REF_MIMO: +        out_data.data.clock_config.ref_source = USRP2_REF_SOURCE_MIMO; break; +    default: throw std::runtime_error("usrp2: unhandled clock configuration ref source"); +    } + +    //translate pps source enums +    switch(_clock_config.pps_source){ +    case clock_config_t::PPS_SMA: +        out_data.data.clock_config.pps_source = USRP2_PPS_SOURCE_SMA; break; +    case clock_config_t::PPS_MIMO: +        out_data.data.clock_config.pps_source = USRP2_PPS_SOURCE_MIMO; break; +    default: throw std::runtime_error("usrp2: unhandled clock configuration pps source"); +    } + +    //translate pps polarity enums +    switch(_clock_config.pps_polarity){ +    case clock_config_t::PPS_POS: +        out_data.data.clock_config.pps_source = USRP2_PPS_POLARITY_POS; break; +    case clock_config_t::PPS_NEG: +        out_data.data.clock_config.pps_source = USRP2_PPS_POLARITY_NEG; break; +    default: throw std::runtime_error("usrp2: unhandled clock configuration pps polarity"); +    }      //send and recv      usrp2_ctrl_data_t in_data = ctrl_send_and_recv(out_data); @@ -184,14 +193,6 @@ void usrp2_impl::mboard_get(const wax::obj &key_, wax::obj &val){          val = _clock_config;          return; -    case MBOARD_PROP_PPS_SOURCE_NAMES: -        val = prop_names_t(_pps_source_dict.get_keys()); -        return; - -    case MBOARD_PROP_REF_SOURCE_NAMES: -        val = prop_names_t(_ref_source_dict.get_keys()); -        return; -      case MBOARD_PROP_TIME_NOW:      case MBOARD_PROP_TIME_NEXT_PPS:          throw std::runtime_error("Error: trying to get write-only property on usrp2 mboard"); @@ -234,13 +235,9 @@ void usrp2_impl::mboard_set(const wax::obj &key, const wax::obj &val){      //handle the get request conditioned on the key      switch(key.as<mboard_prop_t>()){ -    case MBOARD_PROP_CLOCK_CONFIG:{ -            clock_config_t clock_config = val.as<clock_config_t>(); -            assert_has(_pps_source_dict.get_keys(), clock_config.pps_source, "usrp2 pps source"); -            assert_has(_ref_source_dict.get_keys(), clock_config.ref_source, "usrp2 ref source"); -            _clock_config = clock_config; //shadow -            update_clock_config(); -        } +    case MBOARD_PROP_CLOCK_CONFIG: +        _clock_config = val.as<clock_config_t>(); +        update_clock_config();          return;      case MBOARD_PROP_TIME_NOW:{ @@ -264,8 +261,6 @@ void usrp2_impl::mboard_set(const wax::obj &key, const wax::obj &val){      case MBOARD_PROP_RX_DBOARD_NAMES:      case MBOARD_PROP_TX_DBOARD:      case MBOARD_PROP_TX_DBOARD_NAMES: -    case MBOARD_PROP_PPS_SOURCE_NAMES: -    case MBOARD_PROP_REF_SOURCE_NAMES:          throw std::runtime_error("Error: trying to set read-only property on usrp2 mboard");      } diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp index 55ac0b192..2794cc666 100644 --- a/host/lib/usrp/usrp2/usrp2_impl.hpp +++ b/host/lib/usrp/usrp2/usrp2_impl.hpp @@ -21,7 +21,6 @@  #include <uhd/usrp/usrp2.hpp>  #include <uhd/dict.hpp>  #include <uhd/types.hpp> -#include <uhd/time_spec.hpp>  #include <boost/thread.hpp>  #include <boost/shared_ptr.hpp>  #include <boost/function.hpp> @@ -146,11 +145,6 @@ private:      void update_clock_config(void);      void set_time_spec(const uhd::time_spec_t &time_spec, bool now); -    //mappings from clock config strings to over the wire enums -    uhd::dict<std::string, usrp2_ref_source_t> _ref_source_dict; -    uhd::dict<std::string, usrp2_pps_source_t> _pps_source_dict; -    uhd::dict<uhd::clock_config_t::polarity_t, usrp2_pps_polarity_t> _pps_polarity_dict; -      //rx and tx dboard methods and objects      uhd::usrp::dboard_manager::sptr _dboard_manager;      void dboard_init(void); @@ -178,11 +172,9 @@ private:      std::vector<size_t> _allowed_decim_and_interp_rates;      size_t _ddc_decim;      uhd::freq_t _ddc_freq; -    bool _ddc_enabled; -    uhd::time_spec_t _ddc_stream_at;      void init_ddc_config(void);      void update_ddc_config(void); -    void update_ddc_enabled(void); +    void issue_ddc_stream_cmd(const uhd::stream_cmd_t &stream_cmd);      //methods and shadows for the duc dsp      size_t _duc_interp; | 
