summaryrefslogtreecommitdiffstats
path: root/host/lib/usrp
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2010-07-09 17:56:19 +0000
committerJosh Blum <josh@joshknows.com>2010-07-09 17:56:19 +0000
commit8dd01e451e9102db06daed171c18d9fbb848df97 (patch)
tree2965e6ca706cd140b637d7a44617f55c0e3b5649 /host/lib/usrp
parentad511bd81d726918a11ab1218a4bc48f8eaf6efe (diff)
parentecd7308793ad639880faf2a44f3b8b603d87c7fd (diff)
downloaduhd-8dd01e451e9102db06daed171c18d9fbb848df97.tar.gz
uhd-8dd01e451e9102db06daed171c18d9fbb848df97.tar.bz2
uhd-8dd01e451e9102db06daed171c18d9fbb848df97.zip
Merge branch 'error_handling' of ettus.sourcerepo.com:ettus/uhdpriv into usrp_e
Diffstat (limited to 'host/lib/usrp')
-rw-r--r--host/lib/usrp/usrp2/fw_common.h53
-rw-r--r--host/lib/usrp/usrp2/io_impl.cpp4
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp9
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp19
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp16
5 files changed, 53 insertions, 48 deletions
diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h
index 4c66aa41e..fd728e393 100644
--- a/host/lib/usrp/usrp2/fw_common.h
+++ b/host/lib/usrp/usrp2/fw_common.h
@@ -24,18 +24,14 @@
* Therefore, this header may only contain valid C code.
*/
#ifdef __cplusplus
-#include <boost/cstdint.hpp>
-#define _SINS_ boost:://stdint namespace when in c++
+ #include <boost/cstdint.hpp>
+ #define __stdint(type) boost::type
extern "C" {
#else
-#include <stdint.h>
-#define _SINS_
+ #include <stdint.h>
+ #define __stdint(type) type
#endif
-// define limits on bytes per udp packet
-#define USRP2_MTU_BYTES 1500
-#define USRP2_UDP_BYTES ((USRP2_MTU_BYTES) - (2 + 14 + 20 + 8)) //size of headers (pad, eth, ip, udp)
-
//defines the protocol version in this shared header
//increment this value when the protocol is changed
#define USRP2_PROTO_VERSION 5
@@ -43,10 +39,6 @@ extern "C" {
//used to differentiate control packets over data port
#define USRP2_INVALID_VRT_HEADER 0
-// size of the vrt header and trailer to the host
-#define USRP2_HOST_RX_VRT_HEADER_WORDS32 5
-#define USRP2_HOST_RX_VRT_TRAILER_WORDS32 1 //FIXME fpga sets wrong header size when no trailer present
-
// udp ports for the usrp2 communication
// Dynamic and/or private ports: 49152-65535
#define USRP2_UDP_CTRL_PORT 49152
@@ -90,34 +82,35 @@ typedef enum{
} usrp2_clk_edge_t;
typedef struct{
- _SINS_ uint32_t proto_ver;
- _SINS_ uint32_t id;
- _SINS_ uint32_t seq;
+ __stdint(uint32_t) proto_ver;
+ __stdint(uint32_t) id;
+ __stdint(uint32_t) seq;
union{
- _SINS_ uint32_t ip_addr;
+ __stdint(uint32_t) ip_addr;
struct {
- _SINS_ uint8_t dev;
- _SINS_ uint8_t miso_edge;
- _SINS_ uint8_t mosi_edge;
- _SINS_ uint8_t readback;
- _SINS_ uint32_t data;
- _SINS_ uint8_t num_bits;
+ __stdint(uint8_t) dev;
+ __stdint(uint8_t) miso_edge;
+ __stdint(uint8_t) mosi_edge;
+ __stdint(uint8_t) readback;
+ __stdint(uint32_t) data;
+ __stdint(uint8_t) num_bits;
} spi_args;
struct {
- _SINS_ uint8_t addr;
- _SINS_ uint8_t bytes;
- _SINS_ uint8_t data[20];
+ __stdint(uint8_t) addr;
+ __stdint(uint8_t) bytes;
+ __stdint(uint8_t) data[20];
} i2c_args;
struct {
- _SINS_ uint32_t addr;
- _SINS_ uint32_t data;
- _SINS_ uint32_t addrhi;
- _SINS_ uint32_t datahi;
- _SINS_ uint8_t num_bytes; //1, 2, 4, 8
+ __stdint(uint32_t) addr;
+ __stdint(uint32_t) data;
+ __stdint(uint32_t) addrhi;
+ __stdint(uint32_t) datahi;
+ __stdint(uint8_t) num_bytes; //1, 2, 4, 8
} poke_args;
} data;
} usrp2_ctrl_data_t;
+#undef __stdint
#ifdef __cplusplus
}
#endif
diff --git a/host/lib/usrp/usrp2/io_impl.cpp b/host/lib/usrp/usrp2/io_impl.cpp
index c96528694..0853f48be 100644
--- a/host/lib/usrp/usrp2/io_impl.cpp
+++ b/host/lib/usrp/usrp2/io_impl.cpp
@@ -135,7 +135,7 @@ void usrp2_impl::io_init(void){
for (size_t i = 0; i < _data_transports.size(); i++){
_io_impl->recv_pirate_crew.create_thread(boost::bind(
&usrp2_impl::io_impl::recv_pirate_loop,
- _io_impl, _data_transports.at(i),
+ _io_impl.get(), _data_transports.at(i),
_mboards.at(i), i
));
}
@@ -195,6 +195,6 @@ size_t usrp2_impl::recv(
io_type, _io_helper.get_rx_otw_type(), //input and output types to convert
_mboards.front()->get_master_clock_freq(), //master clock tick rate
uhd::transport::vrt::if_hdr_unpack_be,
- boost::bind(&usrp2_impl::io_impl::get_recv_buffs, _io_impl, _1)
+ boost::bind(&usrp2_impl::io_impl::get_recv_buffs, _io_impl.get(), _1)
);
}
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index 8552edd1f..eaaa722ac 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -26,13 +26,14 @@
#include <algorithm>
using namespace uhd;
+using namespace uhd::transport;
class usrp2_iface_impl : public usrp2_iface{
public:
/***********************************************************************
* Structors
**********************************************************************/
- usrp2_iface_impl(transport::udp_simple::sptr ctrl_transport){
+ usrp2_iface_impl(udp_simple::sptr ctrl_transport){
_ctrl_transport = ctrl_transport;
}
@@ -160,7 +161,7 @@ public:
_ctrl_transport->send(boost::asio::buffer(&out_copy, sizeof(usrp2_ctrl_data_t)));
//loop until we get the packet or timeout
- boost::uint8_t usrp2_ctrl_data_in_mem[USRP2_UDP_BYTES]; //allocate max bytes for recv
+ boost::uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; //allocate max bytes for recv
const usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<const usrp2_ctrl_data_t *>(usrp2_ctrl_data_in_mem);
while(true){
size_t len = _ctrl_transport->recv(boost::asio::buffer(usrp2_ctrl_data_in_mem));
@@ -182,7 +183,7 @@ public:
private:
//this lovely lady makes it all possible
- transport::udp_simple::sptr _ctrl_transport;
+ udp_simple::sptr _ctrl_transport;
//used in send/recv
boost::mutex _ctrl_mutex;
@@ -222,6 +223,6 @@ private:
/***********************************************************************
* Public make function for usrp2 interface
**********************************************************************/
-usrp2_iface::sptr usrp2_iface::make(transport::udp_simple::sptr ctrl_transport){
+usrp2_iface::sptr usrp2_iface::make(udp_simple::sptr ctrl_transport){
return usrp2_iface::sptr(new usrp2_iface_impl(ctrl_transport));
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 3402c26b1..02f53bc69 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -99,8 +99,8 @@ static uhd::device_addrs_t usrp2_find(const device_addr_t &hint){
udp_transport->send(boost::asio::buffer(&ctrl_data_out, sizeof(ctrl_data_out)));
//loop and recieve until the timeout
- boost::uint8_t usrp2_ctrl_data_in_mem[USRP2_UDP_BYTES]; //allocate max bytes for recv
- usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<usrp2_ctrl_data_t *>(usrp2_ctrl_data_in_mem);
+ boost::uint8_t usrp2_ctrl_data_in_mem[udp_simple::mtu]; //allocate max bytes for recv
+ const usrp2_ctrl_data_t *ctrl_data_in = reinterpret_cast<const usrp2_ctrl_data_t *>(usrp2_ctrl_data_in_mem);
while(true){
size_t len = udp_transport->recv(asio::buffer(usrp2_ctrl_data_in_mem));
//std::cout << len << "\n";
@@ -127,14 +127,25 @@ static uhd::device_addrs_t usrp2_find(const device_addr_t &hint){
/***********************************************************************
* Make
**********************************************************************/
+template <typename out_type, typename in_type>
+out_type lexical_cast(const in_type &in){
+ try{
+ return boost::lexical_cast<out_type>(in);
+ }catch(...){
+ throw std::runtime_error(str(boost::format(
+ "failed to cast \"%s\" to type \"%s\""
+ ) % boost::lexical_cast<std::string>(in) % typeid(out_type).name()));
+ }
+}
+
static device::sptr usrp2_make(const device_addr_t &device_addr){
//extract the receive and send buffer sizes
size_t recv_buff_size = 0, send_buff_size= 0 ;
if (device_addr.has_key("recv_buff_size")){
- recv_buff_size = size_t(boost::lexical_cast<double>(device_addr["recv_buff_size"]));
+ recv_buff_size = size_t(lexical_cast<double>(device_addr["recv_buff_size"]));
}
if (device_addr.has_key("send_buff_size")){
- send_buff_size = size_t(boost::lexical_cast<double>(device_addr["send_buff_size"]));
+ send_buff_size = size_t(lexical_cast<double>(device_addr["send_buff_size"]));
}
//create a ctrl and data transport for each address
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 42630a3e4..186516447 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -32,6 +32,7 @@
#include <boost/shared_ptr.hpp>
#include <boost/function.hpp>
#include <uhd/transport/vrt_if_packet.hpp>
+#include <uhd/transport/udp_simple.hpp> //mtu
#include <uhd/transport/udp_zero_copy.hpp>
#include <uhd/usrp/dboard_manager.hpp>
@@ -106,15 +107,14 @@ public:
private:
uhd::otw_type_t _rx_otw_type, _tx_otw_type;
- static const size_t _max_rx_bytes_per_packet =
- USRP2_UDP_BYTES -
- USRP2_HOST_RX_VRT_HEADER_WORDS32*sizeof(boost::uint32_t) -
- USRP2_HOST_RX_VRT_TRAILER_WORDS32*sizeof(boost::uint32_t)
+ static const size_t _max_rx_bytes_per_packet = uhd::transport::udp_simple::mtu
+ - uhd::transport::vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ - sizeof(uhd::transport::vrt::if_packet_info_t().tlr) //forced to have trailer
+ + sizeof(uhd::transport::vrt::if_packet_info_t().cid) //no class id ever used
;
- static const size_t _max_tx_bytes_per_packet =
- USRP2_UDP_BYTES -
- uhd::transport::vrt::max_if_hdr_words32*sizeof(boost::uint32_t) -
- sizeof(uhd::transport::vrt::if_packet_info_t().cid) //no class id ever used
+ static const size_t _max_tx_bytes_per_packet = uhd::transport::udp_simple::mtu
+ - uhd::transport::vrt::max_if_hdr_words32*sizeof(boost::uint32_t)
+ + sizeof(uhd::transport::vrt::if_packet_info_t().cid) //no class id ever used
;
};