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.cpp75
1 files changed, 65 insertions, 10 deletions
diff --git a/mpm/lib/mykonos/ad937x_ctrl.cpp b/mpm/lib/mykonos/ad937x_ctrl.cpp
index ce98706fa..cef729686 100644
--- a/mpm/lib/mykonos/ad937x_ctrl.cpp
+++ b/mpm/lib/mykonos/ad937x_ctrl.cpp
@@ -17,13 +17,14 @@
#include "ad937x_device.hpp"
#include "adi/mykonos.h"
-
-#include <mpm/ad937x/ad937x_ctrl.hpp>
+#include "mpm/ad937x/ad937x_ctrl.hpp"
#include <sstream>
#include <set>
#include <functional>
+using namespace mpm::ad937x::device;
+
static uhd::direction_t _get_direction_from_antenna(const std::string& antenna)
{
auto sub = antenna.substr(0, 2);
@@ -39,19 +40,19 @@ static uhd::direction_t _get_direction_from_antenna(const std::string& antenna)
return uhd::direction_t::RX_DIRECTION;
}
-static ad937x_device::chain_t _get_chain_from_antenna(const std::string& antenna)
+static chain_t _get_chain_from_antenna(const std::string& antenna)
{
auto sub = antenna.substr(2, 1);
if (sub == "1") {
- return ad937x_device::chain_t::ONE;
+ return chain_t::ONE;
}
else if (sub == "2") {
- return ad937x_device::chain_t::TWO;
+ return chain_t::TWO;
}
else {
throw uhd::runtime_error("ad937x_ctrl got an invalid channel string.");
}
- return ad937x_device::chain_t::ONE;
+ return chain_t::ONE;
}
std::set<size_t> _get_valid_fir_lengths(const std::string& which)
@@ -69,6 +70,18 @@ std::set<size_t> _get_valid_fir_lengths(const std::string& which)
}
}
+uhd::meta_range_t _get_valid_rx_gain_steps()
+{
+ // 0-7 step size is valid, in 0.5 dB increments
+ return uhd::meta_range_t(0, 3.5, 0.5);
+}
+
+uhd::meta_range_t _get_valid_tx_gain_steps()
+{
+ // 0-31 step size is valid, in 0.05 dB increments
+ return uhd::meta_range_t(0, 1.55, 0.05);
+}
+
uhd::meta_range_t ad937x_ctrl::get_rf_freq_range(void)
{
return uhd::meta_range_t(ad937x_device::MIN_FREQ, ad937x_device::MAX_FREQ);
@@ -105,9 +118,12 @@ uhd::meta_range_t ad937x_ctrl::get_gain_range(const std::string &which)
class ad937x_ctrl_impl : public ad937x_ctrl
{
public:
- ad937x_ctrl_impl(std::shared_ptr<std::mutex> spi_mutex, uhd::spi_iface::sptr iface) :
+ ad937x_ctrl_impl(
+ std::shared_ptr<std::mutex> spi_mutex,
+ uhd::spi_iface::sptr iface,
+ mpm::ad937x::gpio::gain_pins_t gain_pins) :
spi_mutex(spi_mutex),
- device(iface)
+ device(iface, gain_pins)
{
}
@@ -161,6 +177,8 @@ public:
return device.set_gain(dir, chain, value);
}
+ // 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)
{
auto dir = _get_direction_from_antenna(which);
@@ -256,14 +274,51 @@ public:
return device.get_temperature();
}
+ virtual void set_enable_gain_pins(const std::string &which, bool enable)
+ {
+ auto dir = _get_direction_from_antenna(which);
+ auto chain = _get_chain_from_antenna(which);
+
+ std::lock_guard<std::mutex> lock(*spi_mutex);
+ device.set_enable_gain_pins(dir, chain, enable);
+ }
+
+ virtual void set_gain_pin_step_sizes(const std::string &which, double inc_step, double dec_step)
+ {
+ auto dir = _get_direction_from_antenna(which);
+ 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)
+ {
+ auto steps = _get_valid_tx_gain_steps();
+ 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 uhd::value_error("TX gain increment and decrement steps must be equal");
+ }
+ }
+
+ std::lock_guard<std::mutex> lock(*spi_mutex);
+ device.set_gain_pin_step_sizes(dir, chain, inc_step, dec_step);
+ }
+
private:
ad937x_device device;
std::shared_ptr<std::mutex> spi_mutex;
};
-ad937x_ctrl::sptr ad937x_ctrl::make(std::shared_ptr<std::mutex> spi_mutex, uhd::spi_iface::sptr iface)
+ad937x_ctrl::sptr ad937x_ctrl::make(std::shared_ptr<std::mutex> spi_mutex, uhd::spi_iface::sptr iface, mpm::ad937x::gpio::gain_pins_t gain_pins)
{
- return std::make_shared<ad937x_ctrl_impl>(spi_mutex, iface);
+ return std::make_shared<ad937x_ctrl_impl>(spi_mutex, iface, gain_pins);
}