summaryrefslogtreecommitdiffstats
path: root/host/lib
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib')
-rw-r--r--host/lib/usrp/usrp_e/CMakeLists.txt1
-rw-r--r--host/lib/usrp/usrp_e/io_impl.cpp137
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_iface.cpp4
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_iface.hpp6
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_impl.cpp30
-rw-r--r--host/lib/usrp/usrp_e/usrp_e_impl.hpp35
6 files changed, 166 insertions, 47 deletions
diff --git a/host/lib/usrp/usrp_e/CMakeLists.txt b/host/lib/usrp/usrp_e/CMakeLists.txt
index 6035d4ff2..568fbd132 100644
--- a/host/lib/usrp/usrp_e/CMakeLists.txt
+++ b/host/lib/usrp/usrp_e/CMakeLists.txt
@@ -49,6 +49,7 @@ IF(HAVE_USRP_E_REQUIRED_HEADERS)
${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/dboard_iface.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/dsp_impl.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/fpga-downloader.cc
+ ${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/io_impl.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/mboard_impl.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/usrp_e_impl.cpp
${CMAKE_SOURCE_DIR}/lib/usrp/usrp_e/usrp_e_impl.hpp
diff --git a/host/lib/usrp/usrp_e/io_impl.cpp b/host/lib/usrp/usrp_e/io_impl.cpp
new file mode 100644
index 000000000..5bb40723e
--- /dev/null
+++ b/host/lib/usrp/usrp_e/io_impl.cpp
@@ -0,0 +1,137 @@
+//
+// Copyright 2010 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 "usrp_e_impl.hpp"
+#include "../../transport/vrt_packet_handler.hpp"
+#include <boost/bind.hpp>
+#include <fcntl.h> //read, write
+#include <linux/usrp_e.h> //transfer frame struct
+#include <stddef.h> //offsetof
+
+using namespace uhd;
+
+/***********************************************************************
+ * Data Transport (phony zero-copy with read/write)
+ **********************************************************************/
+class data_transport:
+ public transport::phony_zero_copy_recv_if,
+ public transport::phony_zero_copy_send_if
+{
+public:
+ data_transport(int fd):
+ transport::phony_zero_copy_recv_if(2048), //FIXME magic #
+ transport::phony_zero_copy_send_if(2048), //FIXME magic #
+ _fd(fd)
+ {
+ /* NOP */
+ }
+
+ size_t get_num_recv_frames(void) const{
+ return 10; //FIXME no idea!
+ }
+
+ size_t get_num_send_frames(void) const{
+ return 10; //FIXME no idea!
+ }
+
+private:
+ int _fd;
+ size_t send(const boost::asio::const_buffer &buff){
+ return write(
+ _fd,
+ boost::asio::buffer_cast<const void *>(buff),
+ boost::asio::buffer_size(buff)
+ );
+ }
+ size_t recv(const boost::asio::mutable_buffer &buff){
+ return read(
+ _fd,
+ boost::asio::buffer_cast<void *>(buff),
+ boost::asio::buffer_size(buff)
+ );
+ }
+};
+
+/***********************************************************************
+ * IO Implementation Details
+ **********************************************************************/
+struct usrp_e_impl::io_impl{
+ vrt_packet_handler::recv_state recv_state;
+ vrt_packet_handler::send_state send_state;
+ data_transport transport;
+ io_impl(int fd): transport(fd){}
+};
+
+void usrp_e_impl::io_init(void){
+ _io_impl = UHD_PIMPL_MAKE(io_impl, (_iface->get_file_descriptor()));
+}
+
+/***********************************************************************
+ * Data Send
+ **********************************************************************/
+size_t usrp_e_impl::send(
+ const boost::asio::const_buffer &buff,
+ const uhd::tx_metadata_t &metadata,
+ const io_type_t & io_type,
+ send_mode_t send_mode
+){
+ otw_type_t send_otw_type;
+ send_otw_type.width = 16;
+ send_otw_type.shift = 0;
+ send_otw_type.byteorder = otw_type_t::BO_NATIVE;
+
+ return vrt_packet_handler::send(
+ _io_impl->send_state,
+ buff,
+ metadata,
+ send_mode,
+ io_type,
+ send_otw_type, //TODO
+ 64e6, //TODO
+ boost::bind(&data_transport::get_send_buff, &_io_impl->transport),
+ _max_num_samples, //TODO
+ offsetof(usrp_transfer_frame, buf)
+ //TODO probably need callback to fill in frame size
+ );
+}
+
+/***********************************************************************
+ * Data Recv
+ **********************************************************************/
+size_t usrp_e_impl::recv(
+ const boost::asio::mutable_buffer &buff,
+ uhd::rx_metadata_t &metadata,
+ const io_type_t &io_type,
+ recv_mode_t recv_mode
+){
+ otw_type_t recv_otw_type;
+ recv_otw_type.width = 16;
+ recv_otw_type.shift = 0;
+ recv_otw_type.byteorder = otw_type_t::BO_NATIVE;
+
+ return vrt_packet_handler::recv(
+ _io_impl->recv_state,
+ buff,
+ metadata,
+ recv_mode,
+ io_type,
+ recv_otw_type, //TODO
+ 64e6, //TODO
+ boost::bind(&data_transport::get_recv_buff, &_io_impl->transport),
+ offsetof(usrp_transfer_frame, buf)
+ );
+}
diff --git a/host/lib/usrp/usrp_e/usrp_e_iface.cpp b/host/lib/usrp/usrp_e/usrp_e_iface.cpp
index 98d8ef478..21e91452f 100644
--- a/host/lib/usrp/usrp_e/usrp_e_iface.cpp
+++ b/host/lib/usrp/usrp_e/usrp_e_iface.cpp
@@ -29,6 +29,10 @@ using namespace uhd;
class usrp_e_iface_impl : public usrp_e_iface{
public:
+ int get_file_descriptor(void){
+ return _node_fd;
+ }
+
/*******************************************************************
* Structors
******************************************************************/
diff --git a/host/lib/usrp/usrp_e/usrp_e_iface.hpp b/host/lib/usrp/usrp_e/usrp_e_iface.hpp
index 6363a24b2..59aac43d9 100644
--- a/host/lib/usrp/usrp_e/usrp_e_iface.hpp
+++ b/host/lib/usrp/usrp_e/usrp_e_iface.hpp
@@ -50,6 +50,12 @@ public:
static sptr make(const std::string &node);
/*!
+ * Get the underlying file descriptor.
+ * \return the file descriptor
+ */
+ virtual int get_file_descriptor(void) = 0;
+
+ /*!
* Perform an ioctl call on the device node file descriptor.
* This will throw when the internal ioctl call fails.
* \param request the control word
diff --git a/host/lib/usrp/usrp_e/usrp_e_impl.cpp b/host/lib/usrp/usrp_e/usrp_e_impl.cpp
index 4a398e21c..f9af36887 100644
--- a/host/lib/usrp/usrp_e/usrp_e_impl.cpp
+++ b/host/lib/usrp/usrp_e/usrp_e_impl.cpp
@@ -89,6 +89,9 @@ usrp_e_impl::usrp_e_impl(const std::string &node){
//initialize the dsps
rx_ddc_init();
tx_duc_init();
+
+ //init the io send/recv
+ io_init();
}
usrp_e_impl::~usrp_e_impl(void){
@@ -127,30 +130,3 @@ void usrp_e_impl::get(const wax::obj &key_, wax::obj &val){
void usrp_e_impl::set(const wax::obj &, const wax::obj &){
UHD_THROW_PROP_SET_ERROR();
}
-
-/***********************************************************************
- * Device IO (TODO)
- **********************************************************************/
-size_t usrp_e_impl::send(
- const boost::asio::const_buffer &,
- const uhd::tx_metadata_t &,
- const io_type_t &,
- send_mode_t
-){
- if (true){
- throw std::runtime_error(str(boost::format("usrp-e send: cannot handle type \"%s\"") % ""));
- }
- return 0;
-}
-
-size_t usrp_e_impl::recv(
- const boost::asio::mutable_buffer &,
- uhd::rx_metadata_t &,
- const io_type_t &,
- recv_mode_t
-){
- if (true){
- throw std::runtime_error(str(boost::format("usrp-e recv: cannot handle type \"%s\"") % ""));
- }
- return 0;
-}
diff --git a/host/lib/usrp/usrp_e/usrp_e_impl.hpp b/host/lib/usrp/usrp_e/usrp_e_impl.hpp
index a2cdbc31e..12d4c9d9e 100644
--- a/host/lib/usrp/usrp_e/usrp_e_impl.hpp
+++ b/host/lib/usrp/usrp_e/usrp_e_impl.hpp
@@ -18,6 +18,7 @@
#include "usrp_e_iface.hpp"
#include "clock_ctrl.hpp"
#include "codec_ctrl.hpp"
+#include <uhd/utils/pimpl.hpp>
#include <uhd/usrp/usrp_e.hpp>
#include <uhd/usrp/dboard_eeprom.hpp>
#include <uhd/types/clock_config.hpp>
@@ -55,26 +56,11 @@ public:
return sptr(new wax_obj_proxy(get, set));
}
- ~wax_obj_proxy(void){
- /* NOP */
- }
-
private:
- get_t _get;
- set_t _set;
-
- wax_obj_proxy(const get_t &get, const set_t &set){
- _get = get;
- _set = set;
- };
-
- void get(const wax::obj &key, wax::obj &val){
- return _get(key, val);
- }
-
- void set(const wax::obj &key, const wax::obj &val){
- return _set(key, val);
- }
+ get_t _get; set_t _set;
+ wax_obj_proxy(const get_t &get, const set_t &set): _get(get), _set(set){};
+ void get(const wax::obj &key, wax::obj &val){return _get(key, val);}
+ void set(const wax::obj &key, const wax::obj &val){return _set(key, val);}
};
/*!
@@ -95,10 +81,19 @@ public:
size_t get_max_recv_samps_per_packet(void) const{return _max_num_samples;}
private:
- static const size_t _max_num_samples = 2048/sizeof(boost::uint32_t);
+ //interface to ioctls and file descriptor
usrp_e_iface::sptr _iface;
+ //FIXME fetch from ioctl?
+ static const size_t _max_num_samples = 2048/sizeof(boost::uint32_t);
+
+ //handle io stuff
+ UHD_PIMPL_DECL(io_impl) _io_impl;
+ void io_init(void);
+
+ //configuration shadows
uhd::clock_config_t _clock_config;
+ //TODO otw type recv/send
//ad9522 clock control
clock_ctrl::sptr _clock_ctrl;