FreeCalypso > hg > fc-magnetite
diff src/g23m-aci/aci/aci_bat.c @ 162:53929b40109c
src/g23m-aci: initial import from TCS3.2/LoCosto
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Tue, 11 Oct 2016 02:02:43 +0000 |
parents | |
children |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/g23m-aci/aci/aci_bat.c Tue Oct 11 02:02:43 2016 +0000 @@ -0,0 +1,2180 @@ +/* ++----------------------------------------------------------------------------- +| Project : GSM-F&D (8411) +| Modul : ACI_BAT ++----------------------------------------------------------------------------- +| 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 is the main entry point of BAT at ACI. +| ++----------------------------------------------------------------------------- +*/ + +#ifndef ACI_BAT_C +#define ACI_BAT_C + +/*==== INCLUDES ===================================================*/ +#include "aci_all.h" +#include "aci_mem.h" +#include "aci_cmh.h" +#include "ati_cmd.h" +#include "dti.h" /* functionality of the dti library */ + +#include "aci.h" +#include "aci_lst.h" + +#include "psa_psi.h" +#include "cmh_psi.h" +#include "ati_src_psi.h" +#include "sap_dti.h" +#include "psa.h" +#include "cmh.h" + +#include "aci_bat_cmh.h" +#include "aci_bat.h" +#include "aci_bat_err.h" +#include "aci_bat_cb.h" /* for rBAT_OK */ +#include "aci_bat_ext.h" + +#include "l2p_types.h" +#include "l2p.h" +#include "bat_ctrl.h" +#include "aci_cmd.h" + +#include "ati_ext_mech.h" + +#ifdef _SIMULATION_ +#include "gdd_aci.h" +#endif + +/*==== CONSTANTS ==================================================*/ + +#define BAT_BIT_12 0x1000 +#define BAT_BIT_15 0x8000 +#define BAT_CTRL_CHANNEL 0xFE + +#define MAX_NORMAL_BUFFER_LEN (100-4) /* Since Malloc uses 4 additional internal bytes of the Blocks */ +#ifdef GPRS +#define MAX_LARGE_BUFFER_LEN (600-4) +#else +#define MAX_LARGE_BUFFER_LEN (400-4) +#endif + +/* This value must always match with >>#define BAT_RCV_BUF_SIZE 800<< of bat_types.h !!! */ +#define BAT_MTU_SIZE 800 /* %SIMEF response comes with 784 bytes. */ + +/*==== TYPES ======================================================*/ +typedef struct +{ + T_ACI_BAT_RSLT (*fptr)(T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd); /* BAT wrapper func */ +} BATCommand; + +typedef struct +{ + T_ACI_DTI_PRC_PSI *psi_src; /* remember which PSI source currently active */ + BOOL l2p_configured; + U32 l2p_mem[(L2P_CONTROL_BLOCK_HDR_SIZE+3)/4]; + U8 l2p_id; /* L2P calls this bat_id, for us it is a unique l2p_id */ +} T_ACI_BAT_GLOBALS; + +/*==== EXPORT =====================================================*/ + +/*==== VARIABLES ==================================================*/ + +LOCAL T_ACI_BAT_GLOBALS aci_bat_globs[CMD_SRC_MAX]; +LOCAL BOOL aci_bat_first_time = TRUE; + + +/* basic BAT commands, which are always supported */ +#define BAT_BAS(batFoo) {BAT_##batFoo} + +/* default extended BAT commands, which are always supported + * c = command type --> s=set, t=test, q=query + */ +#define BAT_DEF(c,batFoo) {c##BAT_##batFoo} + +#ifdef FAX_AND_DATA + #define BAT_FAD(c,batFoo) {c##BAT_##batFoo} +#else + #define BAT_FAD(c,batFoo) {0} +#endif + +#ifdef SIM_TOOLKIT + #define BAT_STK(c,batFoo) {c##BAT_##batFoo} +#else + #define BAT_STK(c,batFoo) {0} +#endif + +#ifdef GPRS + #define BAT_GPR(c,batFoo) {c##BAT_##batFoo} +#else + #define BAT_GPR(c,batFoo) {0} +#endif + +#if defined(FF_WAP) || defined(FF_TCP_IP) || defined(FF_SAT_E) + #define BAT_PPP(c,batFoo) {c##BAT_##batFoo} +#else + #define BAT_PPP(c,batFoo) {0} +#endif + +#ifdef TI_PS_FF_AT_CMD_P_ECC + #define BAT_ECC(c,batFoo) {c##BAT_##batFoo} +#else + #define BAT_ECC(c,batFoo) {0} +#endif /* TI_PS_FF_AT_CMD_P_ECC */ + +#ifdef SIM_PERS + #define BAT_SLK(c,batFoo) {c##BAT_##batFoo} +#else + #define BAT_SLK(c,batFoo) {0} +#endif /* SIM_PERS */ + +/* + * all the set commands are in range of 0x0000..0x0nnn + * T_BAT_ctrl_params types is used as index to the table + */ +#ifdef _SIMULATION_ +#pragma message( __TODO__"Currently No Support for Wide Chars !" ) +#endif +/* expand the macro by hand: BAT_DEF(s,PercentALS) --> sBAT_PercentALS */ +LOCAL const BATCommand bat_cmds [] = +{ + BAT_DEF(s,PercentALS), /* BAT_CMD_SET_PERCENT_ALS = 0x0 */ + BAT_DEF(s,PercentBAND), /* BAT_CMD_SET_PERCENT_BAND = 0x1 */ + BAT_BAS(ANDC), /* BAT_CMD_ANDC = 0x2 */ + BAT_DEF(s,PlusCACM), /* BAT_CMD_SET_PLUS_CACM = 0x3 */ + BAT_DEF(s,PlusCAMM), /* BAT_CMD_SET_PLUS_CAMM = 0x4 */ + BAT_DEF(s,PlusCAOC), /* BAT_CMD_SET_PLUS_CAOC = 0x5 */ + BAT_DEF(s,PercentCBHZ), /* BAT_CMD_SET_PERCENT_CBHZ = 0x6 */ +#ifdef FAX_AND_DATA + BAT_DEF(s,PlusCBST), /* BAT_CMD_SET_PLUS_CBST = 0x7 */ +#else + {NULL}, +#endif /* FAX_AND_DATA */ + BAT_DEF(s,PercentCCBS), /* BAT_CMD_SET_PERCENT_CCBS = 0x8 */ + BAT_DEF(s,PlusCCFC), /* BAT_CMD_SET_PLUS_CCFC = 0x9 */ + BAT_DEF(s,PlusCCLK), /* BAT_CMD_SET_PLUS_CCLK = 0xa */ + BAT_DEF(s,PlusCCUG), /* BAT_CMD_SET_PLUS_CCUG = 0xb */ + BAT_DEF(s,PlusCCWA), /* BAT_CMD_SET_PLUS_CCWA = 0xc */ + BAT_DEF(s,PlusCCWA), /* BAT_CMD_SET_PLUS_CCWA_W = 0xd */ + BAT_DEF(s,PlusCFUN), /* BAT_CMD_SET_PLUS_CFUN = 0xe */ + BAT_GPR(s,PercentCGAATT), /* BAT_CMD_SET_PERCENT_CGAATT = 0xf */ + BAT_GPR(s,PlusCGACT), /* BAT_CMD_SET_PLUS_CGACT = 0x10 */ + BAT_GPR(s,PlusCGANS), /* BAT_CMD_SET_PLUS_CGANS = 0x11 */ + BAT_GPR(s,PlusCGATT), /* BAT_CMD_SET_PLUS_CGATT = 0x12 */ + BAT_GPR(s,PercentCGCLASS), /* BAT_CMD_SET_PERCENT_CGCLASS = 0x13 */ + BAT_GPR(s,PlusCGCLASS), /* BAT_CMD_SET_PLUS_CGCLASS = 0x14 */ + BAT_GPR(s,PlusCGDATA), /* BAT_CMD_SET_PLUS_CGDATA = 0x15 */ + BAT_GPR(s,PlusCGDCONT), /* BAT_CMD_SET_PLUS_CGDCONT = 0x16 */ + BAT_GPR(s,PercentCGMM), /* BAT_CMD_SET_PERCENT_CGMM = 0x17 */ + BAT_GPR(s,PlusCGPADDR), /* BAT_CMD_SET_PLUS_CGPADDR = 0x18 */ + BAT_GPR(s,PercentCGPCO), /* BAT_CMD_SET_PERCENT_CGPCO = 0x19 */ + BAT_GPR(s,PercentCGPPP), /* BAT_CMD_SET_PERCENT_CGPPP = 0x1a */ + BAT_GPR(s,PlusCGQMIN), /* BAT_CMD_SET_PLUS_CGQMIN = 0x1b */ + BAT_GPR(s,PlusCGQREQ), /* BAT_CMD_SET_PLUS_CGQREQ = 0x1c */ + BAT_GPR(s,PlusCGSMS), /* BAT_CMD_SET_PLUS_CGSMS = 0x1d */ + BAT_DEF(s,PercentCHLD), /* BAT_CMD_SET_PERCENT_CHLD = 0x1e */ + BAT_DEF(s,PercentCHPL), /* BAT_CMD_SET_PERCENT_CHPL = 0x1f */ + BAT_DEF(s,PercentCHPL), /* BAT_CMD_SET_PERCENT_CHPL_W = 0x20 */ + BAT_DEF(s,PlusCIND), /* BAT_CMD_SET_PLUS_CIND = 0x21 */ + BAT_DEF(s,PlusCLAN), /* BAT_CMD_SET_PLUS_CLAN = 0x22 */ + BAT_DEF(s,PlusCLCK), /* BAT_CMD_SET_PLUS_CLCK = 0x23 */ + BAT_DEF(s,PlusCLIR), /* BAT_CMD_SET_PLUS_CLIR = 0x24 */ + BAT_DEF(s,PlusCLVL), /* BAT_CMD_SET_PLUS_CLVL = 0x25 */ + BAT_DEF(s,PlusCMER), /* BAT_CMD_SET_PLUS_CMER = 0x26 */ + BAT_DEF(s,PlusCMGC), /* BAT_CMD_SET_PLUS_CMGC = 0x27 */ + BAT_DEF(s,PlusCMGD), /* BAT_CMD_SET_PLUS_CMGD = 0x28 */ + BAT_DEF(s,PlusCMGL), /* BAT_CMD_SET_PLUS_CMGL = 0x29 */ + BAT_DEF(s,PlusCMGL), /* BAT_CMD_SET_PLUS_CMGL_W = 0x2a */ + BAT_DEF(s,PlusCMGR), /* BAT_CMD_SET_PLUS_CMGR = 0x2b */ + BAT_DEF(s,PlusCMGR), /* BAT_CMD_SET_PLUS_CMGR_W = 0x2c */ + BAT_DEF(s,PlusCMGS), /* BAT_CMD_SET_PLUS_CMGS = 0x2d */ + BAT_DEF(s,PlusCMGW), /* BAT_CMD_SET_PLUS_CMGW = 0x2e */ + BAT_DEF(s,PlusCMOD), /* BAT_CMD_SET_PLUS_CMOD = 0x2f */ + BAT_DEF(s,PlusCMSS), /* BAT_CMD_SET_PLUS_CMSS = 0x30 */ + BAT_DEF(s,PlusCMUT), /* BAT_CMD_SET_PLUS_CMUT = 0x31 */ + BAT_DEF(s,PlusCMUX), /* BAT_CMD_SET_PLUS_CMUX = 0x32 */ + BAT_DEF(s,PlusCNMA), /* BAT_CMD_SET_PLUS_CNMA = 0x33 */ + BAT_DEF(s,PlusCNMI), /* BAT_CMD_SET_PLUS_CNMI = 0x34 */ + BAT_DEF(s,PercentCOPS), /* BAT_CMD_SET_PERCENT_COPS = 0x35 */ + BAT_DEF(s,PlusCOPS), /* BAT_CMD_SET_PLUS_COPS = 0x36 */ + BAT_DEF(s,PercentCOPS), /* BAT_CMD_SET_PERCENT_COPS_W = 0x37 */ +#ifdef FF_CPHS + BAT_DEF(s,PercentCPALS), /* BAT_CMD_SET_PERCENT_CPALS = 0x38 */ + BAT_DEF(s,PercentCPALS), /* BAT_CMD_SET_PERCENT_CPALS_W = 0x39 */ +#endif + BAT_DEF(s,PlusCPBF), /* BAT_CMD_SET_PLUS_CPBF = 0x3a */ + BAT_DEF(s,PlusCPBF), /* BAT_CMD_SET_PLUS_CPBF_W = 0x3b */ + BAT_DEF(s,PlusCPBR), /* BAT_CMD_SET_PLUS_CPBR = 0x3c */ + BAT_DEF(s,PlusCPBR), /* BAT_CMD_SET_PLUS_CPBR_W = 0x3d */ + BAT_DEF(s,PlusCPBS), /* BAT_CMD_SET_PLUS_CPBS = 0x3e */ + BAT_DEF(s,PlusCPBW), /* BAT_CMD_SET_PLUS_CPBW = 0x3f */ + BAT_DEF(s,PlusCPBW), /* BAT_CMD_SET_PLUS_CPBW_W = 0x40 */ +#ifdef FF_CPHS + BAT_DEF(s,PercentCPCFU), /* BAT_CMD_SET_PERCENT_CPCFU = 0x41 */ + BAT_DEF(s,PercentCPHS), /* BAT_CMD_SET_PERCENT_CPHS = 0x42 */ +#endif + BAT_DEF(s,PlusCPIN), /* BAT_CMD_SET_PLUS_CPIN = 0x43 */ +#ifdef FF_CPHS + BAT_DEF(s,PercentCPMB), /* BAT_CMD_SET_PERCENT_CPMB = 0x44 */ + BAT_DEF(s,PercentCPMBW), /* BAT_CMD_SET_PERCENT_CPMBW = 0x45 */ + BAT_DEF(s,PercentCPMBW), /* BAT_CMD_SET_PERCENT_CPMBW_W = 0x46 */ + BAT_DEF(s,PercentCPMB), /* BAT_CMD_SET_PERCENT_CPMB_W = 0x47 */ +#endif + BAT_DEF(s,PlusCPMS), /* BAT_CMD_SET_PLUS_CPMS = 0x48 */ +#ifdef FF_CPHS + BAT_DEF(s,PercentCPNUMS), /* BAT_CMD_SET_PERCENT_CPNUMS = 0x49 */ + BAT_DEF(s,PercentCPNUMS), /* BAT_CMD_SET_PERCENT_CPNUMS_W = 0x4a */ +#endif + BAT_DEF(s,PlusCPOL), /* BAT_CMD_SET_PLUS_CPOL = 0x4b */ + BAT_DEF(s,PlusCPOL), /* BAT_CMD_SET_PLUS_CPOL_W = 0x4c */ +#ifdef TI_PS_FF_AT_P_CMD_CPRSM + BAT_DEF(s,PercentCPRSM), /* BAT_CMD_SET_PERCENT_CPRSM = 0x4d */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_CPRSM */ + BAT_DEF(s,PlusCPUC), /* BAT_CMD_SET_PLUS_CPUC = 0x4e */ + BAT_DEF(s,PlusCPUC), /* BAT_CMD_SET_PLUS_CPUC_W = 0x4f */ +#ifdef FF_CPHS + BAT_DEF(s,PercentCPVWI), /* BAT_CMD_SET_PERCENT_CPVWI = 0x50 */ +#endif + BAT_DEF(s,PlusCPWD), /* BAT_CMD_SET_PLUS_CPWD = 0x51 */ + BAT_DEF(s,PlusCRES), /* BAT_CMD_SET_PLUS_CRES = 0x52 */ + BAT_DEF(s,PlusCRLP), /* BAT_CMD_SET_PLUS_CRLP = 0x53 */ + BAT_DEF(s,PlusCRSM), /* BAT_CMD_SET_PLUS_CRSM = 0x54 */ + BAT_DEF(s,PlusCSAS), /* BAT_CMD_SET_PLUS_CSAS = 0x55 */ + BAT_DEF(s,PlusCSCA), /* BAT_CMD_SET_PLUS_CSCA = 0x56 */ + BAT_DEF(s,PlusCSCB), /* BAT_CMD_SET_PLUS_CSCB = 0x57 */ + BAT_DEF(s,PlusCSCS), /* BAT_CMD_SET_PLUS_CSCS = 0x58 */ + BAT_DEF(s,PlusCSIM), /* BAT_CMD_SET_PLUS_CSIM = 0x59 */ + BAT_DEF(s,PlusCSMS), /* BAT_CMD_SET_PLUS_CSMS = 0x5a */ + BAT_DEF(s,PlusCSNS), /* BAT_CMD_SET_PLUS_CSNS = 0x5b */ + BAT_DEF(s,PlusCSTA), /* BAT_CMD_SET_PLUS_CSTA = 0x5c */ + BAT_DEF(s,PlusCSVM), /* BAT_CMD_SET_PLUS_CSVM = 0x5d */ + BAT_DEF(s,PlusCTFR), /* BAT_CMD_SET_PLUS_CTFR = 0x5e */ + BAT_DEF(s,PercentCTTY), /* BAT_CMD_SET_PERCENT_CTTY = 0x5f */ + BAT_DEF(s,PlusCTZU), /* BAT_CMD_SET_PLUS_CTZU = 0x60 */ + BAT_DEF(s,PlusCUSD), /* BAT_CMD_SET_PLUS_CUSD = 0x61 */ + BAT_DEF(s,PlusCUSD), /* BAT_CMD_SET_PLUS_CUSD_W = 0x62 */ +#ifdef TI_PS_FF_AT_P_CMD_CUST + BAT_DEF(s,PercentCUST), /* BAT_CMD_SET_PERCENT_CUST = 0x63 */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_CUST */ + BAT_DEF(s,PercentCWUP), /* BAT_CMD_SET_PERCENT_CWUP = 0x64 */ + BAT_BAS(D), /* BAT_CMD_AT_D = 0x65 */ + BAT_DEF(s,PercentDATA), /* BAT_CMD_SET_PERCENT_DATA = 0x66 */ + BAT_DEF(s,PercentDINF), /* BAT_CMD_SET_PERCENT_DINF = 0x67 */ + BAT_DEF(s,PlusDS), /* BAT_CMD_SET_PLUS_DS = 0x68 */ + BAT_BAS(D), /* BAT_CMD_AT_D_W = 0x69 */ + BAT_DEF(s,PercentEFRSLT), /* BAT_CMD_SET_PERCENT_EFRSLT = 0x6a */ + BAT_DEF(s,PercentEM), /* BAT_CMD_SET_PERCENT_EM = 0x6b */ + BAT_FAD(s,PlusFAP), /* BAT_CMD_SET_PLUS_FAP = 0x6c */ + BAT_FAD(s,PlusFBO), /* BAT_CMD_SET_PLUS_FBO = 0x6d */ + BAT_FAD(s,PlusFBU), /* BAT_CMD_SET_PLUS_FBU = 0x6e */ + BAT_FAD(s,PlusFCC), /* BAT_CMD_SET_PLUS_FCC = 0x6f */ + BAT_FAD(s,PlusFCLASS), /* BAT_CMD_SET_PLUS_FCLASS = 0x70 */ + BAT_FAD(s,PlusFCQ), /* BAT_CMD_SET_PLUS_FCQ = 0x71 */ + BAT_FAD(s,PlusFCR), /* BAT_CMD_SET_PLUS_FCR = 0x72 */ + BAT_FAD(s,PlusFCT), /* BAT_CMD_SET_PLUS_FCT = 0x73 */ + BAT_FAD(s,PlusFEA), /* BAT_CMD_SET_PLUS_FEA = 0x74 */ + BAT_FAD(s,PlusFFC), /* BAT_CMD_SET_PLUS_FFC = 0x75 */ + BAT_FAD(s,PlusFIE), /* BAT_CMD_SET_PLUS_FIE = 0x76 */ + BAT_FAD(s,PlusFIS), /* BAT_CMD_SET_PLUS_FIS = 0x77 */ + BAT_FAD(s,PlusFIT), /* BAT_CMD_SET_PLUS_FIT = 0x78 */ + BAT_FAD(s,PlusFLI), /* BAT_CMD_SET_PLUS_FLI = 0x79 */ + BAT_FAD(s,PlusFLO), /* BAT_CMD_SET_PLUS_FLO = 0x7a */ + BAT_FAD(s,PlusFLP), /* BAT_CMD_SET_PLUS_FLP = 0x7b */ + BAT_FAD(s,PlusFMS), /* BAT_CMD_SET_PLUS_FMS = 0x7c */ + BAT_FAD(s,PlusFNS), /* BAT_CMD_SET_PLUS_FNS = 0x7d */ + BAT_FAD(s,PlusFPA), /* BAT_CMD_SET_PLUS_FPA = 0x7e */ + BAT_FAD(s,PlusFPI), /* BAT_CMD_SET_PLUS_FPI = 0x7f */ + BAT_FAD(s,PlusFPS), /* BAT_CMD_SET_PLUS_FPS = 0x80 */ + BAT_FAD(s,PlusFPW), /* BAT_CMD_SET_PLUS_FPW = 0x81 */ + BAT_FAD(s,PlusFRQ), /* BAT_CMD_SET_PLUS_FRQ = 0x82 */ + BAT_FAD(s,PlusFSA), /* BAT_CMD_SET_PLUS_FSA = 0x83 */ + BAT_FAD(s,PlusFSP), /* BAT_CMD_SET_PLUS_FSP = 0x84 */ + BAT_DEF(s,PlusICF), /* BAT_CMD_SET_PLUS_ICF = 0x85 */ + BAT_DEF(s,PlusIFC), /* BAT_CMD_SET_PLUS_IFC = 0x86 */ + BAT_DEF(s,PlusIPR), /* BAT_CMD_SET_PLUS_IPR = 0x87 */ + BAT_DEF(s,PercentPBCF), /* BAT_CMD_SET_PERCENT_PBCF = 0x88 */ + BAT_PPP(s,PercentPPP), /* BAT_CMD_SET_PERCENT_PPP = 0x89 */ + BAT_DEF(s,PercentPVRF), /* BAT_CMD_SET_PERCENT_PVRF = 0x8a */ + BAT_DEF(s,PercentRDL), /* BAT_CMD_SET_PERCENT_RDL = 0x8b */ +#ifdef TI_PS_FF_AT_P_CMD_RDLB + BAT_DEF(s,PercentRDLB), /* BAT_CMD_SET_PERCENT_RDLB = 0x8c */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_RDLB */ + BAT_STK(s,PercentSATC), /* BAT_CMD_SET_PERCENT_SATC = 0x8d */ + BAT_STK(s,PercentSATCC), /* BAT_CMD_SET_PERCENT_SATCC = 0x8e */ + BAT_STK(s,PercentSATE), /* BAT_CMD_SET_PERCENT_SATE = 0x8f */ + BAT_STK(s,PercentSATR), /* BAT_CMD_SET_PERCENT_SATR = 0x80 */ + BAT_STK(s,PercentSATT), /* BAT_CMD_SET_PERCENT_SATT = 0x91 */ + BAT_GPR(s,PercentSNCNT), /* BAT_CMD_SET_PERCENT_SNCNT = 0x92 */ + BAT_DEF(s,PercentVTS), /* BAT_CMD_SET_PERCENT_VTS = 0x93 */ + BAT_DEF(s,PlusVTS), /* BAT_CMD_SET_PLUS_VTS = 0x94 */ +#ifdef TI_PS_FF_AT_CMD_WS46 + BAT_DEF(s,PlusWS46), /* BAT_CMD_SET_PLUS_WS46 = 0x95 */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_CMD_WS46 */ +#ifdef FF_CPHS + BAT_DEF(s,PercentCPINF), /* BAT_CMD_SET_PERCENT_CPINF = 0x96 */ +#endif + BAT_DEF(s,PercentCMGR), /* BAT_CMD_SET_PERCENT_CMGR = 0x97 */ + BAT_DEF(s,PercentCMGL), /* BAT_CMD_SET_PERCENT_CMGL = 0x98 */ + BAT_DEF(s,PercentCTZV), /* BAT_CMD_SET_PERCENT_CTZV = 0x99 */ + BAT_DEF(s,PercentECC), /* BAT_CMD_SET_PERCENT_ECC = 0x9a */ + BAT_SLK(s,PercentMEPD), /* BAT_CMD_SET_PERCENT_MEPD = 0x9b */ + BAT_DEF(s,PercentCSQ), /* BAT_CMD_SET_PERCENT_CSQ = 0x9c */ + BAT_DEF(s,PercentCNIV), /* BAT_CMD_SET_PERCENT_CNIV = 0x9d */ +#ifdef REL99 + BAT_DEF(s,PercentCMGRS), /* BAT_CMD_SET_PERCENT_CMGRS = 0x9e */ + BAT_GPR(s,PlusCGCMOD), /* BAT_CMD_SET_PLUS_CGDSCONT = 0x9f */ + BAT_GPR(s,PlusCGDSCONT), /* BAT_CMD_SET_PLUS_CGDSCONT = 0xA0 */ + BAT_GPR(s,PlusCGEQREQ), /* BAT_CMD_SET_PLUS_CGEQREQ = 0xA1 */ + BAT_GPR(s,PlusCGEQMIN), /* BAT_CMD_SET_PLUS_CGEQMIN = 0xA2 */ + BAT_GPR(s,PlusCGEQNEG), /* BAT_CMD_SET_PLUS_CGEQNEG = 0xA3 */ + BAT_GPR(s,PlusCGTFT), /* BAT_CMD_SET_PLUS_CGTFT = 0xA4 */ +#endif + BAT_DEF(s,PercentSIMEF) /* BAT_CMD_SET_PERCENT_SIMEF = 0xA7 */ +}; + +LOCAL const BATCommand bat_cmds_without_params [] = +{ + BAT_BAS(A), /* BAT_CMD_AT_A = 0x1000 */ + BAT_DEF(s,PlusCBC), /* BAT_CMD_SET_PLUS_CBC = 0x1001 */ + BAT_DEF(s,PlusCEER), /* BAT_CMD_SET_PLUS_CEER = 0x1002 */ + BAT_DEF(s,PlusCIMI), /* BAT_CMD_SET_PLUS_CIMI = 0x1003 */ + BAT_DEF(s,PlusCNUM), /* BAT_CMD_SET_PLUS_CNUM = 0x1004 */ + BAT_DEF(s,PlusCNUM), /* BAT_CMD_SET_PLUS_CNUM_W = 0x1005 */ + BAT_DEF(s,PlusCPAS), /* BAT_CMD_SET_PLUS_CPAS = 0x1006 */ + BAT_DEF(s,PlusCSQ), /* BAT_CMD_SET_PLUS_CSQ = 0x1007 */ + BAT_BAS(ANDF), /* BAT_CMD_ANDF = 0x1008 */ + BAT_BAS(H), /* BAT_CMD_AT_H = 0x1009 */ + BAT_BAS(O), /* BAT_CMD_AT_O = 0x100a */ + BAT_BAS(Z), /* BAT_CMD_AT_Z = 0x100b */ + BAT_DEF(q,PercentALS), /* BAT_CMD_QUE_PERCENT_ALS = 0x100c */ + BAT_DEF(t,PercentALS), /* BAT_CMD_TST_PERCENT_ALS = 0x100d */ +#ifdef TI_PS_FF_AT_P_CMD_ATR + BAT_DEF(q,PercentATR), /* BAT_CMD_QUE_PERCENT_ATR = 0x100e */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_ATR */ + BAT_DEF(q,PercentBAND), /* BAT_CMD_QUE_PERCENT_BAND = 0x100f */ + BAT_DEF(t,PercentBAND), /* BAT_CMD_TST_PERCENT_BAND = 0x1010 */ + BAT_DEF(q,PlusCACM), /* BAT_CMD_QUE_PLUS_CACM = 0x1011 */ + BAT_DEF(q,PlusCAMM), /* BAT_CMD_QUE_PLUS_CAMM = 0x1012 */ + BAT_DEF(q,PercentCBHZ), /* BAT_CMD_QUE_PERCENT_CBHZ = 0x1013 */ + BAT_DEF(t,PercentCBHZ), /* BAT_CMD_TST_PERCENT_CBHZ = 0x1014 */ +#ifdef FAX_AND_DATA + BAT_DEF(q,PlusCBST), /* BAT_CMD_QUE_PLUS_CBST = 0x1015 */ +#else + {NULL}, +#endif /* FAX_AND_DATA */ + BAT_DEF(q,PercentCCBS), /* BAT_CMD_QUE_PERCENT_CCBS = 0x1016 */ + BAT_DEF(q,PlusCCLK), /* BAT_CMD_QUE_PLUS_CCLK = 0x1017 */ + BAT_DEF(q,PlusCCUG), /* BAT_CMD_QUE_PLUS_CCUG = 0x1018 */ + BAT_DEF(q,PlusCFUN), /* BAT_CMD_QUE_PLUS_CFUN = 0x1019 */ + BAT_GPR(q,PercentCGAATT), /* BAT_CMD_QUE_PERCENT_CGAATT = 0x101a */ + BAT_GPR(q,PlusCGACT), /* BAT_CMD_QUE_PLUS_CGACT = 0x101b */ + BAT_GPR(q,PlusCGATT), /* BAT_CMD_QUE_PLUS_CGATT = 0x101c */ + BAT_GPR(q,PercentCGCLASS), /* BAT_CMD_QUE_PERCENT_CGCLASS = 0x101d */ + BAT_GPR(q,PlusCGCLASS), /* BAT_CMD_QUE_PLUS_CGCLASS = 0x101e */ + BAT_GPR(q,PlusCGDCONT), /* BAT_CMD_QUE_PLUS_CGDCONT = 0x101f */ + BAT_GPR(t,PlusCGPADDR), /* BAT_CMD_TST_PLUS_CGPADDR = 0x1020 */ + BAT_GPR(q,PercentCGPPP), /* BAT_CMD_QUE_PERCENT_CGPPP = 0x1021 */ + BAT_GPR(q,PlusCGQMIN), /* BAT_CMD_QUE_PLUS_CGQMIN = 0x1022 */ + BAT_GPR(q,PlusCGQREQ), /* BAT_CMD_QUE_PLUS_CGQREQ = 0x1023 */ + BAT_GPR(q,PercentCGREG), /* BAT_CMD_QUE_PERCENT_CGREG = 0x1024 */ + BAT_GPR(q,PlusCGREG), /* BAT_CMD_QUE_PLUS_CGREG = 0x1025 */ + BAT_GPR(q,PlusCGSMS), /* BAT_CMD_QUE_PLUS_CGSMS = 0x1026 */ + BAT_DEF(q,PlusCIND), /* BAT_CMD_QUE_PLUS_CIND = 0x1027 */ + BAT_DEF(q,PlusCLAN), /* BAT_CMD_QUE_PLUS_CLAN = 0x1028 */ + BAT_DEF(t,PlusCLAN), /* BAT_CMD_TST_PLUS_CLAN = 0x1029 */ + BAT_DEF(q,PlusCLCC), /* BAT_CMD_QUE_PLUS_CLCC = 0x102a */ + BAT_DEF(q,PlusCLIP), /* BAT_CMD_QUE_PLUS_CLIP = 0x102b */ + BAT_DEF(q,PlusCLIP), /* BAT_CMD_QUE_PLUS_CLIP_W = 0x102c */ + BAT_DEF(q,PlusCLIR), /* BAT_CMD_QUE_PLUS_CLIR = 0x102d */ + BAT_DEF(q,PlusCLVL), /* BAT_CMD_QUE_PLUS_CLVL = 0x102e */ + BAT_DEF(q,PlusCMER), /* BAT_CMD_QUE_PLUS_CMER = 0x102f */ + BAT_DEF(q,PlusCMOD), /* BAT_CMD_QUE_PLUS_CMOD = 0x1030 */ + BAT_DEF(q,PlusCMUT), /* BAT_CMD_QUE_PLUS_CMUT = 0x1031 */ + BAT_DEF(q,PlusCMUX), /* BAT_CMD_QUE_PLUS_CMUX = 0x1032 */ + BAT_DEF(q,PercentCNAP), /* BAT_CMD_QUE_PERCENT_CNAP = 0x1033 */ + BAT_DEF(q,PlusCNMI), /* BAT_CMD_QUE_PLUS_CNMI = 0x1034 */ + BAT_DEF(q,PlusCOLP), /* BAT_CMD_QUE_PLUS_COLP = 0x1035 */ + BAT_DEF(q,PlusCOLP), /* BAT_CMD_QUE_PLUS_COLP_W = 0x1036 */ + BAT_DEF(q,PercentCOPS), /* BAT_CMD_QUE_PERCENT_COPS = 0x1037 */ + BAT_DEF(t,PercentCOPS), /* BAT_CMD_TST_PERCENT_COPS = 0x1038 */ + BAT_DEF(q,PlusCOPS), /* BAT_CMD_QUE_PLUS_COPS = 0x1039 */ + BAT_DEF(t,PlusCOPS), /* BAT_CMD_TST_PLUS_COPS = 0x103a */ + BAT_DEF(q,PercentCOPS), /* BAT_CMD_QUE_PERCENT_COPS_W = 0x103b */ + BAT_DEF(t,PercentCOPS), /* BAT_CMD_TST_PERCENT_COPS_W = 0x103c */ +#ifdef FF_CPHS + BAT_DEF(q,PercentCPALS), /* BAT_CMD_QUE_PERCENT_CPALS = 0x103d */ + BAT_DEF(q,PercentCPALS), /* BAT_CMD_QUE_PERCENT_CPALS_W = 0x103e */ +#endif + BAT_DEF(t,PlusCPBF), /* BAT_CMD_TST_PLUS_CPBF = 0x103f */ + BAT_DEF(t,PlusCPBF), /* BAT_CMD_TST_PLUS_CPBF_W = 0x1040 */ + BAT_DEF(t,PlusCPBR), /* BAT_CMD_TST_PLUS_CPBR = 0x1041 */ + BAT_DEF(t,PlusCPBR), /* BAT_CMD_TST_PLUS_CPBR_W = 0x1042 */ + BAT_DEF(q,PercentCPBS), /* BAT_CMD_QUE_PERCENT_CPBS = 0x1043 */ + BAT_DEF(q,PlusCPBS), /* BAT_CMD_QUE_PLUS_CPBS = 0x1044 */ + BAT_DEF(t,PlusCPBW), /* BAT_CMD_TST_PLUS_CPBW = 0x1045 */ + BAT_DEF(t,PlusCPBW), /* BAT_CMD_TST_PLUS_CPBW_W = 0x1046 */ + #ifdef FF_CPHS //fix x0083023 + BAT_DEF(q,PercentCPHS), /* BAT_CMD_QUE_PERCENT_CPHS = 0x1047 */ + #endif + BAT_DEF(q,PlusCPIN), /* BAT_CMD_QUE_PLUS_CPIN = 0x1048 */ +#ifdef FF_CPHS + BAT_DEF(q,PercentCPINF), /* BAT_CMD_QUE_PERCENT_CPINF = 0x1049 */ + BAT_DEF(q,PercentCPMB), /* BAT_CMD_QUE_PERCENT_CPMB = 0x104a */ + BAT_DEF(t,PercentCPMBW), /* BAT_CMD_TST_PERCENT_CPMBW = 0x104b */ + BAT_DEF(t,PercentCPMBW), /* BAT_CMD_TST_PERCENT_CPMBW_W = 0x104c */ +#endif + BAT_DEF(q,PlusCPMS), /* BAT_CMD_QUE_PLUS_CPMS = 0x104d */ +#ifdef FF_CPHS + BAT_DEF(t,PercentCPNUMS), /* BAT_CMD_TST_PERCENT_CPNUMS = 0x104e */ + BAT_DEF(t,PercentCPNUMS), /* BAT_CMD_TST_PERCENT_CPNUMS_W = 0x104f */ +#endif + BAT_DEF(q,PlusCPOL), /* BAT_CMD_QUE_PLUS_CPOL = 0x1050 */ + BAT_DEF(t,PlusCPOL), /* BAT_CMD_TST_PLUS_CPOL = 0x1051 */ + BAT_DEF(q,PlusCPOL), /* BAT_CMD_QUE_PLUS_CPOL_W = 0x1052 */ + BAT_DEF(t,PlusCPOL), /* BAT_CMD_TST_PLUS_CPOL_W = 0x1053 */ +#ifdef FF_CPHS + BAT_DEF(q,PercentCPOPN), /* BAT_CMD_QUE_PERCENT_CPOPN = 0x1054 */ +#endif +#ifdef TI_PS_FF_AT_P_CMD_CPRSM + BAT_DEF(q,PercentCPRSM), /* BAT_CMD_QUE_PERCENT_CPRSM = 0x1055 */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_CPRSM */ + BAT_DEF(q,PlusCPUC), /* BAT_CMD_QUE_PLUS_CPUC = 0x1056 */ + BAT_DEF(q,PlusCPUC), /* BAT_CMD_QUE_PLUS_CPUC_W = 0x1057 */ + BAT_DEF(q,PercentCREG), /* BAT_CMD_QUE_PERCENT_CREG = 0x1058 */ + BAT_DEF(t,PlusCRES), /* BAT_CMD_TST_PLUS_CRES = 0x1059 */ + BAT_DEF(q,PlusCRLP), /* BAT_CMD_QUE_PLUS_CRLP = 0x105a */ + BAT_DEF(t,PlusCSAS), /* BAT_CMD_TST_PLUS_CSAS = 0x105b */ + BAT_DEF(q,PlusCSCA), /* BAT_CMD_QUE_PLUS_CSCA = 0x105c */ + BAT_DEF(q,PlusCSCB), /* BAT_CMD_QUE_PLUS_CSCB = 0x105d */ + BAT_DEF(q,PlusCSCS), /* BAT_CMD_QUE_PLUS_CSCS = 0x105e */ + BAT_DEF(q,PlusCSMS), /* BAT_CMD_QUE_PLUS_CSMS = 0x105f */ + BAT_DEF(q,PlusCSNS), /* BAT_CMD_QUE_PLUS_CSNS = 0x1060 */ + BAT_DEF(q,PercentCSQ), /* BAT_CMD_QUE_PERCENT_CSQ = 0x1061 */ + BAT_DEF(q,PlusCSTA), /* BAT_CMD_QUE_PLUS_CSTA = 0x1062 */ + BAT_DEF(q,PlusCSVM), /* BAT_CMD_QUE_PLUS_CSVM = 0x1063 */ + BAT_DEF(q,PercentCTTY), /* BAT_CMD_QUE_PERCENT_CTTY = 0x1064 */ + BAT_DEF(q,PlusCTZU), /* BAT_CMD_QUE_PLUS_CTZU = 0x1065 */ +#ifdef TI_PS_FF_AT_P_CMD_CUST + BAT_DEF(q,PercentCUST), /* BAT_CMD_QUE_PERCENT_CUST = 0x1066 */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_CUST */ + BAT_DEF(q,PercentDATA), /* BAT_CMD_QUE_PERCENT_DATA = 0x1067 */ + BAT_DEF(q,PlusDS), /* BAT_CMD_QUE_PLUS_DS = 0x1068 */ + BAT_FAD(q,PlusFAP), /* BAT_CMD_QUE_PLUS_FAP = 0x1069 */ + BAT_FAD(q,PlusFBO), /* BAT_CMD_QUE_PLUS_FBO = 0x106a */ + BAT_FAD(q,PlusFBS), /* BAT_CMD_QUE_PLUS_FBS = 0x106b */ + BAT_FAD(q,PlusFBU), /* BAT_CMD_QUE_PLUS_FBU = 0x106c */ + BAT_FAD(q,PlusFCC), /* BAT_CMD_QUE_PLUS_FCC = 0x106d */ + BAT_FAD(q,PlusFCLASS), /* BAT_CMD_QUE_PLUS_FCLASS = 0x106e */ + BAT_FAD(q,PlusFCQ), /* BAT_CMD_QUE_PLUS_FCQ = 0x106f */ + BAT_FAD(q,PlusFCR), /* BAT_CMD_QUE_PLUS_FCR = 0x1070 */ + BAT_FAD(q,PlusFCS), /* BAT_CMD_QUE_PLUS_FCS = 0x1071 */ + BAT_FAD(q,PlusFCT), /* BAT_CMD_QUE_PLUS_FCT = 0x1072 */ + {NULL}, /* BAT_CMD_QUE_PLUS_FEA = 0x1073 */ + BAT_FAD(q,PlusFFC), /* BAT_CMD_QUE_PLUS_FFC = 0x1074 */ + BAT_FAD(q,PlusFHS), /* BAT_CMD_QUE_PLUS_FHS = 0x1075 */ + BAT_FAD(q,PlusFIE), /* BAT_CMD_QUE_PLUS_FIE = 0x1076 */ + BAT_FAD(q,PlusFIS), /* BAT_CMD_QUE_PLUS_FIS = 0x1077 */ + BAT_FAD(q,PlusFIT), /* BAT_CMD_QUE_PLUS_FIT = 0x1078 */ + BAT_FAD(q,PlusFLI), /* BAT_CMD_QUE_PLUS_FLI = 0x1079 */ + BAT_FAD(q,PlusFLO), /* BAT_CMD_QUE_PLUS_FLO = 0x107a */ + BAT_FAD(q,PlusFLP), /* BAT_CMD_QUE_PLUS_FLP = 0x107b */ + BAT_FAD(q,PlusFMS), /* BAT_CMD_QUE_PLUS_FMS = 0x107c */ + BAT_FAD(q,PlusFNS), /* BAT_CMD_QUE_PLUS_FNS = 0x107d */ + BAT_FAD(q,PlusFPA), /* BAT_CMD_QUE_PLUS_FPA = 0x107e */ + BAT_FAD(q,PlusFPI), /* BAT_CMD_QUE_PLUS_FPI = 0x107f */ + BAT_FAD(q,PlusFPS), /* BAT_CMD_QUE_PLUS_FPS = 0x1080 */ + BAT_FAD(q,PlusFPW), /* BAT_CMD_QUE_PLUS_FPW = 0x1081 */ + BAT_FAD(q,PlusFRQ), /* BAT_CMD_QUE_PLUS_FRQ = 0x1082 */ + BAT_FAD(q,PlusFSA), /* BAT_CMD_QUE_PLUS_FSA = 0x1083 */ + BAT_FAD(q,PlusFSP), /* BAT_CMD_QUE_PLUS_FSP = 0x1084 */ + BAT_DEF(q,PlusICF), /* BAT_CMD_QUE_PLUS_ICF = 0x1085 */ + BAT_DEF(q,PlusIFC), /* BAT_CMD_QUE_PLUS_IFC = 0x1086 */ + {NULL}, /* BAT_CMD_QUE_PERCENT_IMEI = 0x1087 */ + BAT_DEF(q,PlusIPR), /* BAT_CMD_QUE_PLUS_IPR = 0x1088 */ + BAT_DEF(q,PercentPBCF), /* BAT_CMD_QUE_PERCENT_PBCF = 0x1089 */ + BAT_PPP(q,PercentPPP), /* BAT_CMD_QUE_PERCENT_PPP = 0x108a */ + BAT_DEF(q,PercentPVRF), /* BAT_CMD_QUE_PERCENT_PVRF = 0x108b */ + BAT_DEF(q,PercentRDL), /* BAT_CMD_QUE_PERCENT_RDL = 0x108c */ +#ifdef TI_PS_FF_AT_P_CMD_RDLB + BAT_DEF(q,PercentRDLB), /* BAT_CMD_QUE_PERCENT_RDLB = 0x108d */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_P_CMD_RDLB */ + BAT_STK(q,PercentSATC), /* BAT_CMD_QUE_PERCENT_SATC = 0x108e */ + BAT_STK(q,PercentSATCC), /* BAT_CMD_QUE_PERCENT_SATCC = 0x108f */ + BAT_GPR(q,PercentSNCNT), /* BAT_CMD_QUE_PERCENT_SNCNT = 0x1090 */ +#ifdef TI_PS_FF_AT_CMD_WS46 + BAT_DEF(q,PlusWS46), /* BAT_CMD_QUE_PLUS_WS46 = 0x1091 */ +#else + {NULL}, +#endif /* TI_PS_FF_AT_CMD_WS46 */ + BAT_DEF(q,PlusCDIP), /* BAT_CMD_QUE_PLUS_CDIP = 0x1092 */ + BAT_DEF(s,PlusCGMI), /* BAT_CMD_SET_PLUS_CGMI = 0x1093 */ + BAT_DEF(s,PlusCGMM), /* BAT_CMD_SET_PLUS_CGMM = 0x1094 */ + BAT_DEF(s,PlusCGMR), /* BAT_CMD_SET_PLUS_CGMR = 0x1095 */ + BAT_DEF(s,PlusCGSN), /* BAT_CMD_SET_PLUS_CGSN = 0x1096 */ + BAT_DEF(q,PercentCNIV), /* BAT_CMD_QUE_PERCENT_CNIV = 0x1097 */ + {NULL}, /* BAT_CMD_QUE_PERCENT_CMGRS = 0x1098 */ + {NULL}, /*BAT_DEF(q,PercentPBCI), BAT_CMD_QUE_PERCENT_PBCI = 0x1099 */ + BAT_DEF(q,PercentSIMEF), /*BAT_CMD_QUE_PERCENT_SIMEF = 0x109A */ + BAT_DEF(s,PlusCHUP) /*BAT_CMD_SET_PLUS_CHUP = 0x109B */ +}; + + +typedef struct +{ + size_t size; +} T_map_response_2_size; + +static T_map_response_2_size response_2_size[] = +{ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_OK = 0x0 */ + {sizeof(T_BAT_res_at_connect)}, /* BAT_RES_AT_CONNECT = 0x1 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_NO_CARRIER_FINAL = 0x2 */ + {sizeof(T_BAT_res_plus_cme_error)}, /* BAT_RES_PLUS_CME_ERROR = 0x3 */ + {sizeof(T_BAT_res_plus_cms_error)}, /* BAT_RES_PLUS_CMS_ERROR = 0x4 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_BUSY = 0x5 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_CHANNEL_BUSY = 0x6 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_AT_NO_ANSWER = 0x7 */ + {sizeof(T_BAT_res_plus_ext_error)}, /* BAT_RES_PLUS_EXT_ERROR = 0x8 */ + {sizeof(T_BAT_res_que_percent_als)}, /* BAT_RES_QUE_PERCENT_ALS = 0x9 */ + {sizeof(T_BAT_res_tst_percent_als)}, /* BAT_RES_TST_PERCENT_ALS = 0xa */ + {sizeof(T_BAT_res_que_percent_atr)}, /* BAT_RES_QUE_PERCENT_ATR = 0xb */ + {sizeof(T_BAT_res_que_percent_band)}, /* BAT_RES_QUE_PERCENT_BAND = 0xc */ + {sizeof(T_BAT_res_tst_percent_band)}, /* BAT_RES_TST_PERCENT_BAND = 0xd */ + {sizeof(T_BAT_res_que_plus_cacm)}, /* BAT_RES_QUE_PLUS_CACM = 0xe */ + {sizeof(T_BAT_res_que_plus_camm)}, /* BAT_RES_QUE_PLUS_CAMM = 0xf */ + {sizeof(T_BAT_res_set_plus_caoc)}, /* BAT_RES_SET_PLUS_CAOC = 0x10 */ + {sizeof(T_BAT_res_set_plus_cbc)}, /* BAT_RES_SET_PLUS_CBC = 0x11 */ + {sizeof(T_BAT_res_que_percent_cbhz)}, /* BAT_RES_QUE_PERCENT_CBHZ = 0x12 */ + {sizeof(T_BAT_res_tst_percent_cbhz)}, /* BAT_RES_TST_PERCENT_CBHZ = 0x13 */ + {sizeof(T_BAT_res_que_plus_cbst)}, /* BAT_RES_QUE_PLUS_CBST = 0x14 */ + {sizeof(T_BAT_res_que_percent_ccbs)}, /* BAT_RES_QUE_PERCENT_CCBS = 0x15 */ + {sizeof(T_BAT_res_set_plus_ccfc)}, /* BAT_RES_SET_PLUS_CCFC = 0x16 */ + {sizeof(T_BAT_res_que_plus_cclk)}, /* BAT_RES_QUE_PLUS_CCLK = 0x17 */ + {sizeof(T_BAT_res_que_plus_ccug)}, /* BAT_RES_QUE_PLUS_CCUG = 0x18 */ + {sizeof(T_BAT_res_set_plus_ccwa)}, /* BAT_RES_SET_PLUS_CCWA = 0x19 */ + {sizeof(T_BAT_res_set_plus_ccwa_w)}, /* BAT_RES_SET_PLUS_CCWA_W = 0x1a */ + {sizeof(T_BAT_res_set_plus_ceer)}, /* BAT_RES_SET_PLUS_CEER = 0x1b */ + {sizeof(T_BAT_res_que_plus_cfun)}, /* BAT_RES_QUE_PLUS_CFUN = 0x1c */ + {sizeof(T_BAT_res_que_percent_cgaatt)}, /* BAT_RES_QUE_PERCENT_CGAATT = 0x1d */ + {sizeof(T_BAT_res_que_plus_cgact)}, /* BAT_RES_QUE_PLUS_CGACT = 0x1e */ + {sizeof(T_BAT_res_que_plus_cgatt)}, /* BAT_RES_QUE_PLUS_CGATT = 0x1f */ + {sizeof(T_BAT_res_que_percent_cgclass)}, /* BAT_RES_QUE_PERCENT_CGCLASS = 0x20 */ + {sizeof(T_BAT_res_que_plus_cgclass)}, /* BAT_RES_QUE_PLUS_CGCLASS = 0x21 */ + {sizeof(T_BAT_res_que_plus_cgdcont)}, /* BAT_RES_QUE_PLUS_CGDCONT = 0x22 */ + {sizeof(T_BAT_res_set_plus_cgpaddr)}, /* BAT_RES_SET_PLUS_CGPADDR = 0x23 */ + {sizeof(T_BAT_res_tst_plus_cgpaddr)}, /* BAT_RES_TST_PLUS_CGPADDR = 0x24 */ + {sizeof(T_BAT_res_set_percent_cgpco)}, /* BAT_RES_SET_PERCENT_CGPCO = 0x25 */ + {sizeof(T_BAT_res_que_percent_cgppp)}, /* BAT_RES_QUE_PERCENT_CGPPP = 0x26 */ + {sizeof(T_BAT_res_que_plus_cgqmin)}, /* BAT_RES_QUE_PLUS_CGQMIN = 0x27 */ + {sizeof(T_BAT_res_que_plus_cgqreq)}, /* BAT_RES_QUE_PLUS_CGQREQ = 0x28 */ + {sizeof(T_BAT_res_que_percent_cgreg)}, /* BAT_RES_QUE_PERCENT_CGREG = 0x29 */ + {sizeof(T_BAT_res_que_plus_cgreg)}, /* BAT_RES_QUE_PLUS_CGREG = 0x2a */ + {sizeof(T_BAT_res_que_plus_cgsms)}, /* BAT_RES_QUE_PLUS_CGSMS = 0x2b */ + {sizeof(T_BAT_res_set_percent_chpl)}, /* BAT_RES_SET_PERCENT_CHPL = 0x2c */ + {sizeof(T_BAT_res_set_percent_chpl_w)}, /* BAT_RES_SET_PERCENT_CHPL_W = 0x2d */ + {sizeof(T_BAT_res_set_plus_cimi)}, /* BAT_RES_SET_PLUS_CIMI = 0x2e */ + {sizeof(T_BAT_res_que_plus_cind)}, /* BAT_RES_QUE_PLUS_CIND = 0x2f */ + {sizeof(T_BAT_res_que_plus_clan)}, /* BAT_RES_QUE_PLUS_CLAN = 0x30 */ + {sizeof(T_BAT_res_tst_plus_clan)}, /* BAT_RES_TST_PLUS_CLAN = 0x31 */ + {sizeof(T_BAT_res_que_plus_clcc)}, /* BAT_RES_QUE_PLUS_CLCC = 0x32 */ + {sizeof(T_BAT_res_set_plus_clck)}, /* BAT_RES_SET_PLUS_CLCK = 0x33 */ + {sizeof(T_BAT_res_que_plus_clip)}, /* BAT_RES_QUE_PLUS_CLIP = 0x34 */ + {sizeof(T_BAT_res_que_plus_clip_w)}, /* BAT_RES_QUE_PLUS_CLIP_W = 0x35 */ + {sizeof(T_BAT_res_que_plus_clir)}, /* BAT_RES_QUE_PLUS_CLIR = 0x36 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_SET_PLUS_CLVL = 0x37 */ + {sizeof(T_BAT_res_que_plus_clvl)}, /* BAT_RES_QUE_PLUS_CLVL = 0x38 */ + {sizeof(T_BAT_res_que_plus_cmer)}, /* BAT_RES_QUE_PLUS_CMER = 0x39 */ + {sizeof(T_BAT_res_set_plus_cmgc)}, /* BAT_RES_SET_PLUS_CMGC = 0x3a */ + {sizeof(T_BAT_res_set_plus_cmgl)}, /* BAT_RES_SET_PLUS_CMGL = 0x3b */ + {sizeof(T_BAT_res_set_plus_cmgl_w)}, /* BAT_RES_SET_PLUS_CMGL_W = 0x3c */ + {sizeof(T_BAT_res_set_plus_cmgr)}, /* BAT_RES_SET_PLUS_CMGR = 0x3d */ + {sizeof(T_BAT_res_set_plus_cmgr_w)}, /* BAT_RES_SET_PLUS_CMGR_W = 0x3e */ + {sizeof(T_BAT_res_set_plus_cmgs)}, /* BAT_RES_SET_PLUS_CMGS = 0x3f */ + {sizeof(T_BAT_res_set_plus_cmgw)}, /* BAT_RES_SET_PLUS_CMGW = 0x40 */ + {sizeof(T_BAT_res_que_plus_cmod)}, /* BAT_RES_QUE_PLUS_CMOD = 0x41 */ + {sizeof(T_BAT_res_que_plus_cmut)}, /* BAT_RES_QUE_PLUS_CMUT = 0x42 */ + {sizeof(T_BAT_res_que_plus_cmux)}, /* BAT_RES_QUE_PLUS_CMUX = 0x43 */ + {sizeof(T_BAT_res_que_percent_cnap)}, /* BAT_RES_QUE_PERCENT_CNAP = 0x44 */ + {sizeof(T_BAT_res_que_plus_cnmi)}, /* BAT_RES_QUE_PLUS_CNMI = 0x45 */ + {sizeof(T_BAT_res_set_plus_cnum)}, /* BAT_RES_SET_PLUS_CNUM = 0x46 */ + {sizeof(T_BAT_res_set_plus_cnum_w)}, /* BAT_RES_SET_PLUS_CNUM_W = 0x47 */ + {sizeof(T_BAT_res_que_plus_colp)}, /* BAT_RES_QUE_PLUS_COLP = 0x48 */ + {sizeof(T_BAT_res_que_plus_colp_w)}, /* BAT_RES_QUE_PLUS_COLP_W = 0x49 */ + {sizeof(T_BAT_res_que_percent_cops)}, /* BAT_RES_QUE_PERCENT_COPS = 0x4a */ + {sizeof(T_BAT_res_tst_percent_cops)}, /* BAT_RES_TST_PERCENT_COPS = 0x4b */ + {sizeof(T_BAT_res_que_plus_cops)}, /* BAT_RES_QUE_PLUS_COPS = 0x4c */ + {sizeof(T_BAT_res_tst_plus_cops)}, /* BAT_RES_TST_PLUS_COPS = 0x4d */ + {sizeof(T_BAT_res_que_percent_cops_w)}, /* BAT_RES_QUE_PERCENT_COPS_W = 0x4e */ + {sizeof(T_BAT_res_tst_percent_cops_w)}, /* BAT_RES_TST_PERCENT_COPS_W = 0x4f */ + {sizeof(T_BAT_res_set_percent_cpals)}, /* BAT_RES_SET_PERCENT_CPALS = 0x50 */ + {sizeof(T_BAT_res_que_percent_cpals)}, /* BAT_RES_QUE_PERCENT_CPALS = 0x51 */ + {sizeof(T_BAT_res_set_percent_cpals_w)}, /* BAT_RES_SET_PERCENT_CPALS_W = 0x52 */ + {sizeof(T_BAT_res_que_percent_cpals_w)}, /* BAT_RES_QUE_PERCENT_CPALS_W = 0x53 */ + {sizeof(T_BAT_res_set_plus_cpas)}, /* BAT_RES_SET_PLUS_CPAS = 0x54 */ + {sizeof(T_BAT_res_set_plus_cpbf)}, /* BAT_RES_SET_PLUS_CPBF = 0x55 */ + {sizeof(T_BAT_res_tst_plus_cpbf)}, /* BAT_RES_TST_PLUS_CPBF = 0x56 */ + {sizeof(T_BAT_res_set_plus_cpbf_w)}, /* BAT_RES_SET_PLUS_CPBF_W = 0x57 */ + {sizeof(T_BAT_res_tst_plus_cpbf_w)}, /* BAT_RES_TST_PLUS_CPBF_W = 0x58 */ + {sizeof(T_BAT_res_set_plus_cpbr)}, /* BAT_RES_SET_PLUS_CPBR = 0x59 */ + {sizeof(T_BAT_res_tst_plus_cpbr)}, /* BAT_RES_TST_PLUS_CPBR = 0x5a */ + {sizeof(T_BAT_res_set_plus_cpbr_w)}, /* BAT_RES_SET_PLUS_CPBR_W = 0x5b */ + {sizeof(T_BAT_res_tst_plus_cpbr_w)}, /* BAT_RES_TST_PLUS_CPBR_W = 0x5c */ + {sizeof(T_BAT_res_que_percent_cpbs)}, /* BAT_RES_QUE_PERCENT_CPBS = 0x5d */ + {sizeof(T_BAT_res_que_plus_cpbs)}, /* BAT_RES_QUE_PLUS_CPBS = 0x5e */ + {sizeof(T_BAT_res_tst_plus_cpbw)}, /* BAT_RES_TST_PLUS_CPBW = 0x5f */ + {sizeof(T_BAT_res_tst_plus_cpbw_w)}, /* BAT_RES_TST_PLUS_CPBW_W = 0x60 */ + {sizeof(T_BAT_res_set_percent_cpcfu)}, /* BAT_RES_SET_PERCENT_CPCFU = 0x61 */ + {sizeof(T_BAT_res_que_percent_cphs)}, /* BAT_RES_QUE_PERCENT_CPHS = 0x62 */ + {sizeof(T_BAT_res_que_plus_cpin)}, /* BAT_RES_QUE_PLUS_CPIN = 0x63 */ + {sizeof(T_BAT_res_que_percent_cpinf)}, /* BAT_RES_QUE_PERCENT_CPINF = 0x64 */ + {sizeof(T_BAT_res_set_percent_cpmb)}, /* BAT_RES_SET_PERCENT_CPMB = 0x65 */ + {sizeof(T_BAT_res_que_percent_cpmb)}, /* BAT_RES_QUE_PERCENT_CPMB = 0x66 */ + {sizeof(T_BAT_res_tst_percent_cpmbw)}, /* BAT_RES_TST_PERCENT_CPMBW = 0x67 */ + {sizeof(T_BAT_res_tst_percent_cpmbw_w)}, /* BAT_RES_TST_PERCENT_CPMBW_W = 0x68 */ + {sizeof(T_BAT_res_set_percent_cpmb_w)}, /* BAT_RES_SET_PERCENT_CPMB_W = 0x69 */ + {sizeof(T_BAT_res_set_plus_cpms)}, /* BAT_RES_SET_PLUS_CPMS = 0x6a */ + {sizeof(T_BAT_res_que_plus_cpms)}, /* BAT_RES_QUE_PLUS_CPMS = 0x6b */ + {sizeof(T_BAT_res_set_percent_cpnums)}, /* BAT_RES_SET_PERCENT_CPNUMS = 0x6c */ + {sizeof(T_BAT_res_tst_percent_cpnums)}, /* BAT_RES_TST_PERCENT_CPNUMS = 0x6d */ + {sizeof(T_BAT_res_set_percent_cpnums_w)},/* BAT_RES_SET_PERCENT_CPNUMS_W = 0x6e */ + {sizeof(T_BAT_res_tst_percent_cpnums_w)},/* BAT_RES_TST_PERCENT_CPNUMS_W = 0x6f */ + {sizeof(T_BAT_res_que_plus_cpol)}, /* BAT_RES_QUE_PLUS_CPOL = 0x70 */ + {sizeof(T_BAT_res_tst_plus_cpol)}, /* BAT_RES_TST_PLUS_CPOL = 0x71 */ + {sizeof(T_BAT_res_que_plus_cpol_w)}, /* BAT_RES_QUE_PLUS_CPOL_W = 0x72 */ + {sizeof(T_BAT_res_tst_plus_cpol_w)}, /* BAT_RES_TST_PLUS_CPOL_W = 0x73 */ + {sizeof(T_BAT_res_que_percent_cpopn)}, /* BAT_RES_QUE_PERCENT_CPOPN = 0x74 */ + {sizeof(T_BAT_res_que_percent_cprsm)}, /* BAT_RES_QUE_PERCENT_CPRSM = 0x75 */ + {sizeof(T_BAT_res_que_plus_cpuc)}, /* BAT_RES_QUE_PLUS_CPUC = 0x76 */ + {sizeof(T_BAT_res_que_plus_cpuc_w)}, /* BAT_RES_QUE_PLUS_CPUC_W = 0x77 */ + {sizeof(T_BAT_res_set_percent_cpvwi)}, /* BAT_RES_SET_PERCENT_CPVWI = 0x78 */ + {sizeof(T_BAT_res_que_percent_creg)}, /* BAT_RES_QUE_PERCENT_CREG = 0x79 */ + {sizeof(T_BAT_res_tst_plus_cres)}, /* BAT_RES_TST_PLUS_CRES = 0x7a */ + {sizeof(T_BAT_res_que_plus_crlp)}, /* BAT_RES_QUE_PLUS_CRLP = 0x7b */ + {sizeof(T_BAT_res_set_plus_crsm)}, /* BAT_RES_SET_PLUS_CRSM = 0x7c */ + {sizeof(T_BAT_res_tst_plus_csas)}, /* BAT_RES_TST_PLUS_CSAS = 0x7d */ + {sizeof(T_BAT_res_que_plus_csca)}, /* BAT_RES_QUE_PLUS_CSCA = 0x7e */ + {sizeof(T_BAT_res_que_plus_cscb)}, /* BAT_RES_QUE_PLUS_CSCB = 0x7f */ + {sizeof(T_BAT_res_que_plus_cscs)}, /* BAT_RES_QUE_PLUS_CSCS = 0x80 */ + {sizeof(T_BAT_res_set_plus_csim)}, /* BAT_RES_SET_PLUS_CSIM = 0x81 */ + {sizeof(T_BAT_res_que_plus_csms)}, /* BAT_RES_QUE_PLUS_CSMS = 0x82 */ + {sizeof(T_BAT_res_que_plus_csns)}, /* BAT_RES_QUE_PLUS_CSNS = 0x83 */ + {sizeof(T_BAT_res_que_percent_csq)}, /* BAT_RES_QUE_PERCENT_CSQ = 0x84 */ + {sizeof(T_BAT_res_set_plus_csq)}, /* BAT_RES_SET_PLUS_CSQ = 0x85 */ + {sizeof(T_BAT_res_que_plus_csta)}, /* BAT_RES_QUE_PLUS_CSTA = 0x86 */ + {sizeof(T_BAT_res_que_plus_csvm)}, /* BAT_RES_QUE_PLUS_CSVM = 0x87 */ + {sizeof(T_BAT_res_que_percent_ctty)}, /* BAT_RES_QUE_PERCENT_CTTY = 0x88 */ + {sizeof(T_BAT_res_que_plus_ctzu)}, /* BAT_RES_QUE_PLUS_CTZU = 0x89 */ + {sizeof(T_BAT_res_que_percent_cust)}, /* BAT_RES_QUE_PERCENT_CUST = 0x8a */ + {sizeof(T_BAT_res_que_percent_data)}, /* BAT_RES_QUE_PERCENT_DATA = 0x8b */ + {sizeof(T_BAT_res_set_percent_dinf)}, /* BAT_RES_SET_PERCENT_DINF = 0x8c */ + {sizeof(T_BAT_res_que_plus_ds)}, /* BAT_RES_QUE_PLUS_DS = 0x8d */ + {sizeof(T_BAT_res_que_plus_fap)}, /* BAT_RES_QUE_PLUS_FAP = 0x8e */ + {sizeof(T_BAT_res_que_plus_fbo)}, /* BAT_RES_QUE_PLUS_FBO = 0x8f */ + {sizeof(T_BAT_res_que_plus_fbs)}, /* BAT_RES_QUE_PLUS_FBS = 0x90 */ + {sizeof(T_BAT_res_que_plus_fbu)}, /* BAT_RES_QUE_PLUS_FBU = 0x91 */ + {sizeof(T_BAT_res_que_plus_fcc)}, /* BAT_RES_QUE_PLUS_FCC = 0x92 */ + {sizeof(T_BAT_res_que_plus_fclass)}, /* BAT_RES_QUE_PLUS_FCLASS = 0x93 */ + {sizeof(T_BAT_res_que_plus_fcq)}, /* BAT_RES_QUE_PLUS_FCQ = 0x94 */ + {sizeof(T_BAT_res_que_plus_fcr)}, /* BAT_RES_QUE_PLUS_FCR = 0x95 */ + {sizeof(T_BAT_res_que_plus_fcs)}, /* BAT_RES_QUE_PLUS_FCS = 0x96 */ + {sizeof(T_BAT_res_que_plus_fct)}, /* BAT_RES_QUE_PLUS_FCT = 0x97 */ + {sizeof(T_BAT_res_que_plus_fea)}, /* BAT_RES_QUE_PLUS_FEA = 0x98 */ + {sizeof(T_BAT_res_que_plus_ffc)}, /* BAT_RES_QUE_PLUS_FFC = 0x99 */ + {sizeof(T_BAT_res_que_plus_fhs)}, /* BAT_RES_QUE_PLUS_FHS = 0x9a */ + {sizeof(T_BAT_res_que_plus_fie)}, /* BAT_RES_QUE_PLUS_FIE = 0x9b */ + {sizeof(T_BAT_res_que_plus_fis)}, /* BAT_RES_QUE_PLUS_FIS = 0x9c */ + {sizeof(T_BAT_res_que_plus_fit)}, /* BAT_RES_QUE_PLUS_FIT = 0x9d */ + {sizeof(T_BAT_res_que_plus_fli)}, /* BAT_RES_QUE_PLUS_FLI = 0x9e */ + {sizeof(T_BAT_res_que_plus_flo)}, /* BAT_RES_QUE_PLUS_FLO = 0x9f */ + {sizeof(T_BAT_res_que_plus_flp)}, /* BAT_RES_QUE_PLUS_FLP = 0xa0 */ + {sizeof(T_BAT_res_que_plus_fms)}, /* BAT_RES_QUE_PLUS_FMS = 0xa1 */ + {sizeof(T_BAT_res_que_plus_fns)}, /* BAT_RES_QUE_PLUS_FNS = 0xa2 */ + {sizeof(T_BAT_res_que_plus_fpa)}, /* BAT_RES_QUE_PLUS_FPA = 0xa3 */ + {sizeof(T_BAT_res_que_plus_fpi)}, /* BAT_RES_QUE_PLUS_FPI = 0xa4 */ + {sizeof(T_BAT_res_que_plus_fps)}, /* BAT_RES_QUE_PLUS_FPS = 0xa5 */ + {sizeof(T_BAT_res_que_plus_fpw)}, /* BAT_RES_QUE_PLUS_FPW = 0xa6 */ + {sizeof(T_BAT_res_que_plus_frq)}, /* BAT_RES_QUE_PLUS_FRQ = 0xa7 */ + {sizeof(T_BAT_res_que_plus_fsa)}, /* BAT_RES_QUE_PLUS_FSA = 0xa8 */ + {sizeof(T_BAT_res_que_plus_fsp)}, /* BAT_RES_QUE_PLUS_FSP = 0xa9 */ + {sizeof(T_BAT_res_que_plus_icf)}, /* BAT_RES_QUE_PLUS_ICF = 0xaa */ + {sizeof(T_BAT_res_que_plus_ifc)}, /* BAT_RES_QUE_PLUS_IFC = 0xab */ + {sizeof(T_BAT_res_que_percent_imei)}, /* BAT_RES_QUE_PERCENT_IMEI = 0xac */ + {sizeof(T_BAT_res_que_plus_ipr)}, /* BAT_RES_QUE_PLUS_IPR = 0xad */ + {sizeof(T_BAT_res_que_percent_pbcf)}, /* BAT_RES_QUE_PERCENT_PBCF = 0xae */ + {sizeof(T_BAT_res_que_percent_ppp)}, /* BAT_RES_QUE_PERCENT_PPP = 0xaf */ + {sizeof(T_BAT_res_que_percent_pvrf)}, /* BAT_RES_QUE_PERCENT_PVRF = 0xb0 */ + {sizeof(T_BAT_res_que_percent_rdl)}, /* BAT_RES_QUE_PERCENT_RDL = 0xb1 */ + {sizeof(T_BAT_res_que_percent_rdlb)}, /* BAT_RES_QUE_PERCENT_RDLB = 0xb2 */ + {sizeof(T_BAT_res_que_percent_satc)}, /* BAT_RES_QUE_PERCENT_SATC = 0xb3 */ + {sizeof(T_BAT_res_que_percent_satcc)}, /* BAT_RES_QUE_PERCENT_SATCC = 0xb4 */ + {sizeof(T_BAT_res_set_percent_sate)}, /* BAT_RES_SET_PERCENT_SATE = 0xb5 */ + {sizeof(T_BAT_res_que_plus_ws46)}, /* BAT_RES_QUE_PLUS_WS46 = 0xb6 */ + {sizeof(T_BAT_res_que_plus_cdip)}, /* BAT_RES_QUE_PLUS_CDIP = 0xb7 */ + {sizeof(T_BAT_res_set_percent_cmgr)}, /* BAT_RES_SET_PERCENT_CMGR = 0xb8 */ + {sizeof(T_BAT_res_set_percent_cmgl)}, /* BAT_RES_SET_PERCENT_CMGL = 0xb9 */ + {sizeof(T_BAT_res_set_plus_cmss)}, /* BAT_RES_SET_PLUS_CMSS = 0xba */ + {sizeof(T_BAT_res_set_plus_cgmi)}, /* BAT_RES_SET_PLUS_CGMI = 0xbb */ + {sizeof(T_BAT_res_set_plus_cgmm)}, /* BAT_RES_SET_PLUS_CGMM = 0xbc */ + {sizeof(T_BAT_res_set_plus_cgmr)}, /* BAT_RES_SET_PLUS_CGMR = 0xbd */ + {sizeof(T_BAT_res_set_plus_cgsn)}, /* BAT_RES_SET_PLUS_CGSN = 0xbe */ +#ifdef SIM_PERS + {sizeof(T_BAT_res_set_percent_mepd)}, /* BAT_RES_SET_PERCENT_MEPD = 0xbf */ +#else + {0}, /* If the flag is not enabled to get the proper size of structure of response according to the command id */ +#endif /* SIM_PERS */ + {sizeof(T_BAT_res_set_percent_csq)}, /* BAT_RES_SET_PERCENT_CSQ = 0xc0 */ + {sizeof(T_BAT_res_que_percent_cniv)}, /* BAT_RES_QUE_PERCENT_CNIV = 0xc1 */ + {sizeof(T_BAT_res_que_percent_simef)} /* BAT_RES_QUE_PERCENT_SIMEF = 0xcb */ +}; + +static T_map_response_2_size unsolicited_2_size[] = +{ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_AT_BUSY = 0x1000 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_AT_NO_ANSWER = 0x1001 */ + {sizeof(T_BAT_res_uns_plus_cbm)}, /* BAT_RES_UNS_PLUS_CBM = 0x1002 */ + {sizeof(T_BAT_res_uns_plus_cbmi)}, /* BAT_RES_UNS_PLUS_CBMI = 0x1003 */ + {sizeof(T_BAT_res_uns_percent_ccbs)}, /* BAT_RES_UNS_PERCENT_CCBS = 0x1004 */ + {sizeof(T_BAT_res_uns_plus_cccm)}, /* BAT_RES_UNS_PLUS_CCCM = 0x1005 */ + {sizeof(T_BAT_res_uns_percent_cccn)}, /* BAT_RES_UNS_PERCENT_CCCN = 0x1006 */ + {sizeof(T_BAT_res_uns_plus_ccwa)}, /* BAT_RES_UNS_PLUS_CCWA = 0x1007 */ + {sizeof(T_BAT_res_uns_plus_ccwa_w)}, /* BAT_RES_UNS_PLUS_CCWA_W = 0x1008 */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_PLUS_CCWE = 0x1009 */ + {sizeof(T_BAT_res_uns_plus_cdip)}, /* BAT_RES_UNS_PLUS_CDIP = 0x100a */ + {sizeof(T_BAT_res_uns_plus_cds)}, /* BAT_RES_UNS_PLUS_CDS = 0x100b */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_PLUS_CCWV = 0x100c */ + {sizeof(T_BAT_res_uns_percent_cgev)}, /* BAT_RES_UNS_PERCENT_CGEV = 0x100d */ + {sizeof(T_BAT_res_uns_plus_cgev)}, /* BAT_RES_UNS_PLUS_CGEV = 0x100e */ + {sizeof(T_BAT_res_uns_percent_cgreg)}, /* BAT_RES_UNS_PERCENT_CGREG = 0x100f */ + {sizeof(T_BAT_res_uns_plus_cgreg)}, /* BAT_RES_UNS_PLUS_CGREG = 0x1010 */ + {sizeof(T_BAT_res_uns_plus_clae)}, /* BAT_RES_UNS_PLUS_CLAE = 0x1011 */ + {sizeof(T_BAT_res_uns_plus_clav)}, /* BAT_RES_UNS_PLUS_CLAV = 0x1012 */ + {sizeof(T_BAT_res_uns_plus_clip)}, /* BAT_RES_UNS_PLUS_CLIP = 0x1013 */ + {sizeof(T_BAT_res_uns_plus_clip_w)}, /* BAT_RES_UNS_PLUS_CLIP_W = 0x1014 */ + {sizeof(T_BAT_res_uns_plus_cmt)}, /* BAT_RES_UNS_PLUS_CMT = 0x1015 */ + {sizeof(T_BAT_res_uns_plus_cmti)}, /* BAT_RES_UNS_PLUS_CMTI = 0x1016 */ + {sizeof(T_BAT_res_uns_plus_cmt_w)}, /* BAT_RES_UNS_PLUS_CMT_W = 0x1017 */ + {sizeof(T_BAT_res_uns_percent_cnap)}, /* BAT_RES_UNS_PERCENT_CNAP = 0x1018 */ + {sizeof(T_BAT_res_uns_plus_colp)}, /* BAT_RES_UNS_PLUS_COLP = 0x1019 */ + {sizeof(T_BAT_res_uns_plus_colp_w)}, /* BAT_RES_UNS_PLUS_COLP_W = 0x101a */ + {sizeof(T_BAT_res_uns_percent_cpi)}, /* BAT_RES_UNS_PERCENT_CPI = 0x101b */ + {sizeof(T_BAT_res_uns_percent_cpi_w)}, /* BAT_RES_UNS_PERCENT_CPI_W = 0x101c */ + {sizeof(T_BAT_res_uns_percent_cpri)}, /* BAT_RES_UNS_PERCENT_CPRI = 0x101d */ + {sizeof(T_BAT_res_uns_percent_cproam)}, /* BAT_RES_UNS_PERCENT_CPROAM = 0x101e */ + {sizeof(T_BAT_res_uns_percent_cpvwi)}, /* BAT_RES_UNS_PERCENT_CPVWI = 0x101f */ + {sizeof(T_BAT_res_uns_plus_cr)}, /* BAT_RES_UNS_PLUS_CR = 0x1020 */ + {sizeof(T_BAT_res_uns_percent_creg)}, /* BAT_RES_UNS_PERCENT_CREG = 0x1021 */ + {sizeof(T_BAT_res_uns_plus_cring)}, /* BAT_RES_UNS_PLUS_CRING = 0x1022 */ + {sizeof(T_BAT_res_uns_percent_csq)}, /* BAT_RES_UNS_PERCENT_CSQ = 0x1023 */ + {sizeof(T_BAT_res_uns_plus_cssi)}, /* BAT_RES_UNS_PLUS_CSSI = 0x1024 */ + {sizeof(T_BAT_res_uns_percent_cssn)}, /* BAT_RES_UNS_PERCENT_CSSN = 0x1025 */ + {sizeof(T_BAT_res_uns_plus_cssu)}, /* BAT_RES_UNS_PLUS_CSSU = 0x1026 */ + {sizeof(T_BAT_res_uns_percent_cstat)}, /* BAT_RES_UNS_PERCENT_CSTAT = 0x1027 */ + {sizeof(T_BAT_res_uns_percent_ctyi)}, /* BAT_RES_UNS_PERCENT_CTYI = 0x1028 */ + {sizeof(T_BAT_res_uns_plus_ctzr)}, /* BAT_RES_UNS_PLUS_CTZR = 0x1029 */ + {sizeof(T_BAT_res_uns_percent_ctzv)}, /* BAT_RES_UNS_PERCENT_CTZV = 0x102a */ + {sizeof(T_BAT_res_uns_plus_ctzv)}, /* BAT_RES_UNS_PLUS_CTZV = 0x102b */ + {sizeof(T_BAT_res_uns_percent_ctzv_w)}, /* BAT_RES_UNS_PERCENT_CTZV_W = 0x102c */ + {sizeof(T_BAT_res_uns_plus_cusd)}, /* BAT_RES_UNS_PLUS_CUSD = 0x102d */ + {sizeof(T_BAT_res_uns_plus_cusd_w)}, /* BAT_RES_UNS_PLUS_CUSD_W = 0x102e */ + {sizeof(T_BAT_no_parameter)}, /* BAT_RES_UNS_AT_NO_CARRIER = 0x102f */ + {sizeof(T_BAT_res_uns_plus_fhs)}, /* BAT_RES_UNS_PLUS_FHS = 0x1030 */ + {sizeof(T_BAT_res_uns_plus_ilrr)}, /* BAT_RES_UNS_PLUS_ILRR = 0x1031 */ + {sizeof(T_BAT_res_uns_percent_rdl)}, /* BAT_RES_UNS_PERCENT_RDL = 0x1032 */ + {sizeof(T_BAT_res_uns_percent_rdlb)}, /* BAT_RES_UNS_PERCENT_RDLB = 0x1033 */ + {sizeof(T_BAT_res_uns_percent_sata)}, /* BAT_RES_UNS_PERCENT_SATA = 0x1034 */ + {sizeof(T_BAT_res_uns_percent_sati)}, /* BAT_RES_UNS_PERCENT_SATI = 0x1035 */ + {sizeof(T_BAT_res_uns_percent_satn)}, /* BAT_RES_UNS_PERCENT_SATN = 0x1036 */ + {sizeof(T_BAT_res_uns_percent_simef)}, /* BAT_RES_UNS_PERCENT_SIMEF = 0x1037 */ + {sizeof(T_BAT_res_uns_percent_simins)}, /* BAT_RES_UNS_PERCENT_SIMINS = 0x1038 */ + {sizeof(T_BAT_res_uns_percent_simrem)}, /* BAT_RES_UNS_PERCENT_SIMREM = 0x1039 */ + {sizeof(T_BAT_res_uns_percent_sncnt)}, /* BAT_RES_UNS_PERCENT_SNCNT = 0x103a */ + {sizeof(T_BAT_res_uns_percent_cniv)} /* BAT_RES_UNS_PERCENT_CNIV = 0x103b */ +}; + +typedef struct +{ + T_BAT_ctrl_params bat; + T_ACI_AT_CMD aci; +} T_map_batcmd_to_acicmd; +/* + * only asynchronous commands are listed (interaction with PS) + */ + #define CMD_MAP_NOT_PRESENT -1 +T_map_batcmd_to_acicmd map_batcmd_to_acicmd [] = +{ + {BAT_CMD_SET_PLUS_CFUN, AT_CMD_CFUN}, + {BAT_CMD_SET_PERCENT_BAND, AT_CMD_BAND}, + {BAT_CMD_SET_PLUS_CPIN, AT_CMD_CPIN}, + {BAT_CMD_QUE_PLUS_CPIN, AT_CMD_CPIN}, + {BAT_CMD_QUE_PERCENT_CPINF, AT_CMD_CPIN}, + {BAT_CMD_SET_PLUS_CPBW, AT_CMD_CPBW}, + {BAT_CMD_TST_PERCENT_COPS, AT_CMD_P_COPS}, + {BAT_CMD_TST_PLUS_COPS, AT_CMD_COPS}, + {BAT_CMD_SET_PERCENT_COPS, AT_CMD_P_COPS}, + {BAT_CMD_SET_PLUS_COPS, AT_CMD_COPS}, + {BAT_CMD_AT_D, AT_CMD_D}, + {BAT_CMD_AT_A, AT_CMD_A}, + {BAT_CMD_AT_Z, AT_CMD_Z}, + {BAT_CMD_SET_PERCENT_CHLD, AT_CMD_CHLD}, + {BAT_CMD_SET_PLUS_CTFR, AT_CMD_CTFR}, + {BAT_CMD_SET_PERCENT_VTS, AT_CMD_VTS}, + {BAT_CMD_SET_PLUS_VTS, AT_CMD_VTS}, + {BAT_CMD_QUE_PLUS_CLIR, AT_CMD_CLIR}, + {BAT_CMD_SET_PLUS_CLIR, AT_CMD_CLIR}, + {BAT_CMD_QUE_PLUS_CLIP, AT_CMD_CLIP}, + {BAT_CMD_QUE_PLUS_COLP, AT_CMD_COLP}, + {BAT_CMD_SET_PLUS_CCFC, AT_CMD_CCFC}, + {BAT_CMD_SET_PLUS_CLCK, AT_CMD_CLCK}, + {BAT_CMD_SET_PLUS_CCWA, AT_CMD_CCWA}, + {BAT_CMD_SET_PLUS_CPWD, AT_CMD_CPWD}, + {BAT_CMD_SET_PLUS_CUSD, AT_CMD_CUSD}, + {BAT_CMD_SET_PLUS_CMGD, AT_CMD_CMGD}, + {BAT_CMD_SET_PLUS_CMGW, AT_CMD_CMGW}, + {BAT_CMD_SET_PLUS_CMGS, AT_CMD_CMGS}, + {BAT_CMD_SET_PLUS_CMSS, AT_CMD_CMSS}, + {BAT_CMD_SET_PLUS_CSCA, AT_CMD_CSCA}, + {BAT_CMD_QUE_PLUS_CSCA, AT_CMD_CSCA}, + {BAT_CMD_SET_PLUS_CGATT, AT_CMD_CGATT}, + {BAT_CMD_QUE_PLUS_CGATT, AT_CMD_CGATT}, + {BAT_CMD_QUE_PERCENT_CGCLASS, AT_CMD_P_CGCLASS}, + {BAT_CMD_QUE_PLUS_CGCLASS, AT_CMD_CGCLASS}, + {BAT_CMD_SET_PERCENT_CGCLASS, AT_CMD_P_CGCLASS}, + {BAT_CMD_SET_PLUS_CGCLASS, AT_CMD_CGCLASS}, + {BAT_CMD_SET_PLUS_CGACT, AT_CMD_CGACT}, + {BAT_CMD_QUE_PLUS_CGACT, AT_CMD_CGACT}, + {BAT_CMD_SET_PLUS_CGDATA, AT_CMD_CGDATA}, + {BAT_CMD_SET_PLUS_CGANS, AT_CMD_CGANS}, + {BAT_CMD_SET_PLUS_CGSMS, AT_CMD_CGSMS}, + {BAT_CMD_QUE_PLUS_CGSMS, AT_CMD_CGSMS}, + {(T_BAT_ctrl_params)CMD_MAP_NOT_PRESENT, AT_CMD_NONE} +}; + + + +/*==== LOCAL FUNCTONS =============================================*/ +LOCAL void aci_bat_init_globs(void); +LOCAL void aci_bat_queue_put (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 client_id, U16 dataSize); +LOCAL BOOL aci_bat_queue_get (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 *client_id); +LOCAL T_aci_bat_queue *aci_bat_queue_create (void); +LOCAL void aci_bat_queue_remove (T_aci_bat_queue *que); + + +LOCAL void *aci_bat_give_l2p_rx_buf_cb (U8 batId); +LOCAL void *aci_bat_give_l2p_tx_buf_cb (U8 batId, U16 dataSize, void **seg_hdr_ptr, U16 *totalSize, U16 *segSize); +LOCAL void aci_bat_free_data_buffer (T_ACI_DTI_DATA_BUF *data_buffer); +LOCAL BOOL aci_bat_buffer_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data); +LOCAL void aci_bat_send_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data); +LOCAL void *aci_bat_l2p_next_seg_cb (U8 batId , void *last_seg_hdr, void **seg_hdr_ptr, U16 *segSize); +LOCAL int aci_bat_l2p_send_frame_cb (U8 batId); +LOCAL void aci_bat_l2p_msg_rxd_cb (U8 batId, U8 muxId, U32 dataTag, void *dataPtr, U16 dataSize); + +LOCAL int aci_bat_get_size (T_BAT_ctrl_response ctrl_response); +LOCAL void aci_bat_init_max_client_maintenance (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 num_clients); +LOCAL void aci_bat_clean_client_maintenance (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client); +LOCAL BOOL aci_bat_bootstrap_l2p (T_ACI_DTI_PRC_PSI *src_infos_psi, T_DTI2_DATA_IND *dti_data_ind); +LOCAL BOOL aci_bat_abort (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client_id); +LOCAL T_ACI_AT_CMD map_cmd_id (T_BAT_ctrl_params cmd); + +/*------------------------------------------------------------------------------ + * prepare unique identifiers for L2P_Configure, BATLib starts with 0, we start with 0x80 + */ +LOCAL void aci_bat_init_globs(void) +{ + int i; + for (i=0; i<CMD_SRC_MAX; i++) + { + aci_bat_globs[i].l2p_configured = FALSE; + aci_bat_globs[i].l2p_id = 0x80+i; + aci_bat_globs[i].psi_src = NULL; + memset(aci_bat_globs[i].l2p_mem, 0x00, L2P_CONTROL_BLOCK_HDR_SIZE); + } +} + + +/*------------------------------------------------------------------------------ + * received BAT commands cannot be processed, make it pending + */ +LOCAL void aci_bat_queue_put (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 client_id, U16 dataSize) +{ + T_aci_bat_queue_entry *qe; + + ACI_MALLOC(qe, sizeof (T_aci_bat_queue_entry)); + + qe->next = 0; + qe->cmd.ctrl_params = cmd->ctrl_params; + qe->client_id = client_id; + + /* due to union params, we can use any pointer. will be freed in aci_bat_run_cmd() */ + ACI_MALLOC(qe->cmd.params.ptr_andc, dataSize); + memcpy (qe->cmd.params.ptr_andc, cmd->params.ptr_andc, dataSize); + + if (que->first) + { + que->last->next = qe; + } + else + { + que->first = qe; + } + que->last = qe; +} + +/*------------------------------------------------------------------------------ + * get pending BAT command of a client queue + */ +LOCAL BOOL aci_bat_queue_get (T_aci_bat_queue *que, T_BAT_cmd_send *cmd, U8 *client_id) +{ + T_aci_bat_queue_entry *qe; + + if (!que) + { + return (FALSE); + } + + qe = que->first; + if (!qe) + { + return (FALSE); + } + cmd->ctrl_params = qe->cmd.ctrl_params; + cmd->params = qe->cmd.params; + *client_id = qe->client_id; + + que->first = qe->next; + + if (que->first EQ NULL) + { + que->last = NULL; + } + + ACI_MFREE(qe); + + return (TRUE); +} + +/*------------------------------------------------------------------------------ + * aci_bat_queue_create + */ +LOCAL T_aci_bat_queue *aci_bat_queue_create (void) +{ + T_aci_bat_queue *que; + + ACI_MALLOC(que, sizeof (T_aci_bat_queue)); + + if (que EQ NULL) + { + return 0; + } + que->first = 0; + return que; +} + +/*------------------------------------------------------------------------------ + * aci_bat_queue_remove + */ +LOCAL void aci_bat_queue_remove (T_aci_bat_queue *que) +{ + T_BAT_cmd_send dummy1; + U8 dummy2 = 0; + + while (aci_bat_queue_get (que, &dummy1, &dummy2)) + { + ; + } + if (que) + { + ACI_MFREE (que); + } +} + + +/*------------------------------------------------------------------------------ + * get the response size needed for L2P to know how many bytes to send + */ +LOCAL int aci_bat_get_size (T_BAT_ctrl_response ctrl_response) +{ + if (BITFIELD_CHECK(ctrl_response, BAT_BIT_12)) /* 0x1000 */ + { + return (unsolicited_2_size[ctrl_response - BAT_BIT_12].size); + } + else + { + return (response_2_size[ctrl_response].size); + } +} + +/*------------------------------------------------------------------------------ + * init max BAT clients maintance for a PSI source + */ +LOCAL void aci_bat_init_max_client_maintenance(T_ACI_DTI_PRC_PSI *src_infos_psi, U8 num_clients) +{ + int i; + ACI_MALLOC(src_infos_psi->bat_client, num_clients * sizeof(T_bat_aci_client_maintain)); + src_infos_psi->queue = aci_bat_queue_create(); + src_infos_psi->max_clients = num_clients; + for (i=0; i< num_clients; i++) + { + src_infos_psi->bat_client[i].opened = FALSE; + src_infos_psi->bat_client[i].curCmd = (T_BAT_ctrl_params)-1; + src_infos_psi->bat_client[i].send_data = (T_desc2 *)NULL; + } +} + +/*------------------------------------------------------------------------------ + * clean up the whole clients maintenance for a PSI source + */ +LOCAL void aci_bat_clean_client_maintenance(T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client) +{ + BOOL all_closed = TRUE; + int i = 0; + + src_infos_psi->bat_client[client].curCmd = (T_BAT_ctrl_params)-1; + src_infos_psi->bat_client[client].opened = FALSE; + + for (i=0; i< src_infos_psi->max_clients; i++) + { + if (src_infos_psi->bat_client[i].opened EQ TRUE) + { + all_closed = FALSE; + break; + } + } + if (all_closed) + { + aci_bat_queue_remove(src_infos_psi->queue); + L2P_Remove(aci_bat_globs[src_infos_psi->srcId].l2p_id); + ACI_MFREE(src_infos_psi->bat_client); + aci_bat_globs[src_infos_psi->srcId].l2p_configured = FALSE; + } + + all_closed = TRUE; + for (i=0; i< CMD_SRC_MAX; i++) + { + if (aci_bat_globs[i].l2p_configured NEQ FALSE) + { + all_closed = FALSE; + break; + } + } + if (all_closed) + { + aci_bat_first_time = TRUE; + } +} + + +/*------------------------------------------------------------------------------ + * pick out from the very first received DTI_DATA_IND the L2P protocol id. + * our client (BAT lib at Application or ATI) defined the L2P protocol + */ + +LOCAL BOOL aci_bat_bootstrap_l2p (T_ACI_DTI_PRC_PSI *src_infos_psi, T_DTI2_DATA_IND *dti_data_ind) +{ + U16 tot_len; + U8 protocol_id = 0; + T_L2P_STATUS l2p_status = L2P_STAT_UNKNOWN_ERROR; + T_L2P_FRAME_CONTROL_BYTES *l2p_header = (T_L2P_FRAME_CONTROL_BYTES *)NULL; + T_desc2 *p_desc; + + tot_len = dti_data_ind->desc_list2.list_len; + p_desc = (T_desc2 *)dti_data_ind->desc_list2.first; + + if (p_desc NEQ NULL) + { + if( p_desc->len > tot_len) + { + TRACE_EVENT("aci_bat_bootstrap_l2p(): invalid dti_data_ind"); + return (FALSE); + } + + l2p_header = (T_L2P_FRAME_CONTROL_BYTES *)p_desc->buffer; + protocol_id = l2p_header->protocol_id; + + + TRACE_EVENT_P3("aci_bat_bootstrap_l2p(): protocol_id = %d, src_id = %d, l2p_id = 0x%02X", + protocol_id, src_infos_psi->srcId, aci_bat_globs[src_infos_psi->srcId].l2p_id); + + + l2p_status = L2P_Configure(aci_bat_globs[src_infos_psi->srcId].l2p_id, /* what L2P maintains as bat_id */ + (void *)(aci_bat_globs[src_infos_psi->srcId].l2p_mem), /* memory for the internal L2P maintenance */ + (T_L2P_SUPPORTED_PROTOCOLS)protocol_id, + BAT_MTU_SIZE, /* replace replace GDD_DIO_MTU_SIZE */ + aci_bat_give_l2p_tx_buf_cb, /* L2P needs callbacks */ + aci_bat_give_l2p_rx_buf_cb, + aci_bat_l2p_next_seg_cb, + aci_bat_l2p_send_frame_cb, + aci_bat_l2p_msg_rxd_cb); + + switch (l2p_status) + { + case (L2P_STAT_SUCCESS): + return (TRUE); + default: /* any error */ + TRACE_EVENT_P1("aci_bat_bootstrap_l2p(): L2P error = %d", l2p_status); + return (FALSE); + } + } + return (FALSE); +} + +/*------------------------------------------------------------------------------ + * L2P wants always to have the BAT_MTU_SIZE memory for the received data + * it rebuilds from L2P fragments and T_desc2 segements the complete BAT command + * We will free the memory in aci_bat_l2p_msg_rxd_cb() + * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs() + */ +LOCAL void *aci_bat_give_l2p_rx_buf_cb (U8 batId) +{ + U8 src_id = batId-0x80; + TRACE_FUNCTION("aci_bat_give_l2p_rx_buf_cb()"); + + if (batId EQ aci_bat_globs[src_id].l2p_id) + { + T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src; + + ACI_MALLOC(src_infos_psi->rcv_data, BAT_MTU_SIZE); + + return (src_infos_psi->rcv_data); + } + else + { + TRACE_ERROR("aci_bat_give_l2p_rx_buf_cb(): L2P used wrong identifier"); + return (NULL); + } +} + +/*------------------------------------------------------------------------------ + * L2P wants to have some memory to transmit data. It is called only for the first segment. + * dataSize is what L2P requests from us + * with totalSize we tell L2P what we got from the memory pool + * segSize ist the size of the first segment + * seg_hdr_ptr is the pointer to T_desc2, but casted to void + * returned is T_desc2.buffer + * PSI will free the memory + * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs() + */ +LOCAL void *aci_bat_give_l2p_tx_buf_cb (U8 batId, U16 dataSize, void **seg_hdr_ptr, U16 *totalSize, U16 *segSize) +{ + U8 src_id = batId-0x80; + TRACE_FUNCTION("aci_bat_give_l2p_tx_buf_cb()"); + + if (batId EQ aci_bat_globs[src_id].l2p_id) + { + T_desc2 *send_data; + U16 send_len = (U16)(sizeof(T_desc2) - 1 + dataSize); + + T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src; + + ACI_MALLOC(send_data, send_len); + + send_data->next = (U32)NULL; + send_data->len = dataSize; + send_data->size = dataSize; + send_data->offset = 0; + + *seg_hdr_ptr = (void *)send_data; + *totalSize = send_len; + *segSize = send_len; + TRACE_EVENT_P2("aci_bat_give_l2p_tx_buf_cb(): L2P requested %i bytes and got %i bytes", dataSize, send_len); + + /* for control and broadcast channel we must not maintain the first T_desc2 + * in the client array, because it were just too large, BAT_CTRL_CHANNEL = 0xFE) + */ + if (src_infos_psi->active_client >= BAT_CTRL_CHANNEL) + { + src_infos_psi->send_data = send_data; + } + else + { + src_infos_psi->bat_client[src_infos_psi->active_client].send_data = send_data; + } + + return ((void *)send_data->buffer); + } + else + { + TRACE_ERROR("aci_bat_give_l2p_tx_buf_cb(): L2P used wrong identifier"); + return (NULL); + } +} + +/*------------------------------------------------------------------------------ + * + */ +LOCAL void *aci_bat_l2p_next_seg_cb (U8 batId, void *last_seg_hdr, void **seg_hdr_ptr, U16 *segSize) +{ + T_desc2 *segment; + + TRACE_FUNCTION("aci_bat_l2p_next_seg_cb()"); + + segment = (T_desc2 *)last_seg_hdr; + segment = (T_desc2 *)segment->next; + *seg_hdr_ptr = segment; + *segSize = segment->size; + + return ((void *)segment->buffer); +} + +LOCAL void aci_bat_free_data_buffer (T_ACI_DTI_DATA_BUF *data_buffer) +{ + T_desc2 *p_desc, *p_desc_next=NULL; + + if (data_buffer->data_list EQ NULL) + { + return; + } + + p_desc = data_buffer->data_list; + if (p_desc NEQ NULL) + { + p_desc_next = (T_desc2 *)p_desc->next; + } + + while (p_desc NEQ NULL) + { + ACI_MFREE (p_desc); + + p_desc = p_desc_next; + if (p_desc NEQ NULL) + { + p_desc_next = (T_desc2 *)p_desc->next; + } + } + + data_buffer->data_list = NULL; + data_buffer->max_buffer_size = 0; + data_buffer->create_time = 0; +} + + +/*------------------------------------------------------------------------------ + * + */ + LOCAL BOOL aci_bat_buffer_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data) +{ + T_desc2 *tmp; + T_TIME current_time; + + static int i = 0; + + TRACE_FUNCTION("aci_bat_buffer_dti_data()"); + + if (src_infos_psi->data_buffer.data_list EQ NULL) + { + src_infos_psi->data_buffer.data_list = data; /* the first buffered resp/ind */ + /* store the creation time for the data buffer */ + vsi_t_time (VSI_CALLER &src_infos_psi->data_buffer.create_time); + } + else + { + /* + * check whether the buffered resp/ind are already too long buffered + * this avoids eating up all the memory + */ + vsi_t_time (VSI_CALLER ¤t_time); + if ((current_time - src_infos_psi->data_buffer.create_time) > MAX_DATA_BUFFER_LIFE_TIME) + { + TRACE_EVENT_P1 ("[WRN] aci_bat_buffer_dti_data(): life time expired, buffer deleted (%d)", + current_time - src_infos_psi->data_buffer.create_time); + aci_bat_free_data_buffer (&src_infos_psi->data_buffer); + /* send an error to BAT Lib */ + return (FALSE); + } + + /* + * we still can buffer further resp/ind + */ + tmp = src_infos_psi->data_buffer.data_list; + while ((T_desc2*)tmp->next NEQ NULL) + { + tmp = (T_desc2*)tmp->next; + } + tmp->next = (U32)data; /* append the current resp/ind */ + i++; + } + return (TRUE); +} + + +/*------------------------------------------------------------------------------ + * + */ + LOCAL void aci_bat_send_dti_data (T_ACI_DTI_PRC_PSI *src_infos_psi, T_desc2 *data) +{ + U16 data_len = 0; + T_desc2 *next_data; + TRACE_FUNCTION("aci_bat_send_dti_data"); + + { + PALLOC_DESC2(dti_data_ind, DTI2_DATA_IND); + + next_data = data; + + while (next_data NEQ NULL) + { + data_len += next_data->len; + next_data = (T_desc2*)next_data->next; + } + + dti_data_ind->desc_list2.list_len = data_len; + dti_data_ind->desc_list2.first = (U32)data; + dti_data_ind->parameters.p_id = 0; /*dummy_ubyte; */ + + dti_data_ind->parameters.st_lines.st_flow = DTI_FLOW_OFF; + dti_data_ind->parameters.st_lines.st_line_sb = DTI_SB_ON; + dti_data_ind->parameters.st_lines.st_line_sa = DTI_SA_ON; + dti_data_ind->parameters.st_lines.st_break_len = DTI_BREAK_OFF; +#ifdef _SIMULATION_ + if (src_infos_psi->devId NEQ DIO_DATA_PKT) + { + gdd_aci_write_bat(src_infos_psi->srcId, &(dti_data_ind->desc_list2)); /* special GDD adapter between BATLib and BATModule */ + PFREE(dti_data_ind); + } + else + { /* this is for the acibat_test suite, which does not use the ATI as application */ + dti_send_data (aci_hDTI, + src_infos_psi->srcId, + (U8)DTI_ENTITY_PSI, + ACI_DTI_DN_CHANNEL, + dti_data_ind); + } +#else + dti_send_data (aci_hDTI, + src_infos_psi->srcId, + (U8)DTI_ENTITY_PSI, + ACI_DTI_DN_CHANNEL, + dti_data_ind); +#endif + } +} + + +/*------------------------------------------------------------------------------ + * L2P has a frame ready for sending. + * We have to send a DTI2_DATA_IND primitive to PSI + * the pointer of the first T_desc2 is maintained in src_infos_psi. + * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs() + */ +LOCAL int aci_bat_l2p_send_frame_cb (U8 batId) +{ + U8 src_id = batId-0x80; + T_desc2 *data; + T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src; + + TRACE_FUNCTION("aci_bat_l2p_send_frame_cb()"); + + if (src_infos_psi->active_client >= BAT_CTRL_CHANNEL) + { + data = src_infos_psi->send_data; + } + else + { + data = src_infos_psi->bat_client[src_infos_psi->active_client].send_data; + } + + if ((aci_src_dti_params[src_infos_psi->srcId].isDtiConnected) AND + (aci_src_dti_params[src_infos_psi->srcId].dtxState EQ READY)) + { + aci_bat_send_dti_data (src_infos_psi, data); + } + else + { + /* buffer data, will be send in sig_dti_tx_buffer_ready_ind() */ + if (aci_bat_buffer_dti_data (src_infos_psi, data) EQ FALSE) + { + return (1); /* any value larger than 0 tells L2P that there is a problem */ + } + } + + return (0); /* what L2P expects */ +} + +/*------------------------------------------------------------------------------ + * L2P signals that our payload has been completely received (BAT command request or control signal) + * control signal is immediately processed , commands are queued first + * From the batId we derive the src_id by substract 0x80, see aci_bat_init_globs() + */ +LOCAL void aci_bat_l2p_msg_rxd_cb (U8 batId , U8 muxId, U32 dataTag, void *dataPtr, U16 dataSize) +{ + U8 src_id = batId-0x80; + TRACE_FUNCTION("aci_bat_l2p_msg_rxd_cb()"); + + if (batId EQ aci_bat_globs[src_id].l2p_id) + { + T_ACI_DTI_PRC_PSI *src_infos_psi = aci_bat_globs[src_id].psi_src; + + dataSize = dataSize; /* has no meaning for aci_bat */ + + if (BITFIELD_CHECK(dataTag, BAT_BIT_13)) /* 0x2000 - 0x3FFF = customer commands */ + { + aci_bat_rcv_custom (src_id, muxId, dataTag, dataPtr, dataSize); + /* free the requested L2P RX buffer, see aci_bat_give_l2p_rx_buf_cb */ + if (src_infos_psi->rcv_data) + { + ACI_MFREE(src_infos_psi->rcv_data); + } + } + else if (BITFIELD_CHECK(dataTag, BAT_BIT_15)) /* 0x8000 = BAT Lib control cmd*/ + { + T_BATC_signal signal; + signal.ctrl_params = (T_BATC_ctrl_params)dataTag; /* this is the important thing */ + /* due to union of pointers, we can use any pointer, just to make the compiler happy */ + signal.params.ptr_max_clients = (T_BATC_max_clients *)dataPtr; + aci_bat_ctrl_rcv(src_infos_psi, &signal); + /* free the requested L2P RX buffer, see aci_bat_give_l2p_rx_buf_cb */ + if (src_infos_psi->rcv_data) + { + ACI_MFREE(src_infos_psi->rcv_data); + } + } + else /* binary AT command */ + { + T_BAT_cmd_send cmd; + cmd.ctrl_params = (T_BAT_ctrl_params)dataTag; + cmd.params.ptr_at_a = (T_BAT_no_parameter *)dataPtr; /* we can use any pointer, don't worry */ + TRACE_EVENT_P1("command identifier: = 0x%04X", dataTag); + TRACE_BINDUMP(aci_handle, TC_USER4, "BAT COMMAND PARAMETER 2", (U8 *)dataPtr, 4); + + /* in case of no memory, ACI goes sleeping until there is enough */ + aci_bat_queue_put(src_infos_psi->queue, &cmd, muxId, dataSize); + + /* free the requested L2P RX buffer, see aci_bat_give_l2p_rx_buf_cb */ + if (src_infos_psi->rcv_data) + { + ACI_MFREE(src_infos_psi->rcv_data); + } + if (src_infos_psi->run_cmd EQ FALSE) + { + aci_bat_run_cmd (src_infos_psi); + } + else + { + TRACE_EVENT_P1("aci_bat_l2p_msg_rxd_cb(): there is a cmd running, put 0x%04X in queue", cmd.ctrl_params); + } + } + } + else + { + TRACE_ERROR("aci_bat_l2p_msg_rxd_cb(): L2P used wrong identifier"); + } +} + + +/*------------------------------------------------------------------------------ + * AT command identifier is different in BAT and ACI. Need to map it. + */ +LOCAL T_ACI_AT_CMD map_cmd_id (T_BAT_ctrl_params cmd) +{ + int i = 0; + + while (map_batcmd_to_acicmd[i].aci NEQ AT_CMD_NONE) + { + if (cmd EQ map_batcmd_to_acicmd[i].bat) + { + return (map_batcmd_to_acicmd[i].aci); + } + i++; + } + return (AT_CMD_NONE); +} + +/*------------------------------------------------------------------------------ + * BAT Lib sent command abort request for a particular client + */ +LOCAL BOOL aci_bat_abort (T_ACI_DTI_PRC_PSI *src_infos_psi, U8 client_id) +{ + T_ACI_RETURN ret = AT_FAIL; + T_ACI_AT_CMD AciCurCmd = map_cmd_id ( src_infos_psi->bat_client[client_id].curCmd); + + ret = sAT_Abort ((T_ACI_CMD_SRC)src_infos_psi->srcId, AciCurCmd); + switch (ret) + { + case (AT_EXCT): + { + /* + * in aci_bat_ctrl_rcv() we check for BATC_ABORT_CMD to suppress any response. + * only call control needs some time to abort (disconnet the call). + * command handler of call control emits the OK via R_AT (rBAT_OK). + * in rBAT_OK we have to check again for BATC_ABORT_COMMAND_CNF and send then + * a + */ + src_infos_psi->bat_client[client_id].curCmd = (T_BAT_ctrl_params)BATC_ABORT_CMD; + return(TRUE); + } + case ( AT_CMPL ): + { + src_infos_psi->bat_client[client_id].curCmd = (T_BAT_ctrl_params)-1; + return(TRUE); + } + default: + { + switch (src_infos_psi->bat_client[client_id].curCmd) + { + case ( BAT_CMD_SET_PLUS_CMGC ): + case ( BAT_CMD_SET_PLUS_CNMI ): + case ( BAT_CMD_SET_PLUS_CSMS ): + case ( BAT_CMD_SET_PLUS_CMGD ): + case ( BAT_CMD_SET_PLUS_CMGR ): + case ( BAT_CMD_SET_PLUS_CMGR_W ): + case ( BAT_CMD_SET_PLUS_CMGW ): + case ( BAT_CMD_SET_PLUS_CMGS ): + case ( BAT_CMD_SET_PLUS_CMSS ): + case ( BAT_CMD_SET_PLUS_CPMS ): + /* case ( AT_CMD_CSMP ): not supported by BAT ? */ + case ( BAT_CMD_SET_PLUS_CSCA ): + case ( BAT_CMD_SET_PLUS_CRES ): + case ( BAT_CMD_SET_PLUS_CSAS ): + case ( BAT_CMD_SET_PLUS_CMGL ): + case ( BAT_CMD_SET_PLUS_CMGL_W ): + /* ACI_ERR_DESC( ACI_ERR_CLASS_Cms, CMS_ERR_FailedToAbort); */ + break; + default: + /* ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_FailedToAbort); */ + break; + } + /* aci_bat_err(src_infos_psi); */ + break; + } + } + return(FALSE); +} + + +/*==== GLOBAL FUNCTONS ============================================*/ + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_send_buffer_dti_data | ++--------------------------------------------------------------------+ + + PURPOSE : Send buffered DTI data, because dtxState is ready now. + This function is called by sig_dti_tx_buffer_ready_ind() +*/ + +GLOBAL U8 aci_bat_get_l2p_id(U8 src_id) +{ + return (aci_bat_globs[src_id].l2p_id); +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_send_buffer_dti_data | ++--------------------------------------------------------------------+ + + PURPOSE : Send buffered DTI data, because dtxState is ready now. + This function is called by sig_dti_tx_buffer_ready_ind() +*/ +GLOBAL void aci_bat_send_buffer_dti_data (UBYTE src_id) +{ + T_ACI_DTI_PRC_PSI *src_infos_psi = NULL; + int i = 0; + + TRACE_FUNCTION("aci_bat_send_buffer_dti_data()"); + + /* dti_id should be supported by DTI_ENTITY_ID or something, here.. */ + src_infos_psi = find_element (psi_src_params, src_id, cmhPSItest_srcId); + + if (aci_src_dti_params[src_id].isDtiConnected EQ FALSE) + { + TRACE_EVENT ("DTI_READY_IND: line not connected"); + return; + } + /* + * send data which may have been stored .. + */ + if (src_infos_psi->data_buffer.data_list NEQ NULL) + { + T_desc2 *data_list = src_infos_psi->data_buffer.data_list; + + while (data_list NEQ NULL) + { + /* TRACE_BINDUMP(aci_handle, TC_USER4, "BUFFERED BAT DATA", (U8 *)data_list, data_list->len); */ + TRACE_EVENT_P1 ("aci_bat_send_buffer_dti_data(): buffered resp/ind has %i bytes", data_list->len); + i++; + data_list = (T_desc2*)data_list->next; + } + + TRACE_EVENT_P1 ("aci_bat_send_buffer_dti_data(): there are %i buffered resp/ind", i); + aci_bat_send_dti_data (src_infos_psi, src_infos_psi->data_buffer.data_list); + src_infos_psi->data_buffer.data_list = NULL; + src_infos_psi->data_buffer.max_buffer_size = 0; + src_infos_psi->data_buffer.create_time = 0; + } +} + +/* ++-------------------------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_check_for_multi_line_response_command | ++-------------------------------------------------------------------------------------+ + + PURPOSE : Some BAT commands send several responses to the application (CPBR,COPN,...). + To avoid eating up too much memory with aci_bat_buffer_dti_data(), + these multi line response commands send only a limited number of responses + at once. After that the command stores the current context (how many + responses it already sent and how many it still has to sent) and gives up + the CPU context. With it we return to pei_primitive and the frame is able + to pass the next primtive from ACI's input queue to the next call of pei_primitive. + In case of a DTI_REASON_TX_BUFFER_READY we will check in this function + whether there is still a multi line BAT command active. If so, we call this + BAT function once again with updated parameters to send the next responses. +*/ + +GLOBAL void aci_bat_check_for_multi_line_response_command(UBYTE src_id) +{ + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + T_ACI_DTI_PRC_PSI *src_infos_psi = NULL; + + TRACE_FUNCTION("aci_bat_check_for_multi_line_response_command()"); + + src_infos_psi = find_element (psi_src_params, src_id, cmhPSItest_srcId); + + if(src_infos_psi->large_type) /* large type means multi line responses */ + { + switch (src_infos_psi->bat_client[src_infos_psi->active_client].curCmd) + { + case (BAT_CMD_SET_PLUS_CPBR): + { + ret = sBAT_PlusCPBR_CB(src_infos_psi); + /* vsi_t_sleep (aci_handle, 3000); for testing only */ + break; + } + case (BAT_CMD_SET_PLUS_CPBF): + { + ret = sBAT_PlusCPBF_CB(src_infos_psi); + /* vsi_t_sleep (aci_handle, 3000); for testing only */ + break; + } + default: + { + TRACE_EVENT_P1("aci_bat_check_for_multi_line_response_command(): cmd %04X has no multi line responses", + src_infos_psi->bat_client[src_infos_psi->active_client].curCmd); + return; + } + } + + switch (ret) + { + case (ACI_BAT_CMPL): + { + srcId_cb = src_infos_psi->srcId; + rBAT_OK((T_ACI_AT_CMD)src_infos_psi->bat_client[src_infos_psi->active_client].curCmd); + break; + } + case (ACI_BAT_EXCT): + { + break; + } + default: + { + aci_bat_err(src_infos_psi); + } + } + } +} + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_cur_cmd_get | ++--------------------------------------------------------------------+ + + PURPOSE : Get the current command of the specified source. +*/ +GLOBAL T_BAT_ctrl_params aci_bat_cur_cmd_get (T_ACI_DTI_PRC_PSI *src_infos_psi) +{ + if (src_infos_psi EQ NULL) + return((T_BAT_ctrl_params)-1); + + if (src_infos_psi->bat_client EQ NULL) + return((T_BAT_ctrl_params)-1); + + return(src_infos_psi->bat_client[src_infos_psi->active_client].curCmd); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_cs_get | ++--------------------------------------------------------------------+ + + PURPOSE : Get the character set, potentially for BAT or even the + individual client, though for now it just returns the + value of the ATI global variable 'cscsChset'. +*/ +GLOBAL T_BAT_plus_cscs_cs aci_bat_cs_get (T_ACI_DTI_PRC_PSI *src_infos_psi) +{ + /* + * Necessary for target build? + */ + src_infos_psi=src_infos_psi; + + /* + * This relies on T_BAT_plus_cscs_cs being equivalent to + * T_ACI_CSCS_CHSET. It is, except that the ACI version has + * a 'NotPresent' value, which we must deal with. + */ + if (ati_user_output_cfg[src_infos_psi->srcId].cscsChset EQ CSCS_CHSET_NotPresent) + return(BAT_CSCS_CS_IRA); + else + return((T_BAT_plus_cscs_cs)ati_user_output_cfg[src_infos_psi->srcId].cscsChset); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_cs_set | ++--------------------------------------------------------------------+ + + PURPOSE : Set the character set, potentially for BAT or even the + individual client, though for now it just acts on the + ATI global variable 'cscsChset'. +*/ +GLOBAL void aci_bat_cs_set (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_plus_cscs_cs cs) +{ + /* + * Necessary for target build? + */ + src_infos_psi=src_infos_psi; + + /* + * This relies on T_BAT_plus_cscs_cs being equivalent to + * T_ACI_CSCS_CHSET. It is, except that the ACI version has + * a 'NotPresent' value. As the input to this function is in + * BAT format, this will not be a problem. + */ + if ((cs>=BAT_CSCS_CS_IRA) AND (cs<=BAT_CSCS_CS_UCS2)) + { + ati_user_output_cfg[src_infos_psi->srcId].cscsChset=(T_ACI_CSCS_CHSET)cs; + TRACE_EVENT_P1 ("aci_bat_cs_set(): new charset is %i", cs); + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_rcv | ++--------------------------------------------------------------------+ + + PURPOSE : called by sig_dti_data_received_ind(), see sap_dti.c +*/ +GLOBAL void aci_bat_rcv (T_ACI_DTI_PRC_PSI *src_infos_psi, T_DTI2_DATA_IND *dti_data_ind) +{ + U8 src_id = src_infos_psi->srcId; + T_desc2 *p_desc = (T_desc2 *)NULL; + T_L2P_STATUS l2p_status = L2P_STAT_UNKNOWN_ERROR; + + TRACE_FUNCTION("aci_bat_rcv()"); + + if (aci_bat_first_time) + { + aci_bat_first_time = FALSE; + aci_bat_init_globs(); + } + + if (aci_bat_globs[src_id].l2p_configured EQ FALSE) + { + if (aci_bat_bootstrap_l2p(src_infos_psi, dti_data_ind) EQ TRUE) + { + aci_bat_globs[src_id].l2p_configured = TRUE; + aci_bat_globs[src_id].psi_src = src_infos_psi; + } + else + { + return; /* trace message already in aci_bat_bootstrap_l2p */ + } + } + + p_desc = (T_desc2 *)dti_data_ind->desc_list2.first; + + if (aci_bat_globs[src_id].psi_src NEQ src_infos_psi) + { + /* maintenance problem, just a reminder that there is still something to do */ + TRACE_ERROR("aci_bat_rcv(): race condition between two PSI sources"); + } + aci_bat_globs[src_id].psi_src = src_infos_psi; + + /* + * L2P_Receive() calls aci_bat_l2p_msg_rxd_cb() and returns with + * a senseful value, which could used by ourself to decide what to do. + * callback functions make it hard to follow the function flow. + */ + l2p_status = L2P_Receive(aci_bat_globs[src_id].l2p_id, /* unique identifier */ + (void *)p_desc->buffer, /* first segment buffer */ + (void *)p_desc, /* first segment descriptor */ + dti_data_ind->desc_list2.list_len, /* total size */ + p_desc->size); /* first segment size */ + + switch (l2p_status) + { + case (L2P_STAT_SUCCESS): /* BAT command has been processed */ + break; + default: /* any error */ + TRACE_EVENT_P1("aci_bat_rcv(): L2P status = %d", l2p_status); + break; + } +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_ctrl_rcv | ++--------------------------------------------------------------------+ + + PURPOSE : BAT Library sent a control signal to BAT Module +*/ +GLOBAL void aci_bat_ctrl_rcv (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BATC_signal *signal) +{ + T_BATC_confirm confirm; + + TRACE_FUNCTION("aci_bat_ctrl_rcv()"); + + switch (signal->ctrl_params) + { + case (BATC_MAX_CLIENTS): + { + T_BATC_max_clients max_clients; + aci_bat_init_max_client_maintenance(src_infos_psi, (U8)signal->params.ptr_max_clients->num_clients); + confirm.rsp_params = BATC_MAX_CLIENTS_CNF; + /* acknowledge with the same data, because L2P does not accept NULL pointer */ + confirm.rsp.ptr_bat_open_client_cnf = (T_BATC_open_client *)&max_clients; + max_clients.num_clients = signal->params.ptr_max_clients->num_clients; + TRACE_EVENT_P2("aci_bat_ctrl_rcv(): BAT Lib instance with %d clients for src_id %d", + (U8)signal->params.ptr_max_clients->num_clients, src_infos_psi->srcId); + break; + } + case (BATC_OPEN_CLIENT): + { + T_BATC_open_client open_client; + src_infos_psi->bat_client[signal->params.ptr_open_client->client_id].opened = TRUE; + confirm.rsp_params = BATC_OPEN_CLIENT_CNF; + confirm.rsp.ptr_bat_open_client_cnf = &open_client; + confirm.rsp.ptr_bat_open_client_cnf->client_id = signal->params.ptr_open_client->client_id; + TRACE_EVENT_P2("aci_bat_ctrl_rcv(): BAT Lib client %d for src_id %d opened", + (U8)signal->params.ptr_open_client->client_id, src_infos_psi->srcId); + break; + } + case (BATC_CLOSE_CLIENT): + { + aci_bat_clean_client_maintenance(src_infos_psi, (U8)signal->params.ptr_close_client->client_id); + TRACE_EVENT_P2("aci_bat_ctrl_rcv(): BAT Lib client %d for src_id %d closed", + (U8)signal->params.ptr_close_client->client_id, src_infos_psi->srcId); +#ifndef _SIMULATION_ + /* make DTI happy with its flow control stuff */ + psa_psi_DTI_getdata ((UBYTE)(src_infos_psi->srcId), DTI_ENTITY_PSI); +#endif + return; /* return, because it is not confirmed to BAT library */ + } + case (BATC_ABORT_CMD): + { + T_BATC_abort_cmd abort_cmd; + U8 client_id = (U8)(signal->params.ptr_abort_cmd->client_id); + T_BAT_ctrl_params curCmd = src_infos_psi->bat_client[client_id].curCmd; + + if (src_infos_psi->run_cmd EQ FALSE) + { + /* + * there is no command running at all, but return with confirmation + * to make the state machine of BAT Lib happy + */ + confirm.rsp_params = BATC_ABORT_COMMAND_CNF; + TRACE_EVENT("aci_bat_ctrl_rcv(): no command to abort"); + } + else if (aci_bat_abort(src_infos_psi, client_id)) + { + confirm.rsp_params = BATC_ABORT_COMMAND_CNF; + TRACE_EVENT_P1("aci_bat_ctrl_rcv(): aborted the command %d ", curCmd); + src_infos_psi->run_cmd = FALSE; + } + else + { + TRACE_EVENT_P1("aci_bat_ctrl_rcv(): failed aborting command %d ", curCmd); + confirm.rsp_params = BATC_ABORT_COMMAND_REJ; + } + if (src_infos_psi->bat_client[client_id].curCmd EQ (T_BAT_ctrl_params)BATC_ABORT_CMD)/*lint !e650 (Warning - constant out of range for operator) */ + { + TRACE_EVENT_P1("aci_bat_ctrl_rcv(): executing to abort command %d ", curCmd); + return; /* do nothing, (call must be disconnected), takes some time, then send OK via rBAT_OK*/ + } + abort_cmd.client_id = client_id; + confirm.rsp.ptr_bat_abort_command_cnf = &abort_cmd; + break; + } + default: + TRACE_EVENT("aci_bat_ctrl_rcv(): unknown ctrl_params"); + return; /* control signal to BAT library */ + } + src_infos_psi->active_client = BAT_CTRL_CHANNEL; /* control channel */ + /* command responses and signal confirmations are organized in exactly the same way, + but signal confirmation must be casted to a command response */ + aci_bat_send(src_infos_psi, (T_BAT_cmd_response *)&confirm); +} + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_send | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL void aci_bat_send (T_ACI_DTI_PRC_PSI *src_infos_psi, + T_BAT_cmd_response *resp) +{ + T_L2P_STATUS l2p_status = L2P_STAT_UNKNOWN_ERROR; + int errVal = -1; + U8 client_id = 0xFF; /*broadcast */ + U16 resp_len = 0; + + TRACE_FUNCTION("aci_bat_send()"); + + if (BITFIELD_CHECK(resp->ctrl_response, BAT_BIT_12) || /* 0x1xxx = unsolicited --> broadcast */ + resp->ctrl_response EQ BAT_RES_UNS_PLUS_CRING || + resp->ctrl_response EQ BAT_RES_UNS_PLUS_CCWV) + { + client_id = 0xFF; /* broadcast */ + TRACE_EVENT_P1("aci_bat_send(): unsolicited response 0x%04X over broadcast channel", resp->ctrl_response); + } + else + { + client_id = src_infos_psi->active_client; /* not a broadcast message */ + TRACE_EVENT_P2("aci_bat_send(): response 0x%04X on client channel %d", resp->ctrl_response, client_id); + } + + if (BITFIELD_CHECK(resp->ctrl_response, BAT_BIT_15)) /* 0x8xxx = control response */ + { + resp_len = 4; /* the resp->ctrl_response (for L2P = Cmd Tag) does not count to resp length */ + } + else + { + resp_len = aci_bat_get_size(resp->ctrl_response); + } + + TRACE_EVENT_P2("aci_bat_send(): response = 0x%04X, size = %i", resp->ctrl_response, resp_len); + TRACE_BINDUMP(aci_handle, TC_USER4, "BAT RESPONSE PARAMETER", (U8 *)resp->response.ptr_at_ok, resp_len); + + + /* + * The format of an L2 frame for BAT will be as follows : + * + * For the first frame + * ---------------------------------------------------------------- + * | L2P Header | BAT Cmd TAG | BAT Command Data | + * | (n Bytes) | 4 Bytes | (Remaining Bytes) | + * ---------------------------------------------------------------- + * + * For any subsequent frames + * ---------------------------------------------------------------- + * | L2 Header | BAT Command Data | + * | (n Bytes) | (Remaining Bytes) | + * ---------------------------------------------------------------- + */ + srcId_cb = src_infos_psi->srcId; + + l2p_status = L2P_Send(aci_bat_globs[src_infos_psi->srcId].l2p_id, /* unique identifier */ + client_id, + resp->ctrl_response, /* this is the important thing */ + resp->response.ptr_at_ok, /* don't worry, it always points to the right thing */ + resp_len, + &errVal); + switch (l2p_status) + { + case (L2P_STAT_SUCCESS): + if (resp->ctrl_response <= BAT_RES_PLUS_EXT_ERROR) + { + if (src_infos_psi->large_type EQ FALSE) /* not CPBR, COPN, ... */ + { + src_infos_psi->run_cmd = FALSE; + src_infos_psi->bat_client[src_infos_psi->active_client].curCmd = (T_BAT_ctrl_params)-1; + } + } + break; + default: + TRACE_EVENT_P1("aci_bat_send(): l2p_status = %d", l2p_status); + TRACE_EVENT_P1("aci_bat_send(): errVal = %d", errVal); /* what is so special ? */ + break; + } +#ifndef _SIMULATION_ + /* make DTI happy with its flow control stuff */ + psa_psi_DTI_getdata ((UBYTE)(src_infos_psi->srcId), DTI_ENTITY_PSI); +#endif +} + + +GLOBAL void aci_bat_run_cmd (T_ACI_DTI_PRC_PSI *src_infos_psi) +{ + U8 client_id; + T_BAT_cmd_send cmd; + + TRACE_FUNCTION("aci_bat_run_cmd()"); + + /* run all pending commands from the queue */ + while (aci_bat_queue_get(src_infos_psi->queue, &cmd, &client_id) EQ TRUE) + { + src_infos_psi->bat_client[client_id].curCmd = cmd.ctrl_params; + src_infos_psi->active_client = client_id; + src_infos_psi->run_cmd = TRUE; + + TRACE_EVENT_P1("client_id = %d", client_id); + TRACE_EVENT_P1("command identifier = 0x%04X", cmd.ctrl_params); + TRACE_BINDUMP(aci_handle, TC_USER4, "BAT COMMAND PARAMETER 3", (U8 *)cmd.params.ptr_at_a, 4); + + /* run the command, result code is send back also from wrapper */ + switch (aci_bat_wrapper(src_infos_psi, &cmd)) /* run the command */ + { + case (ACI_BAT_EXCT): + { + ACI_MFREE(cmd.params.ptr_andc); /* was allocated in aci_bat_queue_put() */ + return; /* asynchronous command terminates with rBAT_OK ... rBAT_NO_ANSWER */ + } + default: + { + src_infos_psi->bat_client[client_id].curCmd = (T_BAT_ctrl_params)-1; + src_infos_psi->active_client = 0xFF; + src_infos_psi->run_cmd = FALSE; + ACI_MFREE(cmd.params.ptr_andc); /* was allocated in aci_bat_queue_put() */ + break; /* terminated, so start with the next command */ + } + } + } +} + + + +/* ++--------------------------------------------------------------------+ +| PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | +| STATE : code ROUTINE : aci_bat_wrapper | ++--------------------------------------------------------------------+ + + PURPOSE : +*/ +GLOBAL T_ACI_BAT_RSLT aci_bat_wrapper (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) +{ + U16 index = 0; + T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; + + if (BITFIELD_CHECK(cmd->ctrl_params, BAT_BIT_12)) /* 0x1000 */ + { + index = (U16)(cmd->ctrl_params - BAT_BIT_12); + if (bat_cmds_without_params[index].fptr) + { + ret = bat_cmds_without_params[index].fptr(src_infos_psi, cmd); + } + else + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow); + } + } + else + { + index = (U16)cmd->ctrl_params; + if (bat_cmds[index].fptr) + { + ret = bat_cmds[index].fptr(src_infos_psi, cmd); + } + else + { + ACI_ERR_DESC( ACI_ERR_CLASS_Cme, CME_ERR_OpNotAllow); + } + } + + switch (ret) + { + case ACI_BAT_FAIL: + /* + * The reason for the failure will have been stored in aciErrDesc, + * we first call aci_bat_err() to translate this into a BAT + * response message (CME ERROR / CMS ERROR / CEER) and send it. + */ + aci_bat_err(src_infos_psi); + break; + + case ACI_BAT_CMPL: + /* + * Send OK. + */ + { + T_BAT_cmd_response resp; + T_BAT_no_parameter dummy; + + resp.ctrl_response=BAT_RES_AT_OK; + resp.response.ptr_at_ok=(T_BAT_no_parameter *)&dummy; + dummy.bat_dummy = 0xFF; + TRACE_EVENT("aci_bat_wrapper(): OK"); + aci_bat_send(src_infos_psi,&resp); + } + break; + + case ACI_BAT_BUSY: + /* + * Send BUSY. + */ + { + T_BAT_cmd_response resp; + T_BAT_no_parameter dummy; + + resp.ctrl_response=BAT_RES_AT_BUSY; + resp.response.ptr_at_busy=(T_BAT_no_parameter *)&dummy; + dummy.bat_dummy = 0xFF; + TRACE_EVENT("aci_bat_wrapper(): BUSY"); + aci_bat_send(src_infos_psi,&resp); + } + break; + + case ACI_BAT_EXCT: + /* + * This return value implies interaction with the protocol stack, + * and the response will be delivered via an rBAT_xxx(). No further + * action needs to be taken at this point. + */ + TRACE_EVENT("aci_bat_wrapper(): EXCT"); +#ifdef _SIMULATION_ + src_infos_psi->res.response = NULL; +#endif + break; + + default: + /* + * Reaching this point, which should not happen, may indicate that + * T_ACI_BAT_RSLT is no longer identical to T_ACI_RETURN - and it + * needs to be. + */ + break; + } + return (ret); +} + +#endif /* ACI_BAT_C */