FreeCalypso > hg > fc-magnetite
view src/aci2/aci/cmh_mms.c @ 638:cab2f315827e
FFS dev.c: added Spansion PL032J to the "generic" table
With the discovery of first GTM900 and then Tango, it now appears that
Openmoko was not the only manuf after all who kept TI's TCS211 firmware
largely intact (as opposed to changing it beyond all recognition like
Compal, Chi-Mei and BenQ did), thus we are now getting new "alien" targets
on which we reuse the original manuf's FFS with IMEI and RF calibration
tables as if it were native. On these targets we use the original
device table for FFS, even though we previously thought that it would
never apply to any target other than dsample, leonardo and gtamodem.
We have previously added Samsung K5L33xxCAM (a new kind of multi-ID device)
to the generic table to support its use in Huawei GTM900-B modules; now
we got news that some slightly older GTM900-B specimen used S71PL032J
instead, so we are now adding PL032J as well.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Thu, 30 Jan 2020 17:45:48 +0000 |
parents | 93999a60b835 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH_MMS +----------------------------------------------------------------------------- | 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 set functions related to the | protocol stack adapter for mobility management. +----------------------------------------------------------------------------- */ #ifndef CMH_MMS_C #define CMH_MMS_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "aci_cmh.h" #include "rtc.h" #ifdef DTI #include "dti.h" /* functionality of the dti library */ #include "dti_conn_mng.h" #endif #include "aci_mem.h" #ifdef FAX_AND_DATA /* #include "aci_fd.h" */ #endif /* of #ifdef FAX_AND_DATA */ #include "psa.h" #include "psa_sim.h" #include "psa_mm.h" #include "cmh.h" #include "cmh_sim.h" #include "cmh_mm.h" #include "psa_cc.h" #include "cmh_cc.h" #ifdef GPRS #include "gaci.h" #include "gaci_cmh.h" #include "psa_gmm.h" #include "cmh_gmm.h" #endif #ifndef _SIMULATION_ /***************************/ /* TEMPORARY until NVM */ /* just to get FFs !!!! */ #ifndef GPRS #define DONT_LET_FFSH_DEF_GPRS #endif #include "ffs/ffs.h" #include "rx.h" #include "rtc.h" #ifdef FF_TIMEZONE #include "rv/rv_general.h" #include "rtc/rtc_tz.h" #endif /* check whether latter has defined GPRS !!! */ #ifdef DONT_LET_FFSH_DEF_GPRS #undef GPRS #endif #undef DONT_LET_FFSH_DEF_GPRS /***************************/ #endif /* _SIMULATION_ */ /*==== CONSTANTS ==================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ /*==== FUNCTIONS ==================================================*/ EXTERN void wake_up_rr (void); #ifndef _SIMULATION_ LOCAL void rx_Cb (drv_SignalID_Type *signal_params); LOCAL UCHAR rx_sequence_Cb (void* arg); #endif /* _SIMULATION_ */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentBAND | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %BAND AT command which is responsible for configuring the way the mobile deals with multiband. <bandMode>: band switch mode. <bandType>: band selection by user: coded in bitfield as following. Bit set to 1 if band is set, 0 otherwise... BITS: | 5 | 4 | 3 | 2 | 1 | | GSM850 | E_GSM | GSM1900 | GSM1800 | GSM900 | */ GLOBAL T_ACI_RETURN sAT_PercentBAND(T_ACI_CMD_SRC srcId, T_ACI_BAND_MODE bandMode, UBYTE bandType) { UBYTE ManufacturerBands; UBYTE ubyte_dummy; TRACE_FUNCTION("sAT_PercentBAND()"); /* check command source */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* Check Parameter bandMode */ switch( bandMode ) { case( BAND_MODE_Auto ): bandType = 0x00; /* scan all */ break; case( BAND_MODE_Manual ): /* Check Parameter bandType */ cmhMM_getBandSettings(&ubyte_dummy, &ManufacturerBands); if( !cmhMM_isBandAllowed(bandType, ManufacturerBands) ) { TRACE_EVENT_P1("Band combination %d is not supported by this hardware", bandType); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } if( !cmhMM_writeSetBand(bandType) ) return(AT_FAIL); /* switch off radio */ if( CFUNfun EQ CFUN_FUN_Full ) { /* if mobile is on, proceed a soft switch off and then switch back on */ mmEntStat.curCmd = AT_CMD_BAND; return( sAT_PlusCFUN( srcId, CFUN_FUN_Disable_TX_RX_RF, CFUN_RST_NotPresent) ); } else { /* new configuration has been written to Flash and that's it ! */ return( AT_CMPL); } } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PlusCOPS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +COPS AT command which is responsible for selection and deselection of an network operator. <mode>: registration mode. <format>: format of operator selection <oper>: operator string */ GLOBAL T_ACI_RETURN sAT_PlusCOPS ( T_ACI_CMD_SRC srcId, T_ACI_COPS_MOD mode, T_ACI_COPS_FRMT format, CHAR * oper ) { T_MM_CMD_PRM * pMMCmdPrm; /* points to MM command parameters */ T_ACI_NRG_RGMD regMode; /*NRG Registration mode */ T_ACI_NRG_FRMT regFormat; T_ACI_NRG_SVMD svrMode; TRACE_FUNCTION ("sAT_PlusCOPS()"); pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm; mmShrdPrm.COPSmodeBeforeAbort = mmShrdPrm.COPSmode; /* * check MM entity status */ if( mmEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); /* *convert format to NRG type and set the COPS format value. */ if( format EQ COPS_FRMT_NotPresent ) format = pMMCmdPrm -> COPSfrmt; switch( format ) { case( COPS_FRMT_NotPresent): regFormat = NRG_FRMT_NotPresent; break; case( COPS_FRMT_Numeric ): regFormat =NRG_FRMT_Numeric ; break; case( COPS_FRMT_Short): regFormat = NRG_FRMT_Short; break; case( COPS_FRMT_Long): regFormat = NRG_FRMT_Long; break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pMMCmdPrm -> COPSfrmt = format; /* * The function cmhMM_OperatorSelect() is using the NRG types. Therefore the following conversion is required. * Also the appropiate value for Service Mode, required by cmhMM_OperatorSelect(), is set. */ if( mode EQ COPS_MOD_NotPresent ) mode = mmShrdPrm.COPSmode; switch( mode ) { case( COPS_MOD_NotPresent ): regMode = NRG_RGMD_NotPresent; svrMode = NRG_SVMD_NotPresent; break; case( COPS_MOD_Auto ): regMode =NRG_RGMD_Auto ; svrMode = NRG_SVMD_Full; /* Only Full Service makes sense for Automatic Mode */ break; case( COPS_MOD_Man): regMode = NRG_RGMD_Manual; svrMode = NRG_SVMD_Full; /* Only Full Service makes sense for Manual Mode */ break; case( COPS_MOD_Dereg): regMode = NRG_RGMD_Dereg; svrMode = NRG_SVMD_Limited; break; case( COPS_MOD_Both ): regMode = NRG_RGMD_Both; svrMode = NRG_SVMD_Full; /* Only Full Service makes sense for the Both Mode */ break; case(COPS_MOD_SetOnly): /*This mode can be fully handled in this function */ /* DO NOT SET mmShrdPrm.COPSmode !!! */ pMMCmdPrm -> COPSfrmt = format; return AT_CMPL; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } mmShrdPrm.COPSmode = mode; /*Set the value of the current command executed */ mmEntStat.curCmd = AT_CMD_COPS; return cmhMM_OperatorSelect(srcId,regMode,svrMode,regFormat,oper); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCOPS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %COPS AT command which is responsible for selection and deselection of an network operator. %COPS will add, in principle, the following functionality to the standard AT command +COPS: -Possibility to query the "service status" in which the phone is currently registered; the possible values will be "full service", "limited service" or "no service". -Possibility to select the "last registered" operator using %COPS=1. <mode>: registration mode. <format>: format of operator selection <oper>: operator string */ GLOBAL T_ACI_RETURN sAT_PercentCOPS ( T_ACI_CMD_SRC srcId, T_ACI_COPS_MOD mode, T_ACI_COPS_FRMT format, CHAR * oper ) { T_MM_CMD_PRM * pMMCmdPrm; /* points to MM command parameters */ T_ACI_NRG_RGMD regMode; /*NRG Registration mode */ T_ACI_NRG_FRMT regFormat; T_ACI_NRG_SVMD svrMode; TRACE_FUNCTION ("sAT_PercentCOPS()"); pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm; mmShrdPrm.COPSmodeBeforeAbort = mmShrdPrm.COPSmode; /* * check MM entity status */ if( mmEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); /* *------------------------------------------------------------------- * convert format to NRG type *------------------------------------------------------------------- */ if( format EQ COPS_FRMT_NotPresent ) format = pMMCmdPrm -> COPSfrmt; switch( format ) { case( COPS_FRMT_NotPresent): regFormat = NRG_FRMT_NotPresent; break; case( COPS_FRMT_Numeric ): regFormat =NRG_FRMT_Numeric ; break; case( COPS_FRMT_Short): regFormat = NRG_FRMT_Short; break; case( COPS_FRMT_Long): regFormat = NRG_FRMT_Long; break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pMMCmdPrm -> COPSfrmt = format; /* * The function cmhMM_OperatorSelect() is using the NRG types. Therefore the following conversion is required. * Also the appropiate value for Service Mode, required by cmhMM_OperatorSelect(), is set. */ if( mode EQ COPS_MOD_NotPresent ) mode = mmShrdPrm.COPSmode; switch( mode ) { case( COPS_MOD_NotPresent ): regMode = NRG_RGMD_NotPresent; svrMode = NRG_SVMD_NotPresent; break; case( COPS_MOD_Auto ): regMode =NRG_RGMD_Auto ; svrMode = NRG_SVMD_Full; break; case( COPS_MOD_Man): regMode = NRG_RGMD_Manual; svrMode = NRG_SVMD_Full; break; case( COPS_MOD_Dereg): regMode = NRG_RGMD_Dereg; svrMode = NRG_SVMD_Limited; break; case( COPS_MOD_Both ): regMode = NRG_RGMD_Both; svrMode = NRG_SVMD_Full; break; case(COPS_MOD_SetOnly): /*This mode can be fully handled in this function */ /* DO NOT SET mmShrdPrm.COPSmode !!! */ pMMCmdPrm -> COPSfrmt = format; return AT_CMPL; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } mmShrdPrm.COPSmode = mode; /* Set the value of the current command executed */ mmEntStat.curCmd = AT_CMD_P_COPS; return cmhMM_OperatorSelect(srcId,regMode,svrMode,regFormat,oper); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PlusWS46 | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +WS46 AT command which is responsible to select wireless network. <mode>: network mode. */ GLOBAL T_ACI_RETURN sAT_PlusWS46 (T_ACI_CMD_SRC srcId, T_ACI_WS46_MOD mode ) { TRACE_FUNCTION ("sAT_PlusWS46()"); /* *------------------------------------------------------------------- * process the value parameter *------------------------------------------------------------------- */ if( mode NEQ ACI_NumParmNotPresent ) { if( mode NEQ WS46_MOD_Gsm ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : tAT_PercentALS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %ALS AT command which is responsible for testing if ALS mode is present. (always if an E-Plus Sim-card is detected or the if the CSP field is present on the inserted Sim-card and enables ALS mode). */ GLOBAL T_ACI_RETURN tAT_PercentALS ( T_ACI_CMD_SRC srcId, T_ACI_ALS_MOD *ALSmode ) { TRACE_FUNCTION ("tAT_PercentALS()"); if( !cmh_IsVldCmdSrc( srcId ) ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } #if defined(FF_BAT) && defined(_SIMULATION_) /* test command %ALS is not used anymore by BAT.lib, change CMD MODE only for host tests */ if(aci_cmd_src_mode_get(srcId) EQ CMD_MODE_BAT) { aci_cmd_src_mode_set((UBYTE)srcId, CMD_MODE_ATI); } #endif /* FF_BAT && _SIMULATION_ */ /* E-Plus SIM-Card inserted (mcc=0x262, mnc=0x03) ? */ if (cmhSIM_plmn_is_hplmn(0x262, 0x03F)) { *ALSmode = ALS_MOD_SPEECH | ALS_MOD_AUX_SPEECH; return (AT_CMPL); } simEntStat.curCmd = AT_CMD_ALS; simEntStat.entOwn = simShrdPrm.owner = srcId; ccShrdPrm.als_cmd = ALS_CMD_TEST; *ALSmode = ALS_MOD_NOTPRESENT; cmhCC_checkALS_Support(); return (AT_EXCT); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentNRG | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %NRG AT command which is responsible for the setting of registration mode and service mode. <regMode>: registration mode. <srvMode>: service mode. */ GLOBAL T_ACI_RETURN sAT_PercentNRG( T_ACI_CMD_SRC srcId, T_ACI_NRG_RGMD regMode, T_ACI_NRG_SVMD srvMode, T_ACI_NRG_FRMT oprFrmt, CHAR *opr) { T_MM_CMD_PRM * pMMCmdPrm; /* points to MM command parameters */ TRACE_FUNCTION ("sAT_PercentNRG()"); pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm; /* *------------------------------------------------------------------- * check MM entity status *------------------------------------------------------------------- */ if( mmEntStat.curCmd NEQ AT_CMD_NONE ) return( AT_BUSY ); /* *------------------------------------------------------------------- * process the oprFrmt,svrMode and regMode parameters *------------------------------------------------------------------- */ switch( oprFrmt ) { case( NRG_FRMT_NotPresent ): oprFrmt = pMMCmdPrm -> NRGoprFrmt; break; case( NRG_FRMT_Long ): case( NRG_FRMT_Short ): case( NRG_FRMT_Numeric ): break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } if( srvMode EQ NRG_SVMD_NotPresent ) srvMode=pMMCmdPrm->NRGregMode; if( regMode EQ NRG_RGMD_NotPresent ) regMode=pMMCmdPrm->NRGregMode; /* Set the value of the current command executed */ mmEntStat.curCmd = AT_CMD_NRG; return cmhMM_OperatorSelect(srcId,regMode,srvMode,oprFrmt,opr); } /* +--------------------------------------------------------------------+ | PROJECT : ACI/MMI MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCSQ | +--------------------------------------------------------------------+ PURPOSE : This is the function for Signal Quality Param: srcId: command ID; CSQmode: enable(1) or disable(0) CSQ Shen,Chao Juni.13th, 2003 */ GLOBAL T_ACI_RETURN sAT_PercentCSQ( T_ACI_CMD_SRC srcId, T_ACI_CSQ_MODE CSQmode) { T_MM_CMD_PRM * pMMCmdPrm; /* points to MM command parameters */ if( !cmh_IsVldCmdSrc( srcId ) ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pMMCmdPrm = &cmhPrm[srcId].mmCmdPrm; switch(CSQmode) { case( CSQ_Enable): { if ( pMMCmdPrm->CSQworkStat == CSQ_Enable ) { TRACE_EVENT("CSQ is already enabled"); } else { cmhPrm[srcId].mmCmdPrm.CSQworkStat = CSQ_Enable; if( (pMMCmdPrm->sIndicationParam.sMmCINDSettings.sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) && (pMMCmdPrm->sIndicationParam.sMmCMERSettings.sCmerIndParam != CMER_INDICATOR_2) ) { /* rx_Init() not yet called from CIND service */ #ifndef _SIMULATION_ rx_Init(rx_Cb); #endif /* _SIMULATION_ */ } } break; } case(CSQ_Disable): { if ( pMMCmdPrm->CSQworkStat == CSQ_Enable ) { cmhPrm[srcId].mmCmdPrm.CSQworkStat = CSQ_Disable; if( (pMMCmdPrm->sIndicationParam.sMmCINDSettings.sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) && (pMMCmdPrm->sIndicationParam.sMmCMERSettings.sCmerIndParam != CMER_INDICATOR_2) ) { /* CIND service inactive -> no more reading the signal strength necessary */ #ifndef _SIMULATION_ rx_Init(NULL); #endif /* _SIMULATION_ */ } } break; } default: return(AT_FAIL); } return( AT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : ACI/MMI MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_Plus CIND | +--------------------------------------------------------------------+ PURPOSE : This is the function to setup the indications toward terminal */ GLOBAL T_ACI_RETURN sAT_PlusCIND( T_ACI_CMD_SRC srcId, T_ACI_CIND_SIGNAL_TYPE sCindSgnalSettings, T_ACI_CIND_SMSFULL_TYPE sCindSmsFullSettings ) { T_ACI_MM_CIND_VAL_TYPE *pMMCindPrm; T_ACI_MM_CMER_VAL_TYPE *pMMCmerPrm; T_ACI_CIND_SIGNAL_TYPE sOldSignalSetting; T_ACI_CIND_SMSFULL_TYPE sOldSmsFullSetting; TRACE_EVENT( "sAT_PlusCIND()" ); if( !cmh_IsVldCmdSrc( srcId ) ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pMMCindPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCINDSettings); pMMCmerPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCMERSettings); if( sCindSgnalSettings == CIND_SIGNAL_INDICATOR_INVALID || sCindSmsFullSettings == CIND_SMSFULL_INDICATOR_INVALID ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } sOldSignalSetting = pMMCindPrm->sCindSignalParam; sOldSmsFullSetting = pMMCindPrm->sCindSmsFullParam; pMMCindPrm->sCindSignalParam = sCindSgnalSettings; pMMCindPrm->sCindSmsFullParam = sCindSmsFullSettings; /* ----------------- signal strength setting part ------------------------ */ if( sOldSignalSetting <= CIND_SIGNAL_INDICATOR_LVL0 ) { /* the old (previews) signal setting is off */ if( (sCindSgnalSettings > CIND_SIGNAL_INDICATOR_LVL0) && (cmhPrm[srcId].mmCmdPrm.CSQworkStat == CSQ_Disable) && (pMMCmerPrm->sCmerIndParam != CMER_INDICATOR_2) ) { /* greather LVL0 --> rx_Init must be initialize... */ #ifndef _SIMULATION_ rx_Init(rx_Cb); #endif /* _SIMULATION_ */ } } else { /* the old (previews) signal setting is on */ if( (sCindSgnalSettings == CIND_SIGNAL_INDICATOR_LVL0) && (cmhPrm[srcId].mmCmdPrm.CSQworkStat == CSQ_Disable) && (pMMCmerPrm->sCmerIndParam != CMER_INDICATOR_2) ) { /* LVL0 --> rx_Init must be reset... */ #ifndef _SIMULATION_ rx_Init(NULL); #endif /* _SIMULATION_ */ } } return(AT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : ACI/MMI MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_Plus CMER | +--------------------------------------------------------------------+ PURPOSE : This is the function to setup the buffer control for the indications toward terminal equipment */ GLOBAL T_ACI_RETURN sAT_PlusCMER( T_ACI_CMD_SRC srcId, T_ACI_CMER_MODE_TYPE sCmerModeSettings, T_ACI_CMER_IND_TYPE sCmerIndicationSettings, T_ACI_CMER_BFR_TYPE sCmerBfrSettings ) { T_ACI_MM_CMER_VAL_TYPE *pMMCmerPrm; T_ACI_MM_CIND_VAL_TYPE *pMMCindPrm; T_ACI_CMER_IND_TYPE sOldCmerIndSetting; TRACE_EVENT( "sAT_PlusCMER()" ); if( !cmh_IsVldCmdSrc( srcId ) ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pMMCmerPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCMERSettings); pMMCindPrm = &(cmhPrm[srcId].mmCmdPrm.sIndicationParam.sMmCINDSettings); sOldCmerIndSetting = pMMCmerPrm->sCmerIndParam; if( sCmerModeSettings != CMER_MODE_INVALID ) { pMMCmerPrm->sCmerModeParam = sCmerModeSettings; } if( sCmerIndicationSettings != CMER_INDICATOR_INVALID ) { pMMCmerPrm->sCmerIndParam = sCmerIndicationSettings; } if( sCmerBfrSettings != CMER_BFR_INVALID ) { pMMCmerPrm->sCmerBfrParam = sCmerBfrSettings; } /* ---------------- maybe switch on all indication settings ------------- */ if( sOldCmerIndSetting != CMER_INDICATOR_2 ) { /* the old (previews) indicator setting is 'off' */ if( (sCmerIndicationSettings == CMER_INDICATOR_2) && (cmhPrm[srcId].mmCmdPrm.CSQworkStat == CSQ_Disable) && (pMMCindPrm->sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) ) { /* all indications must be show --> rx_Init must be initialize... */ #ifndef _SIMULATION_ rx_Init(rx_Cb); #endif /* _SIMULATION_ */ } } else { /* the old (previews) signal setting is on */ if( (sCmerIndicationSettings != CMER_INDICATOR_2) && (cmhPrm[srcId].mmCmdPrm.CSQworkStat == CSQ_Disable) && (pMMCindPrm->sCindSignalParam <= CIND_SIGNAL_INDICATOR_LVL0) ) { /* LVL0 --> rx_Init must be reset... */ #ifndef _SIMULATION_ rx_Init(NULL); #endif /* _SIMULATION_ */ } } return(AT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : ACI/MMI MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCSQ | +--------------------------------------------------------------------+ PURPOSE : This is the callback function for Signal Quality Param: signal_params callback function name Shen,Chao Juni.13th, 2003 */ #ifndef _SIMULATION_ LOCAL void rx_Cb (drv_SignalID_Type *signal_params) { rx_Status_Type *para = NULL; TRACE_EVENT("rx_Cb()"); ACI_MALLOC(para,sizeof(rx_Status_Type)); para->actLevel = ((rx_Status_Type *) signal_params->UserData)->actLevel; para->gsmLevel = ((rx_Status_Type *) signal_params->UserData)->gsmLevel; para->rxQuality = ((rx_Status_Type *) signal_params->UserData)->rxQuality; if (!cmh_set_delayed_call (rx_sequence_Cb, (void *)para)) { TRACE_EVENT("Error, can not set the delayed resequence callback for %CSQ"); ACI_MFREE(para); return ; } TRACE_EVENT("delayed requence call back requested: 100 ms"); cmh_start_delayed_call (20); return; } #endif /* _SIMULATION_ */ /* +--------------------------------------------------------------------+ | PROJECT : ACI/MMI MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCSQ | +--------------------------------------------------------------------+ PURPOSE : This is the delayed callback function for Signal Quality Shen,Chao Juni.13th, 2003 */ #ifndef _SIMULATION_ LOCAL UCHAR rx_sequence_Cb (void* arg) { int i; UBYTE rssi; UBYTE ber; T_ACI_CIND_SIGNAL_TYPE sSignalStrength; T_ACI_MM_CIND_VAL_TYPE sIndValues; struct rx_Status_Type* tmp_p = (struct rx_Status_Type*) arg; TRACE_EVENT("rx_sequence_Cb()"); sIndValues.sCindSmsFullParam = CIND_SMSFULL_INDICATOR_INVALID; if ( tmp_p->gsmLevel EQ 0xFF OR tmp_p->gsmLevel EQ 0 ) { rssi = ACI_RSSI_FAULT; sSignalStrength = CIND_SIGNAL_INDICATOR_LVL0; } else if ( tmp_p->gsmLevel > 59 ) { rssi = 31; } else { rssi = ( tmp_p->gsmLevel / 2 ) + 2; } if ( tmp_p->rxQuality EQ RX_QUAL_UNAVAILABLE ) { ber = ACI_BER_FAULT; } else { ber = tmp_p->rxQuality; } for( i = CMD_SRC_LCL; i < CMD_SRC_MAX; i++) { if (cmhPrm[i].mmCmdPrm.CSQworkStat EQ CSQ_Enable) { R_AT (RAT_CSQ, i) (rssi,ber,tmp_p->actLevel); } /* ==================== process the service of +CIEV ========================== */ sSignalStrength = CIND_SIGNAL_INDICATOR_LVL0; if( tmp_p->gsmLevel >= 11 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL1; }; if( tmp_p->gsmLevel >= 21 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL2; }; if( tmp_p->gsmLevel >= 32 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL3; }; if( tmp_p->gsmLevel >= 42 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL4; }; if( tmp_p->gsmLevel >= 52 ) { sSignalStrength = CIND_SIGNAL_INDICATOR_LVL5; }; sIndValues.sCindSignalParam = sSignalStrength; sIndValues.sCindSmsFullParam = CIND_SMSFULL_INDICATOR_INVALID; if( ((cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCINDSettings.sCindSignalParam > CIND_SIGNAL_INDICATOR_LVL0) && (cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCINDSettings.sCindSignalParam >= sIndValues.sCindSignalParam) && (cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCMERSettings.sCmerIndParam == CMER_INDICATOR_2)) || ((cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCINDSettings.sCindSignalParam < sIndValues.sCindSignalParam) && (cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCMERSettings.sCmerIndParam == CMER_INDICATOR_1)) ) { TRACE_EVENT("send +CIEV"); R_AT (RAT_CIEV, i) ( sIndValues, cmhPrm[i].mmCmdPrm.sIndicationParam.sMmCMERSettings ); } } if (!cmh_set_delayed_call (NULL, NULL)) { /* reset this callback pointer -> will be set again via rx_Cb */ TRACE_EVENT("Can not reset the delayed resequence callback for %CSQ"); return FALSE; } ACI_MFREE(tmp_p); return TRUE; } #endif /* _SIMULATION_ */ /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCHPL | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CHPL AT command which will return the list of entries in EF_HPLMNwAcT. <mode>: registration mode. <format>: format of operator selection <oper>: operator string */ GLOBAL T_ACI_RETURN sAT_PercentCHPL ( T_ACI_CMD_SRC srcId, T_ACI_OPER_NTRY *oper ) { T_OPER_ENTRY plmnDesc; BOOL found; SHORT mccBuf; SHORT mncBuf; TRACE_FUNCTION ("sAT_PlusCHPL()"); /* *------------------------------------------------------------------- * check whether SIM is ready *------------------------------------------------------------------- */ if (!cmhSMS_checkSIM ()) { return AT_FAIL; } /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PercentCHPL(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } if(!cmhMM_GetActingHPLMN(&mccBuf, &mncBuf))/* Enhancement Acting HPLMN*/ { cmhSIM_GetHomePLMN (&mccBuf, &mncBuf); } found = cmhMM_FindPLMN (&plmnDesc, mccBuf, mncBuf, NOT_PRESENT_16BIT, FALSE); if (!found) { TRACE_EVENT_P2("sAT_PercentCHPL(): MCC/MN not found in database (0x%X, 0x%X", mccBuf, mncBuf); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Internal); return( AT_FAIL ); } strcpy (oper->longName, plmnDesc.longName); strcpy (oper->shrtName, plmnDesc.shrtName); oper->mcc = plmnDesc.mcc; oper->mnc = plmnDesc.mnc; oper->pnn = plmnDesc.pnn; oper->long_len = plmnDesc.long_len; oper->shrt_len = plmnDesc.shrt_len; return (AT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PlusCTZR | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CTZR AT command which will set the status of CTZRmode, indicating whether time zone change rep[orting is enabled or disabled. <on/off>: Indicates whether time zone reporting is enabled or disabled. */ GLOBAL T_ACI_RETURN sAT_PlusCTZR ( T_ACI_CMD_SRC srcId, T_ACI_CTZR_MODE mode) { TRACE_FUNCTION ("sAT_PlusCTZR()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PlusCTZR(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * process the mode parameter *------------------------------------------------------------------- */ switch (mode) { case CTZR_MODE_OFF: case CTZR_MODE_ON: cmhPrm[srcId].mmCmdPrm.CTZRMode = mode; break; default: TRACE_EVENT_P1("sAT_PlusCTZR(): Invalid mode: %d", mode); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PlusCTZU | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CTZU AT command which will set the status of CTZUmode, indicating whether automatic time zone update is enabled or disabled. <on/off>: Indicates whether automatic time zone update is enabled or disabled. */ GLOBAL T_ACI_RETURN sAT_PlusCTZU ( T_ACI_CMD_SRC srcId, T_ACI_CTZU_MODE mode) { TRACE_FUNCTION ("sAT_PlusCTZU()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PlusCTZU(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * process the mode parameter *------------------------------------------------------------------- */ switch (mode) { case CTZU_MODE_OFF: case CTZU_MODE_ON: cmhPrm[srcId].mmCmdPrm.CTZUMode = mode; break; default: TRACE_EVENT_P1("sAT_PlusCTZU(): Invalid mode: %d", mode); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PlusCCLK | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CCLK AT command which will set the real time clock of the ME */ GLOBAL T_ACI_RETURN sAT_PlusCCLK ( T_ACI_CMD_SRC srcId, T_ACI_RTC_DATE *date_s, T_ACI_RTC_TIME *time_s, int timeZone ) { #ifndef _SIMULATION_ UBYTE ret; #endif /* _SIMULATION_ */ TRACE_FUNCTION ("sAT_PlusCCLK()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PlusCCLK(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * Set the time in the RTC *------------------------------------------------------------------- */ #ifndef _SIMULATION_ ret = rtc_set_time_date( (T_RTC_DATE *) date_s, (T_RTC_TIME *) time_s); switch (ret) { case 0: /* RVF_OK. Date and time set ok*/ #ifndef FF_TIMEZONE return( AT_CMPL ); #else /* FF_TIMEZONE */ ret = RTC_SetCurrentTZ(timeZone); /* Set current timezone now time and date are set.*/ switch (ret) { case 0: /* RVF_OK. RTC current TZ set ok*/ return( AT_CMPL ); default: TRACE_EVENT_P1("sAT_PlusCCLK(): ERROR1: %d", ret); /* RTC setting failed */ return( AT_FAIL ); } #endif /* FF_TIMEZONE */ default: /* RVF_NOT_READY or RVF_INTERNAL ERROR or RVF_INVALID_PARAMETER */ TRACE_EVENT_P1("sAT_PlusCCLK(): ERROR2: %d", ret); /* Date and time setting failed */ return( AT_FAIL ); } #else /* _SIMULATION_ */ return( AT_CMPL ); #endif /* _SIMULATION_ */ } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCTZV | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CTZV AT command which will set the status of PCTZVmode, indicating whether time and date report is enabled or disabled. <on/off>: Indicates whether time and date report is enabled or disabled. */ GLOBAL T_ACI_RETURN sAT_PercentCTZV ( T_ACI_CMD_SRC srcId, T_ACI_PCTZV_MODE mode) { TRACE_FUNCTION ("sAT_PercentCTZV()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PercentCTZV(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * process the mode parameter *------------------------------------------------------------------- */ switch (mode) { case PCTZV_MODE_OFF: case PCTZV_MODE_ON: cmhPrm[srcId].mmCmdPrm.PCTZVMode = mode; break; default: TRACE_EVENT_P1("sAT_PercentCTZV(): Invalid mode: %d", mode); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCNIV | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the %CNIV AT command which will set the status of CNIVmode, indicating whether time and date report is enabled or disabled. <on/off>: Indicates whether time and date report is enabled or disabled. */ GLOBAL T_ACI_RETURN sAT_PercentCNIV ( T_ACI_CMD_SRC srcId, T_ACI_CNIV_MODE mode) { TRACE_FUNCTION ("sAT_PercentCNIV()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PercentCNIV(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * process the mode parameter *------------------------------------------------------------------- */ switch (mode) { case CNIV_MODE_OFF: case CNIV_MODE_ON: cmhPrm[srcId].mmCmdPrm.CNIVMode = mode; break; default: TRACE_EVENT_P1("sAT_PercentCNIV(): Invalid mode: %d", mode); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_MMS | | STATE : code ROUTINE : sAT_PercentCWUP | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CWUP AT command which will force RR to trigger a power campaign. */ GLOBAL T_ACI_RETURN sAT_PercentCWUP ( T_ACI_CMD_SRC srcId, T_ACI_CWUP_TYPE type ) { TRACE_FUNCTION ("sAT_PercentCWUP()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { TRACE_EVENT_P1("sAT_PercentCWUP(): Invalid source: %d", srcId); ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * check entity status *------------------------------------------------------------------- */ if( mmEntStat.curCmd NEQ AT_CMD_NONE ) { TRACE_EVENT("sAT_PercentCWUP(): MM is busy"); return( AT_BUSY ); } wake_up_rr(); return( AT_CMPL ); } /*==== EOF ========================================================*/