summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-03-02 14:48:11 -0800
committerJosh Blum <josh@joshknows.com>2010-03-02 14:48:11 -0800
commit13bd67b4949a91df5e6696e708c935266b14c502 (patch)
tree40c9ebfd46636307c4537980b7ee116556e7ca17 /host/lib/usrp
parent451067295399e357d73c9bfdeef5f2ad040e0243 (diff)
downloaduhd-13bd67b4949a91df5e6696e708c935266b14c502.tar.gz
uhd-13bd67b4949a91df5e6696e708c935266b14c502.tar.bz2
uhd-13bd67b4949a91df5e6696e708c935266b14c502.zip
The net common is too slow in usrp2 firmware to figure out if its vrt data.
Added a custom function to tell if a packet is vrt data, seems to be feeding fast enough at this rate... Fixed some buffer size calculation logic.
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/usrp2/dsp_impl.cpp7
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp11
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp7
3 files changed, 13 insertions, 12 deletions
diff --git a/host/lib/usrp/usrp2/dsp_impl.cpp b/host/lib/usrp/usrp2/dsp_impl.cpp
index a57f5ff2d..8fdfd685f 100644
--- a/host/lib/usrp/usrp2/dsp_impl.cpp
+++ b/host/lib/usrp/usrp2/dsp_impl.cpp
@@ -82,12 +82,7 @@ void usrp2_impl::update_ddc_enabled(void){
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(
- _mtu/sizeof(uint32_t) -
- USRP2_HOST_RX_VRT_HEADER_WORDS32 -
- USRP2_HOST_RX_VRT_TRAILER_WORDS32 -
- ((2 + 14 + 20 + 8)/sizeof(uint32_t)) //size of headers (pad, eth, ip, udp)
- );
+ out_data.data.streaming.samples = htonl(_max_samples_per_packet);
//send and recv
usrp2_ctrl_data_t in_data = ctrl_send_and_recv(out_data);
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index 8b45a708a..0ca2409c3 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -127,12 +127,11 @@ size_t usrp2_impl::send_raw(
}
vrt_hdr_flags |= (metadata.start_of_burst)? (0x1 << 25) : 0;
vrt_hdr_flags |= (metadata.end_of_burst)? (0x1 << 24) : 0;
- num_vrt_hdr_words += asio::buffer_size(buff)/sizeof(uint32_t);
//fill in complete header word
vrt_hdr[0] = htonl(vrt_hdr_flags |
((_tx_stream_id_to_packet_seq[metadata.stream_id]++ & 0xf) << 16) |
- (num_vrt_hdr_words & 0xffff)
+ ((num_vrt_hdr_words + asio::buffer_size(buff)/sizeof(uint32_t)) & 0xffff)
);
//load the buffer vector
@@ -151,6 +150,8 @@ size_t usrp2_impl::recv_raw(
const boost::asio::mutable_buffer &buff,
uhd::metadata_t &metadata
){
+ metadata = metadata_t(); //clear metadata
+
//handle the case where there is spillover
if (asio::buffer_size(_splillover_buff) != 0){
size_t bytes_to_copy = std::min(
@@ -198,9 +199,9 @@ size_t usrp2_impl::recv_raw(
_rx_stream_id_to_packet_seq[metadata.stream_id] = my_seq;
//extract the number of bytes received
- size_t num_words = (vrt_header & 0xffff);
- num_words -= USRP2_HOST_RX_VRT_HEADER_WORDS32;
- num_words -= USRP2_HOST_RX_VRT_TRAILER_WORDS32;
+ size_t num_words = (vrt_header & 0xffff) -
+ USRP2_HOST_RX_VRT_HEADER_WORDS32 -
+ USRP2_HOST_RX_VRT_TRAILER_WORDS32;
size_t num_bytes = num_words*sizeof(uint32_t);
//handle the case where spillover memory was used
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 43f32c6e6..037aed477 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -108,7 +108,12 @@ private:
uhd::dict<uint32_t, size_t> _tx_stream_id_to_packet_seq;
uhd::dict<uint32_t, size_t> _rx_stream_id_to_packet_seq;
static const size_t _mtu = 1500; //FIXME we have no idea
- static const size_t _max_samples_per_packet = _mtu/sizeof(uint32_t);
+ static const size_t _max_samples_per_packet =
+ _mtu/sizeof(uint32_t) -
+ USRP2_HOST_RX_VRT_HEADER_WORDS32 -
+ USRP2_HOST_RX_VRT_TRAILER_WORDS32 -
+ ((2 + 14 + 20 + 8)/sizeof(uint32_t)) //size of headers (pad, eth, ip, udp)
+ ;
uint32_t _tmp_send_mem[_mtu/sizeof(uint32_t)];
uint32_t _tmp_recv_mem[_mtu/sizeof(uint32_t)];
uint32_t _spillover_mem[_mtu/sizeof(uint32_t)];