aboutsummaryrefslogtreecommitdiffstats
path: root/src/osmo-bts-trx/loops.c
diff options
context:
space:
mode:
authorHarald Welte <laforge@gnumonks.org>2018-02-19 14:21:36 +0100
committerHarald Welte <laforge@gnumonks.org>2018-02-27 19:58:20 +0100
commitd5bbd8ccf79eaf13bc23cc71accbeb3ff638b6dd (patch)
tree0f1ec34ad152ac9e7933724b35a8d342e8be2abe /src/osmo-bts-trx/loops.c
parentb3a2a3e24f44adcc6660d33cc9684a8f24271e2e (diff)
trx/scheduler: Use integer math for TOA (Timing of Arrival)
There's no need to express TOA as a float: * We receive it as signed 16bit integer in units 1/256 symbol periods * We pass it to L1SAP as signed integer in 1/4 symbol periods So turn it into an int16_t with 1/256 symbol period accuracy throughout the code to avoid both float arithmetic as well as loosing any precision. Change-Id: Idce4178e0b1f7e940ebc22b3e2f340fcd544d4ec
Diffstat (limited to 'src/osmo-bts-trx/loops.c')
-rw-r--r--src/osmo-bts-trx/loops.c31
1 files changed, 17 insertions, 14 deletions
diff --git a/src/osmo-bts-trx/loops.c b/src/osmo-bts-trx/loops.c
index 6f87cd1f..a959a71e 100644
--- a/src/osmo-bts-trx/loops.c
+++ b/src/osmo-bts-trx/loops.c
@@ -166,12 +166,15 @@ static int ms_power_clock(struct gsm_lchan *lchan,
}
+/* 90% of one bit duration in 1/256 symbols: 256*0.9 */
+#define TOA256_9OPERCENT 230
+
/*
* Timing Advance loop
*/
int ta_val(struct gsm_lchan *lchan, uint8_t chan_nr,
- struct l1sched_chan_state *chan_state, float toa)
+ struct l1sched_chan_state *chan_state, int16_t toa256)
{
struct gsm_bts_trx *trx = lchan->ts->trx;
@@ -180,39 +183,39 @@ int ta_val(struct gsm_lchan *lchan, uint8_t chan_nr,
return 0;
/* sum measurement */
- chan_state->meas.toa_sum += toa;
+ chan_state->meas.toa256_sum += toa256;
if (++(chan_state->meas.toa_num) < 16)
return 0;
/* complete set */
- toa = chan_state->meas.toa_sum / chan_state->meas.toa_num;
+ toa256 = chan_state->meas.toa256_sum / chan_state->meas.toa_num;
/* check for change of TOA */
- if (toa < -0.9F && lchan->rqd_ta > 0) {
+ if (toa256 < -TOA256_9OPERCENT && lchan->rqd_ta > 0) {
LOGP(DLOOP, LOGL_INFO, "TOA of trx=%u chan_nr=0x%02x is too "
- "early (%.2f), now lowering TA from %d to %d\n",
- trx->nr, chan_nr, toa, lchan->rqd_ta,
+ "early (%d), now lowering TA from %d to %d\n",
+ trx->nr, chan_nr, toa256, lchan->rqd_ta,
lchan->rqd_ta - 1);
lchan->rqd_ta--;
- } else if (toa > 0.9F && lchan->rqd_ta < 63) {
+ } else if (toa256 > TOA256_9OPERCENT && lchan->rqd_ta < 63) {
LOGP(DLOOP, LOGL_INFO, "TOA of trx=%u chan_nr=0x%02x is too "
- "late (%.2f), now raising TA from %d to %d\n",
- trx->nr, chan_nr, toa, lchan->rqd_ta,
+ "late (%d), now raising TA from %d to %d\n",
+ trx->nr, chan_nr, toa256, lchan->rqd_ta,
lchan->rqd_ta + 1);
lchan->rqd_ta++;
} else
LOGP(DLOOP, LOGL_INFO, "TOA of trx=%u chan_nr=0x%02x is "
- "correct (%.2f), keeping current TA of %d\n",
- trx->nr, chan_nr, toa, lchan->rqd_ta);
+ "correct (%d), keeping current TA of %d\n",
+ trx->nr, chan_nr, toa256, lchan->rqd_ta);
chan_state->meas.toa_num = 0;
- chan_state->meas.toa_sum = 0;
+ chan_state->meas.toa256_sum = 0;
return 0;
}
int trx_loop_sacch_input(struct l1sched_trx *l1t, uint8_t chan_nr,
- struct l1sched_chan_state *chan_state, int8_t rssi, float toa)
+ struct l1sched_chan_state *chan_state, int8_t rssi, int16_t toa256)
{
struct gsm_lchan *lchan = &l1t->trx->ts[L1SAP_CHAN2TS(chan_nr)]
.lchan[l1sap_chan2ss(chan_nr)];
@@ -222,7 +225,7 @@ int trx_loop_sacch_input(struct l1sched_trx *l1t, uint8_t chan_nr,
ms_power_val(chan_state, rssi);
if (pinst->phy_link->u.osmotrx.trx_ta_loop)
- ta_val(lchan, chan_nr, chan_state, toa);
+ ta_val(lchan, chan_nr, chan_state, toa256);
return 0;
}