/* * (C) 2013 by Andreas Eversberg * (C) 2015-2017 by Harald Welte * * 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 . * */ #include #include #include #include #include #include #include #include #include #include #include /* obtain a to-be-transmitted FCCH (frequency correction channel) burst */ int tx_fcch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan, uint8_t bid, struct trx_dl_burst_req *br) { LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting FCCH\n"); /* A frequency correction burst is basically a sequence of zeros. * Since br->burst is already zero-initialized, just set the length. */ br->burst_len = GSM_BURST_LEN; return 0; } /* obtain a to-be-transmitted SCH (synchronization channel) burst */ int tx_sch_fn(struct l1sched_trx *l1t, enum trx_chan_type chan, uint8_t bid, struct trx_dl_burst_req *br) { ubit_t burst[78]; uint8_t sb_info[4]; struct gsm_time t; uint8_t t3p, bsic; LOGL1S(DL1P, LOGL_DEBUG, l1t, br->tn, chan, br->fn, "Transmitting SCH\n"); /* BURST BYPASS */ /* create SB info from GSM time and BSIC */ gsm_fn2gsmtime(&t, br->fn); t3p = t.t3 / 10; bsic = l1t->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_sch_train, 64); memcpy(br->burst + 106, burst + 39, 39); br->burst_len = GSM_BURST_LEN; return 0; }