diff options
Diffstat (limited to 'host/lib')
-rw-r--r-- | host/lib/include/uhdlib/usrp/common/adf535x.hpp | 58 |
1 files changed, 55 insertions, 3 deletions
diff --git a/host/lib/include/uhdlib/usrp/common/adf535x.hpp b/host/lib/include/uhdlib/usrp/common/adf535x.hpp index 6350261ef..46ec9db42 100644 --- a/host/lib/include/uhdlib/usrp/common/adf535x.hpp +++ b/host/lib/include/uhdlib/usrp/common/adf535x.hpp @@ -9,6 +9,7 @@ #include "adf5355_regs.hpp" #include "adf5356_regs.hpp" +#include <uhd/types/ranges.hpp> #include <uhd/utils/log.hpp> #include <uhd/utils/math.hpp> #include <uhd/utils/safe_call.hpp> @@ -16,6 +17,7 @@ #include <boost/format.hpp> #include <boost/function.hpp> #include <algorithm> +#include <iomanip> #include <utility> #include <vector> @@ -67,6 +69,10 @@ public: virtual double set_frequency( double target_freq, double freq_resolution, bool flush = false) = 0; + virtual double set_charge_pump_current(double target_current, bool flush = false) = 0; + + virtual uhd::meta_range_t get_charge_pump_current_range() = 0; + virtual void commit() = 0; }; @@ -92,7 +98,8 @@ const uint32_t ADF535X_MAX_FRAC2 = 16383; // const uint16_t ADF535X_MIN_INT_PRESCALER_89 = 75; } // namespace -template <typename adf535x_regs_t> class adf535x_impl : public adf535x_iface +template <typename adf535x_regs_t> +class adf535x_impl : public adf535x_iface { public: explicit adf535x_impl(write_fn_t write_fn, wait_fn_t wait_fn) @@ -226,6 +233,36 @@ public: return _set_frequency(target_freq, freq_resolution, flush); } + double set_charge_pump_current(const double current, const bool flush) override + { + const auto cp_range = get_charge_pump_current_range(); + + const auto coerced_current = cp_range.clip(current, true); + const int current_step = std::round((coerced_current / cp_range.step()) - 1); + + UHD_ASSERT_THROW(current_step >= 0 and current_step < 16); + _regs.charge_pump_current = + static_cast<typename adf535x_regs_t::charge_pump_current_t>(current_step); + + if (flush) { + commit(); + } + + if (std::abs(current - coerced_current) > 0.01e-6) { + UHD_LOG_WARNING("ADF535x", + "Requested charge pump current was coerced! Requested: " + << std::setw(4) << current << " A Actual: " << coerced_current + << " A"); + } + + return coerced_current; + } + + uhd::meta_range_t get_charge_pump_current_range() override + { + return _get_charge_pump_current_range(); + } + void set_output_power(const output_power_t power) override { typename adf535x_regs_t::output_power_t setting; @@ -302,6 +339,7 @@ public: protected: double _set_frequency(double, double, bool); + uhd::meta_range_t _get_charge_pump_current_range(); void _commit(); private: // Members @@ -402,7 +440,14 @@ inline double adf535x_impl<adf5355_regs_t>::_set_frequency( return coerced_out_freq; } -template <> inline void adf535x_impl<adf5355_regs_t>::_commit() +template <> +inline uhd::meta_range_t adf535x_impl<adf5355_regs_t>::_get_charge_pump_current_range() +{ + return uhd::meta_range_t(.3125e-6, 5e-6, .3125e-6); +} + +template <> +inline void adf535x_impl<adf5355_regs_t>::_commit() { const size_t ONE_REG = 1; @@ -517,7 +562,14 @@ inline double adf535x_impl<adf5356_regs_t>::_set_frequency( return coerced_out_freq; } -template <> inline void adf535x_impl<adf5356_regs_t>::_commit() +template <> +inline uhd::meta_range_t adf535x_impl<adf5356_regs_t>::_get_charge_pump_current_range() +{ + return uhd::meta_range_t(.3e-6, 4.8e-6, .3e-6); +} + +template <> +inline void adf535x_impl<adf5356_regs_t>::_commit() { const size_t ONE_REG = 1; if (_rewrite_regs) { |