diff options
Diffstat (limited to 'host')
| -rw-r--r-- | host/include/uhd/rfnoc/blocks/ddc_eiscat.xml | 178 | ||||
| -rw-r--r-- | host/include/uhd/rfnoc/blocks/radio_eiscat.xml | 229 | ||||
| -rw-r--r-- | host/lib/usrp/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/CMakeLists.txt | 2 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/eiscat/CMakeLists.txt | 24 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.cpp | 178 | ||||
| -rw-r--r-- | host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp | 73 | ||||
| -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.cpp | 8 | 
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() {} | 
