aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp')
-rw-r--r--host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp295
1 files changed, 0 insertions, 295 deletions
diff --git a/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp b/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp
deleted file mode 100644
index 3ce0b48fd..000000000
--- a/host/lib/usrp/dboard/eiscat/eiscat_radio_ctrl_impl.hpp
+++ /dev/null
@@ -1,295 +0,0 @@
-//
-// Copyright 2017 Ettus Research, a National Instruments Company
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-
-#ifndef INCLUDED_LIBUHD_RFNOC_EISCAT_RADIO_CTRL_IMPL_HPP
-#define INCLUDED_LIBUHD_RFNOC_EISCAT_RADIO_CTRL_IMPL_HPP
-
-#include <uhd/types/direction.hpp>
-#include <uhdlib/rfnoc/rpc_block_ctrl.hpp>
-#include <uhdlib/rfnoc/radio_ctrl_impl.hpp>
-
-namespace uhd {
- namespace rfnoc {
-
-/*! \brief Provide access to an EISCAT radio, including beamformer.
- *
- * Note: This will control both daughterboards. Since we have a single RFNoC
- * block, we only have one of these per motherboard.
- *
- * EISCAT radios have a whole bunch of features which don't have APIs provided
- * by radio_ctrl. This means the most interesting features are controlled by
- * set_arg() and get_arg(). Notable exception is set_rx_antenna(), which is
- * heavily abused for all sorts of things.
- *
- * List of relevant args:
- * - sysref (bool): Write to this to trigger a SYSREF pulse to *both*
- * daughterboards. Will honor command time. Will always return
- * true when read.
- * - gain (double): Set the gain for antenna X, where X is the set_arg() `port`
- * value. The gain is normalized in [0,1]. Can be read to get
- * the current value. Example: `set_arg("gain", 0.5, 5)` will
- * set the digital gain for antenna 5 to mid-point.
- * - fir_ctrl_time (time_spec_t): This time will be used for following
- * fir_select writes. Will return the last value
- * that was written.
- * - fir_select (int): Will queue a filter for manipulating a specific
- * contribution. The value is the filter index in the BRAM.
- * The port parameter specifies which filter; filters are
- * indexed 0...159 using the equation beam_index * 16 +
- * antenna_idx. Example: `set_arg("fir_select", 357, 16)`
- * will apply filter number 357 to the zeroth antenna for
- * beam number 1 (i.e. the second beam). Returns the last
- * value that was written. May be incorrect before written
- * for the first time.
- * - fir_taps (vector<int32_t>): Updates FIR tap values in the BRAM. Port is
- * the filter index. Will always return an impulse
- * response, not the actual filter value.
- * - assert_adcs_deframers (bool): Writing this does nothing. Reading it back
- * will run the initialization of ADCs and
- * deframers. Return value is success.
- * - assert_deframer_status (bool): Writing this does nothing. Reading it will
- * run the final step of the JESD deframer
- * initialization routine. Returns success.
- * - choose_beams (int): Configures beam selection (upper, lower, are neighbour
- * contributions included). See set_beam_selection() for
- * details.
- * - enable_firs (int): Can be used to disable fir FIR matrix. This routes the
- * JESD output directly to the noc_shell.
- * - enable_counter (int): If the feature is available in the given FPGA image,
- * setting this to true will disable the JESD core
- * output and will input a counter signal (ramp)
- * instead.
- * - configure_beams (int): Danger, danger: Directly writes the
- * SR_BEAMS_TO_NEIGHBOR register. Writing this can put
- * some of the other properties out of sync, because
- * writing to those will also write to this, but not
- * vice versa.
- *
- *
- * ## Time-aligned synchronization sequence:
- *
- * 0. Make sure all devices are getting the same ref clock and PPS!
- * 1. Call set_command_time() with the same time on all blocks (make it far
- * enough in the future)
- * 2. Call set_arg<bool>("sysref") on all blocks. This should SYSREF all dboards
- * synchronously.
- * 3. On all blocks, call get_arg<bool>("assert_adcs_deframers") and verify it
- * returns true.
- * 4. Repeat steps 1 and 2 with, obviously, another time that's in the future.
- * 5. On all blocks, call get_arg<bool>("assert_deframer_status") and make sure
- * it returned true.
- */
-class eiscat_radio_ctrl_impl : public radio_ctrl_impl, public rpc_block_ctrl
-{
-public:
- using sptr = boost::shared_ptr<eiscat_radio_ctrl_impl>;
- using fir_tap_t = int32_t; // See also EISCAT_BITS_PER_TAP
-
- /************************************************************************
- * 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.
- ***********************************************************************/
- //! Returns the actual tick rate. Will display a warning if rate is not that
- // value.
- double set_rate(double rate);
-
- //! \throws uhd::runtime_error
- void set_tx_antenna(const std::string &ant, const size_t chan);
-
- /*! Configures FPGA switching for antenna selection
- *
- * Valid antenna values:
- * - BF: This is the default. Will apply the beamforming matrix in whatever
- * state it currently is.
- * - RX0...RX15: Will mux the antenna signal 0...15 straight to this
- * channel. Note that this will disable the FIR matrix entirely, and will
- * also disable contributions from other USRPs globally.
- * - BF0...BF15: Will configure the FIR filter matrix such that only the
- * contributions from antenna 0...15 are passed to this channel. This
- * should produce the same signal as RX0..RX15, reduced by 12 dB (because
- * the FIR matri needs to account for bit growth from adding 16 channels).
- * Will also disable contributions from other channels globally.
- * - FI$idx: Here, $idx is a number (the filter index, hence the name).
- * This will apply filter index $idx to all input channels. Useful for
- * testing actual beamforming applications, when the same signal is
- * applied to all inputs.
- *
- * Note that this is very useful for testing and debugging. For actual
- * beamforming operations, this API call won't be enough. Rather, set this
- * to 'BF' (or don't do anything) and use the block properties
- *
- * \throws uhd::value_error if the antenna value was not valid
- */
- void set_rx_antenna(const std::string &ant, const size_t chan);
-
- //! \throws uhd::runtime_error
- double set_tx_frequency(const double freq, const size_t chan);
- //! \returns Some value in the EISCAT passband
- double set_rx_frequency(const double freq, const size_t chan);
- //! \returns Width of the EISCAT analog frontend filters
- double set_rx_bandwidth(const double bandwidth, const size_t chan);
- //! \throws uhd::runtime_error
- double get_tx_frequency(const size_t chan);
-
- //! \throws uhd::runtime_error
- double set_tx_gain(const double gain, const size_t chan);
- //! \returns zero
- 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);
-
- //! \returns The EISCAT sampling rate
- double get_output_samp_rate(size_t port);
-
- void set_rx_streamer(bool active, const size_t port);
- void issue_stream_cmd(const uhd::stream_cmd_t &stream_cmd, const size_t port);
-
-protected:
- virtual bool check_radio_config();
-
- /*! Finalize initialization sequence (ADCs, deframers) etc.
- */
- void set_rpc_client(
- uhd::rpc_client::sptr rpcc,
- const uhd::device_addr_t &block_args
- );
-
-private:
- /*************************************************************************
- * Private methods
- * To control the dboard (and execute these), take a look at the block
- * properties.
- ************************************************************************/
- /*! Write filter taps for a specific FIR filter.
- *
- * Note: If the number of taps is smaller than the number of available
- * filter taps, it is padded with zero (i.e., all taps are always written
- * and this can't be use to partially update filters).
- *
- * \param fir_idx The index of the FIR filter we are reprogramming
- * \param taps A list of FIR filter taps for this filter.
- *
- * \throws uhd::value_error if the number of taps is longer than the number
- * of taps that the filter can handle, or if any
- * tap has more bits than allowed.
- */
- void write_fir_taps(
- const size_t fir_idx,
- const std::vector<fir_tap_t> &taps
- );
-
- /*! Choose a filter to be applied between an output beam and antenna input
- *
- * \param beam_index Beam index
- * \param antenna_index Antenna index
- * \param fir_index The index of the FIR filter taps that get applied
- * \param time_spec If non-zero, the taps get applied at this time.
- * Otherwise, they get sent out now.
- * \param write_time If false, time will never get written *even if* it is
- * non-zero. The assumption is that someone else wrote
- * the value previously
- * \param write_time If false, time will never get written *even if* it is
- * non-zero. The assumption is that someone else wrote
- * the value previously
- */
- void select_filter(
- const size_t beam_index,
- const size_t antenna_index,
- const size_t fir_index,
- const uhd::time_spec_t &time_spec,
- const bool write_time=true
- );
-
-
- /*! Sets the command time for the next call to select_filter()
- *
- * \param time_spec This value gets written to the FPGA and is applied to
- * *all* subsequent filter selections. To request
- * immediate application of filters, set this to zero.
- */
- void set_fir_ctrl_time(const uhd::time_spec_t &time_spec);
-
- /*! Sets the digital gain on a specific antenna
- *
- * \param antenna_idx Antenna for which this gain setting applies
- * \param normalized_gain A value in [0, 1] which gets converted to a
- * digital gain value
- */
- void set_antenna_gain(
- const size_t antenna_idx,
- const double normalized_gain
- );
-
- /*! Directly writes a value to the beam configuration register.
- */
- void configure_beams(uint32_t reg_value);
-
- /*! Controls selection of beams coming from the FIR matrix.
- *
- * The following values are allowed:
- * - 0: We stream the lower 5 beams, plus the neighbours contribution
- * - 1: We stream the upper 5 beams, plus the neighbours contribution
- * - 2: We stream the lower 5 beams, without the neighbours contribution
- * - 3: We stream the upper 5 beams, without the neighbours contribution
- */
- void set_beam_selection(int beam_selection);
-
- /*! Controls if we're using the FIR matrix
- *
- * If this is false, the beam selection is irrelevant.
- */
- void enable_firs(bool enable);
-
- /*! Enables counter instead of JESD core output
- */
- void enable_counter(bool enable);
-
- //! Sends a SYSREF pulse. Device arg use_mpm_sysref can be used to send it
- // via MPM. Default is to send it via CHDR, in which case calling this
- // function *will modify the command time!*, but it will ensure that the
- // sysref is sent on an even time
- void send_sysref();
-
- //! Run initialization of JESD cores, put ADCs into reset
- bool assert_jesd_cores_initialized();
-
- //! Run initialization of ADCs and deframers; returns success status
- bool assert_adcs_deframers();
-
- //! Run final step of JESD core setup; returns success status
- bool assert_deframer_status();
-
- /*! The number of channels this block outputs
- *
- * This is *not* the number of antennas, but the number of streams a single
- * block outputs to the crossbar.
- */
- size_t _num_ports;
-
- //! Running with 1 dboard is theoretically possible; thus, store the
- // number of active dboards.
- size_t _num_dboards = 0;
-
- //! Additional block args; gets set during set_rpc_client()
- uhd::device_addr_t _block_args;
-
- /*! Reference to the RPC client
- */
- uhd::rpc_client::sptr _rpcc;
-
-}; /* class radio_ctrl_impl */
-
-}} /* namespace uhd::rfnoc */
-
-#endif /* INCLUDED_LIBUHD_RFNOC_EISCAT_RADIO_CTRL_IMPL_HPP */
-