diff src/g23m-aci/aci/cmh_simq.c @ 1:d393cd9bb723

src/g23m-*: initial import from Magnetite
author Mychaela Falconia <falcon@freecalypso.org>
date Sun, 15 Jul 2018 04:40:46 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/g23m-aci/aci/cmh_simq.c	Sun Jul 15 04:40:46 2018 +0000
@@ -0,0 +1,1269 @@
+/* 
++----------------------------------------------------------------------------- 
+|  Project :  GSM-PS (6147)
+|  Modul   :  CMH_SIMQ
++----------------------------------------------------------------------------- 
+|  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 :  This module provides the query functions related to the 
+|             protocol stack adapter for subscriber identity module.
++----------------------------------------------------------------------------- 
+*/ 
+
+#ifndef CMH_SIMQ_C
+#define CMH_SIMQ_C
+#endif
+
+#include "aci_all.h"
+
+#include "aci_cmh.h"
+
+#ifdef FAX_AND_DATA
+#include "aci_fd.h"
+#endif    /* of #ifdef FAX_AND_DATA */
+
+#ifdef UART
+#include "dti.h"
+#include "dti_conn_mng.h"
+#endif
+
+#include "psa.h"
+#include "psa_sim.h"
+#include "cmh.h"
+#include "cmh_sim.h"
+#include "cmh_sms.h"
+
+/* To include AciSLockShrd */
+#include "aci_ext_pers.h"
+#include "aci_slock.h"
+
+
+#include "aoc.h"
+
+/*==== CONSTANTS ==================================================*/
+
+/*==== EXPORT =====================================================*/
+
+/*==== VARIABLES ==================================================*/
+#ifdef SIM_PERS
+#include "general.h" // inluded for UINT8 compilation error in sec_drv.h
+#include "sec_drv.h"
+EXTERN T_SEC_DRV_CONFIGURATION *cfg_data;
+#endif
+
+/*==== FUNCTIONS ==================================================*/
+
+
+#ifdef TI_PS_FF_AT_P_CMD_SECS
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMS                 |
+| STATE   : code                  ROUTINE : qAT_PercentSECS             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %SECS? AT command
+            which is responsible to query the status of the Security Code.
+
+*/
+                             
+
+GLOBAL T_ACI_RETURN qAT_PercentSECS ( T_ACI_CMD_SRC srcId,T_ACI_SECS_STA *status)
+{
+    T_SIMLOCK_STATUS result = SIMLOCK_FAIL;
+
+    TRACE_FUNCTION ("qAT_PercentSECS()");
+
+    result = aci_ext_personalisation_CS_get_status();
+
+    switch (result)
+    {
+      case SIMLOCK_ENABLED:
+        *status = SECS_STA_Enable;
+        return AT_CMPL;
+      case SIMLOCK_DISABLED:
+       *status = SECS_STA_Disable;
+        return AT_CMPL;
+      default:
+       *status = SECS_STA_NotPresent;
+        return AT_FAIL;
+    }
+}
+#endif /* TI_PS_FF_AT_P_CMD_SECS */
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_CCQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCFUN             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CFUN? AT command
+            which returns the current setting for phone functionality.
+
+            <fun>:   phone functionality.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCFUN  ( T_ACI_CMD_SRC  srcId,
+                                    T_ACI_CFUN_FUN *fun )
+{
+  TRACE_FUNCTION ("qAT_PlusCFUN()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * fill in parameters
+ *-------------------------------------------------------------------
+ */  
+  *fun = CFUNfun;
+
+  return( AT_CMPL );
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_CCQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCPIN             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CPIN? AT command
+            which returns the current PIN status.
+
+            <code>:   PIN status.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCPIN   (T_ACI_CMD_SRC srcId, 
+                                    T_ACI_CPIN_RSLT *code)
+{
+  T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */
+  #ifdef SIM_PERS
+   T_SIMLOCK_STATUS retSlStatus; /* holds return code */
+  #endif
+
+  TRACE_FUNCTION ("qAT_PlusCPIN()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+  pSIMSetPrm = &simShrdPrm.setPrm[srcId];
+
+/*
+ *-------------------------------------------------------------------
+ * check SIM status
+ *-------------------------------------------------------------------
+ */
+  if( simShrdPrm.SIMStat NEQ SS_OK AND
+      simShrdPrm.SIMStat NEQ SS_BLKD   )
+  {
+    pSIMSetPrm -> actProc = SIM_INITIALISATION;
+
+    simEntStat.curCmd = AT_CMD_CPIN;
+    simShrdPrm.owner = (T_OWN)srcId;
+    simEntStat.entOwn = srcId;
+    simShrdPrm.PINQuery = 1;
+
+    if( psaSIM_ActivateSIM() < 0 )   /* activate SIM card */
+    {
+      TRACE_EVENT( "FATAL RETURN psaSIM in +CPIN" );
+      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal );
+      simShrdPrm.PINQuery = 0;
+      return( AT_FAIL );
+    }
+    return( AT_EXCT );
+  }
+
+#ifdef SIM_PERS
+/*
+ *-------------------------------------------------------------------
+ * check PIN status
+ *-------------------------------------------------------------------
+ */
+ if ( simShrdPrm.PINStat EQ PS_RDY)
+  {
+     simEntStat.curCmd     = AT_CMD_CPIN;
+     if(!aci_slock_set_CFG())
+     {
+        ACI_ERR_DESC( ACI_ERR_CLASS_Ext,EXT_ERR_NoMEPD); 
+        return( AT_FAIL );
+     }
+     aci_slock_init();
+  	      
+     retSlStatus = SIMLOCK_ENABLED;
+     AciSLockShrd.check_lock = SIMLOCK_CHECK_PERS;
+     AciSLockShrd.cpin_query = SEND_CPIN_REQ_CODE; 
+     retSlStatus = aci_slock_checkpersonalisation(AciSLockShrd.current_lock);
+     switch(retSlStatus)
+      {
+        case  SIMLOCK_ENABLED  :
+             *code = CPIN_RSLT_SimReady;
+             break; 
+        case  SIMLOCK_BLOCKED :
+              aci_set_cpin_code(AciSLockShrd.current_lock,code); 
+              break; 
+  			   	
+       case  SIMLOCK_WAIT :
+               AciSLockShrd.cpin_query = SEND_CPIN_REQ_CODE_RAT;
+               return (AT_EXCT);
+                           
+     }    
+   /* OVK Check first if any Personalisations are active */
+   TRACE_EVENT_P3("qAT_PlusCPIN: Curr Lock = %d, Status = %d %s", AciSLockShrd.current_lock, AciSLockShrd.status[AciSLockShrd.current_lock],"" );
+   return (AT_CMPL);
+  
+    
+  }
+ else
+#endif
+  {
+    switch( simShrdPrm.PINStat )
+    {
+      case( PS_RDY ):
+
+        *code = CPIN_RSLT_SimReady;
+        break;
+
+      case( PS_PIN1 ):
+
+        *code = CPIN_RSLT_SimPinReq;
+        break;
+
+      case( PS_PUK1 ):
+
+        *code = CPIN_RSLT_SimPukReq;
+        break;
+
+      case( PS_PIN2 ):
+
+        *code = CPIN_RSLT_SimPin2Req;
+        break;
+
+      case( PS_PUK2 ):
+
+        *code = CPIN_RSLT_SimPuk2Req;
+        break;
+
+      default:
+
+        TRACE_EVENT("UNEXPECTED PIN STATUS");
+        *code = CPIN_RSLT_NotPresent;
+        ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_DataCorrupt );
+        return( AT_FAIL );
+    }
+
+
+  }
+
+  return( AT_CMPL );
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCAOC             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CAOC AT command
+            which is responsible to query the current call meter value.
+            
+            <ccm>   : CCM value.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCAOC  ( T_ACI_CMD_SRC srcId,
+                                    LONG * ccm)
+{
+  TRACE_FUNCTION ("qAT_PlusCAOC ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_CCM, (void *)ccm);
+  
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCACM             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CACM AT command
+            which is responsible to query the accumulated call meter value.
+            
+            <acm>   : ACM value.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCACM  ( T_ACI_CMD_SRC srcId,
+                                    LONG * acm)
+{
+  TRACE_FUNCTION ("qAT_PlusCACM ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_ACM, (ULONG *)acm);
+  
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCAMM             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CAMM AT command
+            which is responsible to query the maximum of the 
+            accumulated call meter value.
+            
+            <acmmax>   : ACMMax value.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCAMM  ( T_ACI_CMD_SRC srcId,
+                                    LONG * acmmax)
+{
+  TRACE_FUNCTION ("qAT_PlusCAMM ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_ACMMAX, (ULONG *)acmmax);
+  
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCPUC             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CPUC AT command
+            which is responsible to query the price per unit and 
+            currency.
+            
+            <cuurency>   : Currency
+            <ppu>        : Price per Unit
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCPUC  ( T_ACI_CMD_SRC srcId,
+                                    CHAR          *currency,
+                                    CHAR          *ppu)
+{
+  T_puct puct;
+
+  TRACE_FUNCTION ("qAT_PlusCPUC ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_PUCT, (void *)&puct);
+  
+  strcpy ((char *) currency, (char *) puct.currency);
+  strcpy ((char *) ppu, (char *) puct.value);
+
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMS                 |
+| STATE   : code                  ROUTINE : sAT_PlusCIMI             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CIMI AT command
+            which is responsible to request the IMSI.
+
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCIMI ( T_ACI_CMD_SRC  srcId,
+                                   CHAR * imsi )
+{
+  T_SIM_SET_PRM * pSIMSetPrm; /* points to SIM parameter set */
+
+  TRACE_FUNCTION ("qAT_PlusCIMI()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+  pSIMSetPrm = &simShrdPrm.setPrm[srcId];
+
+/*
+ *-------------------------------------------------------------------
+ * check entity status
+ *-------------------------------------------------------------------
+ */  
+  switch( simShrdPrm.SIMStat )
+  {
+    case( SS_OK ):
+    /*
+     *-----------------------------------------------------------------
+     * check if command executable
+     *-----------------------------------------------------------------
+     */
+    if((simShrdPrm.PINStat NEQ PS_RDY) AND (!cmhSMS_checkSIM ()))
+    {
+      return AT_FAIL;
+    }
+
+    /*
+     * Check required for CIMI after SIM_REMOVE_IND and SIM_ACTIVATE_IND
+     * with SIMStat as SS_OK and PINStat as PS_RDY
+     * but before receiving SIM_MMI_INSERT_IND
+     */
+    else if(simShrdPrm.imsi.c_field EQ 0)
+    {
+      ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown);
+      return AT_FAIL; 
+    }
+    else
+    {
+      psaSIM_cnvrtIMSI2ASCII( imsi );
+      return( AT_CMPL );
+    }
+
+    case( NO_VLD_SS ):
+
+      if( simEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY );
+
+      pSIMSetPrm -> actProc = SIM_INITIALISATION;
+
+      simEntStat.curCmd = AT_CMD_CIMI;
+      simShrdPrm.owner = (T_OWN)srcId;
+      simEntStat.entOwn =  srcId;
+
+      if( psaSIM_ActivateSIM() < 0 )   /* activate SIM card */
+      {
+        simEntStat.curCmd = AT_CMD_NONE;
+        TRACE_EVENT( "FATAL RETURN psaSIM in +CIMI" );
+        ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_Unknown);
+        return( AT_FAIL );
+      }
+
+      return( AT_EXCT );
+
+    default:                     /* SIM failure */
+      ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_SimFail );
+      return( AT_FAIL );
+  }
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PercentCACM          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %CACM AT command
+            which is responsible to query the accumulated call meter value
+            using PUCT.
+            
+            <cur>   : currency.
+            <val>   : ACM value.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentCACM( T_ACI_CMD_SRC    srcId,
+                                     CHAR            *cur,
+                                     CHAR            *val)
+{
+  T_puct puct;
+
+  TRACE_FUNCTION ("qAT_PercentCACM ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_ACM_PUCT, (T_puct *)&puct);
+  
+  strcpy (cur, (char *) puct.currency);
+  strcpy (val, (char *) puct.value);
+
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PercentCAOC          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %CAOC AT command
+            which is responsible to query the current call meter value
+            using PUCT.
+            
+            <cur>   : currency.
+            <val>   : CCM value.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentCAOC( T_ACI_CMD_SRC    srcId,
+                                     CHAR            *cur,
+                                     CHAR            *val)
+{
+  T_puct puct;
+
+  TRACE_FUNCTION ("qAT_PercentCAOC ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_CCM_PUCT, (T_puct *)&puct);
+  
+  strcpy (cur, (char *) puct.currency);
+  strcpy (val, (char *) puct.value);
+
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PercentCTV           |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %CTV AT command
+            which is responsible to query the current call timer value.
+            
+            <ctv>   : CTV value.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentCTV  ( T_ACI_CMD_SRC srcId,
+                                      LONG * ctv)
+{
+  TRACE_FUNCTION ("qAT_PercentCTV ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_CTV, (void *)ctv);
+  
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PercentRPCT          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %RPCT AT command
+            which is responsible to query the raw SIM data for PUCT.
+            
+            <rpuct>   : PUCT values.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentRPCT( T_ACI_CMD_SRC    srcId,
+                                     T_ACI_RPCT_VAL  *rpuct)
+{
+  T_puct_raw raw_puct;
+
+  TRACE_FUNCTION ("qAT_PercentRPCT ()");
+
+/*
+ *-------------------------------------------------------------------
+ * request value from advice of charge module.
+ *-------------------------------------------------------------------
+ */  
+  aoc_get_values (AOC_PUCT_RAW, (T_puct_raw *)&raw_puct);
+  
+  memcpy(rpuct->currency, raw_puct.currency, MAX_CUR_LEN);
+  rpuct->eppu = raw_puct.eppu;
+  rpuct->exp  = raw_puct.exp;
+  rpuct->sexp = raw_puct.sexp;
+
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PercentPVRF          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %PVRF AT command
+            which is responsible to query the current counter for
+            PIN and PUK.
+            
+            <pn1Cnt>   : PIN 1 counter.
+            <pn2Cnt>   : PIN 2 counter.
+            <pk1Cnt>   : PUK 1 counter.
+            <pk2Cnt>   : PUK 2 counter.
+            <ps1>      : PIN 1 status.
+            <ps2>      : PIN 2 status.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentPVRF( T_ACI_CMD_SRC srcId, 
+                                     SHORT        *pn1Cnt,
+                                     SHORT        *pn2Cnt,
+                                     SHORT        *pk1Cnt,
+                                     SHORT        *pk2Cnt,
+                                     T_ACI_PVRF_STAT *ps1,
+                                     T_ACI_PVRF_STAT *ps2 )
+{
+  TRACE_FUNCTION ("qAT_PercentPVRF ()");
+
+/*
+ *-------------------------------------------------------------------
+ * read PIN/PUK counter values
+ *-------------------------------------------------------------------
+ */  
+  if( simShrdPrm.SIMStat NEQ SS_OK AND
+      simShrdPrm.SIMStat NEQ SS_BLKD   )
+  {
+    *pn1Cnt = ACI_NumParmNotPresent;
+    *pn2Cnt = ACI_NumParmNotPresent;
+    *pk1Cnt = ACI_NumParmNotPresent;
+    *pk2Cnt = ACI_NumParmNotPresent;
+    *ps1    = PVRF_STAT_NotPresent;
+    *ps2    = PVRF_STAT_NotPresent;
+  }
+  else
+  {
+    *pn1Cnt = simShrdPrm.pn1Cnt;
+    *pn2Cnt = simShrdPrm.pn2Cnt;
+    *pk1Cnt = simShrdPrm.pk1Cnt;
+    *pk2Cnt = simShrdPrm.pk2Cnt;
+
+    switch( simShrdPrm.pn1Stat )
+    {
+      case( PS_RDY  ): *ps1 = PVRF_STAT_NotRequired; break;
+      case( PS_PIN1 ): *ps1 = PVRF_STAT_Required;    break;
+      default:         *ps1 = PVRF_STAT_NotPresent;
+    }
+
+    switch( simShrdPrm.pn2Stat )
+    {
+      case( PS_RDY  ): *ps2 = PVRF_STAT_NotRequired; break;
+      case( PS_PIN2 ): *ps2 = PVRF_STAT_Required;    break;
+      default:         *ps2 = PVRF_STAT_NotPresent;
+    }
+  }
+
+  return( AT_CMPL );        
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMS                 |
+| STATE   : code                  ROUTINE : qAT_PlusCNUM             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CNUM AT command
+            which is responsible for reading the  subscriber number.
+
+            <mode>:   indicates whether reading starts or continues
+*/
+GLOBAL T_ACI_RETURN qAT_PlusCNUM ( T_ACI_CMD_SRC  srcId,
+                                   T_ACI_CNUM_MOD mode )
+{
+  T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */
+
+  UBYTE i;                    /* used for counting                */
+
+  TRACE_FUNCTION ("qAT_PlusCNUM()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+  pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm;
+
+/*
+ *-------------------------------------------------------------------
+ * check entity status
+ *-------------------------------------------------------------------
+ */  
+  if( simEntStat.curCmd NEQ AT_CMD_NONE )
+
+    return( AT_BUSY );
+
+/*
+ *-------------------------------------------------------------------
+ * check whether there are more EF to read
+ *-------------------------------------------------------------------
+ */  
+  if ( mode                     EQ CNUM_MOD_NextRead AND
+       pSIMCmdPrm -> CNUMActRec EQ CNUMMaxRec            )
+  {
+    return ( AT_CMPL );
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * process parameter <mode>
+ *-------------------------------------------------------------------
+ */  
+  switch ( mode )
+  {
+    case ( CNUM_MOD_NewRead  ): 
+      pSIMCmdPrm -> CNUMActRec = 1;
+      pSIMCmdPrm -> CNUMOutput = 0;
+      break;
+
+    case ( CNUM_MOD_NextRead ): 
+      pSIMCmdPrm -> CNUMActRec++;
+      break;
+
+    default:
+      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
+      return( AT_FAIL );
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * reset to start of MSISDN list
+ *-------------------------------------------------------------------
+ */  
+  CNUMMsisdnIdx = 0;
+
+/*
+ *-------------------------------------------------------------------
+ * invalidate contents of MSISDN list
+ *-------------------------------------------------------------------
+ */  
+  for ( i = 0; i < MAX_MSISDN; i++ )
+    
+    CNUMMsisdn[i].vldFlag = FALSE;
+
+/*
+ *-------------------------------------------------------------------
+ * request EF MSISDN from SIM
+ *-------------------------------------------------------------------
+ */  
+  return cmhSIM_ReqMsisdn ( srcId, pSIMCmdPrm -> CNUMActRec );
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : CMH_SIMS           |
+| STATE   : code                        ROUTINE : cmhSIM_ReqMsisdn   |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function starts reading of EF MSISDN from SIM.
+*/
+
+GLOBAL T_ACI_RETURN cmhSIM_ReqMsisdn ( T_ACI_CMD_SRC srcId,
+                                       UBYTE         record )
+{
+  UBYTE length;
+
+  TRACE_FUNCTION ("cmhSIM_ReqMsisdn()");
+
+  if (record EQ 1)
+    length = NOT_PRESENT_8BIT;
+  else
+    length = CNUMLenEfMsisdn;
+
+  return cmhSIM_ReadRecordEF (srcId, AT_CMD_CNUM, FALSE, NULL, SIM_MSISDN,
+                              record, length, NULL, cmhSIM_CnfMsisdn);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-F&D (8411)              MODULE  : CMH_SIMS           |
+| STATE   : code                        ROUTINE : cmhSIM_ReqCcp      |
++--------------------------------------------------------------------+
+
+  PURPOSE : This function starts reading of EF CCP from SIM.
+*/
+
+GLOBAL T_ACI_RETURN cmhSIM_ReqCcp ( T_ACI_CMD_SRC srcId, 
+                                    UBYTE         record )
+{
+  TRACE_FUNCTION ("cmhSIM_ReqCcp()");
+
+  return cmhSIM_ReadRecordEF (srcId, AT_CMD_CNUM, FALSE, NULL, SIM_CCP, record,
+                              ACI_SIZE_EF_CCP, NULL, cmhSIM_CnfCcp);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : qAT_PlusCPOL             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CPOL AT command
+            which is responsible for reading the preferred operator
+            list.
+            
+            <startIdx>: start index to read from
+            <lastIdx>:  buffer for last index read
+            <operLst>:  buffer for operator list
+            <mode>:     supplemental read mode
+*/
+
+GLOBAL T_ACI_RETURN qAT_PlusCPOL  ( T_ACI_CMD_SRC srcId,
+                                    SHORT              startIdx,
+                                    SHORT             *lastIdx,
+                                    T_ACI_CPOL_OPDESC *operLst,
+                                    T_ACI_CPOL_MOD     mode )
+
+{
+  T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */
+
+  TRACE_FUNCTION ("qAT_PlusCPOL()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+  pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm;
+
+/*
+ *-------------------------------------------------------------------
+ * check <mode> parameter
+ *-------------------------------------------------------------------
+ */  
+  switch( mode )
+  {
+    case( CPOL_MOD_NotPresent ):
+    case( CPOL_MOD_CompactList ):
+
+      break;
+
+    case( CPOL_MOD_Insert ):
+    default:
+      ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
+      return( AT_FAIL );
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * check if PLMNsel EF has to be read
+ *-------------------------------------------------------------------
+ */  
+  if( startIdx EQ 0 OR EfPLMNselStat EQ EF_STAT_UNKNWN )
+  {
+    /*
+     *-------------------------------------------------------------
+     * check entity status
+     *-------------------------------------------------------------
+     */  
+    if( simEntStat.curCmd NEQ AT_CMD_NONE )
+
+      return( AT_BUSY );
+
+    pSIMCmdPrm -> CPOLidx  = (startIdx EQ 0)?1:startIdx;
+    pSIMCmdPrm -> CPOLmode = mode;
+    pSIMCmdPrm -> CPOLact  = CPOL_ACT_Read;
+
+    /*
+     *-------------------------------------------------------------
+     * request EF PLMN SEL from SIM
+     *-------------------------------------------------------------
+     */  
+    /* Implements Measure 150 and 159 */
+    return cmhSIM_Req_or_Write_PlmnSel( srcId, ACT_RD_DAT );
+  }
+
+  /*
+   *-------------------------------------------------------------
+   * fill PLMN SEL list
+   *-------------------------------------------------------------
+   */
+  if( startIdx * ACI_LEN_PLMN_SEL_NTRY > CPOLSimEfDataLen )
+  {
+    ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_InvIdx );
+    return( AT_FAIL );
+  }
+
+  if( mode EQ CPOL_MOD_CompactList ) 
+  {  
+    cmhSIM_CmpctPlmnSel( CPOLSimEfDataLen, CPOLSimEfData );
+  }
+
+  *lastIdx = cmhSIM_FillPlmnSelList((UBYTE)startIdx,
+                                    pSIMCmdPrm->CPOLfrmt,
+                                    operLst,
+                                    CPOLSimEfDataLen,
+                                    CPOLSimEfData);
+  return ( AT_CMPL );
+
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SSQ                  |
+| STATE   : code                  ROUTINE : tAT_PlusCPOL             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CPOL AT command
+            which is responsible for testing the supported preferred 
+            operator list length.
+            
+            <lastIdx>:   maximum number of entries
+            <usdNtry>:   number of used entries
+*/
+
+GLOBAL T_ACI_RETURN tAT_PlusCPOL  ( T_ACI_CMD_SRC srcId,
+                                    SHORT * lastIdx,
+                                    SHORT * usdNtry      )
+{
+  T_SIM_CMD_PRM * pSIMCmdPrm; /* points to SIM command parameters */
+
+  TRACE_FUNCTION ("tAT_PlusCPOL()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+  pSIMCmdPrm = &cmhPrm[srcId].simCmdPrm;
+
+/*
+ *-------------------------------------------------------------------
+ * check if PLMNsel EF has to be read
+ *-------------------------------------------------------------------
+ */  
+  if( EfPLMNselStat EQ EF_STAT_UNKNWN )
+  {
+    /*
+     *-------------------------------------------------------------
+     * check entity status
+     *-------------------------------------------------------------
+     */  
+    if( simEntStat.curCmd NEQ AT_CMD_NONE )
+
+      return( AT_BUSY );
+
+    pSIMCmdPrm -> CPOLact = CPOL_ACT_Test;
+
+    /*
+     *-------------------------------------------------------------
+     * request EF PLMN SEL from SIM
+     *-------------------------------------------------------------
+     */  
+    /* Implements Measure 150 and 159 */
+    return cmhSIM_Req_or_Write_PlmnSel( srcId, ACT_RD_DAT );
+  }
+
+  /*
+   *-------------------------------------------------------------
+   * return number of supported entries
+   *-------------------------------------------------------------
+   */
+  *lastIdx = CPOLSimEfDataLen / ACI_LEN_PLMN_SEL_NTRY;
+
+  *usdNtry = cmhSIM_UsdPlmnSelNtry( CPOLSimEfDataLen, CPOLSimEfData );
+
+  return ( AT_CMPL );
+
+}
+
+
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMQ                |
+|                                 ROUTINE : qAT_PercentCPRI         |
++-------------------------------------------------------------------+
+
+ PURPOSE : This is the functional counterpart to the %CPRI AT command
+           which is responsible for reading the ciphering indicator 
+           mode.
+*/
+GLOBAL T_ACI_RETURN qAT_PercentCPRI( T_ACI_CMD_SRC srcId,
+                                     UBYTE *mode  )
+{
+  TRACE_FUNCTION ("qAT_PercentCPRI()");
+
+  if( !cmh_IsVldCmdSrc( srcId ) ) 
+  { 
+    return( AT_FAIL );
+  }
+  *mode = simShrdPrm.ciSIMEnabled;
+  return( AT_CMPL );
+}
+
+#ifdef TI_PS_FF_AT_P_CMD_ATR
+/*
++-------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMQ                |
+|                                 ROUTINE : qAT_PercentATR          |
++-------------------------------------------------------------------+
+
+ PURPOSE : This is the functional counterpart to the %ATR AT command
+           which is responsible for reading the SIM phase and ATR 
+           (answer to reset information).
+*/
+GLOBAL T_ACI_RETURN qAT_PercentATR( T_ACI_CMD_SRC  srcId,
+                                     UBYTE        *phase,
+                                     UBYTE        *atr_len,
+                                     UBYTE        *atr_info)
+{
+  TRACE_FUNCTION ("qAT_PercentATR()");
+
+  if( !cmh_IsVldCmdSrc( srcId ) ) 
+  { 
+    return( AT_FAIL );
+  }
+
+  *phase = simShrdPrm.crdPhs; /* SIM Phase... value is 0xFF if no phase is available*/
+  
+
+  *atr_len = simShrdPrm.atr.len; /* ATR length... 0 if no ATR data is available*/
+  if (simShrdPrm.atr.len)
+  {
+    memcpy(atr_info, simShrdPrm.atr.data, simShrdPrm.atr.len);
+  }
+  
+  return( AT_CMPL );
+}
+#endif /* TI_PS_FF_AT_P_CMD_ATR */
+
+#ifdef FF_DUAL_SIM
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMQ                  |
+| STATE   : code                  ROUTINE : qAT_PercentSIM             |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %SIM? AT command
+            which returns the currently powered on SIM Number.
+
+            <sim_num>:   sim_number.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentSIM  ( T_ACI_CMD_SRC  srcId,
+                                    UBYTE *sim_num )
+{
+  TRACE_FUNCTION ("qAT_PercentSIM()");
+
+/*
+ *-------------------------------------------------------------------
+ * check command source
+ *-------------------------------------------------------------------
+ */  
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    return( AT_FAIL );
+  }
+
+/*
+ *-------------------------------------------------------------------
+ * fill in parameters
+ *-------------------------------------------------------------------
+ */  
+  *sim_num = simShrdPrm.SIM_Powered_on;
+
+  return( AT_CMPL );
+}
+#endif /*FF_DUAL_SIM*/
+
+
+#ifdef FF_CPHS_REL4
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMS                 |
+| STATE   : code                  ROUTINE : qAT_PercentCFIS          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the +CNUM AT command
+            which is responsible for reading the  subscriber number.
+
+            <mode>:   indicates whether reading starts or continues
+*/
+GLOBAL T_ACI_RETURN qAT_PercentCFIS ( T_ACI_CMD_SRC  srcId,
+                                      UBYTE index )
+{
+
+
+  TRACE_FUNCTION ("qAT_PercntCFIS()");
+
+ /*
+  *-------------------------------------------------------------------
+  * check command source
+  *-------------------------------------------------------------------
+  */
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
+    return( AT_FAIL );
+  }
+
+  /* Make sure everytime query is called ,CFISIndex 
+     must be initialised to ZERO 
+  */
+  CFISIndex = 0;
+
+  if(index EQ NOT_PRESENT_8BIT)
+  {
+    CFISIndex = 1;
+    index =1;
+  }
+  return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_CFIS, SIM_CFIS,
+                     index, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfCfis);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMS                 |
+| STATE   : code                  ROUTINE : qAT_PercentMWIS          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %MWIS AT command
+            which is responsible for reading the  MWIS records.
+*/
+
+GLOBAL T_ACI_RETURN qAT_PercentMWIS ( T_ACI_CMD_SRC  srcId,
+                                      UBYTE mspId )
+{
+
+  TRACE_FUNCTION ("qAT_PercntMWIS()");
+
+ /*
+  *-------------------------------------------------------------------
+  * check command source
+  *-------------------------------------------------------------------
+  */
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
+    return( AT_FAIL );
+  }
+
+  /* Make sure everytime query is called ,MWISIndex 
+     must be initialised to ZERO 
+  */
+  MWISIndex = 0;
+
+  if(mspId EQ NOT_PRESENT_8BIT)
+  {
+    MWISIndex = 1;
+    mspId =1;
+  }
+  return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_MWIS, SIM_MWIS,
+                     mspId, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfMwis);
+}
+
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMQ                 |
+| STATE   : code                  ROUTINE : qAT_PercentMBI           |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %MBI AT command
+            which is responsible for reading the  Mailbox Identifier.
+
+*/
+GLOBAL T_ACI_RETURN qAT_PercentMBI ( T_ACI_CMD_SRC  srcId,
+                                     UBYTE index )
+{
+
+  MBI_Index = 0;  /* Intialise the index value */
+
+  TRACE_FUNCTION ("qAT_PercntMBI()");
+
+ /*
+  *-------------------------------------------------------------------
+  * check command source
+  *-------------------------------------------------------------------
+  */
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
+    return( AT_FAIL );
+  }
+
+  /* If index not present then start reading from the first record
+     till the maximum record */
+  if (index EQ NOT_PRESENT_8BIT)
+  {
+    MBI_Index = 1;
+    index = 1;
+  }
+
+  return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_MBI, SIM_MBI,
+                     index, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfMbi);
+}
+/*
++--------------------------------------------------------------------+
+| PROJECT : GSM-PS (6147)         MODULE  : CMH_SIMQ                 |
+| STATE   : code                  ROUTINE : qAT_PercentMBDN          |
++--------------------------------------------------------------------+
+
+  PURPOSE : This is the functional counterpart to the %MBDN AT command
+            which is responsible for reading the  Mailbox number.
+
+*/
+GLOBAL T_ACI_RETURN qAT_PercentMBDN ( T_ACI_CMD_SRC  srcId,
+                                      UBYTE index )
+{
+
+
+  TRACE_FUNCTION ("qAT_PercntMBDN()");
+
+ /*
+  *-------------------------------------------------------------------
+  * check command source
+  *-------------------------------------------------------------------
+  */
+  if(!cmh_IsVldCmdSrc (srcId)) 
+  { 
+    ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter );
+    return( AT_FAIL );
+  }
+  return cmhSIM_ReadRecordEF (srcId, AT_CMD_P_MBDN, SIM_MBDN,
+                     index, NOT_PRESENT_8BIT, NULL, cmhSIM_RdCnfMbdn);
+}
+#endif/* FF_CPHS_REL4 */
+
+/*==== EOF ========================================================*/