summaryrefslogtreecommitdiffstats
path: root/host
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-10-07 10:27:30 -0700
committerJosh Blum <josh@joshknows.com>2010-10-07 10:27:30 -0700
commitbe6a6b291400dde7b2b3b935e2eedd8d892e54f8 (patch)
tree2f7a77b718f78c13121cc6ab314938ae2dcc2ef9 /host
parent86b021e48031f2bc6e99c7c5d2d626ea149dec70 (diff)
downloaduhd-be6a6b291400dde7b2b3b935e2eedd8d892e54f8.tar.gz
uhd-be6a6b291400dde7b2b3b935e2eedd8d892e54f8.tar.bz2
uhd-be6a6b291400dde7b2b3b935e2eedd8d892e54f8.zip
usrp-e: use frame size to calculate the max samples per packet
Diffstat (limited to 'host')
-rw-r--r--host/lib/usrp/usrp_e/io_impl.cpp43
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_impl.hpp6
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_mmap_zero_copy.cpp8
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){