From 05c6feb71dd2f66b74c9e1671d91570485479836 Mon Sep 17 00:00:00 2001 From: Tom Tsou Date: Wed, 22 Jun 2016 16:09:44 -0700 Subject: radioInterface: Convert diversity argument to general type Rather than a simple bool type, convert the diversity switch to the device interface specifer: enum InterfaceType { NORMAL, RESAMP_64M, RESAMP_100M, DIVERSITY, }; The more general specifier allows passing in special cases other then selection diversity such as multi-ARFCN support. Signed-off-by: Tom Tsou --- Transceiver52M/UHDDevice.cpp | 70 ++++++++++++++++++++------------------------ Transceiver52M/osmo-trx.cpp | 5 ++-- Transceiver52M/radioDevice.h | 13 +++++--- 3 files changed, 43 insertions(+), 45 deletions(-) diff --git a/Transceiver52M/UHDDevice.cpp b/Transceiver52M/UHDDevice.cpp index 0dc0549..5ffaa62 100644 --- a/Transceiver52M/UHDDevice.cpp +++ b/Transceiver52M/UHDDevice.cpp @@ -1,8 +1,10 @@ /* * Device support for Ettus Research UHD driver - * Written by Thomas Tsou * * Copyright 2010,2011 Free Software Foundation, Inc. + * Copyright (C) 2015 Ettus Research LLC + * + * Author: Tom Tsou * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero General Public License as published by @@ -137,11 +139,13 @@ static struct uhd_dev_offset special_offsets[] = { * The base rate is either GSM symbol rate, 270.833 kHz, or the minimum * usable channel spacing of 400 kHz. */ -static double select_rate(uhd_dev_type type, int sps, bool diversity = false) +static double select_rate(uhd_dev_type type, int sps, + RadioDevice::InterfaceType iface) { - if (diversity && (type == UMTRX)) { - return GSMRATE * 4; - } else if (diversity) { + if (iface == RadioDevice::DIVERSITY) { + if (type == UMTRX) + return GSMRATE * 4; + LOG(ALERT) << "Diversity supported on UmTRX only"; return -9999.99; } @@ -242,8 +246,8 @@ private: */ class uhd_device : public RadioDevice { public: - uhd_device(size_t tx_sps, size_t rx_sps, - size_t chans, bool diversity, double offset); + uhd_device(size_t tx_sps, size_t rx_sps, InterfaceType type, + size_t chans, double offset); ~uhd_device(); int open(const std::string &args, bool extref, bool swap_channels); @@ -264,8 +268,8 @@ public: bool setTxFreq(double wFreq, size_t chan); bool setRxFreq(double wFreq, size_t chan); - inline TIMESTAMP initialWriteTimestamp(); - inline TIMESTAMP initialReadTimestamp(); + TIMESTAMP initialWriteTimestamp(); + TIMESTAMP initialReadTimestamp(); double fullScaleInputValue(); double fullScaleOutputValue(); @@ -328,7 +332,7 @@ private: std::vector rx_buffers; void init_gains(); - double get_dev_offset(bool edge, bool diversity); + double get_dev_offset(); int set_master_clk(double rate); int set_rates(double tx_rate, double rx_rate); bool parse_dev_type(); @@ -342,7 +346,7 @@ private: bool set_freq(double freq, size_t chan, bool tx); Thread *async_event_thrd; - bool diversity; + InterfaceType iface; Mutex tune_lock; }; @@ -387,7 +391,7 @@ static void thread_enable_cancel(bool cancel) } uhd_device::uhd_device(size_t tx_sps, size_t rx_sps, - size_t chans, bool diversity, double offset) + InterfaceType iface, size_t chans, double offset) : tx_gain_min(0.0), tx_gain_max(0.0), rx_gain_min(0.0), rx_gain_max(0.0), tx_spp(0), rx_spp(0), @@ -398,7 +402,7 @@ uhd_device::uhd_device(size_t tx_sps, size_t rx_sps, this->rx_sps = rx_sps; this->chans = chans; this->offset = offset; - this->diversity = diversity; + this->iface = iface; } uhd_device::~uhd_device() @@ -457,7 +461,7 @@ void uhd_device::init_gains() } -double uhd_device::get_dev_offset(bool edge, bool diversity) +double uhd_device::get_dev_offset() { struct uhd_dev_offset *offset = NULL; @@ -467,21 +471,10 @@ double uhd_device::get_dev_offset(bool edge, bool diversity) return 0.0; } - if (edge && diversity) { - LOG(ERR) << "Unsupported configuration"; - return 0.0; - } - - if (edge && (dev_type != B200) && - (dev_type != B210) && (dev_type != UMTRX)) { - LOG(ALERT) << "EDGE is supported on B200/B210 and UmTRX only"; - return 0.0; - } - /* Special cases (e.g. diversity receiver) */ - if (diversity) { - if (dev_type != UMTRX) { - LOG(ALERT) << "Diversity on UmTRX only"; + if (iface == DIVERSITY) { + if ((dev_type != UMTRX) || (rx_sps != 1)) { + LOG(ALERT) << "Unsupported device configuration"; return 0.0; } @@ -789,8 +782,11 @@ int uhd_device::open(const std::string &args, bool extref, bool swap_channels) usrp_dev->set_clock_source("external"); // Set rates - double _tx_rate = select_rate(dev_type, tx_sps); - double _rx_rate = select_rate(dev_type, rx_sps, diversity); + double _rx_rate = select_rate(dev_type, rx_sps, iface); + double _tx_rate = select_rate(dev_type, tx_sps, iface); + + if (iface == DIVERSITY) + _rx_rate = select_rate(dev_type, 1, iface); if ((_tx_rate < 0.0) || (_rx_rate < 0.0)) return -1; @@ -802,7 +798,7 @@ int uhd_device::open(const std::string &args, bool extref, bool swap_channels) // Setting LMS6002D LPF to 500kHz gives us the best signal quality for (size_t i = 0; i < chans; i++) { usrp_dev->set_tx_bandwidth(500*1000*2, i); - if (!diversity) + if (iface != DIVERSITY) usrp_dev->set_rx_bandwidth(500*1000*2, i); } } @@ -827,11 +823,7 @@ int uhd_device::open(const std::string &args, bool extref, bool swap_channels) // Set receive chain sample offset. Trigger the EDGE offset // table by checking for 4 SPS on the receive path. No other // configuration supports using 4 SPS. - bool edge = false; - if (rx_sps == 4) - edge = true; - - double offset = get_dev_offset(edge, diversity); + double offset = get_dev_offset(); if (offset == 0.0) { LOG(ERR) << "Unsupported configuration, no correction applied"; ts_offset = 0; @@ -845,7 +837,7 @@ int uhd_device::open(const std::string &args, bool extref, bool swap_channels) // Print configuration LOG(INFO) << "\n" << usrp_dev->get_pp_string(); - if (diversity) + if (iface == DIVERSITY) return DIVERSITY; switch (dev_type) { @@ -1580,7 +1572,7 @@ std::string smpl_buf::str_code(ssize_t code) } RadioDevice *RadioDevice::make(size_t tx_sps, size_t rx_sps, - size_t chans, bool diversity, double offset) + InterfaceType iface, size_t chans, double offset) { - return new uhd_device(tx_sps, rx_sps, chans, diversity, offset); + return new uhd_device(tx_sps, rx_sps, iface, chans, offset); } diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp index 241e69c..9dcda5f 100644 --- a/Transceiver52M/osmo-trx.cpp +++ b/Transceiver52M/osmo-trx.cpp @@ -437,6 +437,7 @@ int main(int argc, char *argv[]) RadioDevice *usrp; RadioInterface *radio = NULL; Transceiver *trx = NULL; + RadioDevice::InterfaceType iface = RadioDevice::NORMAL; struct trx_config config; handle_options(argc, argv, &config); @@ -454,8 +455,8 @@ int main(int argc, char *argv[]) srandom(time(NULL)); /* Create the low level device object */ - usrp = RadioDevice::make(config.tx_sps, config.rx_sps, config.chans, - config.diversity, config.offset); + usrp = RadioDevice::make(config.tx_sps, config.rx_sps, iface, + config.chans, config.offset); type = usrp->open(config.dev_args, config.extref, config.swap_channels); if (type < 0) { LOG(ALERT) << "Failed to create radio device" << std::endl; diff --git a/Transceiver52M/radioDevice.h b/Transceiver52M/radioDevice.h index 6d7ea72..a992483 100644 --- a/Transceiver52M/radioDevice.h +++ b/Transceiver52M/radioDevice.h @@ -35,10 +35,15 @@ class RadioDevice { enum TxWindowType { TX_WINDOW_USRP1, TX_WINDOW_FIXED }; /* Radio interface types */ - enum RadioInterfaceType { NORMAL, RESAMP_64M, RESAMP_100M, DIVERSITY }; - - static RadioDevice *make(size_t tx_sps, size_t rx_sps = 1, size_t chans = 1, - bool diversity = false, double offset = 0.0); + enum InterfaceType { + NORMAL, + RESAMP_64M, + RESAMP_100M, + DIVERSITY, + }; + + static RadioDevice *make(size_t tx_sps, size_t rx_sps, InterfaceType type, + size_t chans = 1, double offset = 0.0); /** Initialize the USRP */ virtual int open(const std::string &args = "", bool extref = false, bool swap_channels = false)=0; -- cgit v1.2.3