aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
diff options
context:
space:
mode:
authorMartin Braun <martin.braun@ettus.com>2019-07-03 20:15:35 -0700
committerMartin Braun <martin.braun@ettus.com>2019-11-26 12:16:25 -0800
commitc256b9df6502536c2e451e690f1ad5962c664d1a (patch)
treea83ad13e6f5978bbe14bb3ecf8294ba1e3d28db4 /host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
parent9a8435ed998fc5c65257f4c55768750b227ab19e (diff)
downloaduhd-c256b9df6502536c2e451e690f1ad5962c664d1a.tar.gz
uhd-c256b9df6502536c2e451e690f1ad5962c664d1a.tar.bz2
uhd-c256b9df6502536c2e451e690f1ad5962c664d1a.zip
x300/mpmd: Port all RFNoC devices to the new RFNoC framework
Co-Authored-By: Alex Williams <alex.williams@ni.com> Co-Authored-By: Sugandha Gupta <sugandha.gupta@ettus.com> Co-Authored-By: Brent Stapleton <brent.stapleton@ettus.com> Co-Authored-By: Ciro Nishiguchi <ciro.nishiguchi@ni.com>
Diffstat (limited to 'host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp')
-rw-r--r--host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp212
1 files changed, 212 insertions, 0 deletions
diff --git a/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp b/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
new file mode 100644
index 000000000..b7524e04c
--- /dev/null
+++ b/host/lib/usrp/dboard/e3xx/e31x_radio_control_impl.cpp
@@ -0,0 +1,212 @@
+//
+// Copyright 2018 Ettus Research, a National Instruments Company
+//
+// SPDX-License-Identifier: GPL-3.0-or-later
+//
+
+#include "e31x_radio_control_impl.hpp"
+#include "e31x_regs.hpp"
+#include <uhd/rfnoc/registry.hpp>
+
+using namespace uhd;
+using namespace uhd::usrp;
+using namespace uhd::rfnoc;
+
+e31x_radio_control_impl::e31x_radio_control_impl(make_args_ptr make_args)
+ : e3xx_radio_control_impl(std::move(make_args))
+{
+ // Swap front ends for E310
+ _fe_swap = true;
+ _init_mpm();
+}
+
+e31x_radio_control_impl::~e31x_radio_control_impl()
+{
+ RFNOC_LOG_TRACE("e31x_radio_control_impl::dtor()");
+}
+
+/******************************************************************************
+ * API Calls
+ *****************************************************************************/
+uint32_t e31x_radio_control_impl::get_tx_switches(
+ const size_t chan,
+ const double freq
+) {
+ RFNOC_LOG_TRACE(
+ "Update all TX freq related switches. f=" << freq << " Hz, "
+ );
+
+ size_t fe_chan = _fe_swap ? (chan ? 0 : 1): chan;
+
+ auto tx_sw1 = TX_SW1_LB_2750; // SW1 = 0
+ auto vctxrx_sw = VCTXRX_SW_OFF;
+ auto tx_bias = (fe_chan == 0) ? TX1_BIAS_LB_ON: TX2_BIAS_LB_ON;
+
+ const auto band = e3xx_radio_control_impl::map_freq_to_tx_band(freq);
+ switch(band) {
+ case tx_band::LB_80:
+ tx_sw1 = TX_SW1_LB_80;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_160:
+ tx_sw1 = TX_SW1_LB_160;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_225:
+ tx_sw1 = TX_SW1_LB_225;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_400:
+ tx_sw1 = TX_SW1_LB_400;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_575:
+ tx_sw1 = TX_SW1_LB_575;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_1000:
+ tx_sw1 = TX_SW1_LB_1000;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_1700:
+ tx_sw1 = TX_SW1_LB_1700;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::LB_2750:
+ tx_sw1 = TX_SW1_LB_2750;
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_TX_LB: VCTXRX2_SW_TX_LB;
+ break;
+ case tx_band::HB:
+ tx_sw1 = TX_SW1_LB_80;
+ vctxrx_sw = VCTXRX_SW_TX_HB;
+ tx_bias = (fe_chan == 0) ? TX1_BIAS_HB_ON: TX2_BIAS_HB_ON;
+ break;
+ case tx_band::INVALID_BAND:
+ RFNOC_LOG_ERROR(
+ "Cannot map TX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
+ }
+ auto tx_regs = 0 |
+ vctxrx_sw << VCTXRX_SW_SHIFT |
+ tx_bias << TX_BIAS_SHIFT |
+ tx_sw1 << TX_SW1_SHIFT;
+ return tx_regs;
+}
+
+uint32_t e31x_radio_control_impl::get_rx_switches(
+ const size_t chan,
+ const double freq,
+ const std::string &ant
+){
+ RFNOC_LOG_TRACE(
+ "Update all RX freq related switches. f=" << freq << " Hz, "
+ );
+
+ size_t fe_chan = _fe_swap ? (chan ? 0 : 1): chan;
+
+ // Default to OFF
+ auto rx_sw1 = RX_SW1_OFF;
+ auto rx_swc = RX_SWC_OFF;
+ auto rx_swb = RX_SWB_OFF;
+ auto vctxrx_sw = VCTXRX_SW_OFF;
+ auto vcrx_sw = VCRX_SW_LB;
+ if (ant == "TX/RX") {
+ vctxrx_sw = (fe_chan == 0) ? VCTXRX1_SW_RX: VCTXRX2_SW_RX;
+ }
+
+ RFNOC_LOG_INFO("RX freq = " << freq);
+ const auto band = e3xx_radio_control_impl::map_freq_to_rx_band(freq);
+ RFNOC_LOG_INFO("RX band = " << int(band));
+
+ switch(band) {
+ case rx_band::LB_B2:
+ rx_sw1 = RX_SW1_LB_B2;
+ rx_swc = RX_SWC_LB_B2;
+ rx_swb = RX_SWB_OFF;
+ break;
+ case rx_band::LB_B3:
+ rx_sw1 = RX_SW1_LB_B3;
+ rx_swc = RX_SWC_LB_B3;
+ rx_swb = RX_SWB_OFF;
+ break;
+ case rx_band::LB_B4:
+ rx_sw1 = RX_SW1_LB_B4;
+ rx_swc = RX_SWC_LB_B4;
+ rx_swb = RX_SWB_OFF;
+ break;
+ case rx_band::LB_B5:
+ rx_sw1 = RX_SW1_LB_B5;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = RX_SWB_LB_B5;
+ break;
+ case rx_band::LB_B6:
+ rx_sw1 = RX_SW1_LB_B6;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = RX_SWB_LB_B6;
+ break;
+ case rx_band::LB_B7:
+ rx_sw1 = RX_SW1_LB_B7;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = RX_SWB_LB_B7;
+ break;
+ case rx_band::HB:
+ rx_sw1 = RX_SW1_OFF;
+ rx_swc = RX_SWC_OFF;
+ rx_swb = RX_SWB_OFF;
+ vcrx_sw = VCRX_SW_HB;
+ break;
+ case rx_band::INVALID_BAND:
+ RFNOC_LOG_ERROR("Cannot map RX frequency to band: " << freq);
+ UHD_THROW_INVALID_CODE_PATH();
+ break;
+ }
+ RFNOC_LOG_INFO("RX SW1 = " << rx_sw1);
+ RFNOC_LOG_INFO("RX SWC = " << rx_swc);
+ RFNOC_LOG_INFO("RX SWB = " << rx_swb);
+ RFNOC_LOG_INFO("RX VCRX_SW = " << vcrx_sw);
+ RFNOC_LOG_INFO("RX VCTXRX_SW = " << vctxrx_sw);
+
+ auto rx_regs = 0 |
+ vcrx_sw << VCRX_SW_SHIFT |
+ vctxrx_sw << VCTXRX_SW_SHIFT |
+ rx_swc << RX_SWC_SHIFT |
+ rx_swb << RX_SWB_SHIFT |
+ rx_sw1 << RX_SW1_SHIFT;
+ return rx_regs;
+}
+
+uint32_t e31x_radio_control_impl::get_idle_switches()
+{
+ uint32_t idle_regs = VCRX_SW_OFF << VCRX_SW_SHIFT |
+ VCTXRX_SW_OFF << VCTXRX_SW_SHIFT |
+ TX_BIAS_OFF << TX_BIAS_SHIFT |
+ RX_SWC_OFF << RX_SWC_SHIFT |
+ RX_SWB_OFF << RX_SWB_SHIFT |
+ RX_SW1_OFF << RX_SW1_SHIFT |
+ TX_SW1_LB_2750 << TX_SW1_SHIFT;
+ return idle_regs;
+}
+
+uint32_t e31x_radio_control_impl::get_idle_led()
+{
+ return 0;
+}
+
+uint32_t e31x_radio_control_impl::get_rx_led()
+{
+ return 1 << LED_RX_RX_SHIFT;
+}
+
+uint32_t e31x_radio_control_impl::get_tx_led()
+{
+ return 1 << LED_TXRX_TX_SHIFT;
+}
+
+uint32_t e31x_radio_control_impl::get_txrx_led()
+{
+ return 1 << LED_TXRX_RX_SHIFT;
+}
+
+UHD_RFNOC_BLOCK_REGISTER_FOR_DEVICE_DIRECT(
+ e31x_radio_control, RADIO_BLOCK, E310, "Radio", true, "radio_clk", "bus_clk")