diff options
| author | Josh Blum <josh@joshknows.com> | 2010-10-07 10:27:30 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-10-07 10:27:30 -0700 | 
| commit | be6a6b291400dde7b2b3b935e2eedd8d892e54f8 (patch) | |
| tree | 2f7a77b718f78c13121cc6ab314938ae2dcc2ef9 | |
| parent | 86b021e48031f2bc6e99c7c5d2d626ea149dec70 (diff) | |
| download | uhd-be6a6b291400dde7b2b3b935e2eedd8d892e54f8.tar.gz uhd-be6a6b291400dde7b2b3b935e2eedd8d892e54f8.tar.bz2 uhd-be6a6b291400dde7b2b3b935e2eedd8d892e54f8.zip | |
usrp-e: use frame size to calculate the max samples per packet
| -rw-r--r-- | host/lib/usrp/usrp_e/io_impl.cpp | 43 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e/usrp_e_impl.hpp | 6 | ||||
| -rw-r--r-- | host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp | 8 | 
3 files changed, 42 insertions, 15 deletions
| diff --git a/host/lib/usrp/usrp_e/io_impl.cpp b/host/lib/usrp/usrp_e/io_impl.cpp index 2802a6b87..406b7269f 100644 --- a/host/lib/usrp/usrp_e/io_impl.cpp +++ b/host/lib/usrp/usrp_e/io_impl.cpp @@ -91,7 +91,6 @@ void usrp_e_impl::io_impl::recv_pirate_loop(  ){      set_thread_priority_safe();      recv_pirate_crew_raiding = true; -    //size_t next_packet_seq = 0;      while(recv_pirate_crew_raiding){          managed_recv_buffer::sptr buff = this->data_xport->get_recv_buff(); @@ -143,6 +142,15 @@ void usrp_e_impl::io_impl::recv_pirate_loop(   * Helper Functions   **********************************************************************/  void usrp_e_impl::io_init(void){ +    //setup otw types +    _send_otw_type.width = 16; +    _send_otw_type.shift = 0; +    _send_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN; + +    _recv_otw_type.width = 16; +    _recv_otw_type.shift = 0; +    _recv_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN; +      //setup rx data path      _iface->poke32(UE_REG_CTRL_RX_NSAMPS_PER_PKT, get_max_recv_samps_per_packet());      _iface->poke32(UE_REG_CTRL_RX_NCHANNELS, 1); @@ -197,21 +205,25 @@ bool get_send_buffs(      return buffs[0].get() != NULL;  } +size_t usrp_e_impl::get_max_send_samps_per_packet(void) const{ +    static const size_t hdr_size = 0 +        + vrt::max_if_hdr_words32*sizeof(boost::uint32_t) +        - sizeof(vrt::if_packet_info_t().cid) //no class id ever used +    ; +    size_t bpp = _io_impl->data_xport->get_send_frame_size() - hdr_size; +    return bpp/_send_otw_type.get_sample_size(); +} +  size_t usrp_e_impl::send(      const std::vector<const void *> &buffs, size_t num_samps,      const tx_metadata_t &metadata, const io_type_t &io_type,      send_mode_t send_mode, double timeout  ){ -    otw_type_t send_otw_type; -    send_otw_type.width = 16; -    send_otw_type.shift = 0; -    send_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN; -      return vrt_packet_handler::send(          _io_impl->packet_handler_send_state,       //last state of the send handler          buffs, num_samps,                          //buffer to fill          metadata, send_mode,                       //samples metadata -        io_type, send_otw_type,                    //input and output types to convert +        io_type, _send_otw_type,                   //input and output types to convert          MASTER_CLOCK_RATE,                         //master clock tick rate          uhd::transport::vrt::if_hdr_pack_le,          boost::bind(&get_send_buffs, _io_impl->data_xport, timeout, _1), @@ -222,21 +234,26 @@ size_t usrp_e_impl::send(  /***********************************************************************   * Data Recv   **********************************************************************/ +size_t usrp_e_impl::get_max_recv_samps_per_packet(void) const{ +    static const size_t hdr_size = 0 +        + vrt::max_if_hdr_words32*sizeof(boost::uint32_t) +        + sizeof(vrt::if_packet_info_t().tlr) //forced to have trailer +        - sizeof(vrt::if_packet_info_t().cid) //no class id ever used +    ; +    size_t bpp = _io_impl->data_xport->get_recv_frame_size() - hdr_size; +    return bpp/_recv_otw_type.get_sample_size(); +} +  size_t usrp_e_impl::recv(      const std::vector<void *> &buffs, size_t num_samps,      rx_metadata_t &metadata, const io_type_t &io_type,      recv_mode_t recv_mode, double timeout  ){ -    otw_type_t recv_otw_type; -    recv_otw_type.width = 16; -    recv_otw_type.shift = 0; -    recv_otw_type.byteorder = otw_type_t::BO_LITTLE_ENDIAN; -      return vrt_packet_handler::recv(          _io_impl->packet_handler_recv_state,       //last state of the recv handler          buffs, num_samps,                          //buffer to fill          metadata, recv_mode,                       //samples metadata -        io_type, recv_otw_type,                    //input and output types to convert +        io_type, _recv_otw_type,                   //input and output types to convert          MASTER_CLOCK_RATE,                         //master clock tick rate          uhd::transport::vrt::if_hdr_unpack_le,          boost::bind(&usrp_e_impl::io_impl::get_recv_buffs, _io_impl.get(), _1, timeout), diff --git a/host/lib/usrp/usrp_e/usrp_e_impl.hpp b/host/lib/usrp/usrp_e/usrp_e_impl.hpp index 49912050e..95d80fed5 100644 --- a/host/lib/usrp/usrp_e/usrp_e_impl.hpp +++ b/host/lib/usrp/usrp_e/usrp_e_impl.hpp @@ -22,6 +22,7 @@  #include <uhd/utils/pimpl.hpp>  #include <uhd/usrp/subdev_spec.hpp>  #include <uhd/usrp/dboard_eeprom.hpp> +#include <uhd/types/otw_type.hpp>  #include <uhd/types/clock_config.hpp>  #include <uhd/types/stream_cmd.hpp>  #include <uhd/usrp/dboard_manager.hpp> @@ -85,8 +86,8 @@ public:      size_t send(const std::vector<const void *> &, size_t, const uhd::tx_metadata_t &, const uhd::io_type_t &, send_mode_t, double);      size_t recv(const std::vector<void *> &, size_t, uhd::rx_metadata_t &, const uhd::io_type_t &, recv_mode_t, double);      bool recv_async_msg(uhd::async_metadata_t &, double); -    size_t get_max_send_samps_per_packet(void) const{return 503;} -    size_t get_max_recv_samps_per_packet(void) const{return 503;} +    size_t get_max_send_samps_per_packet(void) const; +    size_t get_max_recv_samps_per_packet(void) const;  private:      //interface to ioctls and file descriptor @@ -97,6 +98,7 @@ private:      //handle io stuff      UHD_PIMPL_DECL(io_impl) _io_impl; +    uhd::otw_type_t _send_otw_type, _recv_otw_type;      void io_init(void);      void issue_stream_cmd(const uhd::stream_cmd_t &stream_cmd);      void handle_overrun(size_t); diff --git a/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp b/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp index 4e10bcc48..bc18c490b 100644 --- a/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp +++ b/host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp @@ -134,6 +134,10 @@ public:          return _rb_size.num_rx_frames;      } +    size_t get_recv_frame_size(void) const{ +        return _frame_size; +    } +      managed_send_buffer::sptr get_send_buff(double timeout){          if (fp_verbose) std::cout << "get_send_buff: " << _send_index << std::endl; @@ -166,6 +170,10 @@ public:          return _rb_size.num_tx_frames;      } +    size_t get_send_frame_size(void) const{ +        return _frame_size; +    } +  private:      void release(ring_buffer_info *info){ | 
