1 /* 2 * Copyright (C) 2015 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * Smart Card Completion Routing component 19 */ 20 21 #include <phNfcTypes.h> 22 #include<phFriNfc.h> 23 #include <phFriNfc_SmtCrdFmt.h> 24 #include <phNfcCompId.h> 25 #include <phFriNfc_MifStdFormat.h> 26 27 28 /******************************************************************************* 29 ** 30 ** Function phFriNfc_SmtCrdFmt_HCrHandler 31 ** 32 ** Description This function is called to complete Completion Routine when gets error. 33 ** 34 ** Returns none. 35 ** 36 *******************************************************************************/ 37 void phFriNfc_SmtCrdFmt_HCrHandler(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, NFCSTATUS Status) 38 { 39 /* set the state back to the Reset_Init state*/ 40 NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; 41 42 /* set the completion routine*/ 43 NdefSmtCrdFmt->CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR_FORMAT]. 44 CompletionRoutine(NdefSmtCrdFmt->CompletionRoutine->Context, Status); 45 46 return; 47 } 48 49 /******************************************************************************* 50 ** 51 ** Function phFriNfc_NdefSmtCrd_Reset 52 ** 53 ** Description Resets the component instance to the initial state and initializes the 54 ** internal variables. 55 ** This function has to be called at the beginning, after creating an instance of 56 ** phFriNfc_sNdefSmtCrdFmt_t. Use this function to reset the instance and/or to switch 57 ** to a different underlying card types. 58 ** 59 ** Returns NFCSTATUS_SUCCESS if operation successful. 60 ** NFCSTATUS_INVALID_PARAMETER if at least one parameter of the function is invalid. 61 ** 62 *******************************************************************************/ 63 NFCSTATUS phFriNfc_NdefSmtCrd_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, 64 void *LowerDevice, 65 phHal_sRemoteDevInformation_t *psRemoteDevInfo, 66 uint8_t *SendRecvBuffer, 67 uint16_t *SendRecvBuffLen) 68 { 69 NFCSTATUS result = NFCSTATUS_SUCCESS; 70 uint8_t index; 71 if ( (SendRecvBuffLen == NULL) || (NdefSmtCrdFmt == NULL) || (psRemoteDevInfo == NULL) || 72 (SendRecvBuffer == NULL) || (LowerDevice == NULL) || 73 (*SendRecvBuffLen == 0) || 74 (*SendRecvBuffLen < PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE) ) 75 { 76 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER); 77 } 78 else 79 { 80 /* Initialize the state to Init */ 81 NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; 82 83 for(index = 0;index<PH_FRINFC_SMTCRDFMT_CR;index++) 84 { 85 /* Initialize the NdefMap Completion Routine to Null */ 86 NdefSmtCrdFmt->CompletionRoutine[index].CompletionRoutine = NULL; 87 /* Initialize the NdefMap Completion Routine context to Null */ 88 NdefSmtCrdFmt->CompletionRoutine[index].Context = NULL; 89 } 90 91 /* Lower Device(Always Overlapped HAL Struct initialized in application 92 * is registered in NdefMap Lower Device) 93 */ 94 NdefSmtCrdFmt->pTransceiveInfo = LowerDevice; 95 96 /* Remote Device info received from Manual Device Discovery is registered here */ 97 NdefSmtCrdFmt->psRemoteDevInfo = psRemoteDevInfo; 98 99 /* Trx Buffer registered */ 100 NdefSmtCrdFmt->SendRecvBuf = SendRecvBuffer; 101 102 /* Trx Buffer Size */ 103 NdefSmtCrdFmt->SendRecvLength = SendRecvBuffLen; 104 105 /* Register Transfer Buffer Length */ 106 NdefSmtCrdFmt->SendLength = 0; 107 108 /* Initialize the Format status flag*/ 109 NdefSmtCrdFmt->FmtProcStatus = 0; 110 111 /* Reset the Card Type */ 112 NdefSmtCrdFmt->CardType = 0; 113 114 /* Reset MapCompletion Info*/ 115 NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = NULL; 116 NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NULL; 117 118 /* Reset Mifare Standard Container elements*/ 119 phFriNfc_MfStd_Reset(NdefSmtCrdFmt); 120 } 121 122 return (result); 123 } 124 125 /******************************************************************************* 126 ** 127 ** Function phFriNfc_NdefSmtCrd_SetCR 128 ** 129 ** Description This function allows the caller to set a Completion Routine (notifier). 130 ** 131 ** Returns NFCSTATUS_SUCCESS if operation successful. 132 ** NFCSTATUS_INVALID_PARAMETER if at least one parameter of the function is invalid. 133 ** 134 *******************************************************************************/ 135 NFCSTATUS phFriNfc_NdefSmtCrd_SetCR(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, 136 uint8_t FunctionID, 137 pphFriNfc_Cr_t CompletionRoutine, 138 void *CompletionRoutineContext) 139 { 140 NFCSTATUS status = NFCSTATUS_SUCCESS; 141 if ((NdefSmtCrdFmt == NULL) || (FunctionID >= PH_FRINFC_SMTCRDFMT_CR) || 142 (CompletionRoutine == NULL) || (CompletionRoutineContext == NULL)) 143 { 144 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, NFCSTATUS_INVALID_PARAMETER); 145 } 146 else 147 { 148 /* Register the application callback with the NdefMap Completion Routine */ 149 NdefSmtCrdFmt->CompletionRoutine[FunctionID].CompletionRoutine = CompletionRoutine; 150 151 /* Register the application context with the NdefMap Completion Routine context */ 152 NdefSmtCrdFmt->CompletionRoutine[FunctionID].Context = CompletionRoutineContext; 153 } 154 return status; 155 } 156 157 /******************************************************************************* 158 ** 159 ** Function phFriNfc_NdefSmtCrd_Process 160 ** 161 ** Description This function is called by the lower layer (OVR HAL) 162 ** when an I/O operation has finished. The internal state machine decides 163 ** whether to call into the lower device again or to complete the process 164 ** by calling into the upper layer's completion routine, stored within this 165 ** component's context (phFriNfc_sNdefSmtCrdFmt_t). 166 ** 167 ** Returns none. 168 ** 169 *******************************************************************************/ 170 void phFriNfc_NdefSmtCrd_Process(void *Context, NFCSTATUS Status) 171 { 172 if ( Context != NULL ) 173 { 174 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context; 175 176 switch ( NdefSmtCrdFmt->psRemoteDevInfo->RemDevType ) 177 { 178 case phNfc_eMifare_PICC : 179 case phNfc_eISO14443_3A_PICC: 180 if((NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD) || 181 (NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD) || 182 (NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_2K_CRD)) 183 { 184 /* Remote device is Mifare Standard card */ 185 phFriNfc_MfStd_Process(NdefSmtCrdFmt,Status); 186 187 } 188 else 189 { 190 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 191 NFCSTATUS_INVALID_REMOTE_DEVICE); 192 } 193 break; 194 default : 195 /* Remote device opmode not recognized. 196 * Probably not NDEF compliant 197 */ 198 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, 199 NFCSTATUS_INVALID_REMOTE_DEVICE); 200 /* set the state back to the Reset_Init state*/ 201 NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT; 202 203 /* set the completion routine*/ 204 NdefSmtCrdFmt->CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR_INVALID_OPE]. 205 CompletionRoutine(NdefSmtCrdFmt->CompletionRoutine->Context, Status); 206 break; 207 } 208 } 209 else 210 { 211 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\ 212 NFCSTATUS_INVALID_PARAMETER); 213 /* The control should not come here. As Context itself is NULL , 214 * Can't call the CR 215 */ 216 } 217 218 return; 219 } 220