aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M
diff options
context:
space:
mode:
authorkurtis.heimerl <kurtis.heimerl@19bc5d8c-e614-43d4-8b26-e1612bc8e597>2011-11-26 03:17:10 +0000
committerkurtis.heimerl <kurtis.heimerl@19bc5d8c-e614-43d4-8b26-e1612bc8e597>2011-11-26 03:17:10 +0000
commit02d04055a33a8ddf5d27680997c4fda100a7c168 (patch)
treec0f121c8fac895bbb0064152257ae03feabf1f3f /Transceiver52M
parent993364485b626ff2a90e5ffbd4a4457f9d3f35d9 (diff)
uhd: set and shadow settings through interface
Shadow all gains and frequencies, which minimizes device access. This allows the transceiver to variably control the device settings. Signed-off-by: Thomas Tsou <ttsou@vt.edu> git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@2640 19bc5d8c-e614-43d4-8b26-e1612bc8e597
Diffstat (limited to 'Transceiver52M')
-rw-r--r--Transceiver52M/UHDDevice.cpp84
1 files changed, 61 insertions, 23 deletions
diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp
index 6d9ef2f..ebf442a 100644
--- a/Transceiver52M/UHDDevice.cpp
+++ b/Transceiver52M/UHDDevice.cpp
@@ -160,17 +160,17 @@ public:
inline double fullScaleInputValue() { return 13500.0; }
inline double fullScaleOutputValue() { return 9450.0; }
- double setRxGain(double dB) { return 0; }
- double getRxGain(void) { return 0; }
- double maxRxGain(void) { return 0; }
- double minRxGain(void) { return 0; }
+ double setRxGain(double db);
+ double getRxGain(void) { return rx_gain; }
+ double maxRxGain(void) { return rx_gain_max; }
+ double minRxGain(void) { return rx_gain_min; }
- double setTxGain(double dB) { return 0; }
- double maxTxGain(void) { return 0; }
- double minTxGain(void) { return 0; }
+ double setTxGain(double db);
+ double maxTxGain(void) { return tx_gain_max; }
+ double minTxGain(void) { return tx_gain_min; }
- double getTxFreq() { return 0; }
- double getRxFreq() { return 0; }
+ double getTxFreq() { return tx_freq; }
+ double getRxFreq() { return rx_freq; }
inline double getSampleRate() { return actual_smpl_rt; }
inline double numberRead() { return rx_pkt_cnt; }
@@ -184,11 +184,13 @@ public:
private:
uhd::usrp::single_usrp::sptr usrp_dev;
- double desired_smpl_rt;
- double actual_smpl_rt;
+ double desired_smpl_rt, actual_smpl_rt;
- size_t tx_spp;
- size_t rx_spp;
+ double tx_gain, tx_gain_min, tx_gain_max;
+ double rx_gain, rx_gain_min, rx_gain_max;
+
+ double tx_freq, rx_freq;
+ size_t tx_spp, rx_spp;
bool started;
bool aligned;
@@ -201,6 +203,7 @@ private:
TIMESTAMP ts_offset;
smpl_buf *rx_smpl_buf;
+ void init_gains();
bool flush_recv(size_t num_pkts);
std::string str_code(uhd::rx_metadata_t metadata);
std::string str_code(uhd::async_metadata_t metadata);
@@ -217,7 +220,10 @@ void *async_event_loop(uhd_device *dev)
}
uhd_device::uhd_device(double rate, bool skip_rx)
- : desired_smpl_rt(rate), actual_smpl_rt(0), tx_spp(0), rx_spp(0),
+ : desired_smpl_rt(rate), actual_smpl_rt(0),
+ tx_gain(0.0), tx_gain_min(0.0), tx_gain_max(0.0),
+ rx_gain(0.0), rx_gain_min(0.0), rx_gain_max(0.0),
+ tx_freq(0.0), rx_freq(0.0), tx_spp(0), rx_spp(0),
started(false), aligned(true), rx_pkt_cnt(0), drop_cnt(0),
prev_ts(0,0), ts_offset(0), rx_smpl_buf(NULL)
{
@@ -252,16 +258,45 @@ static double set_usrp_rates(uhd::usrp::single_usrp::sptr dev, double rate)
return actual_rate;
}
-static void set_usrp_tx_gain(uhd::usrp::single_usrp::sptr dev, double)
+double uhd_device::setTxGain(double db)
+{
+ usrp_dev->set_tx_gain(db);
+ tx_gain = usrp_dev->get_tx_gain();
+
+ LOG(INFO) << "Set TX gain to " << tx_gain << "dB";
+
+ return tx_gain;
+}
+
+double uhd_device::setRxGain(double db)
{
- uhd::gain_range_t range = dev->get_tx_gain_range();
- dev->set_tx_gain((range.start() + range.stop()) / 2);
+ usrp_dev->set_rx_gain(db);
+ rx_gain = usrp_dev->get_rx_gain();
+
+ LOG(INFO) << "Set RX gain to " << rx_gain << "dB";
+
+ return rx_gain;
}
-static void set_usrp_rx_gain(uhd::usrp::single_usrp::sptr dev, double)
+void uhd_device::init_gains()
{
- uhd::gain_range_t range = dev->get_rx_gain_range();
- dev->set_rx_gain((range.start() + range.stop()) / 2);
+ uhd::gain_range_t range;
+
+ range = usrp_dev->get_tx_gain_range();
+ tx_gain_min = range.start();
+ tx_gain_max = range.stop();
+
+ range = usrp_dev->get_rx_gain_range();
+ rx_gain_min = range.start();
+ rx_gain_max = range.stop();
+
+ usrp_dev->set_tx_gain((tx_gain_min + tx_gain_max) / 2);
+ usrp_dev->set_rx_gain((rx_gain_min + rx_gain_max) / 2);
+
+ tx_gain = usrp_dev->get_tx_gain();
+ rx_gain = usrp_dev->get_rx_gain();
+
+ return;
}
static void set_usrp_ref_clk(uhd::usrp::single_usrp::sptr dev, bool ext_clk)
@@ -313,9 +348,8 @@ bool uhd_device::open()
// Set receive chain sample offset
ts_offset = (TIMESTAMP)(rx_smpl_offset * actual_smpl_rt);
- // Set gains to midpoint
- set_usrp_tx_gain(usrp_dev, 0.0);
- set_usrp_rx_gain(usrp_dev, 0.0);
+ // Initialize and shadow gain values
+ init_gains();
// Set reference clock
set_usrp_ref_clk(usrp_dev, use_ext_ref);
@@ -551,6 +585,8 @@ bool uhd_device::setTxFreq(double wFreq)
{
uhd::tune_result_t tr = usrp_dev->set_tx_freq(wFreq);
LOG(INFO) << tr.to_pp_string();
+ tx_freq = usrp_dev->get_tx_freq();
+
return true;
}
@@ -558,6 +594,8 @@ bool uhd_device::setRxFreq(double wFreq)
{
uhd::tune_result_t tr = usrp_dev->set_rx_freq(wFreq);
LOG(INFO) << tr.to_pp_string();
+ rx_freq = usrp_dev->get_rx_freq();
+
return true;
}