From 02d04055a33a8ddf5d27680997c4fda100a7c168 Mon Sep 17 00:00:00 2001 From: "kurtis.heimerl" Date: Sat, 26 Nov 2011 03:17:10 +0000 Subject: 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 git-svn-id: http://wush.net/svn/range/software/public/openbts/trunk@2640 19bc5d8c-e614-43d4-8b26-e1612bc8e597 --- Transceiver52M/UHDDevice.cpp | 84 ++++++++++++++++++++++++++++++++------------ 1 file changed, 61 insertions(+), 23 deletions(-) (limited to 'Transceiver52M') 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; } -- cgit v1.2.3