FreeCalypso > hg > freecalypso-sw
diff gsm-fw/g23m-aci/aci/psa_satp.c @ 775:eedbf248bac0
gsm-fw/g23m-aci subtree: initial import from LoCosto source
author | Michael Spacefalcon <msokolov@ivan.Harhan.ORG> |
---|---|
date | Sun, 12 Oct 2014 01:45:14 +0000 |
parents | |
children | 4c476f4254c4 |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gsm-fw/g23m-aci/aci/psa_satp.c Sun Oct 12 01:45:14 2014 +0000 @@ -0,0 +1,670 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-PS (6147) +| Modul : PSA_SATP ++----------------------------------------------------------------------------- +| 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 defines the processing functions for the +| primitives send to the protocol stack adapter by the +| SIM application toolkit. ++----------------------------------------------------------------------------- +*/ + +#ifdef SIM_TOOLKIT + +#ifndef PSA_SATP_C +#define PSA_SATP_C +#endif + +#include "aci_all.h" + +/*==== INCLUDES ===================================================*/ +#include "aci_cmh.h" +#include "aci_mem.h" + +#ifdef FAX_AND_DATA +#include "aci_fd.h" +#endif /* of #ifdef FAX_AND_DATA */ + +#include "aci.h" +#include "psa.h" +#include "psa_cc.h" +#include "psa_sim.h" /* for simShrdPrm declaration */ +#include "psa_sat.h" +#include "psa_sms.h" +#include "cmh.h" +#include "cmh_sat.h" + +/*==== CONSTANTS ==================================================*/ + + +/*==== TYPES ======================================================*/ + + +/*==== EXPORT =====================================================*/ +UBYTE temp ; + +/*==== VARIABLES ==================================================*/ + +/*==== FUNCTIONS ==================================================*/ + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SATP | +| ROUTINE : psa_sim_toolkit_ind | ++-------------------------------------------------------------------+ + + PURPOSE : processes the SIM_TOOLKIT_IND primitive send by SIM. + this is an indication that a STK command was received. + +*/ + +GLOBAL void psa_sim_toolkit_ind + ( T_SIM_TOOLKIT_IND *sim_toolkit_ind ) +{ + T_ACI_SAT_TERM_RESP resp_data; + + TRACE_FUNCTION ("psa_sim_toolkit_ind()"); + +/* + *------------------------------------------------------------------- + * update shared parameter + *------------------------------------------------------------------- + */ + + satShrdPrm.stkCmdLen = sim_toolkit_ind -> stk_cmd.l_cmd; + satShrdPrm.stkCmd = sim_toolkit_ind -> stk_cmd.cmd; + + TRACE_EVENT_P1("%x", satShrdPrm.stkCmd[44] ); + + psaSAT_DumpCmd ( &sim_toolkit_ind -> stk_cmd ); + +/* + *------------------------------------------------------------------- + * decode SIM toolkit command + *------------------------------------------------------------------- + */ + CCD_START; + { + UBYTE ccdRet; + + MCAST( cmd, STK_CMD ); + memset( cmd, 0, sizeof( T_STK_CMD )); + + ccdRet = ccd_decodeMsg (CCDENT_SAT, + DOWNLINK, + (T_MSGBUF *) &sim_toolkit_ind -> stk_cmd, + (UBYTE *) _decodedMsg, + STK_CMD); + + if( ccdRet NEQ ccdOK OR !cmd->v_pas_cmd) + { + cmhSAT_STKCmdInd(); + } + else if( cmd->pas_cmd.v_cmd_details AND cmd->pas_cmd.v_dev_ids ) + { + /* store command details */ + satShrdPrm.cmdDet.cmdNr = cmd->pas_cmd.cmd_details.cmd_nr; + satShrdPrm.cmdDet.cmdType = cmd->pas_cmd.cmd_details.cmd_typ; + satShrdPrm.cmdDet.cmdQlf = cmd->pas_cmd.cmd_details.cmd_qlf; + + #ifdef TI_PS_FF_AT_P_CMD_CUST + if (simShrdPrm.overall_cust_mode EQ (UBYTE)CUST_MODE_BEHAVIOUR_1) + { + /* + ** Customised behaviour for the Cust1 MMI + */ + switch (cmd->pas_cmd.cmd_details.cmd_typ) + { + case SAT_CMD_SETUP_CALL: + case SAT_CMD_SEND_SMS: + case SAT_CMD_SEND_SS: + case SAT_CMD_SEND_USSD: + if (satShrdPrm.cust1StkCmd != (void *)0) + { + /* + ** The previous command has not been deleted. + */ + ACI_MFREE(satShrdPrm.cust1StkCmd); + + satShrdPrm.cust1StkCmd = (void *)0; + satShrdPrm.cust1StkCmdLen = 0; + } + + /* + ** Allocate memory to store the command + */ + ACI_MALLOC(satShrdPrm.cust1StkCmd, MAX_STK_CMD); + if (satShrdPrm.cust1StkCmd EQ (void *)0) + { + /* + ** Memory allocation has failed, return ME Unable to Process Cmd + */ + TRACE_EVENT("Memory Allocation Failure"); + psaSAT_InitTrmResp( &resp_data ); + psaSAT_SendTrmResp( RSLT_ME_UNAB_PROC, &resp_data ); + break; + } + + /* + ** Save the received data before proceeding + */ + memset(satShrdPrm.cust1StkCmd, 0, MAX_STK_CMD); + /* + ** stkCmdLen is the BIT length of the received data, so shift right 3 (divide by 8) + ** in order to get the BYTE length + */ + memcpy(satShrdPrm.cust1StkCmd, satShrdPrm.stkCmd, satShrdPrm.stkCmdLen >> 3); + satShrdPrm.cust1StkCmdLen = satShrdPrm.stkCmdLen; + + /* + ** Continue the processing as for normal behaviour, + ** special processing will be applied later + ** + ** No Break! + */ + /*lint -fallthrough */ + case SAT_CMD_EVENT_LIST: + /* + ** This command is processed normally + */ + if( !cmd->pas_cmd.v_cmd_prms OR !cmd->pas_cmd.cmd_prms.l_cmd_prms ) + { + TRACE_EVENT("no parameters in envelope"); + psaSAT_dasmMECmd( NULL ); + } + else + psaSAT_dasmMECmd( &cmd->pas_cmd.cmd_prms ); + break; + + case SAT_CMD_REFRESH: + /* + ** This command is to be forwarded to the MMI, for the user to be given the + ** chance to accept or reject the Refresh action. The user response will be + ** contained in a SATR Response indication, and we must be prepared to + ** process that indication in a different manner. + */ + satShrdPrm.cust1SimRefreshRespRqd = TRUE; + + /* + ** Forward the command to the MMI + */ + cmhSAT_STKCmdInd(); + break; + + default: + /* + ** If the command is handled by the MMI pass it up in a %SATI indication + */ + if (cmhSAT_IsStkCmdForMmi(cmd->pas_cmd.cmd_details.cmd_typ, + cmd->pas_cmd.cmd_details.cmd_qlf) EQ FALSE) + { + /* + ** Otherwise Determine whether the command is handled in the Modem Part + */ + switch (cmd->pas_cmd.cmd_details.cmd_typ) + { + case( SAT_CMD_SEND_DTMF ): + case( SAT_CMD_RUN_AT ): + case( SAT_CMD_LAUNCH_BROWSER ): + case (SAT_CMD_PROV_LOC_INFO): + #ifdef FF_SAT_E + case( SAT_CMD_OPEN_CHANNEL ): + #endif /* FF_SAT_E */ + if( !cmd->pas_cmd.v_cmd_prms OR !cmd->pas_cmd.cmd_prms.l_cmd_prms ) + { + TRACE_EVENT("no parameters in envelope"); + psaSAT_dasmMECmd( NULL ); + } + else + psaSAT_dasmMECmd( &cmd->pas_cmd.cmd_prms ); + break; + #ifdef FF_SAT_E + /* special handling for CLOSE CHANNEL, no further decoding required. + all that is needed can be found in device identities */ + case( SAT_CMD_CLOSE_CHANNEL ): + + cmhSAT_CloseChannel(); + + break; + + /* special handling for SEND DATA, no further decoding required. + all that is needed can be found in command details */ + case( SAT_CMD_SEND_DATA ): + cmhSAT_SendData(); + break; + + /* special handling for GET CHANNEL STATUS, no further decoding required */ + case( SAT_CMD_GET_CHANNEL_STATUS ): + cmhSAT_GetChannelStatus(); + break; + + /* special handling for RECEIVE DATA, no further decoding required */ + case( SAT_CMD_RECEIVE_DATA ): + cmhSAT_STKUsrNtfy(); + break; + #endif /* FF_SAT_E */ + + /* + ** If the command is not handled by the Modem Part, return a "Beyond ME + ** Capabilities" response to the SIM Entity. + */ + default: + TRACE_EVENT("Unable to handle command"); + psaSAT_InitTrmResp( &resp_data ); + psaSAT_SendTrmResp( RSLT_ME_CAP, &resp_data ); + } + } + } + } + else + #endif /* TI_PS_FF_AT_P_CMD_CUST */ + { + /* if command is addressed to ACI */ + switch( cmd->pas_cmd.cmd_details.cmd_typ ) + { + case( SAT_CMD_SETUP_CALL ): + case( SAT_CMD_SEND_SS ): + case( SAT_CMD_SEND_SMS ): + case( SAT_CMD_SEND_USSD ): + case( SAT_CMD_SEND_DTMF ): + case( SAT_CMD_EVENT_LIST ): + case( SAT_CMD_RUN_AT ): + case( SAT_CMD_LAUNCH_BROWSER ): + case (SAT_CMD_PROV_LOC_INFO): + #ifdef FF_SAT_E + case( SAT_CMD_OPEN_CHANNEL ): + #endif /* FF_SAT_E */ + if( !cmd->pas_cmd.v_cmd_prms OR !cmd->pas_cmd.cmd_prms.l_cmd_prms ) + { + TRACE_EVENT("no parameters in envelope"); + psaSAT_dasmMECmd( NULL ); + } + else + psaSAT_dasmMECmd( &cmd->pas_cmd.cmd_prms ); + break; + #ifdef FF_SAT_E + /* special handling for CLOSE CHANNEL, no further decoding required. + all that is needed can be found in device identities */ + case( SAT_CMD_CLOSE_CHANNEL ): + /* Channel Id invalid */ + temp = (UBYTE) cmd->pas_cmd.dev_ids.dest_dev; + if ( (CHANNEL_ID_1 NEQ (UBYTE)(temp & 0x0f)) OR ( satShrdPrm.chnTb.lnkStat EQ SIM_NO_LINK ) ) + { + /* Close Channel with an invalid channel identifier */ + psaSAT_InitTrmResp( &resp_data ); + resp_data.chnStat = FALSE; + resp_data.add_content = ADD_BIP_CHANID_NT_VLD; + psaSAT_SendTrmResp( RSLT_BEARIND_PERR, &resp_data ); + } + else + { + cmhSAT_CloseChannel(); + } + break; + + /* special handling for SEND DATA, no further decoding required. + all that is needed can be found in command details */ + case( SAT_CMD_SEND_DATA ): + + /* Channel Id invalid */ + temp = (UBYTE) cmd->pas_cmd.dev_ids.dest_dev; + if ( (CHANNEL_ID_1 NEQ (UBYTE)(temp & 0x0f)) OR ( satShrdPrm.chnTb.lnkStat EQ SIM_NO_LINK ) ) + { + /* Close Channel with an invalid channel identifier */ + psaSAT_InitTrmResp( &resp_data ); + resp_data.chnStat = FALSE; + resp_data.add_content = ADD_BIP_CHANID_NT_VLD; + psaSAT_SendTrmResp( RSLT_BEARIND_PERR, &resp_data ); + } + else + { + + cmhSAT_SendData(); + } + break; + + /* special handling for GET CHANNEL STATUS, no further decoding required */ + case( SAT_CMD_GET_CHANNEL_STATUS ): + + cmhSAT_GetChannelStatus(); + break; + + /* special handling for RECEIVE DATA, no further decoding required */ + case( SAT_CMD_RECEIVE_DATA ): + + cmhSAT_STKUsrNtfy(); + break; + #endif /* FF_SAT_E */ + /* otherwise pass command to user */ + default: + cmhSAT_STKCmdInd(); + } + } + } + else + { + /* respond with "error, required values are missing" */ + TRACE_EVENT("parameters are missing"); + psaSAT_InitTrmResp( &resp_data ); + psaSAT_SendTrmResp( RSLT_ERR_REQ_VAL, &resp_data ); + } + } + CCD_END; + +/* + *------------------------------------------------------------------- + * free the primitive buffer + *------------------------------------------------------------------- + */ + PFREE (sim_toolkit_ind); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SATP | +| ROUTINE : psa_sim_toolkit_cnf | ++-------------------------------------------------------------------+ + + PURPOSE : processes the SIM_TOOLKIT_CNF primitive send by SIM. + this is a confirmation to a previous STK command. + +*/ + +GLOBAL void psa_sim_toolkit_cnf( T_SIM_TOOLKIT_CNF *sim_toolkit_cnf ) +{ + void *p = NULL; + BOOL SIM_error = FALSE; + BOOL not_allw = FALSE; + BOOL allw = FALSE; + void *p_allw = NULL; + UBYTE *p_v_allw = NULL; + void *p_not_allw = NULL; + UBYTE *p_v_not_allw = NULL; + void *p_allw_mdfy = NULL; + UBYTE *p_v_allw_mdfy = NULL; + SHORT StructSize = 0; + UBYTE DynEnv = '\0'; + + TRACE_FUNCTION ("psa_sim_toolkit_cnf()"); +/* + *------------------------------------------------------------------- + * update shared parameter + *------------------------------------------------------------------- + */ + satShrdPrm.stkCmdLen = sim_toolkit_cnf -> stk_cmd.l_cmd; + satShrdPrm.stkCmd = sim_toolkit_cnf -> stk_cmd.cmd; + satShrdPrm.stkError = sim_toolkit_cnf -> cause; + + psaSAT_DumpCmd ( &sim_toolkit_cnf -> stk_cmd ); + +/* + *------------------------------------------------------------------- + * if request was invoked by MMI pass reply to MMI + *------------------------------------------------------------------- + */ + if( sim_toolkit_cnf -> req_id EQ SRQ_MMI ) + { + cmhSAT_STKCmdCnf(); + } + +/* + *------------------------------------------------------------------- + * if request was invoked by ACI decode envelope command result + *------------------------------------------------------------------- + */ + else if( sim_toolkit_cnf -> req_id EQ SRQ_ACI ) + { + if( sim_toolkit_cnf -> stk_cmd.l_cmd EQ 0 OR + sim_toolkit_cnf -> cause EQ SIM_CAUSE_SAT_BUSY) + { + SIM_error = TRUE; + + switch ( sim_toolkit_cnf -> cause ) + { + case SIM_CAUSE_OTHER_ERROR: + case SIM_CAUSE_SAT_BUSY: + case SIM_CAUSE_CARD_REMOVED: + case SIM_CAUSE_PIN1_EXPECT: + case SIM_CAUSE_PIN1_BLOCKED: + case SIM_CAUSE_PUK1_EXPECT: + case SIM_CAUSE_PUK1_BLOCKED: + case SIM_CAUSE_PIN2_EXPECT: + case SIM_CAUSE_PIN2_BLOCKED: + case SIM_CAUSE_PUK2_EXPECT: + case SIM_CAUSE_PUK2_BLOCKED: + /* in case of certain errors, assume not allowed */ + not_allw = TRUE; + sim_toolkit_cnf -> stk_cmd.cmd[0] = CCR_NOT_ALLW; + break; + + default: + /* in case of a positive result without further info, + assume allowed not modified */ + allw = TRUE; + sim_toolkit_cnf -> stk_cmd.cmd[0] = CCR_ALLW_NO_MDFY; + break; + } + sim_toolkit_cnf -> stk_cmd.cmd[1] = 0; /* no extra TLVs */ + satShrdPrm.stkCmdLen = 2<<3; /* 2 bytes result */ + } + + else + { + SIM_error = FALSE; + } + + + { + CCD_START; + { + UBYTE ccdRet; + MCAST( env, ENV_RES ); + MCAST( smc_env, ENV_RES_SMC ); + + switch( satShrdPrm.SIMCCParm.ccAct ) + { + case( CC_ACT_CAL ): + case( CC_ACT_SS ): + case( CC_ACT_USSD ): + memset( env, 0, sizeof( T_ENV_RES )); + p_v_not_allw = &env->v_ccr_not_allw; + p_v_allw = &env->v_ccr_allw; + p_v_allw_mdfy = &env->v_ccr_allw_mdfy; + p_not_allw = &env->ccr_not_allw; + p_allw = &env->ccr_allw; + p_allw_mdfy = &env->ccr_allw_mdfy; + DynEnv = ENV_RES; + break; + case( SMC_ACT_MO ): + memset( smc_env, 0, sizeof( T_ENV_RES_SMC )); + p_v_not_allw = &smc_env->v_smcr_not_allw; + p_v_allw = &smc_env->v_smcr_allw; + p_v_allw_mdfy = &smc_env->v_smcr_allw_mdfy; + p_not_allw = &smc_env->smcr_not_allw; + p_allw = &smc_env->smcr_allw; + p_allw_mdfy = &smc_env->smcr_allw_mdfy; + DynEnv = ENV_RES_SMC; + break; + } + + if (SIM_error) + { + if(p_v_not_allw AND p_v_allw) /* To avoid the NULL poiner usage, 613 lint warning */ + { + *p_v_not_allw = not_allw; + *p_v_allw = allw; + } + } + /* otherwise decode message */ + else + { + ccdRet = ccd_decodeMsg (CCDENT_SAT, + DOWNLINK, + (T_MSGBUF *) &sim_toolkit_cnf -> stk_cmd, + (UBYTE *) _decodedMsg, + DynEnv ); + + if( ccdRet NEQ ccdOK ) + { + /* in case of a result failure, pretend allowed not modified */ + if(p_v_not_allw AND p_v_allw AND p_v_allw_mdfy) /* To avoid the NULL poiner usage, 613 lint warning */ + + { + if( psaSAT_ccdErrChk() NEQ 0 AND + (!(*p_v_allw) AND !(*p_v_not_allw) AND !(*p_v_allw_mdfy))) + { + memset( env, 0, StructSize ); + *p_v_allw = TRUE; + sim_toolkit_cnf -> stk_cmd.cmd[0] = CCR_ALLW_NO_MDFY; + sim_toolkit_cnf -> stk_cmd.cmd[1] = 0; + satShrdPrm.stkCmdLen = 2<<3; /* 2 bytes result */ + } + } + } + } + + /* process result */ + if(p_v_not_allw AND p_v_allw AND p_v_allw_mdfy) /* To avoid the NULL poiner usage, 613 lint warning */ + + { + if ( *p_v_allw ) p = p_allw; + else if( *p_v_not_allw ) p = p_not_allw; + else if( *p_v_allw_mdfy ) p = p_allw_mdfy; + + + satShrdPrm.ntfy = USR_NTF_CC_SIM; + cmhSAT_STKUsrNtfy(); + + switch( satShrdPrm.SIMCCParm.ccAct ) + { + case( CC_ACT_CAL ): + + if( cmhSAT_ResCalCntrlBySIM( sim_toolkit_cnf -> stk_cmd.cmd, p )) + { + /* keep primitive for terminal response */ + satShrdPrm.stkCnfPrim = sim_toolkit_cnf; + CCD_END; + return; + } + break; + + case( CC_ACT_SS ): + + if( cmhSAT_ResSSCntrlBySIM( sim_toolkit_cnf -> stk_cmd.cmd, p )) + { + /* keep primitive for terminal response */ + satShrdPrm.stkCnfPrim = sim_toolkit_cnf; + CCD_END; + return; + } + break; + + case( CC_ACT_USSD ): + + if( cmhSAT_ResUSSDCntrlBySIM( sim_toolkit_cnf -> stk_cmd.cmd, p )) + { + /* keep primitive for terminal response */ + /*satShrdPrm.stkCnfPrim = sim_toolkit_cnf;*/ + CCD_END; + return; + } + break; + + case( SMC_ACT_MO ): + if( cmhSAT_ResSMCntrlBySIM( sim_toolkit_cnf -> stk_cmd.cmd, p )) + { + /* keep primitive for terminal response */ + /*satShrdPrm.stkCnfPrim = sim_toolkit_cnf;*/ + CCD_END; + return; + } + break; + + default: + TRACE_EVENT("UNEXP CC ACTION IN SAT PARMS"); + break; + } + } + } + satShrdPrm.SIMCCParm.ccAct = NO_CC_ACT; + CCD_END; + } + } + +/* + *------------------------------------------------------------------- + * free the primitive buffer + *------------------------------------------------------------------- + */ + PFREE (sim_toolkit_cnf); + +} + +/* ++-------------------------------------------------------------------+ +| PROJECT : GSM-PS (6147) MODULE : PSA_SATP | +| ROUTINE : psa_sim_file_update_ind | ++-------------------------------------------------------------------+ + + PURPOSE : processes the FILE_UPDATE_IND primitive send by SIM. + It provides a list of updated EFs. + +*/ + +GLOBAL void psa_sim_file_update_ind + ( T_SIM_FILE_UPDATE_IND *sim_file_update_ind ) +{ + SHORT i; + BOOL send_confirm_now=TRUE; + + TRACE_FUNCTION ("psa_sim_file_update_ind()"); + +/* + *------------------------------------------------------------------- + * store the primitive and start processing + *------------------------------------------------------------------- + */ + satShrdPrm.fu_ind = sim_file_update_ind; + + /* + * Broadcast %SIMEF unsolicited event to all interested parties. + */ + for(i=CMD_SRC_LCL;i<CMD_SRC_MAX;i++) + { + if (simShrdPrm.SIMEFMode[i] EQ SIMEF_MODE_ON) + { + /* + * As we have reported the EF update, it is not now the + * responsibility of this function to send the response + * immediately. + */ + send_confirm_now=FALSE; + + R_AT(RAT_P_SIMEF,(T_ACI_CMD_SRC)i)(sim_file_update_ind); + + } + } + + /* + * If we didn't report the EF update to anyone we must send + * the response now. + */ + if (send_confirm_now NEQ FALSE) + psaSAT_FUConfirm (-1, NOT_PRESENT_16BIT); +} + +#endif /* #ifdef SIM_TOOLKIT */ + +/*==== EOF =========================================================*/