aboutsummaryrefslogtreecommitdiffstats
path: root/host/lib/usrp/dboard
diff options
context:
space:
mode:
authorJosh Blum <josh@joshknows.com>2011-10-26 18:04:55 -0700
committerJosh Blum <josh@joshknows.com>2011-11-07 11:21:24 -0800
commit3c07f1d606296c0a6813a3a577e918926e43c478 (patch)
tree770bf3e6ea91bb4ef0a5de4bdd7bdd7a22f4c0f2 /host/lib/usrp/dboard
parent8e398397ed55ae4df014902352c66429fda2e2c0 (diff)
downloaduhd-3c07f1d606296c0a6813a3a577e918926e43c478.tar.gz
uhd-3c07f1d606296c0a6813a3a577e918926e43c478.tar.bz2
uhd-3c07f1d606296c0a6813a3a577e918926e43c478.zip
wbx: bring WBX into the tree
Diffstat (limited to 'host/lib/usrp/dboard')
-rw-r--r--host/lib/usrp/dboard/CMakeLists.txt10
-rw-r--r--host/lib/usrp/dboard/db_wbx_common.cpp190
-rw-r--r--host/lib/usrp/dboard/db_wbx_common.hpp57
-rw-r--r--host/lib/usrp/dboard/db_wbx_simple.cpp185
-rw-r--r--host/lib/usrp/dboard/db_wbx_version2.cpp130
-rw-r--r--host/lib/usrp/dboard/db_wbx_version3.cpp130
-rw-r--r--host/lib/usrp/dboard/db_wbx_version4.cpp140
7 files changed, 188 insertions, 654 deletions
diff --git a/host/lib/usrp/dboard/CMakeLists.txt b/host/lib/usrp/dboard/CMakeLists.txt
index 50662a96e..b000c7f33 100644
--- a/host/lib/usrp/dboard/CMakeLists.txt
+++ b/host/lib/usrp/dboard/CMakeLists.txt
@@ -26,11 +26,11 @@ LIBUHD_APPEND_SOURCES(
${CMAKE_CURRENT_SOURCE_DIR}/db_sbx_common.cpp
${CMAKE_CURRENT_SOURCE_DIR}/db_sbx_version3.cpp
${CMAKE_CURRENT_SOURCE_DIR}/db_sbx_version4.cpp
- #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_common.cpp
- #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_version2.cpp
- #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_version3.cpp
- #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_version4.cpp
- #${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_simple.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_common.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_version2.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_version3.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_version4.cpp
+ ${CMAKE_CURRENT_SOURCE_DIR}/db_wbx_simple.cpp
${CMAKE_CURRENT_SOURCE_DIR}/db_dbsrx.cpp
${CMAKE_CURRENT_SOURCE_DIR}/db_unknown.cpp
${CMAKE_CURRENT_SOURCE_DIR}/db_tvrx.cpp
diff --git a/host/lib/usrp/dboard/db_wbx_common.cpp b/host/lib/usrp/dboard/db_wbx_common.cpp
index 63f70e3d5..daf6dbc98 100644
--- a/host/lib/usrp/dboard/db_wbx_common.cpp
+++ b/host/lib/usrp/dboard/db_wbx_common.cpp
@@ -58,6 +58,44 @@ static int rx_pga0_gain_to_iobits(double &gain){
* WBX Common Implementation
**********************************************************************/
wbx_base::wbx_base(ctor_args_t args) : xcvr_dboard_base(args){
+
+ //enable the clocks that we need
+ this->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
+ this->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
+
+ ////////////////////////////////////////////////////////////////////
+ // Register RX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_rx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ .publish(boost::bind(&wbx_base::get_locked, this, dboard_iface::UNIT_RX));
+ BOOST_FOREACH(const std::string &name, wbx_rx_gain_ranges.keys()){
+ this->get_rx_subtree()->create<double>("gains/"+name+"/value")
+ .coerce(boost::bind(&wbx_base::set_rx_gain, this, _1, name))
+ .set(wbx_rx_gain_ranges[name].start());
+ this->get_rx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ .set(wbx_rx_gain_ranges[name]);
+ }
+ this->get_rx_subtree()->create<std::string>("connection").set("IQ");
+ this->get_rx_subtree()->create<bool>("enabled")
+ .subscribe(boost::bind(&wbx_base::set_rx_enabled, this, _1))
+ .set(true); //start enabled
+ this->get_rx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_rx_subtree()->create<double>("bandwidth/value").set(2*20.0e6); //20MHz low-pass, we want complex double-sided
+ this->get_rx_subtree()->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2*20.0e6, 2*20.0e6));
+
+ ////////////////////////////////////////////////////////////////////
+ // Register TX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_tx_subtree()->create<sensor_value_t>("sensors/lo_locked")
+ .publish(boost::bind(&wbx_base::get_locked, this, dboard_iface::UNIT_TX));
+ this->get_tx_subtree()->create<std::string>("connection").set("IQ");
+ this->get_tx_subtree()->create<bool>("use_lo_offset").set(false);
+ this->get_tx_subtree()->create<double>("bandwidth/value").set(2*20.0e6); //20MHz low-pass, we want complex double-sided
+ this->get_tx_subtree()->create<meta_range_t>("bandwidth/range")
+ .set(freq_range_t(2*20.0e6, 2*20.0e6));
+
+ // instantiate subclass foo
switch(get_rx_id().to_uint16()) {
case 0x053:
db_actual = wbx_versionx_sptr(new wbx_version2(this));
@@ -72,6 +110,7 @@ wbx_base::wbx_base(ctor_args_t args) : xcvr_dboard_base(args){
/* We didn't recognize the version of the board... */
UHD_THROW_INVALID_CODE_PATH();
}
+
}
@@ -88,18 +127,10 @@ void wbx_base::set_rx_enabled(bool enb){
);
}
-void wbx_base::set_tx_enabled(bool enb){
- db_actual->set_tx_enabled(enb);
-}
-
/***********************************************************************
* Gain Handling
**********************************************************************/
-void wbx_base::set_tx_gain(double gain, const std::string &name){
- db_actual->set_tx_gain(gain, name);
-}
-
-void wbx_base::set_rx_gain(double gain, const std::string &name){
+double wbx_base::set_rx_gain(double gain, const std::string &name){
assert_has(wbx_rx_gain_ranges.keys(), name, "wbx rx gain name");
if(name == "PGA0"){
boost::uint16_t io_bits = rx_pga0_gain_to_iobits(gain);
@@ -109,150 +140,17 @@ void wbx_base::set_rx_gain(double gain, const std::string &name){
this->get_iface()->set_gpio_out(dboard_iface::UNIT_RX, io_bits, RX_ATTN_MASK);
}
else UHD_THROW_INVALID_CODE_PATH();
+ return _rx_gains[name]; //returned shadowed
}
/***********************************************************************
* Tuning
**********************************************************************/
-freq_range_t wbx_base::get_freq_range(void) {
- return db_actual->get_freq_range();
-}
-
double wbx_base::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
return db_actual->set_lo_freq(unit, target_freq);
}
-bool wbx_base::get_locked(dboard_iface::unit_t unit){
- return (this->get_iface()->read_gpio(unit) & LOCKDET_MASK) != 0;
+sensor_value_t wbx_base::get_locked(dboard_iface::unit_t unit){
+ const bool locked = (this->get_iface()->read_gpio(unit) & LOCKDET_MASK) != 0;
+ return sensor_value_t("LO", locked, "locked", "unlocked");
}
-
-
-/***********************************************************************
- * RX Get and Set
- **********************************************************************/
-void wbx_base::rx_get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_NAME:
- val = get_rx_id().to_pp_string();
- return;
-
- case SUBDEV_PROP_OTHERS:
- val = prop_names_t(); //empty
- return;
-
- case SUBDEV_PROP_GAIN:
- assert_has(_rx_gains.keys(), key.name, "wbx rx gain name");
- val = _rx_gains[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_RANGE:
- assert_has(wbx_rx_gain_ranges.keys(), key.name, "wbx rx gain name");
- val = wbx_rx_gain_ranges[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_NAMES:
- val = prop_names_t(wbx_rx_gain_ranges.keys());
- return;
-
- case SUBDEV_PROP_FREQ:
- val = 0.0;
- return;
-
- case SUBDEV_PROP_FREQ_RANGE:
- val = freq_range_t(0.0, 0.0, 0.0);;
- return;
-
- case SUBDEV_PROP_ANTENNA:
- val = std::string("");
- return;
-
- case SUBDEV_PROP_ANTENNA_NAMES:
- val = prop_names_t(1, "");
- return;
-
- case SUBDEV_PROP_CONNECTION:
- val = SUBDEV_CONN_COMPLEX_IQ;
- return;
-
- case SUBDEV_PROP_ENABLED:
- val = _rx_enabled;
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = false;
- return;
-
- case SUBDEV_PROP_SENSOR:
- UHD_ASSERT_THROW(key.name == "lo_locked");
- val = sensor_value_t("LO", this->get_locked(dboard_iface::UNIT_RX), "locked", "unlocked");
- return;
-
- case SUBDEV_PROP_SENSOR_NAMES:
- val = prop_names_t(1, "lo_locked");
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- val = 2*20.0e6; //20MHz low-pass, we want complex double-sided
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
-}
-
-void wbx_base::rx_set(const wax::obj &key_, const wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_GAIN:
- this->set_rx_gain(val.as<double>(), key.name);
- return;
-
- case SUBDEV_PROP_ENABLED:
- _rx_enabled = val.as<bool>();
- this->set_rx_enabled(_rx_enabled);
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- UHD_MSG(warning) << "WBX: No tunable bandwidth, fixed filtered to 40MHz";
- return;
-
- default: UHD_THROW_PROP_SET_ERROR();
- }
-}
-
-/***********************************************************************
- * TX Get and Set
- **********************************************************************/
-void wbx_base::tx_get(const wax::obj &key_, wax::obj &val){
- db_actual->tx_get(key_, val);
-}
-
-void wbx_base::tx_set(const wax::obj &key_, const wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_GAIN:
- this->set_tx_gain(val.as<double>(), key.name);
- return;
-
- case SUBDEV_PROP_ENABLED:
- _tx_enabled = val.as<bool>();
- this->set_tx_enabled(_tx_enabled);
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- UHD_MSG(warning) << "WBX: No tunable bandwidth, fixed filtered to 40MHz";
- return;
-
- default: UHD_THROW_PROP_SET_ERROR();
- }
-}
-
-
diff --git a/host/lib/usrp/dboard/db_wbx_common.hpp b/host/lib/usrp/dboard/db_wbx_common.hpp
index 57e2a0fe6..3e41e04b7 100644
--- a/host/lib/usrp/dboard/db_wbx_common.hpp
+++ b/host/lib/usrp/dboard/db_wbx_common.hpp
@@ -67,6 +67,7 @@
#include <uhd/types/dict.hpp>
#include <uhd/types/ranges.hpp>
+#include <uhd/types/sensors.hpp>
#include <uhd/utils/log.hpp>
#include <uhd/utils/props.hpp>
#include <uhd/utils/static.hpp>
@@ -75,6 +76,7 @@
#include <boost/format.hpp>
#include <boost/shared_ptr.hpp>
#include <boost/math/special_functions/round.hpp>
+#include <boost/bind.hpp>
namespace uhd{ namespace usrp{
@@ -95,23 +97,9 @@ public:
virtual ~wbx_base(void);
protected:
- virtual void set_rx_gain(double gain, const std::string &name);
- virtual void set_tx_gain(double gain, const std::string &name);
+ virtual double set_rx_gain(double gain, const std::string &name);
virtual void set_rx_enabled(bool enb);
- virtual void set_tx_enabled(bool enb);
-
- virtual void rx_get(const wax::obj &key, wax::obj &val);
- virtual void rx_set(const wax::obj &key, const wax::obj &val);
-
- virtual void tx_get(const wax::obj &key, wax::obj &val);
- virtual void tx_set(const wax::obj &key, const wax::obj &val);
-
- /*!
- * Retrieve the frequency range of the board.
- * \return the frequency range as a freq_range_t
- */
- virtual freq_range_t get_freq_range(void);
/*!
* Set the LO frequency for the particular dboard unit.
@@ -128,8 +116,7 @@ protected:
* \param unit which unit rx or tx
* \return true for locked
*/
- virtual bool get_locked(dboard_iface::unit_t unit);
-
+ virtual sensor_value_t get_locked(dboard_iface::unit_t unit);
/*!
* Version-agnostic ABC that wraps version-specific implementations of the
@@ -143,11 +130,20 @@ protected:
wbx_versionx() {}
~wbx_versionx(void) {}
- virtual void set_tx_gain(double gain, const std::string &name) = 0;
+ virtual double set_tx_gain(double gain, const std::string &name) = 0;
virtual void set_tx_enabled(bool enb) = 0;
- virtual void tx_get(const wax::obj &key, wax::obj &val) = 0;
- virtual freq_range_t get_freq_range(void) = 0;
virtual double set_lo_freq(dboard_iface::unit_t unit, double target_freq) = 0;
+
+ /*! This is the registered instance of the wrapper class, wbx_base. */
+ wbx_base *self_base;
+
+ property_tree::sptr get_rx_subtree(void){
+ return self_base->get_rx_subtree();
+ }
+
+ property_tree::sptr get_tx_subtree(void){
+ return self_base->get_tx_subtree();
+ }
};
@@ -161,14 +157,9 @@ protected:
wbx_version2(wbx_base *_self_wbx_base);
~wbx_version2(void);
- void set_tx_gain(double gain, const std::string &name);
+ double set_tx_gain(double gain, const std::string &name);
void set_tx_enabled(bool enb);
- void tx_get(const wax::obj &key, wax::obj &val);
- freq_range_t get_freq_range(void);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
-
- /*! This is the registered instance of the wrapper class, wbx_base. */
- wbx_base *self_base;
};
/*!
@@ -181,14 +172,9 @@ protected:
wbx_version3(wbx_base *_self_wbx_base);
~wbx_version3(void);
- void set_tx_gain(double gain, const std::string &name);
+ double set_tx_gain(double gain, const std::string &name);
void set_tx_enabled(bool enb);
- void tx_get(const wax::obj &key, wax::obj &val);
- freq_range_t get_freq_range(void);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
-
- /*! This is the registered instance of the wrapper class, wbx_base. */
- wbx_base *self_base;
};
/*!
@@ -201,14 +187,9 @@ protected:
wbx_version4(wbx_base *_self_wbx_base);
~wbx_version4(void);
- void set_tx_gain(double gain, const std::string &name);
+ double set_tx_gain(double gain, const std::string &name);
void set_tx_enabled(bool enb);
- void tx_get(const wax::obj &key, wax::obj &val);
- freq_range_t get_freq_range(void);
double set_lo_freq(dboard_iface::unit_t unit, double target_freq);
-
- /*! This is the registered instance of the wrapper class, wbx_base. */
- wbx_base *self_base;
};
/*!
diff --git a/host/lib/usrp/dboard/db_wbx_simple.cpp b/host/lib/usrp/dboard/db_wbx_simple.cpp
index 789146854..1ac2a1704 100644
--- a/host/lib/usrp/dboard/db_wbx_simple.cpp
+++ b/host/lib/usrp/dboard/db_wbx_simple.cpp
@@ -40,9 +40,6 @@ static const prop_names_t wbx_tx_antennas = list_of("TX/RX");
static const prop_names_t wbx_rx_antennas = list_of("TX/RX")("RX2");
-//this will get set by a version-specific function call
-static freq_range_t wbx_freq_range(0.0, 0.0);
-
/***********************************************************************
* The WBX simple implementation
**********************************************************************/
@@ -51,17 +48,7 @@ public:
wbx_simple(ctor_args_t args);
~wbx_simple(void);
- void rx_get(const wax::obj &key, wax::obj &val);
- void rx_set(const wax::obj &key, const wax::obj &val);
-
- void tx_get(const wax::obj &key, wax::obj &val);
- void tx_set(const wax::obj &key, const wax::obj &val);
-
private:
- void set_rx_lo_freq(double freq);
- void set_tx_lo_freq(double freq);
- double _rx_lo_freq, _tx_lo_freq;
-
void set_rx_ant(const std::string &ant);
void set_tx_ant(const std::string &ant);
std::string _rx_ant;
@@ -86,12 +73,33 @@ UHD_STATIC_BLOCK(reg_wbx_simple_dboards){
dboard_manager::register_dboard(0x0063, 0x004f, &make_wbx_simple, "WBX v4 + Simple GDB");
}
-
/***********************************************************************
* Structors
**********************************************************************/
wbx_simple::wbx_simple(ctor_args_t args) : wbx_base(args){
+ ////////////////////////////////////////////////////////////////////
+ // Register RX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_rx_subtree()->access<std::string>("name").set(
+ this->get_rx_subtree()->access<std::string>("name").get() + " + Simple GDB");
+ this->get_rx_subtree()->create<std::string>("antenna/value")
+ .subscribe(boost::bind(&wbx_simple::set_rx_ant, this, _1))
+ .set("RX2");
+ this->get_rx_subtree()->create<std::vector<std::string> >("antenna/options")
+ .set(wbx_rx_antennas);
+
+ ////////////////////////////////////////////////////////////////////
+ // Register TX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_tx_subtree()->access<std::string>("name").set(
+ this->get_tx_subtree()->access<std::string>("name").get() + " + Simple GDB");
+ this->get_tx_subtree()->create<std::string>("antenna/value")
+ .subscribe(boost::bind(&wbx_simple::set_tx_ant, this, _1))
+ .set(wbx_tx_antennas.at(0));
+ this->get_tx_subtree()->create<std::vector<std::string> >("antenna/options")
+ .set(wbx_tx_antennas);
+
//set the gpio directions and atr controls (antenna switches all under ATR)
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_TX, ANTSW_IO, ANTSW_IO);
this->get_iface()->set_pin_ctrl(dboard_iface::UNIT_RX, ANTSW_IO, ANTSW_IO);
@@ -107,14 +115,6 @@ wbx_simple::wbx_simple(ctor_args_t args) : wbx_base(args){
this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_IDLE, ANT_TXRX, ANTSW_IO);
this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_TX_ONLY, ANT_RX2, ANTSW_IO);
this->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_FULL_DUPLEX, ANT_RX2, ANTSW_IO);
-
- //get the frequency range of our WBX db
- wbx_freq_range = this->get_freq_range();
-
- //set some default values
- set_rx_lo_freq((wbx_freq_range.start() + wbx_freq_range.stop())/2.0);
- set_tx_lo_freq((wbx_freq_range.start() + wbx_freq_range.stop())/2.0);
- set_rx_ant("RX2");
}
wbx_simple::~wbx_simple(void){
@@ -139,144 +139,3 @@ void wbx_simple::set_tx_ant(const std::string &ant){
assert_has(wbx_tx_antennas, ant, "wbx tx antenna name");
//only one antenna option, do nothing
}
-
-/***********************************************************************
- * Tuning
- **********************************************************************/
-void wbx_simple::set_rx_lo_freq(double freq){
- _rx_lo_freq = set_lo_freq(dboard_iface::UNIT_RX, wbx_freq_range.clip(freq));
-}
-
-void wbx_simple::set_tx_lo_freq(double freq){
- _tx_lo_freq = set_lo_freq(dboard_iface::UNIT_TX, wbx_freq_range.clip(freq));
-}
-
-/***********************************************************************
- * RX Get and Set
- **********************************************************************/
-void wbx_simple::rx_get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_NAME:
- switch(get_rx_id().to_uint16()) {
- case 0x053:
- val = std::string("WBX RX + Simple GDB");
- return;
- case 0x057:
- val = std::string("WBX v3 RX + Simple GDB");
- return;
- case 0x063:
- val = std::string("WBX v4 RX + Simple GDB");
- return;
- default:
- UHD_THROW_INVALID_CODE_PATH();
- }
-
- case SUBDEV_PROP_FREQ:
- val = _rx_lo_freq;
- return;
-
- case SUBDEV_PROP_FREQ_RANGE:
- val = wbx_freq_range;
- return;
-
- case SUBDEV_PROP_ANTENNA:
- val = _rx_ant;
- return;
-
- case SUBDEV_PROP_ANTENNA_NAMES:
- val = wbx_rx_antennas;
- return;
-
- default:
- //call into the base class for other properties
- wbx_base::rx_get(key_, val);
- }
-}
-
-void wbx_simple::rx_set(const wax::obj &key_, const wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_FREQ:
- this->set_rx_lo_freq(val.as<double>());
- return;
-
- case SUBDEV_PROP_ANTENNA:
- this->set_rx_ant(val.as<std::string>());
- return;
-
- default:
- //call into the base class for other properties
- wbx_base::rx_set(key_, val);
- }
-}
-
-/***********************************************************************
- * TX Get and Set
- **********************************************************************/
-void wbx_simple::tx_get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_NAME:
- switch(get_rx_id().to_uint16()) {
- case 0x053:
- val = std::string("WBX TX + Simple GDB");
- return;
- case 0x057:
- val = std::string("WBX v3 TX + Simple GDB");
- return;
- case 0x063:
- val = std::string("WBX v4 TX + Simple GDB");
- return;
- default:
- UHD_THROW_INVALID_CODE_PATH();
- }
-
- case SUBDEV_PROP_FREQ:
- val = _tx_lo_freq;
- return;
-
- case SUBDEV_PROP_FREQ_RANGE:
- val = wbx_freq_range;
- return;
-
- case SUBDEV_PROP_ANTENNA:
- val = std::string("TX/RX");
- return;
-
- case SUBDEV_PROP_ANTENNA_NAMES:
- val = wbx_tx_antennas;
- return;
-
- default:
- //call into the base class for other properties
- wbx_base::tx_get(key_, val);
- }
-}
-
-void wbx_simple::tx_set(const wax::obj &key_, const wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
-
- case SUBDEV_PROP_FREQ:
- this->set_tx_lo_freq(val.as<double>());
- return;
-
- case SUBDEV_PROP_ANTENNA:
- this->set_tx_ant(val.as<std::string>());
- return;
-
- default:
- //call into the base class for other properties
- wbx_base::tx_set(key_, val);
- }
-}
diff --git a/host/lib/usrp/dboard/db_wbx_version2.cpp b/host/lib/usrp/dboard/db_wbx_version2.cpp
index 0b57a6e2d..d8a2b7e93 100644
--- a/host/lib/usrp/dboard/db_wbx_version2.cpp
+++ b/host/lib/usrp/dboard/db_wbx_version2.cpp
@@ -75,9 +75,33 @@ wbx_base::wbx_version2::wbx_version2(wbx_base *_self_wbx_base) {
//register our handle on the primary wbx_base instance
self_base = _self_wbx_base;
- //enable the clocks that we need
- self_base->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
- self_base->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
+ ////////////////////////////////////////////////////////////////////
+ // Register RX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_rx_subtree()->create<std::string>("name").set("WBX RX v2");
+ this->get_rx_subtree()->create<double>("freq/value")
+ .coerce(boost::bind(&wbx_base::wbx_version2::set_lo_freq, this, dboard_iface::UNIT_RX, _1))
+ .set((wbx_v2_freq_range.start() + wbx_v2_freq_range.stop())/2.0);
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(wbx_v2_freq_range);
+
+ ////////////////////////////////////////////////////////////////////
+ // Register TX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_tx_subtree()->create<std::string>("name").set("WBX TX v2");
+ BOOST_FOREACH(const std::string &name, wbx_v2_tx_gain_ranges.keys()){
+ self_base->get_tx_subtree()->create<double>("gains/"+name+"/value")
+ .coerce(boost::bind(&wbx_base::wbx_version2::set_tx_gain, this, _1, name))
+ .set(wbx_v2_tx_gain_ranges[name].start());
+ self_base->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ .set(wbx_v2_tx_gain_ranges[name]);
+ }
+ this->get_rx_subtree()->create<double>("freq/value")
+ .coerce(boost::bind(&wbx_base::wbx_version2::set_lo_freq, this, dboard_iface::UNIT_TX, _1))
+ .set((wbx_v2_freq_range.start() + wbx_v2_freq_range.stop())/2.0);
+ this->get_tx_subtree()->create<meta_range_t>("freq/range").set(wbx_v2_freq_range);
+ this->get_tx_subtree()->create<bool>("enabled")
+ .subscribe(boost::bind(&wbx_base::wbx_version2::set_tx_enabled, this, _1))
+ .set(true); //start enabled
//set attenuator control bits
int v2_iobits = ADF4350_CE;
@@ -99,17 +123,6 @@ wbx_base::wbx_version2::wbx_version2(wbx_base *_self_wbx_base) {
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_TX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_RX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_FULL_DUPLEX, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
-
- BOOST_FOREACH(const std::string &name, wbx_v2_tx_gain_ranges.keys()) {
- set_tx_gain(wbx_v2_tx_gain_ranges[name].start(), name);
- }
-
- BOOST_FOREACH(const std::string &name, wbx_rx_gain_ranges.keys()) {
- self_base->set_rx_gain(wbx_rx_gain_ranges[name].start(), name);
- }
-
- self_base->set_rx_enabled(false);
- set_tx_enabled(false);
}
wbx_base::wbx_version2::~wbx_version2(void){
@@ -119,7 +132,6 @@ wbx_base::wbx_version2::~wbx_version2(void){
/***********************************************************************
* Enables
**********************************************************************/
-
void wbx_base::wbx_version2::set_tx_enabled(bool enb){
self_base->get_iface()->set_gpio_out(dboard_iface::UNIT_TX,
(enb)? TX_POWER_UP | ADF4350_CE : TX_POWER_DOWN, TX_POWER_UP | TX_POWER_DOWN | ADF4350_CE);
@@ -129,7 +141,7 @@ void wbx_base::wbx_version2::set_tx_enabled(bool enb){
/***********************************************************************
* Gain Handling
**********************************************************************/
-void wbx_base::wbx_version2::set_tx_gain(double gain, const std::string &name){
+double wbx_base::wbx_version2::set_tx_gain(double gain, const std::string &name){
assert_has(wbx_v2_tx_gain_ranges.keys(), name, "wbx tx gain name");
if(name == "PGA0"){
double dac_volts = tx_pga0_gain_to_dac_volts(gain);
@@ -139,16 +151,13 @@ void wbx_base::wbx_version2::set_tx_gain(double gain, const std::string &name){
self_base->get_iface()->write_aux_dac(dboard_iface::UNIT_TX, dboard_iface::AUX_DAC_A, dac_volts);
}
else UHD_THROW_INVALID_CODE_PATH();
+ return self_base->_tx_gains[name]; //shadowed
}
/***********************************************************************
* Tuning
**********************************************************************/
-freq_range_t wbx_base::wbx_version2::get_freq_range(void) {
- return wbx_v2_freq_range;
-}
-
double wbx_base::wbx_version2::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
UHD_LOGV(often) << boost::format(
"WBX tune: target frequency %f Mhz"
@@ -247,8 +256,8 @@ double wbx_base::wbx_version2::set_lo_freq(dboard_iface::unit_t unit, double tar
UHD_LOGV(often)
<< boost::format("WBX Intermediates: ref=%0.2f, outdiv=%f, fbdiv=%f") % (ref_freq*(1+int(D))/(R*(1+int(T)))) % double(RFdiv*2) % double(N + double(FRAC)/double(MOD)) << std::endl
- << boost::format("WBX tune: R=%d, BS=%d, N=%d, FRAC=%d, MOD=%d, T=%d, D=%d, RFdiv=%d, LD=%d"
- ) % R % BS % N % FRAC % MOD % T % D % RFdiv % self_base->get_locked(unit)<< std::endl
+ << boost::format("WBX tune: R=%d, BS=%d, N=%d, FRAC=%d, MOD=%d, T=%d, D=%d, RFdiv=%d, LD=%s"
+ ) % R % BS % N % FRAC % MOD % T % D % RFdiv % self_base->get_locked(unit).to_pp_string() << std::endl
<< boost::format("WBX Frequencies (MHz): REQ=%0.2f, ACT=%0.2f, VCO=%0.2f, PFD=%0.2f, BAND=%0.2f"
) % (target_freq/1e6) % (actual_freq/1e6) % (vco_freq/1e6) % (pfd_freq/1e6) % (pfd_freq/BS/1e6) << std::endl;
@@ -315,80 +324,3 @@ double wbx_base::wbx_version2::set_lo_freq(dboard_iface::unit_t unit, double tar
) % (actual_freq/1e6) << std::endl;
return actual_freq;
}
-
-
-/***********************************************************************
- * TX Get and Set
- **********************************************************************/
-void wbx_base::wbx_version2::tx_get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_NAME:
- val = self_base->get_tx_id().to_pp_string();
- return;
-
- case SUBDEV_PROP_OTHERS:
- val = prop_names_t(); //empty
- return;
-
- case SUBDEV_PROP_GAIN:
- assert_has(self_base->_tx_gains.keys(), key.name, "wbx tx gain name");
- val = self_base->_tx_gains[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_RANGE:
- assert_has(wbx_v2_tx_gain_ranges.keys(), key.name, "wbx tx gain name");
- val = wbx_v2_tx_gain_ranges[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_NAMES:
- val = prop_names_t(wbx_v2_tx_gain_ranges.keys());
- return;
-
- case SUBDEV_PROP_FREQ:
- val = 0.0;
- return;
-
- case SUBDEV_PROP_FREQ_RANGE:
- val = freq_range_t(0.0, 0.0, 0.0);
- return;
-
- case SUBDEV_PROP_ANTENNA:
- val = std::string("");
- return;
-
- case SUBDEV_PROP_ANTENNA_NAMES:
- val = prop_names_t(1, "");
- return;
-
- case SUBDEV_PROP_CONNECTION:
- val = SUBDEV_CONN_COMPLEX_IQ;
- return;
-
- case SUBDEV_PROP_ENABLED:
- val = self_base->_tx_enabled;
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = false;
- return;
-
- case SUBDEV_PROP_SENSOR:
- UHD_ASSERT_THROW(key.name == "lo_locked");
- val = sensor_value_t("LO", self_base->get_locked(dboard_iface::UNIT_TX), "locked", "unlocked");
- return;
-
- case SUBDEV_PROP_SENSOR_NAMES:
- val = prop_names_t(1, "lo_locked");
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- val = 2*20.0e6; //20MHz low-pass, we want complex double-sided
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
-}
-
diff --git a/host/lib/usrp/dboard/db_wbx_version3.cpp b/host/lib/usrp/dboard/db_wbx_version3.cpp
index 3c5cdf5ba..4473bf1ae 100644
--- a/host/lib/usrp/dboard/db_wbx_version3.cpp
+++ b/host/lib/usrp/dboard/db_wbx_version3.cpp
@@ -81,9 +81,33 @@ wbx_base::wbx_version3::wbx_version3(wbx_base *_self_wbx_base) {
//register our handle on the primary wbx_base instance
self_base = _self_wbx_base;
- //enable the clocks that we need
- self_base->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
- self_base->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
+ ////////////////////////////////////////////////////////////////////
+ // Register RX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_rx_subtree()->create<std::string>("name").set("WBX RX v3");
+ this->get_rx_subtree()->create<double>("freq/value")
+ .coerce(boost::bind(&wbx_base::wbx_version3::set_lo_freq, this, dboard_iface::UNIT_RX, _1))
+ .set((wbx_v3_freq_range.start() + wbx_v3_freq_range.stop())/2.0);
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(wbx_v3_freq_range);
+
+ ////////////////////////////////////////////////////////////////////
+ // Register TX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_tx_subtree()->create<std::string>("name").set("WBX TX v3");
+ BOOST_FOREACH(const std::string &name, wbx_v3_tx_gain_ranges.keys()){
+ self_base->get_tx_subtree()->create<double>("gains/"+name+"/value")
+ .coerce(boost::bind(&wbx_base::wbx_version3::set_tx_gain, this, _1, name))
+ .set(wbx_v3_tx_gain_ranges[name].start());
+ self_base->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ .set(wbx_v3_tx_gain_ranges[name]);
+ }
+ this->get_rx_subtree()->create<double>("freq/value")
+ .coerce(boost::bind(&wbx_base::wbx_version3::set_lo_freq, this, dboard_iface::UNIT_TX, _1))
+ .set((wbx_v3_freq_range.start() + wbx_v3_freq_range.stop())/2.0);
+ this->get_tx_subtree()->create<meta_range_t>("freq/range").set(wbx_v3_freq_range);
+ this->get_tx_subtree()->create<bool>("enabled")
+ .subscribe(boost::bind(&wbx_base::wbx_version3::set_tx_enabled, this, _1))
+ .set(true); //start enabled
//set attenuator control bits
int v3_iobits = TX_ATTN_MASK;
@@ -105,18 +129,6 @@ wbx_base::wbx_version3::wbx_version3(wbx_base *_self_wbx_base) {
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_TX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_RX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_FULL_DUPLEX, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
-
- //set some default values
- BOOST_FOREACH(const std::string &name, wbx_v3_tx_gain_ranges.keys()){
- set_tx_gain(wbx_v3_tx_gain_ranges[name].start(), name);
- }
-
- BOOST_FOREACH(const std::string &name, wbx_rx_gain_ranges.keys()){
- self_base->set_rx_gain(wbx_rx_gain_ranges[name].start(), name);
- }
-
- self_base->set_rx_enabled(false);
- set_tx_enabled(false);
}
wbx_base::wbx_version3::~wbx_version3(void){
@@ -136,7 +148,7 @@ void wbx_base::wbx_version3::set_tx_enabled(bool enb){
/***********************************************************************
* Gain Handling
**********************************************************************/
-void wbx_base::wbx_version3::set_tx_gain(double gain, const std::string &name){
+double wbx_base::wbx_version3::set_tx_gain(double gain, const std::string &name){
assert_has(wbx_v3_tx_gain_ranges.keys(), name, "wbx tx gain name");
if(name == "PGA0"){
boost::uint16_t io_bits = tx_pga0_gain_to_iobits(gain);
@@ -146,16 +158,13 @@ void wbx_base::wbx_version3::set_tx_gain(double gain, const std::string &name){
self_base->get_iface()->set_gpio_out(dboard_iface::UNIT_TX, io_bits, TX_ATTN_MASK);
}
else UHD_THROW_INVALID_CODE_PATH();
+ return self_base->_tx_gains[name]; //shadow
}
/***********************************************************************
* Tuning
**********************************************************************/
-freq_range_t wbx_base::wbx_version3::get_freq_range(void) {
- return wbx_v3_freq_range;
-}
-
double wbx_base::wbx_version3::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
UHD_LOGV(often) << boost::format(
"WBX tune: target frequency %f Mhz"
@@ -254,8 +263,8 @@ double wbx_base::wbx_version3::set_lo_freq(dboard_iface::unit_t unit, double tar
UHD_LOGV(often)
<< boost::format("WBX Intermediates: ref=%0.2f, outdiv=%f, fbdiv=%f") % (ref_freq*(1+int(D))/(R*(1+int(T)))) % double(RFdiv*2) % double(N + double(FRAC)/double(MOD)) << std::endl
- << boost::format("WBX tune: R=%d, BS=%d, N=%d, FRAC=%d, MOD=%d, T=%d, D=%d, RFdiv=%d, LD=%d"
- ) % R % BS % N % FRAC % MOD % T % D % RFdiv % self_base->get_locked(unit)<< std::endl
+ << boost::format("WBX tune: R=%d, BS=%d, N=%d, FRAC=%d, MOD=%d, T=%d, D=%d, RFdiv=%d, LD=%s"
+ ) % R % BS % N % FRAC % MOD % T % D % RFdiv % self_base->get_locked(unit).to_pp_string() << std::endl
<< boost::format("WBX Frequencies (MHz): REQ=%0.2f, ACT=%0.2f, VCO=%0.2f, PFD=%0.2f, BAND=%0.2f"
) % (target_freq/1e6) % (actual_freq/1e6) % (vco_freq/1e6) % (pfd_freq/1e6) % (pfd_freq/BS/1e6) << std::endl;
@@ -322,80 +331,3 @@ double wbx_base::wbx_version3::set_lo_freq(dboard_iface::unit_t unit, double tar
) % (actual_freq/1e6) << std::endl;
return actual_freq;
}
-
-
-/***********************************************************************
- * TX Get and Set
- **********************************************************************/
-void wbx_base::wbx_version3::tx_get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_NAME:
- val = self_base->get_tx_id().to_pp_string();
- return;
-
- case SUBDEV_PROP_OTHERS:
- val = prop_names_t(); //empty
- return;
-
- case SUBDEV_PROP_GAIN:
- assert_has(self_base->_tx_gains.keys(), key.name, "wbx tx gain name");
- val = self_base->_tx_gains[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_RANGE:
- assert_has(wbx_v3_tx_gain_ranges.keys(), key.name, "wbx tx gain name");
- val = wbx_v3_tx_gain_ranges[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_NAMES:
- val = prop_names_t(wbx_v3_tx_gain_ranges.keys());
- return;
-
- case SUBDEV_PROP_FREQ:
- val = 0.0;
- return;
-
- case SUBDEV_PROP_FREQ_RANGE:
- val = freq_range_t(0.0, 0.0, 0.0);
- return;
-
- case SUBDEV_PROP_ANTENNA:
- val = std::string("");
- return;
-
- case SUBDEV_PROP_ANTENNA_NAMES:
- val = prop_names_t(1, "");
- return;
-
- case SUBDEV_PROP_CONNECTION:
- val = SUBDEV_CONN_COMPLEX_IQ;
- return;
-
- case SUBDEV_PROP_ENABLED:
- val = self_base->_tx_enabled;
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = false;
- return;
-
- case SUBDEV_PROP_SENSOR:
- UHD_ASSERT_THROW(key.name == "lo_locked");
- val = sensor_value_t("LO", self_base->get_locked(dboard_iface::UNIT_TX), "locked", "unlocked");
- return;
-
- case SUBDEV_PROP_SENSOR_NAMES:
- val = prop_names_t(1, "lo_locked");
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- val = 2*20.0e6; //20MHz low-pass, we want complex double-sided
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
-}
-
diff --git a/host/lib/usrp/dboard/db_wbx_version4.cpp b/host/lib/usrp/dboard/db_wbx_version4.cpp
index b5104c9f1..981e4f4d2 100644
--- a/host/lib/usrp/dboard/db_wbx_version4.cpp
+++ b/host/lib/usrp/dboard/db_wbx_version4.cpp
@@ -37,7 +37,7 @@ using namespace boost::assign;
/***********************************************************************
* WBX Version 3 Constants
**********************************************************************/
-static const uhd::dict<std::string, gain_range_t> wbx_v4_gain_ranges = map_list_of
+static const uhd::dict<std::string, gain_range_t> wbx_v4_tx_gain_ranges = map_list_of
("PGA0", gain_range_t(0, 31, 1.0))
;
@@ -49,10 +49,10 @@ static const freq_range_t wbx_v4_freq_range(50.0e6, 2.2e9);
**********************************************************************/
static int tx_pga0_gain_to_iobits(double &gain){
//clip the input
- gain = wbx_v4_gain_ranges["PGA0"].clip(gain);
+ gain = wbx_v4_tx_gain_ranges["PGA0"].clip(gain);
//convert to attenuation
- double attn = wbx_v4_gain_ranges["PGA0"].stop() - gain;
+ double attn = wbx_v4_tx_gain_ranges["PGA0"].stop() - gain;
//calculate the attenuation
int attn_code = boost::math::iround(attn);
@@ -69,7 +69,7 @@ static int tx_pga0_gain_to_iobits(double &gain){
) % attn % attn_code % (iobits & TX_ATTN_MASK) % TX_ATTN_MASK << std::endl;
//the actual gain setting
- gain = wbx_v4_gain_ranges["PGA0"].stop() - double(attn_code);
+ gain = wbx_v4_tx_gain_ranges["PGA0"].stop() - double(attn_code);
return iobits;
}
@@ -82,9 +82,33 @@ wbx_base::wbx_version4::wbx_version4(wbx_base *_self_wbx_base) {
//register our handle on the primary wbx_base instance
self_base = _self_wbx_base;
- //enable the clocks that we need
- self_base->get_iface()->set_clock_enabled(dboard_iface::UNIT_TX, true);
- self_base->get_iface()->set_clock_enabled(dboard_iface::UNIT_RX, true);
+ ////////////////////////////////////////////////////////////////////
+ // Register RX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_rx_subtree()->create<std::string>("name").set("WBX RX v4");
+ this->get_rx_subtree()->create<double>("freq/value")
+ .coerce(boost::bind(&wbx_base::wbx_version4::set_lo_freq, this, dboard_iface::UNIT_RX, _1))
+ .set((wbx_v4_freq_range.start() + wbx_v4_freq_range.stop())/2.0);
+ this->get_rx_subtree()->create<meta_range_t>("freq/range").set(wbx_v4_freq_range);
+
+ ////////////////////////////////////////////////////////////////////
+ // Register TX properties
+ ////////////////////////////////////////////////////////////////////
+ this->get_tx_subtree()->create<std::string>("name").set("WBX TX v4");
+ BOOST_FOREACH(const std::string &name, wbx_v4_tx_gain_ranges.keys()){
+ self_base->get_tx_subtree()->create<double>("gains/"+name+"/value")
+ .coerce(boost::bind(&wbx_base::wbx_version4::set_tx_gain, this, _1, name))
+ .set(wbx_v4_tx_gain_ranges[name].start());
+ self_base->get_tx_subtree()->create<meta_range_t>("gains/"+name+"/range")
+ .set(wbx_v4_tx_gain_ranges[name]);
+ }
+ this->get_rx_subtree()->create<double>("freq/value")
+ .coerce(boost::bind(&wbx_base::wbx_version4::set_lo_freq, this, dboard_iface::UNIT_TX, _1))
+ .set((wbx_v4_freq_range.start() + wbx_v4_freq_range.stop())/2.0);
+ this->get_tx_subtree()->create<meta_range_t>("freq/range").set(wbx_v4_freq_range);
+ this->get_tx_subtree()->create<bool>("enabled")
+ .subscribe(boost::bind(&wbx_base::wbx_version4::set_tx_enabled, this, _1))
+ .set(true); //start enabled
//set attenuator control bits
int v4_iobits = TX_ATTN_MASK;
@@ -106,18 +130,6 @@ wbx_base::wbx_version4::wbx_version4(wbx_base *_self_wbx_base) {
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_TX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_RX_ONLY, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
self_base->get_iface()->set_atr_reg(dboard_iface::UNIT_RX, dboard_iface::ATR_REG_FULL_DUPLEX, RX_MIXER_ENB, RX_MIXER_DIS | RX_MIXER_ENB);
-
- //set some default values
- BOOST_FOREACH(const std::string &name, wbx_v4_gain_ranges.keys()){
- set_tx_gain(wbx_v4_gain_ranges[name].start(), name);
- }
-
- BOOST_FOREACH(const std::string &name, wbx_rx_gain_ranges.keys()){
- self_base->set_rx_gain(wbx_rx_gain_ranges[name].start(), name);
- }
-
- self_base->set_rx_enabled(false);
- set_tx_enabled(false);
}
wbx_base::wbx_version4::~wbx_version4(void){
@@ -137,8 +149,8 @@ void wbx_base::wbx_version4::set_tx_enabled(bool enb) {
/***********************************************************************
* Gain Handling
**********************************************************************/
-void wbx_base::wbx_version4::set_tx_gain(double gain, const std::string &name) {
- assert_has(wbx_v4_gain_ranges.keys(), name, "wbx tx gain name");
+double wbx_base::wbx_version4::set_tx_gain(double gain, const std::string &name) {
+ assert_has(wbx_v4_tx_gain_ranges.keys(), name, "wbx tx gain name");
if(name == "PGA0"){
boost::uint16_t io_bits = tx_pga0_gain_to_iobits(gain);
self_base->_tx_gains[name] = gain;
@@ -147,16 +159,13 @@ void wbx_base::wbx_version4::set_tx_gain(double gain, const std::string &name) {
self_base->get_iface()->set_gpio_out(dboard_iface::UNIT_TX, io_bits, TX_ATTN_MASK);
}
else UHD_THROW_INVALID_CODE_PATH();
+ return self_base->_tx_gains[name];
}
/***********************************************************************
* Tuning
**********************************************************************/
-freq_range_t wbx_base::wbx_version4::get_freq_range(void) {
- return wbx_v4_freq_range;
-}
-
double wbx_base::wbx_version4::set_lo_freq(dboard_iface::unit_t unit, double target_freq) {
UHD_LOGV(often) << boost::format(
"WBX tune: target frequency %f Mhz"
@@ -257,8 +266,8 @@ double wbx_base::wbx_version4::set_lo_freq(dboard_iface::unit_t unit, double tar
UHD_LOGV(often)
<< boost::format("WBX Intermediates: ref=%0.2f, outdiv=%f, fbdiv=%f") % (ref_freq*(1+int(D))/(R*(1+int(T)))) % double(RFdiv*2) % double(N + double(FRAC)/double(MOD)) << std::endl
- << boost::format("WBX tune: R=%d, BS=%d, N=%d, FRAC=%d, MOD=%d, T=%d, D=%d, RFdiv=%d, LD=%d"
- ) % R % BS % N % FRAC % MOD % T % D % RFdiv % self_base->get_locked(unit)<< std::endl
+ << boost::format("WBX tune: R=%d, BS=%d, N=%d, FRAC=%d, MOD=%d, T=%d, D=%d, RFdiv=%d, LD=%s"
+ ) % R % BS % N % FRAC % MOD % T % D % RFdiv % self_base->get_locked(unit).to_pp_string() << std::endl
<< boost::format("WBX Frequencies (MHz): REQ=%0.2f, ACT=%0.2f, VCO=%0.2f, PFD=%0.2f, BAND=%0.2f"
) % (target_freq/1e6) % (actual_freq/1e6) % (vco_freq/1e6) % (pfd_freq/1e6) % (pfd_freq/BS/1e6) << std::endl;
@@ -325,80 +334,3 @@ double wbx_base::wbx_version4::set_lo_freq(dboard_iface::unit_t unit, double tar
) % (actual_freq/1e6) << std::endl;
return actual_freq;
}
-
-
-/***********************************************************************
- * TX Get and Set
- **********************************************************************/
-void wbx_base::wbx_version4::tx_get(const wax::obj &key_, wax::obj &val){
- named_prop_t key = named_prop_t::extract(key_);
-
- //handle the get request conditioned on the key
- switch(key.as<subdev_prop_t>()){
- case SUBDEV_PROP_NAME:
- val = self_base->get_tx_id().to_pp_string();
- return;
-
- case SUBDEV_PROP_OTHERS:
- val = prop_names_t(); //empty
- return;
-
- case SUBDEV_PROP_GAIN:
- assert_has(self_base->_tx_gains.keys(), key.name, "wbx tx gain name");
- val = self_base->_tx_gains[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_RANGE:
- assert_has(wbx_v4_gain_ranges.keys(), key.name, "wbx tx gain name");
- val = wbx_v4_gain_ranges[key.name];
- return;
-
- case SUBDEV_PROP_GAIN_NAMES:
- val = prop_names_t(wbx_v4_gain_ranges.keys());
- return;
-
- case SUBDEV_PROP_FREQ:
- val = 0.0;
- return;
-
- case SUBDEV_PROP_FREQ_RANGE:
- val = freq_range_t(0.0, 0.0, 0.0);
- return;
-
- case SUBDEV_PROP_ANTENNA:
- val = std::string("");
- return;
-
- case SUBDEV_PROP_ANTENNA_NAMES:
- val = prop_names_t(1, "");
- return;
-
- case SUBDEV_PROP_CONNECTION:
- val = SUBDEV_CONN_COMPLEX_IQ;
- return;
-
- case SUBDEV_PROP_ENABLED:
- val = self_base->_tx_enabled;
- return;
-
- case SUBDEV_PROP_USE_LO_OFFSET:
- val = false;
- return;
-
- case SUBDEV_PROP_SENSOR:
- UHD_ASSERT_THROW(key.name == "lo_locked");
- val = sensor_value_t("LO", self_base->get_locked(dboard_iface::UNIT_TX), "locked", "unlocked");
- return;
-
- case SUBDEV_PROP_SENSOR_NAMES:
- val = prop_names_t(1, "lo_locked");
- return;
-
- case SUBDEV_PROP_BANDWIDTH:
- val = 2*20.0e6; //20MHz low-pass, we want complex double-sided
- return;
-
- default: UHD_THROW_PROP_GET_ERROR();
- }
-}
-