diff options
| author | Josh Blum <josh@joshknows.com> | 2010-09-22 19:14:57 -0700 | 
|---|---|---|
| committer | Josh Blum <josh@joshknows.com> | 2010-09-22 19:14:57 -0700 | 
| commit | 7ee585f2b9f74a3732e364095f7e5b8f18ae3595 (patch) | |
| tree | 053c2852dc277963c48a482a65d43bd1d6eff607 | |
| parent | 000578892e9cf8f0117b55dc5d770faad36740d0 (diff) | |
| download | uhd-7ee585f2b9f74a3732e364095f7e5b8f18ae3595.tar.gz uhd-7ee585f2b9f74a3732e364095f7e5b8f18ae3595.tar.bz2 uhd-7ee585f2b9f74a3732e364095f7e5b8f18ae3595.zip  | |
usrp1: multi-channel rx working, modified vrt handler to deinterleave
| -rwxr-xr-x | host/lib/transport/gen_convert_types.py | 10 | ||||
| -rw-r--r-- | host/lib/transport/vrt_packet_handler.hpp | 30 | ||||
| -rw-r--r-- | host/lib/usrp/usrp1/io_impl.cpp | 5 | 
3 files changed, 29 insertions, 16 deletions
diff --git a/host/lib/transport/gen_convert_types.py b/host/lib/transport/gen_convert_types.py index adbd22868..f9509c81d 100755 --- a/host/lib/transport/gen_convert_types.py +++ b/host/lib/transport/gen_convert_types.py @@ -99,9 +99,9 @@ void transport::convert_io_type_to_otw_type(              nsamps_per_io_buff          );          #else -        for (size_t i = 0; i < nsamps_per_io_buff; i++){ +        for (size_t i = 0, j = 0; i < nsamps_per_io_buff; i++){              #for $j in range($num_chans) -            reinterpret_cast<$(out_type)_t *>(otw_buff)[i*$num_chans + $j] = +            reinterpret_cast<$(out_type)_t *>(otw_buff)[j++] =                  #if $ph.get_swap_type($pred) == 'bswap'                  uhd::byteswap($(converter)(reinterpret_cast<const $(in_type)_t *>(io_buffs[$j])[i]));                  #else @@ -139,13 +139,13 @@ void transport::convert_otw_type_to_io_type(              nsamps_per_io_buff          );          #else -        for (size_t i = 0; i < nsamps_per_io_buff; i++){ +        for (size_t i = 0, j = 0; i < nsamps_per_io_buff; i++){              #for $j in range($num_chans)              reinterpret_cast<$(out_type)_t *>(io_buffs[$j])[i] =                  #if $ph.get_swap_type($pred) == 'bswap' -                $(converter)(uhd::byteswap(reinterpret_cast<const $(in_type)_t *>(otw_buff)[i*$num_chans + $j])); +                $(converter)(uhd::byteswap(reinterpret_cast<const $(in_type)_t *>(otw_buff)[j++]));                  #else -                $(converter)(reinterpret_cast<const $(in_type)_t *>(otw_buff)[i*$num_chans + $j]); +                $(converter)(reinterpret_cast<const $(in_type)_t *>(otw_buff)[j++]);                  #end if              #end for          } diff --git a/host/lib/transport/vrt_packet_handler.hpp b/host/lib/transport/vrt_packet_handler.hpp index 7e0588f03..596989951 100644 --- a/host/lib/transport/vrt_packet_handler.hpp +++ b/host/lib/transport/vrt_packet_handler.hpp @@ -150,7 +150,8 @@ template <typename T> UHD_INLINE T get_context_code(          const vrt_unpacker_t &vrt_unpacker,          const get_recv_buffs_t &get_recv_buffs,          const handle_overflow_t &handle_overflow, -        size_t vrt_header_offset_words32 +        size_t vrt_header_offset_words32, +        size_t chans_per_otw_buff      ){          metadata.error_code = uhd::rx_metadata_t::ERROR_CODE_NONE; @@ -184,15 +185,21 @@ template <typename T> UHD_INLINE T get_context_code(          //extract the number of samples available to copy          size_t bytes_per_item = otw_type.get_sample_size();          size_t nsamps_available = state.size_of_copy_buffs/bytes_per_item; -        size_t nsamps_to_copy = std::min(total_samps, nsamps_available); +        size_t nsamps_to_copy = std::min(total_samps*chans_per_otw_buff, nsamps_available);          size_t bytes_to_copy = nsamps_to_copy*bytes_per_item; +        size_t nsamps_to_copy_per_io_buff = nsamps_to_copy/chans_per_otw_buff; + +        std::vector<void *> io_buffs(chans_per_otw_buff); +        for (size_t i = 0; i < state.width; i+=chans_per_otw_buff){ + +            //fill a vector with pointers to the io buffers +            for (size_t j = 0; j < chans_per_otw_buff; j++){ +                io_buffs[j] = reinterpret_cast<boost::uint8_t *>(buffs[i+j]) + offset_bytes; +            } -        for (size_t i = 0; i < state.width; i++){              //copy-convert the samples from the recv buffer              uhd::transport::convert_otw_type_to_io_type( -                state.copy_buffs[i], otw_type, -                reinterpret_cast<boost::uint8_t *>(buffs[i]) + offset_bytes, -                io_type, nsamps_to_copy +                state.copy_buffs[i], otw_type, io_buffs, io_type, nsamps_to_copy_per_io_buff              );              //update the rx copy buffer to reflect the bytes copied @@ -206,7 +213,7 @@ template <typename T> UHD_INLINE T get_context_code(          metadata.fragment_offset = state.fragment_offset_in_samps;          state.fragment_offset_in_samps += nsamps_to_copy; //set for next call -        return nsamps_to_copy; +        return nsamps_to_copy_per_io_buff;      }      /******************************************************************* @@ -224,7 +231,8 @@ template <typename T> UHD_INLINE T get_context_code(          const vrt_unpacker_t &vrt_unpacker,          const get_recv_buffs_t &get_recv_buffs,          const handle_overflow_t &handle_overflow = &handle_overflow_nop, -        size_t vrt_header_offset_words32 = 0 +        size_t vrt_header_offset_words32 = 0, +        size_t chans_per_otw_buff = 1      ){          switch(recv_mode){ @@ -241,7 +249,8 @@ template <typename T> UHD_INLINE T get_context_code(                  vrt_unpacker,                  get_recv_buffs,                  handle_overflow, -                vrt_header_offset_words32 +                vrt_header_offset_words32, +                chans_per_otw_buff              );          } @@ -261,7 +270,8 @@ template <typename T> UHD_INLINE T get_context_code(                      vrt_unpacker,                      get_recv_buffs,                      handle_overflow, -                    vrt_header_offset_words32 +                    vrt_header_offset_words32, +                    chans_per_otw_buff                  );                  if (num_samps == 0) break; //had a recv timeout or error, break loop                  accum_num_samps += num_samps; diff --git a/host/lib/usrp/usrp1/io_impl.cpp b/host/lib/usrp/usrp1/io_impl.cpp index 7446c7f7c..a813a0462 100644 --- a/host/lib/usrp/usrp1/io_impl.cpp +++ b/host/lib/usrp/usrp1/io_impl.cpp @@ -290,7 +290,10 @@ size_t usrp1_impl::recv(          io_type, _rx_otw_type,                     //input and output types to convert          _clock_ctrl->get_master_clock_freq(),      //master clock tick rate          &usrp1_bs_vrt_unpacker, -        boost::bind(&get_recv_buffs, _data_transport, _1) +        boost::bind(&get_recv_buffs, _data_transport, _1), +        &vrt_packet_handler::handle_overflow_nop, +        0,                                         //vrt header offset +        _rx_subdev_spec.size()                     //num channels      );      //handle the polling for overflow conditions  | 
