FreeCalypso > hg > freecalypso-sw
diff gsm-fw/ccd/tdd_ci.c @ 648:970d6199f2c5
gsm-fw/ccd/*.[ch]: initial import from the LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Thu, 04 Sep 2014 05:48:57 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/ccd/tdd_ci.c Thu Sep 04 05:48:57 2014 +0000 @@ -0,0 +1,213 @@ +/* ++----------------------------------------------------------------------------- +| Project : CCD +| Modul : tdd_ci.c ++----------------------------------------------------------------------------- +| Copyright 2004 Texas Instruments Deutschland GmbH +| All rights reserved. +| +| This file is confidential and a trade secret of Texas +| Instruments Deutschland GmbH +| 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 Deutschland GmbH. ++----------------------------------------------------------------------------- +| Purpose : Definition of encoding and decoding functions for TDD_CI type ++----------------------------------------------------------------------------- +*/ + + +/* + * standard definitions like GLOBAL, UCHAR, ERROR etc. + */ +#include "typedefs.h" +#include "header.h" + +/* + * Types and functions for bit access and manipulation + */ +#include "ccd_globs.h" + +/* + * Prototypes of ccd internal functions + */ +#include "ccd.h" +#include "bitfun.h" + +/* + * Declaration of coder/decoder tables + */ +#include "ccdtable.h" +/* + * Function prototypes of CCD-CCDDATA interface + */ +#include "ccddata.h" + + +#if !(defined (CCD_TEST)) +#include "vsi.h" +#endif + +#ifndef RUN_INT_RAM +/* Attention: static data, only used in cdc_tdd_ci_decode */ +static const U8 params_bSize[21] = +{ + 0, + 9, + 17, 25, + 32, 39, 46, 53, + 59, 65, 71, 77, 83, 89, 95, 101, + 106, 111, 116, 121, 126 +}; +/* ++--------------------------------------------------------------------+ +| PROJECT : CCD MODULE : cdc_tdd_ci_decode | ++--------------------------------------------------------------------+ + + PURPOSE : Decoding of the TDD_CELL_INFORMATION Field reusing + RANGE 511 format of frequency lists (with w0=0.). + This field allows to compute a set of 9-bit-long + TDD_CELL_INFORMATION aprameters. + The IE is preceded by TDD_Indic0(1 bit) and made of the + following two IEs: + 1) NR_OF_TDD_CELLS(5 bit field), + 2) TDD_CELL_INFORMATION information parameters + + TDD_Indic0 indicates if the parameter value '0000000000' + is a member of the set. + The total number of bits q of this field depends on the + value of the parameter NR_OF_TDD_CELLS = m + as follows (with q=0 if m=0): + m q m q m q m q m q + 0 0 5 39 10 71 15 101 20 126 + 1 9 6 46 11 77 16 106 21-31 0 + 2 17 7 53 12 83 17 111 + 3 25 8 59 13 89 18 116 + 4 32 9 65 14 95 19 121 + + The message is sent from net to MS and a MS supporting + enhanced measurements has to understand it. + + The space this IE takes in the C-structure is made of a + counter for the number of decoded parameter and an array + of them. +*/ + +SHORT cdc_tdd_ci_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) +{ + U8 ListSize = 0; + U16 ListBitLen = 0; + ULONG cix_ref, num_prolog_steps, prolog_step_ref; + short *w; + +#ifdef DEBUG_CCD + TRACE_CCD (globs, "cdc_tdd_ci_decode()"); +#ifdef CCD_SYMBOLS + TRACE_CCD (globs, "decoding list %s with range 512 format", + ccddata_get_alias((USHORT) e_ref, 1)); +#else + TRACE_CCD (globs, "decoding list %d of range 512 format", melem[e_ref].elemRef); +#endif +#endif + + globs->SeekTLVExt = FALSE; + cix_ref = melem[e_ref].calcIdxRef; + num_prolog_steps = calcidx[cix_ref].numPrologSteps; + prolog_step_ref = calcidx[cix_ref].prologStepRef; + + /* + * if this element have a defined Prolog + * we have to process it before decoding the bitstream + */ + if (num_prolog_steps) + { + ccd_performOperations (num_prolog_steps, prolog_step_ref, globs); + } + + /* + * First read NR_OF_TDD_CELLS (5 bits). + */ + globs->pstructOffs = melem[e_ref].structOffs;; + bf_readBits (5, globs); + ListSize = globs->pstruct[globs->pstructOffs++]; + + /* If n=0 there is nothing to do for this IE. */ + if (!ListSize) + { + return 1; + } + + /* Read the corresponding bit number or suppose the maximum length. */ + if (ListSize <= 20) + { + ListBitLen = params_bSize [ListSize]; + } + else + { + /* If n>20 there is nothing to do for this IE. */ + return 1; + } + /* + * Bit size for params is bigger than the size of unread bits in the + * message buffer. Danger: buffer overwriting! + */ + if ( ListBitLen > globs->maxBitpos - globs->bitpos) + { + ccd_recordFault (globs, ERR_ELEM_LEN, BREAK, (USHORT) e_ref, + globs->pstruct + globs->pstructOffs); + ListBitLen = (U16)(globs->maxBitpos - globs->bitpos); + } + /* + * Use dynamic memory for calculation instead of global memory or stack. + */ + MALLOC (w, 257 * sizeof (U16)); + + + /* + * Decode the W-parameter. + * As a rule for this type w(0) must be 0. + */ + w[0] = 0; + cdc_decode_param (param_512+1, &w[1], ListBitLen, globs); + + /* + * Decode and set the remaining channel number according the + * algorithm described in GSM 4.08. + */ + cdc_decode_frequencies (511, &w[1], 0, TDD_CI_LIST, globs); + + /* Free the dynamic allocated memory. */ + MFREE (w); + + return 1; +} +#endif /* !RUN_INT_RAM */ + +#ifndef RUN_INT_RAM +/* ++--------------------------------------------------------------------+ +| PROJECT : CCD MODULE : cdc_tdd_ci_encode | ++--------------------------------------------------------------------+ + + PURPOSE : Encoding function is not needed, since this message is + sent from net to MS. + It could be only useful for testing procedure if there + were an encoder function at this place. + This will be a future work. + +*/ + +SHORT cdc_tdd_ci_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) +{ + +#ifdef DEBUG_CCD + TRACE_CCD (globs, "cdc_tdd_ci_encode()"); +#endif +#ifdef TARGET_WIN32 + /* TBD */ +#endif + return 1; +} +#endif /* !RUN_INT_RAM */