Home | History | Annotate | Download | only in src
      1 /*
      2  * Copyright (C) 2010 NXP Semiconductors
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /*!
     18 * \file  phFriNfcNdefMap.c
     19 * \brief NFC Ndef Mapping For Different Smart Cards.
     20 *
     21 * Project: NFC-FRI
     22 *
     23 * $Date: Mon Dec 13 14:14:12 2010 $
     24 * $Author: ing02260 $
     25 * $Revision: 1.39 $
     26 * $Aliases:  $
     27 *
     28 */
     29 
     30 
     31 #include <phFriNfc_NdefMap.h>
     32 
     33 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
     34 #include <phFriNfc_MifareULMap.h>
     35 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
     36 
     37 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
     38 #include <phFriNfc_TopazMap.h>
     39 #endif  /* PH_FRINFC_MAP_TOPAZ_DISABLED */
     40 
     41 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
     42 #include <phFriNfc_MifareStdMap.h>
     43 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
     44 
     45 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
     46 #include <phFriNfc_DesfireMap.h>
     47 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
     48 
     49 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
     50 #include <phFriNfc_FelicaMap.h>
     51 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
     52 
     53 #ifndef PH_FRINFC_MAP_ISO15693_DISABLED
     54 #include <phFriNfc_ISO15693Map.h>
     55 #endif  /* PH_FRINFC_MAP_ISO15693_DISABLED */
     56 
     57 #ifdef PHFRINFC_OVRHAL_MOCKUP
     58 #include <phFriNfc_MockupMap.h>
     59 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
     60 
     61 
     62 #include <phFriNfc_OvrHal.h>
     63 
     64 /*! \ingroup grp_file_attributes
     65 *  \name NDEF Mapping
     66 *
     67 * File: \ref phFriNfcNdefMap.c
     68 *
     69 */
     70 /*@{*/
     71 #define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.39 $"
     72 #define PHFRINFCNDEFMAP_FILEALIASES  "$Aliases:  $"
     73 /*@}*/
     74 
     75 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
     76 /* Desfire capability Container Reset Helper */
     77 static void phFriNfc_DesfCapCont_HReset(phFriNfc_NdefMap_t  *NdefMap);
     78 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
     79 
     80 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
     81 /* Felica Smart Tag Reset Helper */
     82 static void phFriNfc_Felica_HReset(phFriNfc_NdefMap_t  *NdefMap);
     83 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
     84 
     85 
     86 /* \note    This function has to be called at the beginning, after creating an
     87 *          instance of \ref phFriNfc_NdefMap_t . Use this function to reset
     88 *          the instance and/or switch to a different underlying device (
     89 *          different NFC device or device mode, or different Remote Device).
     90 */
     91 
     92 NFCSTATUS phFriNfc_NdefMap_Reset(   phFriNfc_NdefMap_t              *NdefMap,
     93                                  void                            *LowerDevice,
     94                                  phHal_sRemoteDevInformation_t   *psRemoteDevInfo,
     95                                  phHal_sDevInputParam_t          *psDevInputParam,
     96                                  uint8_t                         *TrxBuffer,
     97                                  uint16_t                        TrxBufferSize,
     98                                  uint8_t                         *ReceiveBuffer,
     99                                  uint16_t                        *ReceiveLength,
    100                                  uint16_t                        *DataCount)
    101 {
    102     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    103     uint8_t     index;
    104 
    105     if (    (ReceiveLength == NULL) || (NdefMap == NULL) || (psRemoteDevInfo == NULL) ||
    106         (TrxBuffer == NULL) || (TrxBufferSize == 0)  || (LowerDevice == NULL) ||
    107         (*ReceiveLength == 0) || (ReceiveBuffer == NULL) || (DataCount == NULL) ||
    108         (psDevInputParam == NULL) ||
    109         (*ReceiveLength < PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE ))
    110     {
    111         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    112     }
    113     else
    114     {
    115         /* Initialise the state to Init */
    116         NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
    117 
    118         for(index = 0;index<PH_FRINFC_NDEFMAP_CR;index++)
    119         {
    120             /* Initialise the NdefMap Completion Routine to Null */
    121             NdefMap->CompletionRoutine[index].CompletionRoutine = NULL;
    122             /* Initialise the NdefMap Completion Routine context to Null  */
    123             NdefMap->CompletionRoutine[index].Context = NULL;
    124         }
    125 
    126         /* Lower Device(Always Overlapped HAL Struct initialised in application
    127         is registred in NdefMap Lower Device) */
    128         NdefMap->LowerDevice = LowerDevice;
    129 
    130         /* Remote Device info received from Manual Device Discovery is registered here */
    131         NdefMap->psRemoteDevInfo = psRemoteDevInfo;
    132 
    133         /* Transfer Buffer registered */
    134         NdefMap->ApduBuffer = TrxBuffer;
    135 
    136         /* Set the MaxApduBufferSize */
    137         NdefMap->ApduBufferSize = TrxBufferSize;
    138 
    139         /* Set APDU Buffer Index */
    140         NdefMap->ApduBuffIndex = 0;
    141 
    142         /* Register Transfer Buffer Length */
    143         NdefMap->SendLength = 0;
    144 
    145         /* Register Receive Buffer */
    146         NdefMap->SendRecvBuf = ReceiveBuffer;
    147 
    148         /* Register Receive Buffer Length */
    149         NdefMap->SendRecvLength = ReceiveLength;
    150 
    151         /* Register Temporary Receive Buffer Length */
    152         NdefMap->TempReceiveLength = *ReceiveLength;
    153 
    154         /* Register Data Count variable and set it to zero */
    155         NdefMap->DataCount = DataCount;
    156         *NdefMap->DataCount = 0;
    157 
    158         /* Reset the PageOffset */
    159         NdefMap->Offset = 0;
    160 
    161         /* Reset the NumOfBytesRead*/
    162         NdefMap->NumOfBytesRead = 0;
    163 
    164         /* Reset the NumOfBytesWritten*/
    165         NdefMap->NumOfBytesWritten = 0;
    166 
    167         /* Reset the Card Type */
    168         NdefMap->CardType = 0;
    169 
    170         /* Reset the Memory Card Size*/
    171         NdefMap->CardMemSize = 0;
    172 
    173         /* Reset the Previous Operation*/
    174         NdefMap->PrevOperation = 0;
    175 
    176         /* Reset the Desfire Operation Flag*/
    177         NdefMap->DespOpFlag = 0;
    178 
    179         /* Reset MapCompletion Info*/
    180         NdefMap->MapCompletionInfo.CompletionRoutine = NULL;
    181         NdefMap->MapCompletionInfo.Context = NULL;
    182 
    183         /*  Reset the ReadingForWriteOperation flag. */
    184         NdefMap->ReadingForWriteOperation = 0;  /*  FALSE  */
    185 
    186 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
    187         /*Reset Desfire Cap Container elements*/
    188         phFriNfc_DesfCapCont_HReset(NdefMap);
    189 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
    190 
    191 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
    192         /*Reset Mifare Standard Container elements*/
    193         NdefMap->StdMifareContainer.DevInputParam = psDevInputParam;
    194         status = phFriNfc_MifareStdMap_H_Reset(NdefMap);
    195 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
    196 
    197 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
    198         /*Reset Felica Tag elements*/
    199         NdefMap->FelicaPollDetails.DevInputParam = psDevInputParam;
    200         phFriNfc_Felica_HReset(NdefMap);
    201 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
    202 
    203 #if !(defined(PH_FRINFC_MAP_TOPAZ_DISABLED ) || defined (PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED ))
    204 
    205         phFriNfc_TopazMap_H_Reset(NdefMap);
    206 #endif  /* PH_FRINFC_MAP_TOPAZ_DISABLED || PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED  */
    207 
    208 
    209 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
    210         status = phFriNfc_MifareUL_H_Reset(NdefMap);
    211 #endif
    212 
    213 #ifdef PHFRINFC_OVRHAL_MOCKUP
    214         /*Reset Desfire Cap Container elements*/
    215         phFriNfc_Mockup_H_Reset(NdefMap);
    216 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
    217 
    218         /*
    219         *  Fix for PR - 0001256
    220         *  Date- 08-08-08
    221         */
    222         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
    223     }
    224 
    225     return (status);
    226 }
    227 
    228 /*!
    229 * Registering the Completion Routine.
    230 *
    231 * This function requires the caller to set a Completion Routine
    232 * which serves as notifier for the upper component.
    233 * NOTE: Please refer the header file for more information.
    234 *
    235 */
    236 
    237 NFCSTATUS phFriNfc_NdefMap_SetCompletionRoutine(phFriNfc_NdefMap_t     *NdefMap,
    238                                                 uint8_t                 FunctionID,
    239                                                 pphFriNfc_Cr_t          CompletionRoutine,
    240                                                 void                   *CompletionRoutineContext)
    241 {
    242     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    243 
    244     if ( ( NdefMap == NULL ) || (FunctionID >= PH_FRINFC_NDEFMAP_CR) ||
    245         ( CompletionRoutine == NULL) || (CompletionRoutineContext == NULL))
    246     {
    247         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    248     }
    249     else
    250     {
    251         /* Register the application callback with the NdefMap Completion Routine */
    252         NdefMap->CompletionRoutine[FunctionID].CompletionRoutine = CompletionRoutine;
    253 
    254         /* Register the application context with the NdefMap Completion Routine context */
    255         NdefMap->CompletionRoutine[FunctionID].Context = CompletionRoutineContext;
    256     }
    257 
    258     return status;
    259 }
    260 
    261 /*!
    262 * Initiates Reading of NDEF information from the Remote Device.
    263 *
    264 * Remote Peer device may be of type any card. Ex: desfire,felica,jewel
    265 * mifareUL,mifare 1K etc. The function initiates the reading of NDEF
    266 * information from a Remote Device.
    267 *
    268 * This is the main NdefMap read function call.Internally,depending upon
    269 * the CardType,respective mifare/desfire read functions are called.
    270 * In future this can be extended to support any types of card.
    271 *
    272 * It performs a reset of the state and triggers/starts the raed action (state machine).
    273 * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
    274 * has been triggered.
    275 *
    276 * NOTE: Please refer the header file for more information.
    277 *
    278 */
    279 
    280 NFCSTATUS phFriNfc_NdefMap_RdNdef(  phFriNfc_NdefMap_t  *NdefMap,
    281                                   uint8_t             *PacketData,
    282                                   uint32_t            *PacketDataLength,
    283                                   uint8_t             Offset)
    284 {
    285     NFCSTATUS   status = NFCSTATUS_PENDING;
    286 
    287 
    288     /* check for validity of input parameters*/
    289     if (( PacketData == NULL )
    290         || ( NdefMap == NULL )
    291         || ( PacketDataLength == NULL )
    292         || ( *PacketDataLength == 0 )
    293         || ( ( Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ))
    294         || (NdefMap->CompletionRoutine->CompletionRoutine == NULL)
    295         || (NdefMap->CompletionRoutine->Context == NULL )
    296         )
    297     {
    298         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    299     }
    300     else if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
    301     {
    302         /*  Card is in invalid state, cannot have any read/write
    303         operations*/
    304         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
    305             NFCSTATUS_INVALID_FORMAT);
    306     }
    307     else if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)
    308     {
    309         /*  Can't read any data from the card:TLV length is zero*/
    310         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
    311 
    312         NdefMap->NumOfBytesRead = PacketDataLength;
    313         *NdefMap->NumOfBytesRead = 0;
    314 
    315 
    316     }
    317     else if ( (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ))
    318     {
    319         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
    320     }
    321     else
    322     {
    323         /*  Check the offset given by the user
    324         If the offset is 1 (SEEK_BEGIN), reset everything and start
    325         reading from the first Page of the card.
    326         else if offset is 0 (PH_FRINFC_NDEFMAP_SEEK_CUR), continue reading
    327         No need to reset the parameters.  */
    328 
    329         if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
    330         {
    331             NdefMap->ApduBuffIndex = 0;
    332             *NdefMap->DataCount = 0;
    333         }
    334 
    335         if  ( (NdefMap->CardType == PH_FRINFC_NDEFMAP_ISO14443_4A_CARD) &&
    336             (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (*NdefMap->DataCount == 0 ))
    337         {
    338 
    339             /*  A READ operation cannot be done if the previuos operation was WRITE
    340             unless the offset is set to PH_FRINFC_NDEFMAP_SEEK_BEGIN Or
    341             Read Operation with Offset set to Continue & DataCount set to 0 */
    342             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
    343         }
    344         else
    345         {
    346             switch ( NdefMap->CardType)
    347             {
    348 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
    349                 case  PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
    350                     /*  Mifare card selected. Call Mifare read */
    351                     status = phFriNfc_MifareUL_RdNdef ( NdefMap,
    352                         PacketData,
    353                         PacketDataLength,
    354                         Offset);
    355                     break;
    356 #endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
    357 
    358 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
    359                 case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
    360 #ifdef DESFIRE_EV1
    361                 case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 :
    362 #endif /* #ifdef DESFIRE_EV1 */
    363                     /*  Desfire card selected. Call Desfire read */
    364                     status = phFriNfc_Desfire_RdNdef(   NdefMap,
    365                         PacketData,
    366                         PacketDataLength,
    367                         Offset);
    368                     break;
    369 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
    370 
    371 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
    372                 case  PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
    373                 case  PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
    374                     /*  Mifare card selected. Call Mifare read */
    375                     status = phFriNfc_MifareStdMap_RdNdef ( NdefMap,
    376                         PacketData,
    377                         PacketDataLength,
    378                         Offset);
    379                     break;
    380 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
    381 
    382 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
    383                 case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
    384                     /*  Desfire card selected. Call Desfire Write */
    385                     status =  phFriNfc_Felica_RdNdef(  NdefMap,
    386                         PacketData,
    387                         PacketDataLength,
    388                         Offset);
    389                     break;
    390 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
    391 
    392 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
    393                 case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
    394                     /*  Topaz card selected. Call Topaz read */
    395                     status =  phFriNfc_TopazMap_RdNdef(  NdefMap,
    396                         PacketData,
    397                         PacketDataLength,
    398                         Offset);
    399                     break;
    400 #ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
    401                 case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
    402                     /*  Topaz card selected. Call Topaz read */
    403                     status =  phFriNfc_TopazDynamicMap_RdNdef(  NdefMap,
    404                         PacketData,
    405                         PacketDataLength,
    406                         Offset);
    407                     break;
    408 #endif  /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
    409 #endif  /* PH_FRINFC_MAP_TOPAZ_DISABLED */
    410 
    411 #ifndef PH_FRINFC_MAP_ISO15693_DISABLED
    412                 case PH_FRINFC_NDEFMAP_ISO15693_CARD:
    413                     status =  phFriNfc_ISO15693_RdNdef(  NdefMap,
    414                         PacketData,
    415                         PacketDataLength,
    416                         Offset);
    417                     break;
    418 #endif /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */
    419 
    420 #ifdef PHFRINFC_OVRHAL_MOCKUP
    421                 case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
    422                     /*  Mockup card selected. Call Mockup Write */
    423                     status =  phFriNfc_Mockup_RdNdef(  NdefMap,
    424                         PacketData,
    425                         PacketDataLength,
    426                         Offset);
    427                     break;
    428 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
    429 
    430                 default :
    431                     /*  Unknown card type. Return error */
    432                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
    433                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    434 
    435                     break;
    436             }
    437         }
    438     }
    439     return status;
    440 }
    441 
    442 /*!
    443 * Initiates Writing of NDEF information to the Remote Device.
    444 *
    445 * The function initiates the writing of NDEF information to a Remote Device
    446 *
    447 * Remote Peer device may be of type any card. Ex: desfire,felica,jewel
    448 * mifareUL,mifare 1K etc. The function initiates the reading of NDEF
    449 * information from a Remote Device.
    450 *
    451 * This is a main write api.Internally,depending upon the CardType,
    452 * respective mifare/desfire write apis are called.In future this can be
    453 * extended to support any types of card.
    454 *
    455 * It performs a reset of the state and starts the action (state machine).
    456 * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once
    457 * the action has been triggered.
    458 *
    459 * NOTE: Please refer the header file for more information.
    460 *
    461 */
    462 
    463 
    464 NFCSTATUS phFriNfc_NdefMap_WrNdef(  phFriNfc_NdefMap_t  *NdefMap,
    465                                   uint8_t             *PacketData,
    466                                   uint32_t            *PacketDataLength,
    467                                   uint8_t             Offset)
    468 {
    469     NFCSTATUS   status = NFCSTATUS_PENDING;
    470     uint8_t     StatusChk=0;
    471 
    472      if (     (PacketData          == NULL)
    473         ||  ( NdefMap             == NULL )
    474         /* + Mantis 442 */
    475         || ( PacketDataLength    == NULL )
    476         /* - Mantis 442 */
    477         || ( *PacketDataLength   == 0 )
    478         || ((Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ))
    479         || (NdefMap->CompletionRoutine->CompletionRoutine == NULL)
    480         || (NdefMap->CompletionRoutine->Context == NULL)
    481         )
    482     {
    483         /*  Invalid input parameter error   */
    484         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER);
    485     }
    486     else if (( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) &&
    487         (PH_FRINFC_NDEFMAP_TOPAZ_CARD != NdefMap->CardType) &&
    488         (PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD != NdefMap->CardType))
    489     {
    490         /*  Card is in invalid state, cannot have any read/write
    491         operations*/
    492         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
    493             NFCSTATUS_INVALID_FORMAT);
    494     }
    495 
    496     else if ( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY )
    497 
    498     {
    499         /*Can't write to the card :No Grants */
    500         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
    501             NFCSTATUS_NOT_ALLOWED);
    502 
    503         /* set the no. bytes written is zero*/
    504         NdefMap->WrNdefPacketLength = PacketDataLength;
    505         *NdefMap->WrNdefPacketLength = 0;
    506 
    507     }
    508     else
    509     {
    510         /*  Check the offset given by the user
    511         If the offset is 1 (SEEK_BEGIN), reset everything and start
    512         writing from the first Byte of the card.
    513         else if offset is 0 (PH_FRINFC_NDEFMAP_SEEK_CUR), continue writing
    514         No need to reset the parameters.  */
    515          if (( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) &&
    516             (PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD == NdefMap->CardType))
    517         {
    518             /* If Topaz Dynamic card CC bytes are not valid then also allow writing,
    519             If card is really good then writing will be done properly and reading can be performed,
    520             otherwise writing or reading will fail. so, setting card state to
    521             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE */
    522             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE;
    523         }
    524 
    525         if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
    526         {
    527             NdefMap->ApduBuffIndex = 0;
    528             *NdefMap->DataCount = 0;
    529         }
    530 
    531         if ( (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_UL_CARD) ||
    532             (NdefMap->CardType == PH_FRINFC_NDEFMAP_ISO14443_4A_CARD))
    533         {
    534             if (( (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN )) ||
    535                 ( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (*NdefMap->DataCount == 0 )))
    536             {
    537                 /*  A WRITE operation cannot be done if the previuos operation was READ
    538                 unless the offset is set to PH_FRINFC_NDEFMAP_SEEK_BEGIN OR
    539                 Write Operation with Offset set to Continue & DataCount set to 0  */
    540                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
    541                 StatusChk = 1;
    542             }
    543         }
    544         if(StatusChk != 1)
    545         {
    546             NdefMap->WrNdefPacketLength =   PacketDataLength;
    547             switch ( NdefMap->CardType)
    548             {
    549 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
    550                 case  PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
    551                     /*  Mifare card selected. Call Mifare Write */
    552                     status =  phFriNfc_MifareUL_WrNdef( NdefMap,
    553                         PacketData,
    554                         PacketDataLength,
    555                         Offset);
    556                     break;
    557 #endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
    558 
    559 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
    560                 case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
    561 #ifdef DESFIRE_EV1
    562                 case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 :
    563 #endif /* #ifdef DESFIRE_EV1 */
    564                     /*  Desfire card selected. Call Desfire Write */
    565                     status =  phFriNfc_Desfire_WrNdef(  NdefMap,
    566                         PacketData,
    567                         PacketDataLength,
    568                         Offset);
    569                     break;
    570 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
    571 
    572 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
    573                 case  PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
    574                 case  PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
    575                     /*  Mifare card selected. Call Mifare read */
    576                     status = phFriNfc_MifareStdMap_WrNdef ( NdefMap,
    577                         PacketData,
    578                         PacketDataLength,
    579                         Offset);
    580                     break;
    581 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
    582 
    583 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
    584                 case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
    585                     /*  Desfire card selected. Call Desfire Write */
    586                     status =  phFriNfc_Felica_WrNdef(  NdefMap,
    587                         PacketData,
    588                         PacketDataLength,
    589                         Offset);
    590                     break;
    591 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
    592 
    593 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
    594                 case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
    595                     /*  Topaz card selected. Call Topaz Write */
    596                     status =  phFriNfc_TopazMap_WrNdef(  NdefMap,
    597                         PacketData,
    598                         PacketDataLength,
    599                         Offset);
    600                     break;
    601 #ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
    602                 case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
    603                     /*  Topaz card selected. Call Topaz Write */
    604                     status =  phFriNfc_TopazDynamicMap_WrNdef(  NdefMap,
    605                         PacketData,
    606                         PacketDataLength,
    607                         Offset);
    608                     break;
    609 #endif  /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
    610 #endif  /* PH_FRINFC_MAP_TOPAZ_DISABLED */
    611 
    612 #ifndef PH_FRINFC_MAP_ISO15693_DISABLED
    613                 case PH_FRINFC_NDEFMAP_ISO15693_CARD:
    614                     status =  phFriNfc_ISO15693_WrNdef(  NdefMap,
    615                         PacketData,
    616                         PacketDataLength,
    617                         Offset);
    618                     break;
    619 #endif /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */
    620 
    621 
    622 #ifdef PHFRINFC_OVRHAL_MOCKUP
    623                 case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
    624                     /*  Mockup card selected. Call Mockup Write */
    625                     status =  phFriNfc_Mockup_WrNdef(  NdefMap,
    626                         PacketData,
    627                         PacketDataLength,
    628                         Offset);
    629                     break;
    630 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
    631                 default :
    632                     /*  Unknown card type. Return error */
    633                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    634                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    635                     break;
    636             }
    637         }
    638     }
    639     return status;
    640 }
    641 
    642 #ifdef FRINFC_READONLY_NDEF
    643 
    644 NFCSTATUS
    645 phFriNfc_NdefMap_ConvertToReadOnly (
    646     phFriNfc_NdefMap_t          *NdefMap)
    647 {
    648     NFCSTATUS   result = NFCSTATUS_PENDING;
    649 
    650 
    651     /*  Check for ndefmap context and relevant state. Else return error*/
    652     if (NULL == NdefMap)
    653     {
    654         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    655     }
    656     else if ((NdefMap->CompletionRoutine->CompletionRoutine == NULL)
    657         || (NdefMap->CompletionRoutine->Context == NULL))
    658     {
    659         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    660     }
    661     else
    662     {
    663         switch (NdefMap->CardType)
    664         {
    665             case PH_FRINFC_NDEFMAP_TOPAZ_CARD:
    666             {
    667                 result = phFriNfc_TopazMap_ConvertToReadOnly (NdefMap);
    668                 break;
    669             }
    670 
    671             case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD:
    672             {
    673                 result = phFriNfc_TopazDynamicMap_ConvertToReadOnly (NdefMap);
    674                 break;
    675             }
    676 
    677             case PH_FRINFC_NDEFMAP_ISO15693_CARD:
    678             {
    679                 result = phFriNfc_ISO15693_ConvertToReadOnly (NdefMap);
    680                 break;
    681             }
    682 
    683             default:
    684             {
    685                 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    686                                     NFCSTATUS_INVALID_REMOTE_DEVICE);
    687                 break;
    688             }
    689         }
    690     }
    691     return result;
    692 }
    693 
    694 #endif /* #ifdef FRINFC_READONLY_NDEF */
    695 
    696 /*!
    697 * Check whether a particular Remote Device is NDEF compliant.
    698 *
    699 * The function initiates the ndef compliancy check.
    700 *
    701 * This is a main check ndef api.Internally,depending upon the different
    702 * opmodes,respective mifare/desfire checkNdef apis are called.
    703 * In future this can be extended to check any types of card ndef
    704 * compliancy.
    705 *
    706 * It performs a reset of the state and starts the action (state machine).
    707 * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once
    708 * the action has been triggered.
    709 *
    710 * NOTE: Please refer the header file for more information.
    711 *
    712 */
    713 
    714 NFCSTATUS phFriNfc_NdefMap_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
    715 {
    716     NFCSTATUS   status = NFCSTATUS_PENDING;
    717     uint8_t     sak;
    718 
    719 
    720     /*  Check for ndefmap context and relevant state. Else return error*/
    721     if ( NdefMap == NULL )
    722     {
    723         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    724     }
    725     else
    726     {
    727         if( (NdefMap->State !=  PH_FRINFC_NDEFMAP_STATE_RESET_INIT) ||
    728             (NdefMap->psRemoteDevInfo->SessionOpened != 0x01 ) )
    729             /*  Harsha: If SessionOpened is not 1, this means that connect has not happened */
    730         {
    731             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
    732         }
    733         else if ( (NdefMap->CompletionRoutine->CompletionRoutine == NULL) || (NdefMap->CompletionRoutine->Context == NULL ))
    734         {
    735             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    736         }
    737         else
    738         {
    739             /*
    740             * 1.Changed
    741             *   CardInfo106 Replace with the ReaderA_Info.
    742             */
    743 
    744             sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
    745 
    746             /*
    747             * 3. Changed
    748             *    Description: Opmode replace with RemDevType.
    749             */
    750 
    751 
    752             switch ( NdefMap->psRemoteDevInfo->RemDevType )
    753             {
    754 #ifndef PH_FRINFC_MAP_ISO15693_DISABLED
    755             case phHal_eISO15693_PICC:
    756             {
    757                 status = phFriNfc_ISO15693_ChkNdef (NdefMap);
    758                 break;
    759             }
    760 #else /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */
    761             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    762                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
    763 #endif /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */
    764 
    765             case phHal_eMifare_PICC:
    766             case phHal_eISO14443_3A_PICC:
    767                 /*  Remote device is Mifare card . Check for Mifare
    768                 NDEF compliancy */
    769                 if(0x00 == sak)
    770                 {
    771                     /*  The SAK/Sel_Res says the card is of the type
    772                     Mifare UL */
    773 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
    774                     status = phFriNfc_MifareUL_ChkNdef( NdefMap);
    775 #else   /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
    776                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    777                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    778 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
    779                 }
    780                 else if ((0x08 == (sak & 0x18)) ||
    781                         (0x18 == (sak & 0x18)) ||
    782                         (0x01 == sak))
    783                 {
    784                     /*  The SAK/Sel_Res says the card is of the type
    785                     Mifare Standard */
    786 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
    787                     status = phFriNfc_MifareStdMap_ChkNdef( NdefMap);
    788 #else   /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
    789                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    790                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    791 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
    792                 }
    793                 else
    794                 {
    795                     /*  Invalid Mifare UL card, as the remote device
    796                     info - opmode says its a Mifare UL card but,
    797                     The SAK/Sel_Res is wrong */
    798                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    799                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    800                 }
    801                 break;
    802             case phHal_eISO14443_B_PICC:
    803                 {
    804                     status = phFriNfc_Desfire_ChkNdef(NdefMap);
    805                 }
    806                 break;
    807             case  phHal_eISO14443_A_PICC :
    808                 /*  Remote device is Desfire card . Check for Desfire
    809                 NDEF compliancy */
    810                 if(0x20 == (sak & 0x20))
    811                 {
    812                     /*  The SAK/Sel_Res says the card is of the type
    813                     ISO14443_4A */
    814 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
    815                     status = phFriNfc_Desfire_ChkNdef(NdefMap);
    816 #else   /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
    817                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    818                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    819 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
    820                 }
    821                 else
    822                 {
    823                     /*  Invalid Desfire card, as the remote device
    824                     info - opmode says its a desfire card but,
    825                     The SAK/Sel_Res is wrong */
    826                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    827                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    828                 }
    829                 break;
    830 
    831             case phHal_eFelica_PICC:
    832 
    833                 /*Set the OpMode Type Flag*/
    834 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
    835 #ifndef PH_HAL4_ENABLE
    836                 NdefMap->OpModeType[0] = phHal_eOpModesFelica212;
    837                 NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator;
    838 #endif /* #ifndef PH_HAL4_ENABLE */
    839                 status = phFriNfc_Felica_ChkNdef(NdefMap);
    840 #else   /* PH_FRINFC_MAP_FELICA_DISABLED*/
    841                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    842                     NFCSTATUS_INVALID_REMOTE_DEVICE);
    843 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED*/
    844 
    845                 break;
    846 
    847 #ifndef PH_HAL4_ENABLE
    848 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
    849             case phHal_eFelica424:
    850                 /*Set the OpMode Ttype Flag*/
    851                 NdefMap->OpModeType[0] = phHal_eOpModesFelica424;
    852                 NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator;
    853                 status = phFriNfc_Felica_ChkNdef(NdefMap);
    854 #else   /* PH_FRINFC_MAP_FELICA_DISABLED*/
    855                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    856                     NFCSTATUS_INVALID_REMOTE_DEVICE);
    857 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED*/
    858                 break;
    859 #endif
    860 
    861             case phHal_eJewel_PICC :
    862                 /*  Remote device is Topaz card . Check for Topaz
    863                 NDEF compliancy */
    864 #ifdef PH_HAL4_ENABLE
    865 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
    866             /* Decide on the Header bytes to know the
    867                    Type of the Topaz card.Card could be Static or
    868                    Dynamic type. These are of type NFFC-NDEF Data Application*/
    869                 if ( NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.HeaderRom0
    870                                 == PH_FRINFC_TOPAZ_HEADROM0_VAL)
    871                 {
    872 
    873                         status = phFriNfc_TopazMap_ChkNdef(NdefMap);
    874                 }
    875 #ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
    876                 else if( NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.HeaderRom0
    877                                 == PH_FRINFC_TOPAZ_DYNAMIC_HEADROM0_VAL)
    878                 {
    879 
    880                     status = phFriNfc_TopazDynamicMap_ChkNdef(NdefMap);
    881                 }
    882 #endif
    883                 else
    884                 {
    885 
    886                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    887                            NFCSTATUS_INVALID_REMOTE_DEVICE);
    888 
    889                 }
    890 #endif
    891 
    892 
    893 #else
    894                 if(0xC2 == sak)
    895                 {
    896                     /*  The SAK/Sel_Res says the card is of the type
    897                     ISO14443_4A */
    898 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
    899                     status = phFriNfc_TopazMap_ChkNdef(NdefMap);
    900 #else   /* PH_FRINFC_MAP_TOPAZ_DISABLED*/
    901                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    902                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    903 #endif  /* PH_FRINFC_MAP_TOPAZ_DISABLED*/
    904                 }
    905                 else
    906                 {
    907                     /*  Invalid Topaz card, as the remote device
    908                     info - opmode says its a desfire card but,
    909                     The SAK/Sel_Res is wrong */
    910                     status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    911                         NFCSTATUS_INVALID_REMOTE_DEVICE);
    912                 }
    913 #endif
    914                 break;
    915 
    916 #ifdef PHFRINFC_OVRHAL_MOCKUP
    917             case phHal_eOpModesMockup :
    918                 /*Set the OpMode Ttype Flag*/
    919                 NdefMap->OpModeType[0] = phHal_eOpModesMockup;
    920                 NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator;
    921                 status = phFriNfc_Mockup_ChkNdef(NdefMap);
    922                 break;
    923 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
    924 
    925             default :
    926                 /*  Remote device is not recognised.
    927                 Probably not NDEF compliant */
    928                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    929                     NFCSTATUS_INVALID_REMOTE_DEVICE);
    930                 break;
    931             }
    932         }
    933     }
    934     return status;
    935 }
    936 
    937 
    938 /*!
    939 * \brief Completion Routine, Processing function, needed to avoid long blocking.
    940 * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
    941 *       Routine in order to be able to notify the component that an I/O has finished and data are
    942 *       ready to be processed.
    943 * This is a main Ndef Map Process api.Internally,depending upon the different
    944 * CardTypes,respective mifare/desfire process functions are called.
    945 *
    946 */
    947 
    948 void phFriNfc_NdefMap_Process(  void        *Context,
    949                               NFCSTATUS   Status)
    950 {
    951 
    952     if ( Context != NULL )
    953     {
    954         phFriNfc_NdefMap_t  *NdefMap = (phFriNfc_NdefMap_t *)Context;
    955         /*
    956         * 4 Changed
    957         *   Description: Opmode replace with RevDevTyp.
    958         */
    959 
    960         switch ( NdefMap->psRemoteDevInfo->RemDevType )
    961         {
    962         case  phHal_eMifare_PICC :
    963         case phHal_eISO14443_3A_PICC:
    964 
    965             if((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) ||
    966                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
    967             {
    968 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
    969                 /*  Remote device is Mifare Standard card */
    970                 phFriNfc_MifareStdMap_Process(NdefMap,Status);
    971 #else   /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
    972                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    973                     NFCSTATUS_INVALID_REMOTE_DEVICE);
    974 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
    975             }
    976             else
    977             {
    978 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
    979                 /*  Remote device is Mifare UL card */
    980                 phFriNfc_MifareUL_Process(NdefMap,Status);
    981 #else   /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
    982                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    983                     NFCSTATUS_INVALID_REMOTE_DEVICE);
    984 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
    985             }
    986             break;
    987 
    988         case phHal_eISO14443_A_PICC :
    989 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
    990             /*  Remote device is Desfire card */
    991             phFriNfc_Desfire_Process(NdefMap, Status);
    992 #else   /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
    993             Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    994                 NFCSTATUS_INVALID_REMOTE_DEVICE);
    995 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
    996             break;
    997         case phHal_eISO14443_B_PICC:
    998             /*  Remote device is Desfire card */
    999             phFriNfc_Desfire_Process(NdefMap, Status);
   1000             break;
   1001 
   1002         case phHal_eFelica_PICC :
   1003 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
   1004             /*  Remote device is Felica Smart card */
   1005             phFriNfc_Felica_Process(NdefMap, Status);
   1006 #else   /* PH_FRINFC_MAP_FELICA_DISABLED*/
   1007             Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1008                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   1009 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED*/
   1010             break;
   1011 
   1012         case phHal_eJewel_PICC:
   1013 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
   1014             if ( NdefMap->CardType == PH_FRINFC_NDEFMAP_TOPAZ_CARD )
   1015             {
   1016                 /*  Remote device is Topaz Smart card */
   1017                 phFriNfc_TopazMap_Process(NdefMap, Status);
   1018             }
   1019 #ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
   1020             else if ( NdefMap->CardType == PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD )
   1021             {
   1022                 /*  Remote device is Topaz Smart card */
   1023                 phFriNfc_TopazDynamicMap_Process(NdefMap, Status);
   1024             }
   1025             else
   1026             {
   1027                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1028                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   1029 
   1030             }
   1031             break;
   1032 #endif  /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED*/
   1033 #endif
   1034 
   1035 
   1036 #ifdef PHFRINFC_OVRHAL_MOCKUP
   1037         case phHal_eOpModesMockup:
   1038             /*  Remote device is Desfire card */
   1039             phFriNfc_Mockup_Process(NdefMap, Status);
   1040             break;
   1041 #endif  /* PHFRINFC_OVRHAL_MOCKUP*/
   1042         default :
   1043             /*  Remote device opmode not recognised.
   1044             Probably not NDEF compliant */
   1045             Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1046                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   1047             /* set the state back to the Reset_Init state*/
   1048             NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
   1049 
   1050             /* set the completion routine*/
   1051             NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_INVALID_OPE].
   1052                 CompletionRoutine(NdefMap->CompletionRoutine->Context, Status);
   1053             break;
   1054         }
   1055     }
   1056     else
   1057     {
   1058         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
   1059             NFCSTATUS_INVALID_PARAMETER);
   1060         /* The control should not come here. As Context itself is NULL ,
   1061         Can't call the CR*/
   1062     }
   1063 }
   1064 
   1065 #if 0
   1066 
   1067 NFCSTATUS phFriNfc_ChkAndParseTLV(phFriNfc_NdefMap_t    *NdefMap)
   1068 {
   1069     NFCSTATUS status = NFCSTATUS_PENDING;
   1070 
   1071     switch ( NdefMap->CardType )
   1072     {
   1073 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
   1074             case  PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
   1075 
   1076 
   1077                 break;
   1078 #endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
   1079 
   1080 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
   1081             case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
   1082                 status = phFriNfc_Desf_ChkAndParseTLV(NdefMap);
   1083                 return (status);
   1084 
   1085                 break;
   1086 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
   1087 
   1088 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
   1089             case  PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
   1090             case  PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
   1091 
   1092                 break;
   1093 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
   1094 
   1095 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
   1096             case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
   1097                 ;
   1098                 break;
   1099 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
   1100 
   1101             default :
   1102                 /*  Unknown card type. Return error */
   1103                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
   1104                     NFCSTATUS_INVALID_REMOTE_DEVICE);
   1105 
   1106                 break;
   1107     }
   1108 
   1109     return ( status);
   1110 }
   1111 #endif
   1112 
   1113 
   1114 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
   1115 static void phFriNfc_DesfCapCont_HReset(phFriNfc_NdefMap_t *NdefMap)
   1116 {
   1117     /* Initialise/reset the desfire capability contatiner structure variables*/
   1118     NdefMap->DesfireCapContainer.DesfVersion = 0;
   1119     NdefMap->DesfireCapContainer.NdefMsgFid  = 0;
   1120     NdefMap->DesfireCapContainer.NdefFileSize = 0;
   1121     NdefMap->DesfireCapContainer.MaxCmdSize  = 0;
   1122     NdefMap->DesfireCapContainer.MaxRespSize = 0;
   1123     NdefMap->DesfireCapContainer.ReadAccess  = 0;
   1124     NdefMap->DesfireCapContainer.WriteAccess = 0;
   1125 }
   1126 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
   1127 
   1128 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
   1129 static void phFriNfc_Felica_HReset(phFriNfc_NdefMap_t *NdefMap)
   1130 {
   1131     uint8_t index=0;
   1132 
   1133     /* Initialise/reset the different felica structure variables*/
   1134     /* Reset all the felica Basic staruture variables*/
   1135     NdefMap->Felica.CurBlockNo = 0;
   1136 
   1137     for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_BLOCK_SIZE;index++)
   1138     {
   1139         NdefMap->Felica.Rd_BytesToCopyBuff[index] = 0;
   1140         NdefMap->Felica.Wr_RemainedBytesBuff[index] = 0;
   1141     }
   1142     NdefMap->Felica.Rd_NoBytesToCopy = 0;
   1143     NdefMap->Felica.Wr_BytesRemained = 0;
   1144 
   1145 
   1146     /* Reset all the felica attribute information staruture variables*/
   1147     for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_ATTR_NDEF_DATA_LEN;index++)
   1148     {
   1149         NdefMap->FelicaAttrInfo.LenBytes[index] = 0;
   1150     }
   1151 
   1152     NdefMap->FelicaAttrInfo.Nmaxb = 0;
   1153     NdefMap->FelicaAttrInfo.Nbr = 0;
   1154     NdefMap->FelicaAttrInfo.Nbw= 0;
   1155     NdefMap->FelicaAttrInfo.RdWrFlag = 0;
   1156     NdefMap->FelicaAttrInfo.WriteFlag = 0;
   1157     NdefMap->Felica.CurrBytesRead=0;
   1158 
   1159     /* Reset all the felica manufacture details staruture variables*/
   1160     for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_MANUF_ID_DATA_LEN;index++)
   1161     {
   1162         NdefMap->FelicaManufDetails.ManufID[index] = 0;
   1163         NdefMap->FelicaManufDetails.ManufParameter[index] = 0;
   1164     }
   1165     NdefMap->Felica.NoBlocksWritten=0;
   1166 }
   1167 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
   1168 
   1169 NFCSTATUS phFriNfc_NdefMap_EraseNdef(phFriNfc_NdefMap_t *NdefMap)
   1170 {
   1171     NFCSTATUS   status = NFCSTATUS_PENDING;
   1172 
   1173     static uint8_t     PktData[3] = PH_FRINFC_NDEFMAP_EMPTY_NDEF_MSG;
   1174     uint8_t     MemOffset = PH_FRINFC_NDEFMAP_SEEK_BEGIN;
   1175     static uint32_t    PacketDataLength = sizeof(PktData);
   1176 
   1177     if (NdefMap == NULL )
   1178     {
   1179         /*  Invalid input parameter error   */
   1180         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER);
   1181     }
   1182     else
   1183     {
   1184         switch ( NdefMap->CardType)
   1185         {
   1186 #ifdef PHFRINFC_OVRHAL_MOCKUP
   1187             case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
   1188 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
   1189             case  PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
   1190             case  PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
   1191 #ifdef DESFIRE_EV1
   1192             case  PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 :
   1193 #endif /* #ifdef DESFIRE_EV1 */
   1194             case  PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
   1195             case  PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
   1196 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
   1197             case  PH_FRINFC_NDEFMAP_TOPAZ_CARD :
   1198 #ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
   1199             case  PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
   1200 #endif
   1201 #ifndef PH_FRINFC_MAP_ISO15693_DISABLED
   1202             case PH_FRINFC_NDEFMAP_ISO15693_CARD:
   1203 #endif
   1204 #endif
   1205                 /*  Mifare card selected. Call Mifare Write */
   1206                 status =  phFriNfc_NdefMap_WrNdef( NdefMap,
   1207                     PktData,
   1208                     &PacketDataLength,
   1209                     MemOffset);
   1210                 break;
   1211 
   1212             case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
   1213 
   1214 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
   1215                 /*  Felica card selected. Call to write EMPTY NDEF Msg */
   1216                 status =  phFriNfc_Felica_EraseNdef( NdefMap );
   1217 #else   /* PH_FRINFC_MAP_FELICA_DISABLED*/
   1218                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1219                     NFCSTATUS_INVALID_REMOTE_DEVICE);
   1220 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED*/
   1221 
   1222                 break;
   1223             default :
   1224                 /*  Unknown card type. Return error */
   1225                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1226                     NFCSTATUS_INVALID_REMOTE_DEVICE);
   1227                 break;
   1228         }
   1229     }
   1230     return status;
   1231 }
   1232 /*  Harsha: Fix for the mantis entry 0000420: NDEF_MAP: Size of NDEF data:
   1233 no abstracted way for user to know how many bytes to read/write  */
   1234 
   1235 /*!
   1236 * \brief Helper API, exposed to the user to enable him to know the size
   1237 *        of the NDEF data that he can write in to the card.
   1238 */
   1239 NFCSTATUS phFriNfc_NdefMap_GetContainerSize(const phFriNfc_NdefMap_t *NdefMap,uint32_t *maxSize, uint32_t *actualSize)
   1240 {
   1241     NFCSTATUS   result = NFCSTATUS_SUCCESS;
   1242     uint8_t     sect_index = 0;
   1243     uint8_t     actual_sect_index = 0;
   1244     uint8_t     count_index = 0;
   1245 
   1246     if( (NdefMap == NULL) || (maxSize == NULL) || (actualSize == NULL))
   1247     {
   1248         /*  Invalid input parameter error   */
   1249         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER);
   1250     }
   1251     else
   1252     {
   1253         /*  Which card ? */
   1254         switch(NdefMap->CardType)
   1255         {
   1256 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
   1257             case  PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
   1258                 /*  Mifare UL card */
   1259                 /*  The integration needs to ensure that the checkNdef
   1260                 function has been called before calling this function,
   1261                 otherwise NdefMap->CardMemSize will be 0 */
   1262                 *maxSize = NdefMap->MifareULContainer.RemainingSize;
   1263                 /* In Mifare UL card, the actual size is the length field
   1264                 value of the TLV */
   1265                 *actualSize = NdefMap->TLVStruct.ActualSize;
   1266                 break;
   1267 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
   1268 
   1269 #ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
   1270             case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
   1271 #ifdef DESFIRE_EV1
   1272             case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 :
   1273 #endif /* #ifdef DESFIRE_EV1 */
   1274                 /*  Desfire card */
   1275                 /*  The integration needs to ensure that the checkNdef
   1276                 function has been called before calling this function,
   1277                 otherwise NdefMap->DesfireCapContainer.NdefFileSize
   1278                 will be 0 */
   1279                 /* -2 bytes represents the size field bytes*/
   1280                 *maxSize = NdefMap->DesfireCapContainer.NdefFileSize - 2;
   1281                 /* In Desfire card, the actual size cant be calculated so
   1282                 the actual size is given as 0xFFFFFFFF */
   1283                 *actualSize = NdefMap->DesfireCapContainer.NdefDataLen;
   1284                 break;
   1285 #endif  /* PH_FRINFC_MAP_DESFIRE_DISABLED */
   1286 
   1287 #ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
   1288             case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
   1289                 /*  Topaz card */
   1290                 /*  The integration needs to ensure that the checkNdef
   1291                 function has been called before calling this function,
   1292                 otherwise NdefMap->CardMemSize will be 0 */
   1293                 *maxSize = NdefMap->TopazContainer.RemainingSize;
   1294                 /* In Topaz card, the actual size is the length field value of the
   1295                 TLV */
   1296                 *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV;
   1297                 break;
   1298 #ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
   1299             case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
   1300                 /*  Topaz 512 card */
   1301                 /*  The integration needs to ensure that the checkNdef
   1302                 function has been called before calling this function,
   1303                 otherwise NdefMap->CardMemSize will be 0 */
   1304                 *maxSize = NdefMap->TopazContainer.NDEFRWSize;
   1305                 /* In Topaz card, the actual size is the length field value of the
   1306                 TLV */
   1307                 *actualSize = NdefMap->TopazContainer.ActualNDEFMsgSize;
   1308                 break;
   1309 
   1310 #endif  /* PH_FRINFC_MAP_TOPAZ_DISABLED */
   1311 #endif  /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
   1312 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
   1313             case  PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
   1314             case  PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
   1315                 /*  Mifare std card */
   1316 
   1317                 /*  Max size is the number of NDEF compliant blocks in the card
   1318                 multiplied by 16 bytes */
   1319 #ifndef PH_HAL4_ENABLE
   1320 
   1321                 *maxSize = NdefMap->StdMifareContainer.remainingSize;
   1322 
   1323 #else /* #ifndef PH_HAL4_ENABLE */
   1324 
   1325                 while ((PH_FRINFC_MIFARESTD_NDEF_COMP ==
   1326                         NdefMap->StdMifareContainer.aid[count_index]) &&
   1327                         (count_index <
   1328                         PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK))
   1329                 {
   1330                     actual_sect_index++;
   1331                     count_index++;
   1332                 }
   1333                 /* Total number of sectors in 1k = 16 (0 to 15, MAD sector number = 0)
   1334                     Total number of sectors in 4k = 40 (0 to 39,
   1335                         MAD sector number = 0 and 16, After block number 31, each sector
   1336                         has 16 blocks)
   1337                     Every last block of the sector is the sector header, So the blocks
   1338                     that can be read or written in each sector is always
   1339                         (number of blocks in each sector - 1)
   1340                     No of blocks in the one sector till the sector number 0 to 31
   1341                         (total 32 sectors) =
   1342                         4 blocks, So blocks that can be read/write = (4 - 1 = 3 blocks)
   1343                     No of blocks in the one sector after the sector number 31 to 39 =
   1344                         16 blocks, So blocks that can be read/write = (16 - 1 = 15 blocks)
   1345                     Each block has 16 bytes
   1346                     To calculate number of bytes in the sector, depending on the number
   1347                     of blocks multiplied by 16
   1348                 */
   1349                 if (PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ==
   1350                     NdefMap->CardType)
   1351                 {
   1352                     if (actual_sect_index > 32)
   1353                     {
   1354                         sect_index = (actual_sect_index - 32);
   1355                         /* Here, 30 is used because block number 0 and 16 are MAD blocks
   1356                         which cannot be used for reading and writing data
   1357                         3 and 15 are blocks in each sector which can be read/write
   1358                         3 indicates the sector is in between (0 and 31)
   1359                         15 indicates the sector is in between (32 to 39)
   1360                         16 is always number of bytes in each block
   1361                         4 is used because each NDEF write has to write using the
   1362                             TLV format and T & L takes 4 bytes length and V is the
   1363                             input data
   1364                         */
   1365                         *maxSize = (((30 * (16 * 3)) + (sect_index * (16 * 15))) - 4);
   1366                     }
   1367                     else if (actual_sect_index <= 16)
   1368                     {
   1369                         *maxSize = (((actual_sect_index - 1) * (16 * 3)) - 4);
   1370                     }
   1371                     else
   1372                     {
   1373                         *maxSize = (((actual_sect_index - 2)  * (16 * 3)) - 4);
   1374                     }
   1375                 }
   1376                 else
   1377                 {
   1378                     /* Here, 16 is always number of bytes in each block
   1379                         3 indicates the sector is in between (0 and 31) */
   1380                     if (actual_sect_index > NdefMap->StdMifareContainer.SectorIndex)
   1381                     {
   1382                         actual_sect_index = NdefMap->StdMifareContainer.SectorIndex;
   1383                     }
   1384                     *maxSize = (((actual_sect_index - 1) * (16 * 3)) - 4);
   1385                 }
   1386 
   1387 #endif /* #ifndef PH_HAL4_ENABLE */
   1388                 *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV;
   1389 
   1390                 break;
   1391 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
   1392 
   1393 #ifndef PH_FRINFC_MAP_FELICA_DISABLED
   1394             case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
   1395                 /*  Felica card */
   1396 
   1397                 *maxSize = NdefMap->FelicaAttrInfo.Nmaxb * 0x10;
   1398 
   1399                 /* In Felica Card, actual size is calculated using the Length Bytes */
   1400                 *actualSize = NdefMap->FelicaAttrInfo.LenBytes[0];
   1401                 *actualSize = *actualSize << 16;
   1402                 *actualSize += NdefMap->FelicaAttrInfo.LenBytes[1];
   1403                 *actualSize = *actualSize << 8;
   1404                 *actualSize += NdefMap->FelicaAttrInfo.LenBytes[2];
   1405                 break;
   1406 #endif  /* PH_FRINFC_MAP_FELICA_DISABLED */
   1407 
   1408 #ifndef PH_FRINFC_MAP_ISO15693_DISABLED
   1409             case PH_FRINFC_NDEFMAP_ISO15693_CARD:
   1410             {
   1411 #if 1
   1412                 uint16_t                    block_no = 0;
   1413                 uint8_t                     byte_no = 0;
   1414 
   1415                 block_no = (uint16_t)
   1416                     ISO15693_GET_VALUE_FIELD_BLOCK_NO (
   1417                         NdefMap->ISO15693Container.ndef_tlv_type_blk,
   1418                         NdefMap->ISO15693Container.ndef_tlv_type_byte,
   1419                         NdefMap->ISO15693Container.actual_ndef_size);
   1420                 byte_no = (uint8_t)
   1421                     ISO15693_GET_VALUE_FIELD_BYTE_NO (
   1422                         NdefMap->ISO15693Container.ndef_tlv_type_blk,
   1423                         NdefMap->ISO15693Container.ndef_tlv_type_byte,
   1424                         NdefMap->ISO15693Container.actual_ndef_size);
   1425 
   1426                 *maxSize = (NdefMap->ISO15693Container.max_data_size -
   1427                             ((block_no * ISO15693_BYTES_PER_BLOCK) + byte_no));
   1428 #else /* #if 1 */
   1429                 /* 2 is used to exclude the T and L part of the TLV */
   1430                 *maxSize = (NdefMap->ISO15693Container.max_data_size
   1431                             - ISO15693_BYTES_PER_BLOCK - 2);
   1432 #endif /* #if 1 */
   1433                 *actualSize = NdefMap->ISO15693Container.actual_ndef_size;
   1434                 break;
   1435             }
   1436 #endif
   1437 
   1438 #ifdef PHFRINFC_OVRHAL_MOCKUP
   1439             case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
   1440                 *maxSize = 0xFFFFFFFF;
   1441                 /* In Desfire card, the actual size cant be calculated so
   1442                 the actual size is given as 0xFFFFFFFF */
   1443                 *actualSize = 0xFFFFFFFF;
   1444                 break;
   1445 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
   1446 
   1447             default :
   1448                 /*  Unknown card type. Return error */
   1449                 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
   1450                     NFCSTATUS_INVALID_REMOTE_DEVICE);
   1451                 break;
   1452         }
   1453     }
   1454     return(result);
   1455 }
   1456 
   1457 #ifdef PHFRINFC_OVRHAL_MOCKUP
   1458 NFCSTATUS phFriNfc_NdefMap_MockupCardSetter(phFriNfc_NdefMap_t *NdefMap,
   1459                                             uint8_t *NdefData,
   1460                                             uint32_t NdefActualSize,
   1461                                             uint32_t NdefMaxSize,
   1462                                             uint32_t CardSize)
   1463 {
   1464     NFCSTATUS Status = NFCSTATUS_SUCCESS;
   1465     // First check all parameters
   1466     if((NdefData != NULL) && (NdefMap != NULL))
   1467     {
   1468         // OK we can set
   1469         NdefMap->MochupContainer.NdefData       = NdefData;
   1470         NdefMap->MochupContainer.NdefActualSize = NdefActualSize;
   1471         NdefMap->MochupContainer.NdefMaxSize    = NdefMaxSize;
   1472         NdefMap->MochupContainer.CardSize       = CardSize;
   1473         NdefMap->MochupContainer.CurrentBlock   = 0;
   1474 
   1475     } else
   1476     {
   1477         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
   1478     }
   1479     return Status;
   1480 }
   1481 
   1482 NFCSTATUS phFriNfc_NdefMap_MockupNDefModeEn(uint8_t  *pNdefCompliancy, uint8_t  *pCardType, uint8_t Enable)
   1483 {
   1484     *pNdefCompliancy = Enable;
   1485     *pCardType = PH_FRINFC_NDEFMAP_MOCKUP_CARD;
   1486     return NFCSTATUS_SUCCESS;
   1487 }
   1488 #endif  /* PHFRINFC_OVRHAL_MOCKUP */
   1489 
   1490 
   1491 
   1492 
   1493 
   1494 
   1495 
   1496 
   1497