FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/aci_bat_bas.c @ 287:3dee79757ae4
UI fw: load handheld audio mode on boot
We have now reached the point where use of audio mode config files
should be considered mandatory. In ACI usage we can tell users that
they need to perform an AT@AUL of some appropriate audio mode, but
in UI-enabled fw we really need to have the firmware load audio modes
on its own, so that correct audio config gets established when the
handset or development board runs on its own, without a connected host
computer.
Once have FC Venus with both main and headset audio channels and
headset plug insertion detection, our fw will need to automatically
load the handheld mode or the headset mode depending on the plug
insertion state. For now we load only the handheld mode, which has
been tuned for FC-HDS4 on FC Luna.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Sat, 13 Nov 2021 03:20:57 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | 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 BAT wrapper modul is ... | +----------------------------------------------------------------------------- */ #include "aci_all.h" /* includes prim.h, which includes p_bat.h */ #include "aci_cmh.h" /* prototypes of sAT_,qAT_,tAT_ */ #include "aci_bat_cmh.h" /* prototypes of sBAT_,qBAT_,tBAT_ */ #include "aci_bat.h" #include "pwr.h" /* see sBAT_PlusCBC() */ #include "audio.h" /* see sBAT_PlusCLVL(), qBAT_PlusCLVL() */ #include "pcm.h" /* see aciBatPrcsPlusCG() */ LOCAL T_ACI_BAT_RSLT aciBatPrcsPlusCG (UBYTE *rc, USHORT *le, size_t ml, CHAR *ef); /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : BAT_Z | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT BAT_Z (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; TRACE_FUNCTION ("BAT_Z()"); ret=(T_ACI_BAT_RSLT)sAT_Z((T_ACI_CMD_SRC)src_infos_psi->srcId,0); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCPAS | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCPAS (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_CPAS_PAS pas; TRACE_FUNCTION ("sBAT_PlusCPAS()"); /* * The ACI has implemented the 'set' operation of +CPAS as a qAT function. */ ret=(T_ACI_BAT_RSLT)qAT_PlusCPAS((T_ACI_CMD_SRC)src_infos_psi->srcId,&pas); if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_set_plus_cpas cpas_data; resp.ctrl_response=BAT_RES_SET_PLUS_CPAS; resp.response.ptr_set_plus_cpas=&cpas_data; /* * This relies on T_BAT_plus_cpas_pas being identical to * T_ACI_CPAS_PAS. They aren't quite the same, the BAT version * doesn't have a 'not present' value, but as the parameter in * question is mandatory this shouldn't be a problem. */ cpas_data.pas=(T_BAT_plus_cpas_pas)pas; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : BAT_ANDC | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT BAT_ANDC (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_DCD_MOD dcd; TRACE_FUNCTION ("BAT_ANDC()"); /* * This relies on T_BAT_andc_value being identical to * T_ACI_DCD_MOD. */ dcd=(T_ACI_DCD_MOD)cmd->params.ptr_andc->value; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_AndC((T_ACI_CMD_SRC)src_infos_psi->srcId,dcd); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : BAT_ANDF | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT BAT_ANDF (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; TRACE_FUNCTION ("BAT_ANDF()"); /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_AndF((T_ACI_CMD_SRC)src_infos_psi->srcId,0); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCSQ | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCSQ (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; UBYTE rssi; UBYTE ber; UBYTE actlevel; #ifdef FF_PS_RSSI UBYTE min_access_level; #endif TRACE_FUNCTION ("sBAT_PlusCSQ()"); /* * The ACI has implemented the 'set' operation of +CSQ as a qAT function. * There isn't a separate qAT_PlusCSQ() function, so we must use the * 'percent' version and ignore the extra 'actlevel' and min_access_level * value returned. */ #ifdef FF_PS_RSSI ret=(T_ACI_BAT_RSLT)qAT_PercentCSQ((T_ACI_CMD_SRC)src_infos_psi->srcId, &rssi, &ber, &actlevel, &min_access_level); #else ret=(T_ACI_BAT_RSLT)qAT_PercentCSQ(src_infos_psi->srcId,&rssi,&ber,&actlevel); #endif if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_set_plus_csq csq_data; resp.ctrl_response=BAT_RES_SET_PLUS_CSQ; resp.response.ptr_set_plus_csq=&csq_data; csq_data.rssi=(U8)rssi; csq_data.ber=(U8)ber; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PercentCSQ | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PercentCSQ (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; TRACE_FUNCTION ("sBAT_PercentCSQ()"); ret = (T_ACI_BAT_RSLT)sAT_PercentCSQ ((T_ACI_CMD_SRC)src_infos_psi->srcId, (T_ACI_CSQ_MODE)cmd->params.ptr_set_percent_csq->csq_mode); if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_set_percent_csq csq_data; resp.ctrl_response = BAT_RES_SET_PERCENT_CSQ; resp.response.ptr_set_percent_csq = &csq_data; csq_data.csq_mode = cmd->params.ptr_set_percent_csq->csq_mode; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PercentCSQ | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PercentCSQ (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; UBYTE rssi; UBYTE ber; UBYTE actlevel; #ifdef FF_PS_RSSI UBYTE min_access_level; #endif TRACE_FUNCTION ("qBAT_PercentCSQ()"); /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ #ifdef FF_PS_RSSI ret=(T_ACI_BAT_RSLT)qAT_PercentCSQ((T_ACI_CMD_SRC)src_infos_psi->srcId, &rssi, &ber, &actlevel, &min_access_level); #else ret=(T_ACI_BAT_RSLT)qAT_PercentCSQ(src_infos_psi->srcId,&rssi,&ber,&actlevel); #endif if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_que_percent_csq csq_data; resp.ctrl_response=BAT_RES_QUE_PERCENT_CSQ; resp.response.ptr_que_percent_csq=&csq_data; csq_data.rssi=(U8)rssi; csq_data.ber=(U8)ber; csq_data.actlevel=(U8)actlevel; #ifdef FF_PS_RSSI csq_data.min_access_level = (U8)min_access_level; #endif aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCBC | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCBC (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { pwr_Status_Type powerStat; T_BAT_cmd_response resp; T_BAT_res_set_plus_cbc cbc_data; TRACE_FUNCTION("sBAT_PlusCBC()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. This code is adapted from the ATI function * atPlusCBC(). */ if (pwr_GetStatus(&powerStat) NEQ DRV_OK) { ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); return(ACI_BAT_FAIL); } resp.ctrl_response=BAT_RES_SET_PLUS_CBC; resp.response.ptr_set_plus_cbc=&cbc_data; switch(powerStat.Status) { case PWR_EXTPOWER_ON: cbc_data.bsc=BAT_CBC_BSC_NOBATTERY; break; case PWR_CHARGER_ON: cbc_data.bsc=BAT_CBC_BSC_BATTERY; break; default: cbc_data.bsc=BAT_CBC_BSC_BATTERYPOWERED; break; } cbc_data.bcl=(T_BAT_plus_cbc_bcl)powerStat.ChargeLevel; aci_bat_send(src_infos_psi,&resp); return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCLVL | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCLVL (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { TRACE_FUNCTION ("sBAT_PlusCLVL()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. */ if (audio_SetAmplf(AUDIO_SPEAKER,(UBYTE)cmd->params.ptr_set_plus_clvl->level) NEQ DRV_OK) { ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); return(ACI_BAT_FAIL); } return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusCLVL | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusCLVL (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { UBYTE vol; T_BAT_cmd_response resp; T_BAT_res_que_plus_clvl clvl_data; TRACE_FUNCTION ("qBAT_PlusCLVL()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. */ if (audio_GetAmplf(AUDIO_MICROPHONE,&vol) NEQ DRV_OK) { ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); return(ACI_BAT_FAIL); } resp.ctrl_response=BAT_RES_QUE_PLUS_CLVL; resp.response.ptr_que_plus_clvl=&clvl_data; clvl_data.level=(U8)vol; aci_bat_send(src_infos_psi,&resp); return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCMUT | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCMUT (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { UBYTE mute; TRACE_FUNCTION ("sBAT_PlusCMUT()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. */ mute=(cmd->params.ptr_set_plus_cmut->n EQ BAT_CMUT_N_ON) ? AUDIO_MUTING_ON:AUDIO_MUTING_OFF; if(audio_SetMute(AUDIO_MICROPHONE,mute) NEQ DRV_OK) { ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); return(ACI_BAT_FAIL); } return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusCMUT | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusCMUT (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { UBYTE mute; T_BAT_cmd_response resp; T_BAT_res_que_plus_cmut cmut_data; TRACE_FUNCTION ("qBAT_PlusCMUT()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. */ if (audio_GetMute(AUDIO_MICROPHONE,&mute) NEQ DRV_OK) { ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); return(ACI_BAT_FAIL); } resp.ctrl_response=BAT_RES_QUE_PLUS_CMUT; resp.response.ptr_que_plus_cmut=&cmut_data; cmut_data.n=(U8)(mute EQ AUDIO_MUTING_ON) ? BAT_CMUT_N_ON:BAT_CMUT_N_OFF; aci_bat_send(src_infos_psi,&resp); return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCSCS | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCSCS (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_BAT_plus_cscs_cs cs; TRACE_FUNCTION ("sBAT_PlusCSCS()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. */ cs=cmd->params.ptr_set_plus_cscs->cs; /* * As we are handling this within BAT and not forwarding it to * the ACI we should check the input parameter. */ if ((cs<BAT_CSCS_CS_IRA) || (cs>BAT_CSCS_CS_UCS2)) { ACI_ERR_DESC(ACI_ERR_CLASS_Cme,CME_ERR_Unknown); return(ACI_BAT_FAIL); } aci_bat_cs_set(src_infos_psi,cs); return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusCSCS | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusCSCS (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_BAT_cmd_response resp; T_BAT_res_que_plus_cscs cscs_data; TRACE_FUNCTION ("qBAT_PlusCSCS()"); /* * There is no equivalent ACI function, so we must handle this * within BAT. */ resp.ctrl_response=BAT_RES_QUE_PLUS_CSCS; resp.response.ptr_que_plus_cscs=&cscs_data; cscs_data.cs=aci_bat_cs_get(src_infos_psi); aci_bat_send(src_infos_psi,&resp); return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PercentCCBS | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PercentCCBS (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; SHORT idx; TRACE_FUNCTION ("sBAT_PercentCCBS()"); idx=(SHORT)cmd->params.ptr_set_percent_ccbs->idx; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_PercentCCBS((T_ACI_CMD_SRC)src_infos_psi->srcId,idx); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PercentCCBS | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PercentCCBS (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; TRACE_FUNCTION ("qBAT_PercentCCBS()"); ret=(T_ACI_BAT_RSLT)qAT_PercentCCBS((T_ACI_CMD_SRC)src_infos_psi->srcId); /* * qAT_PercentCCBS() never returns AT_CMPL, so we do not send * the response here. */ return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCMUX | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCMUX (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_BAT_cmd_set_plus_cmux *cmux; TRACE_FUNCTION ("sBAT_PlusCMUX()"); /* * Get a pointer to the CMUX data for convenience. */ cmux=cmd->params.ptr_set_plus_cmux; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. Note that we lose * 'k' as it is not in the ACI. */ ret=(T_ACI_BAT_RSLT)sAT_PlusCMUX( (T_ACI_CMD_SRC)src_infos_psi->srcId, (UBYTE)cmux->mode, (UBYTE)cmux->subset, (UBYTE)cmux->port_speed, (USHORT)cmux->n1, (UBYTE)cmux->t1, (UBYTE)cmux->n2, (UBYTE)cmux->t2, (UBYTE)cmux->t3); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusCMUX | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusCMUX (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { TRACE_FUNCTION ("qBAT_PlusCMUX()"); /* * There is no ACI equivalent. */ return(ACI_BAT_CMPL); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusIPR | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusIPR (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_BD_RATE rate; TRACE_FUNCTION ("sBAT_PlusIPR()"); /* * This relies on T_ACI_BD_RATE and T_BAT_plus_ipr_rate being * identical. In fact the BAT has an extra value, but this should * not cause problems as there is a parameter check in * sAT_PlusIPR(). */ rate=(T_ACI_BD_RATE)cmd->params.ptr_set_plus_ipr->rate; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_PlusIPR((T_ACI_CMD_SRC)src_infos_psi->srcId,rate); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusIPR | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusIPR (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; T_ACI_BD_RATE rate; TRACE_FUNCTION ("qBAT_PlusIPR()"); /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)qAT_PlusIPR((T_ACI_CMD_SRC)src_infos_psi->srcId,&rate); if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_que_plus_ipr ipr_data; resp.ctrl_response=BAT_RES_QUE_PLUS_IPR; resp.response.ptr_que_plus_ipr=&ipr_data; /* * This relies on T_ACI_BD_RATE and T_BAT_plus_ipr_rate being * identical. In fact the BAT has an extra value, but that is * irrelevant in this direction. */ ipr_data.rate=(T_BAT_plus_ipr_rate)rate; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusICF | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusICF (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_BS_FRM format; T_ACI_BS_PAR parity; TRACE_FUNCTION ("sBAT_PlusICF()"); /* * This relies on T_ACI_BS_FRM being identical to T_BAT_framing_format * and T_ACI_BS_PAR being identical to T_BAT_framing_parity. */ format=(T_ACI_BS_FRM)cmd->params.ptr_set_plus_icf->framing_format; parity=(T_ACI_BS_PAR)cmd->params.ptr_set_plus_icf->framing_parity; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_PlusICF((T_ACI_CMD_SRC)src_infos_psi->srcId,format,parity); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusICF | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusICF (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_BS_FRM format; T_ACI_BS_PAR parity; TRACE_FUNCTION ("qBAT_PlusICF()"); /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)qAT_PlusICF((T_ACI_CMD_SRC)src_infos_psi->srcId,&format,&parity); if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_que_plus_icf icf_data; resp.ctrl_response=BAT_RES_QUE_PLUS_ICF; resp.response.ptr_que_plus_icf=&icf_data; /* * This relies on T_ACI_BS_FRM being identical to T_BAT_framing_format * and T_ACI_BS_PAR being identical to T_BAT_framing_parity. */ icf_data.framing_format=(T_BAT_framing_format)format; icf_data.framing_parity=(T_BAT_framing_parity)parity; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusIFC | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusIFC (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_RX_FLOW_CTRL DCE_by_DTE; T_ACI_RX_FLOW_CTRL DTE_by_DCE; TRACE_FUNCTION ("sBAT_PlusIFC()"); /* * This relies on T_ACI_RX_FLOW_CONTROL being identical to both * T_BAT_plus_ifc_by_te and T_BAT_plus_ifc_by_ta. Note that * sAT_PlusIFC() really does use T_ACI_RX_FLOW_CTRL for both * parameters even though a T_ACI_TX_FLOW_CTRL exists (they are * equivalent anyway). */ DCE_by_DTE=(T_ACI_RX_FLOW_CTRL)cmd->params.ptr_set_plus_ifc->by_te; DTE_by_DCE=(T_ACI_RX_FLOW_CTRL)cmd->params.ptr_set_plus_ifc->by_ta; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_PlusIFC((T_ACI_CMD_SRC)src_infos_psi->srcId,DCE_by_DTE,DTE_by_DCE); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusIFC | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusIFC (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_RX_FLOW_CTRL DCE_by_DTE; T_ACI_RX_FLOW_CTRL DTE_by_DCE; TRACE_FUNCTION ("qBAT_PlusIFC()"); /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)qAT_PlusIFC((T_ACI_CMD_SRC)src_infos_psi->srcId,&DCE_by_DTE,&DTE_by_DCE); if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_que_plus_ifc ifc_data; resp.ctrl_response=BAT_RES_QUE_PLUS_IFC; resp.response.ptr_que_plus_ifc=&ifc_data; /* * This relies on T_ACI_RX_FLOW_CONTROL being identical to both * T_BAT_plus_ifc_by_te and T_BAT_plus_ifc_by_ta. Note that * qAT_PlusIFC() really does use T_ACI_RX_FLOW_CTRL for both * parameters even though a T_ACI_TX_FLOW_CTRL exists (they are * equivalent anyway). */ ifc_data.by_te=(T_BAT_plus_ifc_by_te)DCE_by_DTE; ifc_data.by_ta=(T_BAT_plus_ifc_by_ta)DTE_by_DCE; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCCLK | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCCLK (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_RTC_DATE date; T_ACI_RTC_TIME time; int time_zone; TRACE_FUNCTION ("sBAT_PlusCCLK()"); date.year=(USHORT)(cmd->params.ptr_set_plus_cclk->year+2000); date.month=(UBYTE)cmd->params.ptr_set_plus_cclk->month; date.day=(UBYTE)cmd->params.ptr_set_plus_cclk->day; time.hour=(UBYTE)cmd->params.ptr_set_plus_cclk->hour; time.minute=(UBYTE)cmd->params.ptr_set_plus_cclk->minutes; time.second=(UBYTE)cmd->params.ptr_set_plus_cclk->seconds; /* * Time format and PM flag are not in the BAT message. Use the same * values that the ATI does in this situation. */ time.format=TIME_FORMAT_24HOUR; time.PM_flag=0; time_zone=(int)cmd->params.ptr_set_plus_cclk->time_zone; /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)sAT_PlusCCLK((T_ACI_CMD_SRC)src_infos_psi->srcId,&date,&time,time_zone); return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : qBAT_PlusCCLK | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT qBAT_PlusCCLK (T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret; T_ACI_RTC_DATE date; T_ACI_RTC_TIME time; int time_zone; TRACE_FUNCTION ("qBAT_PlusCCLK()"); /* * Call the corresponding ACI function. T_ACI_BAT_RSLT is * assumed to be equivalent to T_ACI_RESULT. */ ret=(T_ACI_BAT_RSLT)qAT_PlusCCLK((T_ACI_CMD_SRC)src_infos_psi->srcId,&date,&time,&time_zone); if (ret EQ ACI_BAT_CMPL) { T_BAT_cmd_response resp; T_BAT_res_que_plus_cclk cclk_data; resp.ctrl_response=BAT_RES_QUE_PLUS_CCLK; resp.response.ptr_que_plus_cclk=&cclk_data; cclk_data.year=(U8)(date.year-2000); cclk_data.month=(U8)date.month; cclk_data.day=(U8)date.day; cclk_data.hour=(U8)time.hour; /* * BAT only handles a 24 hour clock. So if the information arrives * in 12 hour format we must convert it. */ if (time.format EQ TIME_FORMAT_12HOUR) { if ((time.PM_flag) AND (time.hour<12)) cclk_data.hour+=12; else if ((time.PM_flag EQ 0) AND (time.hour EQ 12)) cclk_data.hour=0; } cclk_data.minutes=(U8)time.minute; cclk_data.seconds=(U8)time.second; cclk_data.time_zone=(S8)time_zone; aci_bat_send(src_infos_psi,&resp); } return(ret); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCGMI | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGMI(T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; T_BAT_cmd_response resp; T_BAT_res_set_plus_cgmi set_cgmi_buffer; TRACE_FUNCTION ("sBAT_PlusCGMI()"); resp.ctrl_response = BAT_RES_SET_PLUS_CGMI ; resp.response.ptr_set_plus_cgmi = &set_cgmi_buffer; ret = aciBatPrcsPlusCG(resp.response.ptr_set_plus_cgmi->manufacturer, &resp.response.ptr_set_plus_cgmi->c_manufacturer, sizeof(resp.response.ptr_set_plus_cgmi->manufacturer), EF_CGMI_ID); if (ret EQ ACI_BAT_CMPL) { aci_bat_send(src_infos_psi,&resp); } return ret; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCGMM | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGMM(T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; T_BAT_cmd_response resp; T_BAT_res_set_plus_cgmm set_cgmm_buffer; TRACE_FUNCTION ("sBAT_PlusCGMM()"); resp.ctrl_response = BAT_RES_SET_PLUS_CGMM ; resp.response.ptr_set_plus_cgmm = &set_cgmm_buffer; ret = aciBatPrcsPlusCG(resp.response.ptr_set_plus_cgmm->model, &resp.response.ptr_set_plus_cgmm->c_model, sizeof(resp.response.ptr_set_plus_cgmm->model), EF_CGMM_ID); if (ret EQ ACI_BAT_CMPL) { aci_bat_send(src_infos_psi,&resp); } return ret; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : sBAT_PlusCGMR | +--------------------------------------------------------------------+ PURPOSE : */ GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGMR(T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; T_BAT_cmd_response resp; T_BAT_res_set_plus_cgmr set_cgmr_buffer; TRACE_FUNCTION ("sBAT_PlusCGMR()"); resp.ctrl_response = BAT_RES_SET_PLUS_CGMR ; resp.response.ptr_set_plus_cgmr = &set_cgmr_buffer; ret = aciBatPrcsPlusCG(resp.response.ptr_set_plus_cgmr->revision, &resp.response.ptr_set_plus_cgmr->c_revision, sizeof(resp.response.ptr_set_plus_cgmr->revision), EF_CGMR_ID); if (ret EQ ACI_BAT_CMPL) { aci_bat_send(src_infos_psi,&resp); } return ret; } GLOBAL T_ACI_BAT_RSLT sBAT_PlusCGSN(T_ACI_DTI_PRC_PSI *src_infos_psi, T_BAT_cmd_send *cmd) { T_ACI_BAT_RSLT ret = ACI_BAT_FAIL; T_BAT_cmd_response resp; T_BAT_res_set_plus_cgsn set_cgsn_buffer; TRACE_FUNCTION ("sBAT_PlusCGSN()"); resp.ctrl_response = BAT_RES_SET_PLUS_CGSN ; resp.response.ptr_set_plus_cgsn = &set_cgsn_buffer; ret = aciBatPrcsPlusCG(resp.response.ptr_set_plus_cgsn->sn, &resp.response.ptr_set_plus_cgsn->c_sn, sizeof(resp.response.ptr_set_plus_cgsn->sn), EF_CGSN_ID); if (ret EQ ACI_BAT_CMPL) { aci_bat_send(src_infos_psi,&resp); } return ret; } /* +--------------------------------------------------------------------+ | PROJECT : GSM-F&D (8411) MODULE : ACI_BAT | | STATE : code ROUTINE : aciBatPrcsPlusCG | +--------------------------------------------------------------------+ PURPOSE : */ LOCAL T_ACI_BAT_RSLT aciBatPrcsPlusCG (UBYTE *rc, USHORT *le, size_t ml, CHAR *ef) { pcm_FileInfo_Type fileInfo; USHORT i; TRACE_FUNCTION("aciBatPrcsPlusCG()"); if (pcm_GetFileInfo ((UBYTE* )ef, &fileInfo) NEQ DRV_OK) { cmdCmeError (CME_ERR_MemFail); return ACI_BAT_FAIL; } if (fileInfo.FileSize <= ml) { if (pcm_ReadFile ((UBYTE*)ef, fileInfo.FileSize, (UBYTE*)rc, &fileInfo.Version) NEQ DRV_OK) { cmdCmeError (CME_ERR_MemFail); return ACI_BAT_FAIL; } i = 0; while (rc[i] NEQ 0xFF) { i++; } *le = i; return ACI_BAT_CMPL; } else { TRACE_FUNCTION("aciBatPrcsPlusCG(): file size is larger than the defined response length!"); cmdCmeError (CME_ERR_MemFail); return ACI_BAT_FAIL; } }