VOS_VOID MTC_RcvGsmCellInfoInd(VOS_VOID *pMsg) { RRC_MTC_GSM_CELL_INFO_IND_STRU *pstGsmInfoInd = VOS_NULL_PTR; MTC_RRC_GSM_CELL_INFO_IND_STRU *pstGsmCellInfo = VOS_NULL_PTR; VOS_UINT32 ulReceiverPid; /* 如果当前已经关机,则停止发送信息 */ if (MTC_MODEM_POWER_OFF == MTC_GetModemPowerState(MODEM_ID_0)) { return; } /* 判断当前主模状态, 为TDS/LTE时发送 */ if (MTC_RATMODE_TDS == MTC_GetModemRatMode(MODEM_ID_0)) { ulReceiverPid = TPS_PID_RRC; } else if (MTC_RATMODE_LTE== MTC_GetModemRatMode(MODEM_ID_0)) { ulReceiverPid = PS_PID_ERRC; } else { return; } /* 分配消息空间 */ pstGsmCellInfo = (MTC_RRC_GSM_CELL_INFO_IND_STRU *)PS_ALLOC_MSG_WITH_HEADER_LEN( UEPS_PID_MTC, sizeof(MTC_RRC_GSM_CELL_INFO_IND_STRU)); if (VOS_NULL_PTR == pstGsmCellInfo) { MTC_ERROR_LOG("MTC_RcvGsmCellInfoInd: Alloc Msg Fail!"); return; } pstGsmCellInfo->stMsgHeader.ulReceiverPid = ulReceiverPid; pstGsmCellInfo->stMsgHeader.ulMsgName = ID_MTC_RRC_GSM_CELL_INFO_IND; pstGsmInfoInd = (RRC_MTC_GSM_CELL_INFO_IND_STRU *)pMsg; PS_MEM_CPY(&pstGsmCellInfo->stGsmCellInfo, &pstGsmInfoInd->stGsmCellInfo, sizeof(RRC_MTC_GSM_CELL_INFO_STRU)); /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstGsmCellInfo)) { MTC_ERROR_LOG("MTC_RcvGsmCellInfoInd: Snd Msg Err!"); } return; }
VOS_VOID MTC_SndImsaModem1InfoInd(VOS_VOID) { MTC_IMSA_MODEM1_INFO_IND_STRU *pstModem1Info = VOS_NULL_PTR; /* IMSA没有Start则不需要发消息 */ if (MTC_MODEM_POWER_ON != MTC_GetModemImsaState(MODEM_ID_0)) { return; } /* 申请消息包 */ pstModem1Info = (MTC_IMSA_MODEM1_INFO_IND_STRU *)MTC_ALLOC_MSG_WITH_HDR(sizeof(MTC_IMSA_MODEM1_INFO_IND_STRU)); if (VOS_NULL_PTR == pstModem1Info) { MTC_ERROR_LOG("MTC_SndImsaModem1InfoInd: Alloc Msg Fail!"); return; } /* 清空消息内容 */ PS_MEM_SET(MTC_GET_MSG_ENTITY(pstModem1Info), 0x00, MTC_GET_MSG_LENGTH(pstModem1Info)); /* 填充消息头 */ MTC_CFG_IMSA_MSG_HDR(pstModem1Info, ID_MTC_IMSA_MODEM1_INFO_IND); /* 填写Modem1的信息 */ pstModem1Info->enPowerState = MTC_GetModemPowerState(MODEM_ID_1); /* 发送消息 */ MTC_SEND_MSG(pstModem1Info); return; }
VOS_VOID MTC_SndModem0GmmRrcAreaLostInd(VOS_VOID) { VOS_UINT16 ulLenth; MTC_GMM_RRC_AREA_LOST_IND_STRU *pstAreaLostInd = VOS_NULL_PTR; ulLenth = sizeof(MTC_GMM_RRC_AREA_LOST_IND_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstAreaLostInd = (MTC_GMM_RRC_AREA_LOST_IND_STRU*)PS_ALLOC_MSG(UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstAreaLostInd) { MTC_ERROR_LOG("MTC_SndModem0GmmRrcAreaLostInd: Alloc msg fail!"); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstAreaLostInd + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstAreaLostInd->stMsgHeader.ulReceiverPid = I0_WUEPS_PID_GMM; pstAreaLostInd->stMsgHeader.ulMsgName = ID_MTC_GMM_RRC_AREA_LOST_IND; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstAreaLostInd)) { MTC_ERROR1_LOG("MTC_SndModem0GmmRrcAreaLostInd: Snd Msg err. Rec Pid ", I0_UEPS_PID_MTA); return; } return; }
VOS_VOID MTC_SndI1GasRrcTdsLteRfCtrlInd(PS_BOOL_ENUM_UINT8 enUplinkCloseFlag) { MTC_RRC_TDS_LTE_RF_CONTROL_IND_STRU *pstMsg = VOS_NULL_PTR; /* 申请消息 */ pstMsg = (MTC_RRC_TDS_LTE_RF_CONTROL_IND_STRU *)MTC_ALLOC_MSG_WITH_HDR( sizeof(MTC_RRC_TDS_LTE_RF_CONTROL_IND_STRU)); if (VOS_NULL_PTR == pstMsg) { MTC_ERROR_LOG("MTC_SndI1GasRrcTdsLteRfCtrlInd: Alloc msg fail."); return; } /* 清空消息内容 */ PS_MEM_SET(MTC_GET_MSG_ENTITY(pstMsg), 0x00, MTC_GET_MSG_LENGTH(pstMsg)); /* 填写消息头 */ MTC_CFG_I1_GAS_MSG_HDR(pstMsg, ID_MTC_RRC_TDS_LTE_RF_CONTROL_IND); /* 填写消息内容 */ pstMsg->enUplinkCloseFlag = enUplinkCloseFlag; /* 发送消息 */ MTC_SEND_MSG(pstMsg); return; }
VOS_VOID MTC_SndRrcIntrusionBandSetReq( VOS_UINT32 ulRecvPid, RRC_MTC_MS_BAND_INFO_STRU *pstForbiddenBandInfo ) { VOS_UINT16 ulLenth; MODEM_ID_ENUM_UINT16 enModemId; MTC_RRC_INTRUSION_BAND_SET_REQ_STRU *pstBandSetReq = VOS_NULL_PTR; enModemId = VOS_GetModemIDFromPid(ulRecvPid); if (enModemId >= MODEM_ID_BUTT) { return; } /* 如果当前已经关机,则停止发送信息 */ if (MTC_MODEM_POWER_OFF == MTC_GetModemPowerState(enModemId)) { return; } /* 分配消息空间 */ ulLenth = sizeof(MTC_RRC_INTRUSION_BAND_SET_REQ_STRU); pstBandSetReq = (MTC_RRC_INTRUSION_BAND_SET_REQ_STRU *)PS_ALLOC_MSG_WITH_HEADER_LEN( UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstBandSetReq) { MTC_ERROR_LOG("MTC_SndRrcIntrusionActionSetReq: Alloc Msg Fail!"); return; } /* 填充消息 */ pstBandSetReq->stMsgHeader.ulReceiverPid = ulRecvPid; pstBandSetReq->stMsgHeader.ulMsgName = ID_MTC_RRC_INTRUSION_BAND_SET_REQ; PS_MEM_CPY(&pstBandSetReq->stForbiddenBandInfo, pstForbiddenBandInfo, sizeof(RRC_MTC_MS_BAND_INFO_STRU)); /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstBandSetReq)) { MTC_ERROR1_LOG("MTC_SndRrcIntrusionActionSetReq: Snd Msg Err. ReceiverPid: ", ulRecvPid); return; } /* 记录可维可测 */ MTC_DEBUG_IntrusionSendSetBandReq(ulRecvPid); return; }
VOS_VOID MTC_DEBUG_SendBandInfoInd( VOS_UINT8 ucAs, MTC_DEBUG_BAND_ENUM_UINT8 enBand ) { VOS_UINT16 ulLenth; RRC_MTC_INTRUSION_BAND_INFO_IND_STRU *pstBandInfo = VOS_NULL_PTR; VOS_UINT32 ulSendPid; /* 分配消息空间 */ ulLenth = sizeof(RRC_MTC_INTRUSION_BAND_INFO_IND_STRU); pstBandInfo = (RRC_MTC_INTRUSION_BAND_INFO_IND_STRU *)PS_ALLOC_MSG_WITH_HEADER_LEN( UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstBandInfo) { MTC_ERROR_LOG("MTC_DEBUG_SendBandInfoInd: Alloc Msg Fail!"); return; } /* 填充消息 */ pstBandInfo->stMsgHeader.ulReceiverCpuId = VOS_LOCAL_CPUID; pstBandInfo->stMsgHeader.ulSenderCpuId = VOS_LOCAL_CPUID; pstBandInfo->stMsgHeader.ulReceiverPid = UEPS_PID_MTC; pstBandInfo->stMsgHeader.ulMsgName = ID_RRC_MTC_INTRUSION_BAND_INFO_IND; PS_MEM_SET(&pstBandInfo->stCurBandInfo, 0, sizeof(RRC_MTC_MS_BAND_INFO_STRU)); if (1 == ucAs) { ulSendPid = TPS_PID_RRC; } else if(2 == ucAs) { ulSendPid = PS_PID_ERRC; } else { ulSendPid = I1_UEPS_PID_GAS; } pstBandInfo->stMsgHeader.ulSenderPid = ulSendPid; MTC_DEBUG_FillBandInfo(pstBandInfo, enBand); /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(ulSendPid, pstBandInfo)) { MTC_ERROR1_LOG("MTC_DEBUG_SendBandInfoInd: Snd Msg Err. SendPid: ", ulSendPid); return; } return; }
VOS_VOID MTC_InitOperatorCustSolution(VOS_VOID) { SVLTE_SUPPORT_FLAG_STRU stSvlteSupportFlag; TAF_NV_LC_CTRL_PARA_STRU stLcCtrlPara; PS_MEM_SET(&stSvlteSupportFlag, 0x00, sizeof(stSvlteSupportFlag)); PS_MEM_SET(&stLcCtrlPara, 0x00, sizeof(stLcCtrlPara)); /* 读SVLTE特性NV */ if (NV_OK != NV_Read(en_NV_Item_SVLTE_FLAG, &stSvlteSupportFlag, sizeof(SVLTE_SUPPORT_FLAG_STRU))) { MTC_ERROR_LOG("MTC_InitOperatorCustSolution(): en_NV_Item_SVLTE_FLAG error"); stSvlteSupportFlag.ucSvlteSupportFlag = VOS_FALSE; } /* 读LC特性NV */ if (NV_OK != NV_Read(en_NV_Item_LC_Ctrl_PARA, &stLcCtrlPara, sizeof(TAF_NV_LC_CTRL_PARA_STRU))) { MTC_ERROR_LOG("MTC_InitOperatorCustSolution(): en_NV_Item_LC_Ctrl_PARA error"); stLcCtrlPara.ucLCEnableFlg = VOS_FALSE; } if (VOS_TRUE == stSvlteSupportFlag.ucSvlteSupportFlag) { MTC_SetOperatorCustSolution(MTC_OPERATOR_CUST_CMCC_SVLTE); } else if (VOS_TRUE == stLcCtrlPara.ucLCEnableFlg) { MTC_SetOperatorCustSolution(MTC_OPERATOR_CUST_CT_LC); } else { MTC_SetOperatorCustSolution(MTC_OPERATOR_CUST_NONE); } return; }
VOS_VOID MTC_SndRrcRseCfgInd( VOS_UINT32 ulRcvPid, PS_BOOL_ENUM_UINT8 enRseOnFlag ) { MTC_RRC_RSE_CFG_IND_STRU *pstRseCfg = VOS_NULL_PTR; VOS_UINT32 ulLength; ulLength = sizeof(MTC_RRC_RSE_CFG_IND_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstRseCfg = (MTC_RRC_RSE_CFG_IND_STRU *)PS_ALLOC_MSG(UEPS_PID_MTC, ulLength); if (VOS_NULL_PTR == pstRseCfg) { MTC_ERROR_LOG("MTC_SndRrcRseCfgInd: alloc mem fail."); return; } /* 填写消息内容 */ pstRseCfg->stMsgHeader.ulReceiverPid = ulRcvPid; pstRseCfg->stMsgHeader.ulMsgName = ID_MTC_RRC_RSE_CFG_IND; pstRseCfg->enRseOnFlag = enRseOnFlag; pstRseCfg->aucRsv[0] = 0; pstRseCfg->aucRsv[1] = 0; pstRseCfg->aucRsv[2] = 0; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstRseCfg)) { MTC_ERROR_LOG("MTC_SndRrcRseCfgInd: Snd Msg err."); return; } /* 将上报结果保存到上下文中 */ MTC_SetRseCfgValue(enRseOnFlag); return; }
VOS_UINT32 MTC_GetEplmnFromOtherRatInfoInd( MTC_MMA_EPLMN_INFO_STRU *pstEplmnInfo, CMMCA_OTHER_RAT_INFO_IND_STRU *pstOtherRatInfoInd ) { VOS_UINT16 usLoop1; VOS_UINT8 ucLoop2; if (pstOtherRatInfoInd->usEarfcnListSize > CMMCA_MAX_ARFCN_NUM) { MTC_ERROR_LOG("MTC_GetEplmnFromOtherRatInfoInd: usEarfcnListSize too big!"); return VOS_ERR; } pstEplmnInfo->ucEquPlmnNum = 0; for (usLoop1 = 0; usLoop1 < pstOtherRatInfoInd->usEarfcnListSize; usLoop1++) { if (pstOtherRatInfoInd->astOtherRatInfo[usLoop1].ucNumPlmn > CMMCA_MAX_EUTRA_NEIGHBOR_PLMN_NUM) { MTC_ERROR2_LOG("MTC_GetEplmnFromOtherRatInfoInd: ucNumPlmn too big! ", usLoop1, pstOtherRatInfoInd->astOtherRatInfo[usLoop1].ucNumPlmn); return VOS_ERR; } for (ucLoop2 = 0; ucLoop2 < pstOtherRatInfoInd->astOtherRatInfo[usLoop1].ucNumPlmn; ucLoop2++) { MTC_TransCdmaPlmnId(pstOtherRatInfoInd->astOtherRatInfo[usLoop1].aulPlmnId[ucLoop2], &pstEplmnInfo->astEquPlmnAddr[pstEplmnInfo->ucEquPlmnNum]); /* 清除重复PLNM ID */ if (VOS_FALSE == MTC_IsContainPlmnId(&pstEplmnInfo->astEquPlmnAddr[pstEplmnInfo->ucEquPlmnNum], pstEplmnInfo->ucEquPlmnNum, pstEplmnInfo->astEquPlmnAddr)) { pstEplmnInfo->ucEquPlmnNum++; } if (pstEplmnInfo->ucEquPlmnNum >= MTC_MMA_MAX_EQUPLMN_NUM) { return VOS_OK; } } } return VOS_OK; }
VOS_VOID MTC_RcvTafCsSrvInfoInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; TAF_MTC_CS_SERVICE_INFO_IND_STRU *pstCsSrvInfo = VOS_NULL_PTR; MTC_CS_SERVICE_STATE_ENUM_UINT8 enCsSrvStateOld; MTC_CS_SERVICE_STATE_ENUM_UINT8 enCsSrvStateNew; MTC_CFG_ENUM_UINT8 enIntrusionCfg; pstCsSrvInfo = (TAF_MTC_CS_SERVICE_INFO_IND_STRU *)pMsg; ulPid = pstCsSrvInfo->stMsgHeader.ulSenderPid; enIntrusionCfg = MTC_GetIntrusionCfg(); /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaPowerStateInd: Modem ID Err."); return; } /* 先获取原CS域服务状态 */ enCsSrvStateOld = MTC_GetModemCsSrvExistFlg(enModemId); /* 更新modem 信息中CS域业务状态 */ MTC_SetModemCallSrvExistFlg(enModemId, pstCsSrvInfo->ucCallSrvExistFlg); MTC_SetModemSmsSrvExistFlg(enModemId, pstCsSrvInfo->ucSmsSrvExistFlg); MTC_SetModemSsSrvExistFlg(enModemId, pstCsSrvInfo->ucSsSrvExistFlg); /* 在获取当前CS域服务状态 */ enCsSrvStateNew = MTC_GetModemCsSrvExistFlg(enModemId); /* 可维可测信息记录 */ MTC_DEBUG_RcvCsSrvInfoInd(enModemId); /* 如果Modem1的CS域服务状态发生变化,且干扰控制特性开启,则需要触发干扰控制裁决 */ if ( (MODEM_ID_1 == enModemId) && (enCsSrvStateNew != enCsSrvStateOld) && (MTC_CFG_ENABLE == enIntrusionCfg) ) { MTC_ProcIntrusionStrategy(); } return; }
VOS_VOID MTC_SndModem0MtaPsTransferInd( MTC_PS_TRANSFER_CAUSE_ENUM_UINT8 enPsTransferCause ) { VOS_UINT16 ulLenth; MTC_MTA_PS_TRANSFER_IND_STRU *pstPsTransferInd = VOS_NULL_PTR; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); pstPsTransferCtx->enReportCause = enPsTransferCause; ulLenth = sizeof(MTC_MTA_PS_TRANSFER_IND_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstPsTransferInd = (MTC_MTA_PS_TRANSFER_IND_STRU*)PS_ALLOC_MSG(UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstPsTransferInd) { MTC_ERROR_LOG("MTC_SndModem0MtaPsTransferInd: Alloc msg fail!"); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstPsTransferInd + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstPsTransferInd->stMsgHeader.ulReceiverPid = I0_UEPS_PID_MTA; pstPsTransferInd->stMsgHeader.ulMsgName = ID_MTC_MTA_PS_TRANSFER_IND; pstPsTransferInd->ucCause = enPsTransferCause; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstPsTransferInd)) { MTC_ERROR1_LOG("MTC_SndModem0MtaPsTransferInd: Snd Msg err. Rec Pid ", I0_UEPS_PID_MTA); return; } /* 可维可测: 记录上报PS域迁移指示次数 */ MTC_DEBUG_SndPsTransferInd(enPsTransferCause); return; }
VOS_VOID MTC_SndRrcIntrusionActionSetReq( VOS_UINT32 ulRecvPid, PS_BOOL_ENUM_UINT8 enEnableFlag ) { VOS_UINT16 ulLenth; MTC_RRC_INTRUSION_ACTION_SET_REQ_STRU *pstMtcRrcActionReq = VOS_NULL_PTR; ulLenth = sizeof(MTC_RRC_INTRUSION_ACTION_SET_REQ_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstMtcRrcActionReq = (MTC_RRC_INTRUSION_ACTION_SET_REQ_STRU *)PS_ALLOC_MSG( UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstMtcRrcActionReq) { MTC_ERROR_LOG("MTC_SndRrcIntrusionActionSetReq: alloc msg fail."); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstMtcRrcActionReq + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstMtcRrcActionReq->stMsgHeader.ulReceiverPid = ulRecvPid; pstMtcRrcActionReq->stMsgHeader.ulMsgName = ID_MTC_RRC_INTRUSION_ACTION_SET_REQ; pstMtcRrcActionReq->enActionFlag = enEnableFlag; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstMtcRrcActionReq)) { MTC_ERROR1_LOG("MTC_SndRrcIntrusionActionSetReq: Snd Msg err. Rec Pid ", ulRecvPid); return; } MTC_DEBUG_IntrusionSendActionReq(ulRecvPid); return; }
VOS_VOID MTC_RcvMmaRegStatusInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MMA_MTC_REG_STATUS_IND_STRU *pstRegStatusInd = VOS_NULL_PTR; pstRegStatusInd = (MMA_MTC_REG_STATUS_IND_STRU *)pMsg; ulPid = pstRegStatusInd->stMsgHeader.ulSenderPid; /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaRegStatusInd: Modem ID Err."); return ; } /* 更新卡是否有效标识 */ MTC_SetModemUsimValidFlag(enModemId, pstRegStatusInd->ucIsUsimValidFlg); return; }
VOS_VOID MTC_DEBUG_SendOtherRatInfoInd(VOS_VOID) { VOS_UINT16 ulLenth; VOS_UINT8 *pMsg = VOS_NULL_PTR; VOS_UINT8 aucMsg[] = { 0x00, 0x00, 0x00, 0x00, 0xDC, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xDB, 0x00, 0x00, 0x00, 0x36, 0x00, 0x00, 0x00, 0x03, 0x00, 0x00, 0x10, 0x2E, 0x00, 0x00, 0x00, 0x18, 0x09, 0x01, 0x00, 0x16, 0x0D, 0x01, 0x0E, 0x80, 0xFF, 0xFF, 0x35, 0x05, 0x01, 0x2F, 0x00, 0x46, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 }; /* 分配消息空间 */ ulLenth = sizeof(aucMsg); pMsg = (VOS_UINT8 *)PS_ALLOC_MSG_WITH_HEADER_LEN(WUEPS_PID_CBPCA, ulLenth); if (VOS_NULL_PTR == pMsg) { MTC_ERROR_LOG("MTC_DEBUG_SendOtherRatInfoInd: Alloc Msg Fail!"); return; } /* 填充消息 */ PS_MEM_CPY(pMsg, aucMsg, ulLenth); /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(WUEPS_PID_CBPCA, pMsg)) { MTC_ERROR1_LOG("MTC_DEBUG_SendOtherRatInfoInd: Snd Msg Err. SendPid: ", WUEPS_PID_CBPCA); return; } return; }
VOS_VOID MTC_SndIntrusionActionSetReq( MODEM_ID_ENUM_UINT16 enModemId, PS_BOOL_ENUM_UINT8 enEnableFlg ) { if (MODEM_ID_0 == enModemId) { /* 给Modem0的接入层发送消息*/ #if (FEATURE_ON == FEATURE_UE_MODE_TDS) /* 判断当前接入技术是否支持TDS */ if (VOS_TRUE == MTC_IsSupportRatType(MODEM_ID_0, MTC_RATMODE_TDS)) { MTC_SndRrcIntrusionActionSetReq(TPS_PID_RRC, enEnableFlg); } #endif #if (FEATURE_ON == FEATURE_LTE) /* 判断当前接入技术是否支持LTE */ if (VOS_TRUE == MTC_IsSupportRatType(MODEM_ID_0, MTC_RATMODE_LTE)) { MTC_SndRrcIntrusionActionSetReq(PS_PID_ERRC, enEnableFlg); } #endif } else if (MODEM_ID_1 == enModemId) { /* 判断当前接入技术是否支持G模*/ if (VOS_TRUE == MTC_IsSupportRatType(MODEM_ID_1, MTC_RATMODE_GSM)) { /* 给Modem1 GAS发送消息*/ MTC_SndRrcIntrusionActionSetReq(I1_UEPS_PID_GAS, enEnableFlg); } } else { MTC_ERROR_LOG("MTC_SndIntrusionActionSetReq: Modem ID Err."); } return; }
VOS_VOID MTC_SndRcmModemStateInd(VOS_VOID) { MTC_RCM_MODEM_STATE_NOTIFY_STRU *pstModemState; MODEM_ID_ENUM_UINT16 enModemId; /* 申请消息包 */ pstModemState = (MTC_RCM_MODEM_STATE_NOTIFY_STRU *)MTC_ALLOC_MSG_WITH_HDR(sizeof(MTC_RCM_MODEM_STATE_NOTIFY_STRU)); if (VOS_NULL_PTR == pstModemState) { MTC_ERROR_LOG("MTC_SndRcmModemStateInd: Alloc Msg Fail!"); return; } PS_MEM_SET(((VOS_UINT8*)pstModemState) + VOS_MSG_HEAD_LENGTH, 0, sizeof(MTC_RCM_MODEM_STATE_NOTIFY_STRU) - VOS_MSG_HEAD_LENGTH); /* 填充消息头 */ MTC_CFG_RCM_MSG_HDR(&pstModemState->stMsgHeader, ID_MTC_RCM_MODEM_STATUS_NOTIFY); /* 填写modem0和modem1的状态信息 */ for (enModemId = 0; enModemId < MODEM_ID_BUTT ; enModemId++) { pstModemState->astModemState[enModemId].enCsSrvConnState = MTC_GetCsConnStateInfo(enModemId); pstModemState->astModemState[enModemId].enPsSrvConnState = MTC_GetRcmPsConnStateInfo(enModemId); pstModemState->astModemState[enModemId].enModemPowerState = MTC_GetModemPowerState(enModemId); pstModemState->astModemState[enModemId].enUsimmCardState = MTC_GetUsimmStateInfo(enModemId); pstModemState->astModemState[enModemId].enModemType = MTC_RCM_MODEM_0 + enModemId; } /* 填写CDMA状态信息 */ pstModemState->astModemState[MTC_RCM_MODEM_CDMA].enCsSrvConnState = MTC_GetOutSideCsConnStateInfo(MTC_OUTSIDE_MODEM_CDMA); pstModemState->astModemState[MTC_RCM_MODEM_CDMA].enPsSrvConnState = MTC_GetOutSidePsConnStateInfo(MTC_OUTSIDE_MODEM_CDMA); pstModemState->astModemState[MTC_RCM_MODEM_CDMA].enModemPowerState = MTC_GetOutSideModemPowerState(MTC_OUTSIDE_MODEM_CDMA); pstModemState->astModemState[MTC_RCM_MODEM_CDMA].enUsimmCardState = MTC_GetOutSideModemUsimmState(MTC_OUTSIDE_MODEM_CDMA); pstModemState->astModemState[MTC_RCM_MODEM_CDMA].enModemType = MTC_RCM_MODEM_CDMA; /* 发送消息 */ MTC_SEND_MSG(pstModemState); return; }
VOS_VOID MTC_RcvMmaRatModeInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MMA_MTC_RAT_MODE_IND_STRU *pstRatMode = VOS_NULL_PTR; pstRatMode = (MMA_MTC_RAT_MODE_IND_STRU *)pMsg; ulPid = pstRatMode->stMsgHeader.ulSenderPid; /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaRatModeInd: Modem ID Err."); return ; } /* 更新Modem的接入模式 */ MTC_SetModemRatMode(enModemId, pstRatMode->enRatMode); return; }
VOS_VOID MTC_SndRrcNotchChannelInd( VOS_UINT32 ulRecvPid, PS_BOOL_ENUM_UINT8 enEnableFlag ) { VOS_UINT16 ulLenth; MTC_RRC_NOTCH_CHANNEL_IND_STRU *pstNotchChannelInd = VOS_NULL_PTR; ulLenth = sizeof(MTC_RRC_NOTCH_CHANNEL_IND_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstNotchChannelInd = (MTC_RRC_NOTCH_CHANNEL_IND_STRU *)PS_ALLOC_MSG( UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstNotchChannelInd) { MTC_ERROR_LOG("MTC_SndRrcNotchChannelInd: alloc msg fail."); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstNotchChannelInd + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstNotchChannelInd->stMsgHeader.ulReceiverPid = ulRecvPid; pstNotchChannelInd->stMsgHeader.ulMsgName = ID_MTC_RRC_NOTCH_CHANNEL_IND; pstNotchChannelInd->enStartFlag = enEnableFlag; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstNotchChannelInd)) { MTC_ERROR1_LOG("MTC_SndRrcNotchChannelInd: Snd Msg err. Rec Pid ", ulRecvPid); return; } return; }
VOS_VOID MTC_RcvMmaEplmnInfoInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MODEM_ID_ENUM_UINT16 enOtherModemId; MMA_MTC_EPLMN_INFO_IND_STRU *pstEplmnInfo = VOS_NULL_PTR; pstEplmnInfo = (MMA_MTC_EPLMN_INFO_IND_STRU *)pMsg; ulPid = pstEplmnInfo->stMsgHeader.ulSenderPid; /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); enOtherModemId = MODEM_ID_BUTT; if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaEplmnInfoInd: Modem ID Err."); return ; } /* 只有在PS域迁移策略使能时才执行后续流程 */ if (MTC_PS_TRANSFER_NONE == MTC_GetPsTransferCfg()) { return; } /* 只有中移SVLTE方案才需要同步两个Modem的等效PLMN */ if (MTC_OPERATOR_CUST_CMCC_SVLTE == MTC_GetOperatorCustSolution()) { if (VOS_OK == MTC_GetOtherModemId(enModemId, &enOtherModemId)) { MTC_SndMmaOtherModemInfoNotify(enOtherModemId, VOS_NULL_PTR, &pstEplmnInfo->stEplmnInfo); } } return; }
VOS_VOID MTC_SndModem0MmaPsTransferInd( MTC_PS_TRANSFER_CAUSE_ENUM_UINT8 enPsTransferCause ) { VOS_UINT16 ulLenth; MTC_MMA_PS_TRANSFER_IND_STRU *pstPsTransferInd = VOS_NULL_PTR; ulLenth = sizeof(MTC_MMA_PS_TRANSFER_IND_STRU) - VOS_MSG_HEAD_LENGTH; /* 分配消息空间 */ pstPsTransferInd = (MTC_MMA_PS_TRANSFER_IND_STRU*)PS_ALLOC_MSG(UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstPsTransferInd) { MTC_ERROR_LOG("MTC_SndMmaPsTransferInd: Alloc msg fail!"); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstPsTransferInd + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstPsTransferInd->stMsgHeader.ulReceiverPid = I0_WUEPS_PID_MMA; pstPsTransferInd->stMsgHeader.ulMsgName = ID_MTC_MMA_PS_TRANSFER_IND; pstPsTransferInd->enSolutionCfg = MTC_GetPsTransferCfg(); pstPsTransferInd->ucCause = enPsTransferCause; /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstPsTransferInd)) { MTC_ERROR1_LOG("MTC_SndMmaPsTransferInd: Snd Msg err. Rec Pid ", I0_WUEPS_PID_MMA); return; } return; }
VOS_VOID MTC_RcvMmaCurrCampPlmnInfoInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MODEM_ID_ENUM_UINT16 enOtherModemId; MMA_MTC_CURR_CAMP_PLMN_INFO_IND_STRU *pstCurrCampPlmnInfo = VOS_NULL_PTR; MTC_MODEM_NETWORK_INFO_STRU *pstNetworkInfo; MTC_OPERATOR_CUST_SOLUTION_ENUM_UINT8 enOperatorCustSolution; pstCurrCampPlmnInfo = (MMA_MTC_CURR_CAMP_PLMN_INFO_IND_STRU *)pMsg; ulPid = pstCurrCampPlmnInfo->stMsgHeader.ulSenderPid; /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); enOtherModemId = MODEM_ID_BUTT; if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaCurrCampPlmnInfoInd: Modem ID Err."); return ; } /* 保存Modem系统消息中的Modem网络信息 */ pstNetworkInfo = MTC_GetModemNetworkInfoAddr(enModemId); pstNetworkInfo->stPlmnId = pstCurrCampPlmnInfo->stPlmnId; pstNetworkInfo->stPsDomainInfo.ucPsSupportFlg = pstCurrCampPlmnInfo->ucPsSupportFlg; pstNetworkInfo->stPsDomainInfo.ucPsAttachAllowFlg = pstCurrCampPlmnInfo->ucPsAttachAllowFlag; pstNetworkInfo->ucIsForbiddenPlmnFlag = pstCurrCampPlmnInfo->ucIsForbiddenPlmnFlag; MTC_SetModemRatMode(enModemId, pstCurrCampPlmnInfo->enRatMode); /* 获取当前运营商的定制方案 */ enOperatorCustSolution = MTC_GetOperatorCustSolution(); /* 当前仅在SVLTE形态及C+L形态需要通知另一个Modem当前的PLMN ID */ if ( (VOS_OK == MTC_GetOtherModemId(enModemId, &enOtherModemId)) && (MTC_OPERATOR_CUST_NONE != enOperatorCustSolution) ) { /* 通知modem0的mmc modem1的驻留信息,UTRAN 搜网T/W的状态中, 额外判断副卡的PLMN。如果发现中国区的,跳过W的搜索*/ MTC_SndMmaOtherModemInfoNotify(enOtherModemId, &pstCurrCampPlmnInfo->stPlmnId, VOS_NULL_PTR); } /* PS域迁移策略开启时触发流程 */ if (MTC_PS_TRANSFER_NONE == MTC_GetPsTransferCfg()) { return; } /* 处理Modem0发送的驻留plmn消息 */ if (MODEM_ID_0 == enModemId) { switch (enOperatorCustSolution) { case MTC_OPERATOR_CUST_CMCC_SVLTE: MTC_ProcCurrCampPlmnInfoForSvlte(); break; case MTC_OPERATOR_CUST_CT_LC: MTC_ProcCurrCampPlmnInfoForLC(); break; default: break; } } return; }
VOS_VOID MTC_SndMmaNcellInfoInd( MODEM_ID_ENUM_UINT16 enModemId, MTC_MMA_TDS_NCELL_INFO_STRU *pstTddNcellInfo, MTC_MMA_LTE_NCELL_INFO_STRU *pstLteNcellInfo ) { VOS_UINT32 ulLenth; MTC_MMA_NCELL_INFO_IND_STRU *pstNcellInfoInd = VOS_NULL_PTR; VOS_UINT32 ulReceivePid; ulLenth = sizeof(MTC_MMA_NCELL_INFO_IND_STRU) - VOS_MSG_HEAD_LENGTH; if (MODEM_ID_0 == enModemId) { ulReceivePid = I0_WUEPS_PID_MMA; } else if (MODEM_ID_1 == enModemId) { ulReceivePid = I1_WUEPS_PID_MMA; } else { MTC_ERROR_LOG("MTC_SndMmaNcellInfoInd: Error Modem Id!"); return; } /* 分配消息空间 */ pstNcellInfoInd = (MTC_MMA_NCELL_INFO_IND_STRU*)PS_ALLOC_MSG(UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstNcellInfoInd) { MTC_ERROR_LOG("MTC_SndMmaNcellInfoInd: Alloc msg fail!"); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstNcellInfoInd + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstNcellInfoInd->stMsgHeader.ulReceiverPid = ulReceivePid; pstNcellInfoInd->stMsgHeader.ulMsgName = ID_MTC_MMA_NCELL_INFO_IND; if (VOS_NULL_PTR != pstTddNcellInfo) { PS_MEM_CPY(&pstNcellInfoInd->stTdsNcellInfo, pstTddNcellInfo, sizeof(pstNcellInfoInd->stTdsNcellInfo)); } if (VOS_NULL_PTR != pstLteNcellInfo) { PS_MEM_CPY(&pstNcellInfoInd->stLteNcellInfo, pstLteNcellInfo, sizeof(pstNcellInfoInd->stLteNcellInfo)); } /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstNcellInfoInd)) { MTC_ERROR_LOG("MTC_SndMmaNcellInfoInd: Snd Msg err."); return; } return; }
VOS_VOID MTC_SndMmaOtherModemInfoNotify( MODEM_ID_ENUM_UINT16 enModemId, MTC_MMA_PLMN_ID_STRU *pstCurrCampPlmnId, MTC_MMA_EPLMN_INFO_STRU *pstEplmnInfo ) { VOS_UINT32 ulLenth; VOS_UINT32 ulReceivePid; MTC_MMA_OTHER_MODEM_INFO_NOTIFY_STRU *pstOtherModemInfoNotify = VOS_NULL_PTR; ulLenth = sizeof(MTC_MMA_OTHER_MODEM_INFO_NOTIFY_STRU) - VOS_MSG_HEAD_LENGTH; if (MODEM_ID_0 == enModemId) { ulReceivePid = I0_WUEPS_PID_MMA; } else if (MODEM_ID_1 == enModemId) { ulReceivePid = I1_WUEPS_PID_MMA; } else { MTC_ERROR_LOG("MTC_SndMmaOtherModemInfoNotify: Error Modem Id!"); return; } /* 分配消息空间 */ pstOtherModemInfoNotify = (MTC_MMA_OTHER_MODEM_INFO_NOTIFY_STRU*)PS_ALLOC_MSG(UEPS_PID_MTC, ulLenth); if (VOS_NULL_PTR == pstOtherModemInfoNotify) { MTC_ERROR_LOG("MTC_SndMmaOtherModemInfoNotify: Alloc msg fail!"); return; } /* 清消息空间 */ PS_MEM_SET((VOS_UINT8*)pstOtherModemInfoNotify + VOS_MSG_HEAD_LENGTH, 0, ulLenth); /* 填充消息 */ pstOtherModemInfoNotify->stMsgHeader.ulReceiverPid = ulReceivePid; pstOtherModemInfoNotify->stMsgHeader.ulMsgName = ID_MTC_MMA_OTHER_MODEM_INFO_NOTIFY; if (VOS_NULL_PTR != pstCurrCampPlmnId) { pstOtherModemInfoNotify->stCurrCampPlmnId.ulMcc = pstCurrCampPlmnId->ulMcc; pstOtherModemInfoNotify->stCurrCampPlmnId.ulMnc = pstCurrCampPlmnId->ulMnc; pstOtherModemInfoNotify->bitOpCurrCampPlmnId = VOS_TRUE; } if (VOS_NULL_PTR != pstEplmnInfo) { pstOtherModemInfoNotify->bitOpEplmnInfo = VOS_TRUE; pstOtherModemInfoNotify->stEplmnInfo.ucEquPlmnNum = pstEplmnInfo->ucEquPlmnNum; PS_MEM_CPY(pstOtherModemInfoNotify->stEplmnInfo.astEquPlmnAddr, pstEplmnInfo->astEquPlmnAddr, sizeof(pstOtherModemInfoNotify->stEplmnInfo.astEquPlmnAddr)); } /* 发送消息 */ if (VOS_OK != PS_SEND_MSG(UEPS_PID_MTC, pstOtherModemInfoNotify)) { MTC_ERROR1_LOG("MTC_SndMmaOtherModemInfoNotify: Snd Msg err. Rec Pid ", I0_WUEPS_PID_MMA); return; } return; }
VOS_VOID MTC_RcvMmaPowerStateInd(VOS_VOID *pMsg) { VOS_UINT32 ulPid; MODEM_ID_ENUM_UINT16 enModemId; MMA_MTC_POWER_STATE_IND_STRU *pstPowerState = VOS_NULL_PTR; MTC_CFG_ENUM_UINT8 enIntrusionCfg; MTC_CFG_ENUM_UINT8 enNotchCfg; MTC_CFG_ENUM_UINT8 enNarrowDcsCfg; MTC_CFG_ENUM_UINT8 enTlRfCtrlCfg; MTC_MODEM_MIPI_CLK_PRI_STRU stMomdemPri; VOS_UINT16 usMipiClk; MTC_PS_TRANSFER_CTX_STRU *pstPsTransferCtx = VOS_NULL_PTR; pstPsTransferCtx = MTC_GetPsTransferCtxAddr(); pstPowerState = (MMA_MTC_POWER_STATE_IND_STRU *)pMsg; ulPid = pstPowerState->stMsgHeader.ulSenderPid; PS_MEM_SET(&stMomdemPri, 0, sizeof(MTC_MODEM_MIPI_CLK_PRI_STRU)); /* 根据 Pid获取modem ID */ enModemId = VOS_GetModemIDFromPid(ulPid); if (enModemId >= MODEM_ID_BUTT) { MTC_ERROR_LOG("MTC_RcvMmaPowerStateInd: Modem ID Err."); return ; } if (MTC_MODEM_POWER_ON == pstPowerState->enPowerState) { /* 如果是开机消息,给接入层发送启用干扰控制指示 */ if (PS_TRUE == MTC_GetIntrusionActionEnableFlag()) { MTC_SndIntrusionActionSetReq(enModemId, PS_TRUE); } } else { /* 收到关机指示时需要重置Modem信息 */ MTC_ResetModemInfo(enModemId); /* 收到关机状态指示,需要将对应modem的重置RfCellInfo,并重新计算bitmap上报给MTA */ if (MTC_CFG_DISABLE != MTC_GetRfLcdIntrusionCfg()) { MTC_InitRfCellInfo(enModemId); /* 根据各modem当前的业务调整优先级 */ MTC_VerdictModemBitMapPri(&stMomdemPri); /* 筛选最佳位图 */ usMipiClk = MTC_ProcLcdMipiClkBitMap(&stMomdemPri); /* 上报LCD MipiClk位图给MTA */ MTC_SndMtaMipiClkInfoInd(usMipiClk); } /* 关机时重置PSTRANSFER的上报状态值 */ if (MODEM_ID_0 == enModemId) { pstPsTransferCtx->enReportCause = MTC_PS_TRANSFER_CAUSE_BUTT; pstPsTransferCtx->enRrcCause = MTC_PS_TRANSFER_CAUSE_BUTT; } } /* 更新本地开关机状态 */ MTC_SetModemPowerState(enModemId, pstPowerState->enPowerState); /* 判断干扰控制是否使能 */ enIntrusionCfg = MTC_GetIntrusionCfg(); if (MTC_CFG_ENABLE == enIntrusionCfg) { /* 干扰控制使能,调用对应Modem的开关机状态变化处理函数 */ MTC_IntrusionModemPowerStateChange(enModemId, pstPowerState->enPowerState); } /* 将当前MTC上下文上报到SDT */ MTC_DEBUG_TraceCtxInfo(); /* 判断Notch裁决是否使能 */ enNotchCfg = MTC_GetNotchCfg(); if (MTC_CFG_ENABLE == enNotchCfg) { /* Notch裁决功能使能,执行Notch裁决 */ MTC_ProcNotchStrategy(); } /* 判断Narrow band dcs裁决是否使能 */ enNarrowDcsCfg = MTC_GetNarrowBandDcsCfg(); if (MTC_CFG_ENABLE == enNarrowDcsCfg) { /* 执行Narrow band dcs裁决 */ MTC_ProcNarrowDcsStrategy(); } /* 根据开关机状态控制TL射频的上行发射 */ enTlRfCtrlCfg = MTC_GetTlRfCtrlCfg(); if (MTC_CFG_ENABLE == enTlRfCtrlCfg) { MTC_TlRfCtrlModemPowerStateChange(enModemId, pstPowerState->enPowerState); } MTC_ProcRseStrategy(); /* 可维可测记录开关机状态上报次数 */ MTC_DEBUG_RcvPowerStateInd(enModemId, pstPowerState->enPowerState); return; }