aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMark Meserve <mark.meserve@ni.com>2019-04-24 16:05:40 -0500
committerMartin Braun <martin.braun@ettus.com>2019-05-02 14:36:21 -0700
commit23ed46556763a216d59b7521b0e8910ef3791287 (patch)
tree7a8a22d18abf1d5df46f7daf94805a34aa0d32ff
parentadf535x: add charge pump control (diff)
downloaduhd-23ed46556763a216d59b7521b0e8910ef3791287.tar.xz
uhd-23ed46556763a216d59b7521b0e8910ef3791287.zip
twinrx: add lo charge pump properties
-rw-r--r--host/lib/usrp/dboard/db_twinrx.cpp22
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp50
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp9
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_experts.cpp4
-rw-r--r--host/lib/usrp/dboard/twinrx/twinrx_experts.hpp50
5 files changed, 116 insertions, 19 deletions
diff --git a/host/lib/usrp/dboard/db_twinrx.cpp b/host/lib/usrp/dboard/db_twinrx.cpp
index 523d68185..27b2c22da 100644
--- a/host/lib/usrp/dboard/db_twinrx.cpp
+++ b/host/lib/usrp/dboard/db_twinrx.cpp
@@ -108,6 +108,28 @@ public:
"los/all/export", prepend_ch("los/all/export", _ch_name),
false, AUTO_RESOLVE_ON_WRITE);
+ // LO1 Charge Pump
+ get_rx_subtree()->create<meta_range_t>("los/LO1/charge_pump/range")
+ .set(_ctrl->get_lo1_charge_pump_range());
+ expert_factory::add_dual_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "los/LO1/charge_pump/value",
+ prepend_ch("los/LO1/charge_pump/desired", _ch_name),
+ prepend_ch("los/LO1/charge_pump/coerced", _ch_name),
+ (get_rx_id() == twinrx::TWINRX_REV_C_ID) ? 0.3e-6 : 0.9375e-6,
+ AUTO_RESOLVE_ON_READ_WRITE);
+
+ // LO2 Charge Pump
+ get_rx_subtree()->create<meta_range_t>("los/LO2/charge_pump/range")
+ .set(_ctrl->get_lo2_charge_pump_range());
+ expert_factory::add_dual_prop_node<double>(_expert,
+ get_rx_subtree(),
+ "los/LO2/charge_pump/value",
+ prepend_ch("los/LO2/charge_pump/desired", _ch_name),
+ prepend_ch("los/LO2/charge_pump/coerced", _ch_name),
+ 0.3125e-6,
+ AUTO_RESOLVE_ON_READ_WRITE);
+
//Gain Specific
get_rx_subtree()->create<meta_range_t>("gains/all/range")
.set(gain_range_t(0, 93, double(1.0)));
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
index 7ed01f624..29342ce51 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.cpp
@@ -469,6 +469,56 @@ public:
return coerced_freq;
}
+ double set_lo1_charge_pump(channel_t ch, double current, bool commit = true)
+ {
+ boost::lock_guard<boost::mutex> lock(_mutex);
+ double coerced_current = 0.0;
+ if (ch == CH1 or ch == BOTH) {
+ coerced_current =
+ _lo1_iface[size_t(CH1)]->set_charge_pump_current(current, false);
+ }
+ if (ch == CH2 or ch == BOTH) {
+ coerced_current =
+ _lo1_iface[size_t(CH2)]->set_charge_pump_current(current, false);
+ }
+
+ if (commit) {
+ _commit();
+ }
+ return coerced_current;
+ }
+
+ double set_lo2_charge_pump(channel_t ch, double current, bool commit = true)
+ {
+ boost::lock_guard<boost::mutex> lock(_mutex);
+ double coerced_current = 0.0;
+ if (ch == CH1 or ch == BOTH) {
+ coerced_current =
+ _lo2_iface[size_t(CH1)]->set_charge_pump_current(current, false);
+ }
+ if (ch == CH2 or ch == BOTH) {
+ coerced_current =
+ _lo2_iface[size_t(CH2)]->set_charge_pump_current(current, false);
+ }
+
+ if (commit) {
+ _commit();
+ }
+ return coerced_current;
+ }
+
+ uhd::meta_range_t get_lo1_charge_pump_range()
+ {
+ // assume that both channels have the same range
+ return _lo1_iface[size_t(CH1)]->get_charge_pump_current_range();
+ }
+
+ uhd::meta_range_t get_lo2_charge_pump_range()
+ {
+ // assume that both channels have the same range
+ return _lo2_iface[size_t(CH1)]->get_charge_pump_current_range();
+ }
+
bool read_lo1_locked(channel_t ch)
{
boost::lock_guard<boost::mutex> lock(_mutex);
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp
index 7638d4509..dfdacde11 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_ctrl.hpp
@@ -11,6 +11,7 @@
#include "twinrx_io.hpp"
#include <uhd/types/wb_iface.hpp>
#include <uhd/utils/noncopyable.hpp>
+#include <uhd/types/ranges.hpp>
namespace uhd { namespace usrp { namespace dboard { namespace twinrx {
@@ -81,6 +82,14 @@ public:
virtual double set_lo2_synth_freq(channel_t ch, double freq, bool commit = true) = 0;
+ virtual double set_lo1_charge_pump(channel_t ch, double current, bool commit = true) = 0;
+
+ virtual double set_lo2_charge_pump(channel_t ch, double current, bool commit = true) = 0;
+
+ virtual uhd::meta_range_t get_lo1_charge_pump_range() = 0;
+
+ virtual uhd::meta_range_t get_lo2_charge_pump_range() = 0;
+
virtual bool read_lo1_locked(channel_t ch) = 0;
virtual bool read_lo2_locked(channel_t ch) = 0;
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp b/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp
index 25aec4421..f98521cc9 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_experts.cpp
@@ -543,6 +543,10 @@ void twinrx_settings_expert::resolve()
_ctrl->set_hb_atten(ch, ch_set.hb_atten, FORCE_COMMIT);
_ctrl->set_lo1_source(ch, ch_set.lo1_source, FORCE_COMMIT);
_ctrl->set_lo2_source(ch, ch_set.lo2_source, FORCE_COMMIT);
+ ch_set.lo1_charge_pump_c =
+ _ctrl->set_lo1_charge_pump(ch, ch_set.lo1_charge_pump_d, FORCE_COMMIT);
+ ch_set.lo2_charge_pump_c =
+ _ctrl->set_lo2_charge_pump(ch, ch_set.lo2_charge_pump_d, FORCE_COMMIT);
}
_resolve_lox_freq(STAGE_LO1,
diff --git a/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp b/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp
index c070765d9..16569849c 100644
--- a/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp
+++ b/host/lib/usrp/dboard/twinrx/twinrx_experts.hpp
@@ -556,6 +556,10 @@ public:
bind_accessor(ch.lo2_freq_d);
bind_accessor(ch.lo1_freq_c);
bind_accessor(ch.lo2_freq_c);
+ bind_accessor(ch.lo1_charge_pump_c);
+ bind_accessor(ch.lo2_charge_pump_c);
+ bind_accessor(ch.lo1_charge_pump_d);
+ bind_accessor(ch.lo2_charge_pump_d);
}
bind_accessor(_lo1_synth0_mapping);
bind_accessor(_lo1_synth1_mapping);
@@ -587,22 +591,26 @@ private:
class ch_settings {
public:
ch_settings(const experts::node_retriever_t& db, const std::string& ch) :
- chan_enabled (db, prepend_ch("enabled", ch)),
- preamp1 (db, prepend_ch("ant/preamp1", ch)),
- preamp2 (db, prepend_ch("ant/preamp2", ch)),
- lb_preamp_presel(db, prepend_ch("ant/lb_preamp_presel", ch)),
- signal_path (db, prepend_ch("ch/signal_path", ch)),
- lb_presel (db, prepend_ch("ch/lb_presel", ch)),
- hb_presel (db, prepend_ch("ch/hb_presel", ch)),
- input_atten (db, prepend_ch("ant/input_atten", ch)),
- lb_atten (db, prepend_ch("ch/lb_atten", ch)),
- hb_atten (db, prepend_ch("ch/hb_atten", ch)),
- lo1_source (db, prepend_ch("ch/LO1/source", ch)),
- lo2_source (db, prepend_ch("ch/LO2/source", ch)),
- lo1_freq_d (db, prepend_ch("los/LO1/freq/desired", ch)),
- lo2_freq_d (db, prepend_ch("los/LO2/freq/desired", ch)),
- lo1_freq_c (db, prepend_ch("los/LO1/freq/coerced", ch)),
- lo2_freq_c (db, prepend_ch("los/LO2/freq/coerced", ch))
+ chan_enabled (db, prepend_ch("enabled", ch)),
+ preamp1 (db, prepend_ch("ant/preamp1", ch)),
+ preamp2 (db, prepend_ch("ant/preamp2", ch)),
+ lb_preamp_presel (db, prepend_ch("ant/lb_preamp_presel", ch)),
+ signal_path (db, prepend_ch("ch/signal_path", ch)),
+ lb_presel (db, prepend_ch("ch/lb_presel", ch)),
+ hb_presel (db, prepend_ch("ch/hb_presel", ch)),
+ input_atten (db, prepend_ch("ant/input_atten", ch)),
+ lb_atten (db, prepend_ch("ch/lb_atten", ch)),
+ hb_atten (db, prepend_ch("ch/hb_atten", ch)),
+ lo1_source (db, prepend_ch("ch/LO1/source", ch)),
+ lo2_source (db, prepend_ch("ch/LO2/source", ch)),
+ lo1_freq_d (db, prepend_ch("los/LO1/freq/desired", ch)),
+ lo2_freq_d (db, prepend_ch("los/LO2/freq/desired", ch)),
+ lo1_charge_pump_d (db, prepend_ch("los/LO1/charge_pump/desired", ch)),
+ lo2_charge_pump_d (db, prepend_ch("los/LO2/charge_pump/desired", ch)),
+ lo1_freq_c (db, prepend_ch("los/LO1/freq/coerced", ch)),
+ lo2_freq_c (db, prepend_ch("los/LO2/freq/coerced", ch)),
+ lo1_charge_pump_c (db, prepend_ch("los/LO1/charge_pump/coerced", ch)),
+ lo2_charge_pump_c (db, prepend_ch("los/LO2/charge_pump/coerced", ch))
{}
//Inputs (channel specific)
@@ -613,17 +621,21 @@ private:
experts::data_reader_t<twinrx_ctrl::signal_path_t> signal_path;
experts::data_reader_t<twinrx_ctrl::preselector_path_t> lb_presel;
experts::data_reader_t<twinrx_ctrl::preselector_path_t> hb_presel;
- experts::data_reader_t<uint8_t> input_atten;
- experts::data_reader_t<uint8_t> lb_atten;
- experts::data_reader_t<uint8_t> hb_atten;
+ experts::data_reader_t<uint8_t> input_atten;
+ experts::data_reader_t<uint8_t> lb_atten;
+ experts::data_reader_t<uint8_t> hb_atten;
experts::data_reader_t<twinrx_ctrl::lo_source_t> lo1_source;
experts::data_reader_t<twinrx_ctrl::lo_source_t> lo2_source;
experts::data_reader_t<double> lo1_freq_d;
experts::data_reader_t<double> lo2_freq_d;
+ experts::data_reader_t<double> lo1_charge_pump_d;
+ experts::data_reader_t<double> lo2_charge_pump_d;
//Output (channel specific)
experts::data_writer_t<double> lo1_freq_c;
experts::data_writer_t<double> lo2_freq_c;
+ experts::data_writer_t<double> lo1_charge_pump_c;
+ experts::data_writer_t<double> lo2_charge_pump_c;
};
//External interface