/** * Check for target presence. * Checks given target is present in RF filed or not */ NFCSTATUS phLibNfc_RemoteDev_CheckPresence( phLibNfc_Handle hTargetDev, pphLibNfc_RspCb_t pPresenceChk_RspCb, void* pRspCbCtx ) { NFCSTATUS RetVal = NFCSTATUS_FAILED; phHal_sRemoteDevInformation_t *ps_rem_dev_info = NULL; /* Check for valid sate */ if((NULL == gpphLibContext) || (gpphLibContext->LibNfcState.cur_state == eLibNfcHalStateShutdown)) { RetVal = NFCSTATUS_NOT_INITIALISED; } /* Check for valid parameters*/ else if((NULL == pRspCbCtx) || (NULL == pPresenceChk_RspCb) || (hTargetDev == 0) ) { RetVal= NFCSTATUS_INVALID_PARAMETER; } /* Check for DeInit call*/ else if(gpphLibContext->LibNfcState.next_state == eLibNfcHalStateShutdown) { RetVal = NFCSTATUS_SHUTDOWN; } /* Check target is connected or not */ else if( gpphLibContext->Connected_handle == 0) { RetVal = NFCSTATUS_TARGET_NOT_CONNECTED; } /* Check given handle is valid or not*/ else if(hTargetDev != gpphLibContext->Connected_handle) { RetVal = NFCSTATUS_INVALID_HANDLE; } #ifdef LLCP_TRANSACT_CHANGES else if ((LLCP_STATE_RESET_INIT != gpphLibContext->llcp_cntx.sLlcpContext.state) && (LLCP_STATE_CHECKED != gpphLibContext->llcp_cntx.sLlcpContext.state)) { RetVal= NFCSTATUS_BUSY; } #endif /* #ifdef LLCP_TRANSACT_CHANGES */ else { ps_rem_dev_info = (phHal_sRemoteDevInformation_t *) gpphLibContext->Connected_handle; if((phHal_eMifare_PICC == ps_rem_dev_info->RemDevType) &&(0 != ps_rem_dev_info->RemoteDevInfo.Iso14443A_Info.Sak) &&(TRUE == gpphLibContext->LastTrancvSuccess)) { /* Call HAL4 API */ RetVal = phHal4Nfc_Transceive( gpphLibContext->psHwReference, gpphLibContext->psBufferedAuth, (phHal_sRemoteDevInformation_t *) gpphLibContext->Connected_handle, (pphHal4Nfc_TransceiveCallback_t ) phLibNfc_ChkPresence_Trcv_Cb, (void *)gpphLibContext ); } else { /* Call lower layer PresenceCheck function */ RetVal = phHal4Nfc_PresenceCheck(gpphLibContext->psHwReference, phLibNfc_RemoteDev_CheckPresence_Cb, (void *)gpphLibContext); } if( NFCSTATUS_PENDING == PHNFCSTATUS(RetVal)) { gpphLibContext->CBInfo.pClientPresChkCb = pPresenceChk_RspCb; gpphLibContext->CBInfo.pClientPresChkCntx = pRspCbCtx; /* Mark General callback pending status as TRUE*/ gpphLibContext->status.GenCb_pending_status = TRUE; /* Update the state machine*/ gpphLibContext->LibNfcState.next_state = eLibNfcHalStatePresenceChk; } else /* If return value is internal error(other than pending ) return NFCSTATUS_FAILED*/ { RetVal = NFCSTATUS_FAILED; } } return RetVal; }
NFCSTATUS phFriNfc_OvrHal_Transceive(phFriNfc_OvrHal_t *OvrHal, phFriNfc_CplRt_t *CompletionInfo, phHal_sRemoteDevInformation_t *RemoteDevInfo, phHal_uCmdList_t Cmd, phHal_sDepAdditionalInfo_t *DepAdditionalInfo, uint8_t *SendBuf, uint16_t SendLength, uint8_t *RecvBuf, uint16_t *RecvLength) { NFCSTATUS status = NFCSTATUS_PENDING; uint8_t i = 0; uint32_t length = SendLength; /* To remove "warning (VS C4100) : unreferenced formal parameter" */ PHNFC_UNUSED_VARIABLE(DepAdditionalInfo); /* Check the Input Parameters */ if ((NULL == OvrHal) || (NULL == CompletionInfo) || (NULL == RemoteDevInfo) || (NULL == (void*)SendBuf) || (NULL == RecvBuf) || (NULL == RecvLength) || ((phHal_eJewel_PICC != RemoteDevInfo->RemDevType) && (0 == SendLength))) { status = PHNFCSTVAL(CID_FRI_NFC_OVR_HAL, NFCSTATUS_INVALID_PARAMETER); } else { /* 16 is the maximum data, that can be sent to the mifare standard */ static uint8_t mif_send_buf[MAX_MIF_PACKET_LEN] = {0}; /* Populate the Transfer info structure */ OvrHal->TranceiveInfo.cmd = Cmd; /* Populate the Send Buffer Info */ if((phHal_eMifare_PICC == RemoteDevInfo->RemDevType) || (phHal_eISO14443_3A_PICC == RemoteDevInfo->RemDevType)) { OvrHal->TranceiveInfo.addr = SendBuf[i++]; length = (SendLength - i); if ((phHal_eMifareAuthentA == Cmd.MfCmd) || (phHal_eMifareAuthentB == Cmd.MfCmd)) { uint8_t uid_index = 0; /* Authentication requires UID in the send buffer */ uint8_t uid_len = RemoteDevInfo->RemoteDevInfo.Iso14443A_Info.UidLength; OvrHal->TranceiveInfo.sSendData.buffer = mif_send_buf; switch (uid_len) { case MIFARE_PLUS_UID_LENGTH: { uid_index = MIFARE_PLUS_UID_INDEX_TO_COPY; uid_len = MIFARE_UID_LEN_TO_COPY; break; } case MIFARE_CLASSIC_UID_LENGTH: { uid_index = 0; break; } default: { status = PHNFCSTVAL (CID_FRI_NFC_OVR_HAL, NFCSTATUS_READ_FAILED); break; } } if (NFCSTATUS_PENDING == status) { /* copy uid to the send buffer for the authentication */ (void)memcpy ((void *)mif_send_buf, (void *)&RemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Uid[uid_index], uid_len); (void)memcpy((mif_send_buf + uid_len), &(SendBuf[i]), length); length += uid_len; } } else { OvrHal->TranceiveInfo.sSendData.buffer = &SendBuf[i++]; } OvrHal->TranceiveInfo.sSendData.length = length; } else { OvrHal->TranceiveInfo.sSendData.buffer = &SendBuf[i++]; OvrHal->TranceiveInfo.sSendData.length = length; } if (NFCSTATUS_PENDING == status) { /* Populate the Receive buffer */ OvrHal->TranceiveInfo.sRecvData.buffer = RecvBuf; OvrHal->TranceiveInfo.sRecvData.length = *RecvLength; OvrHal->pndef_recv_length = RecvLength; phFriNfc_OvrHal_SetComplInfo(OvrHal,CompletionInfo, PH_FRINFC_OVRHAL_TRX); /* Call the HAL 4.0 Transceive Function */ status = phHal4Nfc_Transceive (OvrHal->psHwReference, &OvrHal->TranceiveInfo, RemoteDevInfo, phFriNfc_OvrHal_CB_Transceive, (void *)OvrHal); } } return status; }