summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--firmware/zpu/apps/txrx_uhd.c44
-rw-r--r--firmware/zpu/lib/net_common.c2
-rw-r--r--firmware/zpu/lib/udp_uart.c115
-rw-r--r--firmware/zpu/lib/udp_uart.h36
-rw-r--r--firmware/zpu/usrp2/CMakeLists.txt1
-rw-r--r--firmware/zpu/usrp2p/CMakeLists.txt1
-rw-r--r--host/include/uhd/transport/udp_simple.hpp8
-rw-r--r--host/include/uhd/types/serial.hpp8
-rw-r--r--host/include/uhd/usrp/gps_ctrl.hpp13
-rw-r--r--host/lib/transport/udp_simple.cpp46
-rw-r--r--host/lib/usrp/gps_ctrl.cpp32
-rw-r--r--host/lib/usrp/usrp2/fw_common.h13
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.cpp60
-rw-r--r--host/lib/usrp/usrp2/usrp2_iface.hpp9
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.cpp9
-rw-r--r--host/lib/usrp/usrp2/usrp2_impl.hpp2
16 files changed, 254 insertions, 145 deletions
diff --git a/firmware/zpu/apps/txrx_uhd.c b/firmware/zpu/apps/txrx_uhd.c
index 9d0a28b58..f9eedfc7d 100644
--- a/firmware/zpu/apps/txrx_uhd.c
+++ b/firmware/zpu/apps/txrx_uhd.c
@@ -72,12 +72,6 @@ static void handle_udp_data_packet(
sr_tx_ctrl->cyc_per_up = 0;
break;
- case USRP2_UDP_UART_BASE_PORT+0:
- case USRP2_UDP_UART_BASE_PORT+1:
- case USRP2_UDP_UART_BASE_PORT+2:
- turn_off_uart(src.port-USRP2_UDP_UART_BASE_PORT);
- break;
-
default: return;
}
@@ -116,7 +110,7 @@ static void handle_udp_ctrl_packet(
//ensure that the protocol versions match
if (payload_len >= sizeof(uint32_t) && ctrl_data_in->proto_ver != USRP2_FW_COMPAT_NUM){
- printf("!Error in control packet handler: Expected compatibility number %d, but got %d\n",
+ if (ctrl_data_in->proto_ver) printf("!Error in control packet handler: Expected compatibility number %d, but got %d\n",
USRP2_FW_COMPAT_NUM, ctrl_data_in->proto_ver
);
ctrl_data_in_id = USRP2_CTRL_ID_WAZZUP_BRO;
@@ -228,32 +222,6 @@ static void handle_udp_ctrl_packet(
break;
/*******************************************************************
- * UART Control
- ******************************************************************/
-/*
- case USRP2_CTRL_ID_SO_LIKE_CAN_YOU_READ_THIS_UART_BRO:{
- //executes a readline()-style read, up to num_bytes long, up to and including newline
- int num_bytes = ctrl_data_in->data.uart_args.bytes;
- if(num_bytes > 20) num_bytes = 20;
- num_bytes = fngets_noblock(ctrl_data_in->data.uart_args.dev, (char *) ctrl_data_out.data.uart_args.data, num_bytes);
- ctrl_data_out.id = USRP2_CTRL_ID_I_HELLA_READ_THAT_UART_DUDE;
- ctrl_data_out.data.uart_args.bytes = num_bytes;
- break;
- }
-
- case USRP2_CTRL_ID_HEY_WRITE_THIS_UART_FOR_ME_BRO:{
- int num_bytes = ctrl_data_in->data.uart_args.bytes;
- if(num_bytes > 20) num_bytes = 20;
- //before we write to the UART, we flush the receive buffer
- //this assumes that we're interested in the reply
- hal_uart_rx_flush(ctrl_data_in->data.uart_args.dev);
- fnputstr(ctrl_data_in->data.uart_args.dev, (char *) ctrl_data_in->data.uart_args.data, num_bytes);
- ctrl_data_out.id = USRP2_CTRL_ID_MAN_I_TOTALLY_WROTE_THAT_UART_DUDE;
- ctrl_data_out.data.uart_args.bytes = num_bytes;
- break;
- }
-*/
- /*******************************************************************
* Echo test
******************************************************************/
case USRP2_CTRL_ID_HOLLER_AT_ME_BRO:
@@ -347,11 +315,10 @@ main(void)
#ifdef USRP2P
register_udp_listener(USRP2_UDP_UPDATE_PORT, handle_udp_fw_update_packet);
- int i;
- for(i=0; i<NUM_UARTS; i++)
- register_udp_listener(USRP2_UDP_UART_BASE_PORT+i, handle_uart_data_packet);
#endif
+ udp_uart_init(USRP2_UDP_UART_BASE_PORT); //setup uart messaging
+
//3) set the routing mode to slave to set defaults
pkt_ctrl_set_routing_mode(PKT_CTRL_ROUTING_MODE_SLAVE);
@@ -368,10 +335,7 @@ main(void)
pkt_ctrl_release_incoming_buffer();
}
-#ifdef USRP2P
- //look for incoming data on the four UARTs and handle it
- poll_uarts();
-#endif
+ udp_uart_poll(); //uart message handling
pic_interrupt_handler();
/*
diff --git a/firmware/zpu/lib/net_common.c b/firmware/zpu/lib/net_common.c
index 698ed97f4..42e365393 100644
--- a/firmware/zpu/lib/net_common.c
+++ b/firmware/zpu/lib/net_common.c
@@ -201,7 +201,7 @@ send_pkt(
//create a list of all buffers to copy
const void *buffs[] = {&ctrl_word, &ehdr, buf0, buf1, buf2};
- size_t lens[] = {sizeof(ctrl_word), sizeof(ehdr), len0, len1, len2};
+ size_t lens[] = {sizeof(ctrl_word), sizeof(ehdr), len0, len1, (len2 + 3) & ~3};
//copy each buffer into the out buffer
for (size_t i = 0; i < sizeof(buffs)/sizeof(buffs[0]); i++){
diff --git a/firmware/zpu/lib/udp_uart.c b/firmware/zpu/lib/udp_uart.c
new file mode 100644
index 000000000..6f6b9ee91
--- /dev/null
+++ b/firmware/zpu/lib/udp_uart.c
@@ -0,0 +1,115 @@
+/*
+ * Copyright 2011 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 "udp_uart.h"
+#include "hal_uart.h"
+#include "net_common.h"
+#include "compiler.h"
+#include <stdbool.h>
+
+/***********************************************************************
+ * Constants
+ **********************************************************************/
+#define MAX_NUM_UARTS 4
+#ifndef UDP_UART_MASK
+ #error missing definition for UDP_UART_MASK enable mask
+#endif
+static const size_t num_idle_cyc_b4_flush = 11; //small but lucky number
+
+/***********************************************************************
+ * Globals
+ **********************************************************************/
+static uint16_t _base_port;
+
+typedef struct{
+ struct socket_address dst;
+ _AL4 uint8_t buf[256];
+ size_t len; //length of buffer
+ size_t cyc; //idle cycle count
+} udp_uart_state_t;
+
+static udp_uart_state_t _states[MAX_NUM_UARTS];
+
+/***********************************************************************
+ * UDP handler for UARTs
+ **********************************************************************/
+static void handle_uart_data_packet(
+ struct socket_address src, struct socket_address dst,
+ unsigned char *payload, int payload_len
+){
+ //handle ICMP destination unreachable
+ if (payload == NULL){
+ const size_t which = src.port-_base_port;
+ if (which >= MAX_NUM_UARTS) return;
+ _states[which].dst.port = 0;
+ }
+
+ //handle a regular blocking UART write
+ else{
+ const size_t which = dst.port-_base_port;
+ if (which >= MAX_NUM_UARTS) return;
+ _states[which].dst = src;
+ for (size_t i = 0; i < payload_len; i++){
+ hal_uart_putc((hal_uart_name_t)which, (int)payload[i]);
+ }
+ }
+}
+
+/***********************************************************************
+ * Public init function
+ **********************************************************************/
+void udp_uart_init(const uint16_t base_port){
+ _base_port = base_port;
+ for(size_t i = 0; i < MAX_NUM_UARTS; i++){
+ _states[i].dst.port = 0; //reset to null port
+ _states[i].len = 0;
+ _states[i].cyc = 0;
+ register_udp_listener(_base_port+i, handle_uart_data_packet);
+ }
+}
+
+/***********************************************************************
+ * Public poll function
+ **********************************************************************/
+void udp_uart_poll(void){
+ for (size_t i = 0; i < MAX_NUM_UARTS; i++){
+ if (((UDP_UART_MASK) & (1 << i)) == 0) continue;
+
+ bool newline = false;
+ udp_uart_state_t *state = &_states[i];
+
+ //read all characters we can without blocking
+ for (size_t j = state->len; j < sizeof(_states[0].buf); j++){
+ uint8_t ch = hal_uart_getc_noblock((hal_uart_name_t)i);
+ if (ch == 255) break;
+ if (ch == '\n' || ch == '\r') newline = true;
+ state->buf[j] = ch;
+ state->len++;
+ state->cyc = 0; //reset idle cycles
+ }
+
+ //nothing in buffer, continue to next uart
+ if (state->len == 0) continue;
+
+ //send out a message if newline or forced flush
+ if (newline || state->cyc++ > num_idle_cyc_b4_flush){
+ if (state->dst.port != 0) send_udp_pkt(_base_port+i, state->dst, state->buf, state->len);
+ state->len = 0;
+ state->cyc = 0;
+ }
+ }
+}
diff --git a/firmware/zpu/lib/udp_uart.h b/firmware/zpu/lib/udp_uart.h
new file mode 100644
index 000000000..d448e7611
--- /dev/null
+++ b/firmware/zpu/lib/udp_uart.h
@@ -0,0 +1,36 @@
+/*
+ * Copyright 2011 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/>.
+ */
+
+#ifndef INCLUDED_UDP_UART_H
+#define INCLUDED_UDP_UART_H
+
+#include <stdint.h>
+
+/*!
+ * Initialize the UDP/UART module.
+ * Registers handler into the network.
+ * \param base_port the source port for UART0
+ */
+void udp_uart_init(const uint16_t base_port);
+
+/*!
+ * Polls the UART state machine,
+ * and sends messages over UDP.
+ */
+void udp_uart_poll(void);
+
+#endif /* INCLUDED_UDP_UART_H */
diff --git a/firmware/zpu/usrp2/CMakeLists.txt b/firmware/zpu/usrp2/CMakeLists.txt
index 190ea9af1..3662532f1 100644
--- a/firmware/zpu/usrp2/CMakeLists.txt
+++ b/firmware/zpu/usrp2/CMakeLists.txt
@@ -20,6 +20,7 @@ INCLUDE(${CMAKE_SOURCE_DIR}/lib/CMakeLists.txt)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
ADD_DEFINITIONS(-DUSRP2)
+ADD_DEFINITIONS(-DUDP_UART_MASK=0)
ADD_LIBRARY(libusrp2fw STATIC
${COMMON_SRCS}
diff --git a/firmware/zpu/usrp2p/CMakeLists.txt b/firmware/zpu/usrp2p/CMakeLists.txt
index 976dccb9a..4cb663742 100644
--- a/firmware/zpu/usrp2p/CMakeLists.txt
+++ b/firmware/zpu/usrp2p/CMakeLists.txt
@@ -20,6 +20,7 @@ INCLUDE(${CMAKE_SOURCE_DIR}/lib/CMakeLists.txt)
INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR})
ADD_DEFINITIONS(-DUSRP2P)
+ADD_DEFINITIONS(-DUDP_UART_MASK=4) #GPS=UART2 streaming enabled
ADD_LIBRARY(libusrp2pfw STATIC
${COMMON_SRCS}
diff --git a/host/include/uhd/transport/udp_simple.hpp b/host/include/uhd/transport/udp_simple.hpp
index 83f895ba9..83d1072ee 100644
--- a/host/include/uhd/transport/udp_simple.hpp
+++ b/host/include/uhd/transport/udp_simple.hpp
@@ -19,6 +19,7 @@
#define INCLUDED_UHD_TRANSPORT_UDP_SIMPLE_HPP
#include <uhd/config.hpp>
+#include <uhd/types/serial.hpp>
#include <boost/asio/buffer.hpp>
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
@@ -62,6 +63,13 @@ public:
static sptr make_broadcast(const std::string &addr, const std::string &port);
/*!
+ * Make a UART interface from a UDP transport.
+ * \param udp the UDP transport object
+ * \return a new UART interface
+ */
+ static uart_iface::sptr make_uart(sptr udp);
+
+ /*!
* Send a single buffer.
* Blocks until the data is sent.
* \param buff single asio buffer
diff --git a/host/include/uhd/types/serial.hpp b/host/include/uhd/types/serial.hpp
index 8a5ed1c32..f66822775 100644
--- a/host/include/uhd/types/serial.hpp
+++ b/host/include/uhd/types/serial.hpp
@@ -184,17 +184,17 @@ namespace uhd{
/*!
* Write to a serial port.
- * \param dev which UART to write to
* \param buf the data to write
*/
- virtual void write_uart(boost::uint8_t dev, const std::string &buf) = 0;
+ virtual void write_uart(const std::string &buf) = 0;
/*!
* Read from a serial port.
- * \param dev which UART to read from
+ * Reads until complete line or timeout.
+ * \param timeout the timeout in seconds
* \return the data read from the serial port
*/
- virtual std::string read_uart(boost::uint8_t dev) = 0;
+ virtual std::string read_uart(double timeout) = 0;
};
} //namespace uhd
diff --git a/host/include/uhd/usrp/gps_ctrl.hpp b/host/include/uhd/usrp/gps_ctrl.hpp
index 6ff00e03c..3b643a30c 100644
--- a/host/include/uhd/usrp/gps_ctrl.hpp
+++ b/host/include/uhd/usrp/gps_ctrl.hpp
@@ -18,17 +18,14 @@
#ifndef INCLUDED_GPS_CTRL_HPP
#define INCLUDED_GPS_CTRL_HPP
+#include <uhd/types/serial.hpp>
+#include <uhd/types/sensors.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/utility.hpp>
#include <boost/function.hpp>
-#include <boost/date_time/posix_time/posix_time_types.hpp>
#include <vector>
-#include <uhd/types/sensors.hpp>
-using namespace boost::posix_time;
-
-typedef boost::function<void(std::string)> gps_send_fn_t;
-typedef boost::function<std::string(void)> gps_recv_fn_t;
+namespace uhd{
class gps_ctrl : boost::noncopyable{
public:
@@ -37,7 +34,7 @@ public:
/*!
* Make a GPS config for Jackson Labs or generic NMEA GPS devices
*/
- static sptr make(gps_send_fn_t, gps_recv_fn_t);
+ static sptr make(uart_iface::sptr uart);
/*!
* Retrieve the list of sensors this GPS object provides
@@ -59,4 +56,6 @@ public:
};
+} //namespace uhd
+
#endif /* INCLUDED_GPS_CTRL_HPP */
diff --git a/host/lib/transport/udp_simple.cpp b/host/lib/transport/udp_simple.cpp
index ed778fbf4..bc1bdaf2f 100644
--- a/host/lib/transport/udp_simple.cpp
+++ b/host/lib/transport/udp_simple.cpp
@@ -81,3 +81,49 @@ udp_simple::sptr udp_simple::make_broadcast(
){
return sptr(new udp_simple_impl(addr, port, true, false /* bcast, no connect */));
}
+
+/***********************************************************************
+ * Simple UART over UDP
+ **********************************************************************/
+#include <boost/thread/thread.hpp>
+class udp_simple_uart_impl : public uhd::uart_iface{
+public:
+ udp_simple_uart_impl(udp_simple::sptr udp){
+ _udp = udp;
+ _len = 0;
+ _off = 0;
+ this->write_uart(""); //send an empty packet to init
+ }
+
+ void write_uart(const std::string &buf){
+ _udp->send(asio::buffer(buf));
+ }
+
+ std::string read_uart(double timeout){
+ std::string line;
+ const boost::system_time exit_time = boost::get_system_time() + boost::posix_time::milliseconds(long(timeout*1000));
+ do{
+ //drain anything in current buffer
+ while (_off < _len){
+ const char ch = _buf[_off]; _off++;
+ line += std::string(1, ch);
+ if (ch == '\n' or ch == '\r') return line;
+ }
+
+ //recv a new packet into the buffer
+ _len = _udp->recv(asio::buffer(_buf), std::max((exit_time - boost::get_system_time()).total_milliseconds()/1000., 0.0));
+ _off = 0;
+
+ } while (_len != 0);
+ return line;
+ }
+
+private:
+ udp_simple::sptr _udp;
+ size_t _len, _off;
+ boost::uint8_t _buf[udp_simple::mtu];
+};
+
+uhd::uart_iface::sptr udp_simple::make_uart(sptr udp){
+ return uart_iface::sptr(new udp_simple_uart_impl(udp));
+}
diff --git a/host/lib/usrp/gps_ctrl.cpp b/host/lib/usrp/gps_ctrl.cpp
index 342b0e2fe..96cb76ffc 100644
--- a/host/lib/usrp/gps_ctrl.cpp
+++ b/host/lib/usrp/gps_ctrl.cpp
@@ -40,19 +40,18 @@ using namespace boost::this_thread;
class gps_ctrl_impl : public gps_ctrl{
public:
- gps_ctrl_impl(gps_send_fn_t send, gps_recv_fn_t recv){
- _send = send;
- _recv = recv;
+ gps_ctrl_impl(uart_iface::sptr uart){
+ _uart = uart;
std::string reply;
bool i_heard_some_nmea = false, i_heard_something_weird = false;
gps_type = GPS_TYPE_NONE;
//first we look for a Jackson Labs Firefly (since that's what we provide...)
- _recv(); //get whatever junk is in the rx buffer right now, and throw it away
+ _flush(); //get whatever junk is in the rx buffer right now, and throw it away
_send("HAAAY GUYYYYS\n"); //to elicit a response from the Firefly
- //wait for _send(...) to return
+ //wait for _send(...) to return
sleep(milliseconds(FIREFLY_STUPID_DELAY_MS));
//then we loop until we either timeout, or until we get a response that indicates we're a JL device
@@ -155,7 +154,7 @@ private:
return std::string();
}
- while(_recv().size() != 0) sleep(milliseconds(GPS_TIMEOUT_DELAY_MS));
+ _flush(); //flush all input before waiting for a message
int timeout = GPS_TIMEOUT_TRIES;
while(timeout--) {
@@ -242,8 +241,21 @@ private:
return false;
}
- gps_send_fn_t _send;
- gps_recv_fn_t _recv;
+ uart_iface::sptr _uart;
+
+ void _flush(void){
+ while (not _uart->read_uart(0.0).empty()){
+ //NOP
+ }
+ }
+
+ std::string _recv(void){
+ return _uart->read_uart(GPS_TIMEOUT_DELAY_MS/1000.);
+ }
+
+ void _send(const std::string &buf){
+ return _uart->write_uart(buf);
+ }
enum {
GPS_TYPE_JACKSON_LABS,
@@ -259,6 +271,6 @@ private:
/***********************************************************************
* Public make function for the GPS control
**********************************************************************/
-gps_ctrl::sptr gps_ctrl::make(gps_send_fn_t send, gps_recv_fn_t recv){
- return sptr(new gps_ctrl_impl(send, recv));
+gps_ctrl::sptr gps_ctrl::make(uart_iface::sptr uart){
+ return sptr(new gps_ctrl_impl(uart));
}
diff --git a/host/lib/usrp/usrp2/fw_common.h b/host/lib/usrp/usrp2/fw_common.h
index 2da4e1e48..7ad06f33f 100644
--- a/host/lib/usrp/usrp2/fw_common.h
+++ b/host/lib/usrp/usrp2/fw_common.h
@@ -31,8 +31,8 @@ extern "C" {
//fpga and firmware compatibility numbers
#define USRP2_FPGA_COMPAT_NUM 7
-#define USRP2_FW_COMPAT_NUM 10
-#define USRP2_FW_VER_MINOR 4
+#define USRP2_FW_COMPAT_NUM 11
+#define USRP2_FW_VER_MINOR 0
//used to differentiate control packets over data port
#define USRP2_INVALID_VRT_HEADER 0
@@ -45,6 +45,7 @@ extern "C" {
#define USRP2_UDP_TX_DSP0_PORT 49157
#define USRP2_UDP_RX_DSP1_PORT 49158
#define USRP2_UDP_UART_BASE_PORT 49170
+#define USRP2_UDP_UART_GPS_PORT 49172
// Map for virtual firmware regs (not very big so we can keep it here for now)
#define U2_FW_REG_LOCK_TIME 0
@@ -90,9 +91,6 @@ typedef enum{
USRP2_CTRL_ID_HEY_WRITE_THIS_UART_FOR_ME_BRO = 'u',
USRP2_CTRL_ID_MAN_I_TOTALLY_WROTE_THAT_UART_DUDE = 'U',
- USRP2_CTRL_ID_SO_LIKE_CAN_YOU_READ_THIS_UART_BRO = 'v',
- USRP2_CTRL_ID_I_HELLA_READ_THAT_UART_DUDE = 'V',
-
USRP2_CTRL_ID_HOLLER_AT_ME_BRO = 'l',
USRP2_CTRL_ID_HOLLER_BACK_DUDE = 'L',
@@ -144,11 +142,6 @@ typedef struct{
uint8_t action;
} reg_args;
struct {
- uint8_t dev;
- uint8_t bytes;
- uint8_t data[20];
- } uart_args;
- struct {
uint32_t len;
} echo_args;
} data;
diff --git a/host/lib/usrp/usrp2/usrp2_iface.cpp b/host/lib/usrp/usrp2/usrp2_iface.cpp
index d91dd0e40..c1e92e7d4 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.cpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.cpp
@@ -245,66 +245,6 @@ public:
}
/***********************************************************************
- * UART
- **********************************************************************/
- void write_uart(boost::uint8_t dev, const std::string &buf){
- //first tokenize the string into 20-byte substrings
- boost::offset_separator f(20, 20, true, true);
- boost::tokenizer<boost::offset_separator> tok(buf, f);
- std::vector<std::string> queue(tok.begin(), tok.end());
-
- BOOST_FOREACH(std::string item, queue) {
- //setup the out data
- usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
- out_data.id = htonl(USRP2_CTRL_ID_HEY_WRITE_THIS_UART_FOR_ME_BRO);
- out_data.data.uart_args.dev = dev;
- out_data.data.uart_args.bytes = item.size();
-
- //limitation of uart transaction size
- UHD_ASSERT_THROW(item.size() <= sizeof(out_data.data.uart_args.data));
-
- //copy in the data
- std::copy(item.begin(), item.end(), out_data.data.uart_args.data);
-
- //send and recv
- usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_UART);
- UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_MAN_I_TOTALLY_WROTE_THAT_UART_DUDE);
- }
- }
-
- std::string read_uart(boost::uint8_t dev){
- int readlen = 20;
- std::string result;
- while(readlen == 20) { //while we keep receiving full packets
- //setup the out data
- usrp2_ctrl_data_t out_data = usrp2_ctrl_data_t();
- out_data.id = htonl(USRP2_CTRL_ID_SO_LIKE_CAN_YOU_READ_THIS_UART_BRO);
- out_data.data.uart_args.dev = dev;
- out_data.data.uart_args.bytes = 20;
-
- //limitation of uart transaction size
- //UHD_ASSERT_THROW(num_bytes <= sizeof(out_data.data.uart_args.data));
-
- //send and recv
- usrp2_ctrl_data_t in_data = this->ctrl_send_and_recv(out_data, MIN_PROTO_COMPAT_UART);
- UHD_ASSERT_THROW(ntohl(in_data.id) == USRP2_CTRL_ID_I_HELLA_READ_THAT_UART_DUDE);
- readlen = in_data.data.uart_args.bytes;
-
- //copy out the data
- result += std::string((const char *)in_data.data.uart_args.data, (size_t)readlen);
- }
- return result;
- }
-
- gps_send_fn_t get_gps_write_fn(void) {
- return boost::bind(&usrp2_iface_impl::write_uart, this, 2, _1); //2 is the GPS UART port on USRP2
- }
-
- gps_recv_fn_t get_gps_read_fn(void) {
- return boost::bind(&usrp2_iface_impl::read_uart, this, 2); //2 is the GPS UART port on USRP2
- }
-
-/***********************************************************************
* Send/Recv over control
**********************************************************************/
usrp2_ctrl_data_t ctrl_send_and_recv(
diff --git a/host/lib/usrp/usrp2/usrp2_iface.hpp b/host/lib/usrp/usrp2/usrp2_iface.hpp
index b3c3ef4a2..9aa1a16aa 100644
--- a/host/lib/usrp/usrp2/usrp2_iface.hpp
+++ b/host/lib/usrp/usrp2/usrp2_iface.hpp
@@ -28,16 +28,12 @@
#include "wb_iface.hpp"
#include <string>
-//TODO: kill this crap when you have the top level GPS include file
-typedef boost::function<void(std::string)> gps_send_fn_t;
-typedef boost::function<std::string(void)> gps_recv_fn_t;
-
/*!
* The usrp2 interface class:
* Provides a set of functions to implementation layer.
* Including spi, peek, poke, control...
*/
-class usrp2_iface : public wb_iface, public uhd::spi_iface, public uhd::i2c_iface, public uhd::uart_iface{
+class usrp2_iface : public wb_iface, public uhd::spi_iface, public uhd::i2c_iface{
public:
typedef boost::shared_ptr<usrp2_iface> sptr;
/*!
@@ -47,9 +43,6 @@ public:
*/
static sptr make(uhd::transport::udp_simple::sptr ctrl_transport);
- virtual gps_recv_fn_t get_gps_read_fn(void) = 0;
- virtual gps_send_fn_t get_gps_write_fn(void) = 0;
-
//! The list of possible revision types
enum rev_type {
USRP2_REV3 = 3,
diff --git a/host/lib/usrp/usrp2/usrp2_impl.cpp b/host/lib/usrp/usrp2/usrp2_impl.cpp
index 03a9d09fe..47aec08d5 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.cpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.cpp
@@ -438,10 +438,9 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){
// create gpsdo control objects
////////////////////////////////////////////////////////////////
if (_mbc[mb].iface->mb_eeprom["gpsdo"] == "internal"){
- _mbc[mb].gps = gps_ctrl::make(
- _mbc[mb].iface->get_gps_write_fn(),
- _mbc[mb].iface->get_gps_read_fn()
- );
+ _mbc[mb].gps = gps_ctrl::make(udp_simple::make_uart(udp_simple::make_connected(
+ addr, BOOST_STRINGIZE(USRP2_UDP_UART_GPS_PORT)
+ )));
if(_mbc[mb].gps->gps_detected()) {
BOOST_FOREACH(const std::string &name, _mbc[mb].gps->get_sensors()){
_tree->create<sensor_value_t>(mb_path / "sensors" / name)
@@ -624,8 +623,10 @@ usrp2_impl::usrp2_impl(const device_addr_t &_device_addr){
//GPS installed: use external ref, time, and init time spec
if (_mbc[mb].gps.get() and _mbc[mb].gps->gps_detected()){
+ UHD_MSG(status) << "Setting references to the internal GPSDO" << std::endl;
_tree->access<std::string>(root / "time_source/value").set("external");
_tree->access<std::string>(root / "clock_source/value").set("external");
+ UHD_MSG(status) << "Initializing time to the internal GPSDO" << std::endl;
_mbc[mb].time64->set_time_next_pps(time_spec_t(time_t(_mbc[mb].gps->get_sensor("gps_time").to_int()+1)));
}
}
diff --git a/host/lib/usrp/usrp2/usrp2_impl.hpp b/host/lib/usrp/usrp2/usrp2_impl.hpp
index 28cbaf479..6f133f411 100644
--- a/host/lib/usrp/usrp2/usrp2_impl.hpp
+++ b/host/lib/usrp/usrp2/usrp2_impl.hpp
@@ -93,7 +93,7 @@ private:
usrp2_iface::sptr iface;
usrp2_clock_ctrl::sptr clock;
usrp2_codec_ctrl::sptr codec;
- gps_ctrl::sptr gps;
+ uhd::gps_ctrl::sptr gps;
rx_frontend_core_200::sptr rx_fe;
tx_frontend_core_200::sptr tx_fe;
std::vector<rx_dsp_core_200::sptr> rx_dsps;