aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2017-05-03 15:49:10 -0700
committerMartin Braun <martin.braun@ettus.com>2017-12-22 15:03:52 -0800
commita0ded71188aa96282736a9bc13a086b71f92d965 (patch)
tree71bbb83299d9c55c5eafc4b019745c9c569f2c10
parentaf35903d17d8cd314a2626f38eded72956459e23 (diff)
downloaduhd-a0ded71188aa96282736a9bc13a086b71f92d965.tar.gz
uhd-a0ded71188aa96282736a9bc13a086b71f92d965.tar.bz2
uhd-a0ded71188aa96282736a9bc13a086b71f92d965.zip
eiscat: Added skeleton for dboard driver support
-rw-r--r--host/include/uhd/rfnoc/blocks/ddc_eiscat.xml178
-rw-r--r--host/include/uhd/rfnoc/blocks/radio_eiscat.xml229
-rw-r--r--host/lib/usrp/CMakeLists.txt1
-rw-r--r--host/lib/usrp/dboard/CMakeLists.txt2
-rw-r--r--host/lib/usrp/dboard/eiscat/CMakeLists.txt24
-rw-r--r--host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.cpp178
-rw-r--r--host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp73
-rw-r--r--host/lib/usrp/dboard/magnesium/CMakeLists.txt (renamed from host/lib/usrp/magnesium/CMakeLists.txt)0
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp (renamed from host/lib/usrp/magnesium/magnesium_radio_ctrl_impl.cpp)0
-rw-r--r--host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp (renamed from host/lib/usrp/magnesium/magnesium_radio_ctrl_impl.hpp)0
-rw-r--r--host/lib/usrp/netd/netd_impl.cpp8
11 files changed, 688 insertions, 5 deletions
diff --git a/host/include/uhd/rfnoc/blocks/ddc_eiscat.xml b/host/include/uhd/rfnoc/blocks/ddc_eiscat.xml
new file mode 100644
index 000000000..93cf8371f
--- /dev/null
+++ b/host/include/uhd/rfnoc/blocks/ddc_eiscat.xml
@@ -0,0 +1,178 @@
+<!--This defines one NoC-Block.-->
+<nocblock>
+ <name>EISCAT Rx DSP (DDC/CORDIC)</name>
+ <blockname>DDC</blockname>
+ <key>DDC</key>
+ <!--There can be several of these:-->
+ <ids>
+ <id revision="0">DDC5E15CA7000000</id>
+ </ids>
+ <!-- Registers -->
+ <registers>
+ <!-- AXI rate change block registers -->
+ <setreg>
+ <name>N</name>
+ <address>128</address>
+ </setreg>
+ <setreg>
+ <name>M</name>
+ <address>129</address>
+ </setreg>
+ <setreg>
+ <!-- 1 bit, enable clear user -->
+ <name>CONFIG</name>
+ <address>130</address>
+ </setreg>
+ <!-- DDC block registers -->
+ <setreg>
+ <!-- CORDIC phase increment word -->
+ <name>CORDIC_FREQ</name>
+ <address>132</address>
+ </setreg>
+ <setreg>
+ <!-- Scaling factor to compensate for gain through filters and CORDIC -->
+ <name>SCALE_IQ</name>
+ <address>133</address>
+ </setreg>
+ <setreg>
+ <!-- DDC control word, 10 bits total, 2 bits for Halfbands, 8 bits for CIC rate -->
+ <name>DECIM_WORD</name>
+ <address>134</address>
+ </setreg>
+ <setreg>
+ <!-- Real mode, swap IQ -->
+ <name>MODE</name>
+ <address>135</address>
+ </setreg>
+ <setreg>
+ <!-- Filter coefficients reload -->
+ <name>RELOAD</name>
+ <address>136</address>
+ </setreg>
+ </registers>
+ <!-- Args -->
+ <args>
+ <arg>
+ <name>freq</name>
+ <type>double</type>
+ <value>0.0</value>
+ <port>0</port>
+ <!--<action>-->
+ <!--SR_WRITE("CORDIC_FREQ", $cordic_freq)-->
+ <!--</action>-->
+ <!--FIXME Calculate this properly-->
+ </arg>
+ <arg>
+ <name>input_rate</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>0</port>
+ <check>GE($input_rate, 0.0)</check>
+ <check_message>The input rate must be a positive value (in Hz).</check_message>
+ </arg>
+ <arg>
+ <name>output_rate</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>0</port>
+ <check>GE($output_rate, 0.0)</check>
+ <check_message>The output rate must be a positive value (in Hz).</check_message>
+ </arg>
+ <arg>
+ <name>fullscale</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>0</port>
+ <check>GE($fullscale, 0.0)</check>
+ </arg>
+ <arg>
+ <name>scalar_correction</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>0</port>
+ </arg>
+ <arg>
+ <name>freq</name>
+ <type>double</type>
+ <value>0.0</value>
+ <port>1</port>
+ <!--<action>-->
+ <!--SR_WRITE("CORDIC_FREQ", $cordic_freq)-->
+ <!--</action>-->
+ <!--FIXME Calculate this properly-->
+ </arg>
+ <arg>
+ <name>input_rate</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>1</port>
+ <check>GE($input_rate, 0.0)</check>
+ <check_message>The input rate must be a positive value (in Hz).</check_message>
+ </arg>
+ <arg>
+ <name>output_rate</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>1</port>
+ <check>GE($output_rate, 0.0)</check>
+ <check_message>The output rate must be a positive value (in Hz).</check_message>
+ </arg>
+ <arg>
+ <name>fullscale</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>1</port>
+ <check>GE($fullscale, 0.0)</check>
+ </arg>
+ <arg>
+ <name>scalar_correction</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>1</port>
+ </arg>
+ </args>
+ <!--All the connections to the outside world are listed in 'ports':-->
+ <ports>
+ <sink>
+ <name>in0</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in1</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in2</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in3</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in4</name>
+ <type>s16</type>
+ </sink>
+ <source>
+ <name>out0</name>
+ <type>sc16</type>
+ </source>
+ <source>
+ <name>out1</name>
+ <type>sc16</type>
+ </source>
+ <source>
+ <name>out2</name>
+ <type>sc16</type>
+ </source>
+ <source>
+ <name>out3</name>
+ <type>sc16</type>
+ </source>
+ <source>
+ <name>out4</name>
+ <type>sc16</type>
+ </source>
+ </ports>
+</nocblock>
+
diff --git a/host/include/uhd/rfnoc/blocks/radio_eiscat.xml b/host/include/uhd/rfnoc/blocks/radio_eiscat.xml
new file mode 100644
index 000000000..03b440943
--- /dev/null
+++ b/host/include/uhd/rfnoc/blocks/radio_eiscat.xml
@@ -0,0 +1,229 @@
+<nocblock>
+ <name>Radio (EISCAT)</name>
+ <blockname>Radio</blockname>
+ <key>EISCATRadio</key>
+ <!--There can be several of these:-->
+ <ids>
+ <id revision="0">E15CA70000000000</id>
+ </ids>
+ <!-- Registers -->
+ <registers>
+ <setreg>
+ <!--1-Bit register. Are we sending the upper or lower 5 beam contirbutions? -->
+ <name>SR_BEAMS_TO_NEIGHBOR</name>
+ <address>135</address>
+ </setreg>
+ <setreg>
+ <!--1-Bit register. Are we expecting previous contributions? 1==yes we are -->
+ <name>SR_PREV_OR_NULL</name>
+ <address>136</address>
+ </setreg>
+ <setreg>
+ <!--1-Bit register. Are we expecting previous contributions? 1==yes we are -->
+ <name>SR_FIR_COMMANDS_RELOAD</name>
+ <address>131</address>
+ </setreg>
+ <setreg>
+ <name>SR_FIR_COMMANDS_CTRL_TIME_HI</name>
+ <address>132</address>
+ </setreg>
+ <setreg>
+ <name>SR_FIR_COMMANDS_CTRL_TIME_LO</name>
+ <address>133</address>
+ </setreg>
+ <setreg>
+ <!-- Use this to actually update taps in RAM -->
+ <name>SR_FIR_BRAM_WRITE_TAPS</name>
+ <address>134</address>
+ </setreg>
+ <!--<setreg>-->
+ <!--<name>SR_CHANNEL_GAIN_0</name>-->
+ <!--<address>190</address>-->
+ <!--</setreg>-->
+ <readback>
+ <name>RB_NUM_TAPS</name>
+ <address>0</address>
+ </readback>
+ <readback>
+ <name>RB_NUM_CHANNELS</name>
+ <address>1</address>
+ </readback>
+ <readback>
+ <name>RB_NUM_BEAMS</name>
+ <address>2</address>
+ </readback>
+ <readback>
+ <name>RB_NUM_FILTERS</name>
+ <address>3</address>
+ </readback>
+ <readback>
+ <name>RB_VITA_TIME</name>
+ <address>4</address>
+ </readback>
+ </registers>
+ <!-- Args -->
+ <args>
+ <!--Gets applied to all channels-->
+ <arg>
+ <name>spp</name>
+ <type>int</type>
+ <value>1996</value>
+ </arg>
+ <arg>
+ <name>taps</name>
+ <type>int</type>
+ </arg>
+ <arg>
+ <name>use_prev</name>
+ <type>int</type>
+ <value>0</value>
+ <check>EQUAL($use_prev, 0) OR EQUAL($use_prev, 1)</check>
+ <check_message>use_prev must be 0 or 1.</check_message>
+ <action>SR_WRITE("SR_PREV_OR_NULL", $use_prev) AND SR_WRITE("SR_PREV_OR_NULL", $use_prev)</action>
+ </arg>
+ <arg>
+ <name>neighbors</name>
+ <type>int</type>
+ <value>0</value>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>0</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>1</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>2</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>3</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>4</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>5</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>6</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>7</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>8</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>9</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>10</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>11</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>12</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>13</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>14</port>
+ </arg>
+ <arg>
+ <name>gain</name>
+ <type>double</type>
+ <value>1.0</value>
+ <port>15</port>
+ </arg>
+ </args>
+ <ports>
+ <source>
+ <name>out0</name>
+ <type>s16</type>
+ </source>
+ <source>
+ <name>out1</name>
+ <type>s16</type>
+ </source>
+ <source>
+ <name>out2</name>
+ <type>s16</type>
+ </source>
+ <source>
+ <name>out3</name>
+ <type>s16</type>
+ </source>
+ <source>
+ <name>out4</name>
+ <type>s16</type>
+ </source>
+ <sink>
+ <name>in0</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in1</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in2</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in3</name>
+ <type>s16</type>
+ </sink>
+ <sink>
+ <name>in4</name>
+ <type>s16</type>
+ </sink>
+ </ports>
+</nocblock>
+
diff --git a/host/lib/usrp/CMakeLists.txt b/host/lib/usrp/CMakeLists.txt
index 6d69093e9..0f8172d41 100644
--- a/host/lib/usrp/CMakeLists.txt
+++ b/host/lib/usrp/CMakeLists.txt
@@ -49,4 +49,3 @@ INCLUDE_SUBDIRECTORY(e300)
INCLUDE_SUBDIRECTORY(x300)
INCLUDE_SUBDIRECTORY(b200)
INCLUDE_SUBDIRECTORY(n230)
-INCLUDE_SUBDIRECTORY(magnesium)
diff --git a/host/lib/usrp/dboard/CMakeLists.txt b/host/lib/usrp/dboard/CMakeLists.txt
index 92d2b2a24..1372406b8 100644
--- a/host/lib/usrp/dboard/CMakeLists.txt
+++ b/host/lib/usrp/dboard/CMakeLists.txt
@@ -45,3 +45,5 @@ IF(ENABLE_X300)
)
ENDIF(ENABLE_X300)
+INCLUDE_SUBDIRECTORY(magnesium)
+INCLUDE_SUBDIRECTORY(eiscat)
diff --git a/host/lib/usrp/dboard/eiscat/CMakeLists.txt b/host/lib/usrp/dboard/eiscat/CMakeLists.txt
new file mode 100644
index 000000000..bd55dcc14
--- /dev/null
+++ b/host/lib/usrp/dboard/eiscat/CMakeLists.txt
@@ -0,0 +1,24 @@
+#
+# Copyright 2017 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/>.
+#
+
+IF(ENABLE_NETD AND ENABLE_EISCAT)
+ LIST(APPEND EISCAT_SOURCES
+ ${CMAKE_CURRENT_SOURCE_DIR}/eiscat_radio_ctrl_impl.cpp
+ )
+ LIBUHD_APPEND_SOURCES(${EISCAT_SOURCES})
+ENDIF(ENABLE_NETD AND ENABLE_EISCAT)
+
diff --git a/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.cpp
new file mode 100644
index 000000000..e65f2f6df
--- /dev/null
+++ b/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.cpp
@@ -0,0 +1,178 @@
+//
+// Copyright 2017 Ettus Research (National Instruments Corp.)
+//
+// 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 "eiscat_radio_ctrl_impl.hpp"
+
+#include <uhd/utils/log.hpp>
+#include <uhd/rfnoc/node_ctrl_base.hpp>
+#include <uhd/transport/chdr.hpp>
+#include <uhd/utils/math.hpp>
+#include <boost/algorithm/string.hpp>
+#include <boost/make_shared.hpp>
+#include <boost/date_time/posix_time/posix_time_io.hpp>
+
+using namespace uhd;
+using namespace uhd::usrp;
+using namespace uhd::rfnoc;
+
+static const size_t IO_MASTER_RADIO = 0;
+static const double EISCAT_TICK_RATE = 208e6; // Hz
+static const double EISCAT_RADIO_RATE = 104e6; // Hz
+static const double EISCAT_CENTER_FREQ = 104e6; // Hz
+static const double EISCAT_DEFAULT_GAIN = 0.0; // Hz
+static const double EISCAT_DEFAULT_BANDWIDTH = 52e6; // Hz
+static const std::string EISCAT_ANTENNA_NAME = "Rx";
+static const size_t EISCAT_NUM_CHANS = 5;
+
+UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR(eiscat_radio_ctrl)
+{
+ UHD_LOG_TRACE("EISCAT", "eiscat_radio_ctrl_impl::ctor() ");
+ _radio_type = (get_block_id().get_block_count() == IO_MASTER_RADIO) ? PRIMARY : SECONDARY;
+ _radio_slot = (get_block_id().get_block_count() == IO_MASTER_RADIO) ? "A" : "B";
+ UHD_LOG_TRACE("EISCAT", "Radio slot: " << _radio_slot);
+ const size_t num_chans = get_output_ports().size();
+ UHD_ASSERT_THROW(num_chans == EISCAT_NUM_CHANS);
+ UHD_LOG_TRACE("EISCAT", "Number of channels: " << num_chans);
+
+ UHD_LOG_TRACE("EISCAT", "Setting tick rate to " << EISCAT_TICK_RATE/1e6 << " MHz");
+ radio_ctrl_impl::set_rate(EISCAT_TICK_RATE);
+
+ // For legacy prop tree init:
+ fs_path fe_path = fs_path("dboards" / _radio_slot / "rx_frontends");
+
+ // Init parent class
+ for (size_t chan = 0; chan < num_chans; chan++) {
+ radio_ctrl_impl::set_rx_frequency(EISCAT_CENTER_FREQ, chan);
+ radio_ctrl_impl::set_rx_gain(EISCAT_DEFAULT_GAIN, chan);
+ radio_ctrl_impl::set_rx_antenna(EISCAT_ANTENNA_NAME, chan);
+ radio_ctrl_impl::set_rx_bandwidth(EISCAT_DEFAULT_BANDWIDTH, chan);
+
+ // Legacy prop tree paths (for use with multi_usrp API)
+ _tree->access<std::string>(fe_path / chan / "antenna" / "value")
+ .add_coerced_subscriber(boost::bind(&eiscat_radio_ctrl_impl::set_rx_antenna, this, _1, chan))
+ .set_publisher(boost::bind(&radio_ctrl_impl::get_rx_antenna, this, chan))
+ ;
+ _tree->access<double>(fe_path / chan / "freq" / "value")
+ .set_coercer(boost::bind(&eiscat_radio_ctrl_impl::set_rx_frequency, this, _1, chan))
+ .set_publisher(boost::bind(&radio_ctrl_impl::get_rx_frequency, this, chan))
+ ;
+ _tree->access<double>(fe_path / chan / "gain" / "value")
+ .set_coercer(boost::bind(&eiscat_radio_ctrl_impl::set_rx_gain, this, _1, chan))
+ .set_publisher(boost::bind(&radio_ctrl_impl::get_rx_gain, this, chan))
+ ;
+ _tree->access<double>(fe_path / chan / "bandwidth" / "value")
+ .set_coercer(boost::bind(&eiscat_radio_ctrl_impl::set_rx_bandwidth, this, _1, chan))
+ .set_publisher(boost::bind(&radio_ctrl_impl::get_rx_bandwidth, this, chan))
+ ;
+ // TODO: Add ranges or options for all of these. Not high-prio.
+ }
+
+ UHD_HERE();
+ UHD_VAR((_tree->exists(fs_path("time/cmd"))));
+}
+
+eiscat_radio_ctrl_impl::~eiscat_radio_ctrl_impl()
+{
+ UHD_LOG_TRACE("EISCAT", "eiscat_radio_ctrl_impl::dtor() ");
+}
+
+void eiscat_radio_ctrl_impl::set_tx_antenna(const std::string &, const size_t)
+{
+ throw uhd::runtime_error("Cannot set Tx antenna on EISCAT daughterboard");
+}
+
+void eiscat_radio_ctrl_impl::set_rx_antenna(const std::string & /* ant */, const size_t /* chan */)
+{
+ UHD_LOG_WARNING("EISCAT", "Ignoring attempt to set Rx antenna");
+}
+
+double eiscat_radio_ctrl_impl::get_tx_frequency(const size_t /* chan */)
+{
+ UHD_LOG_WARNING("EISCAT", "Ignoring attempt to read Tx frequency");
+ return 0.0;
+}
+
+double eiscat_radio_ctrl_impl::set_tx_frequency(const double /* freq */, const size_t /* chan */)
+{
+ throw uhd::runtime_error("Cannot set Tx frequency on EISCAT daughterboard");
+}
+
+double eiscat_radio_ctrl_impl::set_rx_frequency(const double freq, const size_t chan)
+{
+ if (freq != get_rx_frequency(chan)) {
+ UHD_LOG_WARNING("EISCAT", "Ignoring attempt to set Rx frequency");
+ }
+ return get_rx_frequency(chan);
+}
+
+double eiscat_radio_ctrl_impl::set_rx_bandwidth(const double bandwidth, const size_t chan)
+{
+ if (bandwidth != get_rx_bandwidth(chan)) {
+ UHD_LOG_WARNING("EISCAT", "Ignoring attempt to set Rx bandwidth");
+ }
+ return get_rx_bandwidth(chan);
+}
+
+
+double eiscat_radio_ctrl_impl::set_tx_gain(const double /* gain */, const size_t /* chan */)
+{
+ throw uhd::runtime_error("Cannot set Tx gain on EISCAT daughterboard");
+}
+
+double eiscat_radio_ctrl_impl::set_rx_gain(const double gain, const size_t chan)
+{
+ // TODO: Add ability to set digital gain or make it explicit this function is not supported.
+ if (gain != get_rx_gain(chan)) {
+ UHD_LOG_WARNING("EISCAT", "Ignoring attempt to set Rx gain.");
+ }
+ return get_rx_gain(chan);
+}
+
+double eiscat_radio_ctrl_impl::set_rate(double rate)
+{
+ if (rate != get_rate()) {
+ UHD_LOG_WARNING("EISCAT", "Attempting to set sampling rate to invalid value " << rate);
+ }
+ return get_rate();
+}
+
+size_t eiscat_radio_ctrl_impl::get_chan_from_dboard_fe(const std::string &fe, const uhd::direction_t dir)
+{
+ if (dir != uhd::direction_t::RX_DIRECTION) {
+ throw uhd::runtime_error("Unable to get chan from fe, EISCAT only has Rx frontends");
+ }
+
+ // A:0 -> A:7, B:0 -> B:7
+ return boost::lexical_cast<size_t>(fe.substr(2));
+}
+
+std::string eiscat_radio_ctrl_impl::get_dboard_fe_from_chan(const size_t chan, const uhd::direction_t dir)
+{
+ if (dir != uhd::direction_t::RX_DIRECTION) {
+ throw uhd::runtime_error("Unable to get fe from chan, EISCAT only has Rx frontends");
+ }
+
+ // A:0 -> A:7, B:0 -> B:7
+ return _radio_slot + ':' + std::to_string(chan);
+}
+
+double eiscat_radio_ctrl_impl::get_output_samp_rate(size_t /* port */)
+{
+ return EISCAT_RADIO_RATE;
+}
+
+UHD_RFNOC_BLOCK_REGISTER(eiscat_radio_ctrl, "EISCATRadio");
diff --git a/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp
new file mode 100644
index 000000000..5ffdffc6a
--- /dev/null
+++ b/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp
@@ -0,0 +1,73 @@
+//
+// Copyright 2017 Ettus Research
+//
+// 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_LIBUHD_RFNOC_EISCAT_RADIO_CTRL_IMPL_HPP
+#define INCLUDED_LIBUHD_RFNOC_EISCAT_RADIO_CTRL_IMPL_HPP
+
+#include "radio_ctrl_impl.hpp"
+#include "uhd/types/direction.hpp"
+
+namespace uhd {
+ namespace rfnoc {
+
+/*! \brief Provide access to an eiscat radio.
+ */
+class eiscat_radio_ctrl_impl : public radio_ctrl_impl
+{
+public:
+ typedef boost::shared_ptr<eiscat_radio_ctrl_impl> sptr;
+
+ /************************************************************************
+ * Structors
+ ***********************************************************************/
+ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR_DECL(eiscat_radio_ctrl)
+ virtual ~eiscat_radio_ctrl_impl();
+
+ /************************************************************************
+ * API calls
+ * Note: Tx calls are here mostly to throw errors.
+ ***********************************************************************/
+ double set_rate(double rate);
+
+ void set_tx_antenna(const std::string &ant, const size_t chan);
+ void set_rx_antenna(const std::string &ant, const size_t chan);
+
+ double set_tx_frequency(const double freq, const size_t chan);
+ double set_rx_frequency(const double freq, const size_t chan);
+ double set_rx_bandwidth(const double bandwidth, const size_t chan);
+ double get_tx_frequency(const size_t chan);
+
+ double set_tx_gain(const double gain, const size_t chan);
+ double set_rx_gain(const double gain, const size_t chan);
+
+ size_t get_chan_from_dboard_fe(const std::string &fe, const uhd::direction_t dir);
+ std::string get_dboard_fe_from_chan(const size_t chan, const uhd::direction_t dir);
+
+ double get_output_samp_rate(size_t port);
+
+private:
+ enum radio_connection_t { PRIMARY, SECONDARY };
+
+ radio_connection_t _radio_type;
+ std::string _radio_slot;
+}; /* class radio_ctrl_impl */
+
+}} /* namespace uhd::rfnoc */
+
+#endif /* INCLUDED_LIBUHD_RFNOC_EISCAT_RADIO_CTRL_IMPL_HPP */
+// vim: sw=4 et:
+
diff --git a/host/lib/usrp/magnesium/CMakeLists.txt b/host/lib/usrp/dboard/magnesium/CMakeLists.txt
index 6d3f53fba..6d3f53fba 100644
--- a/host/lib/usrp/magnesium/CMakeLists.txt
+++ b/host/lib/usrp/dboard/magnesium/CMakeLists.txt
diff --git a/host/lib/usrp/magnesium/magnesium_radio_ctrl_impl.cpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
index 6bac969ed..6bac969ed 100644
--- a/host/lib/usrp/magnesium/magnesium_radio_ctrl_impl.cpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.cpp
diff --git a/host/lib/usrp/magnesium/magnesium_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
index ea8282532..ea8282532 100644
--- a/host/lib/usrp/magnesium/magnesium_radio_ctrl_impl.hpp
+++ b/host/lib/usrp/dboard/magnesium/magnesium_radio_ctrl_impl.hpp
diff --git a/host/lib/usrp/netd/netd_impl.cpp b/host/lib/usrp/netd/netd_impl.cpp
index 5a8b3e59c..557ebff4a 100644
--- a/host/lib/usrp/netd/netd_impl.cpp
+++ b/host/lib/usrp/netd/netd_impl.cpp
@@ -106,15 +106,15 @@ netd_impl::netd_impl(const device_addr_t& device_addr) :
try {
enumerate_rfnoc_blocks(
0,
- 1,
+ 3, /* num blocks */
3, /* base port */
uhd::sid_t(0x0200),
device_addr
);
- } catch (...) {
- printf("%s Derp\n", __func__);
+ } catch (const std::exception &ex) {
+ UHD_HERE();
+ std::cout << ex.what() << std::endl;
}
-
}
netd_impl::~netd_impl() {}