diff g23m-gsm/sim/sim_pei.c @ 0:75a11d740a02

initial import of gsm-fw from freecalypso-sw rev 1033:5ab737ac3ad7
author Mychaela Falconia <falcon@freecalypso.org>
date Thu, 09 Jun 2016 00:02:41 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/g23m-gsm/sim/sim_pei.c	Thu Jun 09 00:02:41 2016 +0000
@@ -0,0 +1,938 @@
+/*
++-----------------------------------------------------------------------------
+|  Project :  GSM-F&D (8411)
+|  Modul   :  SIM_PEI
++-----------------------------------------------------------------------------
+|  Copyright 2004 Texas Instruments
+|                 All rights reserved.
+|
+|                 This file is confidential and a trade secret of Texas
+|                 Instruments
+|                 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.
++-----------------------------------------------------------------------------
+|  Purpose :  This Modul defines the process body interface
+|             for the component SIM of the mobile station
++-----------------------------------------------------------------------------
+*/
+
+#ifndef SIM_PEI_C
+#define SIM_PEI_C
+
+#include "config.h"
+#include "fixedconf.h"
+#include "condat-features.h"
+
+#define ENTITY_SIM
+
+/*==== INCLUDES ===================================================*/
+
+#include <string.h>
+#include "typedefs.h"
+#include "pconst.cdg"
+#include "mconst.cdg"
+#include "message.h"
+#include "ccdapi.h"
+#include "vsi.h"
+#include "custom.h"
+#include "gsm.h"
+#include "prim.h"
+#include "cnf_sim.h"
+#include "mon_sim.h"
+#include "pei.h"
+#include "tok.h"
+#include "sim.h"
+#include "sim_em.h"
+#include "cl_shrd.h"
+
+#ifdef TI_PS_UICC_CHIPSET_15
+#include "8010_136_SIMDRV_SAP_inline.h"
+#endif
+
+
+/*==== EXPORT =====================================================*/
+#ifdef TI_PS_HCOMM_CHANGE
+#ifdef FF_SAT_E
+T_HANDLE hCommUDP = VSI_ERROR;           /* UDP Communication        */
+#endif /* FF_SAT_E */
+#if defined (GPRS)
+T_HANDLE hCommGMM = VSI_ERROR;           /* SMS Communication        */
+#endif /* GPRS */
+T_HANDLE sim_handle;
+#else
+T_HANDLE hCommMMI = VSI_ERROR;           /* MMI Communication        */
+T_HANDLE hCommMM  = VSI_ERROR;           /* MM  Communication        */
+T_HANDLE hCommSMS = VSI_ERROR;           /* SMS Communication        */
+#ifdef FF_SAT_E
+T_HANDLE hCommUDP = VSI_ERROR;           /* UDP Communication        */
+#endif /* FF_SAT_E */
+#ifdef _SIMULATION_
+T_HANDLE hCommSIM = VSI_ERROR;           /* TEST CASES: TAP Communication */
+#endif
+#if defined (GPRS)
+T_HANDLE hCommGMM = VSI_ERROR;           /* SMS Communication        */
+#endif /* GPRS */
+T_HANDLE sim_handle;
+#endif /* TI_PS_HCOMM_CHANGE */
+
+
+#ifdef OPTION_RELATIVE
+ULONG offset;
+#endif
+
+T_SIM_DATA sim_data;
+
+/*==== PRIVATE ====================================================*/
+
+#ifdef FF_SAT_E
+#define pei_dti_getdata_req        _ENTITY_PREFIXED(pei_dti_getdata_req)
+#define pei_dti_disconnect_ind     _ENTITY_PREFIXED(pei_dti_disconnect_ind)
+#define pei_dti_ready_ind          _ENTITY_PREFIXED(pei_dti_ready_ind)
+#define pei_dti_data_req           _ENTITY_PREFIXED(pei_dti_data_req)
+#define pei_dti_data_ind           _ENTITY_PREFIXED(pei_dti_data_ind)
+#define pei_dti_callback           _ENTITY_PREFIXED(pei_dti_callback)
+#define pei_dti_data_test_req      _ENTITY_PREFIXED(pei_dti_data_test_req)
+#define pei_dti_data_test_ind      _ENTITY_PREFIXED(pei_dti_data_test_ind)
+#endif /* FF_SAT_E */
+
+static void pei_not_supported (void * data);
+#ifdef SIM_TOOLKIT
+static void sim_timeout (USHORT index);
+#ifdef FF_SAT_E
+LOCAL void pei_dti_getdata_req(T_DTI2_GETDATA_REQ* dti_getdata_req);
+LOCAL void pei_dti_disconnect_ind(T_DTI2_DISCONNECT_IND *dti_disconnect_ind);
+LOCAL void pei_dti_ready_ind(T_DTI2_READY_IND* dti_ready_ind);
+LOCAL void pei_dti_data_req(T_DTI2_DATA_REQ* dti_data_req);
+LOCAL void pei_dti_data_ind(T_DTI2_DATA_IND* dti_data_ind);
+LOCAL void pei_dti_callback(UBYTE instance,
+                            UBYTE interfac,
+                            UBYTE channel,
+                            UBYTE reason,
+                            T_DTI2_DATA_IND* dti_data_ind);
+#ifdef _SIMULATION_
+LOCAL const void pei_dti_data_test_req(T_DTI2_DATA_TEST_REQ* dti_data_test_req);
+LOCAL const void pei_dti_data_test_ind(T_DTI2_DATA_TEST_IND* dti_data_test_ind);
+#endif /* _SIMULATION_ */
+#endif /* FF_SAT_E */
+#endif /* else SIM_TOOLKIT */
+
+#define SIM_TIMEOUT(_x_) sim_timeout(_x_)
+
+static void sim_chk_retry_failure (void);
+
+/*==== VARIABLES ==================================================*/
+#ifdef _SIMULATION_
+static BOOL              first_access = TRUE;
+#endif /* _SIMULATION_ */
+static T_MONITOR         sim_mon;
+static BOOL  sleepTimerRunning =FALSE;
+extern BOOL startTimerPollOff; 
+
+/*==== FUNCTIONS ==================================================*/
+
+#ifdef FF_SAT_E
+LOCAL void pei_dti_getdata_req(T_DTI2_GETDATA_REQ* dti_getdata_req)
+{
+  dti_dti_getdata_req(sim_data.hDTI, dti_getdata_req);
+} /* pei_dti_getdata_req() */
+
+LOCAL void pei_dti_disconnect_ind(T_DTI2_DISCONNECT_IND *dti_disconnect_ind)
+{
+    dti_dti_disconnect_ind (sim_data.hDTI, dti_disconnect_ind);
+}/* pei_dti_disconnect_ind() */
+
+LOCAL void pei_dti_ready_ind(T_DTI2_READY_IND* dti_ready_ind)
+{
+  dti_dti_ready_ind(sim_data.hDTI, dti_ready_ind);
+} /* pei_dti_ready_ind() */
+
+LOCAL void pei_dti_data_req(T_DTI2_DATA_REQ* dti_data_req)
+{
+  dti_dti_data_req(sim_data.hDTI, dti_data_req);
+} /* pei_dti_data_req() */
+
+LOCAL void pei_dti_data_ind(T_DTI2_DATA_IND* dti_data_ind)
+{
+  dti_dti_data_ind(sim_data.hDTI, dti_data_ind);
+} /* pei_dti_data_ind() */
+
+LOCAL void pei_dti_callback(U8 instance,
+                            U8 interfac,
+                            U8 channel,
+                            U8 reason,
+                            T_DTI2_DATA_IND* dti_data_ind)
+{
+  TRACE_FUNCTION ("pei_dti_callback()"); /*###jk:tbd*/
+  TRACE_EVENT_P1("pei_dti_callback: reason = %2d", reason); /*###jk:tbd*/
+  switch(reason)
+  {
+    case DTI_REASON_CONNECTION_OPENED:
+      stk_dti_connection_opened();
+      break;
+
+    case DTI_REASON_CONNECTION_CLOSED:
+      stk_dti_connection_closed();
+      break;
+
+    case DTI_REASON_DATA_RECEIVED:
+      stk_dti_data_received(dti_data_ind);
+      break;
+
+    case DTI_REASON_TX_BUFFER_FULL:
+      stk_dti_tx_buffer_full();
+      break;
+
+    case DTI_REASON_TX_BUFFER_READY:
+      stk_dti_tx_buffer_ready();
+      break;
+  }
+} /* pei_dti_callback() */
+
+LOCAL void pei_dti_connect_ind (
+                    T_DTI2_CONNECT_IND   *dti_connect_ind
+                  )
+{
+    dti_dti_connect_ind(sim_data.hDTI, dti_connect_ind);
+}
+
+LOCAL void pei_dti_connect_cnf (
+                    T_DTI2_CONNECT_CNF   *dti_connect_cnf
+                  )
+{
+    dti_dti_connect_cnf(sim_data.hDTI, dti_connect_cnf);
+}
+
+
+#ifdef _SIMULATION_
+LOCAL const void pei_dti_data_test_req(T_DTI2_DATA_TEST_REQ* dti_data_test_req)
+{
+  dti_dti_data_test_req(sim_data.hDTI, dti_data_test_req);
+} /* pei_dti_data_test_req() */
+
+LOCAL const void pei_dti_data_test_ind(T_DTI2_DATA_TEST_IND* dti_data_test_ind)
+{
+  dti_dti_data_test_ind(sim_data.hDTI, dti_data_test_ind);
+} /* pei_dti_data_test_ind() */
+#endif /* _SIMULATION_ */
+#endif /* FF_SAT_E */
+
+LOCAL const T_FUNC sim_table[] = {
+  MAK_FUNC_0 (app_sim_read_req,          SIM_READ_REQ                ), /* 0x80004005 */
+  MAK_FUNC_0 (app_sim_update_req,        SIM_UPDATE_REQ              ), /* 0x80014005 */
+  MAK_FUNC_0 (app_sim_read_record_req,   SIM_READ_RECORD_REQ         ), /* 0x80024005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80034005 */
+  MAK_FUNC_0 (app_sim_update_record_req, SIM_UPDATE_RECORD_REQ       ), /* 0x80044005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80054005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80064005 */
+#if defined SIM_TOOLKIT AND defined TI_PS_FF_AT_P_CMD_CUST
+  MAK_FUNC_0 (stk_sim_refresh_user_res,       SIM_REFRESH_USER_RES        ), /*  */
+#else /* SIM_TOOLKIT */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80074005 */
+#endif /* else SIM_TOOLKIT */
+  MAK_FUNC_0 (app_sim_increment_req,     SIM_INCREMENT_REQ           ), /* 0x80084005 */
+  MAK_FUNC_0 (app_sim_verify_pin_req,    SIM_VERIFY_PIN_REQ          ), /* 0x80094005 */
+  MAK_FUNC_0 (app_sim_change_pin_req,    SIM_CHANGE_PIN_REQ          ), /* 0x800a4005 */
+  MAK_FUNC_0 (app_sim_disable_pin_req,   SIM_DISABLE_PIN_REQ         ), /* 0x800b4005 */
+  MAK_FUNC_0 (app_sim_enable_pin_req,    SIM_ENABLE_PIN_REQ          ), /* 0x800c4005 */
+  MAK_FUNC_0 (app_sim_unblock_req,       SIM_UNBLOCK_REQ             ), /* 0x800d4005 */
+  MAK_FUNC_0 (app_sim_auth_req,          SIM_AUTHENTICATION_REQ      ), /* 0x800e4005 */
+  MAK_FUNC_0 (app_sim_mm_update_req,     SIM_MM_UPDATE_REQ           ), /* 0x800f4005 */
+  MAK_FUNC_0 (app_sim_sync_req,          SIM_SYNC_REQ                ), /* 0x80104005 */
+  MAK_FUNC_0 (app_sim_activate_req,      SIM_ACTIVATE_REQ            ), /* 0x80114005 */
+#if defined SIM_TOOLKIT
+  MAK_FUNC_0 (stk_sim_toolkit_req,       SIM_TOOLKIT_REQ             ), /* 0x80124005 */
+  MAK_FUNC_0 (stk_sim_toolkit_res,       SIM_TOOLKIT_RES             ), /* 0x80134005 */
+#else /* SIM_TOOLKIT */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80124005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80134005 */
+#endif /* else SIM_TOOLKIT */
+  MAK_FUNC_0 (app_sim_access_req,        SIM_ACCESS_REQ              ), /* 0x80144005 */
+#if defined SIM_TOOLKIT
+  MAK_FUNC_0 (stk_file_update_res,       SIM_FILE_UPDATE_RES         ), /* 0x80154005 */
+#else /* SIM_TOOLKIT */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80154005 */
+#endif /* else SIM_TOOLKIT */
+#if defined GPRS
+  MAK_FUNC_0 (gprs_sim_gmm_update_req,   SIM_GMM_UPDATE_REQ          ), /* 0x80164005 */
+#else /* GPRS */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80164005 */
+#endif /* else GPRS */
+#if defined FF_SAT_E
+  MAK_FUNC_0 (stk_sim_dti_req,           SIM_DTI_REQ                 ), /* 0x80174005 */
+  MAK_FUNC_0 (stk_sim_bip_req,           SIM_BIP_REQ                 ), /* 0x80184005 */
+  MAK_FUNC_0 (stk_sim_bip_config_req,    SIM_BIP_CONFIG_REQ          ), /* 0x80194005 */
+  MAK_FUNC_0 (stk_sim_eventlist_req,     SIM_EVENTLIST_REQ           ), /* 0x801a4005 */
+#else 
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80174005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80184005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x80194005 */
+  MAK_FUNC_N (pei_not_supported,         0                           ), /* 0x801a4005 */
+#endif /* FF_SAT_E */
+};
+
+#ifdef FF_SAT_E
+LOCAL const T_FUNC dti_dl_table[] =
+{
+  MAK_FUNC_0(pei_dti_connect_ind,        DTI2_CONNECT_IND),     /* 0x7750 */
+  MAK_FUNC_0(pei_dti_connect_cnf,        DTI2_CONNECT_CNF),     /* 0x7751 */
+  MAK_FUNC_0(pei_dti_disconnect_ind,     DTI2_DISCONNECT_IND),  /* 0x7752 */
+  MAK_FUNC_0(pei_dti_ready_ind,          DTI2_READY_IND),       /* 0x7753 */
+  MAK_FUNC_0(pei_dti_data_ind,           DTI2_DATA_IND),        /* 0x7754 */
+#ifdef _SIMULATION_
+  MAK_FUNC_S(pei_dti_data_test_ind,      DTI2_DATA_TEST_IND)    /* 0x7755 */
+#else 
+  MAK_FUNC_S(pei_not_supported,          DTI2_DATA_TEST_IND)    /* 0x7755 */
+#endif /* _SIMULATION_ */
+};
+
+LOCAL const T_FUNC dti_ul_table[] =
+{
+  MAK_FUNC_0(pei_not_supported,     DTI2_CONNECT_REQ),      /* 0x3750 */
+  MAK_FUNC_0(pei_not_supported,     DTI2_CONNECT_RES),      /* 0x3751 */
+  MAK_FUNC_0(pei_not_supported,     DTI2_DISCONNECT_REQ ),  /* 0x3752 */
+  MAK_FUNC_0(pei_dti_getdata_req,   DTI2_GETDATA_REQ),      /* 0x3753 */
+  MAK_FUNC_0(pei_dti_data_req,      DTI2_DATA_REQ),         /* 0x3754 */
+#ifdef _SIMULATION_
+  MAK_FUNC_S(pei_dti_data_test_req, DTI2_DATA_TEST_REQ)     /* 0x3755 */
+#else 
+  MAK_FUNC_S(pei_not_supported,     DTI2_DATA_TEST_REQ)     /* 0x3755 */
+#endif /*  _SIMULATION_ */
+};
+
+LOCAL const T_FUNC udp_table[] =
+{
+  MAK_FUNC_0(stk_udp_bind_cnf,      UDP_BIND_CNF),      /* 0x80004046 */
+  MAK_FUNC_0(stk_udp_closeport_cnf, UDP_CLOSEPORT_CNF), /* 0x80014046 */
+  MAK_FUNC_0(stk_udp_error_ind,     UDP_ERROR_IND),     /* 0x80024046 */
+  MAK_FUNC_0(stk_udp_shutdown_ind,  UDP_SHUTDOWN_IND)   /* 0x80034046 */
+};
+#endif /* FF_SAT_E */
+
+#ifdef FF_EM_MODE
+LOCAL const T_FUNC em_table[] = {
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x00 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x01 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x02 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x03 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x04 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x05 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x06 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x07 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x08 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x09 */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x0A */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x0B */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x0C */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x0D */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x0E */
+  MAK_FUNC_N (pei_not_supported    , 0                ), /* 0x0F */
+  MAK_FUNC_0 (sim_em_sim_event_req , EM_SIM_EVENT_REQ )  /* 0x10 */
+};
+#endif /* FF_EM_MODE */
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_primitive       |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process protocol specific primitive.
+
+*/
+LOCAL SHORT pei_primitive (void * ptr)
+{
+  T_PRIM *prim = ptr;
+
+  /*
+   *                |      |
+   *               DTI2   SIM               UPLINK
+   *                |      |
+   *      +---------v------v---------+
+   *      |                          |
+   *      |            SIM           |
+   *      |                          |
+   *      +--------------------------+
+   *
+   */
+
+  TRACE_FUNCTION ("pei_primitive()");
+
+  if (prim NEQ NULL)
+  {
+    ULONG         opc = prim->custom.opc;
+    USHORT        n, loc_sap_nr;
+    const T_FUNC *table;
+
+    VSI_PPM_REC ((T_PRIM_HEADER*)prim, __FILE__, __LINE__);
+
+    PTRACE_IN (opc);
+    loc_sap_nr = SAP_NR(opc);
+    switch (loc_sap_nr)
+    {
+      case SAP_NR(SIM_DL): table = sim_table; n = TAB_SIZE (sim_table); break;
+#ifdef FF_SAT_E
+      case SAP_NR(UDP_DL): table = udp_table; n = TAB_SIZE (udp_table); break;
+      case SAP_NR(DTI2_DL): table = dti_dl_table; n = TAB_SIZE (dti_dl_table);
+        opc -= 0x50; /* DTI2 opcodes start at 0x50 */
+      break;
+      case SAP_NR(DTI2_UL): table = dti_ul_table; n = TAB_SIZE (dti_ul_table);
+        opc -= 0x50; /* DTI2 opcodes start at 0x50 */
+      break;
+#endif /* FF_SAT_E */
+#ifdef FF_EM_MODE
+      case SAP_NR(EM_Ul): table = em_table; n = TAB_SIZE (em_table); break;
+#endif /* FF_EM_MODE */
+      default: table = NULL; n = 0; break;
+    } /* switch (SAP_NR(opc)) */
+
+    if (table != NULL )
+    {
+      if (PRIM_NR(opc) < n)
+      {
+        if(sleepTimerRunning == TRUE)
+        {
+          TIMER_STOP(sim_handle,SLEEP_TIMER);
+          sleepTimerRunning = FALSE;
+        }
+       table += PRIM_NR(opc);
+       JUMP(table->func)(P2D(prim));
+#ifdef SIM_TOOLKIT
+       if (sim_data.chk_sat_avail)
+       {
+         sim_data.chk_sat_avail = FALSE;
+         stk_proactive_polling();
+       }
+#endif /* SIM_TOOLKIT */
+
+        sleepTimerRunning = TRUE;
+        TIMER_START(sim_handle,SLEEP_TIMER,100); /* no primitives in next 100 m secs go for Sleep*/
+       sim_chk_retry_failure ();
+      }
+      else
+      {
+        pei_not_supported (P2D(prim));
+      }
+      return PEI_OK;
+    }
+    /*
+     * Primitive is no GSM Primitive
+     * then forward to the environment
+     */
+#ifdef GSM_ONLY
+    PFREE (P2D(prim))
+    return PEI_ERROR;
+#else
+    if (opc & SYS_MASK)
+      vsi_c_primitive (VSI_CALLER prim);
+    else
+    {
+      PFREE (P2D(prim));
+    }
+    return PEI_ERROR;
+#endif
+  }
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_not_supported   |
++--------------------------------------------------------------------+
+
+  PURPOSE : An unsupported primitive is received.
+
+*/
+
+static void pei_not_supported (void * data)
+{
+  TRACE_FUNCTION ("pei_not_supported()");
+
+  PFREE (data);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)            MODULE  : SIM_PEI               |
+| STATE   : code                     ROUTINE : sim_chk_retry_failure |
++--------------------------------------------------------------------+
+
+  PURPOSE : check for driver retry failure to start SIM re-initialisation.
+
+*/
+
+void sim_chk_retry_failure (void)
+{
+#ifdef TI_PS_UICC_CHIPSET_15
+  U8 readerId = SIMDRV_VAL_READER_ID__RANGE_MIN;
+  U8 voltageSelect = SIMDRV_REQ_VOLTAGE_SEL;
+#else   
+  T_SIM_CARD sim_info;
+#endif
+  if (SIM_IS_FLAG_SET(DRV_FAILED_RETRY))
+  {
+
+    TRACE_EVENT("SIM RETRY FAILURE");
+
+    if (SIM_IS_FLAG_CLEARED(CALL_ACTIVE))
+    {
+      PALLOC (sim_remove_ind_to_mmi, SIM_REMOVE_IND);
+      sim_remove_ind_to_mmi->cause = SIM_CAUSE_DRV_TEMPFAIL;
+      PSENDX (MMI, sim_remove_ind_to_mmi);
+
+#ifndef TI_PS_UICC_CHIPSET_15
+      SIM_PowerOff ();
+#else
+      simdrv_poweroff ( readerId );
+#endif
+
+      sim_data.act_directory = NOT_PRESENT_16BIT;
+      sim_data.act_field     = NOT_PRESENT_16BIT;
+
+      TIMER_START (sim_handle, SIM_TIMER, T_DETECT_VALUE);
+      SIM_CLEAR_FLAG (SIM_INSERT);
+
+#ifndef TI_PS_UICC_CHIPSET_15
+      if (SIM_Reset (&sim_info) NEQ 0)
+#else
+      if (simdrv_reset( readerId, voltageSelect) NEQ 0)
+#endif
+      {
+        TIMER_STOP (sim_handle, SIM_TIMER);
+        app_sim_remove();
+      }
+    }
+    else
+    {
+      SIM_CLEAR_FLAG (SIM_INSERT);
+      app_sim_remove();
+    }
+    SIM_CLEAR_FLAG(DRV_FAILED_RETRY);
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_init            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Initialize Protocol Stack Entity
+
+*/
+LOCAL SHORT pei_init (T_HANDLE handle)
+{
+  sim_handle = handle;
+
+  TRACE_FUNCTION ("pei_init()");
+
+#ifdef TI_PS_HCOMM_CHANGE
+  if (!cl_hcom_all_handles_open())
+  {
+    return PEI_ERROR;
+  }
+#else /* for hCommHandles backward compatibility */
+  if (hCommMMI < VSI_OK)
+  {
+    /*
+     * Open MMI (Layer 4)
+     */
+
+    if ((hCommMMI = vsi_c_open (VSI_CALLER ACI_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommMM < VSI_OK)
+  {
+    if ((hCommMM = vsi_c_open (VSI_CALLER MM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+  if (hCommSMS < VSI_OK)
+  {
+    if ((hCommSMS = vsi_c_open (VSI_CALLER SMS_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+
+#ifdef _SIMULATION_
+  if (hCommSIM < VSI_OK) /* get comhandle in order to be able to use the  */
+  {                      /* Funktion vsi_c_await() in the sim_csf.c module */
+    if ((hCommSIM = vsi_c_open (VSI_CALLER SIM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+#endif  /* _SIMULATION_ */
+#endif /* TI_PS_HCOMM_CHANGE */
+
+#if defined (GPRS)
+  if (hCommGMM < VSI_OK)
+  {
+    if ((hCommGMM = vsi_c_open (VSI_CALLER GMM_NAME)) < VSI_OK)
+      return PEI_ERROR;
+  }
+#endif
+
+#ifdef SIM_TOOLKIT
+#ifdef FF_SAT_E
+  /*
+   * DTI initialization
+   */
+  sim_data.hDTI = dti_init(1, handle, DTI_DEFAULT_OPTIONS, pei_dti_callback);
+  hCommUDP = VSI_ERROR;
+#endif /* FF_SAT_E */
+  stk_init_sim_data();
+#endif /* SIM_TOOLKIT */
+
+  app_init_sim_data ();
+  ccd_init ();
+#if defined (_SIMULATION_)
+  sim_data.mode = 0;
+#endif
+
+#ifdef FF_EM_MODE
+  em_init_sim_event_trace();
+#endif /* FF_EM_MODE */
+  cl_shrd_init(sim_handle);
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_timeout         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process timeout
+
+*/
+LOCAL SHORT pei_timeout (USHORT index)
+{
+  U16 sleepResult;
+  TRACE_EVENT_P1 ("[pei_timeout]: index  %d",index);
+  SIM_TIMEOUT (index);
+  return PEI_OK;
+}
+      
+#ifdef FF_SAT_E
+#ifdef _SIMULATION_
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : csf_sim_pei_timeout |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process timeout for the _SIMULATION_ test cases. Purpose is to
+            gain global access to the local function pei_timeout()
+
+*/
+GLOBAL USHORT csf_sim_pei_timeout (USHORT index)
+{
+  TRACE_FUNCTION ("csf_sim_pei_timeout(index)");
+  TRACE_EVENT_P1 ("[csf_sim_pei_timeout]: index  %d",index);
+  return pei_timeout (index);
+}
+#endif /* _SIMULATION_ */
+#endif /* FF_SAT_E */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : sim_timeout         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Process timeout
+
+*/
+
+static void sim_timeout (USHORT index)
+{
+  if (index EQ SIM_TIMER)
+  {
+    if(sleepTimerRunning == TRUE)
+    {
+      TIMER_STOP(sim_handle, SLEEP_TIMER);
+    }
+    sleepTimerRunning = FALSE;
+    app_sim_timeout (SIM_TIMER);
+  }
+  else if(index EQ SLEEP_TIMER)
+  { 
+    sleepTimerRunning = FALSE;
+    app_sim_timeout (SLEEP_TIMER); 
+  } 
+#ifdef SIM_TOOLKIT
+  else
+  {
+    if(sleepTimerRunning == TRUE)
+    {
+      TIMER_STOP(sim_handle, SLEEP_TIMER);
+    }
+    sleepTimerRunning = FALSE;
+    stk_timeout (index); 
+  } 
+#endif
+
+  if((startTimerPollOff == TRUE)&&(sim_data.idle_polling != TRUE))
+  {
+     startTimerPollOff = FALSE;
+     sleepTimerRunning = TRUE;
+     TIMER_START(sim_handle,SLEEP_TIMER,35000);
+     // this will not be effective as the SIM TIMER will expire before this and
+     // stop it. Just to takecare of Sleep after the POLLING_OFF STK command
+  } 
+}
+
+
+#ifdef _SIMULATION_
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_exit            |
++--------------------------------------------------------------------+
+
+  PURPOSE : Close Resources and terminate
+
+*/
+
+LOCAL SHORT pei_exit (void)
+{
+  TRACE_FUNCTION ("pei_exit()");
+
+  /*
+   * clean up communication
+   */
+#ifdef TI_PS_HCOMM_CHANGE
+#if defined (GPRS)
+  vsi_c_close (VSI_CALLER hCommGMM);
+  hCommGMM = VSI_ERROR;
+#endif
+#else /* for hCommHandles backward compatibility */
+  vsi_c_close (VSI_CALLER hCommMMI);
+  hCommMMI = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommMM);
+  hCommMM = VSI_ERROR;
+
+  vsi_c_close (VSI_CALLER hCommSMS);
+  hCommSMS = VSI_ERROR;
+
+#if defined (GPRS)
+  vsi_c_close (VSI_CALLER hCommGMM);
+  hCommGMM = VSI_ERROR;
+#endif
+
+#ifdef _SIMULATION_
+  /*
+   * SIM commhandle deinitialization -> was used for the test cases
+   */
+  if (hCommSIM >= VSI_OK)
+  {
+    vsi_c_close (VSI_CALLER hCommSIM);
+  }
+  hCommSIM = VSI_ERROR;
+#endif /* _SIMULATION_ */
+#endif /* TI_PS_HCOMM_CHANGE */
+
+
+
+#ifdef FF_SAT_E
+  /*
+   * DTI deinitialization
+   */
+  dti_deinit(sim_data.hDTI);
+  if (hCommUDP >= VSI_OK)
+  {
+    vsi_c_close (VSI_CALLER hCommUDP);
+  }
+  hCommUDP = VSI_ERROR;
+#endif /* FF_SAT_E */
+  cl_shrd_exit();
+
+  return PEI_OK;
+}
+#endif /* _SIMULATION_ */
+
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_config          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Dynamic Configuration
+
+*/
+
+/* Implements Measure#36 */
+#ifndef NCONFIG
+LOCAL const KW_DATA kwtab[] = {
+#ifdef _SIMULATION_
+                   SIM_MODE,              CFG_MODE,
+#endif
+                   SIM_REMOVE,            CFG_REMOVE,
+                   SIM_NORM_POLL,         CFG_NORM_POLL,
+                   SIM_TEST_POLL,         CFG_TEST_POLL,
+                   "",                    0
+                  };
+
+LOCAL SHORT pei_config (T_PEI_CONFIG inString)
+{
+  char       * s = inString;
+  char       * keyw;
+  char       * val [10];
+
+  TRACE_FUNCTION ("pei_config()");
+
+  TRACE_FUNCTION (s);
+
+  tok_init(s);
+
+  /*
+   * Parse next keyword and number of variables
+   */
+  while ((tok_next(&keyw,val)) NEQ TOK_EOCS)
+  {
+    switch (tok_key((KW_DATA *)kwtab,keyw))
+    {
+      default:
+        TRACE_ERROR ("[PEI_CONFIG]: not supported");
+        break;
+      case TOK_NOT_FOUND:
+        TRACE_ERROR ("[PEI_CONFIG]: illegal Keyword");
+        break;
+#if defined (_SIMULATION_)
+      case CFG_MODE:
+        sim_data.mode = atoi (val[0]);
+        break;
+#endif
+      case CFG_REMOVE:
+        app_sim_remove ();
+        break;
+      case CFG_NORM_POLL:
+        SIM_CLEAR_FLAG (TEST_SIM_INSERTED);
+        SIM_CLEAR_FLAG (TEST_MODE_POLLING);
+        break;
+#if defined SIM_TOOLKIT
+      case CFG_TEST_POLL:
+        SIM_SET_FLAG (TEST_SIM_INSERTED);
+        SIM_SET_FLAG (TEST_MODE_POLLING);
+        break;
+#endif
+    }
+  }
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : sim_pei_config      |
++--------------------------------------------------------------------+
+
+  PURPOSE : Dynamic Configuration
+
+*/
+GLOBAL SHORT sim_pei_config ( char * inString, char * dummy )
+{
+  pei_config ( inString );
+
+  return PEI_OK;
+}
+#endif /* not NCONFIG */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_monitor         |
++--------------------------------------------------------------------+
+
+  PURPOSE : Monitoring of physical Parameters
+
+*/
+LOCAL SHORT pei_monitor (void ** monitor)
+{
+  TRACE_FUNCTION ("pei_monitor()");
+
+/* Implements Measure#32: Row 15 */
+
+  *monitor = &sim_mon;
+
+  return PEI_OK;
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6302)              MODULE  : SIM_PEI             |
+| STATE   : code                       ROUTINE : pei_create          |
++--------------------------------------------------------------------+
+
+  PURPOSE : Create the Protocol Stack Entity
+
+*/
+
+GLOBAL SHORT sim_pei_create (T_PEI_INFO **info)
+{
+  static const T_PEI_INFO pei_info =
+  {
+    "SIM",
+    {
+      pei_init,
+#ifdef _SIMULATION_
+      pei_exit,
+#else
+      NULL,
+#endif
+      pei_primitive,
+      pei_timeout,
+      NULL,             /* no signal function  */
+      NULL,             /* no run function     */
+/* Implements Measure#36 */
+#ifdef NCONFIG
+      NULL,             /* no pei_config function     */
+#else /* not NCONFIG */
+      pei_config,
+#endif /* NCONFIG */
+      pei_monitor,
+    },
+    0x900,                  /* Stack Size      */
+    10,                     /* Queue Entries   */
+    176,                    /* Priority        */
+    NUM_OF_SIM_TIMERS,      /* number of timer */
+    PASSIVE_BODY |
+    COPY_BY_REF |
+    TRC_NO_SUSPEND |
+    PRIM_NO_SUSPEND         /* flags           */
+  };
+
+  TRACE_FUNCTION ("pei_create");
+  /*
+   *  Close Resources if open
+   */
+
+#ifdef _SIMULATION_
+  if (first_access)
+    first_access = FALSE;
+  else
+    pei_exit ();
+#endif
+
+  /*
+   * export startup configuration data
+   */
+  *info = (T_PEI_INFO *)&pei_info;
+
+#ifdef _TARGET_
+  /*
+   * bind to SIM Driver supporting ATR provision
+   */
+ #ifndef TI_PS_UICC_CHIPSET_15
+  SIM_lock_cr17689();
+ #endif
+#endif
+  return PEI_OK;
+}
+
+#endif