diff options
Diffstat (limited to 'host/lib/transport')
| -rw-r--r-- | host/lib/transport/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/lib/transport/chdr.cpp | 182 | ||||
| -rw-r--r-- | host/lib/transport/gen_vrt_if_packet.py | 269 | ||||
| -rw-r--r-- | host/lib/transport/libusb1_base.cpp | 35 | ||||
| -rw-r--r-- | host/lib/transport/libusb1_base.hpp | 4 | ||||
| -rw-r--r-- | host/lib/transport/libusb1_zero_copy.cpp | 4 | ||||
| -rwxr-xr-x | host/lib/transport/nirio/lvbitx/process-lvbitx.py | 16 | ||||
| -rw-r--r-- | host/lib/transport/nirio/rpc/rpc_client.cpp | 2 | ||||
| -rw-r--r-- | host/lib/transport/super_recv_packet_handler.hpp | 2 | 
9 files changed, 347 insertions, 168 deletions
| diff --git a/host/lib/transport/CMakeLists.txt b/host/lib/transport/CMakeLists.txt index 5920f3d78..9ec8a5c0b 100644 --- a/host/lib/transport/CMakeLists.txt +++ b/host/lib/transport/CMakeLists.txt @@ -129,6 +129,7 @@ LIBUHD_APPEND_SOURCES(      ${CMAKE_CURRENT_SOURCE_DIR}/if_addrs.cpp      ${CMAKE_CURRENT_SOURCE_DIR}/udp_simple.cpp      ${CMAKE_CURRENT_SOURCE_DIR}/nirio_zero_copy.cpp +    ${CMAKE_CURRENT_SOURCE_DIR}/chdr.cpp  )  # Verbose Debug output for send/recv diff --git a/host/lib/transport/chdr.cpp b/host/lib/transport/chdr.cpp new file mode 100644 index 000000000..632887e56 --- /dev/null +++ b/host/lib/transport/chdr.cpp @@ -0,0 +1,182 @@ +// +// Copyright 2014 Ettus Research LLC +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with this program.  If not, see <http://www.gnu.org/licenses/>. +// + +#include <uhd/transport/chdr.hpp> +#include <uhd/utils/byteswap.hpp> +#include <uhd/exception.hpp> + +//define the endian macros to convert integers +#ifdef BOOST_BIG_ENDIAN +    #define BE_MACRO(x) (x) +    #define LE_MACRO(x) uhd::byteswap(x) +#else +    #define BE_MACRO(x) uhd::byteswap(x) +    #define LE_MACRO(x) (x) +#endif + +using namespace uhd::transport::vrt; + +static const boost::uint32_t HDR_FLAG_TSF = (1 << 29); +static const boost::uint32_t HDR_FLAG_EOB = (1 << 28); +static const boost::uint32_t HDR_FLAG_ERROR = (1 << 28); + +/***************************************************************************/ +/* Packing                                                                 */ +/***************************************************************************/ +/*! Translate the contents of \p if_packet_info into a 32-Bit word and return it. + */ +UHD_INLINE boost::uint32_t _hdr_pack_chdr( +        if_packet_info_t &if_packet_info +) { +    // Set fields in if_packet_info +    if_packet_info.num_header_words32 = 2 + (if_packet_info.has_tsf ? 2 : 0); +    if_packet_info.num_packet_words32 = +            if_packet_info.num_header_words32 + +            if_packet_info.num_payload_words32; + +    boost::uint16_t pkt_length = +        if_packet_info.num_payload_bytes + (4 * if_packet_info.num_header_words32); +    boost::uint32_t chdr = 0 +        // 2 Bits: Packet type +        | (if_packet_info.packet_type << 30) +        // 1 Bit: Has time +        | (if_packet_info.has_tsf ? HDR_FLAG_TSF : 0) +        // 1 Bit: EOB or Error +        | ((if_packet_info.eob or if_packet_info.error) ? HDR_FLAG_EOB : 0) +        // 12 Bits: Sequence number +        | ((if_packet_info.packet_count & 0xFFF) << 16) +        // 16 Bits: Total packet length +        | pkt_length; +    return chdr; +} + +void chdr::if_hdr_pack_be( +        boost::uint32_t *packet_buff, +        if_packet_info_t &if_packet_info +) { +    // Write header and update if_packet_info +    packet_buff[0] = BE_MACRO(_hdr_pack_chdr(if_packet_info)); + +    // Write SID +    packet_buff[1] = BE_MACRO(if_packet_info.sid); + +    // Write time +    if (if_packet_info.has_tsf) { +        packet_buff[2] = BE_MACRO(boost::uint32_t(if_packet_info.tsf >> 32)); +        packet_buff[3] = BE_MACRO(boost::uint32_t(if_packet_info.tsf >> 0)); +    } +} + +void chdr::if_hdr_pack_le( +        boost::uint32_t *packet_buff, +        if_packet_info_t &if_packet_info +) { +    // Write header and update if_packet_info +    packet_buff[0] = LE_MACRO(_hdr_pack_chdr(if_packet_info)); + +    // Write SID +    packet_buff[1] = LE_MACRO(if_packet_info.sid); + +    // Write time +    if (if_packet_info.has_tsf) { +        packet_buff[2] = LE_MACRO(boost::uint32_t(if_packet_info.tsf >> 32)); +        packet_buff[3] = LE_MACRO(boost::uint32_t(if_packet_info.tsf >> 0)); +    } +} + + +/***************************************************************************/ +/* Unpacking                                                               */ +/***************************************************************************/ +UHD_INLINE void _hdr_unpack_chdr( +        const boost::uint32_t chdr, +        if_packet_info_t &if_packet_info +) { +    // Set constant members +    if_packet_info.link_type = if_packet_info_t::LINK_TYPE_CHDR; +    if_packet_info.has_cid = false; +    if_packet_info.has_sid = true; +    if_packet_info.has_tsi = false; +    if_packet_info.has_tlr = false; +    if_packet_info.sob = false; + +    // Set configurable members +    if_packet_info.has_tsf = (chdr & HDR_FLAG_TSF) > 0; +    if_packet_info.packet_type = if_packet_info_t::packet_type_t((chdr >> 30) & 0x3); +    if_packet_info.eob = (if_packet_info.packet_type == if_packet_info_t::PACKET_TYPE_DATA) +                         && ((chdr & HDR_FLAG_EOB) > 0); +    if_packet_info.error = (if_packet_info.packet_type == if_packet_info_t::PACKET_TYPE_RESP) +                         && ((chdr & HDR_FLAG_ERROR) > 0); +    if_packet_info.packet_count = (chdr >> 16) & 0xFFF; + +    // Set packet length variables +    if (if_packet_info.has_tsf) { +        if_packet_info.num_header_words32 = 4; +    } else { +        if_packet_info.num_header_words32 = 2; +    } +    size_t pkt_size_bytes = (chdr & 0xFFFF); +    size_t pkt_size_word32 = (pkt_size_bytes / 4) + ((pkt_size_bytes % 4) ? 1 : 0); +    // Check lengths match: +    if (pkt_size_word32 < if_packet_info.num_header_words32) { +        throw uhd::value_error("Bad CHDR or invalid packet length"); +    } +    if (if_packet_info.num_packet_words32 < pkt_size_word32) { +        throw uhd::value_error("Bad CHDR or packet fragment"); +    } +    if_packet_info.num_payload_bytes = pkt_size_bytes - (4 * if_packet_info.num_header_words32); +    if_packet_info.num_payload_words32 = pkt_size_word32 - if_packet_info.num_header_words32; +} + +void chdr::if_hdr_unpack_be( +        const boost::uint32_t *packet_buff, +        if_packet_info_t &if_packet_info +) { +    // Read header and update if_packet_info +    boost::uint32_t chdr = BE_MACRO(packet_buff[0]); +    _hdr_unpack_chdr(chdr, if_packet_info); + +    // Read SID +    if_packet_info.sid = BE_MACRO(packet_buff[1]); + +    // Read time (has_tsf was updated earlier) +    if (if_packet_info.has_tsf) { +        if_packet_info.tsf = 0 +            | boost::uint64_t(BE_MACRO(packet_buff[2])) << 32 +            | BE_MACRO(packet_buff[3]); +    } +} + +void chdr::if_hdr_unpack_le( +        const boost::uint32_t *packet_buff, +        if_packet_info_t &if_packet_info +) { +    // Read header and update if_packet_info +    boost::uint32_t chdr = LE_MACRO(packet_buff[0]); +    _hdr_unpack_chdr(chdr, if_packet_info); + +    // Read SID +    if_packet_info.sid = LE_MACRO(packet_buff[1]); + +    // Read time (has_tsf was updated earlier) +    if (if_packet_info.has_tsf) { +        if_packet_info.tsf = 0 +            | boost::uint64_t(LE_MACRO(packet_buff[2])) << 32 +            | LE_MACRO(packet_buff[3]); +    } +} + diff --git a/host/lib/transport/gen_vrt_if_packet.py b/host/lib/transport/gen_vrt_if_packet.py index 98f6804ae..6723e3a4b 100644 --- a/host/lib/transport/gen_vrt_if_packet.py +++ b/host/lib/transport/gen_vrt_if_packet.py @@ -1,6 +1,6 @@  #!/usr/bin/env python  # -# Copyright 2010-2013 Ettus Research LLC +# Copyright 2010-2013,2015 Ettus Research LLC  #  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU General Public License as published by @@ -25,26 +25,25 @@ metatdata into vrt headers and vrt headers into metadata.  The generated code infers jump tables to speed-up the parsing time.  """ -TMPL_TEXT = """ -#import time +TMPL_TEXT = """<% import time %>  /*********************************************************************** - * This file was generated by $file on $time.strftime("%c") + * This file was generated by ${file} on ${time.strftime("%c")}   **********************************************************************/ -\#include <uhd/exception.hpp> -\#include <uhd/transport/vrt_if_packet.hpp> -\#include <uhd/utils/byteswap.hpp> -\#include <boost/detail/endian.hpp> -\#include <vector> +#include <uhd/exception.hpp> +#include <uhd/transport/vrt_if_packet.hpp> +#include <uhd/utils/byteswap.hpp> +#include <boost/detail/endian.hpp> +#include <vector>  //define the endian macros to convert integers -\#ifdef BOOST_BIG_ENDIAN -    \#define BE_MACRO(x) (x) -    \#define LE_MACRO(x) uhd::byteswap(x) -\#else -    \#define BE_MACRO(x) uhd::byteswap(x) -    \#define LE_MACRO(x) (x) -\#endif +#ifdef BOOST_BIG_ENDIAN +    #define BE_MACRO(x) (x) +    #define LE_MACRO(x) uhd::byteswap(x) +#else +    #define BE_MACRO(x) uhd::byteswap(x) +    #define LE_MACRO(x) (x) +#endif  using namespace uhd;  using namespace uhd::transport; @@ -59,13 +58,13 @@ static pred_table_type get_pred_unpack_table(void)      pred_table_type table(1 << 9, 0); //only 9 bits useful here (20-28)      for (size_t i = 0; i < table.size(); i++){          boost::uint32_t vrt_hdr_word = i << 20; -        if(vrt_hdr_word & $hex(0x1 << 28)) table[i] |= $hex($sid_p); -        if(vrt_hdr_word & $hex(0x1 << 27)) table[i] |= $hex($cid_p); -        if(vrt_hdr_word & $hex(0x3 << 22)) table[i] |= $hex($tsi_p); -        if(vrt_hdr_word & $hex(0x3 << 20)) table[i] |= $hex($tsf_p); -        if(vrt_hdr_word & $hex(0x1 << 26)) table[i] |= $hex($tlr_p); -        if(vrt_hdr_word & $hex(0x1 << 24)) table[i] |= $hex($eob_p); -        if(vrt_hdr_word & $hex(0x1 << 25)) table[i] |= $hex($sob_p); +        if(vrt_hdr_word & ${hex(0x1 << 28)}) table[i] |= ${hex(sid_p)}; +        if(vrt_hdr_word & ${hex(0x1 << 27)}) table[i] |= ${hex(cid_p)}; +        if(vrt_hdr_word & ${hex(0x3 << 22)}) table[i] |= ${hex(tsi_p)}; +        if(vrt_hdr_word & ${hex(0x3 << 20)}) table[i] |= ${hex(tsf_p)}; +        if(vrt_hdr_word & ${hex(0x1 << 26)}) table[i] |= ${hex(tlr_p)}; +        if(vrt_hdr_word & ${hex(0x1 << 24)}) table[i] |= ${hex(eob_p)}; +        if(vrt_hdr_word & ${hex(0x1 << 25)}) table[i] |= ${hex(sob_p)};      }      return table;  } @@ -105,13 +104,12 @@ UHD_INLINE static boost::uint32_t vrt_to_chdr(const boost::uint32_t vrt, const i  }  ######################################################################## -#def gen_code($XE_MACRO, $suffix) +<%def name="gen_code(XE_MACRO, suffix)">  ######################################################################## -  /*********************************************************************** - * interal impl of packing VRT IF header only + * internal impl of packing VRT IF header only   **********************************************************************/ -UHD_INLINE void __if_hdr_pack_$(suffix)( +UHD_INLINE void __if_hdr_pack_${suffix}(      boost::uint32_t *packet_buff,      if_packet_info_t &if_packet_info,      boost::uint32_t &vrt_hdr_word32 @@ -119,72 +117,53 @@ UHD_INLINE void __if_hdr_pack_$(suffix)(      boost::uint32_t vrt_hdr_flags = 0;      pred_type pred = 0; -    if (if_packet_info.has_sid) pred |= $hex($sid_p); -    if (if_packet_info.has_cid) pred |= $hex($cid_p); -    if (if_packet_info.has_tsi) pred |= $hex($tsi_p); -    if (if_packet_info.has_tsf) pred |= $hex($tsf_p); -    if (if_packet_info.has_tlr) pred |= $hex($tlr_p); -    if (if_packet_info.eob)     pred |= $hex($eob_p); -    if (if_packet_info.sob)     pred |= $hex($sob_p); +    if (if_packet_info.has_sid) pred |= ${hex(sid_p)}; +    if (if_packet_info.has_cid) pred |= ${hex(cid_p)}; +    if (if_packet_info.has_tsi) pred |= ${hex(tsi_p)}; +    if (if_packet_info.has_tsf) pred |= ${hex(tsf_p)}; +    if (if_packet_info.has_tlr) pred |= ${hex(tlr_p)}; +    if (if_packet_info.eob)     pred |= ${hex(eob_p)}; +    if (if_packet_info.sob)     pred |= ${hex(sob_p)};      switch(pred){ -    #for $pred in range(2**7) -    case $pred: -        #set $num_header_words = 1 -        #set $flags = 0 +    % for pred in range(2**7): +    case ${pred}:<% num_header_words = 1 %><% flags = 0 %>          ########## Stream ID ########## -        #if $pred & $sid_p -            packet_buff[$num_header_words] = $(XE_MACRO)(if_packet_info.sid); -            #set $num_header_words += 1 -            #set $flags |= (0x1 << 28); -        #end if +        % if pred & sid_p: +            packet_buff[${num_header_words}] = ${XE_MACRO}(if_packet_info.sid);<% num_header_words += 1 %><% flags |= (0x1 << 28) %> +        % endif          ########## Class ID ########## -        #if $pred & $cid_p -            packet_buff[$num_header_words] = 0; //not implemented -            #set $num_header_words += 1 -            packet_buff[$num_header_words] = 0; //not implemented -            #set $num_header_words += 1 -            #set $flags |= (0x1 << 27); -        #end if +        % if pred & cid_p: +            packet_buff[${num_header_words}] = 0; //not implemented<% num_header_words += 1 %> +            packet_buff[${num_header_words}] = 0; //not implemented<% num_header_words += 1 %><% flags |= (0x1 << 27) %> +        % endif          ########## Integer Time ########## -        #if $pred & $tsi_p -            packet_buff[$num_header_words] = $(XE_MACRO)(if_packet_info.tsi); -            #set $num_header_words += 1 -            #set $flags |= (0x3 << 22); -        #end if +        % if pred & tsi_p: +            packet_buff[${num_header_words}] = ${XE_MACRO}(if_packet_info.tsi);<% num_header_words += 1 %><% flags |= (0x3 << 22) %> +        % endif          ########## Fractional Time ########## -        #if $pred & $tsf_p -            packet_buff[$num_header_words] = $(XE_MACRO)(boost::uint32_t(if_packet_info.tsf >> 32)); -            #set $num_header_words += 1 -            packet_buff[$num_header_words] = $(XE_MACRO)(boost::uint32_t(if_packet_info.tsf >> 0)); -            #set $num_header_words += 1 -            #set $flags |= (0x1 << 20); -        #end if +        % if pred & tsf_p: +            packet_buff[${num_header_words}] = ${XE_MACRO}(boost::uint32_t(if_packet_info.tsf >> 32));<% num_header_words += 1 %> +            packet_buff[${num_header_words}] = ${XE_MACRO}(boost::uint32_t(if_packet_info.tsf >> 0));<% num_header_words += 1 %><% flags |= (0x1 << 20) %> +        % endif          ########## Burst Flags ########## -        #if $pred & $eob_p -            #set $flags |= (0x1 << 24); -        #end if -        #if $pred & $sob_p -            #set $flags |= (0x1 << 25); -        #end if +<% if pred & eob_p: flags |= (0x1 << 24) %><% if pred & sob_p: flags |= (0x1 << 25) %>          ########## Trailer ########## -        #if $pred & $tlr_p +        % if pred & tlr_p:              {                  const size_t empty_bytes = if_packet_info.num_payload_words32*sizeof(boost::uint32_t) - if_packet_info.num_payload_bytes;                  if_packet_info.tlr = (0x3 << 22) | (occ_table[empty_bytes & 0x3] << 10);              } -            packet_buff[$num_header_words+if_packet_info.num_payload_words32] = $(XE_MACRO)(if_packet_info.tlr); -            #set $flags |= (0x1 << 26); -            #set $num_trailer_words = 1; -        #else -            #set $num_trailer_words = 0; -        #end if +            packet_buff[${num_header_words}+if_packet_info.num_payload_words32] = ${XE_MACRO}(if_packet_info.tlr);<% flags |= (0x1 << 26) %><% num_trailer_words = 1 %> +        % else: +<% num_trailer_words = 0 %> +        % endif          ########## Variables ########## -            if_packet_info.num_header_words32 = $num_header_words; -            if_packet_info.num_packet_words32 = $($num_header_words + $num_trailer_words) + if_packet_info.num_payload_words32; -            vrt_hdr_flags = $hex($flags); +            if_packet_info.num_header_words32 = ${num_header_words}; +            if_packet_info.num_packet_words32 = ${num_header_words + num_trailer_words} + if_packet_info.num_payload_words32; +            vrt_hdr_flags = ${hex(flags)};          break; -    #end for +    % endfor      }      //fill in complete header word @@ -197,9 +176,9 @@ UHD_INLINE void __if_hdr_pack_$(suffix)(  }  /*********************************************************************** - * interal impl of unpacking VRT IF header only + * internal impl of unpacking VRT IF header only   **********************************************************************/ -UHD_INLINE void __if_hdr_unpack_$(suffix)( +UHD_INLINE void __if_hdr_unpack_${suffix}(      const boost::uint32_t *packet_buff,      if_packet_info_t &if_packet_info,      const boost::uint32_t vrt_hdr_word32 @@ -219,86 +198,78 @@ UHD_INLINE void __if_hdr_unpack_$(suffix)(      size_t empty_bytes = 0;      switch(pred){ -    #for $pred in range(2**7) -    case $pred: -        #set $has_time_spec = False -        #set $num_header_words = 1 +    % for pred in range(2**7): +    case ${pred}:<% has_time_spec = False %><% num_header_words = 1 %>          ########## Stream ID ########## -        #if $pred & $sid_p +        % if pred & sid_p:              if_packet_info.has_sid = true; -            if_packet_info.sid = $(XE_MACRO)(packet_buff[$num_header_words]); -            #set $num_header_words += 1 -        #else +            if_packet_info.sid = ${XE_MACRO}(packet_buff[${num_header_words}]);<% num_header_words += 1 %> +        % else:              if_packet_info.has_sid = false; -        #end if +        % endif          ########## Class ID ########## -        #if $pred & $cid_p +        % if pred & cid_p:              if_packet_info.has_cid = true; -            if_packet_info.cid = 0; //not implemented -            #set $num_header_words += 2 -        #else +            if_packet_info.cid = 0; //not implemented<% num_header_words += 2 %> +        % else:              if_packet_info.has_cid = false; -        #end if +        % endif          ########## Integer Time ########## -        #if $pred & $tsi_p +        % if pred & tsi_p:              if_packet_info.has_tsi = true; -            if_packet_info.tsi = $(XE_MACRO)(packet_buff[$num_header_words]); -            #set $num_header_words += 1 -        #else +            if_packet_info.tsi = ${XE_MACRO}(packet_buff[${num_header_words}]); +<% num_header_words += 1 %> +        % else:              if_packet_info.has_tsi = false; -        #end if +        % endif          ########## Fractional Time ########## -        #if $pred & $tsf_p +        % if pred & tsf_p:              if_packet_info.has_tsf = true; -            if_packet_info.tsf = boost::uint64_t($(XE_MACRO)(packet_buff[$num_header_words])) << 32; -            #set $num_header_words += 1 -            if_packet_info.tsf |= $(XE_MACRO)(packet_buff[$num_header_words]); -            #set $num_header_words += 1 -        #else +            if_packet_info.tsf = boost::uint64_t(${XE_MACRO}(packet_buff[${num_header_words}])) << 32;<% num_header_words += 1 %> +            if_packet_info.tsf |= ${XE_MACRO}(packet_buff[${num_header_words}]);<% num_header_words += 1 %> +        % else:              if_packet_info.has_tsf = false; -        #end if +        % endif          ########## Burst Flags ########## -        #if $pred & $eob_p +        % if pred & eob_p:              if_packet_info.eob = true; -        #else +        % else:              if_packet_info.eob = false; -        #end if -        #if $pred & $sob_p +        % endif +        % if pred & sob_p:              if_packet_info.sob = true; -        #else +        % else:              if_packet_info.sob = false; -        #end if +        % endif          ########## Trailer ########## -        #if $pred & $tlr_p +        % if pred & tlr_p:              if_packet_info.has_tlr = true; -            if_packet_info.tlr = $(XE_MACRO)(packet_buff[packet_words32-1]); -            #set $num_trailer_words = 1; +            if_packet_info.tlr = ${XE_MACRO}(packet_buff[packet_words32-1]);<% num_trailer_words = 1 %>              {                  const int indicators = (if_packet_info.tlr >> 20) & (if_packet_info.tlr >> 8);                  if ((indicators & (1 << 0)) != 0) if_packet_info.eob = true;                  if ((indicators & (1 << 1)) != 0) if_packet_info.sob = true;                  empty_bytes = occ_table[(indicators >> 2) & 0x3];              } -        #else -            if_packet_info.has_tlr = false; -            #set $num_trailer_words = 0; -        #end if +        % else: +            if_packet_info.has_tlr = false;<% num_trailer_words = 0 %> +        % endif          ########## Variables ##########              //another failure case -            if (packet_words32 < $($num_header_words + $num_trailer_words)) +            if (packet_words32 < ${num_header_words + num_trailer_words})                  throw uhd::value_error("bad vrt header or invalid packet length"); -            if_packet_info.num_header_words32 = $num_header_words; -            if_packet_info.num_payload_words32 = packet_words32 - $($num_header_words + $num_trailer_words); +            if_packet_info.num_header_words32 = ${num_header_words}; +            if_packet_info.num_payload_words32 = packet_words32 - ${num_header_words + num_trailer_words};              if_packet_info.num_payload_bytes = if_packet_info.num_payload_words32*sizeof(boost::uint32_t) - empty_bytes;          break; -    #end for +    % endfor      }  }  /***********************************************************************   * link layer + VRT IF packing   **********************************************************************/ -void vrt::if_hdr_pack_$(suffix)( +void vrt::if_hdr_pack_${suffix}(      boost::uint32_t *packet_buff,      if_packet_info_t &if_packet_info  ){ @@ -306,29 +277,29 @@ void vrt::if_hdr_pack_$(suffix)(      switch (if_packet_info.link_type)      {      case if_packet_info_t::LINK_TYPE_NONE: -        __if_hdr_pack_$(suffix)(packet_buff, if_packet_info, vrt_hdr_word32); -        packet_buff[0] = $(XE_MACRO)(vrt_hdr_word32); +        __if_hdr_pack_${suffix}(packet_buff, if_packet_info, vrt_hdr_word32); +        packet_buff[0] = ${XE_MACRO}(vrt_hdr_word32);          break;      case if_packet_info_t::LINK_TYPE_CHDR:      { -        __if_hdr_pack_$(suffix)(packet_buff, if_packet_info, vrt_hdr_word32); +        __if_hdr_pack_${suffix}(packet_buff, if_packet_info, vrt_hdr_word32);          const boost::uint32_t chdr = vrt_to_chdr(vrt_hdr_word32, if_packet_info); -        packet_buff[0] = $(XE_MACRO)(chdr); +        packet_buff[0] = ${XE_MACRO}(chdr);          break;      }      case if_packet_info_t::LINK_TYPE_VRLP: -        __if_hdr_pack_$(suffix)(packet_buff+2, if_packet_info, vrt_hdr_word32); +        __if_hdr_pack_${suffix}(packet_buff+2, if_packet_info, vrt_hdr_word32);          if_packet_info.num_header_words32 += 2;          if_packet_info.num_packet_words32 += 3; -        packet_buff[0] = $(XE_MACRO)(VRLP); -        packet_buff[1] = $(XE_MACRO)(boost::uint32_t( +        packet_buff[0] = ${XE_MACRO}(VRLP); +        packet_buff[1] = ${XE_MACRO}(boost::uint32_t(              (if_packet_info.num_packet_words32 & 0xfffff) |              ((if_packet_info.packet_count & 0xfff) << 20)          )); -        packet_buff[2] = $(XE_MACRO)(vrt_hdr_word32); -        packet_buff[if_packet_info.num_packet_words32-1] = $(XE_MACRO)(VEND); +        packet_buff[2] = ${XE_MACRO}(vrt_hdr_word32); +        packet_buff[if_packet_info.num_packet_words32-1] = ${XE_MACRO}(VEND);          break;      }  } @@ -336,7 +307,7 @@ void vrt::if_hdr_pack_$(suffix)(  /***********************************************************************   * link layer + VRT IF unpacking   **********************************************************************/ -void vrt::if_hdr_unpack_$(suffix)( +void vrt::if_hdr_unpack_${suffix}(      const boost::uint32_t *packet_buff,      if_packet_info_t &if_packet_info  ){ @@ -344,16 +315,16 @@ void vrt::if_hdr_unpack_$(suffix)(      switch (if_packet_info.link_type)      {      case if_packet_info_t::LINK_TYPE_NONE: -        vrt_hdr_word32 = $(XE_MACRO)(packet_buff[0]); -        __if_hdr_unpack_$(suffix)(packet_buff, if_packet_info, vrt_hdr_word32); +        vrt_hdr_word32 = ${XE_MACRO}(packet_buff[0]); +        __if_hdr_unpack_${suffix}(packet_buff, if_packet_info, vrt_hdr_word32);          break;      case if_packet_info_t::LINK_TYPE_CHDR:      { -        const boost::uint32_t chdr = $(XE_MACRO)(packet_buff[0]); +        const boost::uint32_t chdr = ${XE_MACRO}(packet_buff[0]);          vrt_hdr_word32 = chdr_to_vrt(chdr, if_packet_info);          size_t packet_count = if_packet_info.packet_count; -        __if_hdr_unpack_$(suffix)(packet_buff, if_packet_info, vrt_hdr_word32); +        __if_hdr_unpack_${suffix}(packet_buff, if_packet_info, vrt_hdr_word32);          if_packet_info.num_payload_bytes -= (~chdr + 1) & 0x3;          if_packet_info.packet_count = packet_count;          break; @@ -361,12 +332,12 @@ void vrt::if_hdr_unpack_$(suffix)(      case if_packet_info_t::LINK_TYPE_VRLP:      { -        if ($(XE_MACRO)(packet_buff[0]) != VRLP) throw uhd::value_error("bad vrl header VRLP"); -        const boost::uint32_t vrl_hdr = $(XE_MACRO)(packet_buff[1]); -        vrt_hdr_word32 = $(XE_MACRO)(packet_buff[2]); +        if (${XE_MACRO}(packet_buff[0]) != VRLP) throw uhd::value_error("bad vrl header VRLP"); +        const boost::uint32_t vrl_hdr = ${XE_MACRO}(packet_buff[1]); +        vrt_hdr_word32 = ${XE_MACRO}(packet_buff[2]);          if (if_packet_info.num_packet_words32 < (vrl_hdr & 0xfffff)) throw uhd::value_error("bad vrl header or packet fragment"); -        if ($(XE_MACRO)(packet_buff[(vrl_hdr & 0xfffff)-1]) != VEND) throw uhd::value_error("bad vrl trailer VEND"); -        __if_hdr_unpack_$(suffix)(packet_buff+2, if_packet_info, vrt_hdr_word32); +        if (${XE_MACRO}(packet_buff[(vrl_hdr & 0xfffff)-1]) != VEND) throw uhd::value_error("bad vrl trailer VEND"); +        __if_hdr_unpack_${suffix}(packet_buff+2, if_packet_info, vrt_hdr_word32);          if_packet_info.num_header_words32 += 2; //add vrl header          if_packet_info.packet_count = (vrl_hdr >> 20) & 0xfff;          break; @@ -375,16 +346,16 @@ void vrt::if_hdr_unpack_$(suffix)(  }  ######################################################################## -#end def +</%def>  ######################################################################## -$gen_code("BE_MACRO", "be") -$gen_code("LE_MACRO", "le") +${gen_code("BE_MACRO", "be")} +${gen_code("LE_MACRO", "le")}  """  def parse_tmpl(_tmpl_text, **kwargs): -    from Cheetah.Template import Template -    return str(Template(_tmpl_text, kwargs)) +    from mako.template import Template +    return Template(_tmpl_text).render(**kwargs)  if __name__ == '__main__':      import sys diff --git a/host/lib/transport/libusb1_base.cpp b/host/lib/transport/libusb1_base.cpp index ae33cc036..9635d34b0 100644 --- a/host/lib/transport/libusb1_base.cpp +++ b/host/lib/transport/libusb1_base.cpp @@ -251,6 +251,21 @@ public:          _claimed.push_back(interface);      } +    void clear_endpoints(unsigned char recv_endpoint, unsigned char send_endpoint) +    { +        int ret; +        ret = libusb_clear_halt(this->get(), recv_endpoint  | 0x80); +        UHD_LOG << "usb device handle: recv endpoint clear: " << libusb_error_name(ret) << std::endl; +        ret = libusb_clear_halt(this->get(), send_endpoint | 0x00); +        UHD_LOG << "usb device handle: send endpoint clear: " << libusb_error_name(ret) << std::endl; +    } + +    void reset_device(void) +    { +        int ret = libusb_reset_device(this->get()); +        UHD_LOG << "usb device handle: dev Reset: " << libusb_error_name(ret) << std::endl; +    } +  private:      libusb::device::sptr _dev; //always keep a reference to device      libusb_device_handle *_handle; @@ -345,15 +360,21 @@ libusb::special_handle::sptr libusb::special_handle::make(device::sptr dev){  std::vector<usb_device_handle::sptr> usb_device_handle::get_device_list(      boost::uint16_t vid, boost::uint16_t pid  ){ -    std::vector<usb_device_handle::sptr> handles; +    return usb_device_handle::get_device_list(std::vector<usb_device_handle::vid_pid_pair_t>(1,usb_device_handle::vid_pid_pair_t(vid,pid))); +} +std::vector<usb_device_handle::sptr> usb_device_handle::get_device_list(const std::vector<usb_device_handle::vid_pid_pair_t>& vid_pid_pair_list) +{ +    std::vector<usb_device_handle::sptr> handles;      libusb::device_list::sptr dev_list = libusb::device_list::make(); -    for (size_t i = 0; i < dev_list->size(); i++){ -        usb_device_handle::sptr handle = libusb::special_handle::make(dev_list->at(i)); -        if (handle->get_vendor_id() == vid and handle->get_product_id() == pid){ -            handles.push_back(handle); -        } +    for(size_t iter = 0; iter < vid_pid_pair_list.size(); ++iter) +    { +       for (size_t i = 0; i < dev_list->size(); i++){ +           usb_device_handle::sptr handle = libusb::special_handle::make(dev_list->at(i)); +           if (handle->get_vendor_id() == vid_pid_pair_list[iter].first and handle->get_product_id() == vid_pid_pair_list[iter].second){ +               handles.push_back(handle); +           } +       }      } -      return handles;  } diff --git a/host/lib/transport/libusb1_base.hpp b/host/lib/transport/libusb1_base.hpp index b00946614..2e16dc176 100644 --- a/host/lib/transport/libusb1_base.hpp +++ b/host/lib/transport/libusb1_base.hpp @@ -135,6 +135,10 @@ namespace libusb {           * Control interface: 0           */          virtual void claim_interface(int) = 0; + +        virtual void clear_endpoints(unsigned char recv_endpoint, unsigned char send_endpoint) = 0; + +        virtual void reset_device(void) = 0;      };      /*! diff --git a/host/lib/transport/libusb1_zero_copy.cpp b/host/lib/transport/libusb1_zero_copy.cpp index 1ac02d16f..465adc95e 100644 --- a/host/lib/transport/libusb1_zero_copy.cpp +++ b/host/lib/transport/libusb1_zero_copy.cpp @@ -148,14 +148,14 @@ public:      UHD_INLINE void submit(void)      { -    	_lut->length = (_is_recv)? _frame_size : size(); //always set length +        _lut->length = (_is_recv)? _frame_size : size(); //always set length  #ifdef UHD_TXRX_DEBUG_PRINTS          result.start_time = boost::get_system_time().time_of_day().total_microseconds();          result.buff_num = num();          result.is_recv = _is_recv;  #endif          const int ret = libusb_submit_transfer(_lut); -        if (ret != 0) throw uhd::runtime_error(str(boost::format( +        if (ret != 0) throw uhd::usb_error(ret, str(boost::format(              "usb %s submit failed: %s") % _name % libusb_error_name(ret)));      } diff --git a/host/lib/transport/nirio/lvbitx/process-lvbitx.py b/host/lib/transport/nirio/lvbitx/process-lvbitx.py index ab9625608..7887c3997 100755 --- a/host/lib/transport/nirio/lvbitx/process-lvbitx.py +++ b/host/lib/transport/nirio/lvbitx/process-lvbitx.py @@ -1,6 +1,6 @@  #!/usr/bin/python  # -# Copyright 2013-2014 Ettus Research LLC +# Copyright 2013-2015 Ettus Research LLC  #  # This program is free software: you can redistribute it and/or modify  # it under the terms of the GNU General Public License as published by @@ -35,7 +35,7 @@ parser.add_option("--output-src-path", type="string", dest="output_src_path", he  # Args  if (len(args) < 1): -    print 'ERROR: Please specify the input LVBITX file name' +    print('ERROR: Please specify the input LVBITX file name')      sys.exit(1)  lvbitx_filename = args[0] @@ -44,16 +44,16 @@ autogen_src_path = os.path.abspath(options.output_src_path) if (options.output_s  class_name = os.path.splitext(os.path.basename(input_filename))[0]  if (not os.path.isfile(input_filename)): -    print 'ERROR: FPGA File ' + input_filename + ' could not be accessed or is not a file.' +    print('ERROR: FPGA File ' + input_filename + ' could not be accessed or is not a file.')      sys.exit(1)  if (options.merge_bin is not None and not os.path.isfile(os.path.abspath(options.merge_bin))): -    print 'ERROR: FPGA Bin File ' + options.merge_bin + ' could not be accessed or is not a file.' +    print('ERROR: FPGA Bin File ' + options.merge_bin + ' could not be accessed or is not a file.')      sys.exit(1)  if (not os.path.exists(autogen_src_path)): -    print 'ERROR: Output path ' + autogen_src_path + ' could not be accessed.' +    print('ERROR: Output path ' + autogen_src_path + ' could not be accessed.')      sys.exit(1)  if (options.output_lvbitx_path is not None and input_filename == os.path.join(autogen_src_path, class_name + '.lvbitx')): -    print 'ERROR: Input and output LVBITX files were the same. Choose a difference input file or output path.' +    print('ERROR: Input and output LVBITX files were the same. Choose a difference input file or output path.')      sys.exit(1)  # Get XML Tree Node @@ -122,7 +122,7 @@ def map_SubType_to_ScalarType(SubType):      elif SubType == 'U64':          ScalarType = 'RIO_SCALAR_TYPE_UQ'      else: -        print 'ERROR: No corresponding nirio_scalar_type_t value for SubType ' + SubType + ' .' +        print('ERROR: No corresponding nirio_scalar_type_t value for SubType ' + SubType + ' .')          sys.exit(1)      return ScalarType; @@ -187,7 +187,7 @@ codegen_transform['lvbitx_signature'] = str.upper(root.find('SignatureRegister')  # Write BIN file  bitstream = base64.b64decode(root.find('Bitstream').text)  if (options.output_lvbitx_path is not None and hashlib.md5(bitstream).hexdigest() != root.find('BitstreamMD5').text): -    print 'ERROR: The MD5 sum for the output LVBITX was incorrect. Make sure that the bitstream in the input LVBITX or BIN file is valid.' +    print('ERROR: The MD5 sum for the output LVBITX was incorrect. Make sure that the bitstream in the input LVBITX or BIN file is valid.')      sys.exit(1)  if (options.output_bin):      fpga_bin_file = open(os.path.join(options.output_lvbitx_path, class_name + '.bin'), 'w') diff --git a/host/lib/transport/nirio/rpc/rpc_client.cpp b/host/lib/transport/nirio/rpc/rpc_client.cpp index cf8e9c1a9..bbaf9f235 100644 --- a/host/lib/transport/nirio/rpc/rpc_client.cpp +++ b/host/lib/transport/nirio/rpc/rpc_client.cpp @@ -52,7 +52,7 @@ rpc_client::rpc_client (          //- address_configured: Only return addresses if a non-loopback address is configured for the system.          //- numeric_host: No name resolution should be attempted for host          //- numeric_service: No name resolution should be attempted for service -        tcp::resolver::query::flags query_flags; +        tcp::resolver::query::flags query_flags(tcp::resolver::query::passive);          tcp::resolver::query query(tcp::v4(), server, port, query_flags);          tcp::resolver::iterator iterator = resolver.resolve(query); diff --git a/host/lib/transport/super_recv_packet_handler.hpp b/host/lib/transport/super_recv_packet_handler.hpp index 5c84327a4..c3c2b8e97 100644 --- a/host/lib/transport/super_recv_packet_handler.hpp +++ b/host/lib/transport/super_recv_packet_handler.hpp @@ -147,7 +147,7 @@ public:       */      void set_xport_chan_get_buff(const size_t xport_chan, const get_buff_type &get_buff, const bool flush = false){          if (flush){ -            while (get_buff(0.0)); +            while (get_buff(0.0)) {};          }          _props.at(xport_chan).get_buff = get_buff;      } | 
