osmo-bts/src/osmo-bts-trx/sched_lchan_fcch_sch.c

90 lines
2.4 KiB
C

/*
* (C) 2013 by Andreas Eversberg <jolly@eversberg.eu>
* (C) 2015-2017 by Harald Welte <laforge@gnumonks.org>
* Contributions by sysmocom - s.f.m.c. GmbH
*
* All Rights Reserved
*
* 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
* the Free Software Foundation; either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*
*/
#include <stdint.h>
#include <errno.h>
#include <osmocom/core/bits.h>
#include <osmocom/core/utils.h>
#include <osmocom/coding/gsm0503_coding.h>
#include <osmo-bts/bts.h>
#include <osmo-bts/l1sap.h>
#include <osmo-bts/logging.h>
#include <osmo-bts/scheduler.h>
#include <osmo-bts/scheduler_backend.h>
#include <sched_utils.h>
/* obtain a to-be-transmitted FCCH (frequency correction channel) burst */
int tx_fcch_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br)
{
LOGL1SB(DL1P, LOGL_DEBUG, l1ts, br, "Transmitting FCCH\n");
/* A frequency correction burst is basically a sequence of zeros */
memset(br->burst, 0x00, GSM_BURST_LEN);
br->burst_len = GSM_BURST_LEN;
return 0;
}
/* obtain a to-be-transmitted SCH (synchronization channel) burst */
int tx_sch_fn(struct l1sched_ts *l1ts, struct trx_dl_burst_req *br)
{
ubit_t burst[78];
uint8_t sb_info[4];
struct gsm_time t;
uint8_t t3p, bsic;
LOGL1SB(DL1P, LOGL_DEBUG, l1ts, br, "Transmitting SCH\n");
/* BURST BYPASS */
/* create SB info from GSM time and BSIC */
gsm_fn2gsmtime(&t, br->fn);
t3p = t.t3 / 10;
bsic = l1ts->ts->trx->bts->bsic;
sb_info[0] =
((bsic & 0x3f) << 2) |
((t.t1 & 0x600) >> 9);
sb_info[1] =
((t.t1 & 0x1fe) >> 1);
sb_info[2] =
((t.t1 & 0x001) << 7) |
((t.t2 & 0x1f) << 2) |
((t3p & 0x6) >> 1);
sb_info[3] =
(t3p & 0x1);
/* encode bursts */
gsm0503_sch_encode(burst, sb_info);
/* compose burst */
memcpy(br->burst + 3, burst, 39);
memcpy(br->burst + 42, _sched_train_seq_gmsk_sb, 64);
memcpy(br->burst + 106, burst + 39, 39);
br->burst_len = GSM_BURST_LEN;
return 0;
}