From f7af19661a43457fc6489391ecc70aab238abcb4 Mon Sep 17 00:00:00 2001 From: Harald Welte Date: Fri, 9 Apr 2010 19:56:12 +0200 Subject: layer1: reorganize code, introduce prim_{pm,rach}.c The new plan for layer1 is to structure the source code not based on whether it is part of l1s/l1a or other parts, but based on 'primitives'. All code that relates to transmitting a RACH burst should be in one file, same for all code related to power management. Those files are called layer1/prim_*.c --- src/target/firmware/layer1/prim_rach.c | 109 +++++++++++++++++++++++++++++++++ 1 file changed, 109 insertions(+) create mode 100644 src/target/firmware/layer1/prim_rach.c (limited to 'src/target/firmware/layer1/prim_rach.c') diff --git a/src/target/firmware/layer1/prim_rach.c b/src/target/firmware/layer1/prim_rach.c new file mode 100644 index 00000000..886d70a3 --- /dev/null +++ b/src/target/firmware/layer1/prim_rach.c @@ -0,0 +1,109 @@ +/* Layer 1 Random Access Channel Burst */ + +/* (C) 2010 by Dieter Spaar + * (C) 2010 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 General Public License as published by + * the Free Software Foundation; either version 2 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 General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + * + */ + +#include +#include +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +#include + + +/* p1: type of operation (0: one NB, 1: one RACH burst, 2: four NB */ +static int l1s_tx_rach_cmd(__unused uint8_t p1, __unused uint8_t p2, __unused uint16_t p3) +{ + int i; + uint16_t *info_ptr; + uint8_t data[2]; + + putchart('T'); + + l1s_tx_apc_helper(); + + data[0] = l1s.serving_cell.bsic << 2; + data[1] = l1s.rach.ra; + + info_ptr = &dsp_api.ndb->d_rach; + info_ptr[0] = ((uint16_t)(data[0])) | ((uint16_t)(data[1])<<8); + + dsp_api.db_w->d_task_ra = RACH_DSP_TASK; + dsp_end_scenario(); + + l1s_tx_win_ctrl(l1s.serving_cell.arfcn, L1_TXWIN_AB, 0); + tpu_end_scenario(); + + return 0; +} + +/* p1: type of operation (0: one NB, 1: one RACH burst, 2: four NB */ +static int l1s_tx_rach_resp(__unused uint8_t p1, __unused uint8_t burst_id, + __unused uint16_t p3) +{ + putchart('t'); + + dsp_api.r_page_used = 1; + + return 0; +} + +/* sched sets for uplink */ +const struct tdma_sched_item rach_sched_set_ul[] = { + SCHED_ITEM(l1s_tx_rach_cmd, 1, 0), SCHED_END_FRAME(), + SCHED_END_FRAME(), + SCHED_ITEM(l1s_tx_rach_resp, 1, 0), SCHED_END_FRAME(), + SCHED_END_SET() +}; + +/* request a RACH request at the next multiframe T3 = fn51 */ +void l1a_rach_req(uint8_t fn51, uint8_t ra) +{ + uint32_t fn_sched; + + l1a_lock_sync(); + l1s.rach.ra = ra; + /* TODO: can we wrap here? I don't think so */ + fn_sched = l1s.current_time.fn - l1s.current_time.t3; + fn_sched += fn51; + sched_gsmtime(rach_sched_set_ul, fn_sched, 0); + l1a_unlock_sync(); +} -- cgit v1.2.3