aboutsummaryrefslogtreecommitdiffstats
path: root/mpm/lib/mykonos/ad937x_ctrl.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'mpm/lib/mykonos/ad937x_ctrl.cpp')
-rw-r--r--mpm/lib/mykonos/ad937x_ctrl.cpp342
1 files changed, 142 insertions, 200 deletions
diff --git a/mpm/lib/mykonos/ad937x_ctrl.cpp b/mpm/lib/mykonos/ad937x_ctrl.cpp
index efb39c972..f4abae7a7 100644
--- a/mpm/lib/mykonos/ad937x_ctrl.cpp
+++ b/mpm/lib/mykonos/ad937x_ctrl.cpp
@@ -4,25 +4,24 @@
// SPDX-License-Identifier: GPL-3.0-or-later
//
+#include "mpm/ad937x/ad937x_ctrl.hpp"
+#include "../../../host/include/uhd/utils/math.hpp"
#include "ad937x_device.hpp"
#include "adi/mykonos.h"
-#include "mpm/ad937x/ad937x_ctrl.hpp"
#include <mpm/exception.hpp>
-#include "../../../host/include/uhd/utils/math.hpp"
-
#include <boost/format.hpp>
-#include <sstream>
-#include <set>
+#include <algorithm>
+#include <chrono>
#include <functional>
#include <iostream>
-#include <algorithm>
+#include <set>
+#include <sstream>
#include <thread>
-#include <chrono>
using namespace mpm::chips;
using namespace mpm::ad937x::device;
-//Init cals mask
+// Init cals mask
const uint32_t ad937x_ctrl::TX_BB_FILTER = ::TX_BB_FILTER;
const uint32_t ad937x_ctrl::ADC_TUNER = ::ADC_TUNER;
const uint32_t ad937x_ctrl::TIA_3DB_CORNER = ::TIA_3DB_CORNER;
@@ -41,55 +40,42 @@ const uint32_t ad937x_ctrl::RX_QEC_INIT = ::RX_QEC_INIT;
const uint32_t ad937x_ctrl::DPD_INIT = ::DPD_INIT;
const uint32_t ad937x_ctrl::CLGC_INIT = ::CLGC_INIT;
const uint32_t ad937x_ctrl::VSWR_INIT = ::VSWR_INIT;
-//Tracking Cals mask
-const uint32_t ad937x_ctrl::TRACK_RX1_QEC = ::TRACK_RX1_QEC;
-const uint32_t ad937x_ctrl::TRACK_RX2_QEC = ::TRACK_RX2_QEC;
-const uint32_t ad937x_ctrl::TRACK_ORX1_QEC = ::TRACK_ORX1_QEC;
-const uint32_t ad937x_ctrl::TRACK_ORX2_QEC = ::TRACK_ORX2_QEC;
-const uint32_t ad937x_ctrl::TRACK_TX1_LOL = ::TRACK_TX1_LOL;
-const uint32_t ad937x_ctrl::TRACK_TX2_LOL = ::TRACK_TX2_LOL;
-const uint32_t ad937x_ctrl::TRACK_TX1_QEC = ::TRACK_TX1_QEC;
-const uint32_t ad937x_ctrl::TRACK_TX2_QEC = ::TRACK_TX2_QEC;
-const uint32_t ad937x_ctrl::TRACK_TX1_DPD = ::TRACK_TX1_DPD;
-const uint32_t ad937x_ctrl::TRACK_TX2_DPD = ::TRACK_TX2_DPD;
-const uint32_t ad937x_ctrl::TRACK_TX1_CLGC = ::TRACK_TX1_CLGC;
-const uint32_t ad937x_ctrl::TRACK_TX2_CLGC = ::TRACK_TX2_CLGC;
-const uint32_t ad937x_ctrl::TRACK_TX1_VSWR = ::TRACK_TX1_VSWR;
-const uint32_t ad937x_ctrl::TRACK_TX2_VSWR = ::TRACK_TX2_VSWR;
-const uint32_t ad937x_ctrl::TRACK_ORX1_QEC_SNLO = ::TRACK_ORX1_QEC_SNLO;
-const uint32_t ad937x_ctrl::TRACK_ORX2_QEC_SNLO = ::TRACK_ORX2_QEC_SNLO;
-const uint32_t ad937x_ctrl::TRACK_SRX_QEC = ::TRACK_SRX_QEC;
+// Tracking Cals mask
+const uint32_t ad937x_ctrl::TRACK_RX1_QEC = ::TRACK_RX1_QEC;
+const uint32_t ad937x_ctrl::TRACK_RX2_QEC = ::TRACK_RX2_QEC;
+const uint32_t ad937x_ctrl::TRACK_ORX1_QEC = ::TRACK_ORX1_QEC;
+const uint32_t ad937x_ctrl::TRACK_ORX2_QEC = ::TRACK_ORX2_QEC;
+const uint32_t ad937x_ctrl::TRACK_TX1_LOL = ::TRACK_TX1_LOL;
+const uint32_t ad937x_ctrl::TRACK_TX2_LOL = ::TRACK_TX2_LOL;
+const uint32_t ad937x_ctrl::TRACK_TX1_QEC = ::TRACK_TX1_QEC;
+const uint32_t ad937x_ctrl::TRACK_TX2_QEC = ::TRACK_TX2_QEC;
+const uint32_t ad937x_ctrl::TRACK_TX1_DPD = ::TRACK_TX1_DPD;
+const uint32_t ad937x_ctrl::TRACK_TX2_DPD = ::TRACK_TX2_DPD;
+const uint32_t ad937x_ctrl::TRACK_TX1_CLGC = ::TRACK_TX1_CLGC;
+const uint32_t ad937x_ctrl::TRACK_TX2_CLGC = ::TRACK_TX2_CLGC;
+const uint32_t ad937x_ctrl::TRACK_TX1_VSWR = ::TRACK_TX1_VSWR;
+const uint32_t ad937x_ctrl::TRACK_TX2_VSWR = ::TRACK_TX2_VSWR;
+const uint32_t ad937x_ctrl::TRACK_ORX1_QEC_SNLO = ::TRACK_ORX1_QEC_SNLO;
+const uint32_t ad937x_ctrl::TRACK_ORX2_QEC_SNLO = ::TRACK_ORX2_QEC_SNLO;
+const uint32_t ad937x_ctrl::TRACK_SRX_QEC = ::TRACK_SRX_QEC;
const uint32_t ad937x_ctrl::DEFAULT_INIT_CALS_MASKS =
- ad937x_ctrl::TX_BB_FILTER |
- ad937x_ctrl::ADC_TUNER |
- ad937x_ctrl::TIA_3DB_CORNER |
- ad937x_ctrl::DC_OFFSET |
- ad937x_ctrl::TX_ATTENUATION_DELAY |
- ad937x_ctrl::RX_GAIN_DELAY |
- ad937x_ctrl::FLASH_CAL |
- ad937x_ctrl::PATH_DELAY |
- ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL |
- ad937x_ctrl::TX_QEC_INIT |
- ad937x_ctrl::LOOPBACK_RX_LO_DELAY |
- ad937x_ctrl::RX_QEC_INIT
- ;
+ ad937x_ctrl::TX_BB_FILTER | ad937x_ctrl::ADC_TUNER | ad937x_ctrl::TIA_3DB_CORNER
+ | ad937x_ctrl::DC_OFFSET | ad937x_ctrl::TX_ATTENUATION_DELAY
+ | ad937x_ctrl::RX_GAIN_DELAY | ad937x_ctrl::FLASH_CAL | ad937x_ctrl::PATH_DELAY
+ | ad937x_ctrl::TX_LO_LEAKAGE_INTERNAL | ad937x_ctrl::TX_QEC_INIT
+ | ad937x_ctrl::LOOPBACK_RX_LO_DELAY | ad937x_ctrl::RX_QEC_INIT;
const uint32_t ad937x_ctrl::DEFAULT_TRACKING_CALS_MASKS =
- ad937x_ctrl::TRACK_RX1_QEC |
- ad937x_ctrl::TRACK_RX2_QEC |
- ad937x_ctrl::TRACK_TX1_QEC |
- ad937x_ctrl::TRACK_TX2_QEC
- ;
+ ad937x_ctrl::TRACK_RX1_QEC | ad937x_ctrl::TRACK_RX2_QEC | ad937x_ctrl::TRACK_TX1_QEC
+ | ad937x_ctrl::TRACK_TX2_QEC;
const uint32_t ad937x_ctrl::DEFAULT_INIT_CALS_TIMEOUT = 60000;
static uhd::direction_t _get_direction_from_antenna(const std::string& antenna)
{
auto sub = antenna.substr(0, 2);
if (sub == "RX") {
return uhd::direction_t::RX_DIRECTION;
- }
- else if (sub == "TX") {
+ } else if (sub == "TX") {
return uhd::direction_t::TX_DIRECTION;
- }
- else {
+ } else {
throw mpm::runtime_error("ad937x_ctrl got an invalid channel string.");
}
return uhd::direction_t::RX_DIRECTION;
@@ -100,11 +86,9 @@ static chain_t _get_chain_from_antenna(const std::string& antenna)
auto sub = antenna.substr(2, 1);
if (sub == "1") {
return chain_t::ONE;
- }
- else if (sub == "2") {
+ } else if (sub == "2") {
return chain_t::TWO;
- }
- else {
+ } else {
throw mpm::runtime_error("ad937x_ctrl got an invalid channel string.");
}
return chain_t::ONE;
@@ -113,15 +97,14 @@ static chain_t _get_chain_from_antenna(const std::string& antenna)
std::set<size_t> _get_valid_fir_lengths(const std::string& which)
{
auto dir = _get_direction_from_antenna(which);
- switch (dir)
- {
- case uhd::direction_t::RX_DIRECTION:
- return{ 24, 48, 72 };
- case uhd::direction_t::TX_DIRECTION:
- return{ 16, 32, 48, 64, 80, 96 };
- default:
- MPM_THROW_INVALID_CODE_PATH();
- return std::set<size_t>();
+ switch (dir) {
+ case uhd::direction_t::RX_DIRECTION:
+ return {24, 48, 72};
+ case uhd::direction_t::TX_DIRECTION:
+ return {16, 32, 48, 64, 80, 96};
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ return std::set<size_t>();
}
}
@@ -152,43 +135,37 @@ uhd::meta_range_t ad937x_ctrl::get_bw_filter_range(void)
std::vector<double> ad937x_ctrl::get_clock_rates(void)
{
// TODO: fix
- return { 125e6 };
+ return {125e6};
}
-uhd::meta_range_t ad937x_ctrl::get_gain_range(const std::string &which)
+uhd::meta_range_t ad937x_ctrl::get_gain_range(const std::string& which)
{
auto dir = _get_direction_from_antenna(which);
- switch (dir)
- {
- case uhd::direction_t::RX_DIRECTION:
- return uhd::meta_range_t(
- ad937x_device::MIN_RX_GAIN,
+ switch (dir) {
+ case uhd::direction_t::RX_DIRECTION:
+ return uhd::meta_range_t(ad937x_device::MIN_RX_GAIN,
ad937x_device::MAX_RX_GAIN,
- ad937x_device::RX_GAIN_STEP
- );
- case uhd::direction_t::TX_DIRECTION:
- return uhd::meta_range_t(
- ad937x_device::MIN_TX_GAIN,
+ ad937x_device::RX_GAIN_STEP);
+ case uhd::direction_t::TX_DIRECTION:
+ return uhd::meta_range_t(ad937x_device::MIN_TX_GAIN,
ad937x_device::MAX_TX_GAIN,
- ad937x_device::TX_GAIN_STEP
- );
- default:
- MPM_THROW_INVALID_CODE_PATH();
- return uhd::meta_range_t();
+ ad937x_device::TX_GAIN_STEP);
+ default:
+ MPM_THROW_INVALID_CODE_PATH();
+ return uhd::meta_range_t();
}
}
class ad937x_ctrl_impl : public ad937x_ctrl
{
public:
- ad937x_ctrl_impl(
- std::shared_ptr<std::mutex> spi_mutex,
+ ad937x_ctrl_impl(std::shared_ptr<std::mutex> spi_mutex,
const size_t deserializer_lane_xbar,
mpm::types::regs_iface::sptr iface,
- mpm::ad937x::gpio::gain_pins_t gain_pins) :
- spi_mutex(spi_mutex),
- device(iface.get(), deserializer_lane_xbar, gain_pins),
- _iface(iface)
+ mpm::ad937x::gpio::gain_pins_t gain_pins)
+ : spi_mutex(spi_mutex)
+ , device(iface.get(), deserializer_lane_xbar, gain_pins)
+ , _iface(iface)
{
/* nop */
}
@@ -205,49 +182,45 @@ public:
device.finish_initialization();
}
- virtual void setup_cal(
- const uint32_t init_cals_mask,
- const uint32_t tracking_cals_mask,
- const uint32_t timeout
- ) {
+ virtual void setup_cal(const uint32_t init_cals_mask,
+ const uint32_t tracking_cals_mask,
+ const uint32_t timeout)
+ {
std::lock_guard<std::mutex> lock(*spi_mutex);
device.setup_cal(init_cals_mask, tracking_cals_mask, timeout);
}
- virtual std::string set_lo_source(
- const std::string &which,
- const std::string &source
- ) {
+ virtual std::string set_lo_source(const std::string& which, const std::string& source)
+ {
const auto dir = _get_direction_from_antenna(which);
- uint8_t pll_source = 0 ;
- if (source == "internal"){
+ uint8_t pll_source = 0;
+ if (source == "internal") {
pll_source = 0;
- }
- else if (source == "external") {
+ } else if (source == "external") {
pll_source = 1;
- }
- else {
+ } else {
throw mpm::runtime_error("invalid LO source");
}
std::lock_guard<std::mutex> lock(*spi_mutex);
uint8_t retval = device.set_lo_source(dir, pll_source);
- if (retval == 0){
+ if (retval == 0) {
return "internal";
- } else if (retval == 1){
+ } else if (retval == 1) {
return "external";
- }else{
+ } else {
throw mpm::runtime_error("invalid return from set LO source");
}
}
- virtual std::string get_lo_source(const std::string &which){
+ virtual std::string get_lo_source(const std::string& which)
+ {
const auto dir = _get_direction_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
uint8_t retval = device.get_lo_source(dir);
- if (retval == 0){
+ if (retval == 0) {
return "internal";
} else if (retval == 1) {
return "external";
@@ -328,10 +301,8 @@ public:
std::lock_guard<std::mutex> lock(*spi_mutex);
const auto api = device.get_api_version();
std::ostringstream ss;
- ss << api.silicon_ver << "."
- << api.major_ver << "."
- << api.minor_ver << "."
- << api.build_ver;
+ ss << api.silicon_ver << "." << api.major_ver << "." << api.minor_ver << "."
+ << api.build_ver;
return ss.str();
}
@@ -341,45 +312,43 @@ public:
std::lock_guard<std::mutex> lock(*spi_mutex);
const auto arm = device.get_arm_version();
std::ostringstream ss;
- ss << (int)(arm.major_ver) << "."
- << (int)(arm.minor_ver) << "."
- << (int)(arm.rc_ver);
-
- switch (arm.build_type)
- {
- case mpm::ad937x::device::build_type_t::RELEASE:
- ss << " Release";
- break;
- case mpm::ad937x::device::build_type_t::DEBUG:
- ss << " Debug";
- break;
- case mpm::ad937x::device::build_type_t::TEST_OBJECT:
- ss << " Test Object";
- break;
+ ss << (int)(arm.major_ver) << "." << (int)(arm.minor_ver) << "."
+ << (int)(arm.rc_ver);
+
+ switch (arm.build_type) {
+ case mpm::ad937x::device::build_type_t::RELEASE:
+ ss << " Release";
+ break;
+ case mpm::ad937x::device::build_type_t::DEBUG:
+ ss << " Debug";
+ break;
+ case mpm::ad937x::device::build_type_t::TEST_OBJECT:
+ ss << " Test Object";
+ break;
}
return ss.str();
}
- virtual double set_bw_filter(const std::string &which, const double value)
+ virtual double set_bw_filter(const std::string& which, const double value)
{
const auto dir = _get_direction_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.set_bw_filter(dir, value);
}
- virtual double set_gain(const std::string &which, const double value)
+ virtual double set_gain(const std::string& which, const double value)
{
- const auto dir = _get_direction_from_antenna(which);
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.set_gain(dir, chain, value);
}
- virtual double get_gain(const std::string &which)
+ virtual double get_gain(const std::string& which)
{
- const auto dir = _get_direction_from_antenna(which);
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
@@ -388,27 +357,21 @@ public:
// TODO: does agc mode need to have a which parameter?
// this affects all RX channels on the device
- virtual void set_agc_mode(
- const std::string &which,
- const std::string &mode
- ) {
+ virtual void set_agc_mode(const std::string& which, const std::string& mode)
+ {
const auto dir = _get_direction_from_antenna(which);
- if (dir != uhd::direction_t::RX_DIRECTION)
- {
+ if (dir != uhd::direction_t::RX_DIRECTION) {
throw mpm::runtime_error("set_agc not valid for non-rx channels");
}
ad937x_device::gain_mode_t gain_mode;
if (mode == "automatic") {
gain_mode = ad937x_device::gain_mode_t::AUTOMATIC;
- }
- else if (mode == "manual") {
+ } else if (mode == "manual") {
gain_mode = ad937x_device::gain_mode_t::MANUAL;
- }
- else if (mode == "hybrid") {
+ } else if (mode == "hybrid") {
gain_mode = ad937x_device::gain_mode_t::HYBRID;
- }
- else {
+ } else {
throw mpm::runtime_error("invalid agc mode");
}
@@ -427,9 +390,9 @@ public:
return device.set_clock_rate(value);
}
- virtual void enable_channel(const std::string &which, const bool enable)
+ virtual void enable_channel(const std::string& which, const bool enable)
{
- const auto dir = _get_direction_from_antenna(which);
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
@@ -437,18 +400,16 @@ public:
}
virtual double set_freq(
- const std::string &which,
- const double value,
- const bool wait_for_lock
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ const std::string& which, const double value, const bool wait_for_lock)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto clipped_value = get_rf_freq_range().clip(value);
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.tune(dir, clipped_value, wait_for_lock);
}
- virtual double get_freq(const std::string &which)
+ virtual double get_freq(const std::string& which)
{
const auto dir = _get_direction_from_antenna(which);
@@ -456,27 +417,23 @@ public:
return device.get_freq(dir);
}
- virtual bool get_lo_locked(const std::string &which)
+ virtual bool get_lo_locked(const std::string& which)
{
- const auto dir = _get_direction_from_antenna(which);
- const uint8_t pll_select = (dir == uhd::RX_DIRECTION) ?
- ad937x_device::RX_SYNTH :
- ad937x_device::TX_SYNTH;
+ const auto dir = _get_direction_from_antenna(which);
+ const uint8_t pll_select = (dir == uhd::RX_DIRECTION) ? ad937x_device::RX_SYNTH
+ : ad937x_device::TX_SYNTH;
std::lock_guard<std::mutex> lock(*spi_mutex);
return device.get_pll_lock_status(pll_select);
}
virtual void set_fir(
- const std::string &which,
- const int8_t gain,
- const std::vector<int16_t>& fir
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ const std::string& which, const int8_t gain, const std::vector<int16_t>& fir)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto lengths = _get_valid_fir_lengths(which);
- if (std::find(lengths.begin(), lengths.end(), fir.size()) == lengths.end())
- {
+ if (std::find(lengths.begin(), lengths.end(), fir.size()) == lengths.end()) {
throw mpm::value_error("invalid filter length");
}
@@ -484,7 +441,7 @@ public:
device.set_fir(dir, gain, fir);
}
- virtual std::vector<int16_t> get_fir(const std::string &which, int8_t &gain)
+ virtual std::vector<int16_t> get_fir(const std::string& which, int8_t& gain)
{
auto dir = _get_direction_from_antenna(which);
@@ -504,28 +461,22 @@ public:
ad937x_device::mcr_t mcr;
if (uhd::math::frequencies_are_equal(rate, 122.88e6)) {
mcr = ad937x_device::MCR_122_88MHZ;
- }
- else if (uhd::math::frequencies_are_equal(rate, 125e6)) {
+ } else if (uhd::math::frequencies_are_equal(rate, 125e6)) {
mcr = ad937x_device::MCR_125_00MHZ;
- }
- else if (uhd::math::frequencies_are_equal(rate, 153.6e6)) {
+ } else if (uhd::math::frequencies_are_equal(rate, 153.6e6)) {
mcr = ad937x_device::MCR_153_60MHZ;
- }
- else {
- throw mpm::value_error(boost::str(
- boost::format("Requested invalid master clock rate: %f MHz")
- % (rate / 1e6)
- ));
+ } else {
+ throw mpm::value_error(
+ boost::str(boost::format("Requested invalid master clock rate: %f MHz")
+ % (rate / 1e6)));
}
device.set_master_clock_rate(mcr);
}
- virtual void set_enable_gain_pins(
- const std::string &which,
- const bool enable
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ virtual void set_enable_gain_pins(const std::string& which, const bool enable)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
std::lock_guard<std::mutex> lock(*spi_mutex);
@@ -533,27 +484,24 @@ public:
}
virtual void set_gain_pin_step_sizes(
- const std::string &which,
- double inc_step,
- double dec_step
- ) {
- const auto dir = _get_direction_from_antenna(which);
+ const std::string& which, double inc_step, double dec_step)
+ {
+ const auto dir = _get_direction_from_antenna(which);
const auto chain = _get_chain_from_antenna(which);
if (dir == uhd::RX_DIRECTION) {
auto steps = _get_valid_rx_gain_steps();
- inc_step = steps.clip(inc_step);
- dec_step = steps.clip(dec_step);
- }
- else if (dir == uhd::TX_DIRECTION) {
+ inc_step = steps.clip(inc_step);
+ dec_step = steps.clip(dec_step);
+ } else if (dir == uhd::TX_DIRECTION) {
auto steps = _get_valid_tx_gain_steps();
- inc_step = steps.clip(inc_step);
- dec_step = steps.clip(dec_step);
+ inc_step = steps.clip(inc_step);
+ dec_step = steps.clip(dec_step);
// double comparison here should be okay because of clipping
if (inc_step != dec_step) {
throw mpm::value_error(
- "TX gain increment and decrement steps must be equal");
+ "TX gain increment and decrement steps must be equal");
}
}
@@ -579,17 +527,11 @@ private:
mpm::types::regs_iface::sptr _iface;
};
-ad937x_ctrl::sptr ad937x_ctrl::make(
- std::shared_ptr<std::mutex> spi_mutex,
- const size_t deserializer_lane_xbar,
- mpm::types::regs_iface::sptr iface,
- mpm::ad937x::gpio::gain_pins_t gain_pins
-) {
+ad937x_ctrl::sptr ad937x_ctrl::make(std::shared_ptr<std::mutex> spi_mutex,
+ const size_t deserializer_lane_xbar,
+ mpm::types::regs_iface::sptr iface,
+ mpm::ad937x::gpio::gain_pins_t gain_pins)
+{
return std::make_shared<ad937x_ctrl_impl>(
- spi_mutex,
- deserializer_lane_xbar,
- iface,
- gain_pins
- );
+ spi_mutex, deserializer_lane_xbar, iface, gain_pins);
}
-