FreeCalypso > hg > fc-magnetite
diff src/g23m-fad/fad/fad_rcvp.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/fad/fad_rcvp.c Wed Oct 12 05:40:46 2016 +0000 @@ -0,0 +1,479 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-F&D (8411) +| Modul : FAD_RCVP ++----------------------------------------------------------------------------- +| 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 processing +| of incomming primitives for the component +| Fax Adaptation 3.45 of the mobile station ++----------------------------------------------------------------------------- +*/ + +#ifndef FAD_RCVP_C +#define FAD_RCVP_C +#endif + +#define ENTITY_FAD + +/*==== INCLUDES ===================================================*/ + +#include <string.h> +#include "typedefs.h" +#include "vsi.h" +#include "macdef.h" +#include "pconst.cdg" +#include "custom.h" +#include "gsm.h" +#include "cnf_fad.h" +#include "mon_fad.h" +#include "prim.h" +#include "pei.h" +#include "tok.h" +#include "ccdapi.h" +#include "fad.h" + +/*==== CONST =======================================================*/ + +/*==== TYPES =======================================================*/ + +/*==== VAR EXPORT ==================================================*/ + +/*==== VAR LOCAL ===================================================*/ + +/*==== FUNCTIONS ===================================================*/ + +LOCAL void AlignByte(UBYTE *byte) +{ + const USHORT tbl[] = + { + 0x7E00, /* 01111110 00000000 */ + 0x00FC, /* 00000000 11111100 */ + 0x01F8, /* 00000001 11111000 */ + 0x03F0, /* 00000011 11110000 */ + 0x07E0, /* 00000111 11100000 */ + 0x0FC0, /* 00001111 11000000 */ + 0x1F80, /* 00011111 10000000 */ + 0x3F00, /* 00111111 00000000 */ + }; + UBYTE i; + + T_RCV *Rcv = &fad_data->rcv; + + if (Rcv->FlagFound EQ 0) /* initialization */ + Rcv->AlignWord = *byte; + + Rcv->AlignWord <<= 8; + Rcv->AlignWord += *byte; + if (Rcv->FlagFound < FLAGFOUND_MIN) + { + for (i = 0; i < 8; i++) + { + if (tbl[i] EQ (Rcv->AlignWord & tbl[i]) AND ((UBYTE)(Rcv->AlignWord >> i) EQ HDLC_FLAG)) + { + if (Rcv->AlignShift NEQ i) + { + Rcv->AlignShift = i; + Rcv->FlagFound = 0; + } + Rcv->FlagFound++; + break; + } + } + } + if (Rcv->FlagFound EQ FLAGFOUND_MIN) + *byte = (UBYTE)(Rcv->AlignWord >> Rcv->AlignShift); +} + +LOCAL void align_ra_data_ind(T_FD *pFD) +{ + USHORT i; + + for (i = 0; i < pFD->len >> 1; i++) + { + AlignByte(&pFD->buf[2*i+1]); + } +} + +#ifdef _TARGET_ +void switch_ra_detect_req(UBYTE detect) +{ + T_RA_DETECT_REQ ra_detect_req; + ra_detect_req.detect = detect; + l1i_ra_detect_req (&ra_detect_req); +} +#endif + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : FAD_RCVP | +| STATE : code ROUTINE : rcv_ra_data_ind | ++--------------------------------------------------------------------+ + + PURPOSE : Process primitive RA_DATA_IND received from RA. + +*/ + +GLOBAL void rcv_ra_data_ind (T_RA_DATA_IND *ra_data_ind) +{ + T_RCV *rcv = &fad_data->rcv; + UBYTE frame_type; + T_FD *pFD; + + TRACE_FUNCTION ("rcv_ra_data_ind()"); + + if (GET_STATE(KER) EQ KER_NULL) + return; + +#ifdef _SIMULATION_ + PACCESS(ra_data_ind); + + if (GET_STATE(KER) NEQ KER_NULL) + { + pFD = cl_ribu_get_new_frame_desc(fad_data->rbm.ribu); + pFD->type = ra_data_ind->fr_type; + pFD->len = ra_data_ind->sdu.l_buf >> 3; + memcpy(pFD->buf, ra_data_ind->sdu.buf, pFD->len); + } + + PFREE (ra_data_ind); +#endif + + if (fad_data->rbm.ribu->idx.filled > 1) + TRACE_EVENT_P3("rbm: filled=%d; wi=%d; ri=%d", fad_data->rbm.ribu->idx.filled, fad_data->rbm.ribu->idx.wi, fad_data->rbm.ribu->idx.ri); + + pFD = cl_ribu_get(fad_data->rbm.ribu); + + if (pFD->type EQ FR_STATUS) + { + +#if defined TRACE_FAD_DL_STATUS || defined _SIMULATION_ + { + char buf[14] = "RS:0x ->0x "; + BYTE2HEXSTR(*(pFD->buf+1), &buf[5]); + align_ra_data_ind(pFD); + BYTE2HEXSTR(*(pFD->buf+1), &buf[11]); + TRACE_EVENT(buf); + } +#else + align_ra_data_ind(pFD); +#endif + + } + + frame_type = rcv_FrameType(pFD); + + switch (GET_STATE (RCV)) + { + case SYNC_RCV: + switch (frame_type) + { + case FT_PREAMBLE: + rcv->bytes_expect = PREAMBLE_BYTES_TI_EXP; + rcv->bytes_expect -= pFD->len; + SET_STATE (RCV, PREAM_RCV); + if (!rcv->data_in_rbm) + { + sig_rcv_ker_preamble_ind(); +#ifdef _SIMULATION_ + TRACE_EVENT ("BCS-TRA:first PREAMBLE FLAG rcvd"); +#endif + } + else + { + rcv->preamble_pending = TRUE; +#ifdef _SIMULATION_ + TRACE_EVENT ("BCS-TRA:first PREAM FLAG rcvd (p)"); +#endif + } + break; + + case FR_TRAIN: + SET_STATE (RCV, TRAIN_RCV); + /* + * set READY flag to send first DATA to T30 + */ + rcv->t30_req_frames = TRUE; + sig_rcv_ker_train_ind(); + break; + + case FT_TRAIN_RESPONSE: + sig_rcv_ker_status_ind(); + break; + + default: + break; + } + break; /* case SYNC_RCV: */ + + case PREAM_RCV: + if (frame_type EQ FR_STATUS) + { + if (rcv->bytes_expect <= pFD->len) + { + rcv->bytes_expect = 0; + SET_STATE (RCVSUB, SUB_PREAMBLE); +#ifdef _SIMULATION_ + TRACE_EVENT ("BCS-TRA:PREAM time elapsed"); +#endif + SET_STATE (RCV, BCS_RCV); + } + else + rcv->bytes_expect -= pFD->len; + } + break; /* case PREAM_RCV: */ + + case BCS_RCV: + switch (GET_STATE (RCVSUB)) + { + case SUB_IDLE: + if (frame_type EQ FR_SYNC) + { + if (!rcv->data_in_rbm) + { + sig_rcv_ker_bcs_ind(rcv->hdlc, rcv->hdlc_len); +#ifdef _SIMULATION_ + TRACE_EVENT ("BCS-TRA:SYNC rec - HDLC compl"); +#endif + } + else + { + rcv->bcs_pending = TRUE; +#ifdef _SIMULATION_ + TRACE_EVENT ("BCS-TRA:SYNC rec - HDLC compl (p)"); +#endif + } + rcv_ResetFormatter(); + SET_STATE (RCV, SYNC_RCV); + } + break; + + case SUB_DATA: + switch (frame_type) + { + case FR_SYNC: + sig_rcv_ker_bcs_ind (rcv->hdlc, rcv->hdlc_len); +#ifdef _SIMULATION_ + TRACE_EVENT ("BCS-TRA:SYNC rec - HDLC compl"); +#endif + rcv_ResetFormatter (); + SET_STATE (RCV, SYNC_RCV); + break; + + case FR_STATUS: + if (rcv->hdlc_len + pFD->len > HDLC_LEN) + { + SET_STATE (RCVSUB, SUB_IDLE); + TRACE_EVENT ("BCS-TRA:HDLC frame too long !!!"); + break; + } + rcv_SetHdlcFrame(pFD, &rcv->hdlc[rcv->hdlc_len], &rcv->hdlc_len); + break; + + default: /* discard non-HDLC data */ + break; + } + break; + + default: + break; + } + break; /* case BCS_RCV: */ + + case TCF_RCV: + switch (GET_STATE (RCVSUB)) + { + case SUB_IDLE: + if (frame_type NEQ FR_SYNC) + { + rcv->bytes_expect = snd_DurationToBytes (fad_data->snd.trans_rate, TIME_TCF_RCV); + rcv->bytes_expect -= pFD->len; + rcv->bytes_rcvd = 0; + rcv->bytes_good = 0; + SET_STATE (RCVSUB, SUB_TCF); + TRACE_EVENT("SET_STATE (RCVSUB, SUB_TCF)"); + } + break; + + case SUB_TCF: + if (frame_type EQ FR_SYNC) + { + +#ifdef BMI_TCF_WORKAROUND + if (rcv->bytes_rcvd < rcv->bytes_expect) /* ignore TCF frames which are destroyed by BMI */ + break; +#endif + + sig_rcv_ker_tcf_ind(); + rcv_ResetFormatter(); + TRACE_EVENT ("MSG-TRA: rec TCF compl (too short)"); + SET_STATE (RCV, SYNC_RCV); + } + else if (frame_type EQ FR_STATUS) + { + rcv_ResetFormatter(); + TRACE_EVENT ("MSG-TRA: rec FR_STATUS during SUB_TCF"); + SET_STATE (KER, IDLE); + SET_STATE (RCV, SYNC_RCV); + } + else /* frame_type NEQ FR_SYNC */ + { + rcv->bytes_rcvd += pFD->len; + if (rcv->bytes_expect <= pFD->len) + { + rcv->bytes_expect = 0; + SET_STATE (RCVSUB, SUB_POST_TCF); + } + else + rcv->bytes_expect -= pFD->len; + + rcv_SetErrorRatio(pFD); + } + break; + + case SUB_POST_TCF: + if (frame_type EQ FR_SYNC) + { + sig_rcv_ker_tcf_ind(); + rcv_ResetFormatter(); + TRACE_EVENT ("MSG-TRA:rec TCF compl"); + SET_STATE (RCV, SYNC_RCV); + } + else + { + while (fad_data->rbm.ribu->idx.filled) + { + cl_ribu_read_index(&fad_data->rbm.ribu->idx); +#ifdef _SIMULATION_ + TRACE_EVENT_P3("ribu: f=%2d - w=%2d - r=%2d - SUB_POST_TCF", + fad_data->rbm.ribu->idx.filled, + fad_data->rbm.ribu->idx.wi, + fad_data->rbm.ribu->idx.ri); +#endif + } + } + break; + + default: + rcv_ResetFormatter (); + SET_STATE (RCV, SYNC_RCV); + sig_rcv_ker_error_ind (ERR_FAD_SUB_TCF); + break; + } + break; /* case TCF_RCV: */ + + case TRAIN_RCV: + switch (frame_type) + { + case FR_T4DATA: + { +#ifdef _TARGET_ + switch_ra_detect_req(DET_NO_STATUS); +#else + /* + * handling of first frame restored + */ + rcv->train_flg = FALSE; + rcv->data_incoming = TRUE; + if (!rcv_StoreMsgData (pFD, &rcv->prim_ready)) + { + rcv->t30_req_frames = FALSE; + rcv_ResetFormatter (); + SET_STATE (RCV, SYNC_RCV); + sig_rcv_ker_error_ind (ERR_OVERFLOW_BCS_RCV); + break; + } + rcv->data_in_rbm = TRUE; + /* check if T30 READY flag set */ + if (rcv->t30_req_frames) + sig_ker_rcv_ready_req (); +#endif + + TRACE_EVENT ("MSG-TRA:TRAIN compl"); + rcv->data_incoming = TRUE; + rcv->bytes_expect = REPEAT_FOREVER; + rcv->train_flg = TRUE; /*???*/ + SET_STATE (RCV, MSG_RCV); + sig_rcv_ker_train_end_ind (); /* first MSG data received: resume sending SYNCS */ + break; + } + default: + break; + } + break; /* case TRAIN_RCV: */ + + case MSG_RCV: + switch (frame_type) + { + case FR_SYNC: + if (rcv->train_flg EQ FALSE) /*???*/ + { +#ifdef _TARGET_ + switch_ra_detect_req(DET_STATUS); +#endif + TRACE_EVENT ("MSG-TRA:DATA compl"); + rcv->data_incoming = FALSE; + if (!fad_data->ker.forward_data) + { + rcv->t30_req_frames = FALSE; + sig_rcv_ker_msg_ind (NULL); + } + if (rcv->t30_req_frames) + rcv_SetFinalBuffer (); + + SET_STATE (RCV, SYNC_RCV); + rcv_ResetFormatter (); + } + break; + + case FR_T4DATA: + rcv->train_flg = FALSE; + if (!rcv_StoreMsgData (pFD, &rcv->prim_ready)) + { + rcv->t30_req_frames = FALSE; + rcv_ResetFormatter (); + SET_STATE (RCV, SYNC_RCV); + sig_rcv_ker_error_ind (ERR_OVERFLOW_BCS_RCV); + break; + } + rcv->data_in_rbm = TRUE; + if (rcv->t30_req_frames) /* check if T30 READY flag set */ + sig_ker_rcv_ready_req (); + break; + + default: + break; + } + break; /* case MSG_RCV: */ + + default: + break; + } +} + +#ifdef _TARGET_ +/* ++----------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : FAD_RCVP | +| STATE : code ROUTINE : fad_rcv_GetDestDescriptor | ++----------------------------------------------------------------------+ + + PURPOSE : WRAPPER: Get frame descriptor for Layer 1 (TI) + +*/ +GLOBAL T_FD *fad_rbm_get_next_FrameDesc(void) +{ + return (cl_ribu_get_new_frame_desc(fad_data->rbm.ribu)); +} +#endif +