diff gsm-fw/comlib/cl_shrd.c @ 664:d36f647c2432

gsm-fw/comlib: initial import of TI's source cl_des.c and cl_imei.c are from the Leonardo semi-src; others are from LoCosto
author Michael Spacefalcon <msokolov@ivan.Harhan.ORG>
date Sun, 28 Sep 2014 05:09:53 +0000
parents
children f8175b92d0f7
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/gsm-fw/comlib/cl_shrd.c	Sun Sep 28 05:09:53 2014 +0000
@@ -0,0 +1,438 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :  COMLIB
+|  Modul   :  cl_shrd.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 :  Definitions of common library functions: Implementation of
+              creation of Semaphores and usage of it by any entity in 
+              PS
++-----------------------------------------------------------------------------
+*/
+/*
+ *  Version 1.0
+ */
+
+/**********************************************************************************/
+
+/*
+NOTE:
+*/
+
+/**********************************************************************************/
+#ifndef CL_SHRD_C
+#define CL_SHRD_C
+/*==== INCLUDES ===================================================*/
+
+#include <string.h>
+#include <stdio.h>
+#include "typedefs.h"
+#include "vsi.h"
+#include "cl_shrd.h"
+
+/*==== VARIABLES ==================================================*/
+
+static T_HANDLE cl_handle;
+
+#ifdef OPTION_MULTITHREAD
+#define VSI_CALLER cl_handle,
+#else
+#define VSI_CALLER
+#endif
+
+/* Pointer is used for faster memory access */
+static T_SHRD_DATA shrd_data_base;
+T_SHRD_DATA *shared_data = &shrd_data_base;
+
+static T_HANDLE  sem_SHARED = VSI_ERROR;
+static BOOL is_initialized = FALSE;
+
+/*==== FUNCTIONS ==================================================*/
+
+/*
++---------------------------------------------------------------------------------
+|  Function     : cl_shrd_init 
++---------------------------------------------------------------------------------
+|  Description  : Opens counting semaphore specified by its name. 
+|                 If semaphore doesnot exists, creates semaphore with count given.
+|
+|  Parameters   :  T_HANDLE
+|
+|  Return       :  void
+|
++---------------------------------------------------------------------------------
+*/
+GLOBAL void cl_shrd_init (T_HANDLE handle)
+{
+  TRACE_FUNCTION ("cl_shrd_init()");
+
+  if(is_initialized NEQ TRUE)
+  {
+    cl_handle = handle;
+
+    memset(shared_data, 0, sizeof(T_SHRD_DATA));
+    sem_SHARED  = vsi_s_open (VSI_CALLER "SHARED_SEM",1);
+
+    if (sem_SHARED NEQ VSI_ERROR)
+    {
+      TRACE_EVENT ("Semaphore opened successfully \"SHARED_SEM\"");
+      is_initialized = TRUE;
+#ifdef TI_PS_FF_AT_P_CMD_CTREG
+      /* 
+       * Initialize the Two tables with the default values
+       */
+      memcpy(shared_data->no_serv_mod_time,&no_service_mode_time,
+          sizeof(no_service_mode_time));
+
+      memcpy(shared_data->lim_serv_mod_time,&lim_service_mode_time,
+          sizeof(lim_service_mode_time));
+#endif /* TI_PS_FF_AT_P_CMD_CTREG */
+    }
+    else
+      TRACE_EVENT ("Cant open semaphore \"SHARED_SEM\"");
+  }
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_exit
++------------------------------------------------------------------------------
+|  Description  :  Close the semaphore.
+|
+|  Parameters   :  void
+|
+|  Return       :  void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void cl_shrd_exit (void)
+{
+  TRACE_FUNCTION ("cl_shrd_exit()");
+  if(is_initialized EQ TRUE)
+  {
+    if (sem_SHARED NEQ VSI_ERROR)
+      vsi_s_close (VSI_CALLER sem_SHARED);
+  
+    memset(shared_data, 0, sizeof(T_SHRD_DATA));
+    is_initialized = FALSE;
+  }
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_get_loc
++------------------------------------------------------------------------------
+|  Description  : Copies the content from global T_LOC_INFO to the 
+|                 passed parameter 
+|
+|  Parameters   : <loc_info>:  Location information
+|
+|  Return       : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL BOOL cl_shrd_get_loc (T_LOC_INFO *loc_info)
+{
+  BOOL ret = FALSE;
+  TRACE_FUNCTION ("cl_shrd_get_loc()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      if ( loc_info NEQ NULL )
+        memcpy(loc_info, &shared_data->location_info, sizeof(T_LOC_INFO));
+      vsi_s_release (VSI_CALLER sem_SHARED);
+      ret = TRUE;
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+      return(ret);
+    }
+  }
+  return(ret);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_set_loc
++------------------------------------------------------------------------------
+|  Description  : Copies the content from passed parameter to the 
+|                 global structure 
+|
+|  Parameters   : <loc_info>:  Location information
+|
+|  Return       : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void cl_shrd_set_loc (T_LOC_INFO *loc_info)
+{
+  TRACE_FUNCTION ("cl_shrd_set_loc()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      if ( loc_info NEQ NULL )
+        memcpy(&shared_data->location_info, loc_info, sizeof(T_LOC_INFO));
+      vsi_s_release (VSI_CALLER sem_SHARED);
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+    }
+  }
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_get_tim_adv
++------------------------------------------------------------------------------
+|  Description  : Copies the content from global T_TIM_ADV to the 
+|                 passed parameter 
+|
+|  Parameters   : <tim_adv>:  Timing Advance and ME status.
+|
+|  Return       : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL BOOL cl_shrd_get_tim_adv (T_TIM_ADV *tim_adv)
+{
+  BOOL ret = FALSE;
+  TRACE_FUNCTION ("cl_shrd_get_tim_adv()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      if ( tim_adv NEQ NULL )
+        memcpy(tim_adv, &shared_data->timing_advance, sizeof(T_TIM_ADV));
+      vsi_s_release (VSI_CALLER sem_SHARED);
+      ret = TRUE;
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+      return(ret);
+    }
+  }
+  return(ret);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_set_tim_adv
++------------------------------------------------------------------------------
+|  Description  : Copies the content from passed parameter to the 
+|                 global structure 
+|
+|  Parameters   : <tim_adv>:  Timing Advance and ME status.
+|
+|  Return       : void
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL void cl_shrd_set_tim_adv (T_TIM_ADV *tim_adv)
+{
+  TRACE_FUNCTION ("cl_shrd_set_tim_adv()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      if ( tim_adv NEQ NULL )
+        memcpy(&shared_data->timing_advance, tim_adv, sizeof(T_TIM_ADV));
+      vsi_s_release (VSI_CALLER sem_SHARED);
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+    }
+  }
+}
+#ifdef TI_PS_FF_AT_P_CMD_CTREG
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_set_treg_val
++------------------------------------------------------------------------------
+|  Description  : Copies the content from passed parameter to the 
+|                 global structure  Used for %CTREG setting the values.
+|
+|  Parameters   : <mode>   : Selects the mode of operation read or write
+|                 <tab_id> : Selects either no_service_mode_time or 
+|                             lim_service_mode_time for updating.
+|                 <tab_val>: Table values to be updated in the selcted table.
+|
+|  Return       : BOOL
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL BOOL cl_shrd_set_treg_val ( T_TREG *treg )
+{
+  UBYTE i;
+  BOOL ret = FALSE;
+
+  TRACE_FUNCTION ("cl_shrd_set_treg_val()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      if ( treg NEQ NULL )
+      {
+        switch(treg->tab_id)
+        {
+          case NOSERVICE_MODE_TIME:
+            memcpy(shared_data->no_serv_mod_time, treg->tab_val,
+                    MAX_CTREG_TAB_LEN);
+            break;
+          case LIMSERVICE_MODE_TIME:
+            memcpy(shared_data->lim_serv_mod_time, treg->tab_val,
+                    MAX_CTREG_TAB_LEN);
+            break;
+          default:
+            break;
+        }
+        ret = TRUE;
+      }
+      vsi_s_release (VSI_CALLER sem_SHARED);
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+    }
+  }
+  return(ret);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_get_treg_val
++------------------------------------------------------------------------------
+|  Description  : Reads the content from passed parameter to the 
+|                 global structure.
+|
+|  Parameters   : <mode>   : Selects the mode of operation read or write
+|                 <tab_id> : Selects either no_service_mode_time or 
+|                             lim_service_mode_time for updating.
+|                 <tab_val>: Table values to be read from the selected table.
+|
+|  Return       : BOOL
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL BOOL cl_shrd_get_treg_val ( T_TREG *treg )
+{
+  UBYTE i;
+  BOOL ret = FALSE;
+
+  TRACE_FUNCTION ("cl_shrd_get_treg_val()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      if ( treg NEQ NULL )
+      {
+        switch(treg->tab_id)
+        {
+          case NOSERVICE_MODE_TIME:
+            memcpy(treg->tab_val, shared_data->no_serv_mod_time,
+                    MAX_CTREG_TAB_LEN);
+            break;
+          case LIMSERVICE_MODE_TIME:
+            memcpy(treg->tab_val, shared_data->lim_serv_mod_time,
+                    MAX_CTREG_TAB_LEN);
+            break;
+          default:
+            break;
+        }
+        ret = TRUE;
+      }
+      vsi_s_release (VSI_CALLER sem_SHARED);
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+    }
+  }
+  return(ret);
+}
+
+/*
++------------------------------------------------------------------------------
+|  Function     : cl_shrd_get_treg
++------------------------------------------------------------------------------
+|  Description  : Reads the TREG Timer value from the selected Table and 
+|                 returns the data to called Entity (RR)
+|
+|  Parameters   : <tab_id> : Selects either no_service_mode_time or
+|                             lim_service_mode_time for getting TREG value.
+|                 <offset> : Offset value to point at exact position in the 
+|                             selected Table for getting TREG value.
+|                 <tab_val>: Table value in the selcted table.
+|
+|  Return       : BOOL
+|
++------------------------------------------------------------------------------
+*/
+
+GLOBAL BOOL cl_shrd_get_treg (UBYTE tab_id, UBYTE offset, UBYTE *tab_val)
+{
+  BOOL ret = FALSE;
+
+  TRACE_FUNCTION ("cl_shrd_get_treg()");
+
+  if (sem_SHARED NEQ VSI_ERROR)
+  {
+    if (vsi_s_get (VSI_CALLER sem_SHARED) EQ VSI_OK)
+    {
+      /* Check for the proper value of offset, it should be between 0 to 24 */
+      if(offset > (MAX_CTREG_TAB_LEN - 1))
+      {
+        return(ret);
+      }
+      switch(tab_id)
+      {
+        case NOSERVICE_MODE_TIME:
+          *tab_val = shared_data->no_serv_mod_time[offset];
+          break;
+        case LIMSERVICE_MODE_TIME:
+          *tab_val = shared_data->lim_serv_mod_time[offset];
+          break;
+        default:
+          break;
+      }
+      ret = TRUE;
+      vsi_s_release (VSI_CALLER sem_SHARED);
+    }
+    else
+    {
+      TRACE_EVENT ("Semaphore not free or Invalid handle \"sem_SHARED\"");
+    }
+  }
+  return(ret);
+}
+#endif /* TI_PS_FF_AT_P_CMD_CTREG */
+
+#endif   /* CL_SHRD_C */