aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/n230/n230_frontend_ctrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'host/lib/usrp/n230/n230_frontend_ctrl.cpp')
-rw-r--r--host/lib/usrp/n230/n230_frontend_ctrl.cpp233
1 files changed, 0 insertions, 233 deletions
diff --git a/host/lib/usrp/n230/n230_frontend_ctrl.cpp b/host/lib/usrp/n230/n230_frontend_ctrl.cpp
deleted file mode 100644
index 7cbe578eb..000000000
--- a/host/lib/usrp/n230/n230_frontend_ctrl.cpp
+++ /dev/null
@@ -1,233 +0,0 @@
-//
-// Copyright 2013-2014,2016 Ettus Research LLC
-// Copyright 2018 Ettus Research, a National Instruments Company
-//
-// SPDX-License-Identifier: GPL-3.0-or-later
-//
-
-#include "n230_frontend_ctrl.hpp"
-
-#include <uhd/utils/log.hpp>
-#include <uhd/exception.hpp>
-#include <uhd/types/dict.hpp>
-#include <boost/format.hpp>
-#include <boost/thread.hpp>
-#include "n230_fpga_defs.h"
-
-namespace uhd { namespace usrp { namespace n230 {
-
-/* ATR Control Bits */
-static const uint32_t TX_ENABLE = (1 << 7);
-static const uint32_t SFDX_RX = (1 << 6);
-static const uint32_t SFDX_TX = (1 << 5);
-static const uint32_t SRX_RX = (1 << 4);
-static const uint32_t SRX_TX = (1 << 3);
-static const uint32_t LED_RX = (1 << 2);
-static const uint32_t LED_TXRX_RX = (1 << 1);
-static const uint32_t LED_TXRX_TX = (1 << 0);
-
-/* ATR State Definitions. */
-static const uint32_t STATE_OFF = 0x00;
-static const uint32_t STATE_RX_RX2 = (SFDX_RX
- | SFDX_TX
- | LED_RX);
-static const uint32_t STATE_RX_TXRX = (SRX_RX
- | SRX_TX
- | LED_TXRX_RX);
-static const uint32_t STATE_FDX_TXRX = (TX_ENABLE
- | SFDX_RX
- | SFDX_TX
- | LED_TXRX_TX
- | LED_RX);
-static const uint32_t STATE_TX_TXRX = (TX_ENABLE
- | SFDX_RX
- | SFDX_TX
- | LED_TXRX_TX);
-
-using namespace uhd::usrp;
-
-class n230_frontend_ctrl_impl : public n230_frontend_ctrl
-{
-public:
- n230_frontend_ctrl_impl(
- radio_ctrl_core_3000::sptr core_ctrl,
- fpga::core_misc_reg_t& core_misc_reg,
- ad9361_ctrl::sptr codec_ctrl,
- const std::vector<gpio_atr::gpio_atr_3000::sptr>& gpio_cores
- ): _core_ctrl(core_ctrl),
- _codec_ctrl(codec_ctrl),
- _gpio_cores(gpio_cores),
- _core_misc_reg(core_misc_reg)
- {
- }
-
- virtual ~n230_frontend_ctrl_impl()
- {
- }
-
- void set_antenna_sel(const size_t which, const std::string &ant)
- {
- if (ant != "TX/RX" and ant != "RX2")
- throw uhd::value_error("n230: unknown RX antenna option: " + ant);
-
- _fe_states[which].rx_ant = ant;
- _flush_atr_state();
- }
-
- void set_stream_state(const fe_state_t fe0_state_, const fe_state_t fe1_state_)
- {
- //Update soft-state
- _fe_states[0].state = fe0_state_;
- _fe_states[1].state = fe1_state_;
-
- const fe_state_t fe0_state = _fe_states[0].state;
- const fe_state_t fe1_state = (_gpio_cores.size() > 1) ? _fe_states[1].state : NONE_STREAMING;
-
- const size_t num_tx = (_is_tx(fe0_state) ? 1 : 0) + (_is_tx(fe1_state) ? 1 : 0);
- const size_t num_rx = (_is_rx(fe0_state) ? 1 : 0) + (_is_rx(fe1_state) ? 1 : 0);
-
- //setup the active chains in the codec
- if ((num_rx + num_tx) == 0) {
- _codec_ctrl->set_active_chains(
- true, false,
- true, false); //enable something
- } else {
- _codec_ctrl->set_active_chains(
- _is_tx(fe0_state), _is_tx(fe1_state),
- _is_rx(fe0_state), _is_rx(fe1_state));
- }
-
- _core_misc_reg.flush();
- //atrs change based on enables
- _flush_atr_state();
- }
-
-
- void set_stream_state(const size_t which, const fe_state_t state)
- {
- if (which == 0) {
- set_stream_state(state, _fe_states[1].state);
- } else if (which == 1) {
- set_stream_state(_fe_states[0].state, state);
- } else {
- throw uhd::value_error(
- str(boost::format("n230: unknown stream index option: %d") % which)
- );
- }
- }
-
- void set_bandsel(const std::string& which, double freq)
- {
- using namespace n230::fpga;
-
- if(which[0] == 'R') {
- if(freq < 2.2e9) {
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_A, 0);
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_B, 0);
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_C, 1);
- } else if((freq >= 2.2e9) && (freq < 4e9)) {
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_A, 0);
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_B, 1);
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_C, 0);
- } else if((freq >= 4e9) && (freq <= 6e9)) {
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_A, 1);
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_B, 0);
- _core_misc_reg.set(core_misc_reg_t::RX_BANDSEL_C, 0);
- } else {
- UHD_THROW_INVALID_CODE_PATH();
- }
- } else if(which[0] == 'T') {
- if(freq < 2.5e9) {
- _core_misc_reg.set(core_misc_reg_t::TX_BANDSEL_A, 0);
- _core_misc_reg.set(core_misc_reg_t::TX_BANDSEL_B, 1);
- } else if((freq >= 2.5e9) && (freq <= 6e9)) {
- _core_misc_reg.set(core_misc_reg_t::TX_BANDSEL_A, 1);
- _core_misc_reg.set(core_misc_reg_t::TX_BANDSEL_B, 0);
- } else {
- UHD_THROW_INVALID_CODE_PATH();
- }
- } else {
- UHD_THROW_INVALID_CODE_PATH();
- }
-
- _core_misc_reg.flush();
- }
-
- void set_self_test_mode(self_test_mode_t mode)
- {
- switch (mode) {
- case LOOPBACK_RADIO: {
- _core_ctrl->poke32(fpga::sr_addr(fpga::SR_CORE_LOOPBACK), 0x1);
- } break;
- case LOOPBACK_CODEC: {
- _core_ctrl->poke32(fpga::sr_addr(fpga::SR_CORE_LOOPBACK), 0x0);
- _codec_ctrl->data_port_loopback(true);
- } break;
- //Default = disable
- default:
- case LOOPBACK_DISABLED: {
- _core_ctrl->poke32(fpga::sr_addr(fpga::SR_CORE_LOOPBACK), 0x0);
- _codec_ctrl->data_port_loopback(false);
- } break;
- }
- }
-
-private:
- void _flush_atr_state()
- {
- for (size_t i = 0; i < _gpio_cores.size(); i++) {
- const fe_state_cache_t& fe_state_cache = _fe_states[i];
- const bool enb_rx = _is_rx(fe_state_cache.state);
- const bool enb_tx = _is_tx(fe_state_cache.state);
- const bool is_rx2 = (fe_state_cache.rx_ant == "RX2");
- const size_t rxonly = (enb_rx)? ((is_rx2)? STATE_RX_RX2 : STATE_RX_TXRX) : STATE_OFF;
- const size_t txonly = (enb_tx)? (STATE_TX_TXRX) : STATE_OFF;
- size_t fd = STATE_OFF;
- if (enb_rx and enb_tx) fd = STATE_FDX_TXRX;
- if (enb_rx and not enb_tx) fd = rxonly;
- if (not enb_rx and enb_tx) fd = txonly;
- _gpio_cores[i]->set_atr_reg(gpio_atr::ATR_REG_IDLE, STATE_OFF);
- _gpio_cores[i]->set_atr_reg(gpio_atr::ATR_REG_RX_ONLY, rxonly);
- _gpio_cores[i]->set_atr_reg(gpio_atr::ATR_REG_TX_ONLY, txonly);
- _gpio_cores[i]->set_atr_reg(gpio_atr::ATR_REG_FULL_DUPLEX, fd);
- }
- }
-
- inline static bool _is_tx(const fe_state_t state)
- {
- return state == TX_STREAMING || state == TXRX_STREAMING;
- }
-
- inline static bool _is_rx(const fe_state_t state)
- {
- return state == RX_STREAMING || state == TXRX_STREAMING;
- }
-
-private:
- struct fe_state_cache_t {
- fe_state_cache_t() : state(NONE_STREAMING), rx_ant("RX2")
- {}
- fe_state_t state;
- std::string rx_ant;
- };
-
- radio_ctrl_core_3000::sptr _core_ctrl;
- ad9361_ctrl::sptr _codec_ctrl;
- std::vector<gpio_atr::gpio_atr_3000::sptr> _gpio_cores;
- fpga::core_misc_reg_t& _core_misc_reg;
- uhd::dict<size_t, fe_state_cache_t> _fe_states;
-};
-
-}}} //namespace
-
-using namespace uhd::usrp::n230;
-
-n230_frontend_ctrl::sptr n230_frontend_ctrl::make(
- radio_ctrl_core_3000::sptr core_ctrl,
- fpga::core_misc_reg_t& core_misc_reg,
- ad9361_ctrl::sptr codec_ctrl,
- const std::vector<gpio_atr::gpio_atr_3000::sptr>& gpio_cores)
-{
- return sptr(new n230_frontend_ctrl_impl(core_ctrl, core_misc_reg, codec_ctrl, gpio_cores));
-}
-