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;
}
示例#5
0
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;
}