aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/usrp2
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/usrp2')
-rw-r--r--host/lib/usrp/usrp2/fw_common.h21
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp8
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp1
3 files changed, 26 insertions, 4 deletions
diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h
index b25316217..640b37ec6 100644
--- a/host/lib/usrp/usrp2/fw_common.h
+++ b/host/lib/usrp/usrp2/fw_common.h
@@ -32,6 +32,10 @@ extern "C" {
#define _SINS_
#endif
+//defines the protocol version in this shared header
+//increment this value when the protocol is changed
+#define USRP2_PROTO_VERSION 1
+
//used to differentiate control packets over data port
#define USRP2_INVALID_VRT_HEADER 0
@@ -78,21 +82,25 @@ typedef enum{
USRP2_CTRL_ID_PEEK_AT_THIS_REGISTER_FOR_ME_BRO = 'r',
USRP2_CTRL_ID_WOAH_I_DEFINITELY_PEEKED_IT_DUDE = 'R',
+ USRP2_CTRL_ID_WHATS_THE_HARDWARE_REV_NOS_BRO = 'y',
+ USRP2_CTRL_ID_TAKE_THE_HARDWARE_REV_NOS_DUDE = 'Y',
+
USRP2_CTRL_ID_PEACE_OUT = '~'
} usrp2_ctrl_id_t;
typedef enum{
- USRP2_DIR_RX,
- USRP2_DIR_TX
+ USRP2_DIR_RX = 'r',
+ USRP2_DIR_TX = 't'
} usrp2_dir_which_t;
typedef enum{
- USRP2_CLK_EDGE_RISE,
- USRP2_CLK_EDGE_FALL
+ USRP2_CLK_EDGE_RISE = 'r',
+ USRP2_CLK_EDGE_FALL = 'f'
} usrp2_clk_edge_t;
typedef struct{
+ _SINS_ uint32_t proto_ver;
_SINS_ uint32_t id;
_SINS_ uint32_t seq;
union{
@@ -129,6 +137,11 @@ typedef struct{
_SINS_ uint32_t data;
_SINS_ uint8_t num_bytes; //1, 2, 4
} poke_args;
+ struct {
+ _SINS_ uint8_t major;
+ _SINS_ uint8_t minor;
+ _SINS_ uint8_t _pad[2];
+ } hw_rev;
} data;
} usrp2_ctrl_data_t;
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index 742c53a14..1b0dde1b4 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -97,6 +97,7 @@ public:
//fill in the seq number and send
usrp2_ctrl_data_t out_copy = out_data;
+ out_copy.proto_ver = htonl(USRP2_PROTO_VERSION);
out_copy.seq = htonl(++_ctrl_seq_num);
_ctrl_transport->send(boost::asio::buffer(&out_copy, sizeof(usrp2_ctrl_data_t)));
@@ -104,6 +105,13 @@ public:
while(true){
usrp2_ctrl_data_t in_data;
size_t len = _ctrl_transport->recv(boost::asio::buffer(&in_data, sizeof(in_data)));
+ if(len >= sizeof(boost::uint32_t) and ntohl(in_data.proto_ver) != USRP2_PROTO_VERSION){
+ throw std::runtime_error(str(
+ boost::format("Expected protocol version %d, but got %d\n"
+ "The firmware build does not match the host code build."
+ ) % int(USRP2_PROTO_VERSION) % ntohl(in_data.proto_ver)
+ ));
+ }
if (len >= sizeof(usrp2_ctrl_data_t) and ntohl(in_data.seq) == _ctrl_seq_num){
return in_data;
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 3bdc5bd02..0fa56c339 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -70,6 +70,7 @@ uhd::device_addrs_t usrp2::find(const device_addr_t &hint){
//send a hello control packet
usrp2_ctrl_data_t ctrl_data_out;
+ ctrl_data_out.proto_ver = htonl(USRP2_PROTO_VERSION);
ctrl_data_out.id = htonl(USRP2_CTRL_ID_GIVE_ME_YOUR_IP_ADDR_BRO);
udp_transport->send(boost::asio::buffer(&ctrl_data_out, sizeof(ctrl_data_out)));