FreeCalypso > hg > fc-tourmaline
view src/g23m-aci/aci/cmh_l2rs.c @ 261:841a848ba762
SPI SWE: clear any pending boot-time interrupts in spi_init()
Charger plug/unplug hw logic in the Iota ABB has no built-in debouncing,
thus electrical contact bounce on the charging power connection interface
produces a lot of charger plug/unplug interrupts. When we boot in
charging mode (charging power present at boot time and is presumably
the cause of Switch-ON), some bounce may occur between the initial
Iota Switch-ON action and Calypso firmware booting. By clearing any
accumulated ITSTATREG interrupts on boot, we prevent these pre-boot
interrupts from generating charger plug/unplug events to FCHG, which
would upset smooth from-boot charging.
author | Mychaela Falconia <falcon@freecalypso.org> |
---|---|
date | Fri, 14 May 2021 02:49:05 +0000 |
parents | fa8dc04885d8 |
children |
line wrap: on
line source
/* +----------------------------------------------------------------------------- | Project : GSM-PS (6147) | Modul : CMH_L2RS +----------------------------------------------------------------------------- | Copyright 2002 Texas Instruments Berlin, AG | All rights reserved. | | This file is confidential and a trade secret of Texas | Instruments Berlin, AG | The receipt of or possession of this file does not convey | any rights to reproduce or disclose its contents or to | manufacture, use, or sell anything it may describe, in | whole, or in part, without the specific written consent of | Texas Instruments Berlin, AG. +----------------------------------------------------------------------------- | Purpose : This module provides the set functions related to the | protocol stack adapter for L2R. +----------------------------------------------------------------------------- */ #ifdef DTI #ifndef CMH_L2RS_C #define CMH_L2RS_C #endif #include "aci_all.h" /*==== INCLUDES ===================================================*/ #include "aci_cmh.h" #include "ati_cmd.h" #include "aci_cmd.h" #include "dti.h" /* functionality of the dti library */ #include "aci.h" #ifdef FAX_AND_DATA #include "aci_fd.h" #endif /* of #ifdef FAX_AND_DATA */ #include "dti_conn_mng.h" #include "dti_cntrl_mng.h" #include "psa.h" #include "cmh.h" #include "cmh_ra.h" #include "psa_l2r.h" #include "cmh_l2r.h" #include "psa_ra.h" #include "psa_tra.h" #ifdef UART #include "psa_uart.h" #endif #ifdef FF_PSI #include "psa_psi.h" #endif /*FF_PSI*/ /*==== CONSTANTS ==================================================*/ /*==== EXPORT =====================================================*/ /*==== VARIABLES ==================================================*/ /*==== FUNCTIONS ==================================================*/ /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_L2RS | | STATE : code ROUTINE : sAT_PlusCRLP | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +CRLP AT command which is responsible to set the radio link protocol parameters for following asynchronous data transfer calls. <iws>: IWF to MS window size. <mws>: MS to IWF window size <t1> : acknowledge timer <n2> : retransmission attemps */ GLOBAL T_ACI_RETURN sAT_PlusCRLP ( T_ACI_CMD_SRC srcId, SHORT iws, SHORT mws, SHORT t1, SHORT n2) { T_L2R_CMD_PRM * pL2RCmdPrm; /* points to L2R command parameters */ TRACE_FUNCTION ("sAT_PlusCRLP()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pL2RCmdPrm = &fnd_cmhPrm[srcId].l2rCmdPrm; /* *------------------------------------------------------------------- * process the iws parameter ( IWF to MS window size ) *------------------------------------------------------------------- */ if( iws NEQ ACI_NumParmNotPresent ) { if( iws > L2R_K_IWF_MS_MAX OR iws < L2R_K_IWF_MS_MIN ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } else iws = pL2RCmdPrm -> CRLPiws; /* *------------------------------------------------------------------- * process the mws parameter ( MS to IWF window size ) *------------------------------------------------------------------- */ if( mws NEQ ACI_NumParmNotPresent ) { if( mws > L2R_K_MS_IWF_MAX OR mws < L2R_K_MS_IWF_MIN ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } else mws = pL2RCmdPrm -> CRLPmws; /* *------------------------------------------------------------------- * process the t1 parameter ( acknowledge timer ) *------------------------------------------------------------------- */ if( t1 NEQ ACI_NumParmNotPresent ) { if( t1 > L2R_T1_MAX OR t1 < L2R_T1_MIN ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } else t1 = pL2RCmdPrm -> CRLPt1; /* *------------------------------------------------------------------- * process the n2 parameter ( retransmission attemps ) *------------------------------------------------------------------- */ if( n2 NEQ ACI_NumParmNotPresent ) { if( n2 > L2R_N2_MAX OR n2 < L2R_N2_MIN ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } else n2 = pL2RCmdPrm -> CRLPn2; /* *------------------------------------------------------------------- * assign the parameters *------------------------------------------------------------------- */ pL2RCmdPrm -> CRLPiws = iws; pL2RCmdPrm -> CRLPmws = mws; pL2RCmdPrm -> CRLPt1 = t1; pL2RCmdPrm -> CRLPn2 = n2; return( AT_CMPL ); } /* +--------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_L2RS | | STATE : code ROUTINE : sAT_PlusDS | +--------------------------------------------------------------------+ PURPOSE : This is the functional counterpart to the +DS AT command which is responsible to set the data compression control parameters for following asynchronous data transfer calls. <dir> : desired direction of data compression. <comp> : mode of continue <maxDict> : maximum number of dictionary entries <maxStr> : maximum string length */ GLOBAL T_ACI_RETURN sAT_PlusDS ( T_ACI_CMD_SRC srcId, T_ACI_DS_DIR dir, T_ACI_DS_COMP comp, LONG maxDict, SHORT maxStr ) { T_L2R_CMD_PRM * pL2RCmdPrm; /* points to L2R command parameters */ TRACE_FUNCTION ("sAT_PlusDS()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } pL2RCmdPrm = &fnd_cmhPrm[srcId].l2rCmdPrm; /* *------------------------------------------------------------------- * process the dir parameter *------------------------------------------------------------------- */ switch( dir ) { case( DS_DIR_NotPresent ): dir = pL2RCmdPrm -> DSdir; break; case( DS_DIR_Negotiated ): case( DS_DIR_TxOnly ): case( DS_DIR_RxOnly ): case( DS_DIR_Both ): break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * process the comp parameter *------------------------------------------------------------------- */ switch( comp ) { case( DS_COMP_NotPresent ): comp = pL2RCmdPrm -> DScomp; break; case( DS_COMP_DoNotDisc ): case( DS_COMP_Disc ): break; default: ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } /* *------------------------------------------------------------------- * process the maxDict parameter *------------------------------------------------------------------- */ if( maxDict NEQ ACI_NumParmNotPresent ) { if( maxDict > L2R_P1_MAX OR maxDict < L2R_P1_MIN ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } else maxDict = pL2RCmdPrm -> DSmaxDict; /* *------------------------------------------------------------------- * process the maxStr parameter *------------------------------------------------------------------- */ if( maxStr NEQ ACI_NumParmNotPresent ) { if( maxStr > L2R_P2_MAX OR maxStr < L2R_P2_MIN ) { ACI_ERR_DESC( ACI_ERR_CLASS_Ext, EXT_ERR_Parameter ); return( AT_FAIL ); } } else maxStr = pL2RCmdPrm -> DSmaxStr; /* *------------------------------------------------------------------- * assign the parameters *------------------------------------------------------------------- */ pL2RCmdPrm -> DSdir = dir; pL2RCmdPrm -> DScomp = comp; pL2RCmdPrm -> DSmaxDict = maxDict; pL2RCmdPrm -> DSmaxStr = maxStr; return( AT_CMPL ); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_L2R | | ROUTINE : cmhL2R_Activate | +-------------------------------------------------------------------+ PURPOSE : set all nescessary parameters and activate L2R */ GLOBAL T_ACI_RETURN cmhL2R_Activate ( T_ACI_CMD_SRC srcId, T_ACI_AT_CMD cmdId, SHORT cId ) { T_L2R_CMD_PRM * pL2RCmdPrm; /* points to L2R command parameters */ T_L2R_SET_PRM * pL2RSetPrm; /* points to L2R parameter set */ TRACE_FUNCTION ("cmhL2R_Activate()"); /* *------------------------------------------------------------------- * check command source *------------------------------------------------------------------- */ if(!cmh_IsVldCmdSrc (srcId)) return( AT_FAIL ); pL2RCmdPrm = &fnd_cmhPrm[srcId].l2rCmdPrm; pL2RSetPrm = &l2rShrdPrm.set_prm[srcId]; /* *------------------------------------------------------------------- * fill in activate parameters *------------------------------------------------------------------- */ pL2RSetPrm -> k_ms_iwf = pL2RCmdPrm -> CRLPmws; pL2RSetPrm -> k_iwf_ms = pL2RCmdPrm -> CRLPiws; pL2RSetPrm -> t1 = (UBYTE)pL2RCmdPrm -> CRLPt1; pL2RSetPrm -> n2 = (UBYTE)pL2RCmdPrm -> CRLPn2; pL2RSetPrm -> p0 = cmhL2R_SelCompDir( pL2RCmdPrm ); pL2RSetPrm -> p1 = (USHORT)pL2RCmdPrm -> DSmaxDict; pL2RSetPrm -> p2 = (UBYTE)pL2RCmdPrm -> DSmaxStr; pL2RSetPrm -> uil2p = L2R_ISO6429; pL2RSetPrm -> rate = cmhL2R_SelChnRate(); l2rEntStat.curCmd = cmdId; l2rEntStat.entOwn = srcId; if( psaL2R_Activate((UBYTE)srcId ) < 0 ) /* activate L2R */ { TRACE_EVENT( "FATAL RETURN psaL2R in cmhL2R_Activate" ); return( AT_FAIL ); } return( AT_EXCT ); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_L2R | | ROUTINE : cmhL2R_Deactivate | +-------------------------------------------------------------------+ PURPOSE : set all nescessary parameters and deactivate L2R */ GLOBAL T_ACI_RETURN cmhL2R_Deactivate ( void ) { UBYTE src_id = raShrdPrm.owner; UBYTE dti_id; T_DTI_CNTRL info; TRACE_FUNCTION ("cmhL2R_Deactivate()"); if (dti_cntrl_get_info_from_src_id( src_id, &info) EQ FALSE) { TRACE_EVENT_P1("cannot find info for src_id=%d", src_id); if( psaL2R_Deactivate() < 0 ) /* deactivate L2R */ { TRACE_EVENT( "FATAL RETURN psaL2R in cmhL2R_Deactivate" ); return( AT_FAIL ); } return( AT_EXCT ); } #if defined (FF_TCP_IP) if( dti_cntrl_is_dti_channel_connected(DTI_ENTITY_AAA, info.dti_id) EQ TRUE ) { if ( dti_cntrl_close_dpath_from_src_id(src_id) EQ TRUE ) { return( AT_EXCT ); } else { TRACE_EVENT("FATAL RETURN in dti_cntrl_close_dpath_from_src_id"); return( AT_FAIL ); } } #endif /* FF_TCP_IP */ dti_id = info.dti_id; /* get the redirection of this src_id */ if (info.redirect_info.info.direction EQ DTI_DEV_IS_REDIRECTED) { T_DTI_CNTRL tmp_param; if (BITFIELD_CHECK(info.redirect_info.info.capability, DTI_CPBLTY_SER)) { dti_cntrl_get_first_redirection (info.src_id, DTI_CPBLTY_SER, &tmp_param); src_id = tmp_param.src_id; dti_id = tmp_param.dti_id; } else if (BITFIELD_CHECK(info.redirect_info.info.capability, DTI_CPBLTY_PKT)) { dti_cntrl_get_first_redirection (info.src_id, DTI_CPBLTY_PKT, &tmp_param); src_id = tmp_param.src_id; dti_id = tmp_param.dti_id; } else { TRACE_EVENT("capability is not SER or PKT"); } } if( dti_cntrl_is_dti_channel_connected(DTI_ENTITY_L2R, dti_id) EQ TRUE AND dti_cntrl_is_dti_channel_connected(DTI_ENTITY_UART, dti_id) EQ TRUE) { /*no internal dti_id */ T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_ACI}; if (dti_cntrl_est_dpath_indirect ( src_id, entity_list, 1, SPLIT, atiUART_dti_cb, DTI_CPBLTY_CMD, DTI_CID_NOTPRESENT) EQ TRUE) { return( AT_EXCT ); } else { /* deactivate */ if( psaL2R_Deactivate() < 0 ) /* deactivate L2R */ { TRACE_EVENT( "FATAL RETURN psaL2R in cmhL2R_Deactivate" ); return( AT_FAIL ); } } } #ifdef FF_PSI if (dti_cntrl_is_dti_channel_connected(DTI_ENTITY_L2R, dti_id) AND dti_cntrl_is_dti_channel_connected(DTI_ENTITY_PSI, dti_id)) { T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_ACI}; if (dti_cntrl_est_dpath_indirect ( src_id, entity_list, 1, SPLIT, atiPSI_dti_cb, DTI_CPBLTY_CMD, DTI_CID_NOTPRESENT) EQ TRUE) { return( AT_EXCT ); } else { /* deactivate */ if( psaL2R_Deactivate() < 0 ) /* deactivate L2R */ { TRACE_EVENT( "FATAL RETURN psaL2R in cmhL2R_Deactivate" ); return( AT_FAIL ); } } } #endif /*FF_PSI*/ else { if( psaL2R_Deactivate() < 0 ) /* deactivate L2R */ { TRACE_EVENT( "FATAL RETURN psaL2R in cmhL2R_Deactivate" ); return( AT_FAIL ); } } return( AT_EXCT ); } /* +-------------------------------------------------------------------+ | PROJECT : GSM-PS (6147) MODULE : CMH_L2R | | ROUTINE : cmhTRA_Deactivate | +-------------------------------------------------------------------+ PURPOSE : set all nescessary parameters and deactivate TRA */ GLOBAL T_ACI_RETURN cmhTRA_Deactivate ( void ) { UBYTE src_id = raShrdPrm.owner; UBYTE dti_id; T_DTI_CNTRL info; TRACE_FUNCTION ("cmhTRA_Deactivate()"); if (dti_cntrl_get_info_from_src_id( src_id, &info) EQ FALSE) { TRACE_EVENT_P1("cannot find info for src_id=%d", src_id); psaTRA_Deactivate(); /* deactivate TRA */ return( AT_EXCT ); } dti_id = info.dti_id; /* get the redirection of this src_id */ if (info.redirect_info.info.direction EQ DTI_DEV_IS_REDIRECTED) { T_DTI_CNTRL tmp_param; if (BITFIELD_CHECK(info.redirect_info.info.capability, DTI_CPBLTY_SER)) { dti_cntrl_get_first_redirection (info.src_id, DTI_CPBLTY_SER, &tmp_param); src_id = tmp_param.src_id; dti_id = tmp_param.dti_id; } else if (BITFIELD_CHECK(info.redirect_info.info.capability, DTI_CPBLTY_PKT)) { dti_cntrl_get_first_redirection (info.src_id, DTI_CPBLTY_PKT, &tmp_param); src_id = tmp_param.src_id; dti_id = tmp_param.dti_id; } else { TRACE_EVENT("capability is not SER or PKT"); } } if (dti_cntrl_is_dti_channel_connected(DTI_ENTITY_TRA, dti_id) AND dti_cntrl_is_dti_channel_connected(DTI_ENTITY_UART, dti_id)) { T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_ACI}; if (dti_cntrl_est_dpath_indirect ( src_id, entity_list, 1, SPLIT, atiUART_dti_cb, DTI_CPBLTY_CMD, DTI_CID_NOTPRESENT) EQ TRUE) { return( AT_EXCT ); } else { /* deactivate */ psaTRA_Deactivate(); /* deactivate TRA */ } } #ifdef FF_PSI if (dti_cntrl_is_dti_channel_connected(DTI_ENTITY_TRA, dti_id) AND dti_cntrl_is_dti_channel_connected(DTI_ENTITY_PSI, dti_id)) { T_DTI_ENTITY_ID entity_list[] = {DTI_ENTITY_ACI}; if (dti_cntrl_est_dpath_indirect ( src_id, entity_list, 1, SPLIT, atiPSI_dti_cb, DTI_CPBLTY_CMD, DTI_CID_NOTPRESENT) EQ TRUE) { return( AT_EXCT ); } else { /* deactivate */ psaTRA_Deactivate(); /* deactivate TRA */ } } #endif /*FF_PSI*/ else { psaTRA_Deactivate(); /* deactivate TRA */ } return( AT_EXCT ); } #endif /* DTI */ /*==== EOF ========================================================*/