/* * Copyright (C) 2015 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * Smart Card Completion Routing component */ #include #include #include #include #include /******************************************************************************* ** ** Function phFriNfc_SmtCrdFmt_HCrHandler ** ** Description This function is called to complete Completion Routine when gets error. ** ** Returns none. ** *******************************************************************************/ void phFriNfc_SmtCrdFmt_HCrHandler(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, NFCSTATUS Status) { /* set the state back to the Reset_Init state*/ NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; /* set the completion routine*/ NdefSmtCrdFmt->CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR_FORMAT]. CompletionRoutine(NdefSmtCrdFmt->CompletionRoutine->Context, Status); return; } /******************************************************************************* ** ** Function phFriNfc_NdefSmtCrd_Reset ** ** Description Resets the component instance to the initial state and initializes the ** internal variables. ** This function has to be called at the beginning, after creating an instance of ** phFriNfc_sNdefSmtCrdFmt_t. Use this function to reset the instance and/or to switch ** to a different underlying card types. ** ** Returns NFCSTATUS_SUCCESS if operation successful. ** NFCSTATUS_INVALID_PARAMETER if at least one parameter of the function is invalid. ** *******************************************************************************/ NFCSTATUS phFriNfc_NdefSmtCrd_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, void *LowerDevice, phHal_sRemoteDevInformation_t *psRemoteDevInfo, uint8_t *SendRecvBuffer, uint16_t *SendRecvBuffLen) { NFCSTATUS result = NFCSTATUS_SUCCESS; uint8_t index; if ( (SendRecvBuffLen == NULL) || (NdefSmtCrdFmt == NULL) || (psRemoteDevInfo == NULL) || (SendRecvBuffer == NULL) || (LowerDevice == NULL) || (*SendRecvBuffLen == 0) || (*SendRecvBuffLen < PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE) ) { result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER); } else { /* Initialize the state to Init */ NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; for(index = 0;indexCompletionRoutine[index].CompletionRoutine = NULL; /* Initialize the NdefMap Completion Routine context to Null */ NdefSmtCrdFmt->CompletionRoutine[index].Context = NULL; } /* Lower Device(Always Overlapped HAL Struct initialized in application * is registered in NdefMap Lower Device) */ NdefSmtCrdFmt->pTransceiveInfo = LowerDevice; /* Remote Device info received from Manual Device Discovery is registered here */ NdefSmtCrdFmt->psRemoteDevInfo = psRemoteDevInfo; /* Trx Buffer registered */ NdefSmtCrdFmt->SendRecvBuf = SendRecvBuffer; /* Trx Buffer Size */ NdefSmtCrdFmt->SendRecvLength = SendRecvBuffLen; /* Register Transfer Buffer Length */ NdefSmtCrdFmt->SendLength = 0; /* Initialize the Format status flag*/ NdefSmtCrdFmt->FmtProcStatus = 0; /* Reset the Card Type */ NdefSmtCrdFmt->CardType = 0; /* Reset MapCompletion Info*/ NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = NULL; NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NULL; /* Reset Mifare Standard Container elements*/ phFriNfc_MfStd_Reset(NdefSmtCrdFmt); } return (result); } /******************************************************************************* ** ** Function phFriNfc_NdefSmtCrd_SetCR ** ** Description This function allows the caller to set a Completion Routine (notifier). ** ** Returns NFCSTATUS_SUCCESS if operation successful. ** NFCSTATUS_INVALID_PARAMETER if at least one parameter of the function is invalid. ** *******************************************************************************/ NFCSTATUS phFriNfc_NdefSmtCrd_SetCR(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, uint8_t FunctionID, pphFriNfc_Cr_t CompletionRoutine, void *CompletionRoutineContext) { NFCSTATUS status = NFCSTATUS_SUCCESS; if ((NdefSmtCrdFmt == NULL) || (FunctionID >= PH_FRINFC_SMTCRDFMT_CR) || (CompletionRoutine == NULL) || (CompletionRoutineContext == NULL)) { status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER); } else { /* Register the application callback with the NdefMap Completion Routine */ NdefSmtCrdFmt->CompletionRoutine[FunctionID].CompletionRoutine = CompletionRoutine; /* Register the application context with the NdefMap Completion Routine context */ NdefSmtCrdFmt->CompletionRoutine[FunctionID].Context = CompletionRoutineContext; } return status; } /******************************************************************************* ** ** Function phFriNfc_NdefSmtCrd_Process ** ** Description This function is called by the lower layer (OVR HAL) ** when an I/O operation has finished. The internal state machine decides ** whether to call into the lower device again or to complete the process ** by calling into the upper layer's completion routine, stored within this ** component's context (phFriNfc_sNdefSmtCrdFmt_t). ** ** Returns none. ** *******************************************************************************/ void phFriNfc_NdefSmtCrd_Process(void *Context, NFCSTATUS Status) { if ( Context != NULL ) { phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context; switch ( NdefSmtCrdFmt->psRemoteDevInfo->RemDevType ) { case phNfc_eMifare_PICC : case phNfc_eISO14443_3A_PICC: if((NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD) || (NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD) || (NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_2K_CRD)) { /* Remote device is Mifare Standard card */ phFriNfc_MfStd_Process(NdefSmtCrdFmt,Status); } else { Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_REMOTE_DEVICE); } break; default : /* Remote device opmode not recognized. * Probably not NDEF compliant */ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_REMOTE_DEVICE); /* set the state back to the Reset_Init state*/ NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; /* set the completion routine*/ NdefSmtCrdFmt->CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR_INVALID_OPE]. CompletionRoutine(NdefSmtCrdFmt->CompletionRoutine->Context, Status); break; } } else { Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\ NFCSTATUS_INVALID_PARAMETER); /* The control should not come here. As Context itself is NULL , * Can't call the CR */ } return; }