// // Copyright 2015-2016 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 . // #ifndef INCLUDED_LIBUHD_RFNOC_E3XX_RADIO_CTRL_IMPL_HPP #define INCLUDED_LIBUHD_RFNOC_E3XX_RADIO_CTRL_IMPL_HPP #include "e300_global_regs.hpp" #include #include #include #include #include namespace uhd { namespace rfnoc { /*! \brief Provide access to an E3XX radio. */ class e3xx_radio_ctrl_impl : public radio_ctrl_impl { public: /************************************************************************ * Structors ***********************************************************************/ UHD_RFNOC_RADIO_BLOCK_CONSTRUCTOR_DECL(e3xx_radio_ctrl) virtual ~e3xx_radio_ctrl_impl(); /************************************************************************ * API calls ***********************************************************************/ 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_tx_gain(const double gain, const size_t chan); double set_rx_gain(const double gain, const size_t chan); double set_rx_bandwidth(const double bandwidth, const size_t chan); double get_tx_gain(const size_t chan); double get_rx_gain(const size_t chan); double get_rx_bandwidth(const size_t chan); std::vector get_gpio_banks() const; void set_gpio_attr(const std::string &bank, const std::string &attr, const uint32_t value, const uint32_t mask); uint32_t get_gpio_attr(const std::string &bank, const std::string &attr); size_t get_chan_from_dboard_fe(const std::string &fe, const direction_t); std::string get_dboard_fe_from_chan(const size_t chan, const direction_t); /************************************************************************ * RFIC setup and control ***********************************************************************/ /*! Set up the radio. No API calls may be made before this one. */ void setup_radio(uhd::usrp::ad9361_ctrl::sptr safe_codec_ctrl); private: void _setup_radio_channel(const size_t chan); void _reset_radio(void); protected: /************************************************************************ * Helpers ***********************************************************************/ virtual bool check_radio_config(); void _enforce_tick_rate_limits(const size_t chans, const double tick_rate); private: /************************************************************************ * Peripheral controls ***********************************************************************/ void _update_fe_lo_freq(const std::string &fe, const double freq); void _update_atrs(void); void _update_atr_leds(uhd::usrp::gpio_atr::gpio_atr_3000::sptr leds, const std::string &rx_ant); void _update_gpio_state(void); void _update_enables(void); void _update_time_source(const std::string &source); // get frontend lock sensor uhd::sensor_value_t _get_fe_pll_lock(const bool is_tx); /************************************************************************ * Internal GPIO control ***********************************************************************/ struct gpio_t { gpio_t() : pps_sel(uhd::usrp::e300::global_regs::PPS_INT), mimo(0), radio_rst(0), tx_bandsels(0), rx_bandsel_a(0), rx_bandsel_b(0), rx_bandsel_c(0) {} uint32_t pps_sel; uint32_t mimo; uint32_t radio_rst; uint32_t tx_bandsels; uint32_t rx_bandsel_a; uint32_t rx_bandsel_b; uint32_t rx_bandsel_c; static const size_t PPS_SEL = 0; static const size_t MIMO = 2; static const size_t RADIO_RST = 3; static const size_t TX_BANDSEL = 4; static const size_t RX_BANDSELA = 7; static const size_t RX_BANDSELB = 13; static const size_t RX_BANDSELC = 17; }; uint8_t _get_internal_gpio(uhd::usrp::gpio_atr::gpio_atr_3000::sptr); private: // members struct e3xx_perifs_t { usrp::gpio_atr::gpio_atr_3000::sptr atr; uhd::usrp::gpio_atr::gpio_atr_3000::sptr leds; }; //! SPI to talk to the AD936x spi_core_3000::sptr _spi; //! One ATR per channel std::map _e3xx_perifs; //! AD936x controls uhd::usrp::ad9361_ctrl::sptr _codec_ctrl; uhd::usrp::ad936x_manager::sptr _codec_mgr; gpio_t _misc; }; /* class radio_ctrl_impl */ }} /* namespace uhd::rfnoc */ #endif /* INCLUDED_LIBUHD_RFNOC_E3XX_RADIO_CTRL_IMPL_HPP */