diff --git a/CommonLibs/trx_vty.c b/CommonLibs/trx_vty.c index 45b58eb6..3b1b979e 100644 --- a/CommonLibs/trx_vty.c +++ b/CommonLibs/trx_vty.c @@ -304,6 +304,21 @@ DEFUN(cfg_egprs, cfg_egprs_cmd, return CMD_SUCCESS; } +DEFUN(cfg_ext_rach, cfg_ext_rach_cmd, + "ext-rach (disable|enable)", + "Enable extended (11-bit) RACH (default=disable)\n") +{ + struct trx_ctx *trx = trx_from_vty(vty); + + if (strcmp("disable", argv[0]) == 0) + trx->cfg.ext_rach = false; + + if (strcmp("enable", argv[0]) == 0) + trx->cfg.ext_rach = true; + + return CMD_SUCCESS; +} + DEFUN(cfg_rt_prio, cfg_rt_prio_cmd, "rt-prio <1-32>", "Set the SCHED_RR real-time priority\n" @@ -417,6 +432,7 @@ static int config_write_trx(struct vty *vty) vty_out(vty, " rssi-offset %f%s", trx->cfg.rssi_offset, VTY_NEWLINE); vty_out(vty, " swap-channels %s%s", trx->cfg.swap_channels ? "enable" : "disable", VTY_NEWLINE); vty_out(vty, " egprs %s%s", trx->cfg.egprs ? "enable" : "disable", VTY_NEWLINE); + vty_out(vty, " ext-rach %s%s", trx->cfg.ext_rach ? "enable" : "disable", VTY_NEWLINE); if (trx->cfg.sched_rr != 0) vty_out(vty, " rt-prio %u%s", trx->cfg.sched_rr, VTY_NEWLINE); @@ -454,6 +470,7 @@ static void trx_dump_vty(struct vty *vty, struct trx_ctx *trx) vty_out(vty, " RSSI to dBm offset: %f%s", trx->cfg.rssi_offset, VTY_NEWLINE); vty_out(vty, " Swap channels: %s%s", trx->cfg.swap_channels ? "Enabled" : "Disabled", VTY_NEWLINE); vty_out(vty, " EDGE support: %s%s", trx->cfg.egprs ? "Enabled" : "Disabled", VTY_NEWLINE); + vty_out(vty, " Extended RACH support: %s%s", trx->cfg.ext_rach ? "Enabled" : "Disabled", VTY_NEWLINE); vty_out(vty, " Real Time Priority: %u (%s)%s", trx->cfg.sched_rr, trx->cfg.sched_rr ? "Enabled" : "Disabled", VTY_NEWLINE); vty_out(vty, " Channels: %u%s", trx->cfg.num_chans, VTY_NEWLINE); @@ -564,6 +581,7 @@ int trx_vty_init(struct trx_ctx* trx) install_element(TRX_NODE, &cfg_rssi_offset_cmd); install_element(TRX_NODE, &cfg_swap_channels_cmd); install_element(TRX_NODE, &cfg_egprs_cmd); + install_element(TRX_NODE, &cfg_ext_rach_cmd); install_element(TRX_NODE, &cfg_rt_prio_cmd); install_element(TRX_NODE, &cfg_filler_cmd); diff --git a/CommonLibs/trx_vty.h b/CommonLibs/trx_vty.h index c9217224..8d251eef 100644 --- a/CommonLibs/trx_vty.h +++ b/CommonLibs/trx_vty.h @@ -57,6 +57,7 @@ struct trx_ctx { double offset; double rssi_offset; bool swap_channels; + bool ext_rach; bool egprs; unsigned int sched_rr; unsigned int num_chans; diff --git a/Transceiver52M/Transceiver.cpp b/Transceiver52M/Transceiver.cpp index df1c0bdf..cfb36c3f 100644 --- a/Transceiver52M/Transceiver.cpp +++ b/Transceiver52M/Transceiver.cpp @@ -159,7 +159,8 @@ Transceiver::~Transceiver() * are still expected to report clock indications through control channel * activity. */ -bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay, bool edge) +bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay, + bool edge, bool ext_rach) { int d_srcport, d_dstport, c_srcport, c_dstport; @@ -173,6 +174,7 @@ bool Transceiver::init(FillerType filler, size_t rtsc, unsigned rach_delay, bool return false; } + mExtRACH = ext_rach; mEdge = edge; mDataSockets.resize(mChans); @@ -497,16 +499,16 @@ CorrType Transceiver::expectedCorrType(GSM::Time currTime, break; case IV: case VI: - return RACH; + return mExtRACH ? EXT_RACH : RACH; break; case V: { int mod51 = burstFN % 51; if ((mod51 <= 36) && (mod51 >= 14)) - return RACH; + return mExtRACH ? EXT_RACH : RACH; else if ((mod51 == 4) || (mod51 == 5)) - return RACH; + return mExtRACH ? EXT_RACH : RACH; else if ((mod51 == 45) || (mod51 == 46)) - return RACH; + return mExtRACH ? EXT_RACH : RACH; else if (mHandover[burstTN][sdcch4_subslot[burstFN % 102]]) return RACH; else @@ -524,7 +526,7 @@ CorrType Transceiver::expectedCorrType(GSM::Time currTime, case XIII: { int mod52 = burstFN % 52; if ((mod52 == 12) || (mod52 == 38)) - return RACH; + return mExtRACH ? EXT_RACH : RACH; else if ((mod52 == 25) || (mod52 == 51)) return IDLE; else @@ -635,9 +637,11 @@ SoftVector *Transceiver::pullRadioVector(GSM::Time &wTime, double &RSSI, bool &i noise = 20.0 * log10(rxFullScale / state->mNoiseLev); } + unsigned max_toa = (type == RACH || type == EXT_RACH) ? + mMaxExpectedDelayAB : mMaxExpectedDelayNB; + /* Detect normal or RACH bursts */ - rc = detectAnyBurst(*burst, mTSC, BURST_THRESH, mSPSRx, type, amp, toa, - (type==RACH)?mMaxExpectedDelayAB:mMaxExpectedDelayNB); + rc = detectAnyBurst(*burst, mTSC, BURST_THRESH, mSPSRx, type, amp, toa, max_toa); if (rc > 0) { type = (CorrType) rc; diff --git a/Transceiver52M/Transceiver.h b/Transceiver52M/Transceiver.h index e250adc2..432e3b49 100644 --- a/Transceiver52M/Transceiver.h +++ b/Transceiver52M/Transceiver.h @@ -114,7 +114,8 @@ public: ~Transceiver(); /** Start the control loop */ - bool init(FillerType filler, size_t rtsc, unsigned rach_delay, bool edge); + bool init(FillerType filler, size_t rtsc, unsigned rach_delay, + bool edge, bool ext_rach); /** attach the radioInterface receive FIFO */ bool receiveFIFO(VectorFIFO *wFIFO, size_t chan) @@ -210,6 +211,7 @@ private: int mSPSRx; ///< number of samples per Rx symbol size_t mChans; + bool mExtRACH; bool mEdge; bool mOn; ///< flag to indicate that transceiver is powered on bool mForceClockInterface; ///< flag to indicate whether IND CLOCK shall be sent unconditionally after transceiver is started diff --git a/Transceiver52M/osmo-trx.cpp b/Transceiver52M/osmo-trx.cpp index 0e63020d..1f35cd8c 100644 --- a/Transceiver52M/osmo-trx.cpp +++ b/Transceiver52M/osmo-trx.cpp @@ -144,7 +144,7 @@ int makeTransceiver(struct trx_ctx *trx, RadioInterface *radio) trx->cfg.rx_sps, trx->cfg.num_chans, GSM::Time(3,0), radio, trx->cfg.rssi_offset); if (!transceiver->init(trx->cfg.filler, trx->cfg.rtsc, - trx->cfg.rach_delay, trx->cfg.egprs)) { + trx->cfg.rach_delay, trx->cfg.egprs, trx->cfg.ext_rach)) { LOG(ALERT) << "Failed to initialize transceiver"; return -1; } @@ -408,6 +408,7 @@ static void print_config(struct trx_ctx *trx) ost << " Tx Samples-per-Symbol... " << trx->cfg.tx_sps << std::endl; ost << " Rx Samples-per-Symbol... " << trx->cfg.rx_sps << std::endl; ost << " EDGE support............ " << trx->cfg.egprs << std::endl; + ost << " Extended RACH support... " << trx->cfg.ext_rach << std::endl; ost << " Reference............... " << trx->cfg.clock_ref << std::endl; ost << " C0 Filler Table......... " << trx->cfg.filler << std::endl; ost << " Multi-Carrier........... " << trx->cfg.multi_arfcn << std::endl;