aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/e300/e300_network.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/e300/e300_network.cpp')
-rw-r--r--host/lib/usrp/e300/e300_network.cpp655
1 files changed, 0 insertions, 655 deletions
diff --git a/host/lib/usrp/e300/e300_network.cpp b/host/lib/usrp/e300/e300_network.cpp
deleted file mode 100644
index d9a104dda..000000000
--- a/host/lib/usrp/e300/e300_network.cpp
+++ /dev/null
@@ -1,655 +0,0 @@
-//
-// Copyright 2013-2014 Ettus Research LLC
-// Copyright 2018 Ettus Research, a National Instruments Company
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-
-#include "e300_network.hpp"
-
-#ifdef E300_NATIVE
-
-#include "e300_impl.hpp"
-
-#include "e300_sensor_manager.hpp"
-#include "e300_fifo_config.hpp"
-#include "e300_spi.hpp"
-#include "e300_i2c.hpp"
-#include "e300_defaults.hpp"
-#include "e300_common.hpp"
-#include "e300_remote_codec_ctrl.hpp"
-
-#include <uhd/utils/log.hpp>
-#include <uhd/utils/byteswap.hpp>
-#include <uhd/utils/paths.hpp>
-
-#include <uhdlib/usrp/common/ad9361_ctrl.hpp>
-
-#include <boost/asio.hpp>
-#include <boost/filesystem.hpp>
-#include <boost/make_shared.hpp>
-
-#include <fstream>
-#include <chrono>
-#include <thread>
-
-using namespace uhd;
-using namespace uhd::transport;
-namespace asio = boost::asio;
-namespace fs = boost::filesystem;
-
-namespace uhd { namespace usrp { namespace e300 {
-
-static const size_t E300_NETWORK_DEBUG = false;
-
-static inline bool wait_for_recv_ready(int sock_fd, const size_t timeout_ms)
-{
- //setup timeval for timeout
- timeval tv;
- tv.tv_sec = 0;
- tv.tv_usec = timeout_ms*1000;
-
- //setup rset for timeout
- fd_set rset;
- FD_ZERO(&rset);
- FD_SET(sock_fd, &rset);
-
- //call select with timeout on receive socket
- return ::select(sock_fd+1, &rset, NULL, NULL, &tv) > 0;
-}
-
-static boost::mutex endpoint_mutex;
-
-/***********************************************************************
- * Receive tunnel - forwards recv interface to send socket
- **********************************************************************/
-static void e300_recv_tunnel(
- const std::string &name,
- uhd::transport::zero_copy_if::sptr recver,
- boost::shared_ptr<asio::ip::udp::socket> sender,
- asio::ip::udp::endpoint *endpoint,
- bool *running
-)
-{
- asio::ip::udp::endpoint _tx_endpoint;
- try
- {
- while (*running)
- {
- //step 1 - get the buffer
- managed_recv_buffer::sptr buff = recver->get_recv_buff();
- if (not buff) continue;
- if (E300_NETWORK_DEBUG) UHD_LOGGER_INFO("E300") << name << " got " << buff->size();
-
- //step 1.5 -- update endpoint
- {
- boost::mutex::scoped_lock l(endpoint_mutex);
- _tx_endpoint = *endpoint;
- }
-
- //step 2 - send to the socket
- sender->send_to(asio::buffer(buff->cast<const void *>(), buff->size()), _tx_endpoint);
- }
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("E300") << "e300_recv_tunnel exit " << name << " " << ex.what();
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("E300") << "e300_recv_tunnel exit " << name ;
- }
- UHD_LOGGER_INFO("E300") << "e300_recv_tunnel exit " << name;
- *running = false;
-}
-
-/***********************************************************************
- * Send tunnel - forwards recv socket to send interface
- **********************************************************************/
-static void e300_send_tunnel(
- const std::string &name,
- boost::shared_ptr<asio::ip::udp::socket> recver,
- uhd::transport::zero_copy_if::sptr sender,
- asio::ip::udp::endpoint *endpoint,
- bool *running
-)
-{
- asio::ip::udp::endpoint _rx_endpoint;
- try
- {
- while (*running)
- {
- //step 1 - get the buffer
- managed_send_buffer::sptr buff = sender->get_send_buff();
- if (not buff) continue;
-
- //step 2 - recv from socket
- while (not wait_for_recv_ready(recver->native_handle(), 100) and *running){}
- if (not *running) break;
- const size_t num_bytes = recver->receive_from(asio::buffer(buff->cast<void *>(), buff->size()), _rx_endpoint);
- if (E300_NETWORK_DEBUG) UHD_LOGGER_INFO("E300") << name << " got " << num_bytes;
-
- //step 2.5 -- update endpoint
- {
- boost::mutex::scoped_lock l(endpoint_mutex);
- *endpoint = _rx_endpoint;
- }
-
- //step 3 - commit the buffer
- buff->commit(num_bytes);
- }
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("E300") << "e300_send_tunnel exit " << name << " " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("E300") << "e300_send_tunnel exit " << name ;
- }
- UHD_LOGGER_INFO("E300") << "e300_send_tunnel exit " << name;
- *running = false;
-}
-
-static void e300_codec_ctrl_tunnel(
- const std::string &name,
- boost::shared_ptr<asio::ip::udp::socket> socket,
- ad9361_ctrl::sptr _codec_ctrl,
- asio::ip::udp::endpoint *endpoint,
- bool *running
-)
-{
- asio::ip::udp::endpoint _endpoint;
- try
- {
- while (*running)
- {
- uint8_t in_buff[64] = {};
- uint8_t out_buff[64] = {};
-
- const size_t num_bytes = socket->receive_from(asio::buffer(in_buff), *endpoint);
-
- typedef e300_remote_codec_ctrl::transaction_t codec_xact_t;
-
- if (num_bytes < sizeof(codec_xact_t)) {
- std::cout << "Received short packet of " << num_bytes << std::endl;
- continue;
- }
-
- codec_xact_t *in = reinterpret_cast<codec_xact_t*>(in_buff);
- codec_xact_t *out = reinterpret_cast<codec_xact_t*>(out_buff);
- std::memcpy(out, in, sizeof(codec_xact_t));
-
- std::string which_str;
- switch (uhd::ntohx<uint32_t>(in->which)) {
- case codec_xact_t::CHAIN_TX1:
- which_str = "TX1"; break;
- case codec_xact_t::CHAIN_TX2:
- which_str = "TX2"; break;
- case codec_xact_t::CHAIN_RX1:
- which_str = "RX1"; break;
- case codec_xact_t::CHAIN_RX2:
- which_str = "RX2"; break;
- default:
- which_str = ""; break;
- }
-
- switch (uhd::ntohx<uint32_t>(in->action)) {
- case codec_xact_t::ACTION_SET_GAIN:
- out->gain = _codec_ctrl->set_gain(which_str, in->gain);
- break;
- case codec_xact_t::ACTION_SET_CLOCK_RATE:
- out->rate = _codec_ctrl->set_clock_rate(in->rate);
- break;
- case codec_xact_t::ACTION_SET_ACTIVE_CHANS:
- _codec_ctrl->set_active_chains(
- uhd::ntohx<uint32_t>(in->bits) & (1<<0),
- uhd::ntohx<uint32_t>(in->bits) & (1<<1),
- uhd::ntohx<uint32_t>(in->bits) & (1<<2),
- uhd::ntohx<uint32_t>(in->bits) & (1<<3));
- break;
- case codec_xact_t::ACTION_TUNE:
- out->freq = _codec_ctrl->tune(which_str, in->freq);
- break;
- case codec_xact_t::ACTION_GET_FREQ:
- out->freq = _codec_ctrl->get_freq(which_str);
- break;
- case codec_xact_t::ACTION_SET_LOOPBACK:
- _codec_ctrl->data_port_loopback(
- uhd::ntohx<uint32_t>(in->bits) & 1);
- break;
- case codec_xact_t::ACTION_GET_RSSI:
- out->rssi = _codec_ctrl->get_rssi(which_str).to_real();
- break;
- case codec_xact_t::ACTION_GET_TEMPERATURE:
- out->temp = _codec_ctrl->get_temperature().to_real();
- break;
- case codec_xact_t::ACTION_SET_DC_OFFSET_AUTO:
- _codec_ctrl->set_dc_offset_auto(which_str, in->use_dc_correction == 1);
- break;
- case codec_xact_t::ACTION_SET_IQ_BALANCE_AUTO:
- _codec_ctrl->set_iq_balance_auto(which_str, in->use_iq_correction == 1);
- case codec_xact_t::ACTION_SET_AGC:
- _codec_ctrl->set_agc(which_str, in->use_agc == 1);
- break;
- case codec_xact_t::ACTION_SET_AGC_MODE:
- if(in->agc_mode == 0) {
- _codec_ctrl->set_agc_mode(which_str, "slow");
- } else if (in->agc_mode == 1) {
- _codec_ctrl->set_agc_mode(which_str, "fast");
- }
- break;
- case codec_xact_t::ACTION_SET_BW:
- out->bw = _codec_ctrl->set_bw_filter(which_str, in->bw);
- break;
- default:
- UHD_LOGGER_INFO("E300") << "Got unknown request?!";
- //Zero out actions to fail this request on client
- out->action = uhd::htonx<uint32_t>(0);
- }
-
- socket->send_to(asio::buffer(out_buff, 64), *endpoint);
- }
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("E300") << "e300_ctrl_tunnel exit " << name << " " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("E300") << "e300_ctrl_tunnel exit " << name ;
- }
- UHD_LOGGER_INFO("E300") << "e300_ctrl_tunnel exit " << name;
- *running = false;
-}
-
-static void e300_global_regs_tunnel(
- const std::string &name,
- boost::shared_ptr<asio::ip::udp::socket> socket,
- global_regs::sptr regs,
- asio::ip::udp::endpoint *endpoint,
- bool *running
-)
-{
- UHD_ASSERT_THROW(regs);
- asio::ip::udp::endpoint _endpoint;
- try
- {
- while (*running)
- {
- uint8_t in_buff[16] = {};
-
- const size_t num_bytes = socket->receive_from(asio::buffer(in_buff), *endpoint);
-
- if (num_bytes < 16) {
- std::cout << "Received short packet: " << num_bytes << std::endl;
- continue;
- }
-
- global_regs_transaction_t *in =
- reinterpret_cast<global_regs_transaction_t *>(in_buff);
-
- if(uhd::ntohx<uint32_t>(in->is_poke)) {
- regs->poke32(uhd::ntohx<uint32_t>(in->addr), uhd::ntohx<uint32_t>(in->data));
- }
- else {
- in->data = uhd::htonx<uint32_t>(regs->peek32(uhd::ntohx<uint32_t>(in->addr)));
- socket->send_to(asio::buffer(in_buff, 16), *endpoint);
- }
- }
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("E300") << "e300_gregs_tunnel exit " << name << " " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("E300") << "e300_gregs_tunnel exit " << name ;
- }
- UHD_LOGGER_INFO("E300") << "e300_gregs_tunnel exit " << name;
- *running = false;
-}
-
-static void e300_sensor_tunnel(
- const std::string &name,
- boost::shared_ptr<asio::ip::udp::socket> socket,
- e300_sensor_manager::sptr sensor_manager,
- asio::ip::udp::endpoint *endpoint,
- bool *running
-)
-{
- asio::ip::udp::endpoint _endpoint;
- try
- {
- while (*running)
- {
- uint8_t in_buff[128] = {};
-
- const size_t num_bytes = socket->receive_from(asio::buffer(in_buff), *endpoint);
-
- if (num_bytes < sizeof(sensor_transaction_t)) {
- std::cout << "Received short packet: " << num_bytes << std::endl;
- continue;
- }
-
- uhd::usrp::e300::sensor_transaction_t *in =
- reinterpret_cast<uhd::usrp::e300::sensor_transaction_t *>(in_buff);
-
- if (uhd::ntohx(in->which) == ZYNQ_TEMP) {
- sensor_value_t temp = sensor_manager->get_mb_temp();
- // TODO: This is ugly ... use proper serialization
- in->value = uhd::htonx<uint32_t>(
- e300_sensor_manager::pack_float_in_uint32_t(temp.to_real()));
- } else if (uhd::ntohx(in->which) == REF_LOCK) {
- in->value = uhd::htonx<uint32_t>(
- sensor_manager->get_ref_lock().to_bool() ? 1 : 0);
- } else
- UHD_LOGGER_INFO("E300") << "Got unknown request?!";
-
- socket->send_to(asio::buffer(in_buff, sizeof(sensor_transaction_t)), *endpoint);
- }
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("E300") << "e300_sensor_tunnel exit " << name << " " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("E300") << "e300_sensor_tunnel exit " << name ;
- }
- UHD_LOGGER_INFO("E300") << "e300_sensor_tunnel exit " << name;
- *running = false;
-}
-
-static void e300_i2c_tunnel(
- const std::string &name,
- boost::shared_ptr<asio::ip::udp::socket> socket,
- uhd::usrp::e300::i2c::sptr i2c,
- asio::ip::udp::endpoint *endpoint,
- bool *running
-)
-{
- UHD_ASSERT_THROW(i2c);
- asio::ip::udp::endpoint _endpoint;
- try
- {
- while (*running)
- {
- uint8_t in_buff[sizeof(uhd::usrp::e300::i2c_transaction_t)];
-
- const size_t num_bytes = socket->receive_from(asio::buffer(in_buff), *endpoint);
-
- if (num_bytes < sizeof(uhd::usrp::e300::i2c_transaction_t)) {
- std::cout << "Received short packet: " << num_bytes << std::endl;
- continue;
- }
-
- uhd::usrp::e300::i2c_transaction_t *in =
- reinterpret_cast<uhd::usrp::e300::i2c_transaction_t *>(in_buff);
-
- // byte addressed accesses go through here
- if(in->type & i2c::ONEBYTE) {
- if(in->type & i2c::WRITE) {
- i2c->set_i2c_reg8(
- in->addr,
- uhd::ntohx<uint16_t>(in->reg), in->data);
- } else {
- in->data = i2c->get_i2c_reg8(in->addr, uhd::ntohx<uint16_t>(in->reg));
- socket->send_to(asio::buffer(in_buff, sizeof(in_buff)), *endpoint);
- }
-
- // 2 byte addressed accesses go through here
- } else if (in->type & i2c::TWOBYTE) {
- if(in->type & i2c::WRITE) {
- i2c->set_i2c_reg16(
- in->addr,
- uhd::ntohx<uint16_t>(in->reg), in->data);
- } else {
- in->data = i2c->get_i2c_reg16(in->addr, uhd::ntohx<uint16_t>(in->reg));
- socket->send_to(asio::buffer(in_buff, sizeof(in_buff)), *endpoint);
- }
-
- } else {
- UHD_LOGGER_ERROR("E300") << "e300_i2c_tunnel could not handle message." ;
- }
- }
- }
- catch(const std::exception &ex)
- {
- UHD_LOGGER_ERROR("E300") << "e300_i2c_tunnel exit " << name << " " << ex.what() ;
- }
- catch(...)
- {
- UHD_LOGGER_ERROR("E300") << "e300_i2c_tunnel exit " << name ;
- }
- UHD_LOGGER_INFO("E300") << "e300_i2c_tunnel exit " << name;
- *running = false;
-}
-
-
-
-
-class network_server_impl : public network_server
-{
-public:
- network_server_impl(const uhd::device_addr_t &device_addr);
- virtual ~network_server_impl(void);
- void run(void);
-
-private:
- struct xports_t
- {
- uhd::transport::zero_copy_if::sptr send_ctrl_xport;
- uhd::transport::zero_copy_if::sptr recv_ctrl_xport;
- uhd::transport::zero_copy_if::sptr tx_data_xport;
- uhd::transport::zero_copy_if::sptr tx_flow_xport;
- uhd::transport::zero_copy_if::sptr rx_data_xport;
- uhd::transport::zero_copy_if::sptr rx_flow_xport;
- };
-
-private:
- void _run_server(
- const std::string &port,
- const std::string &what,
- const size_t fe);
-
-private:
- boost::shared_ptr<e300_fifo_interface> _fifo_iface;
- xports_t _xports[2];
- boost::shared_ptr<ad9361_ctrl> _codec_ctrl;
- boost::shared_ptr<global_regs> _global_regs;
- boost::shared_ptr<e300_sensor_manager> _sensor_manager;
- boost::shared_ptr<e300_eeprom_manager> _eeprom_manager;
-};
-
-network_server_impl::~network_server_impl(void)
-{
-}
-
-/***********************************************************************
- * The UDP server itself
- **********************************************************************/
-void network_server_impl::_run_server(
- const std::string &port,
- const std::string &what,
- const size_t fe)
-{
- asio::io_service io_service;
- asio::ip::udp::resolver resolver(io_service);
- asio::ip::udp::resolver::query query(asio::ip::udp::v4(), "0.0.0.0", port);
- asio::ip::udp::endpoint endpoint = *resolver.resolve(query);
-
- //boost::shared_ptr<asio::ip::udp::acceptor> acceptor(new asio::ip::udp::acceptor(io_service, endpoint));
- while (not boost::this_thread::interruption_requested())
- {
- UHD_LOGGER_INFO("E300") << "e300 run server on port " << port << " for " << what;
- try
- {
- //while (not wait_for_recv_ready(acceptor->native(), 100))
- //{
- // if (boost::this_thread::interruption_requested()) return;
- //}
- boost::shared_ptr<asio::ip::udp::socket> socket;
- socket.reset(new asio::ip::udp::socket(io_service, endpoint));
- //acceptor->accept(*socket);
- UHD_LOGGER_INFO("E300") << "e300 socket accept on port " << port << " for " << what;
- //asio::ip::udp::no_delay option(true);
- //socket->set_option(option);
- boost::thread_group tg;
- bool running = true;
- xports_t &perif = _xports[fe];
- if (what == "RX") {
- tg.create_thread(boost::bind(&e300_recv_tunnel, "RX data tunnel", perif.rx_data_xport, socket, &endpoint, &running));
- tg.create_thread(boost::bind(&e300_send_tunnel, "RX flow tunnel", socket, perif.rx_flow_xport, &endpoint, &running));
- }
- if (what == "TX") {
- tg.create_thread(boost::bind(&e300_recv_tunnel, "TX flow tunnel", perif.tx_flow_xport, socket, &endpoint, &running));
- tg.create_thread(boost::bind(&e300_send_tunnel, "TX data tunnel", socket, perif.tx_data_xport, &endpoint, &running));
- }
- if (what == "CTRL") {
- tg.create_thread(boost::bind(&e300_recv_tunnel, "response tunnel", perif.recv_ctrl_xport, socket, &endpoint, &running));
- tg.create_thread(boost::bind(&e300_send_tunnel, "control tunnel", socket, perif.send_ctrl_xport, &endpoint, &running));
- }
- if (what == "CODEC") {
- tg.create_thread(boost::bind(&e300_codec_ctrl_tunnel, "CODEC tunnel", socket, _codec_ctrl, &endpoint, &running));
- }
- if (what == "I2C") {
- tg.create_thread(boost::bind(&e300_i2c_tunnel, "I2C tunnel", socket, _eeprom_manager->get_i2c_sptr(), &endpoint, &running));
- }
- if (what == "GREGS") {
- tg.create_thread(boost::bind(&e300_global_regs_tunnel, "GREGS tunnel", socket, _global_regs, &endpoint, &running));
- }
- if (what == "SENSOR") {
- tg.create_thread(boost::bind(&e300_sensor_tunnel, "SENSOR tunnel", socket, _sensor_manager, &endpoint, &running));
- }
-
- tg.join_all();
- socket->close();
- socket.reset();
- }
- catch(...){}
- }
-}
-
-void network_server_impl::run()
-{
- for(;;)
- {
- boost::thread_group tg;
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_RX_PORT0, "RX",0));
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_TX_PORT0, "TX",0));
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_CTRL_PORT0, "CTRL",0));
-
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_RX_PORT1, "RX",1));
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_TX_PORT1, "TX",1));
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_CTRL_PORT1, "CTRL",1));
-
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_SENSOR_PORT, "SENSOR", 0 /*don't care */));
-
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_CODEC_PORT, "CODEC", 0 /*don't care */));
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_GREGS_PORT, "GREGS", 0 /*don't care */));
- tg.create_thread(boost::bind(&network_server_impl::_run_server, this, E300_SERVER_I2C_PORT, "I2C", 0 /*don't care */));
- tg.join_all();
- }
-}
-network_server_impl::network_server_impl(const uhd::device_addr_t &device_addr)
-{
- _eeprom_manager = boost::make_shared<e300_eeprom_manager>(i2c::make_i2cdev(E300_I2CDEV_DEVICE));
- if (not device_addr.has_key("no_reload_fpga")) {
- // Load FPGA image if provided via args
- if (device_addr.has_key("fpga")) {
- common::load_fpga_image(device_addr["fpga"]);
- // Else load the FPGA image based on the product ID
- } else {
- //extract the FPGA path for the e300
- const uint16_t pid = boost::lexical_cast<uint16_t>(
- _eeprom_manager->get_mb_eeprom()["product"]);
- std::string fpga_image;
- switch(e300_eeprom_manager::get_mb_type(pid)) {
- case e300_eeprom_manager::USRP_E310_SG1_MB:
- fpga_image = find_image_path(E310_SG1_FPGA_FILE_NAME);
- break;
- case e300_eeprom_manager::USRP_E310_SG3_MB:
- fpga_image = find_image_path(E310_SG3_FPGA_FILE_NAME);
- break;
- case e300_eeprom_manager::USRP_E300_MB:
- fpga_image = find_image_path(E300_FPGA_FILE_NAME);
- break;
- case e300_eeprom_manager::UNKNOWN:
- default:
- UHD_LOGGER_WARNING("E300") << "Unknown motherboard type, loading e300 image."
- ;
- fpga_image = find_image_path(E300_FPGA_FILE_NAME);
- break;
- }
- common::load_fpga_image(fpga_image);
- }
- }
-
- uhd::transport::zero_copy_xport_params ctrl_xport_params;
- ctrl_xport_params.recv_frame_size = e300::DEFAULT_CTRL_FRAME_SIZE;
- ctrl_xport_params.num_recv_frames = e300::DEFAULT_CTRL_NUM_FRAMES;
- ctrl_xport_params.send_frame_size = e300::DEFAULT_CTRL_FRAME_SIZE;
- ctrl_xport_params.num_send_frames = e300::DEFAULT_CTRL_NUM_FRAMES;
-
- uhd::transport::zero_copy_xport_params data_xport_params;
- data_xport_params.recv_frame_size = device_addr.cast<size_t>("recv_frame_size", e300::DEFAULT_RX_DATA_FRAME_SIZE);
- data_xport_params.num_recv_frames = device_addr.cast<size_t>("num_recv_frames", e300::DEFAULT_RX_DATA_NUM_FRAMES);
- data_xport_params.send_frame_size = device_addr.cast<size_t>("send_frame_size", e300::DEFAULT_TX_DATA_FRAME_SIZE);
- data_xport_params.num_send_frames = device_addr.cast<size_t>("num_send_frames", e300::DEFAULT_TX_DATA_NUM_FRAMES);
- // until we figure out why this goes wrong we'll keep this hack around
- data_xport_params.recv_frame_size =
- std::min(e300::MAX_NET_RX_DATA_FRAME_SIZE, data_xport_params.recv_frame_size);
- data_xport_params.send_frame_size =
- std::min(e300::MAX_NET_TX_DATA_FRAME_SIZE, data_xport_params.send_frame_size);
-
-
- e300_fifo_config_t fifo_cfg;
- try {
- fifo_cfg = e300_read_sysfs();
- } catch (uhd::lookup_error &e) {
- throw uhd::runtime_error("Failed to get driver parameters from sysfs.");
- }
- _fifo_iface = e300_fifo_interface::make(fifo_cfg);
- _global_regs = global_regs::make(_fifo_iface->get_global_regs_base());
-
- // static mapping, boooohhhhhh
- _xports[0].send_ctrl_xport = _fifo_iface->make_send_xport(E300_R0_CTRL_STREAM, ctrl_xport_params);
- _xports[0].recv_ctrl_xport = _fifo_iface->make_recv_xport(E300_R0_CTRL_STREAM, ctrl_xport_params);
- _xports[0].tx_data_xport = _fifo_iface->make_send_xport(E300_R0_TX_DATA_STREAM, data_xport_params);
- _xports[0].tx_flow_xport = _fifo_iface->make_recv_xport(E300_R0_TX_DATA_STREAM, ctrl_xport_params);
- _xports[0].rx_data_xport = _fifo_iface->make_recv_xport(E300_R0_RX_DATA_STREAM, data_xport_params);
- _xports[0].rx_flow_xport = _fifo_iface->make_send_xport(E300_R0_RX_DATA_STREAM, ctrl_xport_params);
-
- _xports[1].send_ctrl_xport = _fifo_iface->make_send_xport(E300_R1_CTRL_STREAM, ctrl_xport_params);
- _xports[1].recv_ctrl_xport = _fifo_iface->make_recv_xport(E300_R1_CTRL_STREAM, ctrl_xport_params);
- _xports[1].tx_data_xport = _fifo_iface->make_send_xport(E300_R1_TX_DATA_STREAM, data_xport_params);
- _xports[1].tx_flow_xport = _fifo_iface->make_recv_xport(E300_R1_TX_DATA_STREAM, ctrl_xport_params);
- _xports[1].rx_data_xport = _fifo_iface->make_recv_xport(E300_R1_RX_DATA_STREAM, data_xport_params);
- _xports[1].rx_flow_xport = _fifo_iface->make_send_xport(E300_R1_RX_DATA_STREAM, ctrl_xport_params);
-
- ad9361_params::sptr client_settings = boost::make_shared<e300_ad9361_client_t>();
- _codec_ctrl = ad9361_ctrl::make_spi(client_settings, spi::make(E300_SPIDEV_DEVICE), 1);
- // This is horrible ... why do I have to sleep here?
- std::this_thread::sleep_for(std::chrono::milliseconds(100));
- _sensor_manager = e300_sensor_manager::make_local(_global_regs);
-}
-
-}}} // namespace
-
-using namespace uhd::usrp::e300;
-
-network_server::sptr network_server::make(const uhd::device_addr_t &device_addr)
-{
- return sptr(new network_server_impl(device_addr));
-}
-
-#else
-
-using namespace uhd::usrp::e300;
-
-network_server::sptr network_server::make(const uhd::device_addr_t &)
-{
- throw uhd::assertion_error("network_server::make() !E300_NATIVE");
-}
-#endif