FreeCalypso > hg > freecalypso-sw
diff gsm-fw/ccd/fdd_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/fdd_ci.c Thu Sep 04 05:48:57 2014 +0000 @@ -0,0 +1,210 @@ +/* ++----------------------------------------------------------------------------- +| Project : CCD +| Modul : fdd_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 FDD_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" +/* + * Function prototypes of CCD-CCDDATA interface + */ +#include "ccddata.h" + + +/* + * Prototypes of ccd internal functions + */ +#include "ccd.h" +#include "bitfun.h" + +/* + * Declaration of coder/decoder tables + */ +#include "ccdtable.h" + +#if !(defined (CCD_TEST)) +#include "vsi.h" +#endif + +#ifndef RUN_INT_RAM +/* Attention: static data, only used in cdc_fdd_ci_decode */ +static const U8 params_bSize[17] = +{ + 0, + 10, + 19, 28, + 36, 44, 52, 60, + 67, 74, 81, 88, 95, 102, 109, 116, + 122 +}; +/* ++--------------------------------------------------------------------+ +| PROJECT : CCD MODULE : cdc_fdd_ci_decode | ++--------------------------------------------------------------------+ + + PURPOSE : Decoding of the FDD_CELL_INFORMATION Field reusing + RANGE 1024 format of frequency list information. + The IE is preceded by FDD_Indic0(1 bit) and made of the + following two IEs: + 1) NR_OF_FDD_CELLS(5 bit field), + 2) FDD_CELL_INFORMATION information parameters + + FDD_Indic0 indicates if the parameter value '0000000000' + is a member of the set. + + FDD_CELL_INFORMATION or "Scrambling Codes and Diversity + Field" is a bit filed of length + p(Number_of_Scrambling_Codes_and_Diversity), + whereas the function p(x) is defined by the table below + with n = Number_of_Scrambling_Codes_and_Diversity. + n p n p n p n p + 0 0 5 44 10 81 15 116 + 1 10 6 52 11 88 16 122 + 2 19 7 60 12 95 17-31 0 + 3 28 8 67 13 102 + 4 36 9 74 14 109 + + 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_fdd_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_fdd_ci_decode()"); +#ifdef CCD_SYMBOLS + TRACE_CCD (globs, "decoding list %s with range 1024 format", + ccddata_get_alias((USHORT) e_ref, 1)); +#else + TRACE_CCD (globs, "decoding elem %d with range 1024 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_FDD_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 <= 16) + { + ListBitLen = params_bSize [ListSize]; + } + else + { + /* If n>17 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. */ + cdc_decode_param (param_1024, w, ListBitLen, globs); + + /* + * Decode and set the remaining channel number according the + * algorithm described in GSM 4.08. + */ + cdc_decode_frequencies (1023, &w[0], 0, FDD_CI_LIST, globs); + + /* Free the dynamic allocated memory. */ + MFREE (w); + + return 1; +} +#endif /* !RUN_INT_RAM */ + +#ifndef RUN_INT_RAM +/* ++--------------------------------------------------------------------+ +| PROJECT : CCD MODULE : cdc_fdd_ci_encode | ++--------------------------------------------------------------------+ + + PURPOSE : Encoding function is not needed, since this message is + sent only 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_fdd_ci_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs) +{ + +#ifdef DEBUG_CCD + TRACE_CCD (globs, "cdc_fdd_ci_encode()"); +#endif +#ifdef TARGET_WIN32 + /* TBD */ +#endif + return 1; +} +#endif /* !RUN_INT_RAM */