FreeCalypso > hg > fc-magnetite
diff src/g23m-fad/ra/ra_rlp.c @ 174:90eb61ecd093
src/g23m-fad: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Wed, 12 Oct 2016 05:40:46 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-fad/ra/ra_rlp.c Wed Oct 12 05:40:46 2016 +0000 @@ -0,0 +1,429 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-F&D (8411) +| Modul : RA_RLP ++----------------------------------------------------------------------------- +| Copyright 2002 Texas Instruments Berlin, AG +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Berlin, AG +| The receipt of or possession of this file does not convey +| any rights to reproduce or disclose its contents or to +| manufacture, use, or sell anything it may describe, in +| whole, or in part, without the specific written consent of +| Texas Instruments Berlin, AG. ++----------------------------------------------------------------------------- +| Purpose : This Modul defines the functions for the non-transparent +| data model (RLP) for the component RA of the mobile +| station ++----------------------------------------------------------------------------- +*/ + +#ifndef RA_RLP_C +#define RA_RLP_C +#endif + +#define ENTITY_RA + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include "typedefs.h" +#include "vsi.h" +#include "macdef.h" +#include "pconst.cdg" +#include "custom.h" +#include "gsm.h" +#include "cnf_ra.h" +#include "prim.h" +#include "pei.h" +#include "tok.h" +#include "ccdapi.h" +#include "ra.h" + +/*==== CONST ======================================================*/ +/*==== TYPES ======================================================*/ +/*==== VARIABLES ==================================================*/ +/*==== FUNCTIONS ==================================================*/ + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RA_RLP | +| STATE : code ROUTINE : rlp_init | ++--------------------------------------------------------------------+ + + PURPOSE : + +*/ + +GLOBAL void rlp_init(void) +{ + TRACE_FUNCTION("rlp_init()"); + + memset(ra_data->rlp, 0, sizeof(T_RLP)); + hCommRLP = vsi_c_open ( VSI_CALLER RLP_NAME ); + hCommMMI = vsi_c_open ( VSI_CALLER ACI_NAME ); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RA_RLP | +| STATE : code ROUTINE : rlp_idle | ++--------------------------------------------------------------------+ + + PURPOSE : IDLE processing fpr uplink and downlink non-transparent mode +*/ + +GLOBAL void rlp_idle(void) +{ + TRACE_FUNCTION("rlp_idle()"); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RA_RLP | +| STATE : code ROUTINE : rlp_ul_null | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void rlp_ul_null(void) +{ + T_RLP *drlp = ra_data->rlp; + UBYTE i; + + TRACE_FUNCTION("rlp_ul_null()"); + + if (ra_data->activated) + { +#ifdef TRACE_RA_RLP + drlp->fcs_error = 0L; +#endif + /* + * setup the communication parameters + */ + shm_set_dsp_value (conf_b_itc, V_ITC_DATA); + shm_set_dsp_value (conf_b_ce, V_CE_NON_TRANSP); + + switch (ra_data->tra_rate) + { + case TRA_FULLRATE_14400: + shm_set_dsp_value (conf_b_ur, V_UR_14400); + shm_set_dsp_value (conf_b_ct, V_CT_FR); + break; + + case TRA_FULLRATE_9600: + shm_set_dsp_value (conf_b_ur, V_UR_9600); + shm_set_dsp_value (conf_b_ct, V_CT_FR); + break; + + case TRA_FULLRATE_4800: + shm_set_dsp_value (conf_b_ur, V_UR_4800); + shm_set_dsp_value (conf_b_ct, V_CT_FR); + break; + + case TRA_HALFRATE_4800: + shm_set_dsp_value (conf_b_ur, V_UR_4800); + shm_set_dsp_value (conf_b_ct, V_CT_HR); + break; + + default: + break; + } + + shm_set_dsp_value (ntu_M1, 0); + shm_set_dsp_value (ntu_M2, 0); + shm_set_dsp_value (ntu_empty, 1); + shm_set_dsp_value (ntu_byte_cnt, 2); + + /* + * initialize the non-transparent mode data + */ + drlp->ul_data_pending = FALSE; + drlp->m1 = 0; + + ra_data->ra_data_ind.fr_type = FR_RLP; + ra_data->ra_data_ind.sdu.o_buf = 0; + ra_data->ra_data_ind.sdu.l_buf = 0; + + ra_data->ra_ready_ind[0].req_frames = 1; + + cl_ribu_init(&drlp->ulq, RLP_UL_QSIZE); + + for (i = 0; i < drlp->ulq.depth; i++) + { + cl_set_frame_desc_0(&drlp->ul_frame_desc[i], NULL, 0); + } + + cl_set_frame_desc_0(&ra_data->rlp->dl_frame_desc, NULL, 0); + shm_set_dsp_value (act_b_init, 1); + + INIT_STATE (KER, RLP_INIT_L1); + +#ifdef HO_WORKAROUND /* rlp_ul_null */ + _act_d_ra_conf = *ra_data->shm.shm_addr[d_ra_conf]; + TRACE_EVENT("d_ra_conf saved"); +#endif + + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RA_RLP | +| STATE : code ROUTINE : rlp_ul_init_l1 | ++--------------------------------------------------------------------+ + + PURPOSE : + +*/ + +GLOBAL void rlp_ul_init_l1(void) +{ + TRACE_FUNCTION("rlp_ul_init_l1()"); + + if (shm_get_dsp_value (act_b_init) EQ 0) + { + /* + * initialisation finished -> enter the data transmission state + */ + l1i_ra_activate_cnf(); + SET_STATE (KER, RLP_DATA_TRANS); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RA_RLP | +| STATE : code ROUTINE : rlp_ul_data_trans | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void rlp_ul_data_trans(void) +{ + T_RLP *drlp = ra_data->rlp; + + TRACE_FUNCTION("rlp_ul_data_trans()"); + + if (drlp->ul_data_pending) /* a frame is ready to be sent */ + { + USHORT len = 0; + + switch (ra_data->tra_rate) + { + case TRA_FULLRATE_9600: + case TRA_HALFRATE_4800: + len = NT_DATA_SIZE; + drlp->ul_data_pending = FALSE; + break; + + case TRA_FULLRATE_4800: + /* S844: 1=1st half, 0=2nd half */ + if (shm_get_dsp_value (act_b_f48blk_ul) EQ 1) + { + TRACE_FUNCTION("send 4800 first half"); + len = NT_DATA_SIZE_4800_FR_A; + drlp->ul_48_first_half_sent = TRUE; + } + else + { + if (drlp->ul_48_first_half_sent) + { + TRACE_FUNCTION("send 4800 second half"); + len = NT_DATA_SIZE_4800_FR_B; + drlp->ul_data_pending = FALSE; + drlp->ul_frame_desc[drlp->ulq.ri].Adr[0] += NT_DATA_SIZE_4800_FR_A; + } + else + { + TRACE_FUNCTION("wait for 4800 first half"); + len = 0; + } + } + break; + + case TRA_FULLRATE_14400: + shm_set_dsp_value (ntu_M1, drlp->m1); + /* S844: 0 = first half, 1 = second half */ + if (drlp->m1 EQ 0) + { + len = NT_DATA_SIZE_14400_A; + drlp->m1 = 1; + } + else + { + len = NT_DATA_SIZE_14400_B; + drlp->ul_data_pending = FALSE; + drlp->ul_frame_desc[drlp->ulq.ri].Adr[0] += NT_DATA_SIZE_14400_A; + } + break; + } + if (len > 0) + { + shm_set_dsp_buffer(&drlp->ul_frame_desc[drlp->ulq.ri], + ra_data->shm.shm_addr[adr_ntu_data]+wof_ntu_data, 0, len); + shm_set_dsp_value (ntu_empty, 0); + shm_set_dsp_value (ntu_byte_cnt, (len+2)); + if (!drlp->ul_data_pending) + { + cl_ribu_read_index(&drlp->ulq); + /* PZ 22.7.99 */ + drlp->ul_data_pending = (drlp->ulq.ri NEQ drlp->ulq.wi); + /* PZ 22.7.99 */ + } + } + else + { + shm_set_dsp_value (ntu_M1, 0); + shm_set_dsp_value (ntu_empty, 1); + shm_set_dsp_value (ntu_byte_cnt, 2); + } + } + else + { + /* no frame is ready to be sent */ + shm_set_dsp_value (ntu_M1, 0); + shm_set_dsp_value (ntu_empty, 1); + shm_set_dsp_value (ntu_byte_cnt, 2); + } + + if (!drlp->ul_data_pending) + { + l1i_ra_ready_ind(hCommRLP, 0); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : RA_RLP | +| STATE : code ROUTINE : rlp_dl_data_trans | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ + +GLOBAL void rlp_dl_data_trans(void) +{ + BOOL frame_complete = FALSE; + + TRACE_FUNCTION("rlp_dl_data_trans()"); + +#ifdef HO_WORKAROUND /* rlp_dl_data_trans */ + if (*ra_data->shm.shm_addr[d_ra_conf] NEQ _act_d_ra_conf) + { + *ra_data->shm.shm_addr[d_ra_conf] = _act_d_ra_conf; /* rlp_dl_data_trans */ + TRACE_EVENT("HO_REFRESH rlp_dl_data_trans"); + } +#endif + + /* + * read out the received downlink data + */ + if (shm_get_dsp_value (ntd_byte_cnt) > 0) + { + USHORT len = 0; + + switch (ra_data->tra_rate) + { + case TRA_FULLRATE_9600: + case TRA_HALFRATE_4800: + if (shm_get_dsp_value (ntd_fcs_ok) EQ 0) + { + frame_complete = TRUE; + len = NT_DATA_SIZE; + +#ifdef _SIMULATION_ + cl_set_frame_desc_0(&ra_data->rlp->dl_frame_desc, ra_data->rlp->dl_buf, NT_DATA_SIZE); + ra_data->ra_data_ind.sdu.l_buf = NT_DATA_SIZE << 3; +#else + rlp_rbm_get_next_buffer(&ra_data->rlp->dl_frame_desc); +#endif + } + else + { +#ifdef TRACE_RA_RLP + TRACE_EVENT("FCS-Error"); + ra_data->rlp->fcs_error++; +#endif + frame_complete = FALSE; + len = 0; + } + break; + + case TRA_FULLRATE_4800: + /* S844: 0=1st half, 1=2nd half */ + if (shm_get_dsp_value (act_b_f48blk_dl) EQ 0) + { + len = NT_DATA_SIZE_4800_FR_A; + frame_complete = FALSE; +#ifdef _SIMULATION_ + cl_set_frame_desc_0(&ra_data->rlp->dl_frame_desc, ra_data->rlp->dl_buf, NT_DATA_SIZE_4800_FR_A+NT_DATA_SIZE_4800_FR_B); + ra_data->ra_data_ind.sdu.l_buf = (NT_DATA_SIZE_4800_FR_A+NT_DATA_SIZE_4800_FR_B) << 3; +#else + rlp_rbm_get_next_buffer(&ra_data->rlp->dl_frame_desc); +#endif + } + else if (shm_get_dsp_value (ntd_fcs_ok) EQ 0) + { + frame_complete = TRUE; + len = NT_DATA_SIZE_4800_FR_B; + ra_data->rlp->dl_frame_desc.Adr[0] += NT_DATA_SIZE_4800_FR_A; + } + else + { +#ifdef TRACE_RA_RLP + TRACE_EVENT("FCS-Error"); + ra_data->rlp->fcs_error++; +#endif + frame_complete = FALSE; + len = 0; + } + break; + + case TRA_FULLRATE_14400: + /* S844: 0 = first half, 1 = second half */ + if (shm_get_dsp_value (ntd_M1) EQ 0) + { + frame_complete = FALSE; + len = NT_DATA_SIZE_14400_A; +#ifdef _SIMULATION_ + cl_set_frame_desc_0(&ra_data->rlp->dl_frame_desc, ra_data->rlp->dl_buf, NT_DATA_SIZE_14400_A + NT_DATA_SIZE_14400_B); + ra_data->ra_data_ind.sdu.l_buf = (NT_DATA_SIZE_14400_A + NT_DATA_SIZE_14400_B) << 3; +#else + rlp_rbm_get_next_buffer(&ra_data->rlp->dl_frame_desc); +#endif + } + else if (shm_get_dsp_value (ntd_fcs_ok) EQ 0) + { + frame_complete = TRUE; + len = NT_DATA_SIZE_14400_B; + ra_data->rlp->dl_frame_desc.Adr[0] += NT_DATA_SIZE_14400_A; + } + else + { +#ifdef TRACE_RA_RLP + TRACE_EVENT("FCS-Error"); + ra_data->rlp->fcs_error++; +#endif + frame_complete = FALSE; + len = 0; + } + break; + } + if (len > 0) + { + shm_get_dsp_buffer(&ra_data->rlp->dl_frame_desc, ra_data->shm.shm_addr[adr_ntd_data]+wof_ntd_data, len); + shm_set_dsp_value (ntd_byte_cnt, 0); + + if (frame_complete) + { + l1i_ra_data_ind(hCommRLP); + } + } + } +} +