etm_audio.c: fix off-by-one error in auw of FIR coefficients
This fix was already made in FC Tourmaline a while back, but it is also
the kind of bugfix that deserves to be backported to Magnetite and
Selenite as well.
line source
+ − /*
+ − +-----------------------------------------------------------------------------
+ − | Project : GSM-F&D (8411)
+ − | Modul : SIM_FKT
+ − +-----------------------------------------------------------------------------
+ − | 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 modul defines the wrapping functions for the
+ − | SIM application.
+ − +-----------------------------------------------------------------------------
+ − */
+ −
+ − #ifndef SIM_FKT_C
+ − #define SIM_FKT_C
+ −
+ − #define ENTITY_SIM
+ −
+ − /*==== INCLUDES ===================================================*/
+ −
+ − #include <string.h>
+ − #include "typedefs.h"
+ − #include "pconst.cdg"
+ − #include "message.h"
+ − #include "ccdapi.h"
+ − #include "vsi.h"
+ − #include "custom.h"
+ − #include "gsm.h"
+ − #include "cnf_sim.h"
+ − #include "mon_sim.h"
+ − #include "prim.h"
+ − #include "pei.h"
+ − #include "tok.h"
+ − #include "sim.h"
+ − #include "sim_em.h"
+ −
+ − /*==== EXPORT =====================================================*/
+ − #ifdef _SIMULATION_
+ − LOCAL USHORT first_time_into_fkt_select = TRUE;
+ − LOCAL USHORT file_id;
+ − #endif
+ − GLOBAL USHORT stk_l_cmd = 0;
+ −
+ −
+ − /*==== PRIVAT =====================================================*/
+ −
+ − /*==== VARIABLES ==================================================*/
+ −
+ − /*==== FUNCTIONS ===================================================*/
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_check_pin_count |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : PIN/PUK count is checked for secret code initialisation.
+ − count is set to zero, if not initialised, otherwise the
+ − initialisation flag (most significant bit) is reset.
+ − */
+ −
+ − GLOBAL UBYTE FKT_check_pin_count (UBYTE count)
+ − {
+ − if ((count & 0x80) EQ 0)
+ − return 0;
+ −
+ − return count & 0x0F;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_convert_error |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Converts sw1 and sw2 to an unique error code for the
+ − SIM application.
+ −
+ − */
+ −
+ − /*
+ − * PIN/PUK is wrong, remaining attempts
+ − */
+ − const static USHORT sim_inv_chv_A [6] =
+ − {
+ − /* last requested PIN no error code */
+ − /* none */ SIM_CAUSE_OTHER_ERROR,
+ − /* PIN 1 */ SIM_CAUSE_PIN1_EXPECT,
+ − /* PIN 2 */ SIM_CAUSE_PIN2_EXPECT,
+ − /* PUK 1 */ SIM_CAUSE_PUK1_EXPECT,
+ − /* PUK 2 */ SIM_CAUSE_PUK2_EXPECT,
+ − /* NEVER */ SIM_CAUSE_ACCESS_PROHIBIT
+ − };
+ −
+ −
+ − /*
+ − * PIN/PUK is wrong, no remaining attempts
+ − */
+ − const static USHORT sim_inv_chv_B [6] =
+ − {
+ − /* last requested PIN no error code */
+ − /* none */ SIM_CAUSE_OTHER_ERROR,
+ − /* PIN 1 */ SIM_CAUSE_PIN1_BLOCKED,
+ − /* PIN 2 */ SIM_CAUSE_PIN2_BLOCKED,
+ − /* PUK 1 */ SIM_CAUSE_PUK1_BLOCKED,
+ − /* PUK 2 */ SIM_CAUSE_PUK2_BLOCKED,
+ − /* NEVER */ SIM_CAUSE_OTHER_ERROR
+ − };
+ −
+ − GLOBAL USHORT FKT_convert_error (USHORT sw1sw2, USHORT size)
+ − {
+ − TRACE_FUNCTION ("FKT_convert_error()");
+ −
+ − sim_data.sw1 = (UBYTE)(sw1sw2 >> 8);
+ − sim_data.sw2 = (UBYTE)sw1sw2;
+ −
+ − TRACE_EVENT_P2 ("SW1=%02X SW2=%02X", sim_data.sw1, sim_data.sw2);
+ −
+ − switch (sim_data.sw1)
+ − {
+ − case 0x00:
+ − /*
+ − * SIM driver error
+ − */
+ − if (SIM_IS_FLAG_CLEARED(SIM_INSERT))
+ − {
+ − return SIM_CAUSE_CARD_REMOVED;
+ − }
+ − if (sim_data.sw2 EQ 14)
+ − {
+ − SIM_SET_FLAG(DRV_FAILED_RETRY);
+ − return SIM_CAUSE_DRV_TEMPFAIL;
+ − }
+ − return CAUSE_MAKE(DEFBY_CONDAT, ORIGSIDE_MS, SIM_ORIGINATING_ENTITY, sim_data.sw2);
+ − #if defined SIM_TOOLKIT
+ − case 0x9E:
+ − /*
+ − * use SW2 as length indicator for
+ − * the following get response
+ − */
+ − if (sim_data.sim_phase >= 3) /* Phase 2+ or higher */
+ − {
+ − if (sim_data.stk_profile[0] & SAT_TP1_9E_XX)
+ − {
+ − sim_data.sim_data_len = (sim_data.sw2 EQ 0)? 0x100: (USHORT)sim_data.sw2;
+ − return SIM_CAUSE_DNL_ERROR;
+ − }
+ − else
+ − return SIM_CAUSE_SAT_BUSY;
+ − }
+ − else
+ − return SIM_CAUSE_OTHER_ERROR;
+ − case 0x93:
+ − if (sim_data.sim_phase >= 3) /* Phase 2+ or higher */
+ − {
+ − return SIM_CAUSE_SAT_BUSY;
+ − }
+ − else
+ − return SIM_CAUSE_OTHER_ERROR;
+ − case 0x91:
+ − if (sim_data.sim_phase >= 3) /* Phase 2+ or higher */
+ − {
+ − sim_data.proactive_sim_data_len = (sim_data.sw2 EQ 0)? 0x100: (SHORT)sim_data.sw2;
+ − return SIM_NO_ERROR;
+ − }
+ − else
+ − return SIM_CAUSE_OTHER_ERROR;
+ − #endif
+ − case 0x92:
+ − if (sim_data.sw2 > 0xF)
+ − {
+ − #ifdef REL99
+ − if (sim_data.sw2 EQ SW2_MEMORY_PROBLEM)
+ − {
+ − return SIM_CAUSE_MEM_PROBLEM;
+ − }
+ − #endif /* end of ifdef REL99 */
+ − return SIM_CAUSE_OTHER_ERROR;
+ − }
+ − /* no break (otherwise the command was successful) */
+ − case 0x90:
+ − if( (size >= 0) AND (size <= 0x100) )
+ − {
+ − sim_data.sim_data_len = size;
+ − TRACE_EVENT_P1 ("sim_data.sim_data_len updated size =%X ", size);
+ − }
+ − return SIM_NO_ERROR;
+ − case 0x9F:
+ − /*
+ − * use SW2 as length indicator for
+ − * the following get response
+ − */
+ − sim_data.sim_data_len = (sim_data.sw2 EQ 0)? 0x100: (USHORT)sim_data.sw2;
+ − return SIM_NO_ERROR;
+ −
+ − case 0x94:
+ − switch (sim_data.sw2)
+ − {
+ − case 0:
+ − return SIM_CAUSE_NO_SELECT;
+ − case 2:
+ − return SIM_CAUSE_ADDR_WRONG;
+ − case 4:
+ − return SIM_CAUSE_UNKN_FILE_ID;
+ − case 8:
+ − return SIM_CAUSE_CMD_INCONSIST;
+ − default:
+ − break;
+ − }
+ − break;
+ −
+ − case 0x98:
+ − TRACE_EVENT_P1 ("LRP = %d", (int)sim_data.last_requested_pin_no);
+ −
+ − switch (sim_data.sw2)
+ − {
+ − case 2:
+ − return SIM_CAUSE_CHV_NOTSET;
+ − case 8:
+ − return SIM_CAUSE_CHV_VALIDATED;
+ − case 0x10:
+ − return SIM_CAUSE_EF_INVALID; /* contradiction cases */
+ − case 4:
+ − return sim_inv_chv_A [sim_data.last_requested_pin_no];
+ − case 0x40:
+ − return sim_inv_chv_B [sim_data.last_requested_pin_no];
+ − case 0x50:
+ − return SIM_CAUSE_MAX_INCREASE;
+ − default:
+ − break;
+ − }
+ − break;
+ − }
+ −
+ − return SIM_CAUSE_OTHER_ERROR;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_ChangeCHV |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_ChangeCHV.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_ChangeCHV (UBYTE * old_pin,
+ − UBYTE * new_pin,
+ − UBYTE pin_id)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_ChangeCHV()");
+ −
+ − sw1sw2 = SIM_ChangeCHV ((UBYTE *)response,
+ − (UBYTE *)old_pin,
+ − (UBYTE *)new_pin,
+ − (UBYTE)pin_id,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_DisableCHV |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_DisableCHV.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_DisableCHV (UBYTE * pin)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_DisableCHV()");
+ −
+ − sw1sw2 = SIM_DisableCHV ((UBYTE *)response,
+ − (UBYTE *)pin,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_EnableCHV |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_EnableCHV.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_EnableCHV (UBYTE * pin)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_EnableCHV()");
+ −
+ − sw1sw2 = SIM_EnableCHV ((UBYTE *)response,
+ − (UBYTE *)pin,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_GetResponse |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_GetResponse.
+ −
+ − */
+ − GLOBAL USHORT FKT_GetResponse (UBYTE * data,
+ − USHORT len)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ −
+ − TRACE_FUNCTION ("FKT_GetResponse()");
+ −
+ − sw1sw2 = SIM_GetResponse ((UBYTE *)data,
+ − len,
+ − &size);
+ − return FKT_convert_error (sw1sw2, len);
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_Increase |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Increase.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_Increase (UBYTE * data)
+ − {
+ − USHORT sw1sw2;
+ − USHORT size = 0;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_Increase()");
+ − sw1sw2 = SIM_Increase ((UBYTE *)response,
+ − (UBYTE *)data,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_Invalidate |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Invalidate.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_Invalidate (void)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_Invalidate()");
+ −
+ − sw1sw2 = SIM_Invalidate ((UBYTE *)response,
+ − &size);
+ −
+ − if (sw1sw2 EQ 0x9810) /* already invalidated */
+ − return SIM_NO_ERROR;
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_ReadBinary |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_ReadBinary.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_ReadBinary (UBYTE * data,
+ − USHORT offset,
+ − USHORT length)
+ − {
+ − USHORT sw1sw2;
+ − USHORT size = 0;
+ −
+ − TRACE_FUNCTION ("FKT_ReadBinary()");
+ −
+ − sw1sw2= SIM_ReadBinary ((UBYTE *)data,
+ − offset,
+ − length,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_ReadRecord |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_ReadRecord.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_ReadRecord (UBYTE * data,
+ − UBYTE mode,
+ − USHORT record,
+ − USHORT length)
+ − {
+ − USHORT sw1sw2;
+ − USHORT size = 0;
+ −
+ − #if !defined NTRACE
+ − char buf[48];
+ − sprintf (buf, "FKT_ReadRecord(): Nr. %hu", record);
+ − TRACE_FUNCTION (buf);
+ − #endif
+ −
+ − sw1sw2 = SIM_ReadRecord ((UBYTE *)data,
+ − (UBYTE)mode,
+ − (UBYTE)record,
+ − length,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_Rehabilitate |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Rehabilitate.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_Rehabilitate (void)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_Rehabilitate()");
+ −
+ − sw1sw2 = SIM_Rehabilitate ((UBYTE *)response,
+ − &size);
+ −
+ − if (sw1sw2 EQ 0x9810) /* already rehabilitated */
+ − return SIM_NO_ERROR;
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_Status |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Status.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_Status (UBYTE * pin_cnt,
+ − UBYTE * pin2_cnt,
+ − UBYTE * puk_cnt,
+ − UBYTE * puk2_cnt)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ −
+ − USHORT cause;
+ − USHORT fileid;
+ − union
+ − {
+ − T_DIR_STATUS status;
+ − UBYTE response [40];
+ − } dir;
+ −
+ − TRACE_FUNCTION ("FKT_Status()");
+ −
+ − memset (dir.response, 0, sizeof(dir.response));
+ −
+ − sw1sw2 = SIM_Status_Extended (dir.response,
+ − sim_data.dir_status_len, &size);
+ −
+ − cause = FKT_convert_error (sw1sw2, size);
+ −
+ − *pin_cnt = 0;
+ − *puk_cnt = 0;
+ − *pin2_cnt = 0;
+ − *puk2_cnt = 0;
+ −
+ − if (cause EQ SIM_NO_ERROR)
+ − {
+ − /*
+ − * Check file id on active call: if different from last directory
+ − * indicate failure during SIM Presence Detection (27.20).
+ − * A selection of a non-existent DF (possible with SIM_ACCESS_REQ)
+ − * leads to the loss of the current DF: this confuses the SIM
+ − * Presence Detection, therefore the validity of the actual DF
+ − * stored in 'sim_data.act_directory' must be considered.
+ − */
+ − fileid = (dir.status.fileid[0] << 8) | dir.status.fileid[1];
+ −
+ − if (SIM_IS_FLAG_SET (CALL_ACTIVE) AND /* call active */
+ − sim_data.act_directory NEQ NOT_PRESENT_16BIT /* actual DF known? */
+ − AND fileid NEQ sim_data.act_directory) /* compare DF */
+ − return SIM_CAUSE_CARD_REMOVED;
+ − else
+ − {
+ − if (SIM_TI_DRV_X_BYTES > 0) /* discard SW1, SW2 from response! */
+ − memset (&dir.response[sim_data.dir_status_len], 0, SIM_TI_DRV_X_BYTES);
+ − /*
+ − * Directory status is available
+ − */
+ − *pin_cnt = FKT_check_pin_count (dir.status.pinstatus);
+ − *puk_cnt = FKT_check_pin_count (dir.status.unbstatus);
+ − *pin2_cnt = FKT_check_pin_count (dir.status.pin2status);
+ − *puk2_cnt = FKT_check_pin_count (dir.status.unb2status);
+ − }
+ − }
+ − return cause;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_RunGSMAlgo |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_RunGSMAlgo.
+ −
+ − */
+ − GLOBAL USHORT FKT_RunGSMAlgo (UBYTE * rand, UBYTE * data, USHORT len)
+ − {
+ − UBYTE response[4];
+ − USHORT sw1sw2;
+ − USHORT error;
+ − USHORT size = 0;
+ −
+ − TRACE_FUNCTION ("FKT_RunGSMAlgo()");
+ −
+ − sw1sw2 = SIM_RunGSMAlgo ((UBYTE *)response,
+ − (UBYTE *)rand,
+ − &size);
+ −
+ − error = FKT_convert_error (sw1sw2, size);
+ −
+ − if (error EQ SIM_NO_ERROR)
+ − error = FKT_GetResponse (data, len);
+ −
+ − return error;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_Select |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Select.
+ −
+ − */
+ − LOCAL USHORT fkt_select_one (USHORT id, UBYTE * data, USHORT len)
+ − {
+ −
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − USHORT error;
+ − UBYTE response[4];
+ −
+ − sw1sw2 = SIM_Select (id,
+ − (UBYTE *)response,
+ − &size);
+ −
+ −
+ − error = FKT_convert_error (sw1sw2, size);
+ −
+ − if (error EQ SIM_NO_ERROR)
+ − {
+ − if( (data NEQ NULL )
+ − AND (len NEQ 0 )
+ − #ifdef _SIMULATION_
+ − AND (id EQ file_id)
+ − #endif
+ − )
+ − {
+ − #ifdef _SIMULATION_
+ − len = (sim_data.sim_data_len < len)?
+ − sim_data.sim_data_len: len;
+ − first_time_into_fkt_select = TRUE;
+ − #endif
+ −
+ − error = FKT_GetResponse (data, sim_data.sim_data_len);
+ − }
+ − }
+ −
+ − return error;
+ −
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : sim_select_df |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Function to select the directory given the path.
+ −
+ − */
+ − LOCAL USHORT sim_select_df(U16 dir_level,UBYTE *data,USHORT len)
+ − {
+ − USHORT result = SIM_NO_ERROR;
+ −
+ − result = fkt_select_one (dir_level, data, len);
+ − if (result NEQ SIM_NO_ERROR)
+ − {
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − }
+ − else
+ − {
+ − sim_data.act_directory = dir_level;
+ − }
+ − return result;
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_Select |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Select.
+ −
+ − */
+ − GLOBAL USHORT FKT_Select (USHORT id,
+ − BOOL path_info_present, T_path_info * path_info_ptr,
+ − UBYTE * data, USHORT len)
+ − {
+ − USHORT result;
+ − USHORT directory = (SIM_IS_FLAG_SET (GSM_DATAFIELD))?
+ − SIM_DF_GSM: SIM_DF_1800; /* default parent directory */
+ −
+ − #if !defined NTRACE
+ − char buf[32];
+ −
+ − sprintf (buf, "FKT_Select(): id = %04X", id);
+ − TRACE_FUNCTION (buf);
+ − #endif
+ −
+ − #ifdef _SIMULATION_
+ − if( (first_time_into_fkt_select EQ TRUE ) AND
+ − (data NEQ NULL) AND (len NEQ 0) )
+ − file_id = id;
+ − #endif
+ −
+ −
+ − switch (id & 0xFF00) /* selecting DF deselects EF */
+ − {
+ − case 0x3F00:
+ − case 0x7F00:
+ − case 0x5F00:
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − break;
+ − }
+ −
+ − if( path_info_present NEQ FALSE )
+ − {
+ − if((sim_data.act_directory & 0xFF00) NEQ 0x5F00 AND
+ − sim_data.act_directory NEQ NOT_PRESENT_16BIT)
+ − {
+ − /* Currently selected df is MF or a first level directory */
+ − if(sim_data.act_directory NEQ path_info_ptr->df_level1)
+ − {
+ − result = sim_select_df(path_info_ptr->df_level1,data,len);
+ − if(result NEQ SIM_NO_ERROR)
+ − return result;
+ − }
+ − }
+ − /* Currently selected df is a second level directory */
+ − else
+ − {
+ − result = sim_select_df(SIM_MF,data,len);
+ − if(result NEQ SIM_NO_ERROR)
+ − return result;
+ − result = sim_select_df(path_info_ptr->df_level1,data,len);
+ − if(result NEQ SIM_NO_ERROR)
+ − return result;
+ − }
+ − if(path_info_ptr->v_df_level2)
+ − {
+ − result = sim_select_df(path_info_ptr->df_level2,data,len);
+ − if(result NEQ SIM_NO_ERROR)
+ − return result;
+ − }
+ − result = fkt_select_one (id, data, len);
+ − if (result NEQ SIM_NO_ERROR)
+ − {
+ −
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − }
+ − else
+ − {
+ − sim_data.act_field = id;
+ − }
+ − return result;
+ − }
+ − else
+ − {
+ − switch (id)
+ − {
+ − case SIM_MF:
+ − result = fkt_select_one (SIM_MF, data, len);
+ − if (result NEQ SIM_NO_ERROR)
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − else
+ − {
+ − sim_data.dir_status_len = sim_data.sim_data_len;
+ − sim_data.act_directory = id;
+ − }
+ − return result;
+ −
+ − default:
+ − /* All the standard defined EFs would be handled before coming to this
+ − * point. Complete path information should be given for non-standard 2nd level EFs
+ − * and they also would be handled before coming to this point.
+ − * This statement will be hit for non-standard files
+ − * without path information. Hence returning error */
+ − return SIM_CAUSE_UNKN_FILE_ID;
+ − break; /* any other elementary file */
+ −
+ − /* continue here in case of any first level directory */
+ − case SIM_DF_GSM:
+ − case SIM_DF_1800:
+ − case SIM_DF_TELECOM:
+ − case SIM_DF_VI:
+ − case SIM_DF_ORANGE:
+ − if (sim_data.act_directory EQ id)
+ − return SIM_NO_ERROR; /* already selected */
+ − else
+ − {
+ − /* If current directory has not been selected or it is a
+ − 2nd level and under another 1st level DF */
+ − if (((sim_data.act_directory & 0xFF00) EQ 0x5F00 AND
+ − ! SIM_IS_DF_LEVEL2_UNDER_DF_LEVEL1(sim_data.act_directory,id))
+ − OR sim_data.act_directory EQ NOT_PRESENT_16BIT)
+ − { /* MF has to be selected first */
+ − result = sim_select_df(SIM_MF,data,len);
+ − if(result NEQ SIM_NO_ERROR)
+ − return result;
+ − }
+ − result = fkt_select_one (id, data, len);
+ − if (result NEQ SIM_NO_ERROR)
+ − {
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − }
+ − else
+ − {
+ − sim_data.dir_status_len = sim_data.sim_data_len;
+ − sim_data.act_directory = id;
+ − }
+ − return result;
+ − }
+ − case SIM_DF_GRAPHICS:
+ − directory = SIM_DF_TELECOM; /* parent directory */
+ − /* no break */
+ − /*lint -fallthrough*/
+ − case SIM_DF_SOLSA:
+ − case SIM_DF_MEXE:
+ − if (sim_data.act_directory EQ id)
+ − return SIM_NO_ERROR; /* already selected */
+ −
+ − if (sim_data.act_directory NEQ directory)
+ − { /* not the parent directory */
+ − /* If current directory is MF or first level OR if the 2nd level
+ − directory is under another 1st level df, select the parent directory */
+ − if((sim_data.act_directory & 0xFF00) NEQ 0x5F00 ||
+ − (!SIM_IS_DF_LEVEL2_UNDER_DF_LEVEL1(sim_data.act_directory,directory)) )
+ − {
+ − result = FKT_Select (directory, FALSE, NULL, data, len);
+ − if (result NEQ SIM_NO_ERROR)
+ − {
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − return result;
+ − }
+ − }
+ − }
+ − result = fkt_select_one (id, data, len);
+ − if (result NEQ SIM_NO_ERROR)
+ − {
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − }
+ − else
+ − {
+ − sim_data.dir_status_len = sim_data.sim_data_len;
+ − sim_data.act_directory = id;
+ − }
+ − return result;
+ −
+ − case SIM_ICCID:
+ − case SIM_ELP:
+ − /*
+ − * Access to Root Directory
+ − */
+ − directory = SIM_MF;
+ − break;
+ −
+ − case SIM_ADN:
+ − case SIM_FDN:
+ − case SIM_SMS:
+ − case SIM_CCP:
+ − case SIM_MSISDN:
+ − case SIM_SMSP:
+ − case SIM_SMSS:
+ − case SIM_LND:
+ − case SIM_SMSR:
+ − case SIM_SDN:
+ − case SIM_EXT1:
+ − case SIM_EXT2:
+ − case SIM_EXT3:
+ − case SIM_BDN:
+ − case SIM_EXT4:
+ − /* VO temp PATCH: Needed for reading CPHS info num from old SIMs */
+ − case SIM_CPHS_INFN2:
+ − /* VO temp PATCH end */
+ − /*
+ − * Access to Telecom Directory
+ − */
+ − directory = SIM_DF_TELECOM;
+ − break;
+ −
+ − case SIM_LP:
+ − case SIM_IMSI:
+ − case SIM_KC:
+ − case SIM_PLMNSEL:
+ − case SIM_HPLMN:
+ − case SIM_ACMMAX:
+ − case SIM_SST:
+ − case SIM_ACM:
+ − case SIM_GID1:
+ − case SIM_GID2:
+ − case SIM_PUCT:
+ − case SIM_CBMI:
+ − case SIM_SPN:
+ − case SIM_CBMID:
+ − case SIM_BCCH:
+ − case SIM_ACC:
+ − case SIM_FPLMN:
+ − case SIM_LOCI:
+ − case SIM_AD:
+ − case SIM_PHASE:
+ − case SIM_VGCS:
+ − case SIM_VGCSS:
+ − case SIM_VBS:
+ − case SIM_VBSS:
+ − case SIM_EMLPP:
+ − case SIM_AAEM:
+ − case SIM_ECC:
+ − case SIM_CBMIR:
+ − case SIM_DCK:
+ − case SIM_CNL:
+ − case SIM_NIA:
+ − case SIM_KCGPRS:
+ − case SIM_LOCGPRS:
+ − case SIM_SUME:
+ − case SIM_CPHS_VMW:
+ − case SIM_CPHS_SST:
+ − case SIM_CPHS_CFF:
+ − case SIM_CPHS_ONSTR:
+ − case SIM_CPHS_CSP:
+ − case SIM_CPHS_CINF:
+ − case SIM_CPHS_MBXN:
+ − case SIM_CPHS_ONSHF:
+ − case SIM_CPHS_INFN:
+ −
+ − #ifdef REL99
+ − case SIM_UCPS_ACTEC:
+ − case SIM_OCPS_ACTEC:
+ − case SIM_HPLMN_ACT:
+ − case SIM_CPBCCH:
+ − case SIM_INV_SCAN:
+ − case SIM_RPLMN_ACT:
+ − #endif /* REL99 */
+ − case SIM_PNN:
+ − case SIM_OPL:
+ −
+ − /*
+ − * Access to GSM
+ − */
+ − directory = (SIM_IS_FLAG_SET (GSM_DATAFIELD))?
+ − SIM_DF_GSM: SIM_DF_1800;
+ − break;
+ −
+ − #ifndef REL99
+ − case SIM_VI_HZ_PARAM:
+ − case SIM_VI_HZ_CACHE_1:
+ − case SIM_VI_HZ_CACHE_2:
+ − case SIM_VI_HZ_CACHE_3:
+ − case SIM_VI_HZ_CACHE_4:
+ − directory = SIM_DF_VI;
+ − break;
+ − #endif /* ifndef REL99 */
+ −
+ − case SIM_MEXE_ST:
+ − case SIM_ORPK:
+ − case SIM_ARPK:
+ − case SIM_TPRPK:
+ − /*
+ − * Access to MExE Directory
+ − */
+ − directory = SIM_DF_MEXE;
+ − break;
+ − case SIM_IMG:
+ − /*
+ − * Access to Icon Directory
+ − */
+ − directory = SIM_DF_GRAPHICS;
+ − break;
+ −
+ − case SIM_ORANGE_DYN2_FLAG:
+ − case SIM_ORANGE_CSP2:
+ − case SIM_ORANGE_ACM2:
+ − case SIM_ORANGE_DYN_FLAGS:
+ − /*
+ − * Access to Orange Directory
+ − */
+ − directory = SIM_DF_ORANGE;
+ − break;
+ −
+ − case SIM_SAI:
+ − case SIM_SLL:
+ − /*
+ − * Access to SoLSA Directory
+ − */
+ − directory = SIM_DF_SOLSA;
+ − break;
+ − }
+ − }
+ −
+ − if (sim_data.act_directory NEQ directory)
+ − {
+ − /*
+ − * select directory
+ − */
+ − #ifdef _SIMULATION_
+ −
+ − if( (data NEQ NULL) AND (len NEQ 0) )
+ − first_time_into_fkt_select = FALSE;
+ − #endif
+ − result = FKT_Select (directory, FALSE, NULL, data, len);
+ − if (result NEQ SIM_NO_ERROR) /* directory selection fails */
+ − {
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − return result;
+ − }
+ − }
+ −
+ − if (sim_data.act_field NEQ id)
+ − {
+ − /*
+ − * secondly select elementary field
+ − */
+ − result = fkt_select_one (id, data, len);
+ − if (result NEQ SIM_NO_ERROR) /* EF selection fails */
+ − {
+ − sim_data.act_field = NOT_PRESENT_16BIT;
+ − #ifdef __INVALID /* more sophisticated SELECT error handling */
+ −
+ − sw1 = (UBYTE)(SIM_Status_Extended ((UBYTE *)response, 6, &size) >> 8);
+ −
+ − if (sw1 NEQ 0x90 AND sw1 NEQ 0x91)
+ − /*
+ − * SIM Status request failed
+ − */
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − else if (((response[4] << 8) | response[5])
+ − NEQ sim_data.act_directory)
+ − /*
+ − * SIM Presence Detection indicates invalid SIM
+ − */
+ − sim_data.act_directory = NOT_PRESENT_16BIT;
+ − #endif
+ − }
+ − else
+ − {
+ − sim_data.act_directory = directory;
+ − sim_data.act_field = id;
+ − }
+ − return result;
+ − }
+ − else
+ − /*
+ − * field is already selected
+ − */
+ − return SIM_NO_ERR_FILE_ALREADY_SELECTED;
+ − }
+ −
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_UnblockCHV |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_UnblockCHV.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_UnblockCHV (UBYTE * unblockCHV,
+ − UBYTE * new_CHV,
+ − UBYTE chvType)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_UnblockCHV()");
+ −
+ − sw1sw2 = SIM_UnblockCHV ((UBYTE *)response,
+ − (UBYTE *)unblockCHV,
+ − (UBYTE *)new_CHV,
+ − (UBYTE)chvType,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_UpdateBinary |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_UpdateBinary.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_UpdateBinary (UBYTE * data,
+ − USHORT length,
+ − USHORT offset)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response [4];
+ −
+ − TRACE_FUNCTION ("FKT_UpdateBinary()");
+ −
+ − sw1sw2 = SIM_UpdateBinary ((UBYTE *)response,
+ − (UBYTE *)data,
+ − offset,
+ − length,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_UpdateRecord |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_UpdateRecord.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_UpdateRecord (UBYTE * data,
+ − USHORT length,
+ − UBYTE mode,
+ − USHORT record)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response [4];
+ −
+ − #if !defined NTRACE
+ − char buf[48];
+ − sprintf (buf, "FKT_UpdateRecord(): Nr. %hu", record);
+ − TRACE_FUNCTION (buf);
+ − #endif
+ −
+ − sw1sw2 = SIM_UpdateRecord ((UBYTE *)response,
+ − (UBYTE *)data,
+ − (UBYTE)mode,
+ − (UBYTE)record,
+ − length,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (6302) MODULE : SIM_FKT |
+ − | STATE : code ROUTINE : FKT_VerifyCHV |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_VerifyCHV.
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_VerifyCHV (UBYTE * pin,
+ − UBYTE pin_id)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_VerifyCHV()");
+ −
+ − sw1sw2 = SIM_VerifyCHV ((UBYTE *)response,
+ − (UBYTE *)pin,
+ − (UBYTE)pin_id,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ − /*
+ − +********************************************************************+
+ − | Moved from sim_stk.c - for CQ 34109 under feature flag SIM_TOOLKIT |
+ − +********************************************************************+
+ − */
+ −
+ − #ifdef SIM_TOOLKIT
+ −
+ − static const UBYTE timer_env[] = {
+ − STK_TIMER_EXPIRATION_TAG,
+ − STK_DEVICE_IDENTITY_LEN+STK_TIMER_ID_LEN+STK_TIMER_VALUE_LEN+6,
+ − STK_DEVICE_IDENTITY_TAG|STK_COMPREHENSION_REQUIRED, STK_DEVICE_IDENTITY_LEN, 0x82, 0x81,
+ − STK_TIMER_ID_TAG|STK_COMPREHENSION_REQUIRED, STK_TIMER_ID_LEN, 0,
+ − STK_TIMER_VALUE_TAG|STK_COMPREHENSION_REQUIRED, STK_TIMER_VALUE_LEN, 0, 0, 0
+ − };
+ −
+ − UBYTE pending_timers[9] = {0,0,0,0,0,0,0,0,0};
+ − UBYTE next_pos_to_fill = 0;
+ − UBYTE next_pos_to_send = 0;
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
+ − | STATE : code ROUTINE : FKT_TerminalResponse |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_TerminalResponse
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_TerminalResponse (UBYTE * data,
+ − USHORT length)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ − UBYTE env[sizeof(timer_env)];
+ − USHORT index;
+ − UBYTE dummy[4];
+ − USHORT error;
+ − USHORT i;
+ −
+ − TRACE_FUNCTION ("FKT_TerminalResponse()");
+ −
+ − sw1sw2 = SIM_TerminalResponse (response,
+ − data,
+ − length,
+ − &size);
+ − sim_data.term_resp_sent = TRUE;
+ −
+ − SIM_EM_TERMINAL_RESPONSE;
+ − /*
+ − * if SIM response is OK, try resending pending timer expiry envelopes (send updated envelopes)
+ − */
+ − if( 0x9000 == sw1sw2 )
+ − {
+ − for(i=0;i<8;i++)
+ − {
+ − if (next_pos_to_fill != next_pos_to_send)
+ − {
+ − /*
+ − * some timer expiry envelopes are pending
+ − */
+ − index = pending_timers[next_pos_to_send];
+ − memcpy (env, timer_env, sizeof(timer_env));
+ − env[8] = (UBYTE)(index + 1); /* Timer number range is 1..8 */
+ − env[11] = sim_data.timer[index].hour;
+ − env[12] = sim_data.timer[index].minute;
+ − env[13] = sim_data.timer[index].second;
+ − error = FKT_Envelope (dummy, env, sizeof(timer_env),0);
+ − if(8 == next_pos_to_send)
+ − {
+ − next_pos_to_send = 0;
+ − }
+ − else
+ − {
+ − next_pos_to_send++;
+ − }
+ − if (error NEQ SIM_NO_ERROR)
+ − {
+ − break;
+ − }
+ − }
+ − }
+ − }
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
+ − | STATE : code ROUTINE : FKT_Envelope |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Envelope
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_Envelope (UBYTE * data_out, UBYTE * data_in,
+ − USHORT in_length, USHORT out_length)
+ − {
+ −
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − USHORT error;
+ −
+ −
+ − TRACE_FUNCTION ("FKT_Envelope()");
+ −
+ − sw1sw2 = SIM_Envelope (data_out,
+ − data_in,
+ − in_length,
+ − &size);
+ −
+ − SIM_EM_ENVELOPE;
+ −
+ − error = FKT_convert_error (sw1sw2, size);
+ −
+ − if(sw1sw2 EQ 0x9000)
+ − sim_data.sim_data_len = 0;
+ −
+ − if (error EQ SIM_NO_ERROR)
+ − {
+ − if (data_out AND out_length)
+ − {
+ − if (sim_data.sim_data_len > 0)
+ − {
+ − stk_l_cmd = sim_data.sim_data_len << 3;
+ − out_length = (USHORT) (stk_l_cmd >> 3);
+ − error = FKT_GetResponse (data_out, out_length);
+ − }
+ − }
+ − }
+ −
+ − return error;
+ −
+ − }
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
+ − | STATE : code ROUTINE : FKT_TerminalProfile |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_TerminalProfile
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_TerminalProfile (UBYTE * data,
+ − USHORT length)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ − UBYTE response[4];
+ −
+ − TRACE_FUNCTION ("FKT_TerminalProfile()");
+ −
+ − sw1sw2 = SIM_TerminalProfile (response,
+ − data,
+ − length,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ −
+ − }
+ −
+ −
+ − /*
+ − +--------------------------------------------------------------------+
+ − | PROJECT : GSM-PS (8419) MODULE : SIM_STK |
+ − | STATE : code ROUTINE : FKT_Fetch |
+ − +--------------------------------------------------------------------+
+ −
+ − PURPOSE : Wrapping function for the SIM driver call SIM_Fetch
+ −
+ − */
+ −
+ − GLOBAL USHORT FKT_Fetch (UBYTE * cmd,
+ − USHORT length)
+ − {
+ − USHORT size = 0;
+ − USHORT sw1sw2;
+ −
+ − TRACE_FUNCTION ("FKT_Fetch()");
+ −
+ − sw1sw2 = SIM_Fetch (cmd,
+ − length,
+ − &size);
+ −
+ − return FKT_convert_error (sw1sw2, size);
+ −
+ − }
+ −
+ − #endif /* SIM_TOOLKIT */
+ −
+ − #endif