Home | History | Annotate | Download | only in mifare
      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