VOS_UINT32 CSIMA_SendTPDUOnBaseChan(CSIMA_CBP_CTPDU_MSG_STRU *pstCtpduMsg) { CSIMA_CBP_RTPDU_MSG_STRU stRtpdu; VOS_UINT32 ulResult; USIMM_TPDU_DATA_STRU stTPDU; VOS_MemSet(&stRtpdu, VOS_NULL, sizeof(stRtpdu)); VOS_MemSet(&stTPDU, VOS_NULL, sizeof(stTPDU)); stRtpdu.enIPCMsgId = CSIMA_CBP_UICC_RTPDU_MSG; /* 参数检查 */ if (g_stCBPCardStatus.ucCSIMChanNum != pstCtpduMsg->ucChanNum) { /* 给CBP回复命令执行错误 */ stRtpdu.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stRtpdu, sizeof(stRtpdu)); return ulResult; } VOS_MemCpy(stTPDU.aucTPDUHead, pstCtpduMsg->aucCTPDUHdr, USIMM_TPDU_HEAD_LEN); stTPDU.ulDataLen = pstCtpduMsg->usDataLen; stTPDU.pucData = pstCtpduMsg->aucData; ulResult = USIMM_SendTPDUReq(WUEPS_PID_CSIMA, VOS_NULL, VOS_NULL_PTR, &stTPDU); if (VOS_OK != ulResult) { /* 给CBP回复命令执行错误 */ stRtpdu.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stRtpdu, sizeof(stRtpdu)); } return ulResult; }
VOS_UINT32 CSIMA_ATResetIndProc(AT_CSIMA_RESET_STATUS_IND_MSG_STRU *pstMsg) { VOS_UINT32 ulResult; /* 收到CBP复位指示后都要透传给CBPCA */ CSIMA_CBPResetInd(pstMsg->enVIAModemStatus); g_bNeedCardStatus = VOS_TRUE; /* 复位成功给CBP上报卡状态 */ if (CBP_MODEM_RESET_SUCC == pstMsg->enVIAModemStatus) { /* 未上报过卡状态的话则等着PIH上报了卡状态后上报 */ if (CSIMA_CBP_CARD_STATUS_BUTT == g_stCBPCardStatus.enStatus) { CSIMA_INFO_LOG("CSIMA_ATResetIndProc: have no card status Ind"); return VOS_OK; } /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&g_stCBPCardStatus, sizeof(g_stCBPCardStatus)); return ulResult; } return VOS_OK; }
VOS_UINT32 CSIMA_CBPEnvelopeSend(CSIMA_CBP_CTPDU_MSG_STRU *pstCtpduMsg) { VOS_UINT32 ulResult; CSIMA_CBP_RTPDU_MSG_STRU stRtpdu; VOS_MemSet(&stRtpdu, VOS_NULL, sizeof(stRtpdu)); stRtpdu.enIPCMsgId = CSIMA_CBP_UICC_RTPDU_MSG; if ((SI_STK_ENVELOPE_EVENTDOWN == pstCtpduMsg->aucData[0]) && (TAF_NVIM_LC_RAT_COMBINED_CL != g_stLCEnableFlag.enRatCombined)) { /* 给CBP回复命令执行成功 */ stRtpdu.usSWStatus = 0x9000; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stRtpdu, sizeof(stRtpdu)); return ulResult; } ulResult = CSIMA_SendTPDUOnBaseChan(pstCtpduMsg); if (USIMM_API_SUCCESS != ulResult) { CSIMA_WARNING_LOG("CSIMA_CBPEnvelopeSend: CSIMA_SendTPDUOnBaseChan is Fail"); } return ulResult; }
函 数 名 : CSIMA_CardStatusMsgSend 功能描述 : CSIMA模块上报卡状态给CBP 输入参数 : enCardStatus:卡状态 enCardType:卡类型 输出参数 : 无 返 回 值 : 无 History : 1.日 期 : 2014年01月16日 作 者 : zhuli 修改内容 : Create *****************************************************************************/ VOS_VOID CSIMA_CardStatusMsgSend(CSIMA_CBP_CARD_STATUS_ENUM_UINT16 enCardStatus, CSIMA_CBP_CARD_TYPE_ENUM_UINT16 enCardType) { VOS_UINT32 ulResult; g_stCBPCardStatus.enStatus = enCardStatus; g_stCBPCardStatus.usCardType = enCardType; if((TAF_NVIM_LC_RAT_COMBINED_CL != g_stLCEnableFlag.enRatCombined) &&(VOS_FALSE == g_bNeedCardStatus)) { CSIMA_ERROR_LOG("CSIMA_CardStatusMsgSend: GUL Mode and No AT Command"); return; } /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&g_stCBPCardStatus, sizeof(g_stCBPCardStatus)); if (VOS_OK != ulResult) { CSIMA_ERROR_LOG("CSIMA_CardStatusMsgSend: Send Msg To CBPCA fail"); } if (CSIMA_CBP_CARD_READY == enCardStatus) { g_enEventListReSendFlag = CSIMA_EVENTLIST_NEED_RESEND; } return; }
VOS_VOID CMMCA_RcvErrcMsg(struct MsgCB *pstMsg) { LRRC_CMMCA_CDMA_MSG_IRAT_MEAS_REQ_STRU *pstIratMeasReq = VOS_NULL_PTR; CMMCA_MMC_RAT_CMD_ID_ENUM_UINT16 enCmdIdFromMsgId; CMMCA_MMC_RAT_CMD_ID_ENUM_UINT16 enCmdIdInData; VOS_UINT32 ulRslt; enCmdIdFromMsgId = ID_CMMCA_RAT_MMC_CMD_MAX; /* ERRC回复给CMMCA的消息pstMsg,其结构体为LRRC_CMMCA_CDMA_MSG_IRAT_MEAS_REQ_STRU */ pstIratMeasReq = (LRRC_CMMCA_CDMA_MSG_IRAT_MEAS_REQ_STRU *)pstMsg; ulRslt = CMMCA_GetCmdIdFromErrcMsgId(pstIratMeasReq->enMsgId, &enCmdIdFromMsgId); if (VOS_OK != ulRslt) { CMMCA_ERROR_LOG("CMMCA_RcvErrcMsg: Not find Cmd Id "); return; } enCmdIdInData = *((CMMCA_MMC_RAT_CMD_ID_ENUM_UINT16 *)(pstIratMeasReq->aucMsgData)); /* 检查根据MsgId计算出来的CmdId跟Errc实际传来的CmdId是否一致 */ if (enCmdIdFromMsgId != enCmdIdInData) { CMMCA_ERROR_LOG("CMMCA_RcvErrcMsg: MsgId and CmdId don't match "); return; } /* 调用CBPCA模块接口将数据发送到CBPCA */ ulRslt = CBPCA_SndDataToCbpca(WUEPS_PID_CMMCA, CMMCA_CBPCA_DATA_REQ, (VOS_UINT8 *)(pstIratMeasReq->aucMsgData), pstIratMeasReq->ulLen); if (VOS_OK != ulRslt) { CMMCA_ERROR_LOG("CMMCA_RcvErrcMsg: send Msg to Cbpca fail"); } return; }
VOS_UINT32 CSIMA_CBP_HandshakeReqMsg(VOS_VOID) { VOS_UINT32 ulRslt; CSIMA_CBP_UICC_MSGID_ENUM_UINT32 enIPCMsgId; enIPCMsgId = CSIMA_CBP_UICC_HANDSHAKE_MSG; /* 调用CBPCA模块接口将数据发过去 */ ulRslt = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&enIPCMsgId, sizeof(enIPCMsgId)); if (VOS_OK != ulRslt) { CSIMA_ERROR_LOG("CSIMA_CBP_HandshakeReqMsg: send Data fail"); } return ulRslt; }
VOS_UINT32 CSIMA_ProactiveIndProc(CSIMA_STK_PROACTIVE_CMD_MSG_STRU *pstMsg) { VOS_UINT32 ulResult; CSIMA_CBP_PROACTIVE_CMD_MSG_STRU stProactiveCmd; VOS_MemSet(&stProactiveCmd, 0, sizeof(stProactiveCmd)); stProactiveCmd.enIPCMsgId = CSIMA_CBP_UICC_PROACTIVE_CMD_MSG; stProactiveCmd.usDataLen = (VOS_UINT16)pstMsg->ulLen; if (0 != stProactiveCmd.usDataLen) { VOS_MemCpy(stProactiveCmd.aucData, pstMsg->aucProactiveCmd, stProactiveCmd.usDataLen); } ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stProactiveCmd, (sizeof(CSIMA_CBP_PROACTIVE_CMD_MSG_STRU) - STK_PROACTIVE_DATA_LEN + stProactiveCmd.usDataLen)); return ulResult; }
VOS_UINT32 CSIMA_UiccResAccRspMsg(PS_USIM_RESTRICTED_ACCESS_CNF_STRU *pstMsg) { VOS_UINT32 ulResult; CSIMA_CBP_RESACC_RSP_MSG_STRU *pstResAccRsp; VOS_UINT32 ulMemLen; VOS_UINT8 ucSW1 = pstMsg->ucSW1; VOS_UINT8 ucSW2 = pstMsg->ucSW2; if (pstMsg->usLen >= CSIMA_CBP_MSG_DATA_RSV) { ulMemLen = sizeof(CSIMA_CBP_RESACC_RSP_MSG_STRU) + pstMsg->usLen - CSIMA_CBP_MSG_DATA_RSV; } else { ulMemLen = sizeof(CSIMA_CBP_RESACC_RSP_MSG_STRU); } pstResAccRsp = (CSIMA_CBP_RESACC_RSP_MSG_STRU *)VOS_MemAlloc(WUEPS_PID_CSIMA, DYNAMIC_MEM_PT, ulMemLen); if (VOS_NULL_PTR == pstResAccRsp) { CSIMA_ERROR_LOG("CSIMA_UiccResAccRspMsg: Alloc mem fail!"); return VOS_ERR; } VOS_MemSet(pstResAccRsp, 0, ulMemLen); pstResAccRsp->enIPCMsgId = CSIMA_CBP_UICC_RESACC_RSP_MSG; if (VOS_OK != pstMsg->ulResult) { pstResAccRsp->usSWStatus = UIM_ERR_TIMEOUT; pstResAccRsp->usDataLen = 0; } else { /* CBP不下发fetch命令,因此当卡回复0x91XX的时候需要转换成0x9000 */ if (0x91 == pstMsg->ucSW1) { ucSW1 = 0x90; ucSW2 = 0; } pstResAccRsp->usSWStatus = ucSW1; pstResAccRsp->usSWStatus = (VOS_UINT16)(pstResAccRsp->usSWStatus << 8) + ucSW2; pstResAccRsp->usDataLen = pstMsg->usLen; if (0 != pstResAccRsp->usDataLen) { VOS_MemCpy(pstResAccRsp->aucData, pstMsg->aucContent, pstMsg->usLen); } } /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)pstResAccRsp, ulMemLen); if (VOS_OK != ulResult) { CSIMA_ERROR_LOG("CSIMA_UiccResAccRspMsg: send RESACC RSP fail"); } VOS_MemFree(WUEPS_PID_CSIMA, pstResAccRsp); return ulResult; }
VOS_UINT32 CSIMA_SendTPDUOnLogicChan(CSIMA_CBP_CTPDU_MSG_STRU *pstCtpduMsg) { VOS_UINT32 ulResult; VOS_UINT32 ulSessionID; CSIMA_CBP_RTPDU_MSG_STRU stRtpdu; VOS_UINT8 ucChanNum; VOS_UINT8 aucAid[USIMM_AID_LEN_MAX]; VOS_UINT8 aucData[256]={0}; VOS_UINT32 ulDataLen; VOS_MemSet(&stRtpdu, 0, sizeof(stRtpdu)); stRtpdu.enIPCMsgId = CSIMA_CBP_UICC_RTPDU_MSG; /* 获取CSIM的AID及通道号 */ ulResult = CSIMA_GetUiccAidAndChanNum(USIMM_AID_TYPE_CSIM, aucAid, &ucChanNum); if (VOS_OK != ulResult) { /* 给CBP回复命令执行错误 */ stRtpdu.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stRtpdu, sizeof(stRtpdu)); return ulResult; } /* 参数检查 */ if (ucChanNum != pstCtpduMsg->ucChanNum) { /* 给CBP回复命令执行错误 */ stRtpdu.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stRtpdu, sizeof(stRtpdu)); return ulResult; } /* 通过通道号获取sessionID */ USIMM_ChanNumToSessionId(pstCtpduMsg->ucChanNum, &ulSessionID); VOS_MemCpy(aucData, pstCtpduMsg->aucCTPDUHdr, USIMM_APDU_HEADLEN); VOS_MemCpy(aucData+USIMM_APDU_HEADLEN, pstCtpduMsg->aucData, pstCtpduMsg->usDataLen); ulDataLen = USIMM_APDU_HEADLEN + pstCtpduMsg->usDataLen; ulResult = USIMM_AccessChannelReq(WUEPS_PID_CSIMA, ulSessionID, ulDataLen, aucData); if (VOS_OK != ulResult) { /* 给CBP回复命令执行错误 */ stRtpdu.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stRtpdu, sizeof(stRtpdu)); } return ulResult; }
VOS_UINT32 CSIMA_UiccResAccReqMsg(CSIMA_CBP_RESACC_REQ_MSG_STRU *pstMsg) { VOS_UINT32 ulResult; TAF_SIM_RESTRIC_ACCESS_STRU stResAcc; CSIMA_CBP_RESACC_RSP_MSG_STRU stResAccRsp; VOS_UINT8 i; VOS_UINT8 *pucFilePath; VOS_MemSet(&stResAccRsp, 0, sizeof(stResAccRsp)); VOS_MemSet(&stResAcc, 0, sizeof(stResAcc)); stResAccRsp.enIPCMsgId = CSIMA_CBP_UICC_RESACC_RSP_MSG; stResAcc.usCmdType = pstMsg->ucCmd; stResAcc.usEfId = pstMsg->usFileId; stResAcc.ucP1 = pstMsg->ucP1; stResAcc.ucP2 = pstMsg->ucP2; stResAcc.ucP3 = pstMsg->ucP3; stResAcc.usCmdLen = pstMsg->ucLen; stResAcc.usPathLen = 0; if (0 != pstMsg->usPathLen % 2) { /* 给CBP回复命令执行错误 */ stResAccRsp.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stResAccRsp, sizeof(stResAccRsp)); return ulResult; } if (0 != pstMsg->ucLen) { VOS_MemCpy(stResAcc.aucCommand, pstMsg->aucData, pstMsg->ucLen); } if (pstMsg->usPathLen > 2) { stResAcc.usPathLen = (pstMsg->usPathLen - 2) /((VOS_UINT16)(sizeof(VOS_UINT16))); /* 减去两字节的文件ID */ } pucFilePath = &(pstMsg->aucData[pstMsg->ucLen]); for (i = 0; i < stResAcc.usPathLen; i++) { stResAcc.ausPath[i] = ((pucFilePath[i*2] << 0x08) & 0xFF00) + pucFilePath[(i*2)+1]; } ulResult = USIMM_RestrictedAccessReq(WUEPS_PID_CSIMA, 0, &stResAcc); if (VOS_OK != ulResult) { /* 给CBP回复命令执行错误 */ stResAccRsp.usSWStatus = UIM_ERR_TIMEOUT; /* 调用CBPCA模块接口将数据发过去 */ ulResult = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)&stResAccRsp, sizeof(stResAccRsp)); } return ulResult; }
VOS_UINT32 CSIMA_UiccRtpduMsg(VOS_UINT32 ulResult, VOS_UINT8 ucSW1, VOS_UINT8 ucSW2, VOS_UINT8 ucDataLen, VOS_UINT8 *pucData) { VOS_UINT32 ulRslt; CSIMA_CBP_RTPDU_MSG_STRU *pstRtpdu; VOS_UINT32 ulMemLen; VOS_UINT8 ucTmpSW1 = ucSW1; VOS_UINT8 ucTmpSW2 = ucSW2; if (ucDataLen >= CSIMA_CBP_MSG_DATA_RSV) { ulMemLen = sizeof(CSIMA_CBP_RTPDU_MSG_STRU) + ucDataLen - CSIMA_CBP_MSG_DATA_RSV; } else { ulMemLen = sizeof(CSIMA_CBP_RTPDU_MSG_STRU); } pstRtpdu = (CSIMA_CBP_RTPDU_MSG_STRU *)VOS_MemAlloc(WUEPS_PID_CSIMA, DYNAMIC_MEM_PT, ulMemLen); if (VOS_NULL_PTR == pstRtpdu) { CSIMA_ERROR_LOG("CSIMA_UiccRtpduMsg: Alloc mem fail!"); return VOS_ERR; } VOS_MemSet(pstRtpdu, 0, ulMemLen); pstRtpdu->enIPCMsgId = CSIMA_CBP_UICC_RTPDU_MSG; if (VOS_OK != ulResult) { pstRtpdu->usSWStatus = UIM_ERR_TIMEOUT; pstRtpdu->usDataLen = 0; } else { /* CBP不下发fetch命令,因此当卡回复0x91XX的时候需要转换成0x9000 */ if (0x91 == ucSW1) { ucTmpSW1 = 0x90; ucTmpSW2 = 0; } pstRtpdu->usSWStatus = ucTmpSW1; pstRtpdu->usSWStatus = (VOS_UINT16)(pstRtpdu->usSWStatus << 8) + ucTmpSW2; pstRtpdu->usDataLen = ucDataLen; if (0 != ucDataLen) { VOS_MemCpy(pstRtpdu->aucData, pucData, ucDataLen); } } /* 调用CBPCA模块接口将数据发过去 */ ulRslt = CBPCA_SndDataToCbpca(WUEPS_PID_CSIMA, CSIMA_CBPCA_DATA_REQ, (VOS_UINT8 *)pstRtpdu, ulMemLen); if (VOS_OK != ulRslt) { CSIMA_ERROR_LOG("CSIMA_UiccRtpduMsg: send RTPDU fail"); } VOS_MemFree(WUEPS_PID_CSIMA, pstRtpdu); if (CSIMA_EVENTLIST_NEED_RESEND == g_enEventListReSendFlag) { g_enEventListReSendFlag = CSIMA_EVENTLIST_RESENT; SI_STK_CbpSetupEventListCmdSnd(); } return ulRslt; }