aboutsummaryrefslogtreecommitdiffstats
path: root/Transceiver52M/multiTRX.cpp
diff options
context:
space:
mode:
authorThomas Tsou <ttsou@vt.edu>2012-06-05 20:31:28 -0400
committerAlexander Chemeris <Alexander.Chemeris@gmail.com>2013-06-24 01:51:02 +0400
commit41c6657938e930a1c20070d5a8952e6dea12ec32 (patch)
tree37245a030b3e44e1e3d25086af9fa29b94f6054e /Transceiver52M/multiTRX.cpp
parentcd576c9636244938a42d8c69da012e45e9fdd4f5 (diff)
multi-arfcn: refactor to match upstream GSM core
This patch aligns the multicarrier (MC) USRP code with released GSM core changes that accommodate the MC RAD1. Primary changes are: 1. Runtime setting of number of channelizer paths 2. Matching channelizer path to ARFCN mapping of GSM core 3. Use a single clock update socket on the drive loop 4. Match transceiver data and control socket ports Setting of channelizer paths (or width) was previously fixed at compile time. In either case, channelizer width is limited by the sample rate of the device and channel spacing of the maximally decimated filterbank. Available settings are 1, 5, and 10 channels, which accommodate any number of ARFCN's in between. Also add the frequency offsets to handle the effective shift in setting RF frequency. Previous assumption was to place C0 at the center frequency, but RAD1 assumes C0 at the leftmost carrier, so adjust accordingly. The rest is general consolidation to mostly match the RAD1 interaction with GSM core. There is some loss of flexibility to run, say, multiple independent instances of OpenBTS through a single bank of channelized transceivers. But, the better compatibility and reduction in code is the appropriate tradeoff. Signed-off-by: Thomas Tsou <ttsou@vt.edu>
Diffstat (limited to 'Transceiver52M/multiTRX.cpp')
-rw-r--r--Transceiver52M/multiTRX.cpp69
1 files changed, 47 insertions, 22 deletions
diff --git a/Transceiver52M/multiTRX.cpp b/Transceiver52M/multiTRX.cpp
index 85d4046..04e2c95 100644
--- a/Transceiver52M/multiTRX.cpp
+++ b/Transceiver52M/multiTRX.cpp
@@ -32,6 +32,8 @@ ConfigurationTable gConfig("/etc/OpenBTS/OpenBTS.db");
volatile bool gbShutdown = false;
+int Transceiver::mTSC = 0;
+
static void sigHandler(int signum)
{
LOG(NOTICE) << "Received shutdown signal";
@@ -56,23 +58,23 @@ static int setupSignals()
}
/*
- * Generate the channel-transceiver ordering. Channel 0 is always centered
- * at the RF tuning frequecy. Fill remaining channels alternating left and
- * right moving out from the center channel.
+ * Generate the channel-transceiver ordering. Attempt to match the RAD1
+ * ordering where the active channels are centered in the overall device
+ * bandwidth. C0 is always has the lowest ARFCN with increasing subsequent
+ * channels. When an even number of channels is selected, the carriers will
+ * be offset from the RF center by -200 kHz, or half ARFCN spacing.
*/
-static void genChanMap(int *chans)
+static void genChanMap(int numARFCN, int chanM, int *chans)
{
int i, n;
- chans[0] = 0;
+ chans[0] = numARFCN / 2;
- for (i = 1, n = 1; i < CHAN_M; i++) {
- if (i % 2) {
- chans[i] = n;
- } else {
- chans[i] = CHAN_M - n;
- n++;
- }
+ for (i = 1, n = 1; i < numARFCN; i++) {
+ if (!chans[i - 1])
+ chans[i] = chanM - 1;
+ else
+ chans[i] = chans[i - 1] - 1;
}
}
@@ -80,44 +82,66 @@ static void createTrx(Transceiver **trx, int *map, int num,
RadioInterface *radio, DriveLoop *drive)
{
int i;
+ bool primary = true;
for (i = 0; i < num; i++) {
LOG(NOTICE) << "Creating TRX" << i
<< " attached on channel " << map[i];
radio->activateChan(map[i]);
- trx[i] = new Transceiver(5700 + i * 1000, "127.0.0.1",
- SAMPSPERSYM, radio, drive, map[i]);
+ trx[i] = new Transceiver(5700 + 2 * i, "127.0.0.1",
+ SAMPSPERSYM, radio, drive,
+ map[i], primary);
trx[i]->start();
+ primary = false;
}
}
int main(int argc, char *argv[])
{
- int i, numARFCN = 1;
- int chanMap[CHAN_M];
+ int i, chanM, numARFCN = 1;
+ int chanMap[CHAN_MAX];
RadioDevice *usrp;
RadioInterface* radio;
DriveLoop *drive;
- Transceiver *trx[CHAN_M];
+ Transceiver *trx[CHAN_MAX];
gLogInit("transceiver", gConfig.getStr("Log.Level").c_str(), LOG_LOCAL7);
if (argc > 1) {
numARFCN = atoi(argv[1]);
- if (numARFCN > CHAN_M) {
+ if (numARFCN > (CHAN_MAX - 1)) {
LOG(ALERT) << numARFCN << " channels not supported with current build";
exit(-1);
}
}
+ srandom(time(NULL));
+
if (setupSignals() < 0) {
LOG(ERR) << "Failed to setup signal handlers, exiting...";
exit(-1);
}
- srandom(time(NULL));
- genChanMap(chanMap);
+ /*
+ * Select the number of channels according to the number of ARFCNs's
+ * and generate ARFCN-to-channelizer path mappings. The channelizer
+ * aliases and extracts 'M' equally spaced channels to baseband. The
+ * number of ARFCN's must be less than the number of channels in the
+ * channelizer.
+ */
+ switch (numARFCN) {
+ case 1:
+ chanM = 1;
+ break;
+ case 2:
+ case 3:
+ chanM = 5;
+ break;
+ default:
+ chanM = 10;
+ }
+ genChanMap(numARFCN, chanM, chanMap);
usrp = RadioDevice::make(DEVICERATE);
if (!usrp->open()) {
@@ -125,8 +149,9 @@ int main(int argc, char *argv[])
return EXIT_FAILURE;
}
- radio = new RadioInterface(usrp, numARFCN, SAMPSPERSYM, 0, false);
- drive = new DriveLoop(SAMPSPERSYM, GSM::Time(3,0), radio);
+ radio = new RadioInterface(usrp, chanM, 3, SAMPSPERSYM, 0, false);
+ drive = new DriveLoop(5700, "127.0.0.1", chanM, chanMap[0],
+ SAMPSPERSYM, GSM::Time(3,0), radio);
/* Create, attach, and activate all transceivers */
createTrx(trx, chanMap, numARFCN, radio, drive);