aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/osmo-trx.cpp
diff options
context:
space:
mode:
authorTom Tsou <tom.tsou@ettus.com>2016-06-24 14:25:39 -0700
committerTom Tsou <tom.tsou@ettus.com>2016-07-01 03:14:15 -0700
commit76764278169d252980853251daeb9f1ba0c246e1 (patch)
tree0d1631e938ae48d72d0b2b5d5e102116ab2d5b9d /Transceiver52M/osmo-trx.cpp
parent35222296fef378977a83a4ee89d8c3ef9bc62a3f (diff)
mcbts: Add multi-ARFCN radio support
Add new radio interface "radioInterfaceMulti" for multi-carrier support. Only USRP B200/B210 devices are supported because of sample rate requirements (3.2 Msps). Only 4 SPS operation Tx/RX is supported. 8-PSK is supported. Other options may be added at a later time Signed-off-by: Tom Tsou <tom.tsou@ettus.com>
Diffstat (limited to 'Transceiver52M/osmo-trx.cpp')
-rw-r--r--Transceiver52M/osmo-trx.cpp45
1 files changed, 38 insertions, 7 deletions
diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp
index 9dcda5f..ac9cc48 100644
--- a/Transceiver52M/osmo-trx.cpp
+++ b/Transceiver52M/osmo-trx.cpp
@@ -74,6 +74,7 @@ struct trx_config {
bool extref;
Transceiver::FillerType filler;
bool diversity;
+ bool mcbts;
double offset;
double rssi_offset;
bool swap_channels;
@@ -127,7 +128,7 @@ bool testConfig()
*/
bool trx_setup_config(struct trx_config *config)
{
- std::string refstr, fillstr, divstr, edgestr;
+ std::string refstr, fillstr, divstr, mcstr, edgestr;
if (!testConfig())
return false;
@@ -163,13 +164,29 @@ bool trx_setup_config(struct trx_config *config)
config->diversity = DEFAULT_DIVERSITY;
}
- /* Diversity only supported on 2 channels */
- if (config->diversity)
+ if (!config->chans)
+ config->chans = DEFAULT_CHANS;
+
+ if (config->mcbts && ((config->chans < 0) || (config->chans > 5))) {
+ std::cout << "Unsupported number of channels" << std::endl;
+ return false;
+ }
+
+ /* Diversity only supported on 2 channels without multi-carrier */
+ if (config->diversity && config->mcbts) {
+ std::cout << "Multi-carrier diversity unsupported" << std::endl;
+ return false;
+ }
+ if (config->diversity && (config->chans != 2)) {
+ std::cout << "Setting channels to 2 for diversity" << std::endl;
config->chans = 2;
+ }
edgestr = config->edge ? "Enabled" : "Disabled";
refstr = config->extref ? "Enabled" : "Disabled";
divstr = config->diversity ? "Enabled" : "Disabled";
+ mcstr = config->mcbts ? "Enabled" : "Disabled";
+
switch (config->filler) {
case Transceiver::FILLER_DUMMY:
fillstr = "Dummy bursts";
@@ -200,6 +217,7 @@ bool trx_setup_config(struct trx_config *config)
ost << " EDGE support............ " << edgestr << std::endl;
ost << " External Reference...... " << refstr << std::endl;
ost << " C0 Filler Table......... " << fillstr << std::endl;
+ ost << " Multi-Carrier........... " << mcstr << std::endl;
ost << " Diversity............... " << divstr << std::endl;
ost << " Tuning offset........... " << config->offset << std::endl;
ost << " RSSI to dBm offset...... " << config->rssi_offset << std::endl;
@@ -235,6 +253,10 @@ RadioInterface *makeRadioInterface(struct trx_config *config,
radio = new RadioInterfaceDiversity(usrp, config->tx_sps,
config->chans);
break;
+ case RadioDevice::MULTI_ARFCN:
+ radio = new RadioInterfaceMulti(usrp, config->tx_sps,
+ config->rx_sps, config->chans);
+ break;
default:
LOG(ALERT) << "Unsupported radio interface configuration";
return NULL;
@@ -309,6 +331,7 @@ static void print_help()
" -p Base port number\n"
" -e Enable EDGE receiver\n"
" -d Enable dual channel diversity receiver\n"
+ " -m Enable multi-ARFCN transceiver (default=disabled)\n"
" -x Enable external 10 MHz reference\n"
" -s Tx samples-per-symbol (1 or 4)\n"
" -b Rx samples-per-symbol (1 or 4)\n"
@@ -334,13 +357,14 @@ static void handle_options(int argc, char **argv, struct trx_config *config)
config->rach_delay = 0;
config->extref = false;
config->filler = Transceiver::FILLER_ZERO;
+ config->mcbts = false;
config->diversity = false;
config->offset = 0.0;
config->rssi_offset = 0.0;
config->swap_channels = false;
config->edge = false;
- while ((option = getopt(argc, argv, "ha:l:i:p:c:dxfo:s:b:r:A:R:Se")) != -1) {
+ while ((option = getopt(argc, argv, "ha:l:i:p:c:dmxfo:s:b:r:A:R:Se")) != -1) {
switch (option) {
case 'h':
print_help();
@@ -361,6 +385,9 @@ static void handle_options(int argc, char **argv, struct trx_config *config)
case 'c':
config->chans = atoi(optarg);
break;
+ case 'm':
+ config->mcbts = true;
+ break;
case 'd':
config->diversity = true;
break;
@@ -403,8 +430,8 @@ static void handle_options(int argc, char **argv, struct trx_config *config)
}
}
- /* Force 4 SPS for EDGE configurations */
- if (config->edge) {
+ /* Force 4 SPS for EDGE or multi-ARFCN configurations */
+ if ((config->edge) || (config->mcbts)) {
config->tx_sps = 4;
config->rx_sps = 4;
}
@@ -412,7 +439,8 @@ static void handle_options(int argc, char **argv, struct trx_config *config)
if (config->edge && (config->filler == Transceiver::FILLER_NORM_RAND))
config->filler = Transceiver::FILLER_EDGE_RAND;
- if ((config->tx_sps != 1) && (config->tx_sps != 4)) {
+ if ((config->tx_sps != 1) && (config->tx_sps != 4) &&
+ (config->rx_sps != 1) && (config->rx_sps != 4)) {
printf("Unsupported samples-per-symbol %i\n\n", config->tx_sps);
print_help();
exit(0);
@@ -455,6 +483,9 @@ int main(int argc, char *argv[])
srandom(time(NULL));
/* Create the low level device object */
+ if (config.mcbts)
+ iface = RadioDevice::MULTI_ARFCN;
+
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);