diff gsm-fw/ccd/gsm1_v.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/gsm1_v.c	Thu Sep 04 05:48:57 2014 +0000
@@ -0,0 +1,247 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  
+|  Modul   : gsm1_v.c
++----------------------------------------------------------------------------- 
+|  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 :  Definition of encoding and decoding functions for GSM1_V elements 
++----------------------------------------------------------------------------- 
+*/ 
+
+
+/*
+ * standard definitions like GLOBAL, UCHAR, ERROR etc.
+ */
+#include "typedefs.h"
+#include "header.h"
+
+/*
+ * Prototypes of ccd (USE_DRIVER EQ undef) for prototypes only
+ * look at ccdapi.h
+ */
+#undef USE_DRIVER
+#include "ccdapi.h"
+
+/*
+ * Types and functions for bit access and manipulation
+ */
+#include "ccd_globs.h"
+#include "bitfun.h"
+
+/*
+ * Prototypes of ccd internal functions
+ */
+#include "ccd.h"
+
+
+/*
+ * Declaration of coder/decoder tables
+ */
+#include "ccdtable.h"
+#include "ccddata.h"
+
+#ifndef RUN_FLASH
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)                 MODULE  : CDC_GSM             |
+| STATE   : code                       ROUTINE : cdc_gsm1v_decode    |
++--------------------------------------------------------------------+
+
+  PURPOSE : Decoding of the GSM Type 1V element. This element
+            consists of a V component with max. 4 Bit length.
+*/
+
+SHORT cdc_gsm1v_decode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+  SHORT ret; 
+  ULONG  cix_ref, num_prolog_steps, prolog_step_ref;
+
+#ifdef DEBUG_CCD
+  #ifndef CCD_SYMBOLS
+  TRACE_CCD (globs, "cdc_gsm1v_decode()");
+  #else
+  TRACE_CCD (globs, "cdc_gsm1v_decode() %s", ccddata_get_alias((USHORT) e_ref, 1));
+  #endif
+#endif
+
+  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);
+  }
+  
+  if (!globs->Swap1V_inProgress)
+  {
+    /*
+     * check if the next element is a GSM1V too
+     */
+    if ((ULONG)(mcomp[c_ref].componentRef
+        +mcomp[c_ref].numOfComponents) > e_ref
+      AND (melem[e_ref].codingType EQ melem[e_ref+1].codingType
+           OR melem[e_ref+1].elemType EQ 'S'))
+    { 
+	    if (melem[e_ref+1].elemType EQ 'S') 
+	    {
+		    /*
+		     * if the next element is a spare then skip the next 4 bits
+		     * do not decode the spare bits.
+		     */
+	      bf_setBitpos ((globs->bitpos+4), globs);
+
+          ret = cdc_std_decode (c_ref, e_ref, globs);
+
+          if (ret EQ 1)
+            ret++;
+
+          return ret;
+	    }
+	    else
+	    {
+		    /*
+		     * another 1V-element follow. We have to swap the nibbles.
+		     */
+		    globs->Swap1V_inProgress = TRUE;
+		    /*
+		     * store the akt position
+		     */
+		    globs->akt1VPos  = (USHORT)(globs->bitpos+4);
+		    globs->next1VPos = globs->bitpos;
+
+		    bf_setBitpos (globs->akt1VPos, globs);
+        ret = cdc_std_decode (c_ref, e_ref, globs);
+        /*
+         * increment the globs->maxBitpos by 1 so the bf_endOfBitstream
+         * will return FALSE
+         */
+        globs->maxBitpos++;
+
+        return ret;
+      }
+    }
+    ret = cdc_std_decode (c_ref, e_ref, globs);
+
+  }
+  else
+  {
+    globs->akt1VPos = globs->next1VPos;
+    globs->next1VPos = globs->bitpos;
+
+    bf_setBitpos (globs->akt1VPos, globs);
+    
+    /*
+     * decrement the globs->maxBitpos by 1 so the bf_endOfBitstream
+     * will return TRUE if the bitstream ended
+     */
+    globs->maxBitpos--;
+
+    ret = cdc_std_decode (c_ref, e_ref, globs);
+
+    bf_setBitpos (globs->next1VPos, globs);
+
+    globs->Swap1V_inProgress = FALSE;
+
+  }
+  return ret;
+}
+#endif /* !RUN_FLASH */
+ 
+#ifndef RUN_FLASH
+/*
++--------------------------------------------------------------------+
+| PROJECT : CCD (6144)                 MODULE  : CDC_GSM             |
+| STATE   : code                       ROUTINE : cdc_gsm1v_encode    |
++--------------------------------------------------------------------+
+
+  PURPOSE : encoding of the GSM Type 1V element. This element
+            consists of a V component with max. 4 Bit length.
+*/
+
+SHORT cdc_gsm1v_encode (const ULONG c_ref, const ULONG e_ref, T_CCD_Globs *globs)
+{
+#ifdef DEBUG_CCD
+  #ifndef CCD_SYMBOLS
+  TRACE_CCD (globs, "cdc_gsm1v_encode()");
+  #else
+  TRACE_CCD (globs, "cdc_gsm1v_encode() %s", ccddata_get_alias((USHORT) e_ref, 1));
+  #endif
+#endif
+
+  if (!globs->Swap1V_inProgress)
+  {
+    /*
+     * check if the next element is a GSM1V too
+     */
+    if ((ULONG)(mcomp[c_ref].componentRef
+        +mcomp[c_ref].numOfComponents) > e_ref
+      AND (melem[e_ref].codingType EQ melem[e_ref+1].codingType
+           OR melem[e_ref+1].elemType EQ 'S'))
+    { 
+	    if (melem[e_ref+1].elemType EQ 'S') 
+	    {
+        SHORT ret; 
+		    /*
+		     * if the next element is a spare then skip the next 4 bits
+		     * do not code the spare bits because the bitstream is cleared.
+		     */
+	      bf_setBitpos (globs->bitpos+4, globs);
+
+        ret = cdc_std_encode (c_ref, e_ref, globs);
+
+        if (ret EQ 1)
+          ret++;
+
+        return ret;
+	    }
+	    else
+      {
+        /*
+         * another 1V-element follow. We have to swap the nibbles.
+         */
+        globs->Swap1V_inProgress = TRUE;
+        /*
+         * store the akt position
+         */
+        globs->akt1VPos  = (USHORT)(globs->bitpos+4);
+        globs->next1VPos = globs->bitpos;
+
+        bf_setBitpos (globs->akt1VPos, globs);
+      }
+    }
+    return cdc_std_encode (c_ref, e_ref, globs);
+  }
+  else
+  {
+    SHORT ret;
+
+    globs->akt1VPos = globs->next1VPos;
+    globs->next1VPos = globs->bitpos;
+
+    bf_setBitpos (globs->akt1VPos, globs);
+    
+    ret = cdc_std_encode (c_ref, e_ref, globs);
+
+    bf_setBitpos (globs->next1VPos, globs);
+
+    globs->Swap1V_inProgress = FALSE;
+
+    return ret;
+  }
+}
+#endif /* !RUN_FLASH */