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 #include <nfc_api.h>
     18 #include <rw_api.h>
     19 #include <phNfcCompId.h>
     20 #include <phNxpLog.h>
     21 #include <phNxpExtns_MifareStd.h>
     22 
     23 phNxpExtns_Context_t       gphNxpExtns_Context;
     24 phNciNfc_TransceiveInfo_t  tNciTranscvInfo;
     25 phFriNfc_sNdefSmtCrdFmt_t  *NdefSmtCrdFmt = NULL;
     26 phFriNfc_NdefMap_t         *NdefMap = NULL;
     27 phLibNfc_NdefInfo_t        NdefInfo;
     28 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
     29 pthread_mutex_t SharedDataMutex = PTHREAD_MUTEX_INITIALIZER;
     30 #endif
     31 UINT8 current_key[6]={0};
     32 phNci_mfc_auth_cmd_t       gAuthCmdBuf;
     33 STATIC NFCSTATUS phNciNfc_SendMfReq(phNciNfc_TransceiveInfo_t tTranscvInfo,
     34                                     uint8_t *buff, uint16_t *buffSz);
     35 STATIC NFCSTATUS phLibNfc_SendRawCmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     36                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     37 STATIC NFCSTATUS phLibNfc_SendWrt16Cmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     38                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     39 STATIC NFCSTATUS phLibNfc_SendAuthCmd(phNfc_sTransceiveInfo_t *pTransceiveInfo,
     40                                       phNciNfc_TransceiveInfo_t  *tNciTranscvInfo) __attribute__((unused));
     41 STATIC NFCSTATUS phLibNfc_MapCmds(phNciNfc_RFDevType_t         RemDevType,
     42                                     phNfc_sTransceiveInfo_t*  pTransceiveInfo,
     43                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     44 STATIC NFCSTATUS phLibNfc_MifareMap(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     45                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     46 STATIC NFCSTATUS phLibNfc_ChkAuthCmdMFC(phNfc_sTransceiveInfo_t* pTransceiveInfo,
     47                                     uint8_t *bKey);
     48 STATIC NFCSTATUS phLibNfc_GetKeyNumberMFC(uint8_t *buffer,uint8_t *bKey);
     49 STATIC void phLibNfc_CalSectorAddress(uint8_t *Sector_Address);
     50 STATIC NFCSTATUS  phNciNfc_MfCreateAuthCmdHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
     51                                     uint8_t    bBlockAddr,
     52                                     uint8_t    *buff,
     53                                     uint16_t    *buffSz);
     54 STATIC NFCSTATUS phNciNfc_MfCreateXchgDataHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
     55                                     uint8_t *buff, uint16_t *buffSz);
     56 STATIC NFCSTATUS phLibNfc_SendWrt16CmdPayload(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
     57                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf);
     58 STATIC NFCSTATUS phNciNfc_RecvMfResp(phNciNfc_Buff_t* RspBuffInfo, NFCSTATUS wStatus);
     59 STATIC NFCSTATUS nativeNfcExtns_doTransceive(uint8_t *buff, uint16_t buffSz);
     60 STATIC NFCSTATUS phFriNfc_NdefSmtCrd_Reset__(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt,
     61                                     uint8_t    *SendRecvBuffer,
     62                                     uint16_t   *SendRecvBuffLen);
     63 STATIC NFCSTATUS phFriNfc_ValidateParams(uint8_t  *PacketData,
     64                                     uint32_t   *PacketDataLength,
     65                                     uint8_t     Offset,
     66                                     phFriNfc_NdefMap_t  *pNdefMap,
     67                                     uint8_t     bNdefReq);
     68 STATIC void Mfc_FormatNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     69 STATIC void Mfc_WriteNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     70 STATIC void Mfc_ReadNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     71 STATIC void Mfc_CheckNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status);
     72 
     73 /*******************************************************************************
     74 **
     75 ** Function         phNxpExtns_MfcModuleDeInit
     76 **
     77 ** Description      It Deinitializes the Mifare module.
     78 **
     79 **                  Frees all the memory occupied by Mifare module
     80 **
     81 ** Returns:
     82 **                  NFCSTATUS_SUCCESS - if successfully deinitialize
     83 **                  NFCSTATUS_FAILED  - otherwise
     84 **
     85 *******************************************************************************/
     86 NFCSTATUS phNxpExtns_MfcModuleDeInit(void)
     87 {
     88     NFCSTATUS status = NFCSTATUS_FAILED;
     89 
     90     if(NdefMap != NULL)
     91     {
     92         if( NdefMap->psRemoteDevInfo != NULL )
     93         {
     94             free(NdefMap->psRemoteDevInfo);
     95             NdefMap->psRemoteDevInfo = NULL;
     96         }
     97         if( NdefMap->SendRecvBuf != NULL )
     98         {
     99             free(NdefMap->SendRecvBuf);
    100             NdefMap->SendRecvBuf = NULL;
    101         }
    102         if( NdefMap->SendRecvLength != NULL )
    103         {
    104             free(NdefMap->SendRecvLength);
    105             NdefMap->SendRecvLength = NULL;
    106         }
    107         if( NdefMap->DataCount != NULL )
    108         {
    109             free(NdefMap->DataCount);
    110             NdefMap->DataCount = NULL;
    111         }
    112         if( NdefMap->pTransceiveInfo != NULL )
    113         {
    114             if( NdefMap->pTransceiveInfo->sSendData.buffer != NULL )
    115             {
    116                 free(NdefMap->pTransceiveInfo->sSendData.buffer);
    117                 NdefMap->pTransceiveInfo->sSendData.buffer = NULL;
    118             }
    119             if( NdefMap->pTransceiveInfo->sRecvData.buffer != NULL )
    120             {
    121                 free(NdefMap->pTransceiveInfo->sRecvData.buffer);
    122                 NdefMap->pTransceiveInfo->sRecvData.buffer = NULL;
    123             }
    124             free(NdefMap->pTransceiveInfo);
    125             NdefMap->pTransceiveInfo = NULL;
    126         }
    127 
    128         free(NdefMap);
    129         NdefMap = NULL;
    130     }
    131 
    132     if( tNciTranscvInfo.tSendData.pBuff != NULL )
    133     {
    134         free(tNciTranscvInfo.tSendData.pBuff);
    135         tNciTranscvInfo.tSendData.pBuff = NULL;
    136     }
    137 
    138     if( NdefSmtCrdFmt != NULL )
    139     {
    140         free(NdefSmtCrdFmt);
    141         NdefSmtCrdFmt = NULL;
    142     }
    143 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    144     pthread_mutex_lock(&SharedDataMutex);
    145 #endif
    146     if ( NULL != NdefInfo.psUpperNdefMsg )
    147     {
    148         if ( NdefInfo.psUpperNdefMsg->buffer != NULL )
    149         {
    150             free(NdefInfo.psUpperNdefMsg->buffer);
    151             NdefInfo.psUpperNdefMsg->buffer = NULL;
    152         }
    153         free(NdefInfo.psUpperNdefMsg);
    154         NdefInfo.psUpperNdefMsg = NULL;
    155     }
    156 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    157     pthread_mutex_unlock(&SharedDataMutex);
    158 #endif
    159     if (NULL != gAuthCmdBuf.pauth_cmd)
    160     {
    161         if (NULL != gAuthCmdBuf.pauth_cmd->buffer)
    162         {
    163             free(gAuthCmdBuf.pauth_cmd->buffer);
    164             gAuthCmdBuf.pauth_cmd->buffer = NULL;
    165         }
    166         free(gAuthCmdBuf.pauth_cmd);
    167         gAuthCmdBuf.pauth_cmd = NULL;
    168     }
    169     status = NFCSTATUS_SUCCESS;
    170     return status;
    171 }
    172 
    173 /*******************************************************************************
    174 **
    175 ** Function         phNxpExtns_MfcModuleInit
    176 **
    177 ** Description      It Initializes the memroy and global variables related
    178 **                  to Mifare module.
    179 **
    180 **                  Reset all the global variables and allocate memory for Mifare module
    181 **
    182 ** Returns:
    183 **                  NFCSTATUS_SUCCESS - if successfully deinitialize
    184 **                  NFCSTATUS_FAILED  - otherwise
    185 **
    186 *******************************************************************************/
    187 NFCSTATUS phNxpExtns_MfcModuleInit(void)
    188 {
    189     NFCSTATUS status = NFCSTATUS_FAILED;
    190     gphNxpExtns_Context.writecmdFlag = FALSE;
    191     gphNxpExtns_Context.RawWriteCallBack = FALSE;
    192     gphNxpExtns_Context.CallBackCtxt   = NULL;
    193     gphNxpExtns_Context.CallBackMifare = NULL;
    194     gphNxpExtns_Context.ExtnsConnect = FALSE;
    195     gphNxpExtns_Context.ExtnsDeactivate = FALSE;
    196     gphNxpExtns_Context.ExtnsCallBack = FALSE;
    197 
    198     NdefMap = malloc(sizeof(phFriNfc_NdefMap_t));
    199     if( NULL == NdefMap )
    200     {
    201         goto clean_and_return;
    202     }
    203     memset(NdefMap,0,sizeof(phFriNfc_NdefMap_t));
    204 
    205     NdefMap->psRemoteDevInfo = malloc(sizeof(phLibNfc_sRemoteDevInformation_t));
    206     if( NULL == NdefMap->psRemoteDevInfo )
    207     {
    208         goto clean_and_return;
    209     }
    210     memset(NdefMap->psRemoteDevInfo, 0, sizeof(phLibNfc_sRemoteDevInformation_t));
    211 
    212     NdefMap->SendRecvBuf = malloc((uint32_t)(MAX_BUFF_SIZE * 2));
    213     if( NULL == NdefMap->SendRecvBuf )
    214     {
    215         goto clean_and_return;
    216     }
    217     memset(NdefMap->SendRecvBuf, 0, (MAX_BUFF_SIZE * 2));
    218 
    219     NdefMap->SendRecvLength  = malloc(sizeof(uint16_t));
    220     if( NULL ==  NdefMap->SendRecvLength )
    221     {
    222         goto clean_and_return;
    223     }
    224     memset(NdefMap->SendRecvLength, 0, sizeof(uint16_t));
    225 
    226     NdefMap->DataCount = malloc(sizeof(uint16_t));
    227     if( NULL == NdefMap->DataCount )
    228     {
    229         goto clean_and_return;
    230     }
    231     memset(NdefMap->DataCount, 0, sizeof(uint16_t));
    232 
    233     NdefMap->pTransceiveInfo = malloc(sizeof(phNfc_sTransceiveInfo_t));
    234     if(NULL == NdefMap->pTransceiveInfo)
    235     {
    236         goto clean_and_return;
    237     }
    238     memset(NdefMap->pTransceiveInfo, 0, sizeof(phNfc_sTransceiveInfo_t));
    239 
    240     tNciTranscvInfo.tSendData.pBuff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
    241     if(NULL == tNciTranscvInfo.tSendData.pBuff)
    242     {
    243         goto clean_and_return;
    244     }
    245     memset(tNciTranscvInfo.tSendData.pBuff, 0, MAX_BUFF_SIZE);
    246 
    247     NdefMap->pTransceiveInfo->sSendData.buffer = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
    248     if( NdefMap->pTransceiveInfo->sSendData.buffer == NULL )
    249     {
    250         goto clean_and_return;
    251     }
    252     memset( NdefMap->pTransceiveInfo->sSendData.buffer, 0, MAX_BUFF_SIZE );
    253     NdefMap->pTransceiveInfo->sSendData.length = MAX_BUFF_SIZE;
    254 
    255     NdefMap->pTransceiveInfo->sRecvData.buffer = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE); /* size should be same as sRecvData */
    256     if( NdefMap->pTransceiveInfo->sRecvData.buffer == NULL )
    257     {
    258         goto clean_and_return;
    259     }
    260     memset( NdefMap->pTransceiveInfo->sRecvData.buffer, 0, MAX_BUFF_SIZE );
    261     NdefMap->pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
    262 
    263     NdefSmtCrdFmt = malloc( sizeof(phFriNfc_sNdefSmtCrdFmt_t) );
    264     if( NdefSmtCrdFmt == NULL )
    265     {
    266         goto clean_and_return;
    267     }
    268     memset( NdefSmtCrdFmt , 0, sizeof(phFriNfc_sNdefSmtCrdFmt_t) );
    269 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    270     pthread_mutex_lock(&SharedDataMutex);
    271 #endif
    272     NdefInfo.psUpperNdefMsg = malloc(sizeof(phNfc_sData_t));
    273     if ( NULL == NdefInfo.psUpperNdefMsg )
    274     {
    275         goto clean_and_return;
    276     }
    277     memset( NdefInfo.psUpperNdefMsg, 0, sizeof(phNfc_sData_t) );
    278     memset (&gAuthCmdBuf, 0, sizeof(phNci_mfc_auth_cmd_t));
    279     gAuthCmdBuf.pauth_cmd = malloc(sizeof(phNfc_sData_t));
    280     if (NULL == gAuthCmdBuf.pauth_cmd)
    281     {
    282         goto clean_and_return;
    283     }
    284     gAuthCmdBuf.pauth_cmd->buffer = malloc((uint32_t)NCI_MAX_DATA_LEN);
    285     if (NULL == gAuthCmdBuf.pauth_cmd->buffer)
    286     {
    287         goto clean_and_return;
    288     }
    289     status = NFCSTATUS_SUCCESS;
    290 
    291 clean_and_return:
    292 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    293     pthread_mutex_unlock(&SharedDataMutex);
    294 #endif
    295     if(status != NFCSTATUS_SUCCESS)
    296     {
    297         NXPLOG_EXTNS_E("CRIT: Memory Allocation failed for MFC!");
    298         phNxpExtns_MfcModuleDeInit();
    299     }
    300     return status;
    301 }
    302 
    303 /*******************************************************************************
    304 **
    305 ** Function         Mfc_CheckNdef
    306 **
    307 ** Description      It triggers NDEF detection for Mifare Classic Tag.
    308 **
    309 **
    310 ** Returns          NFCSTATUS_SUCCESS - if successfully initiated
    311 **                  NFCSTATUS_FAILED  - otherwise
    312 **
    313 *******************************************************************************/
    314 NFCSTATUS Mfc_CheckNdef(void)
    315 {
    316     NFCSTATUS status = NFCSTATUS_FAILED;
    317 
    318     EXTNS_SetCallBackFlag(FALSE);
    319     /* Set Completion Routine for CheckNdef */
    320     NdefMap->CompletionRoutine[0].CompletionRoutine = Mfc_CheckNdef_Completion_Routine;
    321 
    322     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    323     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    324     status = phFriNfc_MifareStdMap_H_Reset(NdefMap);
    325     if ( NFCSTATUS_SUCCESS == status)
    326     {
    327         status = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
    328         if ( status == NFCSTATUS_PENDING )
    329         {
    330             status = NFCSTATUS_SUCCESS;
    331         }
    332     }
    333     if( status != NFCSTATUS_SUCCESS )
    334     {
    335         status = NFCSTATUS_FAILED;
    336     }
    337 
    338     return status;
    339 }
    340 
    341 /*******************************************************************************
    342 **
    343 ** Function         Mfc_CheckNdef_Completion_Routine
    344 **
    345 ** Description      Notify NDEF detection for Mifare Classic Tag to JNI
    346 **
    347 **                  Upon completion of NDEF detection, a
    348 **                  NFA_NDEF_DETECT_EVT will be sent, to notify the application
    349 **                  of the NDEF attributes (NDEF total memory size, current
    350 **                  size, etc.).
    351 **
    352 ** Returns:         void
    353 **
    354 *******************************************************************************/
    355 STATIC void Mfc_CheckNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    356 {
    357     (void)NdefCtxt;
    358     tNFA_CONN_EVT_DATA conn_evt_data;
    359 
    360     conn_evt_data.ndef_detect.status = status;
    361     if(NFCSTATUS_SUCCESS == status)
    362     {
    363         /* NDef Tag Detected */
    364         conn_evt_data.ndef_detect.protocol   = NFA_PROTOCOL_MIFARE;
    365         phFrinfc_MifareClassic_GetContainerSize(NdefMap,
    366                                                 (uint32_t *)&(conn_evt_data.ndef_detect.max_size),
    367                                                 (uint32_t *)&(conn_evt_data.ndef_detect.cur_size));
    368         NdefInfo.NdefLength  = conn_evt_data.ndef_detect.max_size;
    369         /* update local flags */
    370         NdefInfo.is_ndef = 1;
    371         NdefInfo.NdefActualSize = conn_evt_data.ndef_detect.cur_size;
    372         if ( PH_NDEFMAP_CARD_STATE_READ_ONLY == NdefMap->CardState )
    373         {
    374             NXPLOG_EXTNS_D("Mfc_CheckNdef_Completion_Routine : READ_ONLY_CARD");
    375             conn_evt_data.ndef_detect.flags = RW_NDEF_FL_READ_ONLY;
    376         }
    377         else
    378         {
    379             conn_evt_data.ndef_detect.flags = RW_NDEF_FL_SUPPORTED | RW_NDEF_FL_FORMATED;
    380         }
    381     }
    382     else
    383     {
    384         /* NDEF Detection failed for other reasons */
    385         conn_evt_data.ndef_detect.cur_size = 0;
    386         conn_evt_data.ndef_detect.max_size = 0;
    387         conn_evt_data.ndef_detect.flags    = RW_NDEF_FL_UNKNOWN;
    388 
    389         /* update local flags */
    390         NdefInfo.is_ndef = 0;
    391         NdefInfo.NdefActualSize = conn_evt_data.ndef_detect.cur_size;
    392     }
    393     (*gphNxpExtns_Context.p_conn_cback) (NFA_NDEF_DETECT_EVT, &conn_evt_data);
    394 
    395     return;
    396 }
    397 /*******************************************************************************
    398 **
    399 ** Function         Mfc_ReadNdef_Completion_Routine
    400 **
    401 ** Description      Notify NDEF read completion for Mifare Classic Tag to JNI
    402 **
    403 **                  Upon completion of NDEF read, a
    404 **                  NFA_READ_CPLT_EVT will be sent, to notify the application
    405 **                  with the NDEF data and status
    406 **
    407 ** Returns:         void
    408 **
    409 *******************************************************************************/
    410 STATIC void Mfc_ReadNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    411 {
    412     (void)NdefCtxt;
    413     tNFA_CONN_EVT_DATA conn_evt_data;
    414     tNFA_NDEF_EVT_DATA p_data;
    415 
    416     conn_evt_data.status = status;
    417 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    418     pthread_mutex_lock(&SharedDataMutex);
    419 #endif
    420     if(NFCSTATUS_SUCCESS == status)
    421     {
    422         p_data.ndef_data.len    = NdefInfo.psUpperNdefMsg->length;
    423         p_data.ndef_data.p_data = NdefInfo.psUpperNdefMsg->buffer;
    424         (*gphNxpExtns_Context.p_ndef_cback) (NFA_NDEF_DATA_EVT, &p_data);
    425     }
    426     else
    427     {
    428     }
    429 
    430     (*gphNxpExtns_Context.p_conn_cback) (NFA_READ_CPLT_EVT, &conn_evt_data);
    431 
    432     if( NdefInfo.psUpperNdefMsg->buffer != NULL)
    433     {
    434         free (NdefInfo.psUpperNdefMsg->buffer);
    435         NdefInfo.psUpperNdefMsg->buffer = NULL;
    436     }
    437 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    438     pthread_mutex_unlock(&SharedDataMutex);
    439 #endif
    440     return;
    441 }
    442 
    443 /*******************************************************************************
    444 **
    445 ** Function         Mfc_WriteNdef_Completion_Routine
    446 **
    447 ** Description      Notify NDEF write completion for Mifare Classic Tag to JNI
    448 **
    449 **                  Upon completion of NDEF write, a
    450 **                  NFA_WRITE_CPLT_EVT will be sent along with status
    451 **
    452 ** Returns:         void
    453 **
    454 *******************************************************************************/
    455 STATIC void Mfc_WriteNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    456 {
    457     (void)NdefCtxt;
    458     tNFA_CONN_EVT_DATA conn_evt_data;
    459 
    460     conn_evt_data.status = status;
    461     (*gphNxpExtns_Context.p_conn_cback) (NFA_WRITE_CPLT_EVT, &conn_evt_data);
    462 
    463     return;
    464 }
    465 
    466 /*******************************************************************************
    467 **
    468 ** Function         Mfc_FormatNdef_Completion_Routine
    469 **
    470 ** Description      Notify NDEF format completion for Mifare Classic Tag to JNI
    471 **
    472 **                  Upon completion of NDEF format, a
    473 **                  NFA_FORMAT_CPLT_EVT will be sent along with status
    474 **
    475 ** Returns:         void
    476 **
    477 *******************************************************************************/
    478 STATIC void Mfc_FormatNdef_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    479 {
    480     (void)NdefCtxt;
    481     tNFA_CONN_EVT_DATA conn_evt_data;
    482 
    483     conn_evt_data.status = status;
    484     (*gphNxpExtns_Context.p_conn_cback) (NFA_FORMAT_CPLT_EVT, &conn_evt_data);
    485 
    486     return;
    487 }
    488 
    489 /*******************************************************************************
    490 **
    491 ** Function          phFriNfc_ValidateParams
    492 **
    493 ** Description      This function is a common function which validates NdefRd
    494 **                  and NdefWr parameters.
    495 **
    496 ** Returns          NFCSTATUS_SUCCESS  - All the params are valid
    497 **                  NFCSTATUS_FAILED   - otherwise
    498 **
    499 *******************************************************************************/
    500 STATIC NFCSTATUS phFriNfc_ValidateParams(uint8_t             *PacketData,
    501                                     uint32_t            *PacketDataLength,
    502                                     uint8_t             Offset,
    503                                     phFriNfc_NdefMap_t  *pNdefMap,
    504                                     uint8_t             bNdefReq)
    505 {
    506 
    507     if( (pNdefMap == NULL) || (PacketData == NULL)
    508         || (PacketDataLength == NULL) )
    509     {
    510         return NFCSTATUS_FAILED;
    511     }
    512 
    513     if( pNdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID )
    514     {
    515         return NFCSTATUS_FAILED;
    516     }
    517 
    518     if( bNdefReq == PH_FRINFC_NDEF_READ_REQ )
    519     {
    520         if( (Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) )
    521         {
    522             return NFCSTATUS_FAILED;
    523         }
    524         if( pNdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED )
    525         {
    526             pNdefMap->NumOfBytesRead  = PacketDataLength;
    527             *pNdefMap->NumOfBytesRead = 0;
    528             return NFCSTATUS_EOF_NDEF_CONTAINER_REACHED;
    529         }
    530         if( (pNdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) &&
    531             (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) )
    532         {
    533             return NFCSTATUS_FAILED; /* return INVALID_DEVICE_REQUEST */
    534         }
    535         if( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
    536         {
    537             pNdefMap->ApduBuffIndex = 0;
    538             *pNdefMap->DataCount    = 0;
    539         }
    540         else if ( (pNdefMap->bPrevReadMode == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
    541                   (pNdefMap->bPrevReadMode == PH_FRINFC_NDEFMAP_SEEK_CUR) )
    542         {
    543 
    544         }
    545         else
    546         {
    547             return NFCSTATUS_FAILED;
    548         }
    549     }
    550     else if( bNdefReq == PH_FRINFC_NDEF_WRITE_REQ )
    551     {
    552         if( pNdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY )
    553         {
    554             pNdefMap->WrNdefPacketLength  = PacketDataLength;
    555             *pNdefMap->WrNdefPacketLength = 0x00;
    556             return NFCSTATUS_NOT_ALLOWED;
    557         }
    558     }
    559 
    560     return NFCSTATUS_SUCCESS;
    561 }
    562 
    563 /*******************************************************************************
    564 **
    565 ** Function         Mfc_SetRdOnly_Completion_Routine
    566 **
    567 ** Description      Notify NDEF read only completion for Mifare Classic Tag to JNI
    568 **
    569 **                  Upon completion of NDEF format, a
    570 **                  NFA_SET_TAG_RO_EVT will be sent along with status
    571 **
    572 ** Returns:         void
    573 **
    574 *******************************************************************************/
    575 STATIC void Mfc_SetRdOnly_Completion_Routine(void *NdefCtxt, NFCSTATUS status)
    576 {
    577     (void)NdefCtxt;
    578     tNFA_CONN_EVT_DATA conn_evt_data;
    579     ALOGE("Mfc_SetRdOnly_Completion_Routine status = 0x%x", status);
    580     conn_evt_data.status = status;
    581     (*gphNxpExtns_Context.p_conn_cback) (NFA_SET_TAG_RO_EVT, &conn_evt_data);
    582 
    583     return;
    584 }
    585 
    586 /*******************************************************************************
    587 **
    588 ** Function        Mfc_SetReadOnly
    589 **
    590 **
    591 ** Description:    It triggers ConvertToReadOnly  for Mifare Classic Tag.
    592 **
    593 ** Returns:
    594 **                  NFCSTATUS_SUCCESS if successfully initiated
    595 **                  NFCSTATUS_FAILED otherwise
    596 **
    597 *******************************************************************************/
    598 NFCSTATUS Mfc_SetReadOnly(uint8_t *secrtkey, uint8_t len)
    599 {
    600     NXPLOG_EXTNS_D("%s Entering ", __FUNCTION__);
    601     NFCSTATUS status = NFCSTATUS_FAILED;
    602     uint8_t mif_secrete_key[6] = {0};
    603     uint8_t id = 0;
    604     EXTNS_SetCallBackFlag(FALSE);
    605     memcpy(mif_secrete_key,secrtkey,len);
    606     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    607     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    608     for (id = 0; id < len; id++)
    609     {
    610         ALOGD("secrtkey[%d] = 0x%x", id, secrtkey[id]);
    611         ALOGD("mif_secrete_key[%d] = 0x%x", id, mif_secrete_key[id]);
    612     }
    613     /* Set Completion Routine for ReadNdef */
    614     NdefMap->CompletionRoutine[0].CompletionRoutine = Mfc_SetRdOnly_Completion_Routine;
    615     if(NdefInfo.is_ndef == 0)
    616     {
    617         status = NFCSTATUS_NON_NDEF_COMPLIANT;
    618         goto Mfc_SetRdOnly;
    619     }
    620     else if( (NdefInfo.is_ndef == 1) && (NdefInfo.NdefActualSize == 0) )
    621     {
    622 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    623         pthread_mutex_lock(&SharedDataMutex);
    624 #endif
    625         NdefInfo.psUpperNdefMsg->length = NdefInfo.NdefActualSize;
    626 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    627         pthread_mutex_unlock(&SharedDataMutex);
    628 #endif
    629         status = NFCSTATUS_SUCCESS;
    630         goto Mfc_SetRdOnly;
    631     }
    632     else
    633     {
    634         status = phFriNfc_MifareStdMap_ConvertToReadOnly(NdefMap, mif_secrete_key);
    635     }
    636     if ( NFCSTATUS_PENDING == status )
    637     {
    638         status = NFCSTATUS_SUCCESS;
    639     }
    640 
    641 Mfc_SetRdOnly:
    642     return status;
    643 }
    644 
    645 /*******************************************************************************
    646 **
    647 ** Function         Mfc_ReadNdef
    648 **
    649 ** Description      It triggers receiving of the NDEF message from Mifare Classic Tag.
    650 **
    651 **
    652 ** Returns:
    653 **                  NFCSTATUS_SUCCESS - if successfully initiated
    654 **                  NFCSTATUS_FAILED  - otherwise
    655 **
    656 *******************************************************************************/
    657 NFCSTATUS Mfc_ReadNdef(void)
    658 {
    659     NFCSTATUS status = NFCSTATUS_FAILED;
    660     uint8_t            *PacketData = NULL;
    661     uint32_t           *PacketDataLength = NULL;
    662     phLibNfc_Ndef_EOffset_t Offset;
    663 
    664     EXTNS_SetCallBackFlag(FALSE);
    665 
    666     Offset = phLibNfc_Ndef_EBegin;
    667 
    668     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    669     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    670 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    671     pthread_mutex_lock(&SharedDataMutex);
    672 #endif
    673     if(NdefInfo.is_ndef == 0)
    674     {
    675         status = NFCSTATUS_NON_NDEF_COMPLIANT;
    676         goto Mfc_RdNdefEnd;
    677     }
    678     else if( (NdefInfo.is_ndef == 1) && (NdefInfo.NdefActualSize == 0) )
    679     {
    680         NdefInfo.psUpperNdefMsg->length = NdefInfo.NdefActualSize;
    681         status = NFCSTATUS_SUCCESS;
    682         goto Mfc_RdNdefEnd;
    683     }
    684     else
    685     {
    686         NdefInfo.psUpperNdefMsg->buffer = malloc(NdefInfo.NdefActualSize);
    687         if ( NULL == NdefInfo.psUpperNdefMsg->buffer)
    688         {
    689            goto Mfc_RdNdefEnd;
    690         }
    691         NdefInfo.psUpperNdefMsg->length = NdefInfo.NdefActualSize;
    692 
    693         /* Set Completion Routine for ReadNdef */
    694         NdefMap->CompletionRoutine[1].CompletionRoutine = Mfc_ReadNdef_Completion_Routine;
    695         NdefInfo.NdefContinueRead = (uint8_t) ((phLibNfc_Ndef_EBegin==Offset) ?
    696                                                         PH_FRINFC_NDEFMAP_SEEK_BEGIN :
    697                                                         PH_FRINFC_NDEFMAP_SEEK_CUR);
    698     }
    699 
    700     PacketData             = NdefInfo.psUpperNdefMsg->buffer;
    701     PacketDataLength       = (uint32_t*)&(NdefInfo.psUpperNdefMsg->length);
    702     NdefMap->bCurrReadMode = Offset;
    703     status = phFriNfc_ValidateParams (PacketData, PacketDataLength, Offset, NdefMap, PH_FRINFC_NDEF_READ_REQ);
    704     if( status != NFCSTATUS_SUCCESS )
    705     {
    706         goto Mfc_RdNdefEnd;
    707     }
    708 
    709     status = phFriNfc_MifareStdMap_RdNdef(NdefMap, PacketData, PacketDataLength, Offset);
    710 
    711     if(NFCSTATUS_INSUFFICIENT_STORAGE == status)
    712     {
    713         NdefInfo.psUpperNdefMsg->length = 0x00;
    714         status = NFCSTATUS_SUCCESS;
    715     }
    716 
    717     if ( NFCSTATUS_PENDING == status )
    718     {
    719         status = NFCSTATUS_SUCCESS;
    720     }
    721 
    722 Mfc_RdNdefEnd:
    723     if( status != NFCSTATUS_SUCCESS )
    724     {
    725         if ( NULL != NdefInfo.psUpperNdefMsg->buffer )
    726         {
    727             free(NdefInfo.psUpperNdefMsg->buffer);
    728             NdefInfo.psUpperNdefMsg->buffer = NULL;
    729         }
    730         status = NFCSTATUS_FAILED;
    731     }
    732 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    733     pthread_mutex_unlock(&SharedDataMutex);
    734 #endif
    735     return status;
    736 
    737 }
    738 /*******************************************************************************
    739 **
    740 ** Function         Mfc_PresenceCheck
    741 **
    742 ** Description      It triggers receiving of the NDEF message from Mifare Classic Tag.
    743 **
    744 **
    745 ** Returns:
    746 **                  NFCSTATUS_SUCCESS - if successfully initiated
    747 **                  NFCSTATUS_FAILED  - otherwise
    748 **
    749 *******************************************************************************/
    750 NFCSTATUS Mfc_PresenceCheck(void)
    751 {
    752     NFCSTATUS status = NFCSTATUS_SUCCESS;
    753 
    754     if (gAuthCmdBuf.auth_status == TRUE)
    755     {
    756         EXTNS_SetCallBackFlag(FALSE);
    757         status = nativeNfcExtns_doTransceive(gAuthCmdBuf.pauth_cmd->buffer,
    758              gAuthCmdBuf.pauth_cmd->length);
    759         if (status != NFCSTATUS_PENDING)
    760         {
    761             gAuthCmdBuf.auth_sent = FALSE;
    762             status = NFCSTATUS_FAILED;
    763         }
    764         else
    765         {
    766             gAuthCmdBuf.auth_sent = TRUE;
    767             status = NFCSTATUS_SUCCESS;
    768         }
    769     }
    770     else
    771     {
    772         status = NFCSTATUS_NOT_ALLOWED;
    773     }
    774     NXPLOG_EXTNS_D("%s status = 0x%x", __FUNCTION__, status);
    775     return status;
    776 }
    777 /*******************************************************************************
    778 **
    779 ** Function         Mfc_WriteNdef
    780 **
    781 ** Description      It triggers the NDEF data write to Mifare Classic Tag.
    782 **
    783 **
    784 ** Returns:
    785 **                  NFCSTATUS_SUCCESS - if successfully initiated
    786 **                  NFCSTATUS_FAILED  - otherwise
    787 **
    788 *******************************************************************************/
    789 NFCSTATUS Mfc_WriteNdef(uint8_t *p_data, uint32_t len)
    790 {
    791     NFCSTATUS status = NFCSTATUS_SUCCESS;
    792     uint8_t            *PacketData = NULL;
    793     uint32_t           *PacketDataLength = NULL;
    794 
    795     if( p_data == NULL || len == 0 )
    796     {
    797         NXPLOG_EXTNS_E("MFC Error: Invalid Parameters to Ndef Write");
    798         status = NFCSTATUS_FAILED;
    799         goto Mfc_WrNdefEnd;
    800     }
    801 
    802     EXTNS_SetCallBackFlag(FALSE);
    803     gphNxpExtns_Context.CallBackMifare = phFriNfc_MifareStdMap_Process;
    804     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
    805 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    806     pthread_mutex_lock(&SharedDataMutex);
    807 #endif
    808     if( NdefInfo.is_ndef == PH_LIBNFC_INTERNAL_CHK_NDEF_NOT_DONE )
    809     {
    810         status = NFCSTATUS_REJECTED;
    811         goto Mfc_WrNdefEnd;
    812     }
    813     else if( NdefInfo.is_ndef == 0 )
    814     {
    815         status = NFCSTATUS_NON_NDEF_COMPLIANT;
    816         goto Mfc_WrNdefEnd;
    817     }
    818     else if( len > NdefInfo.NdefLength )
    819     {
    820         status = NFCSTATUS_NOT_ENOUGH_MEMORY;
    821         goto Mfc_WrNdefEnd;
    822     }
    823     else
    824     {
    825         NdefInfo.psUpperNdefMsg->buffer = p_data;
    826         NdefInfo.psUpperNdefMsg->length = len;
    827 
    828         NdefInfo.AppWrLength    = len;
    829         NdefMap->CompletionRoutine[2].CompletionRoutine = Mfc_WriteNdef_Completion_Routine;
    830         if( 0 == len )
    831         {
    832             /* TODO: Erase the Tag */
    833         }
    834         else
    835         {
    836             NdefMap->ApduBuffIndex = 0x00;
    837             *NdefMap->DataCount    = 0x00;
    838             PacketData             = NdefInfo.psUpperNdefMsg->buffer;
    839             PacketDataLength       = &(NdefInfo.dwWrLength);
    840             NdefMap->WrNdefPacketLength = PacketDataLength;
    841             NdefInfo.dwWrLength = len;
    842 
    843             status = phFriNfc_ValidateParams (PacketData, PacketDataLength, 0, NdefMap, PH_FRINFC_NDEF_WRITE_REQ);
    844             if( status != NFCSTATUS_SUCCESS )
    845             {
    846                 goto Mfc_WrNdefEnd;
    847             }
    848 
    849             status = phFriNfc_MifareStdMap_WrNdef(NdefMap, PacketData, PacketDataLength, PH_FRINFC_NDEFMAP_SEEK_BEGIN);
    850 
    851             if ( status == NFCSTATUS_PENDING )
    852             {
    853                 status = NFCSTATUS_SUCCESS;
    854             }
    855         }
    856     }
    857 
    858 Mfc_WrNdefEnd:
    859 #if(NFC_NXP_NOT_OPEN_INCLUDED == TRUE)
    860     pthread_mutex_unlock(&SharedDataMutex);
    861 #endif
    862     if( status != NFCSTATUS_SUCCESS )
    863     {
    864         status = NFCSTATUS_FAILED;
    865     }
    866     return status;
    867 }
    868 /*******************************************************************************
    869 **
    870 ** Function          phFriNfc_NdefSmtCrd_Reset__
    871 **
    872 ** Description      This function Resets the component instance to the initial
    873 **                  state and initializes the internal variables.
    874 **
    875 ** Returns          NFCSTATUS_SUCCESS
    876 **
    877 *******************************************************************************/
    878 STATIC NFCSTATUS phFriNfc_NdefSmtCrd_Reset__(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,
    879                                       uint8_t *SendRecvBuffer,
    880                                       uint16_t *SendRecvBuffLen)
    881 {
    882 //    NFCSTATUS status = NFCSTATUS_FAILED;                      /*commented to eliminate unused variable warning*/
    883     uint8_t     index;
    884 
    885     /* Initialize the state to Init */
    886     NdefSmtCrdFmt->State = PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT;
    887 
    888     for(index = 0;index<PH_FRINFC_SMTCRDFMT_CR;index++)
    889     {
    890         /* Initialize the NdefMap Completion Routine to Null */
    891         NdefSmtCrdFmt->CompletionRoutine[index].CompletionRoutine = NULL;
    892         /* Initialize the NdefMap Completion Routine context to Null  */
    893         NdefSmtCrdFmt->CompletionRoutine[index].Context = NULL;
    894     }
    895 
    896     /* Trx Buffer registered */
    897     NdefSmtCrdFmt->SendRecvBuf = SendRecvBuffer;
    898 
    899     /* Trx Buffer Size */
    900     NdefSmtCrdFmt->SendRecvLength = SendRecvBuffLen;
    901 
    902     /* Register Transfer Buffer Length */
    903     NdefSmtCrdFmt->SendLength = 0;
    904 
    905     /* Initialize the Format status flag*/
    906     NdefSmtCrdFmt->FmtProcStatus = 0;
    907 
    908     /* Reset the Card Type */
    909     NdefSmtCrdFmt->CardType = 0;
    910 
    911     /* Reset MapCompletion Info*/
    912     NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = NULL;
    913     NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NULL;
    914 
    915     phFriNfc_MfStd_Reset(NdefSmtCrdFmt);
    916 
    917     return NFCSTATUS_SUCCESS;
    918 }
    919 
    920 /*******************************************************************************
    921 **
    922 ** Function         Mfc_FormatNdef
    923 **
    924 ** Description      It triggers the NDEF format of Mifare Classic Tag.
    925 **
    926 **
    927 ** Returns:
    928 **                  NFCSTATUS_SUCCESS - if successfully initiated
    929 **                  NFCSTATUS_FAILED  - otherwise
    930 **
    931 *******************************************************************************/
    932 NFCSTATUS Mfc_FormatNdef(uint8_t *secretkey, uint8_t len)
    933 {
    934     NFCSTATUS status = NFCSTATUS_FAILED;
    935     uint8_t   mif_std_key[6] = {0};
    936 //    static uint8_t   Index;                                               /*commented to eliminate unused variable warning*/
    937     uint8_t     sak = 0;
    938 
    939     EXTNS_SetCallBackFlag(FALSE);
    940 
    941     memcpy(mif_std_key,secretkey,len);
    942     memcpy(current_key,secretkey,len);
    943 
    944     if( NULL == NdefSmtCrdFmt ||
    945         NULL == NdefMap || NULL == NdefMap->SendRecvBuf )
    946     {
    947         goto Mfc_FormatEnd;
    948     }
    949     NdefSmtCrdFmt->pTransceiveInfo = NdefMap->pTransceiveInfo;
    950 
    951     gphNxpExtns_Context.CallBackMifare = phFriNfc_MfStd_Process;
    952     gphNxpExtns_Context.CallBackCtxt   = NdefSmtCrdFmt;
    953 
    954     NdefInfo.NdefSendRecvLen = NDEF_SENDRCV_BUF_LEN;
    955     phFriNfc_NdefSmtCrd_Reset__(NdefSmtCrdFmt, NdefMap->SendRecvBuf, &(NdefInfo.NdefSendRecvLen));
    956 
    957     /* Register Callbacks */
    958     NdefSmtCrdFmt->CompletionRoutine[0].CompletionRoutine = Mfc_FormatNdef_Completion_Routine;
    959     NdefSmtCrdFmt->CompletionRoutine[1].CompletionRoutine = Mfc_FormatNdef_Completion_Routine;
    960     NdefSmtCrdFmt->psRemoteDevInfo = NdefMap->psRemoteDevInfo;
    961     sak = NdefSmtCrdFmt->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
    962 
    963     if((0x08 == (sak & 0x18)) || (0x18 == (sak & 0x18)) ||
    964        (0x01 == sak))
    965     {
    966         NdefSmtCrdFmt->CardType = (uint8_t) (((sak & 0x18) == 0x08)?
    967                         PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD:(((sak & 0x19) == 0x19)?
    968                         PH_FRINFC_SMTCRDFMT_MFSTD_2K_CRD:
    969                         PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD));
    970         status = phFriNfc_MfStd_Format( NdefSmtCrdFmt, mif_std_key);
    971     }
    972 
    973     if( NFCSTATUS_PENDING == status )
    974     {
    975         status = NFCSTATUS_SUCCESS;
    976     }
    977 
    978 Mfc_FormatEnd:
    979     if( status != NFCSTATUS_SUCCESS )
    980     {
    981         status = NFCSTATUS_FAILED;
    982     }
    983 
    984     return status;
    985 }
    986 
    987 /*******************************************************************************
    988 **
    989 ** Function         phNxNciExtns_MifareStd_Reconnect
    990 **
    991 ** Description      This function sends the deactivate command to NFCC for Mifare
    992 **
    993 **
    994 ** Returns:
    995 **                  NFCSTATUS_PENDING - if successfully initiated
    996 **                  NFCSTATUS_FAILED  - otherwise
    997 **
    998 *******************************************************************************/
    999 NFCSTATUS phNxNciExtns_MifareStd_Reconnect(void)
   1000 {
   1001     tNFA_STATUS status;
   1002 
   1003     EXTNS_SetDeactivateFlag(TRUE);
   1004     if (NFA_STATUS_OK != (status = NFA_Deactivate (TRUE))) /* deactivate to sleep state */
   1005     {
   1006         NXPLOG_EXTNS_E ("%s: deactivate failed, status = %d", __FUNCTION__, status);
   1007         return NFCSTATUS_FAILED;
   1008     }
   1009 
   1010     return NFCSTATUS_PENDING;
   1011 
   1012 }
   1013 
   1014 /*******************************************************************************
   1015 **
   1016 ** Function         Mfc_DeactivateCbackSelect
   1017 **
   1018 ** Description      This function select the Mifare tag
   1019 **
   1020 **
   1021 ** Returns:         void
   1022 **
   1023 *******************************************************************************/
   1024 void Mfc_DeactivateCbackSelect(void)
   1025 {
   1026     tNFA_STATUS status;
   1027 
   1028     EXTNS_SetConnectFlag(TRUE);
   1029     if (NFA_STATUS_OK != (status = NFA_Select (0x01, phNciNfc_e_RfProtocolsMifCProtocol,
   1030                                                      phNciNfc_e_RfInterfacesTagCmd_RF)))
   1031     {
   1032         NXPLOG_EXTNS_E ("%s: NFA_Select failed, status = %d", __FUNCTION__, status);
   1033     }
   1034 
   1035     return;
   1036 }
   1037 
   1038 /*******************************************************************************
   1039 **
   1040 ** Function         Mfc_ActivateCback
   1041 **
   1042 ** Description      This function invoke the callback when receive the response
   1043 **
   1044 **
   1045 ** Returns:         void
   1046 **
   1047 **
   1048 *******************************************************************************/
   1049 void Mfc_ActivateCback(void)
   1050 {
   1051     gphNxpExtns_Context.CallBackMifare(gphNxpExtns_Context.CallBackCtxt, NFCSTATUS_SUCCESS);
   1052     return;
   1053 }
   1054 
   1055 /*******************************************************************************
   1056 **
   1057 ** Function         Mfc_Transceive
   1058 **
   1059 ** Description      Sends raw frame to Mifare Classic Tag.
   1060 **
   1061 ** Returns          NFCSTATUS_SUCCESS - if successfully initiated
   1062 **                  NFCSTATUS_FAILED  - otherwise
   1063 **
   1064 *******************************************************************************/
   1065 NFCSTATUS Mfc_Transceive(uint8_t *p_data, uint32_t len)
   1066 {
   1067     NFCSTATUS status = NFCSTATUS_FAILED;
   1068     uint8_t i = 0x00;
   1069 
   1070     gphNxpExtns_Context.RawWriteCallBack = FALSE;
   1071     gphNxpExtns_Context.CallBackMifare = NULL;
   1072     gphNxpExtns_Context.CallBackCtxt   = NdefMap;
   1073 
   1074     EXTNS_SetCallBackFlag(TRUE);
   1075     if( p_data[0] == 0x60 || p_data[0] == 0x61 )
   1076     {
   1077 
   1078         NdefMap->Cmd.MfCmd = p_data[0];
   1079 
   1080         NdefMap->SendRecvBuf[i++] = p_data[1];
   1081 
   1082         NdefMap->SendRecvBuf[i++] = p_data[6]; /* TODO, handle 7 byte UID */
   1083         NdefMap->SendRecvBuf[i++] = p_data[7];
   1084         NdefMap->SendRecvBuf[i++] = p_data[8];
   1085         NdefMap->SendRecvBuf[i++] = p_data[9];
   1086         NdefMap->SendRecvBuf[i++] = p_data[10];
   1087         NdefMap->SendRecvBuf[i++] = p_data[11];
   1088 
   1089         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1090                               NdefMap->Cmd,
   1091                               NdefMap->SendRecvBuf,
   1092                               NdefMap->SendLength,
   1093                               NdefMap->SendRecvLength);
   1094     }
   1095     else if( p_data[0] == 0xA0 )
   1096     {
   1097         EXTNS_SetCallBackFlag(FALSE);
   1098         NdefMap->Cmd.MfCmd = phNfc_eMifareWrite16;
   1099         gphNxpExtns_Context.RawWriteCallBack = TRUE;
   1100 
   1101         memcpy(NdefMap->SendRecvBuf, &p_data[1], len-1);
   1102         NdefMap->SendLength = len-1;
   1103         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1104                               NdefMap->Cmd,
   1105                               NdefMap->SendRecvBuf,
   1106                               NdefMap->SendLength,
   1107                               NdefMap->SendRecvLength);
   1108     }
   1109     else if( (p_data[0] == phNfc_eMifareInc) || (p_data[0] == phNfc_eMifareDec) )
   1110     {
   1111 
   1112         EXTNS_SetCallBackFlag(FALSE);
   1113         NdefMap->Cmd.MfCmd = p_data[0];
   1114         gphNxpExtns_Context.RawWriteCallBack = TRUE;
   1115 
   1116         memcpy(NdefMap->SendRecvBuf, &p_data[1], len-1);
   1117         NdefMap->SendLength = len - 1;
   1118         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1119                               NdefMap->Cmd,
   1120                               NdefMap->SendRecvBuf,
   1121                               NdefMap->SendLength,
   1122                               NdefMap->SendRecvLength);
   1123     }
   1124     else if( ((p_data[0] == phNfc_eMifareTransfer) || (p_data[0] == phNfc_eMifareRestore)) && (len == 2) )
   1125     {
   1126         NdefMap->Cmd.MfCmd = p_data[0];
   1127         if (p_data[0] == phNfc_eMifareRestore)
   1128         {
   1129             EXTNS_SetCallBackFlag(FALSE);
   1130             gphNxpExtns_Context.RawWriteCallBack = TRUE;
   1131             memcpy(NdefMap->SendRecvBuf, &p_data[1], len -1);
   1132             NdefMap->SendLength = len - 1;
   1133         }
   1134         else
   1135         {
   1136             memcpy(NdefMap->SendRecvBuf, p_data, len);
   1137             NdefMap->SendLength = len;
   1138         }
   1139         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1140                               NdefMap->Cmd,
   1141                               NdefMap->SendRecvBuf,
   1142                               NdefMap->SendLength,
   1143                               NdefMap->SendRecvLength);
   1144 
   1145     }
   1146     else
   1147     {
   1148         NdefMap->Cmd.MfCmd = phNfc_eMifareRaw;
   1149 
   1150         memcpy(NdefMap->SendRecvBuf, p_data, len);
   1151         NdefMap->SendLength = len;
   1152         status = phFriNfc_ExtnsTransceive(NdefMap->pTransceiveInfo,
   1153                               NdefMap->Cmd,
   1154                               NdefMap->SendRecvBuf,
   1155                               NdefMap->SendLength,
   1156                               NdefMap->SendRecvLength);
   1157     }
   1158     if (NFCSTATUS_PENDING == status)
   1159     {
   1160         status = NFCSTATUS_SUCCESS;
   1161     }
   1162     else
   1163     {
   1164         NXPLOG_EXTNS_E("ERROR: Mfc_Transceive = 0x%x", status);
   1165     }
   1166 
   1167     return status;
   1168 }
   1169 
   1170 /*******************************************************************************
   1171 **
   1172 ** Function         nativeNfcExtns_doTransceive
   1173 **
   1174 ** Description      Sends raw frame to BCM stack.
   1175 **
   1176 ** Returns          NFCSTATUS_PENDING - if successfully initiated
   1177 **                  NFCSTATUS_FAILED  - otherwise
   1178 **
   1179 *******************************************************************************/
   1180 STATIC NFCSTATUS nativeNfcExtns_doTransceive(uint8_t *buff, uint16_t buffSz)
   1181 {
   1182     NFCSTATUS wStatus = NFCSTATUS_PENDING;
   1183     tNFA_STATUS status = NFA_SendRawFrame (buff, buffSz, NFA_DM_DEFAULT_PRESENCE_CHECK_START_DELAY);
   1184 
   1185     if (status != NFA_STATUS_OK)
   1186     {
   1187         NXPLOG_EXTNS_E ("%s: fail send; error=%d", __FUNCTION__, status);
   1188         wStatus = NFCSTATUS_FAILED;
   1189     }
   1190 
   1191     return wStatus;
   1192 }
   1193 
   1194 /*******************************************************************************
   1195 **
   1196 ** Function          phNciNfc_RecvMfResp
   1197 **
   1198 ** Description      This function shall be invoked as part of ReaderMgmt data
   1199 **                  exchange sequence handler on receiving response/data from NFCC
   1200 **
   1201 ** Returns          NFCSTATUS_SUCCESS - Data Reception is successful
   1202 **                  NFCSTATUS_FAILED  - Data Reception failed
   1203 **
   1204 *******************************************************************************/
   1205 STATIC NFCSTATUS
   1206 phNciNfc_RecvMfResp(phNciNfc_Buff_t* RspBuffInfo,
   1207                         NFCSTATUS          wStatus
   1208                        )
   1209 {
   1210     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1211     uint16_t                wPldDataSize = 0;
   1212     phNciNfc_ExtnRespId_t   RecvdExtnRspId = phNciNfc_e_InvalidRsp;
   1213     uint16_t                wRecvDataSz = 0;
   1214 
   1215     if(NULL == RspBuffInfo)
   1216     {
   1217       status = NFCSTATUS_FAILED;
   1218     }
   1219     else
   1220     {
   1221         if((0 == (RspBuffInfo->wLen))
   1222                 || (PH_NCINFC_STATUS_OK != wStatus)
   1223                 || (NULL == (RspBuffInfo->pBuff))
   1224                 )
   1225         {
   1226             status = NFCSTATUS_FAILED;
   1227         }
   1228         else
   1229         {
   1230             RecvdExtnRspId = (phNciNfc_ExtnRespId_t)RspBuffInfo->pBuff[0];
   1231 
   1232             switch(RecvdExtnRspId)
   1233             {
   1234                 case phNciNfc_e_MfXchgDataRsp:
   1235                 {
   1236                         /* check the status byte */
   1237                     if( PH_NCINFC_STATUS_OK == RspBuffInfo->pBuff[RspBuffInfo->wLen-1] )
   1238                     {
   1239                         status = NFCSTATUS_SUCCESS;
   1240 
   1241                         /* DataLen = TotalRecvdLen - (sizeof(RspId) + sizeof(Status)) */
   1242                         wPldDataSize = ((RspBuffInfo->wLen) -
   1243                             (PHNCINFC_EXTNID_SIZE + PHNCINFC_EXTNSTATUS_SIZE));
   1244                         wRecvDataSz = NCI_MAX_DATA_LEN;
   1245 
   1246                         /* wPldDataSize = wPldDataSize-1; ==> ignoring the last status byte appended with data */
   1247                         if((wPldDataSize) <= wRecvDataSz)
   1248                         {
   1249                             /* Extract the data part from pBuff[2] & fill it to be sent to upper layer */
   1250                             memcpy(NdefMap->SendRecvBuf, &(RspBuffInfo->pBuff[1]),(wPldDataSize));
   1251                             /* update the number of bytes received from lower layer,excluding the status byte */
   1252                             *(NdefMap->SendRecvLength) = wPldDataSize;
   1253                         }
   1254                         else
   1255                         {
   1256                             //TODO:- Map some status for remaining extra data received to be sent back to caller??
   1257                             status = NFCSTATUS_FAILED;
   1258                         }
   1259                     }
   1260                     else
   1261                     {
   1262                         status = NFCSTATUS_FAILED;
   1263                     }
   1264                 }
   1265                 break;
   1266 
   1267                 case phNciNfc_e_MfcAuthRsp:
   1268                 {
   1269                     /* check the status byte */
   1270                     if(PH_NCINFC_STATUS_OK == RspBuffInfo->pBuff[1])
   1271                     {
   1272                         if (gAuthCmdBuf.auth_sent ==  TRUE)
   1273                         {
   1274                             MfcPresenceCheckResult(NFCSTATUS_SUCCESS);
   1275                             return NFCSTATUS_SUCCESS;
   1276                         }
   1277                         gAuthCmdBuf.auth_status = TRUE;
   1278                         status = NFCSTATUS_SUCCESS;
   1279 
   1280                         /* DataLen = TotalRecvdLen - (sizeof(RspId) + sizeof(Status)) */
   1281                         wPldDataSize = ((RspBuffInfo->wLen) -
   1282                             (PHNCINFC_EXTNID_SIZE + PHNCINFC_EXTNSTATUS_SIZE));
   1283 
   1284                         /* Extract the data part from pBuff[2] & fill it to be sent to upper layer */
   1285                         memcpy(NdefMap->SendRecvBuf, &(RspBuffInfo->pBuff[2]),wPldDataSize);
   1286                         /* update the number of bytes received from lower layer,excluding the status byte */
   1287                         *(NdefMap->SendRecvLength) = wPldDataSize;
   1288                     }
   1289                     else
   1290                     {
   1291                         if (gAuthCmdBuf.auth_sent ==  TRUE)
   1292                         {
   1293                             gAuthCmdBuf.auth_status = FALSE;
   1294                             MfcPresenceCheckResult(NFCSTATUS_FAILED);
   1295                             return NFCSTATUS_SUCCESS;
   1296                         }
   1297                         else
   1298                         {
   1299                             /* Reset the stored auth command buffer */
   1300                             memset(gAuthCmdBuf.pauth_cmd->buffer, 0 , NCI_MAX_DATA_LEN);
   1301                             gAuthCmdBuf.pauth_cmd->length = 0;
   1302                             gAuthCmdBuf.auth_status = FALSE;
   1303                         }
   1304                         status = NFCSTATUS_FAILED;
   1305                     }
   1306                 }
   1307                 break;
   1308 
   1309                 default:
   1310                 {
   1311                     status = NFCSTATUS_FAILED;
   1312                 }
   1313                 break;
   1314             }
   1315         }
   1316     }
   1317 
   1318     return status;
   1319 }
   1320 
   1321 /*******************************************************************************
   1322 **
   1323 ** Function         phLibNfc_SendWrt16CmdPayload
   1324 **
   1325 ** Description      This function map the raw write cmd
   1326 **
   1327 ** Returns          NFCSTATUS_SUCCESS            - Command framing done
   1328 **                  NFCSTATUS_INVALID_PARAMETER  - Otherwise
   1329 **
   1330 *******************************************************************************/
   1331 STATIC NFCSTATUS phLibNfc_SendWrt16CmdPayload(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1332                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1333 {
   1334     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1335 
   1336     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1337         (0 != (pTransceiveInfo->sSendData.length)))
   1338     {
   1339         memcpy(pMappedTranscvIf->tSendData.pBuff, pTransceiveInfo->sSendData.buffer,
   1340                               (pTransceiveInfo->sSendData.length));
   1341         pMappedTranscvIf->tSendData.wLen              = pTransceiveInfo->sSendData.length;
   1342         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1343     }
   1344     else
   1345     {
   1346         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1347     }
   1348 
   1349     if ( gphNxpExtns_Context.RawWriteCallBack == TRUE )
   1350     {
   1351         EXTNS_SetCallBackFlag(TRUE);
   1352         gphNxpExtns_Context.RawWriteCallBack = FALSE;
   1353     }
   1354 
   1355     return wStatus;
   1356 }
   1357 
   1358 /*******************************************************************************
   1359 **
   1360 ** Function         phLibNfc_SendIncDecCmdPayload
   1361 **
   1362 ** Description      This function prepares the Increment/Decrement Value to be
   1363 **                  sent. This is called after sending the Increment/Decrement
   1364 **                  command is already sent and successfull
   1365 **
   1366 ** Returns          NFCSTATUS_SUCCESS            - Payload framing done
   1367 **                  NFCSTATUS_INVALID_PARAMETER  - Otherwise
   1368 **
   1369 *******************************************************************************/
   1370 STATIC NFCSTATUS phLibNfc_SendIncDecCmdPayload(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1371                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1372 {
   1373     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1374 
   1375     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1376         (0 != (pTransceiveInfo->sSendData.length)))
   1377     {
   1378         memcpy(pMappedTranscvIf->tSendData.pBuff, pTransceiveInfo->sSendData.buffer,
   1379                               (pTransceiveInfo->sSendData.length));
   1380         pMappedTranscvIf->tSendData.wLen              = pTransceiveInfo->sSendData.length;
   1381         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1382     }
   1383     else
   1384     {
   1385         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1386     }
   1387 
   1388     if ( gphNxpExtns_Context.RawWriteCallBack == TRUE )
   1389     {
   1390         EXTNS_SetCallBackFlag(TRUE);
   1391         gphNxpExtns_Context.RawWriteCallBack = FALSE;
   1392     }
   1393 
   1394     return wStatus;
   1395 }
   1396 
   1397 /*******************************************************************************
   1398 **
   1399 ** Function         Mfc_RecvPacket
   1400 **
   1401 ** Description      Decodes Mifare Classic Tag Response
   1402 **                  This is called from NFA_SendRaw Callback
   1403 **
   1404 ** Returns:
   1405 **                  NFCSTATUS_SUCCESS - if successfully initiated
   1406 **                  NFCSTATUS_FAILED  - otherwise
   1407 **
   1408 *******************************************************************************/
   1409 NFCSTATUS Mfc_RecvPacket(uint8_t *buff, uint8_t buffSz)
   1410 {
   1411     NFCSTATUS    status = NFCSTATUS_SUCCESS;
   1412     phNciNfc_Buff_t         RspBuff;
   1413     uint8_t *pcmd_buff;
   1414     uint16_t buffSize;
   1415 
   1416     RspBuff.pBuff = buff;
   1417     RspBuff.wLen  = buffSz;
   1418     status = phNciNfc_RecvMfResp(&RspBuff, status);
   1419     if (TRUE == gAuthCmdBuf.auth_sent)
   1420     {
   1421         ALOGD("%s Mfc Check Presnece in progress", __FUNCTION__);
   1422         gAuthCmdBuf.auth_sent = FALSE;
   1423         return status;
   1424     }
   1425     if( TRUE == gphNxpExtns_Context.writecmdFlag && (NFCSTATUS_SUCCESS == status ))
   1426     {
   1427         pcmd_buff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
   1428         if( NULL == pcmd_buff )
   1429         {
   1430             return NFCSTATUS_FAILED;
   1431         }
   1432         buffSize = MAX_BUFF_SIZE;
   1433         gphNxpExtns_Context.writecmdFlag = FALSE;
   1434         phLibNfc_SendWrt16CmdPayload(NdefMap->pTransceiveInfo, &tNciTranscvInfo);
   1435         status = phNciNfc_SendMfReq(tNciTranscvInfo, pcmd_buff, &buffSize);
   1436         if ( NFCSTATUS_PENDING != status )
   1437         {
   1438             NXPLOG_EXTNS_E("ERROR : Mfc_RecvPacket: 0x%x", status);
   1439         }
   1440         else
   1441         {
   1442             status = NFCSTATUS_SUCCESS;
   1443         }
   1444         if( pcmd_buff != NULL )
   1445         {
   1446             free(pcmd_buff);
   1447             pcmd_buff = NULL;
   1448         }
   1449     }
   1450     else if( TRUE == gphNxpExtns_Context.incrdecflag && (NFCSTATUS_SUCCESS == status ))
   1451     {
   1452         pcmd_buff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
   1453         if( NULL == pcmd_buff )
   1454         {
   1455             return NFCSTATUS_FAILED;
   1456         }
   1457         buffSize = MAX_BUFF_SIZE;
   1458         gphNxpExtns_Context.incrdecflag = FALSE;
   1459         phLibNfc_SendIncDecCmdPayload(NdefMap->pTransceiveInfo, &tNciTranscvInfo);
   1460         status = phNciNfc_SendMfReq(tNciTranscvInfo, pcmd_buff, &buffSize);
   1461         if ( NFCSTATUS_PENDING != status )
   1462         {
   1463             NXPLOG_EXTNS_E("ERROR : Mfc_RecvPacket: 0x%x", status);
   1464         }
   1465         else
   1466         {
   1467             status = NFCSTATUS_SUCCESS;
   1468         }
   1469         gphNxpExtns_Context.incrdecstatusflag = TRUE;
   1470         if( pcmd_buff != NULL )
   1471         {
   1472             free(pcmd_buff);
   1473             pcmd_buff = NULL;
   1474         }
   1475 
   1476     }
   1477     else
   1478     {
   1479         if( gphNxpExtns_Context.CallBackMifare != NULL )
   1480         {
   1481             if( (gphNxpExtns_Context.incrdecstatusflag == TRUE) && status == 0xB2 )
   1482             {
   1483                 gphNxpExtns_Context.incrdecstatusflag = FALSE;
   1484                 status = NFCSTATUS_SUCCESS;
   1485             }
   1486             gphNxpExtns_Context.CallBackMifare(gphNxpExtns_Context.CallBackCtxt, status);
   1487         }
   1488     }
   1489 
   1490     return status;
   1491 }
   1492 
   1493 /*******************************************************************************
   1494 **
   1495 ** Function         phNciNfc_MfCreateXchgDataHdr
   1496 **
   1497 ** Description      This function builds the payload header for mifare XchgData
   1498 **                  request to be sent to NFCC.
   1499 **
   1500 ** Returns          NFCSTATUS_PENDING            - Command framing done
   1501 **                  NFCSTATUS_FAILED             - Otherwise
   1502 **
   1503 *******************************************************************************/
   1504 STATIC
   1505 NFCSTATUS
   1506 phNciNfc_MfCreateXchgDataHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
   1507                              uint8_t *buff, uint16_t *buffSz)
   1508 
   1509 {
   1510     NFCSTATUS   status = NFCSTATUS_SUCCESS;
   1511     uint8_t     i = 0;
   1512 
   1513     buff[i++] = phNciNfc_e_MfRawDataXchgHdr;
   1514     memcpy(&buff[i],tTranscvInfo.tSendData.pBuff,tTranscvInfo.tSendData.wLen);
   1515     *buffSz = i + tTranscvInfo.tSendData.wLen;
   1516 
   1517     status = nativeNfcExtns_doTransceive(buff, (uint16_t) *buffSz);
   1518 
   1519     return status;
   1520 }
   1521 
   1522 /*******************************************************************************
   1523 **
   1524 ** Function         phNciNfc_MfCreateAuthCmdHdr
   1525 **
   1526 ** Description      This function builds the payload header for mifare
   1527 **                  classic Authenticate command to be sent to NFCC.
   1528 **
   1529 ** Returns          NFCSTATUS_PENDING            - Command framing done
   1530 **                  NFCSTATUS_FAILED             - Otherwise
   1531 **
   1532 *******************************************************************************/
   1533 STATIC
   1534 NFCSTATUS
   1535 phNciNfc_MfCreateAuthCmdHdr(phNciNfc_TransceiveInfo_t tTranscvInfo,
   1536                             uint8_t    bBlockAddr,
   1537                             uint8_t    *buff,
   1538                             uint16_t    *buffSz)
   1539 {
   1540     NFCSTATUS               status = NFCSTATUS_SUCCESS;
   1541 //    pphNciNfc_RemoteDevInformation_t  pActivDev = NULL;           /*commented to eliminate unused variable warning*/
   1542     uint8_t bKey = 0x00;
   1543 
   1544     /*No need to check range of block address*/
   1545     /*To check for Authenticate A or Authenticate B type command*/
   1546     if(PHNCINFC_AUTHENTICATION_KEYB ==
   1547        tTranscvInfo.tSendData.pBuff[0] )
   1548     {
   1549         bKey = bKey | PHNCINFC_ENABLE_KEY_B;
   1550     }
   1551 
   1552     /*TO Do last 4 bits of Key to be set based of firmware implementation*/
   1553     /*this value is hardcoded but based on firmware implementation change this value*/
   1554     bKey = (bKey | PHNCINFC_AUTHENTICATION_KEY);
   1555 
   1556     bKey |= tTranscvInfo.tSendData.pBuff[2];
   1557 
   1558     /*For authentication extension no need to copy tSendData buffer of tTranscvInfo */
   1559     tTranscvInfo.tSendData.wLen = 0x00;
   1560 
   1561     buff[0] = phNciNfc_e_MfcAuthReq;
   1562     buff[1] = bBlockAddr;
   1563     buff[2] = bKey;
   1564 
   1565     *buffSz = 0x03;
   1566     if (bKey & PH_NCINFC_MIFARECLASSIC_EMBEDDED_KEY)
   1567     {
   1568         memcpy(&buff[3],&tTranscvInfo.tSendData.pBuff[3], PHLIBNFC_MFC_AUTHKEYLEN);
   1569         *buffSz += PHLIBNFC_MFC_AUTHKEYLEN;
   1570     }
   1571     /* Store the auth command buffer to use further for presence check */
   1572     if (gAuthCmdBuf.pauth_cmd != NULL)
   1573     {
   1574         memset(gAuthCmdBuf.pauth_cmd->buffer, 0, NCI_MAX_DATA_LEN);
   1575         gAuthCmdBuf.pauth_cmd->length = *buffSz;
   1576         memcpy(gAuthCmdBuf.pauth_cmd->buffer, buff, *buffSz);
   1577     }
   1578     status = nativeNfcExtns_doTransceive(buff,(uint16_t) *buffSz);
   1579 
   1580     return status;
   1581 }
   1582 
   1583 /*******************************************************************************
   1584 **
   1585 ** Function         phNciNfc_SendMfReq
   1586 **
   1587 ** Description      This function shall be invoked as part of ReaderMgmt data
   1588 **                  exchange sequence handler.
   1589 **                  It shall send the request packet to NFCC.
   1590 **
   1591 ** Returns          NFCSTATUS_PENDING  - Send request is Pending
   1592 **                  NFCSTATUS_FAILED   - otherwise
   1593 **
   1594 *******************************************************************************/
   1595 STATIC NFCSTATUS
   1596 phNciNfc_SendMfReq(phNciNfc_TransceiveInfo_t tTranscvInfo, uint8_t *buff, uint16_t *buffSz)
   1597 {
   1598     NFCSTATUS status = NFCSTATUS_SUCCESS;
   1599 
   1600     switch(tTranscvInfo.uCmd.T2TCmd)
   1601     {
   1602         case phNciNfc_eT2TRaw:
   1603         {
   1604             status = phNciNfc_MfCreateXchgDataHdr(tTranscvInfo, buff, buffSz);
   1605         }
   1606         break;
   1607         case phNciNfc_eT2TAuth:
   1608         {
   1609             status = phNciNfc_MfCreateAuthCmdHdr(tTranscvInfo,
   1610                 (tTranscvInfo.bAddr), buff, buffSz);
   1611         }
   1612         break;
   1613         default:
   1614         {
   1615             status = NFCSTATUS_FAILED;
   1616             break;
   1617         }
   1618     }
   1619 
   1620     return status;
   1621 }
   1622 
   1623 /*******************************************************************************
   1624 **
   1625 ** Function         phLibNfc_CalSectorAddress
   1626 **
   1627 ** Description      This function update the sector address for Mifare classic
   1628 **
   1629 ** Returns          none
   1630 **
   1631 *******************************************************************************/
   1632 STATIC void phLibNfc_CalSectorAddress(uint8_t *Sector_Address)
   1633 {
   1634     uint8_t BlockNumber = 0x00;
   1635 
   1636     if(NULL != Sector_Address)
   1637     {
   1638         BlockNumber = *Sector_Address;
   1639         if(BlockNumber >= PHLIBNFC_MIFARESTD4K_BLK128)
   1640         {
   1641             *Sector_Address = (uint8_t)(PHLIBNFC_MIFARESTD_SECTOR_NO32 +
   1642                               ((BlockNumber - PHLIBNFC_MIFARESTD4K_BLK128)/
   1643                                PHLIBNFC_MIFARESTD_BLOCK_BYTES));
   1644         }
   1645         else
   1646         {
   1647             *Sector_Address = BlockNumber/PHLIBNFC_NO_OF_BLKPERSECTOR;
   1648         }
   1649      }
   1650     else
   1651     {
   1652     }
   1653 
   1654     return;
   1655 }
   1656 
   1657 /*******************************************************************************
   1658 **
   1659 ** Function         phLibNfc_GetKeyNumberMFC
   1660 **
   1661 ** Description      This function find key number based on authentication command
   1662 **
   1663 ** Returns          NFCSTATUS_SUCCESS  - If found the key number
   1664 **                  NFCSTATUS_FAILED   - otherwise
   1665 **
   1666 *******************************************************************************/
   1667 STATIC NFCSTATUS phLibNfc_GetKeyNumberMFC(uint8_t *buffer,uint8_t *bKey)
   1668 {
   1669     int32_t sdwStat   = 0X00;
   1670     NFCSTATUS wStatus = NFCSTATUS_INVALID_PARAMETER;
   1671 
   1672     /*Key Configuration
   1673     uint8_t NdefKey[PHLIBNFC_MFC_AUTHKEYLEN] = {0xD3,0XF7,0xD3,0XF7,0xD3,0XF7};
   1674     uint8_t RawKey[PHLIBNFC_MFC_AUTHKEYLEN] = {0xFF,0XFF,0xFF,0XFF,0xFF,0XFF};
   1675     uint8_t MadKey[PHLIBNFC_MFC_AUTHKEYLEN] = {0xA0,0XA1,0xA2,0XA3,0xA4,0XA5};
   1676     uint8_t Key[PHLIBNFC_MFC_AUTHKEYLEN] = {0x00,0x00,0x00,0x00,0x00,0x00}; */ /*Key used during ndef format*/
   1677 
   1678     uint8_t bIndex = 0x00;
   1679     uint8_t bNoOfKeys = 0x00;
   1680 
   1681 #if PHLIBNFC_NXPETENSION_CONFIGURE_MFKEYS
   1682     uint8_t aMfc_keys[NXP_NUMBER_OF_MFC_KEYS][NXP_MFC_KEY_SIZE] = NXP_MFC_KEYS;
   1683 #else
   1684     uint8_t aMfc_keys[1][1] = {{0x00}};
   1685 #endif
   1686 
   1687     if(NULL != bKey &&
   1688        NULL != buffer )
   1689     {
   1690        bNoOfKeys = sizeof(aMfc_keys)/NXP_MFC_KEY_SIZE;
   1691         /* Traverse through the keys stored to determine whether keys is preloaded key */
   1692        for(bIndex = 0; bIndex < bNoOfKeys; bIndex++)
   1693        {
   1694            /* Check passed key is NDEF key */
   1695            sdwStat = memcmp(&buffer[PHLIBNFC_MFCUIDLEN_INAUTHCMD],
   1696                                   aMfc_keys[bIndex], PHLIBNFC_MFC_AUTHKEYLEN);
   1697            if(!sdwStat)
   1698            {
   1699                NXPLOG_EXTNS_E("Mifare : phLibNfc_GetKeyNumberMFC Key found");
   1700                *bKey = bIndex;
   1701                wStatus = NFCSTATUS_SUCCESS;
   1702                break;
   1703            }
   1704         }
   1705        NXPLOG_EXTNS_E("Mifare : phLibNfc_GetKeyNumberMFC returning = 0x%x Key = 0x%x", wStatus, *bKey);
   1706     }
   1707     else
   1708     {
   1709         wStatus = NFCSTATUS_FAILED;
   1710         NXPLOG_EXTNS_E("Mifare : phLibNfc_GetKeyNumberMFC returning = 0x%x", wStatus);
   1711     }
   1712 
   1713     return wStatus;
   1714 }
   1715 
   1716 /*******************************************************************************
   1717 **
   1718 ** Function         phLibNfc_ChkAuthCmdMFC
   1719 **
   1720 ** Description      This function Check Authentication command send is proper or not
   1721 **
   1722 ** Returns          NFCSTATUS_SUCCESS  - Authenticate command is proper
   1723 **                  NFCSTATUS_FAILED   - otherwise
   1724 **
   1725 *******************************************************************************/
   1726 STATIC NFCSTATUS phLibNfc_ChkAuthCmdMFC(phNfc_sTransceiveInfo_t* pTransceiveInfo,
   1727                                  uint8_t *bKey)
   1728 {
   1729     NFCSTATUS wStatus  = NFCSTATUS_SUCCESS;
   1730 
   1731     if(NULL != pTransceiveInfo &&
   1732        NULL != pTransceiveInfo->sSendData.buffer &&
   1733        0 != pTransceiveInfo->sSendData.length &&
   1734        NULL != bKey)
   1735     {
   1736         if((pTransceiveInfo->cmd.MfCmd == phNfc_eMifareAuthentA ||
   1737            pTransceiveInfo->cmd.MfCmd == phNfc_eMifareAuthentB ))
   1738         {
   1739             wStatus = phLibNfc_GetKeyNumberMFC(pTransceiveInfo->sSendData.buffer,bKey);
   1740         }
   1741         else
   1742         {
   1743             wStatus = NFCSTATUS_FAILED;
   1744         }
   1745     }else
   1746     {
   1747         wStatus = NFCSTATUS_FAILED;
   1748     }
   1749     return wStatus;
   1750 }
   1751 
   1752 /*******************************************************************************
   1753 **
   1754 ** Function         phLibNfc_MifareMap
   1755 **
   1756 ** Description      Mifare Mapping Utility function
   1757 **
   1758 ** Returns          NFCSTATUS_SUCCESS             - Mapping is proper
   1759 **                  NFCSTATUS_INVALID_PARAMETER   - otherwise
   1760 **
   1761 *******************************************************************************/
   1762 STATIC NFCSTATUS phLibNfc_MifareMap(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1763                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1764 {
   1765     NFCSTATUS status = NFCSTATUS_SUCCESS;
   1766     uint8_t bBuffIdx = 0;
   1767     uint8_t bSectorNumber;
   1768     uint8_t bKey = 0;
   1769 
   1770     switch(pTransceiveInfo->cmd.MfCmd)
   1771     {
   1772         case phNfc_eMifareRead16:
   1773         {
   1774             if( (NULL != pTransceiveInfo->sRecvData.buffer) &&
   1775                 (0 != (pTransceiveInfo->sRecvData.length)))
   1776             {
   1777                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = phNfc_eMifareRead16;
   1778                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1779                 pMappedTranscvIf->tSendData.wLen              = bBuffIdx;
   1780                 pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1781             }
   1782             else
   1783             {
   1784                 status = NFCSTATUS_INVALID_PARAMETER;
   1785             }
   1786         }
   1787         break;
   1788 
   1789         case phNfc_eMifareWrite16:
   1790         {
   1791             if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1792                 (0 != (pTransceiveInfo->sSendData.length)))
   1793             {
   1794                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = phNfc_eMifareWrite16;
   1795                 pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1796                 memcpy(&(pMappedTranscvIf->tSendData.pBuff[bBuffIdx]),pTransceiveInfo->sSendData.buffer,
   1797                                       (pTransceiveInfo->sSendData.length));
   1798                 pMappedTranscvIf->tSendData.wLen              = bBuffIdx + pTransceiveInfo->sSendData.length;
   1799                 pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1800             }
   1801             else
   1802             {
   1803                 status = NFCSTATUS_INVALID_PARAMETER;
   1804             }
   1805         }
   1806         break;
   1807 
   1808         case phNfc_eMifareAuthentA:
   1809         case phNfc_eMifareAuthentB:
   1810         {
   1811             if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1812                 (0 != (pTransceiveInfo->sSendData.length)) &&
   1813                 (NULL != pTransceiveInfo->sRecvData.buffer) &&
   1814                 (0 != (pTransceiveInfo->sRecvData.length))
   1815                 )
   1816             {
   1817                 status = phLibNfc_ChkAuthCmdMFC(pTransceiveInfo, &bKey);
   1818                 if(NFCSTATUS_FAILED != status )
   1819                 {
   1820                     bSectorNumber = pTransceiveInfo->addr;
   1821                     phLibNfc_CalSectorAddress(&bSectorNumber);
   1822                     /*For creating extension command header pTransceiveInfo's MfCmd get used*/
   1823                     pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->cmd.MfCmd;
   1824                     pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = bSectorNumber;
   1825                     pMappedTranscvIf->uCmd.T2TCmd = phNciNfc_eT2TAuth;
   1826                     pMappedTranscvIf->bAddr = bSectorNumber;
   1827                     pMappedTranscvIf->bNumBlock = pTransceiveInfo->NumBlock;
   1828                     if(NFCSTATUS_SUCCESS == status)
   1829                     {
   1830                         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = bKey;
   1831                         (pMappedTranscvIf->tSendData.wLen) = (uint16_t)(bBuffIdx);
   1832 
   1833                     }
   1834                     else if(NFCSTATUS_INVALID_PARAMETER == status)
   1835                     {
   1836                         bKey = bKey | PH_NCINFC_MIFARECLASSIC_EMBEDDED_KEY;
   1837                         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = bKey;
   1838                         memcpy(&pMappedTranscvIf->tSendData.pBuff[bBuffIdx],
   1839                                 &pTransceiveInfo->sSendData.buffer[PHLIBNFC_MFCUIDLEN_INAUTHCMD], PHLIBNFC_MFC_AUTHKEYLEN);
   1840 
   1841                         (pMappedTranscvIf->tSendData.wLen) = (uint16_t)(bBuffIdx + PHLIBNFC_MFC_AUTHKEYLEN);
   1842                         status = NFCSTATUS_SUCCESS;
   1843                     }
   1844                     else
   1845                     {
   1846                         /* do nothing */
   1847                     }
   1848                 }
   1849             }
   1850             else
   1851             {
   1852                 status = NFCSTATUS_INVALID_PARAMETER;
   1853             }
   1854         }
   1855         break;
   1856 
   1857         case phNfc_eMifareRaw:
   1858         {
   1859 
   1860         }
   1861         break;
   1862 
   1863         default:
   1864         {
   1865             status = NFCSTATUS_INVALID_PARAMETER;
   1866             break;
   1867         }
   1868     }
   1869 
   1870     return status;
   1871 }
   1872 
   1873 /*******************************************************************************
   1874 **
   1875 ** Function         phLibNfc_MapCmds
   1876 **
   1877 ** Description      This function maps the command request from libnfc level to nci level
   1878 **
   1879 ** Returns          NFCSTATUS_SUCCESS           - Mapping of command is successful
   1880 **                  NFCSTATUS_INVALID_PARAMETER - One or more of the supplied
   1881 **                  parameters could not be interpreted properly
   1882 **
   1883 *******************************************************************************/
   1884 STATIC NFCSTATUS phLibNfc_MapCmds(phNciNfc_RFDevType_t         RemDevType,
   1885                            phNfc_sTransceiveInfo_t*  pTransceiveInfo,
   1886                            pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1887 {
   1888 
   1889     NFCSTATUS status = NFCSTATUS_SUCCESS;
   1890 
   1891     if((NULL == pTransceiveInfo) || (NULL == pMappedTranscvIf))
   1892     {
   1893         return NFCSTATUS_FAILED;
   1894     }
   1895     switch(RemDevType)
   1896     {
   1897         case phNciNfc_eMifare1k_PICC:
   1898         case phNciNfc_eMifare4k_PICC:
   1899         {
   1900             status = phLibNfc_MifareMap(pTransceiveInfo,pMappedTranscvIf);
   1901             break;
   1902         }
   1903         default:
   1904         {
   1905             break;
   1906         }
   1907     }
   1908 
   1909     return status;
   1910 }
   1911 
   1912 /*******************************************************************************
   1913 **
   1914 ** Function         phLibNfc_SendAuthCmd
   1915 **
   1916 ** Description      This function Send authentication command to NFCC
   1917 **
   1918 ** Returns          NFCSTATUS_SUCCESS           - Parameters are proper
   1919 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   1920 **
   1921 *******************************************************************************/
   1922 STATIC NFCSTATUS phLibNfc_SendAuthCmd(phNfc_sTransceiveInfo_t *pTransceiveInfo,
   1923                                       phNciNfc_TransceiveInfo_t  *tNciTranscvInfo)
   1924 {
   1925     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1926 
   1927     wStatus = phLibNfc_MapCmds(phNciNfc_eMifare1k_PICC, pTransceiveInfo, tNciTranscvInfo);
   1928 
   1929     return wStatus;
   1930 }
   1931 
   1932 /*******************************************************************************
   1933 **
   1934 ** Function         phLibNfc_SendWrt16Cmd
   1935 **
   1936 ** Description      This function maps Mifarewirte16 commands
   1937 **
   1938 ** Returns          NFCSTATUS_SUCCESS           - Parameters are mapped
   1939 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   1940 **
   1941 *******************************************************************************/
   1942 STATIC NFCSTATUS phLibNfc_SendWrt16Cmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1943                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   1944 {
   1945     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1946     uint8_t bBuffIdx = 0x00;
   1947 
   1948     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1949         (0 != (pTransceiveInfo->sSendData.length)))
   1950     {
   1951         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = phNfc_eMifareWrite16;
   1952         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1953         pMappedTranscvIf->tSendData.wLen              = bBuffIdx;
   1954         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1955     }
   1956     else
   1957     {
   1958         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1959     }
   1960 
   1961     return wStatus;
   1962 }
   1963 
   1964 /*******************************************************************************
   1965 **
   1966 ** Function         phLibNfc_SendIncDecCmd
   1967 **
   1968 ** Description      This function prepares the Increment/Decrement command
   1969 **                  to be sent, increment/decrement value is sent separately
   1970 **
   1971 ** Returns          NFCSTATUS_SUCCESS           - Params are mapped
   1972 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   1973 **
   1974 *******************************************************************************/
   1975 STATIC NFCSTATUS phLibNfc_SendIncDecCmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   1976                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf,
   1977                                     uint8_t IncDecCmd)
   1978 {
   1979     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   1980     uint8_t bBuffIdx = 0x00;
   1981 
   1982     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   1983         (0 != (pTransceiveInfo->sSendData.length)))
   1984     {
   1985         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = IncDecCmd;
   1986         pMappedTranscvIf->tSendData.pBuff[bBuffIdx++] = pTransceiveInfo->addr;
   1987         pMappedTranscvIf->tSendData.wLen              = bBuffIdx;
   1988         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   1989     }
   1990     else
   1991     {
   1992         wStatus = NFCSTATUS_INVALID_PARAMETER;
   1993     }
   1994 
   1995     return wStatus;
   1996 }
   1997 
   1998 /*******************************************************************************
   1999 **
   2000 ** Function         phLibNfc_SendRawCmd
   2001 **
   2002 ** Description      This function maps Mifare raw command
   2003 **
   2004 ** Returns          NFCSTATUS_SUCCESS           - Parameters are mapped
   2005 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   2006 **
   2007 *******************************************************************************/
   2008 STATIC NFCSTATUS phLibNfc_SendRawCmd(phNfc_sTransceiveInfo_t*    pTransceiveInfo,
   2009                                     pphNciNfc_TransceiveInfo_t   pMappedTranscvIf)
   2010 {
   2011     NFCSTATUS wStatus = NFCSTATUS_SUCCESS;
   2012 //    uint8_t bBuffIdx = 0x00;                                  /*commented to eliminate unused variable warning*/
   2013 
   2014     if( (NULL != pTransceiveInfo->sSendData.buffer) &&
   2015         (0 != (pTransceiveInfo->sSendData.length)))
   2016     {
   2017         memcpy(pMappedTranscvIf->tSendData.pBuff, pTransceiveInfo->sSendData.buffer,
   2018                               (pTransceiveInfo->sSendData.length));
   2019         pMappedTranscvIf->tSendData.wLen              = pTransceiveInfo->sSendData.length;
   2020         pMappedTranscvIf->uCmd.T2TCmd                 = phNciNfc_eT2TRaw;
   2021     }
   2022     else
   2023     {
   2024         wStatus = NFCSTATUS_INVALID_PARAMETER;
   2025     }
   2026 
   2027     return wStatus;
   2028 }
   2029 
   2030 /*******************************************************************************
   2031 **
   2032 ** Function         phFriNfc_ExtnsTransceive
   2033 **
   2034 ** Description      This function maps Mifare raw command and send it to NFCC
   2035 **
   2036 ** Returns          NFCSTATUS_PENDING           - Operation successful
   2037 **                  NFCSTATUS_INVALID_PARAMETER - Otherwise
   2038 **
   2039 *******************************************************************************/
   2040 NFCSTATUS phFriNfc_ExtnsTransceive(phNfc_sTransceiveInfo_t *pTransceiveInfo,
   2041                                    phNfc_uCmdList_t Cmd,
   2042                                    uint8_t *SendRecvBuf,
   2043                                    uint16_t SendLength,
   2044                                    uint16_t *SendRecvLength)
   2045 {
   2046     (void)SendRecvLength;
   2047     NFCSTATUS status = NFCSTATUS_FAILED;
   2048     uint8_t *buff=NULL;
   2049     uint16_t buffSz=0;
   2050     uint8_t i = 0;
   2051     uint32_t length = SendLength;
   2052     uint8_t restore_payload[]={0x00, 0x00, 0x00, 0x00,};
   2053 
   2054     buff = (uint8_t *)malloc((uint32_t)MAX_BUFF_SIZE);
   2055     if( NULL == buff )
   2056     {
   2057         return status;
   2058     }
   2059 
   2060     pTransceiveInfo->cmd = Cmd;
   2061 
   2062     if( (Cmd.MfCmd == phNfc_eMifareAuthentA) ||
   2063         (Cmd.MfCmd == phNfc_eMifareAuthentB) )
   2064     {
   2065         pTransceiveInfo->addr = SendRecvBuf[i++];
   2066         pTransceiveInfo->sSendData.buffer[4] = SendRecvBuf[i++];
   2067         pTransceiveInfo->sSendData.buffer[5] = SendRecvBuf[i++];
   2068         pTransceiveInfo->sSendData.buffer[6] = SendRecvBuf[i++];
   2069         pTransceiveInfo->sSendData.buffer[7] = SendRecvBuf[i++];
   2070         pTransceiveInfo->sSendData.buffer[8] = SendRecvBuf[i++];
   2071         pTransceiveInfo->sSendData.buffer[9] = SendRecvBuf[i++];
   2072 
   2073         pTransceiveInfo->cmd.MfCmd = Cmd.MfCmd;
   2074 
   2075         pTransceiveInfo->sSendData.length = length;
   2076         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2077         status = phLibNfc_MifareMap(pTransceiveInfo, &tNciTranscvInfo);
   2078     }
   2079     else if( Cmd.MfCmd == phNfc_eMifareWrite16 )
   2080     {
   2081         pTransceiveInfo->addr = SendRecvBuf[i++];
   2082         length = SendLength - i;
   2083         memcpy(pTransceiveInfo->sSendData.buffer, &SendRecvBuf[i], length);
   2084         pTransceiveInfo->sSendData.length = length;
   2085         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2086 
   2087         gphNxpExtns_Context.writecmdFlag = TRUE;
   2088 
   2089         status = phLibNfc_SendWrt16Cmd(pTransceiveInfo, &tNciTranscvInfo);
   2090     }
   2091     else if( (Cmd.MfCmd == phNfc_eMifareInc) || (Cmd.MfCmd == phNfc_eMifareDec) )
   2092     {
   2093         pTransceiveInfo->addr = SendRecvBuf[i++];
   2094         length = SendLength - i;
   2095         memcpy(pTransceiveInfo->sSendData.buffer, &SendRecvBuf[i], length);
   2096         pTransceiveInfo->sSendData.length = length;
   2097         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2098 
   2099         gphNxpExtns_Context.incrdecflag = TRUE;
   2100 
   2101         status = phLibNfc_SendIncDecCmd(pTransceiveInfo, &tNciTranscvInfo, Cmd.MfCmd);
   2102 
   2103     }
   2104     else if(Cmd.MfCmd == phNfc_eMifareRestore)
   2105     {
   2106         pTransceiveInfo->addr = SendRecvBuf[i++];
   2107         length = SendLength - i;
   2108         memcpy(pTransceiveInfo->sSendData.buffer, &restore_payload[0], sizeof(restore_payload));
   2109         pTransceiveInfo->sSendData.length = length + sizeof(restore_payload);
   2110         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2111 
   2112         gphNxpExtns_Context.incrdecflag = TRUE;
   2113 
   2114         status = phLibNfc_SendIncDecCmd(pTransceiveInfo, &tNciTranscvInfo, Cmd.MfCmd);
   2115 
   2116     }
   2117     else if ((Cmd.MfCmd == phNfc_eMifareRaw) || (Cmd.MfCmd == phNfc_eMifareTransfer ))
   2118     {
   2119         pTransceiveInfo->cmd.MfCmd = (phNfc_eMifareCmdList_t) phNciNfc_eT2TRaw;
   2120         memcpy(pTransceiveInfo->sSendData.buffer, SendRecvBuf, length);
   2121         pTransceiveInfo->sSendData.length = length;
   2122         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2123         status = phLibNfc_SendRawCmd(pTransceiveInfo, &tNciTranscvInfo);
   2124     }
   2125     else
   2126     {
   2127         pTransceiveInfo->addr = SendRecvBuf[i++];
   2128         length = SendLength - i;
   2129         memcpy(pTransceiveInfo->sSendData.buffer, &SendRecvBuf[i], length);
   2130         pTransceiveInfo->sSendData.length = length;
   2131         pTransceiveInfo->sRecvData.length = MAX_BUFF_SIZE;
   2132         status = phLibNfc_MifareMap(pTransceiveInfo, &tNciTranscvInfo);
   2133     }
   2134 
   2135     if (NFCSTATUS_SUCCESS == status )
   2136     {
   2137         status = phNciNfc_SendMfReq(tNciTranscvInfo, buff, &buffSz);
   2138         if (NFCSTATUS_PENDING != status)
   2139         {
   2140             NXPLOG_EXTNS_E("ERROR : phNciNfc_SendMfReq()");
   2141         }
   2142     }
   2143     else
   2144     {
   2145         NXPLOG_EXTNS_E (" ERROR : Sending phNciNfc_SendMfReq");
   2146     }
   2147     if( buff != NULL )
   2148     {
   2149         free(buff);
   2150         buff = NULL;
   2151     }
   2152 
   2153     return status;
   2154 }
   2155