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  phFriNfc_MifareStdMap.c
     19  * \brief NFC Ndef Mapping For Remote Devices.
     20  *
     21  * Project: NFC-FRI
     22  *
     23  * $Date: Thu May  6 10:01:55 2010 $
     24  * $Author: ing02260 $
     25  * $Revision: 1.22 $
     26  * $Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $
     27  *
     28  */
     29 
     30 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
     31 
     32 #include <phFriNfc_MifareStdMap.h>
     33 #include <phFriNfc_OvrHal.h>
     34 
     35 #ifndef PH_HAL4_ENABLE
     36 #include <phFriNfc_OvrHalCmd.h>
     37 #endif
     38 
     39 #include <phFriNfc_MapTools.h>
     40 
     41 #include <phFriNfc_MifStdFormat.h>
     42 
     43 /*! \ingroup grp_file_attributes
     44  *  \name NDEF Mapping
     45  *
     46  * File: \ref phFriNfcNdefMap.c
     47  *
     48  */
     49 /*@{*/
     50 #define PHFRINFCMIFARESTDMAP_FILEREVISION "$Revision: 1.22 $"
     51 #define PHFRINFCMIFARESTDMAP_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $"
     52 /*@}*/
     53 /*@}*/
     54 
     55 /*!
     56  * \name Mifare Standard Mapping - Helper Functions
     57  *
     58  */
     59 /*@{*/
     60 
     61 /*!
     62  * \brief \copydoc page_ovr Helper function for Mifare Std. This function Reads
     63  *  a block from the card.
     64  */
     65 static NFCSTATUS phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t *NdefMap);
     66 
     67 /*!
     68  * \brief \copydoc page_ovr Helper function for Mifare Std. This function writes
     69  *  into a block of the card.
     70  */
     71 static NFCSTATUS phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t *NdefMap);
     72 
     73 /*!
     74  * \brief \copydoc page_ovr Helper function for Mifare Std. This function authenticates
     75  *  one sector at a time.
     76  */
     77 static NFCSTATUS phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t *NdefMap);
     78 
     79 /*!
     80  * \brief \copydoc page_ovr Helper function for Mifare 4k Check Ndef to
     81  *  get the next AID blocks
     82  */
     83 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t *NdefMap);
     84 
     85 /*!
     86  * \brief \copydoc page_ovr Helper function for Check Ndef to store the AIDs
     87  */
     88 static void phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t *NdefMap);
     89 
     90 /*!
     91  * \brief \copydoc page_ovr Helper function to get the Sector from the current block
     92  */
     93 static uint8_t phFriNfc_MifStd_H_GetSect(uint8_t  BlockNumber);
     94 
     95 /*!
     96  * \brief \copydoc page_ovr Helper function to check the Ndef compliance of the
     97  *  current block, if the block is not Ndef Compliant, increment the block till
     98  *  the next Ndef compliant block using the Get Sector Helper function
     99  */
    100 static NFCSTATUS phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t *NdefMap);
    101 
    102 /*!
    103  * \brief \copydoc page_ovr Helper function to read the access bits of each sector
    104  */
    105 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t *NdefMap);
    106 
    107 /*!
    108  * \brief \copydoc page_ovr Helper function to check the access bits of each sector
    109  */
    110 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t *NdefMap);
    111 
    112 /*!
    113  * \brief \copydoc page_ovr Helper function for read access bits, depending
    114  * on the read/write/check ndef function called
    115  */
    116 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t *NdefMap);
    117 
    118 /*!
    119  * \brief \copydoc page_ovr Helper function for check ndef to check the
    120  * ndef compliant sectors
    121  */
    122 static void phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t *NdefMap);
    123 
    124 #if 0
    125 /*!
    126  * \brief \copydoc page_ovr Helper function for read ndef to check the
    127  * the length L of the ndef TLV
    128  */
    129 static uint8_t phFriNfc_MifStd_H_ChkNdefLen(phFriNfc_NdefMap_t *NdefMap,
    130                                         uint8_t             NDEFlength,
    131                                         uint8_t             *CRFlag);
    132 
    133 /*!
    134  * \brief \copydoc page_ovr Helper function for read ndef to copy the
    135  * card data to the user buffer
    136  */
    137 static NFCSTATUS phFriNfc_MifStd_H_RdNdefTLV(phFriNfc_NdefMap_t *NdefMap,
    138                                          uint8_t            *Temp16Bytes);
    139 
    140 #endif
    141 
    142 /*!
    143  * \brief \copydoc page_ovr Helper function for read ndef to process the
    144  * remaining bytes of length (L) in the TLV
    145  */
    146 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t *NdefMap,
    147                                          uint8_t            *Flag,
    148                                          uint8_t            *Temp16Bytes);
    149 
    150 /*!
    151  * \brief \copydoc page_ovr Helper function for read ndef to process the
    152  * internal bytes
    153  */
    154 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap);
    155 
    156 /*!
    157  * \brief \copydoc page_ovr Helper function for read ndef to check the
    158  * internal bytes without ndef tlv flag
    159  */
    160 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t  *NdefMap,
    161                                             uint8_t             *Flag,
    162                                             uint8_t             *TempintBytes);
    163 #if 0
    164 /*!
    165  * \brief \copydoc page_ovr Helper function for read ndef to check the
    166  * internal bytes without ndef tlv flag
    167  */
    168 static NFCSTATUS phFriNfc_MifStd_H_IntLenWithNdef(phFriNfc_NdefMap_t *NdefMap,
    169                                             uint8_t             *TempintBytes);
    170 #endif
    171 /*!
    172  * \brief \copydoc page_ovr Helper function for write ndef to add the TLV
    173  * structure
    174  */
    175 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap);
    176 
    177 /*!
    178  * \brief \copydoc page_ovr Helper function for write ndef to write the Length TLV
    179  *
    180  */
    181 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap);
    182 #if 0
    183 /*!
    184  * \brief \copydoc page_ovr Helper function for check ndef to check the ndef
    185  * compliant blocks is 0
    186  */
    187 static NFCSTATUS phFriNfc_MifStd_H_ChkNdefCmpltBlocks(phFriNfc_NdefMap_t   *NdefMap);
    188 #endif
    189 /*!
    190  * \brief \copydoc page_ovr Helper function to set the authentication flag
    191  * for the ndef TLV block
    192  */
    193 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t   *NdefMap);
    194 
    195 /*!
    196  * \brief \copydoc page_ovr Helper function to reset ndef TLV values. This is
    197  * used when the offset is BEGIN
    198  */
    199 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t   *NdefMap);
    200 
    201 /*!
    202  * \brief \copydoc page_ovr Helper function to read the first ndef compliant block to
    203  * change the length
    204  */
    205 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap);
    206 
    207 /*!
    208  * \brief \copydoc page_ovr Helper function to get the actual length of card
    209  *
    210  */
    211 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap);
    212 
    213 /*!
    214  * \brief \copydoc page_ovr Helper function to check all the TLVs
    215  *
    216  */
    217 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
    218                                            uint8_t            *CRFlag);
    219 
    220 /*!
    221  * \brief \copydoc page_ovr Helper function to get the next TLV
    222  *
    223  */
    224 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t *NdefMap,
    225                                        uint16_t             *TempLength,
    226                                        uint8_t              *TL4bytesFlag);
    227 
    228 /*!
    229  * \brief \copydoc page_ovr Helper function to know whether the read
    230  *  16 bytes are parsed completely
    231  */
    232 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
    233                                        uint16_t             TempLength);
    234 
    235 /*!
    236  * \brief \copydoc page_ovr Helper function to know whether the read
    237  *  16 bytes are parsed completely
    238  */
    239 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap,
    240                                           uint8_t            *CRFlag,
    241                                           uint8_t            *NDEFFlag);
    242 
    243 /*!
    244  * \brief \copydoc page_ovr Helper function to call the Completion Routine
    245  *
    246  */
    247 static void phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
    248                                  NFCSTATUS            Result);
    249 
    250 /*!
    251  * \brief \copydoc page_ovr Helper function to get the Mifare 1k Sector Trailer
    252  *
    253  */
    254 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t  *NdefMap);
    255 
    256 /*!
    257  * \brief \copydoc page_ovr Helper function to get the Mifare 4k Sector Trailer
    258  *
    259  */
    260 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t  *NdefMap);
    261 
    262 /*!
    263  * \brief \copydoc page_ovr Helper function to process the check ndef call
    264  *
    265  */
    266 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t        *NdefMap);
    267 
    268 /*!
    269  * \brief \copydoc page_ovr Helper function to process the authentication of a sector
    270  *
    271  */
    272 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t       *NdefMap);
    273 
    274 /*!
    275  * \brief \copydoc page_ovr Helper function to read 16 bytes from a specifed block no.
    276  *
    277  */
    278 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t     *NdefMap,
    279                                               uint8_t               BlockNo);
    280 
    281 /*!
    282  * \brief \copydoc page_ovr Helper function to process access bits of the
    283  * sector trailer
    284  */
    285 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t    *NdefMap);
    286 
    287 /*!
    288  * \brief \copydoc page_ovr Helper function to check the GPB bytes
    289  */
    290 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t        *NdefMap);
    291 
    292 /*!
    293  * \brief \copydoc page_ovr Helper function to check for the different
    294  * status value in the process because of proprietary forum sector
    295  */
    296 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t    *NdefMap,
    297                                                    NFCSTATUS             status);
    298 
    299 /*!
    300  * \brief \copydoc page_ovr Helper function to read the NDEF TLV block
    301  */
    302 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t        *NdefMap);
    303 
    304 /*!
    305  * \brief \copydoc page_ovr Helper function to process the NDEF TLV block
    306  *  read bytes to start write from the NDEF TLV
    307  */
    308 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t        *NdefMap);
    309 
    310 /*!
    311  * \brief \copydoc page_ovr Helper function to fill the send buffer to write
    312  */
    313 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t        *NdefMap,
    314                                                uint8_t                   Length);
    315 
    316 /*!
    317  * \brief \copydoc page_ovr Helper function to write 16 bytes in a block
    318  */
    319 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t        *NdefMap);
    320 
    321 /*!
    322  * \brief \copydoc page_ovr Helper function to process the write TLV bytes in a block
    323  */
    324 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t        *NdefMap);
    325 
    326 /*!
    327  * \brief \copydoc page_ovr Helper function to update the remaining TLV
    328  */
    329 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t        *NdefMap);
    330 
    331 /*!
    332  * \brief \copydoc page_ovr Helper function to update the length field if more than one
    333  * NULL TLVs exists before of the NDEF TLV
    334  */
    335 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t        *NdefMap);
    336 
    337 /*!
    338  * \brief \copydoc page_ovr Helper function to update the length field if more than one
    339  * NULL TLVs does not exists before the TLV
    340  */
    341 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t        *NdefMap);
    342 
    343 /*!
    344  * \brief \copydoc page_ovr Helper function to increment/decrement the ndef tlv block
    345  * and read the block
    346  */
    347 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t        *NdefMap);
    348 
    349 /*!
    350  * \brief \copydoc page_ovr Helper function to check the current block is valid or not
    351  * if not valid decrement the current block till the valid block
    352  */
    353 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t        *NdefMap);
    354 
    355 /*!
    356  * \brief \copydoc page_ovr Helper function update the length of the TLV if NULL TLVs
    357  * greater than or equal to 2
    358  */
    359 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t        *NdefMap);
    360 
    361 /*!
    362  * \brief \copydoc page_ovr Helper function update the length of the TLV if NULL TLVs
    363  * less than 2
    364  */
    365 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t        *NdefMap);
    366 
    367 /*!
    368  * \brief \copydoc page_ovr Helper function to read the TLV block
    369  */
    370 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t        *NdefMap);
    371 
    372 /*!
    373  * \brief \copydoc page_ovr Helper function to process the read TLV block
    374  */
    375 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t        *NdefMap);
    376 
    377 /*!
    378  * \brief \copydoc page_ovr Helper function to write the terminator TLV
    379  */
    380 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap);
    381 
    382 /*!
    383  * \brief \copydoc page_ovr Helper function to process the write a block function
    384  */
    385 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t   *NdefMap);
    386 
    387 #ifndef PH_HAL4_ENABLE
    388 /*!
    389  * \brief \copydoc page_ovr Helper function to call poll function after the
    390  * authentication has failed
    391  */
    392 static NFCSTATUS phFriNfc_MifStd_H_CallPoll(phFriNfc_NdefMap_t   *NdefMap);
    393 #endif
    394 
    395 /*!
    396  * \brief \copydoc page_ovr Helper function to call connect function after the
    397  * authentication has failed
    398  */
    399 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t   *NdefMap);
    400 
    401 /*!
    402  * \brief \copydoc page_ovr Helper function to call disconnect function after the
    403  * authentication has failed
    404  */
    405 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t   *NdefMap);
    406 
    407 /*!
    408  * \brief \copydoc page_ovr Helper function to call know the ndef compliant block using
    409  */
    410 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t   *NdefMap,
    411                                     uint8_t              SectorID,
    412                                     uint8_t              *callbreak);
    413 
    414 static uint8_t phFriNfc_MifStd_H_GetSectorTrailerBlkNo(uint8_t SectorID );
    415 static NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits(phFriNfc_NdefMap_t *NdefMap);
    416 static NFCSTATUS phFriNfc_MifStd_H_WrSectorTrailorBlock(phFriNfc_NdefMap_t *NdefMap);
    417 static NFCSTATUS phFriNfc_MifStd_H_ProWrSectorTrailor(phFriNfc_NdefMap_t *NdefMap);
    418 
    419 /*@}*/
    420 /**
    421  * \name Mifare Standard Mapping - Constants.
    422  *
    423  */
    424 /*@{*/
    425 /* As per the spec, the value of this macro
    426    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1 shall be 0xA0 */
    427 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1        0xA0 /**< \internal Authenticate Command for MAD Sector */
    428 
    429 /* As per the spec, the value of this macro
    430    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2 shall be 0xA1 */
    431 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2        0xA1 /**< \internal Authenticate Command for MAD Sector */
    432 
    433 /* As per the spec, the value of this macro
    434    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3 shall be 0xA2 */
    435 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3        0xA2 /**< \internal Authenticate Command for MAD Sector */
    436 
    437 /* As per the spec, the value of this macro
    438    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4 shall be 0xA3 */
    439 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4        0xA3 /**< \internal Authenticate Command for MAD Sector */
    440 
    441 /* As per the spec, the value of this macro
    442    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5 shall be 0xA4 */
    443 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5        0xA4 /**< \internal Authenticate Command for MAD Sector */
    444 
    445 /* As per the spec, the value of this macro
    446    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6 shall be 0xA5 */
    447 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6        0xA5 /**< \internal Authenticate Command for MAD Sector */
    448 
    449 /* As per the spec, the value of this macro
    450    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1 shall be 0xD3 */
    451 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1       0xD3 /**< \internal Authenticate Command for NDEF Sectors 1 */
    452 
    453 /* As per the spec, the value of this macro
    454    PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2 shall be 0xF7 */
    455 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2       0xF7 /**< \internal Authenticate Command for NDEF Sectors 2 */
    456 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2         0x03 /**< \internal Ndef Compliant command 1 */
    457 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1         0xE1 /**< \internal Ndef Compliant command 2 */
    458 
    459 /* Enable access bits check for the MAD sector
    460 #define ENABLE_ACS_BIT_CHK_FOR_MAD */
    461 /*@}*/
    462 
    463 NFCSTATUS phFriNfc_MifareStdMap_H_Reset(phFriNfc_NdefMap_t        *NdefMap)
    464 {
    465     NFCSTATUS   status = NFCSTATUS_SUCCESS;
    466     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
    467     if ( NdefMap == NULL)
    468     {
    469         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    470     }
    471     else
    472     {
    473         /* Current Block stores the present block accessed in the card */
    474         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL0;
    475 
    476         for(index = PH_FRINFC_MIFARESTD_VAL0; index <
    477             PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES; index++)
    478         {
    479             /* internal buffer to store the odd bytes of length < 15 */
    480             NdefMap->StdMifareContainer.internalBuf[index] = PH_FRINFC_MIFARESTD_VAL0;
    481         }
    482         /* odd bytes length stored in the internal buffer */
    483         NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
    484 
    485         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
    486 
    487         /* Flag to get that last few bytes are taken from the user buffer */
    488         NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
    489 
    490         /* Flag to find that the read/write operation has reached the end of the card.
    491             Further reading/writing is not possible */
    492         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
    493 
    494         /* Flag to get that last few bytes are taken from the internal buffer */
    495         NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
    496 
    497         /* Authentication Flag for every sector */
    498         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
    499 
    500         /* Used in Check Ndef for storing the sector ID */
    501         NdefMap->StdMifareContainer.SectorIndex = PH_FRINFC_MIFARESTD_VAL0;
    502 
    503         NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL0;
    504 
    505         NdefMap->StdMifareContainer.NoOfNdefCompBlocks = PH_FRINFC_MIFARESTD_VAL0;
    506 
    507         NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
    508 
    509         NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
    510 
    511         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
    512 
    513         NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_MIFARESTD_VAL0;
    514 
    515         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
    516 
    517         NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_VAL0;
    518 
    519         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
    520 
    521         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
    522 
    523         NdefMap->StdMifareContainer.remainingSize = PH_FRINFC_MIFARESTD_VAL0;
    524 
    525         NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
    526 
    527         NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
    528 
    529         NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
    530 
    531         NdefMap->StdMifareContainer.aidCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
    532 
    533         NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
    534 
    535         NdefMap->StdMifareContainer.ProprforumSectFlag = PH_FRINFC_MIFARESTD_PROP_1ST_CONFIG;
    536 
    537         NdefMap->StdMifareContainer.ReadCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
    538 
    539         NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
    540 
    541         NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
    542 
    543         NdefMap->StdMifareContainer.ChkNdefCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
    544 
    545         NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG0;
    546 
    547         NdefMap->StdMifareContainer.TotalNoSectors = PH_FRINFC_MIFARESTD_FLAG0;
    548 
    549         NdefMap->StdMifareContainer.SectorTrailerBlockNo = PH_FRINFC_MIFARESTD_FLAG0;
    550     }
    551 
    552     return status;
    553 }
    554 
    555 /*!
    556  * \brief Check whether a particular Remote Device is NDEF compliant.
    557  *
    558  * The function checks whether the peer device is NDEF compliant.
    559  *
    560  * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t
    561  *                    structure describing the component context.
    562  *
    563  * \retval  NFCSTATUS_PENDING   The action has been successfully triggered.
    564  * \retval  Others              An error has occurred.
    565  *
    566  */
    567 
    568 NFCSTATUS phFriNfc_MifareStdMap_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
    569 {
    570     NFCSTATUS                   status =    NFCSTATUS_PENDING;
    571     uint8_t                     atq,
    572                                 sak;
    573 
    574     if ( NdefMap == NULL)
    575     {
    576         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    577     }
    578     else
    579     {
    580         /* set the data for additional data exchange*/
    581         NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
    582         NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
    583         NdefMap->psDepAdditionalInfo.NAD = 0;
    584         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
    585         NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
    586 
    587         /* Get the Select Response and Sense Response to get
    588             the exact Card Type either Mifare 1k or 4k */
    589 #ifndef PH_HAL4_ENABLE
    590         sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo106.
    591                         Startup106.SelRes;
    592         atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo106.
    593                         Startup106.SensRes[0];
    594 #else
    595         sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
    596         atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
    597         PHNFC_UNUSED_VARIABLE(atq);
    598 #endif
    599 
    600         if (0x08 == (sak & 0x18))
    601         {
    602             /* Total Number of Blocks in Mifare 1k Card */
    603             NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
    604                                         PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK;
    605             NdefMap->StdMifareContainer.remainingSize =
    606                                                 ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0)?
    607                                                 (PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK *
    608                                                 PH_FRINFC_MIFARESTD_BLOCK_BYTES):
    609                                                 NdefMap->StdMifareContainer.remainingSize);
    610             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD;
    611         }
    612         else
    613         {
    614              /* Total Number of Blocks in Mifare 4k Card */
    615             NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
    616                                         PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK;
    617             NdefMap->StdMifareContainer.remainingSize =
    618                                             ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0)?
    619                                             (PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK *
    620                                             PH_FRINFC_MIFARESTD_BLOCK_BYTES):
    621                                             NdefMap->StdMifareContainer.remainingSize);
    622             NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD;
    623         }
    624 
    625 
    626         /*  phFriNfc_MifareStdMap_ChkNdef should be called only
    627             when currentBlock is 0 OR 64,65 and 66 (for Mifare 4k).
    628             Otherwise return error */
    629         /* and also Check the Authentication Flag */
    630         if((NdefMap->StdMifareContainer.currentBlock != 0) &&
    631             (NdefMap->StdMifareContainer.currentBlock != 1) &&
    632             (NdefMap->StdMifareContainer.currentBlock != 2) &&
    633             (NdefMap->StdMifareContainer.currentBlock != 64) &&
    634             (NdefMap->StdMifareContainer.currentBlock != 65) &&
    635             (NdefMap->StdMifareContainer.currentBlock != 66) )
    636         {
    637             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    638         }
    639         else if( NdefMap->StdMifareContainer.AuthDone == 0)
    640         {
    641             /*  Block 0 contains Manufacturer information and
    642                 also other informaton. So go for block 1 which
    643                 contains AIDs. Authenticating any of the block
    644                 in a sector, Authenticates the whole sector */
    645             if(NdefMap->StdMifareContainer.currentBlock == 0)
    646             {
    647                 NdefMap->StdMifareContainer.currentBlock = 1;
    648             }
    649 
    650             status = phFriNfc_MifStd_H_AuthSector(NdefMap);
    651         }
    652         else
    653         {
    654             /*  Mifare 1k, sak = 0x08 atq = 0x04
    655                 Mifare 4k, sak = 0x38 atq = 0x02 */
    656             if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) ||
    657                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
    658             {
    659                 /* Change the state to Check Ndef Compliant */
    660                 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP;
    661                 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
    662                 NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
    663 
    664                 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
    665                 NdefMap->MapCompletionInfo.Context = NdefMap;
    666 
    667 #ifndef PH_HAL4_ENABLE
    668                 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
    669 #else
    670                 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
    671 #endif
    672                 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
    673                 NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
    674                 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
    675 
    676                 /* Call the Overlapped HAL Transceive function */
    677                 status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
    678                                                         &NdefMap->MapCompletionInfo,
    679                                                         NdefMap->psRemoteDevInfo,
    680                                                         NdefMap->Cmd,
    681                                                         &NdefMap->psDepAdditionalInfo,
    682                                                         NdefMap->SendRecvBuf,
    683                                                         NdefMap->SendLength,
    684                                                         NdefMap->SendRecvBuf,
    685                                                         NdefMap->SendRecvLength);
    686             }
    687             else
    688             {
    689                 /* Since we have decided temporarily not to go
    690                     for any new error codes we are using
    691                     NFCSTATUS_INVALID_PARAMETER even though it is not
    692                     the relevant error code here TBD */
    693                 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    694             }
    695         }
    696     }
    697     return status;
    698 }
    699 
    700 
    701 /*!
    702  * \brief Initiates Reading of NDEF information from the Remote Device.
    703  *
    704  * The function initiates the reading of NDEF information from a Remote Device.
    705  * It performs a reset of the state and starts the action (state machine).
    706  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
    707  * has been triggered.
    708  */
    709 NFCSTATUS phFriNfc_MifareStdMap_RdNdef( phFriNfc_NdefMap_t                  *NdefMap,
    710                                         uint8_t                             *PacketData,
    711                                         uint32_t                            *PacketDataLength,
    712                                         uint8_t                             Offset)
    713 {
    714     NFCSTATUS               status =    NFCSTATUS_PENDING;
    715 
    716     NdefMap->ApduBufferSize = *PacketDataLength;
    717     NdefMap->NumOfBytesRead = PacketDataLength;
    718     *NdefMap->NumOfBytesRead = 0;
    719     NdefMap->ApduBuffIndex = 0;
    720     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
    721     NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
    722 
    723     if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
    724         || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED))
    725     {
    726         /* Card state  is not correct */
    727         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    728                             NFCSTATUS_INVALID_PARAMETER);
    729     }
    730     else
    731     {
    732         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
    733             PH_FRINFC_NDEFMAP_WRITE_OPE))
    734         {
    735             phFriNfc_MifStd_H_RdWrReset(NdefMap);
    736             NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
    737             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
    738         }
    739         /* Offset = Current, but the read has reached the End of Card */
    740         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
    741             (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
    742             PH_FRINFC_MIFARESTD_FLAG1))
    743         {
    744             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
    745         }
    746         else
    747         {
    748             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
    749                                 ( NdefMap->PrevOperation ==
    750                                 PH_FRINFC_NDEFMAP_WRITE_OPE))?
    751                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN:
    752                                 Offset);
    753             status = phFriNfc_MifStd_H_BlkChk(NdefMap);
    754             if(status == NFCSTATUS_SUCCESS)
    755             {
    756                 NdefMap->ApduBuffer = PacketData;
    757 
    758                 /* Read Operation in Progress */
    759                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
    760 
    761                 /* Check Authentication Flag */
    762                 status =
    763                 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
    764                     phFriNfc_MifStd_H_RdABlock(NdefMap):
    765                     phFriNfc_MifStd_H_AuthSector(NdefMap));
    766             }
    767         }
    768     }
    769     return status;
    770 }
    771 
    772 /*!
    773  * \brief Initiates Writing of NDEF information to the Remote Device.
    774  *
    775  * The function initiates the writing of NDEF information to a Remote Device.
    776  * It performs a reset of the state and starts the action (state machine).
    777  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
    778  * has been triggered.
    779  */
    780 NFCSTATUS phFriNfc_MifareStdMap_WrNdef( phFriNfc_NdefMap_t     *NdefMap,
    781                                         uint8_t                 *PacketData,
    782                                         uint32_t                *PacketDataLength,
    783                                         uint8_t                 Offset)
    784 {
    785     NFCSTATUS                   status =    NFCSTATUS_PENDING;
    786 
    787     NdefMap->ApduBuffer = PacketData;
    788     NdefMap->ApduBufferSize = *PacketDataLength;
    789     NdefMap->ApduBuffIndex = PH_FRINFC_MIFARESTD_VAL0;
    790     NdefMap->WrNdefPacketLength = PacketDataLength;
    791     *NdefMap->WrNdefPacketLength = PH_FRINFC_MIFARESTD_VAL0;
    792     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
    793     NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
    794 
    795     if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
    796         || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY))
    797     {
    798         /* Card state  is not correct */
    799         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    800                             NFCSTATUS_INVALID_PARAMETER);
    801     }
    802     else
    803     {
    804         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
    805         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))
    806         {
    807             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
    808             NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
    809             NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
    810             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
    811             NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
    812             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
    813             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
    814             NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
    815             NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
    816             NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
    817             NdefMap->StdMifareContainer.remainingSize =
    818                         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
    819                         PH_FRINFC_MIFARESTD_BLOCK_BYTES);
    820             NdefMap->StdMifareContainer.currentBlock =
    821                                             PH_FRINFC_MIFARESTD_BLK4;
    822             NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
    823             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
    824             /* This macro is added, to be compliant with the previous HAL 2.0
    825                 For HAL 2.0, polling is done before writing data to the mifare
    826                 std (if the offset is BEGIN), because if an error is reported
    827                 during read or write and again write is called, the PN531 state is
    828                 unchanged (so write will fail), to bring the PN531 to the correct
    829                 state, polling is done.
    830                 Changed on 13th Jan 2009
    831             */
    832 #ifdef PH_HAL4_ENABLE
    833             NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
    834 #else
    835             NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
    836 #endif /* #ifdef PH_HAL4_ENABLE */
    837             NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
    838             NdefMap->StdMifareContainer.FirstWriteFlag = PH_FRINFC_MIFARESTD_FLAG1;
    839         }
    840 
    841         if(((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
    842             (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
    843             PH_FRINFC_MIFARESTD_FLAG1)) || ((NdefMap->StdMifareContainer.PollFlag ==
    844             PH_FRINFC_MIFARESTD_FLAG1) && (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)))
    845         {
    846             /* Offset = Current, but the read has reached the End of Card */
    847             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    848                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
    849         }
    850         else
    851         {
    852             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
    853                             ( NdefMap->PrevOperation ==
    854                             PH_FRINFC_NDEFMAP_READ_OPE))?
    855                             PH_FRINFC_NDEFMAP_SEEK_BEGIN:
    856                             Offset);
    857             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
    858             status = phFriNfc_MifStd_H_BlkChk(NdefMap);
    859             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
    860             if(status == NFCSTATUS_SUCCESS)
    861             {
    862                 if(NdefMap->StdMifareContainer.PollFlag ==
    863                     PH_FRINFC_MIFARESTD_FLAG1)
    864                 {
    865                     /* if poll flag is set then call disconnect because the authentication
    866                         has failed so reactivation of card is required */
    867                     status = phFriNfc_MifStd_H_CallDisCon(NdefMap);
    868                 }
    869                 /* Check Authentication Flag */
    870                 else if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
    871                 {
    872                     status =  ((NdefMap->Offset ==
    873                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
    874                                 phFriNfc_MifStd_H_RdBeforeWr(NdefMap):
    875                                 phFriNfc_MifStd_H_WrABlock(NdefMap));
    876                 }
    877                 else
    878                 {
    879                     status = phFriNfc_MifStd_H_AuthSector(NdefMap);
    880                 }
    881             }
    882         }
    883     }
    884     return status;
    885 }
    886 
    887 
    888 /*!
    889  * \brief Completion Routine, Processing function, needed to avoid long blocking.
    890  * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
    891  *       Routine in order to be able to notify the component that an I/O has finished and data are
    892  *       ready to be processed.
    893  *
    894  */
    895 
    896 void phFriNfc_MifareStdMap_Process( void       *Context,
    897                                     NFCSTATUS   Status)
    898 {
    899 
    900     phFriNfc_NdefMap_t      *NdefMap;
    901 
    902     uint8_t                 NDEFFlag = 0,
    903                             CRFlag = 0,
    904                             Temp16Bytes = 0,
    905                             i = 0;
    906 
    907 
    908     NdefMap = (phFriNfc_NdefMap_t *)Context;
    909 
    910     if((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER))
    911     {
    912         switch(NdefMap->State)
    913         {
    914             case PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP:
    915                 Status = phFriNfc_MifStd_H_ProChkNdef(NdefMap);
    916                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    917                             PH_FRINFC_MIFARESTD_FLAG1:
    918                             PH_FRINFC_MIFARESTD_FLAG0);
    919                 break;
    920 
    921             case PH_FRINFC_NDEFMAP_STATE_READ:
    922 
    923                 /* Receive Length for read shall always be equal to 16 */
    924                 if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
    925                     (NdefMap->ApduBuffIndex < (uint16_t)NdefMap->ApduBufferSize))
    926                 {
    927                     Temp16Bytes = PH_FRINFC_MIFARESTD_VAL0;
    928                     NDEFFlag = (uint8_t)PH_FRINFC_MIFARESTD_FLAG1;
    929                     if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
    930                     {
    931                         NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
    932                         CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
    933                         /* To read the remaining length (L) in TLV */
    934                         Status = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &Temp16Bytes);
    935                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    936                                             PH_FRINFC_MIFARESTD_FLAG1:
    937                                             PH_FRINFC_MIFARESTD_FLAG0);
    938                     }
    939 
    940                     /* check the NDEFFlag is set. if this is not set, then
    941                         in the above RemainTLV function all the 16 bytes has been
    942                         read */
    943 #if 0
    944                     if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
    945                         (NdefMap->TLVStruct.NdefTLVFoundFlag ==
    946                         PH_FRINFC_MIFARESTD_FLAG1))
    947                     {
    948                         /* if the block is NDEF TLV then get data from here */
    949                         Status = phFriNfc_MifStd_H_RdNdefTLV(NdefMap, &Temp16Bytes);
    950                     }
    951 #endif
    952                 }
    953                 else
    954                 {
    955                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_RECEIVE_LENGTH);
    956                     CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
    957                 }
    958                 break;
    959 
    960             case PH_FRINFC_NDEFMAP_STATE_WRITE:
    961                 Status = phFriNfc_MifStd_H_ProWrABlock(NdefMap);
    962                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    963                                     PH_FRINFC_MIFARESTD_FLAG1:
    964                                     PH_FRINFC_MIFARESTD_FLAG0);
    965 
    966                 /* Call Completion Routine if CR Flag is Set to 1 */
    967                 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
    968                 {
    969                     *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
    970                 }
    971                 break;
    972 
    973             case PH_FRINFC_NDEFMAP_STATE_AUTH:
    974                 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
    975                 Status = phFriNfc_MifStd_H_ProAuth(NdefMap);
    976                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    977                                     PH_FRINFC_MIFARESTD_FLAG1:
    978                                     PH_FRINFC_MIFARESTD_FLAG0);
    979                 break;
    980 
    981             case PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT:
    982                 Status = phFriNfc_MifStd_H_ProAcsBits(NdefMap);
    983                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    984                                     PH_FRINFC_MIFARESTD_FLAG1:
    985                                     PH_FRINFC_MIFARESTD_FLAG0);
    986                 break;
    987 
    988             case PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN:
    989                 if(NdefMap->StdMifareContainer.RdAfterWrFlag ==
    990                     PH_FRINFC_MIFARESTD_FLAG1)
    991                 {
    992                     Status = phFriNfc_MifStd_H_CallWrNdefLen(NdefMap);
    993                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    994                                 PH_FRINFC_MIFARESTD_FLAG1:
    995                                 PH_FRINFC_MIFARESTD_FLAG0);
    996                 }
    997                 else
    998                 {
    999                     /* Check this */
   1000                     if(NdefMap->StdMifareContainer.TempBlockNo ==
   1001                         NdefMap->StdMifareContainer.currentBlock)
   1002                     {
   1003                        (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   1004                                 NdefMap->StdMifareContainer.Buffer,
   1005                                 NdefMap->StdMifareContainer.internalLength);
   1006                     }
   1007                     *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
   1008                     NdefMap->StdMifareContainer.currentBlock =
   1009                                     NdefMap->StdMifareContainer.TempBlockNo;
   1010                     NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
   1011                                         PH_NDEFMAP_CARD_STATE_INITIALIZED)?
   1012                                         PH_NDEFMAP_CARD_STATE_READ_WRITE:
   1013                                         NdefMap->CardState);
   1014                     CRFlag = (uint8_t)PH_FRINFC_MIFARESTD_FLAG1;
   1015                 }
   1016                 /*NdefMap->StdMifareContainer.remainingSize -=
   1017                 (((NdefMap->ApduBufferSize) > (PH_FRINFC_MIFARESTD_NDEFTLV_L -
   1018                                             PH_FRINFC_MIFARESTD_VAL1))?
   1019                                             ((uint16_t)(*NdefMap->WrNdefPacketLength +
   1020                                             PH_FRINFC_MIFARESTD_VAL4)):
   1021                                             ((uint16_t)(*NdefMap->WrNdefPacketLength +
   1022                                             PH_FRINFC_MIFARESTD_VAL2)));*/
   1023                 break;
   1024 
   1025             case PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN:
   1026                 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1027                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1028                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
   1029                 if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   1030                 {
   1031                     /* Size of NdefMap->SendRecvBuf is set by phLibNfc_Gen_NdefMapReset to PH_LIBNFC_GEN_MAX_BUFFER */
   1032                     /* We don't have to check memory here */
   1033                     for (i = PH_FRINFC_MIFARESTD_BYTES_READ; i > 0; i--)
   1034                     {
   1035                         NdefMap->SendRecvBuf[i] = NdefMap->SendRecvBuf[i-1];
   1036                     }
   1037                     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   1038                                 NdefMap->StdMifareContainer.currentBlock;
   1039                     Status = phFriNfc_MifStd_H_WriteNdefLen(NdefMap);
   1040                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1041                                 PH_FRINFC_MIFARESTD_FLAG1:
   1042                                 PH_FRINFC_MIFARESTD_FLAG0);
   1043                 }
   1044                 break;
   1045 
   1046             case PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE:
   1047                 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1048                 if(NdefMap->TLVStruct.NoLbytesinTLV > PH_FRINFC_MIFARESTD_VAL0)
   1049                 {
   1050                     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   1051                     Status = phFriNfc_MifStd_H_ChkRemainTLVs(NdefMap, &CRFlag, &NDEFFlag);
   1052                     NdefMap->TLVStruct.NoLbytesinTLV =
   1053                                     PH_FRINFC_MIFARESTD_VAL0;
   1054                 }
   1055                 if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   1056                     (CRFlag != PH_FRINFC_MIFARESTD_FLAG1))
   1057                 {
   1058                     Status = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
   1059                 }
   1060                 if(((NdefMap->StdMifareContainer.ReadNdefFlag ==
   1061                     PH_FRINFC_MIFARESTD_FLAG1) ||
   1062                     (NdefMap->StdMifareContainer.WrNdefFlag ==
   1063                     PH_FRINFC_MIFARESTD_FLAG1))&&
   1064                     (Status != NFCSTATUS_PENDING))
   1065                 {
   1066                     NdefMap->StdMifareContainer.NFCforumSectFlag =
   1067                                             PH_FRINFC_MIFARESTD_FLAG1;
   1068                     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
   1069                     /* if the card state has changed to initialised and
   1070                      read ndef is called then error is returned */
   1071                     if(((NdefMap->StdMifareContainer.WrNdefFlag ==
   1072                         PH_FRINFC_MIFARESTD_FLAG1) &&
   1073                         (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)) ||
   1074                         ((NdefMap->StdMifareContainer.ReadNdefFlag ==
   1075                             PH_FRINFC_MIFARESTD_FLAG1) &&
   1076                         (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)))
   1077                     {
   1078                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1079                                             NFCSTATUS_NO_NDEF_SUPPORT);
   1080                     }
   1081                     if(NdefMap->StdMifareContainer.AuthDone ==
   1082                         PH_FRINFC_MIFARESTD_FLAG0)
   1083                     {
   1084                         Status = phFriNfc_MifStd_H_AuthSector(NdefMap);
   1085                     }
   1086                     else
   1087                     {
   1088                         Status = ((NdefMap->StdMifareContainer.ReadNdefFlag ==
   1089                                     PH_FRINFC_MIFARESTD_FLAG1)?
   1090                                     phFriNfc_MifStd_H_RdTLV(NdefMap):
   1091                                     phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
   1092                     }
   1093                     NdefMap->StdMifareContainer.ReadNdefFlag =
   1094                                             PH_FRINFC_MIFARESTD_FLAG0;
   1095                     NdefMap->StdMifareContainer.WrNdefFlag =
   1096                                             PH_FRINFC_MIFARESTD_FLAG0;
   1097 
   1098                 }
   1099                 if(NdefMap->StdMifareContainer.ChkNdefFlag ==
   1100                     PH_FRINFC_MIFARESTD_FLAG1)
   1101                 {
   1102                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1103                             PH_FRINFC_MIFARESTD_FLAG1:
   1104                             PH_FRINFC_MIFARESTD_FLAG0);
   1105                 }
   1106                 break;
   1107 
   1108             case PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR:
   1109                 /* Read flag says that already part of TLV has been written */
   1110                 Status = phFriNfc_MifStd_H_ProBytesToWr(NdefMap);
   1111                  CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1112                                     PH_FRINFC_MIFARESTD_FLAG1:
   1113                                     PH_FRINFC_MIFARESTD_FLAG0);
   1114                 break;
   1115 
   1116             case PH_FRINFC_NDEFMAP_STATE_WR_TLV:
   1117                 Status = phFriNfc_MifStd_H_ProWrTLV(NdefMap);
   1118                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1119                                     PH_FRINFC_MIFARESTD_FLAG1:
   1120                                     PH_FRINFC_MIFARESTD_FLAG0);
   1121                 break;
   1122 
   1123             case PH_FRINFC_NDEFMAP_STATE_RD_TLV:
   1124                 Status = phFriNfc_MifStd_H_ProRdTLV(NdefMap);
   1125                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1126                                     PH_FRINFC_MIFARESTD_FLAG1:
   1127                                     PH_FRINFC_MIFARESTD_FLAG0);
   1128                 break;
   1129 
   1130             case PH_FRINFC_NDEFMAP_STATE_TERM_TLV:
   1131                 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
   1132                 NdefMap->StdMifareContainer.currentBlock =
   1133                                 NdefMap->TLVStruct.NdefTLVBlock;
   1134                 Status = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
   1135                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1136                                     PH_FRINFC_MIFARESTD_FLAG1:
   1137                                     PH_FRINFC_MIFARESTD_FLAG0);
   1138                 break;
   1139 
   1140             case PH_FRINFC_NDEFMAP_STATE_DISCONNECT:
   1141                 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
   1142 
   1143 #ifndef PH_HAL4_ENABLE
   1144                 Status = phFriNfc_MifStd_H_CallPoll(NdefMap);
   1145                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1146                                     PH_FRINFC_MIFARESTD_FLAG1:
   1147                                     PH_FRINFC_MIFARESTD_FLAG0);
   1148                 break;
   1149 
   1150             case PH_FRINFC_NDEFMAP_STATE_POLL:
   1151 #endif
   1152                 Status = phFriNfc_MifStd_H_CallConnect(NdefMap);
   1153                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1154                                     PH_FRINFC_MIFARESTD_FLAG1:
   1155                                     PH_FRINFC_MIFARESTD_FLAG0);
   1156                 break;
   1157 
   1158             case PH_FRINFC_NDEFMAP_STATE_CONNECT:
   1159                 if(NdefMap->StdMifareContainer.FirstReadFlag == PH_FRINFC_MIFARESTD_FLAG1)
   1160                 {
   1161                     NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
   1162                     Status = phFriNfc_MifStd_H_AuthSector(NdefMap);
   1163                 }
   1164                 else if((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
   1165                          NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) &&
   1166                         (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
   1167                          NdefMap->StdMifareContainer.SectorTrailerBlockNo ==  NdefMap->StdMifareContainer.currentBlock))
   1168                 {
   1169                     NdefMap->StdMifareContainer.ReadOnlySectorIndex =
   1170                         PH_FRINFC_MIFARESTD_FLAG0;
   1171                     NdefMap->StdMifareContainer.SectorTrailerBlockNo =
   1172                         PH_FRINFC_MIFARESTD_FLAG0;
   1173                     NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_FLAG0;
   1174                         Status = NFCSTATUS_FAILED;
   1175                 }
   1176                 else
   1177                 {
   1178                     Status = ((((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
   1179                         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE)) ||
   1180                         (NdefMap->StdMifareContainer.WrLength >
   1181                         PH_FRINFC_MIFARESTD_VAL0))?
   1182                         phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Status):
   1183                         phFriNfc_MifStd_H_AuthSector(NdefMap));
   1184                 }
   1185                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1186                                     PH_FRINFC_MIFARESTD_FLAG1:
   1187                                     PH_FRINFC_MIFARESTD_FLAG0);
   1188                 break;
   1189 
   1190             case PH_FRINFC_NDEFMAP_STATE_RD_SEC_ACS_BIT:
   1191                 Status = phFriNfc_MifStd_H_ProSectorTrailorAcsBits(NdefMap);
   1192                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1193                                     PH_FRINFC_MIFARESTD_FLAG1:
   1194                                     PH_FRINFC_MIFARESTD_FLAG0);
   1195                 if ((CRFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   1196                     (NdefMap->StdMifareContainer.WriteAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG0))
   1197                 {
   1198                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1199                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
   1200                 }
   1201             break;
   1202 
   1203             case PH_FRINFC_NDEFMAP_STATE_WRITE_SEC:
   1204                 /* Set flag for writing of Acs bit */
   1205                 NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1206 
   1207                 /* The first NDEF sector is already made read only,
   1208                    set card state to read only and proceed*/
   1209                 if(NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY)
   1210                 {
   1211                     Status = phFriNfc_MapTool_SetCardState(NdefMap, NdefMap->TLVStruct.BytesRemainLinTLV);
   1212                     if(Status != NFCSTATUS_SUCCESS)
   1213                     {
   1214                         CRFlag = (uint8_t) PH_FRINFC_MIFARESTD_FLAG1;
   1215                     }
   1216                 }
   1217 
   1218                 if (CRFlag != PH_FRINFC_MIFARESTD_FLAG1)
   1219                 {
   1220                     Status = phFriNfc_MifStd_H_ProWrSectorTrailor(NdefMap);
   1221                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1222                                        PH_FRINFC_MIFARESTD_FLAG1:
   1223                                        PH_FRINFC_MIFARESTD_FLAG0);
   1224                 }
   1225                 break;
   1226 
   1227             default:
   1228                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1229                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
   1230                 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1231                 break;
   1232         }
   1233     }
   1234     else if(NdefMap->State == PH_FRINFC_NDEFMAP_STATE_AUTH)
   1235     {
   1236         NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1237         if(NdefMap->StdMifareContainer.FirstWriteFlag ==
   1238             PH_FRINFC_MIFARESTD_FLAG1)
   1239         {
   1240             NdefMap->StdMifareContainer.FirstWriteFlag =
   1241                                             PH_FRINFC_MIFARESTD_FLAG0;
   1242             NdefMap->StdMifareContainer.WrLength =
   1243                 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
   1244                 PH_FRINFC_MIFARESTD_FLAG0)?
   1245                 PH_FRINFC_MIFARESTD_VAL1:
   1246                 NdefMap->StdMifareContainer.WrLength);
   1247         }
   1248         /*if(NdefMap->StdMifareContainer.WrLength != PH_FRINFC_MIFARESTD_VAL0)
   1249         {
   1250             Status = NFCSTATUS_SUCCESS;
   1251             NdefMap->StdMifareContainer.ReadCompleteFlag =
   1252                                     PH_FRINFC_MIFARESTD_FLAG1;
   1253             *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
   1254             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1255         }
   1256         else*/ if(NdefMap->StdMifareContainer.WrLength == PH_FRINFC_MIFARESTD_VAL0)
   1257         {
   1258             Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1259                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
   1260             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1261         }
   1262         else
   1263         {
   1264             /* Authentication has failed */
   1265             Status = phFriNfc_MifStd_H_CallDisCon(NdefMap);
   1266             CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1267                         PH_FRINFC_MIFARESTD_FLAG1:
   1268                         PH_FRINFC_MIFARESTD_FLAG0);
   1269         }
   1270     }
   1271     else
   1272     {
   1273         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1274                             NFCSTATUS_INVALID_DEVICE_REQUEST);
   1275         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1276     }
   1277      /* Call Completion Routine if CR Flag is Set to 1 */
   1278     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   1279     {
   1280         phFriNfc_MifStd_H_Complete(NdefMap, Status);
   1281     }
   1282 }
   1283 
   1284 static NFCSTATUS phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t *NdefMap)
   1285 {
   1286     NFCSTATUS               status =    NFCSTATUS_PENDING;
   1287 
   1288     /* set the data for additional data exchange*/
   1289     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
   1290     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
   1291     NdefMap->psDepAdditionalInfo.NAD = 0;
   1292 
   1293     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_READ;
   1294     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
   1295     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   1296     NdefMap->MapCompletionInfo.Context = NdefMap;
   1297 
   1298     if( NdefMap->ApduBuffIndex <
   1299         (uint16_t)NdefMap->ApduBufferSize)
   1300     {
   1301 
   1302         if(NdefMap->StdMifareContainer.internalLength > PH_FRINFC_MIFARESTD_VAL0)
   1303         {
   1304             status = phFriNfc_MifStd_H_ChkIntLen(NdefMap);
   1305         }/* internal Length Check */
   1306         else
   1307         {
   1308             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   1309                         NdefMap->StdMifareContainer.currentBlock;
   1310             NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
   1311             *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1312 
   1313 #ifndef PH_HAL4_ENABLE
   1314             NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
   1315 #else
   1316             NdefMap->Cmd.MfCmd = phHal_eMifareRead;
   1317 #endif
   1318             /* Call the Overlapped HAL Transceive function */
   1319             status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   1320                                                     &NdefMap->MapCompletionInfo,
   1321                                                     NdefMap->psRemoteDevInfo,
   1322                                                     NdefMap->Cmd,
   1323                                                     &NdefMap->psDepAdditionalInfo,
   1324                                                     NdefMap->SendRecvBuf,
   1325                                                     NdefMap->SendLength,
   1326                                                     NdefMap->SendRecvBuf,
   1327                                                     NdefMap->SendRecvLength);
   1328         }
   1329     }
   1330     else
   1331     {
   1332         /* Check for the Card Size */
   1333         if((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   1334             NdefMap->StdMifareContainer.NdefBlocks) *
   1335             PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ||
   1336             (NdefMap->ApduBufferSize == NdefMap->ApduBuffIndex))
   1337         {
   1338             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   1339                 (uint8_t)((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   1340                 NdefMap->StdMifareContainer.NdefBlocks) *
   1341                 PH_FRINFC_MIFARESTD_BYTES_READ) == 0)?
   1342                 PH_FRINFC_MIFARESTD_FLAG1:
   1343                 PH_FRINFC_MIFARESTD_FLAG0);
   1344             *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
   1345             status = PHNFCSTVAL(CID_NFC_NONE,
   1346                                 NFCSTATUS_SUCCESS);
   1347         }
   1348         else
   1349         {
   1350             /*Error: The control should not ideally come here.
   1351                 Return Error.*/
   1352 #ifndef PH_HAL4_ENABLE
   1353             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
   1354 #else
   1355             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
   1356 #endif
   1357         }
   1358     }
   1359     return status;
   1360 }
   1361 
   1362 
   1363 static NFCSTATUS phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t *NdefMap)
   1364 {
   1365     NFCSTATUS               status =    NFCSTATUS_PENDING;
   1366 
   1367     uint16_t                    RemainingBytes = 0,
   1368                                 BytesRemained = 0,
   1369                                 index = 0;
   1370 
   1371     uint8_t                     Temp16Bytes = 0;
   1372 
   1373     /* set the data for additional data exchange*/
   1374     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
   1375     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
   1376     NdefMap->psDepAdditionalInfo.NAD = 0;
   1377     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   1378     NdefMap->MapCompletionInfo.Context = NdefMap;
   1379     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
   1380 
   1381     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE;
   1382 
   1383     /* User Buffer Check */
   1384     if( NdefMap->ApduBuffIndex <
   1385         (uint16_t)NdefMap->ApduBufferSize)
   1386     {
   1387         RemainingBytes = (((uint16_t)(NdefMap->ApduBufferSize -
   1388                          NdefMap->ApduBuffIndex) <
   1389                         NdefMap->StdMifareContainer.remainingSize )?
   1390                         (uint16_t)(NdefMap->ApduBufferSize -
   1391                         NdefMap->ApduBuffIndex):
   1392                         NdefMap->StdMifareContainer.remainingSize);
   1393 
   1394         NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
   1395         Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
   1396         /* Check for internal bytes */
   1397 
   1398         if(NdefMap->StdMifareContainer.internalLength > 0)
   1399         {
   1400             /* copy the bytes previously written in the internal Buffer */
   1401             (void)memcpy(&( NdefMap->SendRecvBuf[Temp16Bytes]),
   1402                     NdefMap->StdMifareContainer.internalBuf,
   1403                     NdefMap->StdMifareContainer.internalLength);
   1404 
   1405             Temp16Bytes += (uint8_t)(NdefMap->StdMifareContainer.internalLength);
   1406             if(RemainingBytes >= (  MIFARE_MAX_SEND_BUF_TO_WRITE -
   1407                                     Temp16Bytes))
   1408             {
   1409                 /* Copy the Remaining bytes from the user buffer to make the send
   1410                     data and length = 16 */
   1411                 (void)memcpy(&(NdefMap->SendRecvBuf[Temp16Bytes]),
   1412                         NdefMap->ApduBuffer,
   1413                         (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
   1414 
   1415                 NdefMap->NumOfBytesWritten =
   1416                     (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
   1417                 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
   1418                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
   1419             }
   1420             else
   1421             {
   1422                 (void)memcpy(&(NdefMap->SendRecvBuf[Temp16Bytes]),
   1423                         NdefMap->ApduBuffer,
   1424                         RemainingBytes);
   1425 
   1426                 NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1427                 NdefMap->NumOfBytesWritten = RemainingBytes;
   1428                 Temp16Bytes += (uint8_t)(RemainingBytes);
   1429                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
   1430 
   1431                 BytesRemained = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
   1432                 /* Pad empty bytes with Zeroes to complete 16 bytes*/
   1433                 for(index = 0; index < BytesRemained; index++)
   1434                 {
   1435                     NdefMap->SendRecvBuf[(Temp16Bytes + index)] =
   1436                                 (uint8_t)((index == PH_FRINFC_MIFARESTD_VAL0)?
   1437                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
   1438                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
   1439                     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1440                 }
   1441                 Temp16Bytes += (uint8_t)(BytesRemained);
   1442             }
   1443         }
   1444         else
   1445         {
   1446             if(RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
   1447             {
   1448                 /* Bytes left to write < 16
   1449                     copy remaining bytes */
   1450                 (void)memcpy( &(NdefMap->SendRecvBuf[
   1451                         Temp16Bytes]),
   1452                         &(NdefMap->ApduBuffer[
   1453                         NdefMap->ApduBuffIndex]),
   1454                         (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
   1455 
   1456                 NdefMap->NumOfBytesWritten = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
   1457                 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
   1458                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
   1459             }
   1460             else
   1461             {
   1462                 /* Bytes left to write < 16
   1463                     copy remaining bytes */
   1464                 (void)memcpy(&(NdefMap->SendRecvBuf[
   1465                         Temp16Bytes]),
   1466                         &(NdefMap->ApduBuffer[
   1467                         NdefMap->ApduBuffIndex]),
   1468                         RemainingBytes);
   1469 
   1470                 NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1471                 NdefMap->NumOfBytesWritten = RemainingBytes;
   1472                 Temp16Bytes += (uint8_t)(RemainingBytes);
   1473                 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
   1474 
   1475 
   1476                 /* Pad empty bytes with Zeroes to complete 16 bytes*/
   1477                 for(index = Temp16Bytes; index < MIFARE_MAX_SEND_BUF_TO_WRITE; index++)
   1478                 {
   1479                     NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
   1480                                     Temp16Bytes)?
   1481                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
   1482                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
   1483 
   1484                     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1485                 }
   1486             }
   1487         }
   1488         /* Buffer to store 16 bytes which is writing to the present block */
   1489         (void)memcpy( NdefMap->StdMifareContainer.Buffer,
   1490                 &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_INC_1]),
   1491                 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   1492 
   1493         /* Write from here */
   1494         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
   1495 #ifndef PH_HAL4_ENABLE
   1496         NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
   1497 #else
   1498         NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
   1499 #endif
   1500         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1501         /* Call the Overlapped HAL Transceive function */
   1502         status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   1503                                                 &NdefMap->MapCompletionInfo,
   1504                                                 NdefMap->psRemoteDevInfo,
   1505                                                 NdefMap->Cmd,
   1506                                                 &NdefMap->psDepAdditionalInfo,
   1507                                                 NdefMap->SendRecvBuf,
   1508                                                 NdefMap->SendLength,
   1509                                                 NdefMap->SendRecvBuf,
   1510                                                 NdefMap->SendRecvLength);
   1511     }
   1512     else/* Check User Buffer */
   1513     {
   1514         if(NdefMap->StdMifareContainer.NdefBlocks >
   1515              NdefMap->StdMifareContainer.NoOfNdefCompBlocks)
   1516         {
   1517             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   1518                 PH_FRINFC_MIFARESTD_FLAG1;
   1519             status = PHNFCSTVAL(CID_NFC_NONE,
   1520                                 NFCSTATUS_SUCCESS);
   1521         }
   1522         else if( NdefMap->ApduBuffIndex ==
   1523             (uint16_t)NdefMap->ApduBufferSize)
   1524         {
   1525             status = PHNFCSTVAL(CID_NFC_NONE,
   1526                                 NFCSTATUS_SUCCESS);
   1527         }
   1528         else
   1529         {
   1530             /*Error: The control should not ideally come here.
   1531               Return Error.*/
   1532 #ifndef PH_HAL4_ENABLE
   1533             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
   1534 #else
   1535             status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
   1536 #endif
   1537         }
   1538     }
   1539     return status;
   1540 }
   1541 
   1542 static NFCSTATUS phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t *NdefMap)
   1543 {
   1544     NFCSTATUS                   status = NFCSTATUS_PENDING;
   1545 
   1546     /* set the data for additional data exchange*/
   1547     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
   1548     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
   1549     NdefMap->psDepAdditionalInfo.NAD = 0;
   1550     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   1551     NdefMap->MapCompletionInfo.Context = NdefMap;
   1552 
   1553     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1554     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_AUTH;
   1555 
   1556     /* Authenticate */
   1557 #ifndef PH_HAL4_ENABLE
   1558     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentA;
   1559 #else
   1560     NdefMap->Cmd.MfCmd = phHal_eMifareAuthentA;
   1561 #endif
   1562     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   1563                             ((NdefMap->TLVStruct.NdefTLVAuthFlag ==
   1564                                 PH_FRINFC_MIFARESTD_FLAG1)?
   1565                                 NdefMap->TLVStruct.NdefTLVBlock:
   1566                                 NdefMap->StdMifareContainer.currentBlock);
   1567 
   1568     /* if MAD blocks then authentication key is
   1569         0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 else
   1570         0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 */
   1571     if(( (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK0) &&
   1572         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK1) &&
   1573         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK2) &&
   1574         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK64) &&
   1575         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK65) &&
   1576         (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK66)) ||
   1577         (NdefMap->TLVStruct.NdefTLVAuthFlag ==
   1578                                 (uint8_t)PH_FRINFC_MIFARESTD_FLAG1))
   1579     {
   1580         NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
   1581         NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
   1582         NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
   1583         NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
   1584         NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
   1585         NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
   1586     }
   1587     else
   1588     {
   1589         NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1; /* 0xA0 */
   1590         NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2; /* 0xA1 */
   1591         NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3; /* 0xA2 */
   1592         NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4; /* 0xA3 */
   1593         NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5; /* 0xA4 */
   1594         NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6; /* 0xA5 */
   1595     }
   1596 
   1597     if (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD ||
   1598         NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
   1599     {
   1600         if (NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
   1601             NdefMap->StdMifareContainer.SectorTrailerBlockNo ==  NdefMap->StdMifareContainer.currentBlock)
   1602         {
   1603             memcpy (&NdefMap->SendRecvBuf[1], &NdefMap->StdMifareContainer.UserScrtKeyB[0], PH_FRINFC_MIFARESTD_KEY_LEN);
   1604 
   1605             /* Authenticate with KeyB*/
   1606 #ifndef PH_HAL4_ENABLE
   1607             NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentB;
   1608 #else
   1609             NdefMap->Cmd.MfCmd = phHal_eMifareAuthentB;
   1610 #endif
   1611         }
   1612     }
   1613 
   1614     NdefMap->SendLength = MIFARE_AUTHENTICATE_CMD_LENGTH;
   1615     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1616     /* Call the Overlapped HAL Transceive function */
   1617     status = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   1618                                             &NdefMap->MapCompletionInfo,
   1619                                             NdefMap->psRemoteDevInfo,
   1620                                             NdefMap->Cmd,
   1621                                             &NdefMap->psDepAdditionalInfo,
   1622                                             NdefMap->SendRecvBuf,
   1623                                             NdefMap->SendLength,
   1624                                             NdefMap->SendRecvBuf,
   1625                                             NdefMap->SendRecvLength);
   1626 
   1627     return status;
   1628 }
   1629 
   1630 static void phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
   1631                                         NFCSTATUS            Result)
   1632 {
   1633     /* set the state back to the Reset_Init state*/
   1634     NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
   1635 
   1636     /* set the completion routine*/
   1637     NdefMap->CompletionRoutine[NdefMap->StdMifareContainer.CRIndex].
   1638         CompletionRoutine(NdefMap->CompletionRoutine->Context, Result);
   1639 }
   1640 
   1641 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t *NdefMap)
   1642 {
   1643     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   1644 
   1645     /* Get the AID Block */
   1646     if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2)
   1647     {
   1648         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK64;
   1649         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
   1650     }
   1651     else if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
   1652     {
   1653         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK65;
   1654     }
   1655     else
   1656     {
   1657         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK66;
   1658     }
   1659 
   1660     Result = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
   1661 
   1662     return Result;
   1663 
   1664 }
   1665 
   1666 static void phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t *NdefMap)
   1667 {
   1668     uint8_t     byteindex = 0;
   1669 
   1670     if( (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
   1671         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64))
   1672     {
   1673         /* The First Two Bytes in Receive Buffer
   1674             are CRC bytes so it is not copied
   1675             instead, 0 is copied in AID[0] & AID[1] */
   1676         NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
   1677                                     PH_FRINFC_MIFARESTD_NDEF_COMP;
   1678         NdefMap->StdMifareContainer.SectorIndex++;
   1679         byteindex = 2;
   1680     }
   1681 
   1682     while(byteindex < PH_FRINFC_MIFARESTD_BYTES_READ)
   1683     {
   1684         if((NdefMap->SendRecvBuf[byteindex] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2) &&
   1685             (NdefMap->SendRecvBuf[(byteindex + 1)] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1))
   1686         {
   1687             /* This flag is set when a NFC forum sector is found in a
   1688                 MAD block for the first time*/
   1689             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG1;
   1690             NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
   1691                                         PH_FRINFC_MIFARESTD_NDEF_COMP;
   1692             NdefMap->StdMifareContainer.SectorIndex++;
   1693         }
   1694         else
   1695         {
   1696             NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
   1697                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
   1698             NdefMap->StdMifareContainer.SectorIndex++;
   1699             /* AID complete flag is set when a non NFC forum sector is found in a
   1700                 MAD block after the NFC forum sector. After setting this, all other
   1701                 values are ignored and are NOT NDEF compliant */
   1702             NdefMap->StdMifareContainer.aidCompleteFlag =
   1703                 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
   1704                     PH_FRINFC_MIFARESTD_FLAG1)?
   1705                     PH_FRINFC_MIFARESTD_FLAG1:
   1706                     PH_FRINFC_MIFARESTD_FLAG0);
   1707 
   1708             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
   1709             if(NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1)
   1710             {
   1711                 break;
   1712             }
   1713         }
   1714         byteindex += 2;
   1715     }
   1716 
   1717     /* If "aidCompleteFlag" is set then the remaining sectors are made NOT
   1718         NDEF compliant */
   1719     if((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   1720         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
   1721     {
   1722         /* for Mifare 1k there are 16 sectors, till this number all sectors
   1723             are made NOT NDEF compliant */
   1724         for(byteindex = NdefMap->StdMifareContainer.SectorIndex;
   1725             byteindex < PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
   1726             byteindex++)
   1727         {
   1728              NdefMap->StdMifareContainer.aid[byteindex] =
   1729                                     PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
   1730         }
   1731     }
   1732     /* for Mifare 4k there are 40 sectors, till this number all sectors
   1733        are made NOT NDEF compliant */
   1734     else if((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   1735             (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
   1736     {
   1737         for(byteindex = NdefMap->StdMifareContainer.SectorIndex;
   1738             byteindex < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
   1739             byteindex++)
   1740         {
   1741             NdefMap->StdMifareContainer.aid[byteindex] =
   1742                 PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
   1743         }
   1744     }
   1745 }
   1746 
   1747 static NFCSTATUS phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t *NdefMap)
   1748 {
   1749     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   1750     uint8_t     SectorID = 0, callbreak = 0;
   1751 
   1752     for(;;)
   1753     {
   1754         /* Get a Sector ID for the Current Block */
   1755         SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
   1756         /* Check the card Type 1k or 4k */
   1757         /* enter if Mifare 1k card. For Mifare 4k go to else */
   1758         if(NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)
   1759         {
   1760             /* if Sector Id > 15 No Sectors to write */
   1761             if(SectorID > 15)
   1762             {
   1763                 SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
   1764                 /*Error: No Ndef Compliant Sectors present.*/
   1765                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1766                                     NFCSTATUS_INVALID_PARAMETER);
   1767                 callbreak = 1;
   1768             }
   1769             else
   1770             {
   1771                 phFriNfc_MifStd1k_H_BlkChk(NdefMap, SectorID, &callbreak);
   1772             }
   1773         } /* End of if */ /* End of Mifare 1k check */
   1774         else /* Mifare 4k check starts here */
   1775         {
   1776             /* Sector > 39 no ndef compliant sectors found*/
   1777             if(SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO39)
   1778             {
   1779                 /*Error: No Ndef Compliant Sectors present.*/
   1780                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1781                                     NFCSTATUS_INVALID_PARAMETER);
   1782                 callbreak = 1;
   1783             }
   1784             else if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
   1785             {
   1786                 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
   1787             }
   1788             else if(SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
   1789             {
   1790                 /* If the block checked is 63, the 3 blocks after this
   1791                     are AID(MAD) blocks so its need to be skipped */
   1792                 if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
   1793                 {
   1794                     NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
   1795                 }
   1796                 else
   1797                 {
   1798                     phFriNfc_MifStd1k_H_BlkChk(NdefMap, SectorID, &callbreak);
   1799                 }
   1800             }
   1801             else
   1802             {
   1803                 /* every last block of a sector needs to be skipped */
   1804                 if(((NdefMap->StdMifareContainer.currentBlock + 1) %
   1805                     PH_FRINFC_MIFARESTD_BLOCK_BYTES) == 0)
   1806                 {
   1807                     NdefMap->StdMifareContainer.currentBlock++;
   1808                 }
   1809                 else
   1810                 {
   1811                     if(NdefMap->StdMifareContainer.aid[SectorID] ==
   1812                             PH_FRINFC_MIFARESTD_NDEF_COMP)
   1813                     {
   1814                         /* Check whether the block is first block of a (next)new sector and
   1815                             also check if it is first block then internal length is zero
   1816                             or not. Because once Authentication is done for the sector again
   1817                             we should not authenticate it again */
   1818                         /* In this case 32 sectors contains 4 blocks and next remaining 8 sectors
   1819                             contains 16 blocks that is why (32 * 4) + (sectorID - 32) *16*/
   1820                         if((NdefMap->StdMifareContainer.currentBlock ==
   1821                             ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
   1822                             ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_BLOCK_BYTES))) &&
   1823                             (NdefMap->StdMifareContainer.internalLength == 0))
   1824                         {
   1825                             NdefMap->StdMifareContainer.AuthDone = 0;
   1826                         }
   1827                         callbreak = 1;
   1828                     }
   1829                     else
   1830                     {
   1831                         NdefMap->StdMifareContainer.currentBlock += 16;
   1832                     }
   1833                 }
   1834             }
   1835         }
   1836         if(callbreak == 1)
   1837         {
   1838             break;
   1839         }
   1840     }
   1841 
   1842     return Result;
   1843 }
   1844 
   1845 static uint8_t phFriNfc_MifStd_H_GetSect(uint8_t  BlockNumber)
   1846 {
   1847     uint8_t SectorID = 0;
   1848 
   1849     if(BlockNumber >= PH_FRINFC_MIFARESTD4K_BLK128)
   1850     {
   1851         SectorID = (uint8_t)(PH_FRINFC_MIFARESTD_SECTOR_NO32 +
   1852                     ((BlockNumber - PH_FRINFC_MIFARESTD4K_BLK128)/
   1853                     PH_FRINFC_MIFARESTD_BLOCK_BYTES));
   1854     }
   1855     else
   1856     {
   1857         SectorID = (BlockNumber/PH_FRINFC_MIFARESTD_BLK4);
   1858     }
   1859     return SectorID;
   1860 }
   1861 
   1862 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t *NdefMap)
   1863 {
   1864     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   1865     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT;
   1866 
   1867     if( NdefMap->StdMifareContainer.ReadOnlySectorIndex &&
   1868        NdefMap->StdMifareContainer.currentBlock == NdefMap->StdMifareContainer.SectorTrailerBlockNo)
   1869     {
   1870         NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_SEC_ACS_BIT;
   1871     }
   1872 
   1873     if(NdefMap->StdMifareContainer.ReadAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG1)
   1874     {
   1875         /* Get the sector trailer */
   1876         ((NdefMap->StdMifareContainer.currentBlock > 127)?
   1877             phFriNfc_MifStd_H_Get4kStTrail(NdefMap):
   1878             phFriNfc_MifStd_H_Get1kStTrail(NdefMap));
   1879     }
   1880     else
   1881     {
   1882         /* Give the current block to read */
   1883         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   1884                         NdefMap->StdMifareContainer.currentBlock;
   1885     }
   1886 
   1887     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
   1888                         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0]);
   1889 
   1890     return Result;
   1891 }
   1892 
   1893 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t *NdefMap)
   1894 {
   1895     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   1896 
   1897     /* Blocks from 0 to 3 and from 64 to 67(MAD blocks) */
   1898     if((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK0) ||
   1899         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
   1900         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2) ||
   1901         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK3) ||
   1902         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64) ||
   1903         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK65) ||
   1904         (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK66) )
   1905     {
   1906         /* Access bits check removed for the MAD blocks */
   1907 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
   1908 
   1909         if(((NdefMap->SendRecvBuf[
   1910             PH_FRINFC_MIFARESTD_VAL6] &
   1911             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1912             PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE6) &&
   1913             ((NdefMap->SendRecvBuf[
   1914             PH_FRINFC_MIFARESTD_VAL7] &
   1915             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1916             PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE7) &&
   1917             ((NdefMap->SendRecvBuf[
   1918             PH_FRINFC_MIFARESTD_VAL8] &
   1919             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1920             PH_FRINFC_MIFARESTD_ACS_BYTE8))
   1921         {
   1922             NdefMap->StdMifareContainer.WriteFlag =
   1923                 PH_FRINFC_MIFARESTD_FLAG0;
   1924             NdefMap->StdMifareContainer.ReadFlag =
   1925                 PH_FRINFC_MIFARESTD_FLAG1;
   1926         }
   1927         else
   1928         {
   1929             NdefMap->StdMifareContainer.WriteFlag =
   1930                 PH_FRINFC_MIFARESTD_FLAG0;
   1931             NdefMap->StdMifareContainer.ReadFlag =
   1932                 PH_FRINFC_MIFARESTD_FLAG0;
   1933         }
   1934 
   1935 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
   1936 
   1937         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
   1938 
   1939 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
   1940     }
   1941     else
   1942     {
   1943         /* Check for Access bytes 6, 7 and 8 value =
   1944             0x7F, 0x07, 0x88 NFC forum sectors*/
   1945         if(((NdefMap->SendRecvBuf[
   1946             PH_FRINFC_MIFARESTD_VAL6] &
   1947             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1948             PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE6) &&
   1949             ((NdefMap->SendRecvBuf[
   1950             PH_FRINFC_MIFARESTD_VAL7] &
   1951             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1952             PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE7) &&
   1953             ((NdefMap->SendRecvBuf[
   1954             PH_FRINFC_MIFARESTD_VAL8] &
   1955             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1956             PH_FRINFC_MIFARESTD_ACS_BYTE8))
   1957         {
   1958             NdefMap->StdMifareContainer.WriteFlag =
   1959                 PH_FRINFC_MIFARESTD_FLAG1;
   1960             NdefMap->StdMifareContainer.ReadFlag =
   1961                 PH_FRINFC_MIFARESTD_FLAG1;
   1962         }
   1963         else if(((NdefMap->SendRecvBuf[
   1964             PH_FRINFC_MIFARESTD_VAL6] &
   1965             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1966             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6) &&
   1967             ((NdefMap->SendRecvBuf[
   1968             PH_FRINFC_MIFARESTD_VAL7] &
   1969             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1970             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7) &&
   1971             ((NdefMap->SendRecvBuf[
   1972             PH_FRINFC_MIFARESTD_VAL8] &
   1973             PH_FRINFC_MIFARESTD_MASK_FF) ==
   1974             PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8))
   1975         {
   1976             /* Read Only state */
   1977             /* Check for Access bytes 6, 7 and 8 value =
   1978                 0x55, 0xAD, 0x2A NFC forum Sectors*/
   1979             NdefMap->StdMifareContainer.WriteFlag =
   1980                 PH_FRINFC_MIFARESTD_FLAG0;
   1981             NdefMap->StdMifareContainer.ReadFlag =
   1982                 PH_FRINFC_MIFARESTD_FLAG1;
   1983         }
   1984         else
   1985         {
   1986             NdefMap->StdMifareContainer.WriteFlag =
   1987                 PH_FRINFC_MIFARESTD_FLAG0;
   1988             NdefMap->StdMifareContainer.ReadFlag =
   1989                 PH_FRINFC_MIFARESTD_FLAG0;
   1990         }
   1991 
   1992 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
   1993 
   1994         /* Do nothing */
   1995 
   1996 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
   1997 
   1998         Result = phFriNfc_MifStd_H_GPBChk(NdefMap);
   1999 
   2000 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
   2001 
   2002     }
   2003 
   2004 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
   2005 
   2006     Result = phFriNfc_MifStd_H_GPBChk(NdefMap);
   2007 
   2008 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
   2009 
   2010     return Result;
   2011 }
   2012 
   2013 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t *NdefMap)
   2014 {
   2015     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   2016     switch(NdefMap->PrevOperation)
   2017     {
   2018         case PH_FRINFC_NDEFMAP_CHECK_OPE:
   2019             if(NdefMap->CardState ==
   2020                 PH_NDEFMAP_CARD_STATE_INVALID)
   2021             {
   2022                     /* No permission to read */
   2023                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   2024                                     NFCSTATUS_READ_FAILED);
   2025             }
   2026             else if((NdefMap->StdMifareContainer.currentBlock > 3) &&
   2027                 (NdefMap->StdMifareContainer.ChkNdefCompleteFlag ==
   2028                                     PH_FRINFC_MIFARESTD_FLAG1) &&
   2029                 (NdefMap->StdMifareContainer.currentBlock !=
   2030                             PH_FRINFC_MIFARESTD_MAD_BLK65) &&
   2031                 (NdefMap->StdMifareContainer.currentBlock !=
   2032                             PH_FRINFC_MIFARESTD_MAD_BLK66))
   2033             {
   2034                /* NdefMap->StdMifareContainer.currentBlock =
   2035                     ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
   2036                         PH_FRINFC_MIFARESTD_FLAG1)?
   2037                         NdefMap->StdMifareContainer.currentBlock:
   2038                         (NdefMap->StdMifareContainer.currentBlock +
   2039                         PH_FRINFC_MIFARESTD_VAL4));
   2040                 NdefMap->StdMifareContainer.currentBlock =
   2041                     ((NdefMap->StdMifareContainer.currentBlock ==
   2042                         PH_FRINFC_MIFARESTD_MAD_BLK64)?
   2043                     (NdefMap->StdMifareContainer.currentBlock +
   2044                     PH_FRINFC_MIFARESTD_VAL4):
   2045                     NdefMap->StdMifareContainer.currentBlock);*/
   2046 
   2047                     Result = ((NdefMap->StdMifareContainer.ReadAcsBitFlag ==
   2048                                 PH_FRINFC_MIFARESTD_FLAG0)?
   2049                                 phFriNfc_MifStd_H_RdAcsBit(NdefMap):
   2050                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   2051             }
   2052             else
   2053             {
   2054                 Result = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
   2055             }
   2056             break;
   2057 
   2058         case PH_FRINFC_NDEFMAP_READ_OPE:
   2059             if(NdefMap->CardState ==
   2060                 PH_NDEFMAP_CARD_STATE_INVALID)
   2061             {
   2062                 /* No permission to Read */
   2063                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   2064                                     NFCSTATUS_READ_FAILED);
   2065             }
   2066             else if(NdefMap->StdMifareContainer.ReadNdefFlag ==
   2067                     PH_FRINFC_MIFARESTD_FLAG1)
   2068             {
   2069                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   2070             }
   2071             else
   2072             {
   2073                 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
   2074             }
   2075             break;
   2076 
   2077         case PH_FRINFC_NDEFMAP_WRITE_OPE:
   2078             if((NdefMap->CardState ==
   2079                 PH_NDEFMAP_CARD_STATE_INVALID) ||
   2080                 (NdefMap->CardState ==
   2081                 PH_NDEFMAP_CARD_STATE_READ_ONLY))
   2082             {
   2083                 /* No permission to Read */
   2084                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   2085                                     NFCSTATUS_WRITE_FAILED);
   2086             }
   2087             else if(NdefMap->StdMifareContainer.WrNdefFlag ==
   2088                     PH_FRINFC_MIFARESTD_FLAG1)
   2089             {
   2090                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   2091             }
   2092             else if(NdefMap->StdMifareContainer.RdBeforeWrFlag ==
   2093                     PH_FRINFC_MIFARESTD_FLAG1)
   2094             {
   2095                 /*NdefMap->StdMifareContainer.ReadFlag =
   2096                                 PH_FRINFC_MIFARESTD_FLAG0;*/
   2097                 Result = phFriNfc_MifStd_H_RdBeforeWr(NdefMap);
   2098             }
   2099             else if(NdefMap->StdMifareContainer.RdAfterWrFlag ==
   2100                     PH_FRINFC_MIFARESTD_FLAG1)
   2101             {
   2102                 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
   2103             }
   2104             else
   2105             {
   2106                 Result = (((NdefMap->TLVStruct.NdefTLVBlock ==
   2107                             NdefMap->StdMifareContainer.currentBlock) &&
   2108                             (NdefMap->Offset ==
   2109                             PH_FRINFC_NDEFMAP_SEEK_BEGIN))?
   2110                             phFriNfc_MifStd_H_RdBeforeWr(NdefMap):
   2111                             phFriNfc_MifStd_H_WrABlock(NdefMap));
   2112             }
   2113             break;
   2114 
   2115         case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
   2116             Result = ((NdefMap->StdMifareContainer.ReadFlag ==
   2117                         PH_FRINFC_MIFARESTD_FLAG0)?
   2118                         (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   2119                         NFCSTATUS_READ_FAILED)):
   2120                         phFriNfc_MifStd_H_GetActCardLen(NdefMap));
   2121             break;
   2122 
   2123         default:
   2124             /* Operation is not correct */
   2125             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   2126                                 NFCSTATUS_INVALID_PARAMETER);
   2127 
   2128             break;
   2129     }
   2130     return Result;
   2131 }
   2132 
   2133 static void phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t *NdefMap)
   2134 {
   2135     uint8_t index = 0;
   2136     if(NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
   2137     {
   2138         for(index = 0; index < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR; index++)
   2139         {
   2140             /* For Mifare 4k, Block 0 to 31 contains 4 blocks */
   2141             /* sector 0 and 15 are aid blocks */
   2142             if(index != PH_FRINFC_MIFARESTD_SECTOR_NO16)
   2143             {
   2144                 if(( (index < 32) && (index != PH_FRINFC_MIFARESTD_SECTOR_NO0))
   2145                 && (NdefMap->StdMifareContainer.aid[index] ==
   2146                             PH_FRINFC_MIFARESTD_NON_NDEF_COMP))
   2147                 {
   2148                     /* Only 3 blocks can be read/written till sector 31 */
   2149                     NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
   2150                                                 PH_FRINFC_MIFARESTD_MAD_BLK3;
   2151 
   2152                 }
   2153                 else
   2154                 {
   2155                     /* For Mifare 4k, Block 32 to 39 contains 16 blocks */
   2156                     if(NdefMap->StdMifareContainer.aid[index] ==
   2157                         PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
   2158                     {
   2159                         /* Only 15 blocks can be read/written from sector 31 */
   2160                         NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
   2161                                                 PH_FRINFC_MIFARESTD_BLK15;
   2162                     }
   2163                 }
   2164             }
   2165         } /* For index > 40 */
   2166     }
   2167     else
   2168     {
   2169         for(index = PH_FRINFC_MIFARESTD_SECTOR_NO1;
   2170             index < PH_FRINFC_MIFARESTD_SECTOR_NO16; index++)
   2171         {
   2172             if(NdefMap->StdMifareContainer.aid[index] ==
   2173                 PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
   2174             {
   2175                 /*  Only three blocks can be read/written in
   2176                     a sector. So if a sector is non-ndef
   2177                     compliant, decrement 3 */
   2178                 NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
   2179                                         PH_FRINFC_MIFARESTD_MAD_BLK3;
   2180             }
   2181         }
   2182     }
   2183 }
   2184 
   2185 #if 0
   2186 static uint8_t phFriNfc_MifStd_H_ChkNdefLen(phFriNfc_NdefMap_t *NdefMap,
   2187                                         uint8_t             NDEFlength,
   2188                                         uint8_t             *CRFlag)
   2189 {
   2190     uint8_t     NoLengthBytesinTLV = 0,
   2191                 TempBuffer[16] = {0};
   2192     uint16_t    TempLength = 0;
   2193 
   2194     TempLength = ((NdefMap->StdMifareContainer.internalLength > 0)?
   2195                 NdefMap->StdMifareContainer.internalLength :
   2196                 PH_FRINFC_MIFARESTD_BYTES_READ);
   2197 
   2198     if(NdefMap->StdMifareContainer.internalLength > 0)
   2199     {
   2200         (void)memcpy( TempBuffer,
   2201                 NdefMap->StdMifareContainer.internalBuf,
   2202                 TempLength);
   2203     }
   2204     else
   2205     {
   2206         (void)memcpy( TempBuffer,
   2207                 NdefMap->SendRecvBuf,
   2208                 TempLength);
   2209     }
   2210 
   2211     /* if number of bytes for length (L) in TLV is greater than 0*/
   2212     if(NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_VAL0)
   2213     {
   2214         switch(NdefMap->TLVStruct.NoLbytesinTLV)
   2215         {
   2216             /* there are two bytes remaining in the length (L) of TLV */
   2217             case PH_FRINFC_MIFARESTD_VAL2:
   2218                 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES2;
   2219                 /* Get the value of the length (L) of the TLV */
   2220                 NdefMap->TLVStruct.BytesRemainLinTLV = *TempBuffer;
   2221                 NdefMap->TLVStruct.BytesRemainLinTLV =
   2222                         ((NdefMap->TLVStruct.BytesRemainLinTLV
   2223                         << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + (TempBuffer[
   2224                         PH_FRINFC_MIFARESTD_INC_1]));
   2225 
   2226                 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <
   2227                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   2228                             PH_FRINFC_MIFARESTD_FLAG1 :
   2229                             PH_FRINFC_MIFARESTD_FLAG0);
   2230                 NdefMap->TLVStruct.BytesRemainLinTLV = ((*CRFlag ==
   2231                                     PH_FRINFC_MIFARESTD_FLAG1)?
   2232                                     PH_FRINFC_MIFARESTD_VAL0:
   2233                                     NdefMap->TLVStruct.BytesRemainLinTLV);
   2234                 break;
   2235 
   2236             /* there is only one byte remaining in the length (L) of TLV */
   2237             case PH_FRINFC_MIFARESTD_VAL1:
   2238                 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
   2239                 /* Get the value of the length (L) of the TLV */
   2240                 NdefMap->TLVStruct.BytesRemainLinTLV =
   2241                             NdefMap->TLVStruct.prevLenByteValue;
   2242 
   2243                 NdefMap->TLVStruct.BytesRemainLinTLV =
   2244                         ((NdefMap->TLVStruct.BytesRemainLinTLV
   2245                         << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + (*TempBuffer));
   2246                 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <
   2247                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   2248                             PH_FRINFC_MIFARESTD_FLAG1 :
   2249                             PH_FRINFC_MIFARESTD_FLAG0);
   2250 
   2251                 NdefMap->TLVStruct.BytesRemainLinTLV = ((*CRFlag ==
   2252                                     PH_FRINFC_MIFARESTD_FLAG1)?
   2253                                     PH_FRINFC_MIFARESTD_VAL0:
   2254                                     NdefMap->TLVStruct.BytesRemainLinTLV);
   2255                 break;
   2256 
   2257             default:
   2258                 break;
   2259         }
   2260         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
   2261         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2262         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2263     }
   2264     else if(TempBuffer[NDEFlength] <
   2265                 PH_FRINFC_MIFARESTD_NDEFTLV_L)
   2266     {
   2267         NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
   2268         /* Get the value of the length (L) of the TLV */
   2269         NdefMap->TLVStruct.BytesRemainLinTLV =
   2270                                 TempBuffer[NDEFlength];
   2271 
   2272         /* if NDEFLength has reached 16 bytes, then the next coming byte is not of type in TLV  */
   2273         NdefMap->TLVStruct.TcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
   2274                                                     == PH_FRINFC_MIFARESTD_BYTES_READ)?
   2275                                                     PH_FRINFC_MIFARESTD_FLAG1 :
   2276                                                     PH_FRINFC_MIFARESTD_FLAG0);
   2277         /* if NDEFLength has reached 16 bytes, then the next coming byte is not of length in TLV */
   2278         NdefMap->TLVStruct.LcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
   2279                                                         == PH_FRINFC_MIFARESTD_BYTES_READ)?
   2280                                                         PH_FRINFC_MIFARESTD_FLAG1 :
   2281                                                         PH_FRINFC_MIFARESTD_FLAG0);
   2282     }
   2283     else
   2284     {
   2285         if((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
   2286             == PH_FRINFC_MIFARESTD_BYTES_READ)
   2287         {
   2288             NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
   2289             /* Number of bytes left for length (L) field in TLV */
   2290             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL2;
   2291             /* if NDEFLength has reached 16 bytes, then the next coming byte is not of type in TLV  */
   2292             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2293             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2294         }
   2295         else if((NDEFlength + PH_FRINFC_MIFARESTD_INC_2)
   2296                 == PH_FRINFC_MIFARESTD_BYTES_READ)
   2297         {
   2298             NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES2;
   2299             /* Number of bytes left for length (L) field in TLV */
   2300             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL1;
   2301             /* if NDEFLength has reached 16 bytes, then the next byte is not of type in TLV  */
   2302             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2303             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2304             /* copy the value of the length field */
   2305             NdefMap->TLVStruct.prevLenByteValue =
   2306                 NdefMap->SendRecvBuf[(NDEFlength + PH_FRINFC_MIFARESTD_INC_1)];
   2307         }
   2308         else
   2309         {
   2310             /* if NDEFLength has reached 16 bytes, then the next byte is not of type in TLV  */
   2311             NdefMap->TLVStruct.TcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_3)
   2312                                                         == PH_FRINFC_MIFARESTD_BYTES_READ)?
   2313                                                         PH_FRINFC_MIFARESTD_FLAG1 :
   2314                                                         PH_FRINFC_MIFARESTD_FLAG0);
   2315 
   2316             /* if NDEFLength has reached 16 bytes, then the next byte is not of length in TLV */
   2317             NdefMap->TLVStruct.LcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
   2318                                                             == PH_FRINFC_MIFARESTD_BYTES_READ)?
   2319                                                             PH_FRINFC_MIFARESTD_FLAG1 :
   2320                                                             PH_FRINFC_MIFARESTD_FLAG0);
   2321 
   2322             /* Number of bytes left for length (L) field in TLV */
   2323             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
   2324 
   2325             NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES3;
   2326             /* Get the value of the length (L) of the TLV */
   2327             NdefMap->TLVStruct.BytesRemainLinTLV =
   2328                                             TempBuffer[(NDEFlength +
   2329                                             PH_FRINFC_MIFARESTD_INC_1)];
   2330 
   2331             NdefMap->TLVStruct.BytesRemainLinTLV =
   2332                     ((NdefMap->TLVStruct.BytesRemainLinTLV
   2333                     << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + TempBuffer[
   2334                     (NDEFlength +PH_FRINFC_MIFARESTD_INC_2)]);
   2335 
   2336             *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <
   2337                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   2338                             PH_FRINFC_MIFARESTD_FLAG1 :
   2339                             PH_FRINFC_MIFARESTD_FLAG0);
   2340         }
   2341     }
   2342     return NoLengthBytesinTLV;
   2343 }
   2344 #endif
   2345 #if 0
   2346 static NFCSTATUS phFriNfc_MifStd_H_RdNdefTLV(phFriNfc_NdefMap_t *NdefMap,
   2347                                          uint8_t            *Temp16Bytes)
   2348 {
   2349     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2350     uint8_t     NDEFlength = 0,
   2351                 RdFlag = 0,
   2352                 CRFlag = 0;
   2353     uint16_t    RemainingBytes = 0;
   2354 
   2355     while(PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->TLVStruct.NdefTLVFoundFlag)
   2356     {
   2357         RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
   2358                             NdefMap->ApduBuffIndex);
   2359         if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   2360             NdefMap->StdMifareContainer.NdefBlocks) *
   2361             PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   2362             PH_FRINFC_MIFARESTD_BLOCK_BYTES) <
   2363             RemainingBytes)
   2364         {
   2365             /* If the user Buffer is greater than the Card Size
   2366                 set LastBlockFlag = 1. This Flag is used to read bytes
   2367                 till the end of the card only */
   2368             RemainingBytes = ((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   2369                                 NdefMap->StdMifareContainer.NdefBlocks) * 16) +
   2370                                 NdefMap->StdMifareContainer.internalLength);
   2371 
   2372         }
   2373         /* Ndef TLV flag to 0 */
   2374         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2375 
   2376         if((NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
   2377             (NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
   2378             (NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0))
   2379         {
   2380             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2381             break;
   2382         }
   2383 
   2384         /* if type (T) of TLV flag is not set then only the below check is valid
   2385             because, for eg. assume, type (T) of TLV flag is set then this means
   2386             that it is already checked from the previous 16 bytes data (T is the
   2387             last byte of 16 bytes */
   2388         if(NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
   2389         {
   2390             CRFlag = ((NdefMap->SendRecvBuf[(*Temp16Bytes)]!=
   2391                         PH_FRINFC_MIFARESTD_NDEFTLV_T)?
   2392                         PH_FRINFC_MIFARESTD_FLAG1:
   2393                         PH_FRINFC_MIFARESTD_FLAG0);
   2394 
   2395             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   2396             {
   2397                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   2398                                     PH_FRINFC_MIFARESTD_FLAG1;
   2399                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2400                 break;
   2401             }
   2402             /* skip Type T of the TLV */
   2403             *Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
   2404         }
   2405         else
   2406         {
   2407             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2408         }
   2409 
   2410         if((*Temp16Bytes + PH_FRINFC_MIFARESTD_VAL1) == PH_FRINFC_MIFARESTD_BYTES_READ)
   2411         {
   2412             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2413             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2414             /* 16 bytes completed */
   2415             NdefMap->StdMifareContainer.currentBlock++;
   2416             NdefMap->StdMifareContainer.NdefBlocks++;
   2417             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   2418             if(Result == NFCSTATUS_SUCCESS)
   2419             {
   2420                 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
   2421                 {
   2422                     Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
   2423                 }
   2424                 else
   2425                 {
   2426                     Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   2427                 }
   2428             }
   2429             break;
   2430         }
   2431         /* skip number of bytes taken by L in TLV, if L is already read */
   2432         if(NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
   2433         {
   2434             /*CRFlag = (((*(NdefMap->SendRecvBuf + *Temp16Bytes) ==
   2435                         PH_FRINFC_MIFARESTD_NDEFTLV_L0) &&
   2436                         (NdefMap->TLVStruct.NoLbytesinTLV ==
   2437                         PH_FRINFC_MIFARESTD_VAL0))?
   2438                         PH_FRINFC_MIFARESTD_FLAG1:
   2439                         PH_FRINFC_MIFARESTD_FLAG0);*/
   2440 
   2441             NDEFlength = *Temp16Bytes;
   2442             *Temp16Bytes += phFriNfc_MifStd_H_ChkNdefLen(NdefMap,
   2443                                                             NDEFlength,
   2444                                                             &CRFlag);
   2445             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   2446             {
   2447                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   2448                                     PH_FRINFC_MIFARESTD_FLAG1;
   2449                 break;
   2450             }
   2451 
   2452         }
   2453         else
   2454         {
   2455             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2456         }
   2457 
   2458         if(*Temp16Bytes == PH_FRINFC_MIFARESTD_BYTES_READ)
   2459         {
   2460             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2461             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2462             /* 16 bytes completed */
   2463             NdefMap->StdMifareContainer.currentBlock++;
   2464             NdefMap->StdMifareContainer.NdefBlocks++;
   2465             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   2466             if(Result == NFCSTATUS_SUCCESS)
   2467             {
   2468                 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
   2469                 {
   2470                     Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
   2471                 }
   2472                 else
   2473                 {
   2474                     Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   2475                 }
   2476             }
   2477             break;
   2478         }
   2479 
   2480         if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   2481             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
   2482             (RemainingBytes <=
   2483                 NdefMap->TLVStruct.BytesRemainLinTLV))
   2484         {
   2485             /* Copy data to user buffer */
   2486             (void)memcpy(&(NdefMap->ApduBuffer[
   2487                     NdefMap->ApduBuffIndex]),
   2488                     &(NdefMap->SendRecvBuf[
   2489                     (*Temp16Bytes)]),
   2490                     RemainingBytes);
   2491             NdefMap->ApduBuffIndex += RemainingBytes;
   2492             *Temp16Bytes += ((uint8_t)RemainingBytes);
   2493             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   2494 
   2495             if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
   2496             {
   2497                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2498                 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2499                 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2500             }
   2501             else
   2502             {
   2503                 /* copy the bytes to internal buffer that are read,
   2504                     but not used for the user buffer */
   2505                 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
   2506                     &(NdefMap->SendRecvBuf[(*Temp16Bytes)]),
   2507                     (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes));
   2508 
   2509                 /* TempLength of the internal buffer */
   2510                 NdefMap->StdMifareContainer.internalLength =
   2511                             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
   2512             }
   2513             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2514             break;
   2515         }
   2516         else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   2517             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
   2518             (RemainingBytes >
   2519                 NdefMap->TLVStruct.BytesRemainLinTLV))
   2520         {
   2521             /* Copy data to user buffer */
   2522             (void)memcpy(&(NdefMap->ApduBuffer[
   2523                     NdefMap->ApduBuffIndex]),
   2524                     &(NdefMap->SendRecvBuf[
   2525                     (*Temp16Bytes)]),
   2526                     NdefMap->TLVStruct.BytesRemainLinTLV);
   2527             /* increment the user buffer index */
   2528             NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
   2529             *Temp16Bytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
   2530             NdefMap->TLVStruct.BytesRemainLinTLV = 0;
   2531             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2532             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2533             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2534 
   2535             /* check for 16 bytes of data been used */
   2536             if(*Temp16Bytes == PH_FRINFC_MIFARESTD_BYTES_READ)
   2537             {
   2538                 /* 16 bytes completed */
   2539                 NdefMap->StdMifareContainer.currentBlock++;
   2540                 NdefMap->StdMifareContainer.NdefBlocks++;
   2541                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   2542                 if(Result == NFCSTATUS_SUCCESS)
   2543                 {
   2544                     if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
   2545                     {
   2546                         Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
   2547                     }
   2548                     else
   2549                     {
   2550                         Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   2551                     }
   2552                 }
   2553                 break;
   2554             }
   2555         }
   2556         else if((NdefMap->TLVStruct.BytesRemainLinTLV >
   2557             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
   2558             (RemainingBytes <=
   2559                 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)))
   2560         {
   2561             /* Copy data to user buffer */
   2562             (void)memcpy(&(NdefMap->ApduBuffer[
   2563                     NdefMap->ApduBuffIndex]),
   2564                     &(NdefMap->SendRecvBuf[
   2565                     (*Temp16Bytes)]),
   2566                     RemainingBytes);
   2567             NdefMap->ApduBuffIndex += RemainingBytes;
   2568             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   2569             if(RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes))
   2570             {
   2571                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   2572                     (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   2573                     (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   2574                     PH_FRINFC_MIFARESTD_FLAG1:
   2575                     PH_FRINFC_MIFARESTD_FLAG0);
   2576 
   2577                 /* 16 bytes completed */
   2578                 NdefMap->StdMifareContainer.currentBlock++;
   2579                 NdefMap->StdMifareContainer.NdefBlocks++;
   2580             }
   2581             else
   2582             {
   2583                 /* copy the bytes to internal buffer, that are read,
   2584                     but not used for the user buffer */
   2585                 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
   2586                     &(NdefMap->SendRecvBuf[((*Temp16Bytes) + RemainingBytes)]),
   2587                     (PH_FRINFC_MIFARESTD_BYTES_READ -
   2588                     (*Temp16Bytes + RemainingBytes)));
   2589 
   2590                 /* Length of the internal buffer */
   2591                 NdefMap->StdMifareContainer.internalLength =
   2592                             (PH_FRINFC_MIFARESTD_BYTES_READ -
   2593                             (*Temp16Bytes + RemainingBytes));
   2594             }
   2595             *Temp16Bytes += ((uint8_t)RemainingBytes);
   2596             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2597             break;
   2598         }
   2599         else
   2600         {
   2601             if((NdefMap->TLVStruct.BytesRemainLinTLV >
   2602             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
   2603             (RemainingBytes >
   2604                 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)))
   2605             {
   2606                 /* Copy data to user buffer */
   2607                 (void)memcpy(&(NdefMap->ApduBuffer[
   2608                         NdefMap->ApduBuffIndex]),
   2609                         &(NdefMap->SendRecvBuf[
   2610                         (*Temp16Bytes)]),
   2611                         (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes));
   2612                 NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
   2613                 NdefMap->TLVStruct.BytesRemainLinTLV -=
   2614                             (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
   2615                 *Temp16Bytes = PH_FRINFC_MIFARESTD_BYTES_READ;
   2616 
   2617 
   2618                 /* 16 bytes completed */
   2619                 NdefMap->StdMifareContainer.currentBlock++;
   2620                 NdefMap->StdMifareContainer.NdefBlocks++;
   2621                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   2622                 if(Result == NFCSTATUS_SUCCESS)
   2623                 {
   2624                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
   2625                                 PH_FRINFC_MIFARESTD_FLAG1)?
   2626                                 phFriNfc_MifStd_H_RdABlock(NdefMap):
   2627                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   2628                 }
   2629                 break;
   2630             }
   2631         }
   2632     }
   2633 
   2634     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   2635     {
   2636         Result = (((RdFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   2637                     (NdefMap->ApduBuffIndex == PH_FRINFC_MIFARESTD_VAL0))?
   2638                     (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   2639                                 NFCSTATUS_EOF_CARD_REACHED)):
   2640                     Result);
   2641         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
   2642         phFriNfc_MifStd_H_Complete(NdefMap, Result);
   2643     }
   2644     return Result;
   2645 }
   2646 #endif
   2647 
   2648 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t *NdefMap,
   2649                                          uint8_t            *Flag,
   2650                                          uint8_t            *Temp16Bytes)
   2651 {
   2652     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2653     uint8_t     CRFlag = 0;
   2654     uint16_t    RemainingBytes = 0;
   2655 
   2656     RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
   2657                             NdefMap->ApduBuffIndex);
   2658 
   2659     if(NdefMap->StdMifareContainer.remainingSize <
   2660         RemainingBytes)
   2661     {
   2662         /* If the user Buffer is greater than the Card Size
   2663             set LastBlockFlag = 1. This Flag is used to read bytes
   2664             till the end of the card only */
   2665         RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
   2666     }
   2667 
   2668     /* Remaining Bytes of length (L) in TLV <=  16 */
   2669     if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   2670         (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
   2671         (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
   2672     {
   2673         /* Copy data to user buffer */
   2674         (void)memcpy(&(NdefMap->ApduBuffer[
   2675                 NdefMap->ApduBuffIndex]),
   2676                 &(NdefMap->SendRecvBuf[
   2677                 (*Temp16Bytes)]),
   2678                 RemainingBytes);
   2679         NdefMap->ApduBuffIndex += RemainingBytes;
   2680         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
   2681 
   2682         /* copy the bytes to internal buffer, that are read,
   2683                         but not used for the user buffer */
   2684         if(RemainingBytes != NdefMap->TLVStruct.BytesRemainLinTLV)
   2685         {
   2686             (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   2687 #ifdef PH_HAL4_ENABLE
   2688                     &(NdefMap->SendRecvBuf[((*Temp16Bytes) + RemainingBytes)]),
   2689 #else
   2690                     &(NdefMap->SendRecvBuf[RemainingBytes]),
   2691 #endif /* #ifdef PH_HAL4_ENABLE */
   2692                     ((PH_FRINFC_MIFARESTD_BYTES_READ -
   2693                     (*Temp16Bytes)) - RemainingBytes));
   2694 
   2695             /* internal buffer length */
   2696             NdefMap->StdMifareContainer.internalLength =
   2697                     ((PH_FRINFC_MIFARESTD_BYTES_READ -
   2698                     (*Temp16Bytes)) - RemainingBytes);
   2699         }
   2700         *Temp16Bytes += ((uint8_t)RemainingBytes);
   2701         /* Remaining Bytes of length value in TLV */
   2702         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   2703 
   2704         if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
   2705         {
   2706             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   2707             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   2708             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   2709             PH_FRINFC_MIFARESTD_FLAG1:
   2710             PH_FRINFC_MIFARESTD_FLAG0);
   2711 
   2712             /* internal length bytes completed */
   2713             NdefMap->StdMifareContainer.currentBlock++;
   2714             NdefMap->StdMifareContainer.NdefBlocks++;
   2715         }
   2716 
   2717         if(NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)
   2718         {
   2719             /* Remaining Bytes of length (L) in TLV is Zero means that the next
   2720              coming bytes are containing type (T), length (L) in TLV */
   2721             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2722             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2723             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2724         }
   2725         /* call completion routine */
   2726         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2727         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   2728     }
   2729     else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   2730             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
   2731             (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
   2732     {
   2733         /* Copy data to user buffer */
   2734         (void)memcpy(&(NdefMap->ApduBuffer[
   2735                 NdefMap->ApduBuffIndex]),
   2736                 &(NdefMap->SendRecvBuf[
   2737                 (*Temp16Bytes)]),
   2738                 NdefMap->TLVStruct.BytesRemainLinTLV);
   2739         NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
   2740         NdefMap->StdMifareContainer.remainingSize -=
   2741                                 NdefMap->TLVStruct.BytesRemainLinTLV;
   2742         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2743         *Temp16Bytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
   2744         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
   2745 
   2746         *Flag = PH_FRINFC_MIFARESTD_FLAG1;
   2747 
   2748         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2749         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2750         /* 16 bytes completed */
   2751         if(NdefMap->TLVStruct.BytesRemainLinTLV ==
   2752             PH_FRINFC_MIFARESTD_BYTES_READ)
   2753         {
   2754             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   2755             NdefMap->TLVStruct.BytesRemainLinTLV =
   2756                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
   2757             NdefMap->StdMifareContainer.currentBlock++;
   2758             NdefMap->StdMifareContainer.NdefBlocks++;
   2759             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   2760             if(Result == NFCSTATUS_SUCCESS)
   2761             {
   2762                 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
   2763                 {
   2764                     Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
   2765                 }
   2766                 else
   2767                 {
   2768                     Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   2769                 }
   2770             }
   2771         }
   2772         else
   2773         {
   2774             NdefMap->TLVStruct.BytesRemainLinTLV =
   2775                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
   2776             /* The read operation has finished. so, completion routine
   2777             can be called. set the Completion routine(CR) flag */
   2778             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2779         }
   2780     }
   2781     else if((NdefMap->TLVStruct.BytesRemainLinTLV >
   2782             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
   2783             (RemainingBytes <= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
   2784     {
   2785         /* Copy data to user buffer */
   2786         (void)memcpy(&(NdefMap->ApduBuffer[
   2787                 NdefMap->ApduBuffIndex]),
   2788                 &(NdefMap->SendRecvBuf[
   2789                 (*Temp16Bytes)]),
   2790                 RemainingBytes);
   2791         NdefMap->ApduBuffIndex += RemainingBytes;
   2792         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
   2793 
   2794         /* Remaining Bytes of length (L) in TLV */
   2795         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   2796         /*
   2797             The below macro PH_HAL4_ENABLE is added because,
   2798             there is an error with the following sequence
   2799             Read begin (for ex : with 10 bytes)
   2800             Read current (for ex : with 10 bytes). Here error buffer
   2801             is returned
   2802             Reason : During first read, internal buffer is updated
   2803                     with the wrong buffer values
   2804             Actually, if we read the first block (means TLV block), it
   2805             contains even the TLV structure. so to copy the actual buffer,
   2806             the TLV shall be excluded
   2807         */
   2808 #ifdef PH_HAL4_ENABLE
   2809         /* copy the bytes to internal buffer, that are read,
   2810                         but not used for the user buffer */
   2811         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   2812                 &(NdefMap->SendRecvBuf[(RemainingBytes + (*Temp16Bytes))]),
   2813                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
   2814                 - RemainingBytes));
   2815 
   2816         /* internal buffer length */
   2817         NdefMap->StdMifareContainer.internalLength =
   2818                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
   2819 #else
   2820         /* copy the bytes to internal buffer, that are read,
   2821                         but not used for the user buffer */
   2822         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   2823                 &(NdefMap->SendRecvBuf[RemainingBytes]),
   2824                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
   2825                 - RemainingBytes));
   2826 
   2827         /* internal buffer length */
   2828         NdefMap->StdMifareContainer.internalLength =
   2829                 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
   2830 #endif /* #ifdef PH_HAL4_ENABLE */
   2831 
   2832         if(RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)))
   2833         {
   2834             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   2835                 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   2836                 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   2837                 PH_FRINFC_MIFARESTD_FLAG1:
   2838                 PH_FRINFC_MIFARESTD_FLAG0);
   2839 
   2840             /* internal length bytes completed */
   2841             NdefMap->StdMifareContainer.currentBlock++;
   2842             NdefMap->StdMifareContainer.NdefBlocks++;
   2843         }
   2844         *Temp16Bytes += ((uint8_t)RemainingBytes);
   2845         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2846         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2847         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   2848     }
   2849     else
   2850     {
   2851         if((NdefMap->TLVStruct.BytesRemainLinTLV >
   2852             (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
   2853             (RemainingBytes > (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
   2854         {
   2855             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   2856             /* Copy data to user buffer */
   2857             (void)memcpy(&(NdefMap->ApduBuffer
   2858                     [NdefMap->ApduBuffIndex]),
   2859                     &(NdefMap->SendRecvBuf[
   2860                     (*Temp16Bytes)]),
   2861                     (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)));
   2862             NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
   2863             NdefMap->StdMifareContainer.remainingSize -=
   2864                                     (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
   2865             NdefMap->TLVStruct.BytesRemainLinTLV -= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
   2866             *Temp16Bytes += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
   2867             if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
   2868             {
   2869                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2870             }
   2871             /* 16 bytes completed */
   2872             NdefMap->StdMifareContainer.currentBlock++;
   2873             NdefMap->StdMifareContainer.NdefBlocks++;
   2874             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   2875             if(Result == NFCSTATUS_SUCCESS)
   2876             {
   2877                 Result = ((NdefMap->StdMifareContainer.AuthDone ==
   2878                         PH_FRINFC_MIFARESTD_FLAG1)?
   2879                         phFriNfc_MifStd_H_RdABlock(NdefMap):
   2880                         phFriNfc_MifStd_H_AuthSector(NdefMap));
   2881             }
   2882         }
   2883     }
   2884 
   2885     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   2886     {
   2887         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
   2888         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   2889             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   2890             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   2891             PH_FRINFC_MIFARESTD_FLAG1:
   2892             PH_FRINFC_MIFARESTD_FLAG0);
   2893     }
   2894 
   2895     return Result;
   2896 }
   2897 
   2898 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap)
   2899 {
   2900     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2901     uint8_t     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2902     uint8_t     TempintBytes = 0;
   2903 
   2904     if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
   2905     {
   2906         NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2907         /* To read the remaining length (L) in TLV */
   2908         Result = phFriNfc_MifStd_H_IntLenWioutNdef(NdefMap, &NDEFFlag, &TempintBytes);
   2909     }
   2910     NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2911     /* check the NDEFFlag is set. if this is not set, then
   2912         in the above RemainTLV function all the 16 bytes has been
   2913         read */
   2914 #if 0
   2915     if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   2916         (NdefMap->TLVStruct.NdefTLVFoundFlag ==
   2917         PH_FRINFC_MIFARESTD_FLAG1))
   2918     {
   2919         /* if the block is NDEF TLV then get data from here */
   2920         Result = phFriNfc_MifStd_H_IntLenWithNdef(NdefMap, &TempintBytes);
   2921     }
   2922 #endif
   2923     return Result;
   2924 }
   2925 
   2926 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t *NdefMap,
   2927                                             uint8_t            *Flag,
   2928                                             uint8_t            *TempintBytes)
   2929 {
   2930     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2931     uint8_t     CRFlag = 0;
   2932     uint16_t    RemainingBytes = 0;
   2933 
   2934     RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
   2935                             NdefMap->ApduBuffIndex);
   2936 
   2937     if(NdefMap->StdMifareContainer.remainingSize <
   2938         RemainingBytes)
   2939     {
   2940         /* If the user Buffer is greater than the Card Size
   2941             set LastBlockFlag = 1. This Flag is used to read bytes
   2942             till the end of the card only */
   2943         RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
   2944     }
   2945 
   2946     /* Remaining Bytes of length (L) in TLV <=  internal length */
   2947     if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   2948         NdefMap->StdMifareContainer.internalLength) &&
   2949         (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
   2950     {
   2951         (void)memcpy(&(NdefMap->ApduBuffer[
   2952                 NdefMap->ApduBuffIndex]),
   2953                 &(NdefMap->StdMifareContainer.internalBuf[
   2954                 (*TempintBytes)]),
   2955                 RemainingBytes);
   2956         NdefMap->ApduBuffIndex += RemainingBytes;
   2957         NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
   2958         *TempintBytes += ((uint8_t)RemainingBytes);
   2959 
   2960         /* copy the bytes to internal buffer, that are read,
   2961                         but not used for the user buffer */
   2962         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   2963                 &(NdefMap->StdMifareContainer.internalBuf[RemainingBytes]),
   2964                 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
   2965 
   2966         /* internal buffer length */
   2967         NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
   2968 
   2969         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   2970         if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
   2971         {
   2972            NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   2973             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   2974             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   2975             PH_FRINFC_MIFARESTD_FLAG1:
   2976             PH_FRINFC_MIFARESTD_FLAG0);
   2977 
   2978             /* internal length bytes completed */
   2979             NdefMap->StdMifareContainer.currentBlock++;
   2980             NdefMap->StdMifareContainer.NdefBlocks++;
   2981         }
   2982 
   2983         /* Remaining Bytes of length value in TLV */
   2984         if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
   2985         {
   2986             /* Remaining Bytes of length (L) in TLV is Zero means that the next
   2987              coming bytes are containing type (T), length (L) in TLV */
   2988             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2989             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2990             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   2991         }
   2992         /* call completion routine */
   2993         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   2994         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   2995     }
   2996     else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   2997             NdefMap->StdMifareContainer.internalLength) &&
   2998             (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
   2999     {
   3000         (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
   3001                 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
   3002                 NdefMap->TLVStruct.BytesRemainLinTLV);
   3003 
   3004         NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
   3005         NdefMap->StdMifareContainer.remainingSize -=
   3006                     NdefMap->TLVStruct.BytesRemainLinTLV;
   3007         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3008 
   3009         *TempintBytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
   3010         *Flag = PH_FRINFC_MIFARESTD_FLAG1;
   3011 
   3012         NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3013         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3014 
   3015         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
   3016         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   3017         (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   3018             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   3019             PH_FRINFC_MIFARESTD_FLAG1:
   3020             PH_FRINFC_MIFARESTD_FLAG0);
   3021 #ifdef PH_HAL4_ENABLE
   3022 
   3023         if (PH_FRINFC_MIFARESTD_FLAG1 ==
   3024             NdefMap->StdMifareContainer.ReadWriteCompleteFlag)
   3025         {
   3026             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3027         }
   3028 
   3029 #endif /* #ifdef PH_HAL4_ENABLE */
   3030 
   3031         if( NdefMap->TLVStruct.BytesRemainLinTLV ==
   3032             NdefMap->StdMifareContainer.internalLength)
   3033         {
   3034             /* Remaining Bytes in Length (L) field of TLV is 0 */
   3035             NdefMap->TLVStruct.BytesRemainLinTLV =
   3036                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
   3037             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
   3038             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   3039             /* internal length bytes completed */
   3040             NdefMap->StdMifareContainer.currentBlock++;
   3041             NdefMap->StdMifareContainer.NdefBlocks++;
   3042             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3043             if(Result == NFCSTATUS_SUCCESS)
   3044             {
   3045                 Result =
   3046                 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
   3047                 phFriNfc_MifStd_H_RdABlock(NdefMap):
   3048                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   3049             }
   3050         }
   3051         else
   3052         {
   3053             /* Remaining Bytes in Length (L) field of TLV is 0 */
   3054             NdefMap->TLVStruct.BytesRemainLinTLV =
   3055                             PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
   3056             *Flag = PH_FRINFC_MIFARESTD_FLAG1;
   3057         }
   3058     }
   3059     else if((NdefMap->TLVStruct.BytesRemainLinTLV >
   3060             NdefMap->StdMifareContainer.internalLength) &&
   3061             (RemainingBytes <= NdefMap->StdMifareContainer.internalLength))
   3062     {
   3063         (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
   3064                 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
   3065                 RemainingBytes);
   3066 
   3067         NdefMap->ApduBuffIndex += RemainingBytes;
   3068         NdefMap->StdMifareContainer.remainingSize -=
   3069                             RemainingBytes;
   3070         *TempintBytes += ((uint8_t)RemainingBytes);
   3071         /* Remaining Bytes of length (L) in TLV */
   3072         NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   3073 
   3074         /* copy the bytes to internal buffer, that are read,
   3075                         but not used for the user buffer */
   3076         (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   3077                 &(NdefMap->StdMifareContainer.internalBuf[RemainingBytes]),
   3078                 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
   3079 
   3080         /* internal buffer length */
   3081         NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
   3082         if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
   3083         {
   3084             NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   3085             (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   3086             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   3087             PH_FRINFC_MIFARESTD_FLAG1:
   3088             PH_FRINFC_MIFARESTD_FLAG0);
   3089 
   3090             /* internal length bytes completed */
   3091             NdefMap->StdMifareContainer.currentBlock++;
   3092             NdefMap->StdMifareContainer.NdefBlocks++;
   3093         }
   3094 
   3095         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3096         CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3097         *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   3098     }
   3099     else
   3100     {
   3101         if((NdefMap->TLVStruct.BytesRemainLinTLV >
   3102             NdefMap->StdMifareContainer.internalLength) &&
   3103             (RemainingBytes > NdefMap->StdMifareContainer.internalLength))
   3104         {
   3105             (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
   3106                     &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
   3107                     NdefMap->StdMifareContainer.internalLength);
   3108             *Flag = PH_FRINFC_MIFARESTD_FLAG0;
   3109             NdefMap->ApduBuffIndex += NdefMap->StdMifareContainer.internalLength;
   3110             NdefMap->StdMifareContainer.remainingSize -=
   3111                                 NdefMap->StdMifareContainer.internalLength;
   3112             NdefMap->TLVStruct.BytesRemainLinTLV -= NdefMap->StdMifareContainer.internalLength;
   3113 
   3114             if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
   3115             {
   3116                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3117             }
   3118 
   3119             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
   3120             /* internal length bytes completed */
   3121             NdefMap->StdMifareContainer.currentBlock++;
   3122             NdefMap->StdMifareContainer.NdefBlocks++;
   3123             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3124             if(Result == NFCSTATUS_SUCCESS)
   3125             {
   3126                 Result = ((NdefMap->StdMifareContainer.AuthDone ==
   3127                             PH_FRINFC_MIFARESTD_FLAG1)?
   3128                             phFriNfc_MifStd_H_RdABlock(NdefMap):
   3129                             phFriNfc_MifStd_H_AuthSector(NdefMap));
   3130             }
   3131         }
   3132     }
   3133 
   3134     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   3135     {
   3136         NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
   3137         (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
   3138             (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
   3139             PH_FRINFC_MIFARESTD_FLAG1:
   3140             PH_FRINFC_MIFARESTD_FLAG0);
   3141         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
   3142     }
   3143     return Result;
   3144 }
   3145 #if 0
   3146 static NFCSTATUS phFriNfc_MifStd_H_IntLenWithNdef(phFriNfc_NdefMap_t *NdefMap,
   3147                                             uint8_t             *TempintBytes)
   3148 {
   3149     NFCSTATUS       Result = NFCSTATUS_SUCCESS;
   3150     uint16_t        RemainingBytes = 0;
   3151     uint8_t         CRFlag =  PH_FRINFC_MIFARESTD_FLAG0,
   3152                     RdFlag = PH_FRINFC_MIFARESTD_FLAG0,
   3153                     NDEFlength = 0;
   3154 
   3155     RemainingBytes = (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
   3156     while(PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->TLVStruct.NdefTLVFoundFlag)
   3157     {
   3158         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3159         RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
   3160                         NdefMap->ApduBuffIndex);
   3161         if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   3162             NdefMap->StdMifareContainer.NdefBlocks) *
   3163             PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   3164             (NdefMap->StdMifareContainer.internalLength -
   3165             *TempintBytes)) <
   3166             RemainingBytes)
   3167         {
   3168             /* If the user Buffer is greater than the Card Size
   3169                 set LastBlockFlag = 1. This Flag is used to read bytes
   3170                 till the end of the card only */
   3171             RemainingBytes = ((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   3172                                 NdefMap->StdMifareContainer.NdefBlocks) * 16) +
   3173                                 (NdefMap->StdMifareContainer.internalLength -
   3174                                 *TempintBytes));
   3175 
   3176         }
   3177 
   3178         if((NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
   3179             (NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
   3180             (NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0))
   3181         {
   3182             CRFlag = 1;
   3183             break;
   3184         }
   3185 
   3186         /* if type (T) of TLV flag is not set then only the below check is valid
   3187             because, for eg. assume, type (T) of TLV flag is set then this means
   3188             that it is already checked from the previous internal bytes data (T is the
   3189             last byte of internal bytes */
   3190         if(NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
   3191         {
   3192             CRFlag =(uint8_t) ((NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]!=
   3193                     PH_FRINFC_MIFARESTD_NDEFTLV_T)?
   3194                     PH_FRINFC_MIFARESTD_FLAG1:
   3195                     PH_FRINFC_MIFARESTD_FLAG0);
   3196 
   3197             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   3198             {
   3199                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   3200                                     PH_FRINFC_MIFARESTD_FLAG1;
   3201                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3202                 break;
   3203             }
   3204             /* skip Type T of the TLV */
   3205             *TempintBytes += PH_FRINFC_MIFARESTD_INC_1;
   3206         }
   3207         else
   3208         {
   3209             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3210         }
   3211 
   3212         if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
   3213         {
   3214             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
   3215             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3216             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3217             /* 16 bytes completed */
   3218             NdefMap->StdMifareContainer.currentBlock++;
   3219             NdefMap->StdMifareContainer.NdefBlocks++;
   3220             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3221             if(Result == NFCSTATUS_SUCCESS)
   3222             {
   3223                 Result =
   3224                     ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
   3225                     phFriNfc_MifStd_H_RdABlock(NdefMap):
   3226                     phFriNfc_MifStd_H_AuthSector(NdefMap));
   3227             }
   3228             break;
   3229         }
   3230 
   3231         /* skip number of bytes taken by L in TLV, if L is already read */
   3232         if(NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
   3233         {
   3234             CRFlag = (uint8_t)((NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]==
   3235                     PH_FRINFC_MIFARESTD_NDEFTLV_L0)?
   3236                     PH_FRINFC_MIFARESTD_FLAG1:
   3237                     PH_FRINFC_MIFARESTD_FLAG0);
   3238 
   3239             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   3240             {
   3241                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   3242                                     PH_FRINFC_MIFARESTD_FLAG1;
   3243                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3244                 break;
   3245             }
   3246             NDEFlength = *TempintBytes;
   3247             *TempintBytes += phFriNfc_MifStd_H_ChkNdefLen(NdefMap,
   3248                                                             NDEFlength,
   3249                                                             &CRFlag);
   3250             if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   3251             {
   3252                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   3253                                     PH_FRINFC_MIFARESTD_FLAG1;
   3254                 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3255                 break;
   3256             }
   3257         }
   3258         else
   3259         {
   3260             NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3261         }
   3262 
   3263         if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
   3264         {
   3265             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
   3266             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3267             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3268             /* 16 bytes completed */
   3269             NdefMap->StdMifareContainer.currentBlock++;
   3270             NdefMap->StdMifareContainer.NdefBlocks++;
   3271             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3272             if(Result == NFCSTATUS_SUCCESS)
   3273             {
   3274                 Result = ((NdefMap->StdMifareContainer.AuthDone ==
   3275                         PH_FRINFC_MIFARESTD_FLAG1)?
   3276                         phFriNfc_MifStd_H_RdABlock(NdefMap):
   3277                         phFriNfc_MifStd_H_AuthSector(NdefMap));
   3278             }
   3279             break;
   3280         }
   3281 
   3282         if( (NdefMap->TLVStruct.BytesRemainLinTLV <=
   3283             (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
   3284             (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
   3285         {
   3286             /* Copy the internal bytes to the user buffer */
   3287             (void)memcpy(&(NdefMap->ApduBuffer[
   3288                     NdefMap->ApduBuffIndex]),
   3289                     &(NdefMap->StdMifareContainer.internalBuf[
   3290                     (*TempintBytes)]),
   3291                     RemainingBytes);
   3292 
   3293             NdefMap->ApduBuffIndex += RemainingBytes;
   3294             *TempintBytes += ((uint8_t)RemainingBytes);
   3295             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   3296             if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
   3297             {
   3298                 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3299             }
   3300             /* Update the internal length */
   3301             (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   3302                     &(NdefMap->StdMifareContainer.internalBuf[
   3303                     (*TempintBytes)]),
   3304                     RemainingBytes);
   3305             NdefMap->StdMifareContainer.internalLength -= (*TempintBytes +
   3306                                                         RemainingBytes);
   3307 
   3308             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3309             break;
   3310         }
   3311         else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
   3312                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
   3313                 (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
   3314         {
   3315             /* Copy data to user buffer */
   3316             (void)memcpy(&(NdefMap->ApduBuffer[
   3317                     NdefMap->ApduBuffIndex]),
   3318                     &(NdefMap->StdMifareContainer.internalBuf[
   3319                     (*TempintBytes)]),
   3320                     NdefMap->TLVStruct.BytesRemainLinTLV);
   3321 
   3322             /* increment the user buffer index */
   3323             NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
   3324             *TempintBytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
   3325             NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
   3326             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3327 
   3328             /* check for internal length bytes of data been used */
   3329             if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
   3330             {
   3331                 /* 16 bytes completed */
   3332                 NdefMap->StdMifareContainer.currentBlock++;
   3333                 NdefMap->StdMifareContainer.NdefBlocks++;
   3334                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3335                 if(Result == NFCSTATUS_SUCCESS)
   3336                 {
   3337                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
   3338                             PH_FRINFC_MIFARESTD_FLAG1)?
   3339                             phFriNfc_MifStd_H_RdABlock(NdefMap):
   3340                             phFriNfc_MifStd_H_AuthSector(NdefMap));
   3341                 }
   3342                 break;
   3343             }
   3344         }
   3345         else if((NdefMap->TLVStruct.BytesRemainLinTLV >
   3346                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
   3347                 (RemainingBytes <= (NdefMap->StdMifareContainer.internalLength -
   3348                 *TempintBytes)))
   3349         {
   3350             /* Copy data to user buffer */
   3351             (void)memcpy(&(NdefMap->ApduBuffer[
   3352                     NdefMap->ApduBuffIndex]),
   3353                     &(NdefMap->StdMifareContainer.internalBuf[
   3354                     (*TempintBytes)]),
   3355                     RemainingBytes);
   3356             NdefMap->ApduBuffIndex += RemainingBytes;
   3357             *TempintBytes += ((uint8_t)RemainingBytes);
   3358             NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
   3359 
   3360             /* copy the bytes to internal buffer, that are read,
   3361                 but not used for the user buffer */
   3362             (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
   3363                 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
   3364                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes));
   3365 
   3366             /* Length of the internal buffer */
   3367             NdefMap->StdMifareContainer.internalLength -= *TempintBytes;
   3368             CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3369             break;
   3370         }
   3371         else
   3372         {
   3373             if((NdefMap->TLVStruct.BytesRemainLinTLV >
   3374                 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
   3375                 (RemainingBytes > (NdefMap->StdMifareContainer.internalLength -
   3376                 *TempintBytes)))
   3377             {
   3378                 /* Copy data to user buffer */
   3379                 (void)memcpy(&(NdefMap->ApduBuffer[
   3380                         NdefMap->ApduBuffIndex]),
   3381                         &(NdefMap->StdMifareContainer.internalBuf[
   3382                         (*TempintBytes)]),
   3383                         (NdefMap->StdMifareContainer.internalLength -
   3384                         *TempintBytes));
   3385                 NdefMap->ApduBuffIndex += (NdefMap->StdMifareContainer.internalLength -
   3386                                             *TempintBytes);
   3387                 NdefMap->TLVStruct.BytesRemainLinTLV -=
   3388                             (NdefMap->StdMifareContainer.internalLength - *TempintBytes);
   3389                 *TempintBytes += (uint8_t)(NdefMap->StdMifareContainer.internalLength -
   3390                                             *TempintBytes);
   3391 
   3392                 NdefMap->StdMifareContainer.internalLength -= *TempintBytes;
   3393 
   3394                 /* 16 bytes completed */
   3395                 NdefMap->StdMifareContainer.currentBlock++;
   3396                 NdefMap->StdMifareContainer.NdefBlocks++;
   3397                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3398                 if(Result == NFCSTATUS_SUCCESS)
   3399                 {
   3400                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
   3401                                 PH_FRINFC_MIFARESTD_FLAG1)?
   3402                                 phFriNfc_MifStd_H_RdABlock(NdefMap):
   3403                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   3404                 }
   3405                 break;
   3406             }
   3407         }
   3408     }
   3409 
   3410     if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   3411         NdefMap->StdMifareContainer.NdefBlocks) *
   3412         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   3413         NdefMap->StdMifareContainer.internalLength) ==
   3414         PH_FRINFC_MIFARESTD_VAL0)
   3415     {
   3416         NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   3417                         PH_FRINFC_MIFARESTD_FLAG1;
   3418     }
   3419 
   3420     if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
   3421     {
   3422         Result = (((RdFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
   3423                     (NdefMap->ApduBuffIndex == PH_FRINFC_MIFARESTD_VAL0))?
   3424                     (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   3425                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED)):
   3426                     Result);
   3427 
   3428         *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
   3429     }
   3430 
   3431     return Result;
   3432 }
   3433 #endif
   3434 
   3435 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap)
   3436 {
   3437     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3438     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN;
   3439 
   3440     /* If Current block = Ndef TLV block then the starting point
   3441         is writing from type of TLV
   3442         Else */
   3443 
   3444     if(NdefMap->StdMifareContainer.currentBlock ==
   3445                                 NdefMap->TLVStruct.NdefTLVBlock)
   3446     {
   3447 
   3448         if(NdefMap->TLVStruct.NULLTLVCount >=
   3449             PH_FRINFC_MIFARESTD_VAL2)
   3450         {
   3451             phFriNfc_MifStd_H_fillTLV1(NdefMap);
   3452         }
   3453         else
   3454         {
   3455             phFriNfc_MifStd_H_fillTLV2(NdefMap);
   3456         }
   3457     }
   3458     else
   3459     {
   3460         if(NdefMap->TLVStruct.NULLTLVCount >=
   3461             PH_FRINFC_MIFARESTD_VAL2)
   3462         {
   3463             phFriNfc_MifStd_H_fillTLV1_1(NdefMap);
   3464         }
   3465         else
   3466         {
   3467             phFriNfc_MifStd_H_fillTLV2_1(NdefMap);
   3468         }
   3469     }
   3470 
   3471     (void)memcpy( NdefMap->StdMifareContainer.Buffer,
   3472             &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
   3473             PH_FRINFC_MIFARESTD_BYTES_READ);
   3474 
   3475 
   3476     /* Write from here */
   3477     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
   3478 
   3479 #ifndef PH_HAL4_ENABLE
   3480     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
   3481 #else
   3482     NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
   3483 #endif
   3484 
   3485     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   3486     /* Call the Overlapped HAL Transceive function */
   3487     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   3488                                             &NdefMap->MapCompletionInfo,
   3489                                             NdefMap->psRemoteDevInfo,
   3490                                             NdefMap->Cmd,
   3491                                             &NdefMap->psDepAdditionalInfo,
   3492                                             NdefMap->SendRecvBuf,
   3493                                             NdefMap->SendLength,
   3494                                             NdefMap->SendRecvBuf,
   3495                                             NdefMap->SendRecvLength);
   3496 
   3497     return Result;
   3498 }
   3499 #if 0
   3500 static NFCSTATUS phFriNfc_MifStd_H_ChkNdefCmpltBlocks(phFriNfc_NdefMap_t   *NdefMap)
   3501 {
   3502     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3503                                     NFCSTATUS_INVALID_PARAMETER);
   3504     /*  If NoOfNdefCompBlocks is found to be zero,
   3505         should we warn the user */
   3506     if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks !=
   3507         PH_FRINFC_MIFARESTD_VAL0) &&
   3508         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks <=
   3509         PH_FRINFC_MIFARESTD4K_MAX_BLOCKS))
   3510     {
   3511         /* Reading/writing to the card can start only
   3512         from the block 4 */
   3513         NdefMap->StdMifareContainer.currentBlock = 4;
   3514         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
   3515         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   3516         if((Result == NFCSTATUS_SUCCESS) &&
   3517             (NdefMap->StdMifareContainer.AuthDone ==
   3518             PH_FRINFC_MIFARESTD_FLAG1))
   3519         {
   3520             NdefMap->StdMifareContainer.ReadAcsBitFlag = 0;
   3521             Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
   3522         }
   3523         else
   3524         {
   3525             Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   3526         }
   3527     }
   3528     return Result;
   3529 }
   3530 #endif
   3531 
   3532 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t   *NdefMap)
   3533 {
   3534     NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
   3535     NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
   3536     NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
   3537     NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3538     NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3539     NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3540     NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_MAD_BLK0;
   3541     NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
   3542     NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
   3543     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   3544     NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
   3545     NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
   3546     NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3547     NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3548     NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3549     NdefMap->StdMifareContainer.remainingSize = (uint16_t)
   3550                         (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
   3551                             PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   3552     NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
   3553 
   3554 }
   3555 
   3556 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap)
   3557 {
   3558     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   3559     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN;
   3560 
   3561     if(NdefMap->TLVStruct.NdefTLVAuthFlag == PH_FRINFC_MIFARESTD_FLAG1)
   3562     {
   3563         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
   3564         Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   3565     }
   3566     else
   3567     {
   3568         NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
   3569         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
   3570         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   3571 
   3572 #ifndef PH_HAL4_ENABLE
   3573         NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
   3574 #else
   3575         NdefMap->Cmd.MfCmd = phHal_eMifareRead;
   3576 #endif
   3577         /* Call the Overlapped HAL Transceive function */
   3578         Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   3579                                                 &NdefMap->MapCompletionInfo,
   3580                                                 NdefMap->psRemoteDevInfo,
   3581                                                 NdefMap->Cmd,
   3582                                                 &NdefMap->psDepAdditionalInfo,
   3583                                                 NdefMap->SendRecvBuf,
   3584                                                 NdefMap->SendLength,
   3585                                                 NdefMap->SendRecvBuf,
   3586                                                 NdefMap->SendRecvLength);
   3587     }
   3588 
   3589     return Result;
   3590 }
   3591 
   3592 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t   *NdefMap)
   3593 {
   3594     NdefMap->TLVStruct.NdefTLVAuthFlag =
   3595             ((phFriNfc_MifStd_H_GetSect(NdefMap->TLVStruct.NdefTLVBlock)
   3596             == phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock))?
   3597             PH_FRINFC_MIFARESTD_FLAG0:
   3598             PH_FRINFC_MIFARESTD_FLAG1);
   3599 }
   3600 
   3601 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap)
   3602 {
   3603     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3604     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE;
   3605     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
   3606 
   3607     Result = ((NdefMap->StdMifareContainer.AuthDone ==
   3608             PH_FRINFC_MIFARESTD_FLAG0)?
   3609             phFriNfc_MifStd_H_AuthSector(NdefMap):
   3610             phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
   3611                 NdefMap->StdMifareContainer.currentBlock));
   3612 
   3613     return Result;
   3614 }
   3615 
   3616 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
   3617                                            uint8_t            *CRFlag)
   3618 {
   3619     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3620     uint16_t        TempLength = PH_FRINFC_MIFARESTD_VAL0,
   3621                     ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
   3622     uint8_t         TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3623     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
   3624     TempLength = NdefMap->TLVStruct.NdefTLVByte;
   3625     for(;;)
   3626     {
   3627 #ifdef PH_HAL4_ENABLE
   3628         if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
   3629             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T) &&
   3630             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NDEFTLV_T) &&
   3631             (FALSE == NdefMap->TLVStruct.NdefTLVFoundFlag))
   3632         {
   3633             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3634                                 NFCSTATUS_NO_NDEF_SUPPORT);
   3635             NdefMap->TLVStruct.BytesRemainLinTLV = 0;
   3636             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
   3637             *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3638             break;
   3639 
   3640         }
   3641         else
   3642 #endif /* #ifdef PH_HAL4_ENABLE */
   3643         if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
   3644             (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T))
   3645         {
   3646             if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NDEFTLV_T)
   3647             {
   3648                 NdefMap->TLVStruct.NdefTLVBlock =
   3649                             NdefMap->StdMifareContainer.currentBlock;
   3650                 NdefMap->TLVStruct.NdefTLVByte = (uint8_t)TempLength;
   3651                 NdefMap->TLVStruct.NdefTLVFoundFlag =
   3652                             ((NdefMap->SendRecvBuf[TempLength] ==
   3653                                 PH_FRINFC_MIFARESTD_NDEFTLV_T)?
   3654                                 PH_FRINFC_MIFARESTD_FLAG1:
   3655                                 PH_FRINFC_MIFARESTD_FLAG0);
   3656 
   3657                 NdefMap->TLVStruct.NULLTLVCount = ((NdefMap->TLVStruct.NULLTLVCount
   3658                                             == PH_FRINFC_MIFARESTD_VAL1)?
   3659                                             PH_FRINFC_MIFARESTD_VAL0:
   3660                                             NdefMap->TLVStruct.NULLTLVCount);
   3661             }
   3662             else
   3663             {
   3664                 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   3665             }
   3666 
   3667             TempLength++;
   3668             if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   3669             {
   3670                 NdefMap->TLVStruct.TcheckedinTLVFlag =
   3671                                         PH_FRINFC_MIFARESTD_FLAG1;
   3672                 NdefMap->TLVStruct.NoLbytesinTLV =
   3673                                     PH_FRINFC_MIFARESTD_VAL3;
   3674             }
   3675             Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
   3676                                                     TempLength);
   3677             if(Result != NFCSTATUS_SUCCESS)
   3678             {
   3679                 *CRFlag = (uint8_t)((Result == NFCSTATUS_PENDING)?
   3680                             PH_FRINFC_MIFARESTD_FLAG0:
   3681                             PH_FRINFC_MIFARESTD_FLAG1);
   3682                 break;
   3683             }
   3684 
   3685             if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   3686                         NdefMap->StdMifareContainer.NdefBlocks) *
   3687                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   3688                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   3689                         TempLength)) <
   3690                         NdefMap->SendRecvBuf[TempLength]) &&
   3691                         ((NdefMap->SendRecvBuf[TempLength] <
   3692                         PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
   3693                         (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   3694                         PH_FRINFC_MIFARESTD_VAL1)))
   3695             {
   3696                 /* Result = Error */
   3697                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3698                                 NFCSTATUS_INVALID_PARAMETER);
   3699                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3700                 break;
   3701             }
   3702 
   3703             if(((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   3704                         NdefMap->StdMifareContainer.NdefBlocks) *
   3705                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   3706                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   3707                         TempLength)) <
   3708                         NdefMap->SendRecvBuf[TempLength]) &&
   3709                         ((NdefMap->SendRecvBuf[TempLength] ==
   3710                         PH_FRINFC_MIFARESTD_VAL0) &&
   3711                         (NdefMap->TLVStruct.NdefTLVFoundFlag ==
   3712                         PH_FRINFC_MIFARESTD_VAL1)))
   3713             {
   3714                 /* Result = Error */
   3715                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3716                                 NFCSTATUS_INVALID_PARAMETER);
   3717                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3718                 break;
   3719             }
   3720 
   3721             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
   3722                 PH_FRINFC_MIFARESTD_FLAG1) &&
   3723                 (NdefMap->SendRecvBuf[TempLength] <
   3724                  PH_FRINFC_MIFARESTD_NDEFTLV_L))
   3725             {
   3726                 Result = phFriNfc_MapTool_SetCardState(NdefMap,
   3727                                     NdefMap->SendRecvBuf[TempLength]);
   3728                 NdefMap->TLVStruct.BytesRemainLinTLV =
   3729                                     NdefMap->SendRecvBuf[TempLength];
   3730                 NdefMap->StdMifareContainer.remainingSize -=
   3731                                             PH_FRINFC_MIFARESTD_VAL2;
   3732                 /* This flag is set */
   3733                 NdefMap->StdMifareContainer.remSizeUpdFlag =
   3734                     (uint8_t)((NdefMap->TLVStruct.NULLTLVCount >=
   3735                     PH_FRINFC_MIFARESTD_VAL2)?
   3736                     PH_FRINFC_MIFARESTD_FLAG0:
   3737                     PH_FRINFC_MIFARESTD_FLAG1);
   3738 
   3739                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3740                 break;
   3741             }
   3742 
   3743             NdefMap->StdMifareContainer.remainingSize -=
   3744                     ((  NdefMap->SendRecvBuf[TempLength] <
   3745                             PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   3746                             (NdefMap->SendRecvBuf[TempLength]
   3747                             + PH_FRINFC_MIFARESTD_VAL2):
   3748                             PH_FRINFC_MIFARESTD_VAL0);
   3749 
   3750             if(( NdefMap->SendRecvBuf[TempLength] ==
   3751                         PH_FRINFC_MIFARESTD_VAL0))
   3752             {
   3753                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3754                             NFCSTATUS_INVALID_PARAMETER);
   3755                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3756                 break;
   3757             }
   3758 
   3759             TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3760             /* get the next TLV after the proprietary TLV */
   3761             Result =
   3762                 ((NdefMap->SendRecvBuf[TempLength] <
   3763                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   3764                     phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag):
   3765                     NFCSTATUS_PENDING);
   3766 
   3767             if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
   3768                 (Result == NFCSTATUS_SUCCESS))
   3769             {
   3770                 NdefMap->TLVStruct.TcheckedinTLVFlag =
   3771                                         PH_FRINFC_MIFARESTD_FLAG0;
   3772                 NdefMap->TLVStruct.NoLbytesinTLV =
   3773                                     PH_FRINFC_MIFARESTD_VAL0;
   3774 
   3775                 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   3776                 *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
   3777                             PH_FRINFC_MIFARESTD_FLAG1:
   3778                             PH_FRINFC_MIFARESTD_FLAG0);
   3779                 break;
   3780             }
   3781             else
   3782             {
   3783                 if(Result == NFCSTATUS_PENDING)
   3784                 {
   3785                     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3786                     Result = ((NdefMap->SendRecvBuf[TempLength] ==
   3787                             PH_FRINFC_MIFARESTD_NDEFTLV_L) ?
   3788                             NFCSTATUS_SUCCESS:
   3789                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3790                                 NFCSTATUS_INVALID_PARAMETER)));
   3791 
   3792                     if(Result != NFCSTATUS_SUCCESS)
   3793                     {
   3794                         *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3795                         break;
   3796                     }
   3797                     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   3798                     TempLength++;
   3799                     /* Check 0xFF */
   3800                     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   3801                     {
   3802                         NdefMap->TLVStruct.TcheckedinTLVFlag =
   3803                                                 PH_FRINFC_MIFARESTD_FLAG1;
   3804                         NdefMap->TLVStruct.NoLbytesinTLV =
   3805                                             PH_FRINFC_MIFARESTD_VAL2;
   3806                     }
   3807                     Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
   3808                                                             TempLength);
   3809                     if(Result != NFCSTATUS_SUCCESS)
   3810                     {
   3811                         break;
   3812                     }
   3813 
   3814                     ShiftLength = NdefMap->SendRecvBuf[TempLength];
   3815                     TempLength++;
   3816                     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   3817                     {
   3818                         NdefMap->TLVStruct.TcheckedinTLVFlag =
   3819                                                 PH_FRINFC_MIFARESTD_FLAG1;
   3820                         NdefMap->TLVStruct.NoLbytesinTLV =
   3821                                             PH_FRINFC_MIFARESTD_VAL1;
   3822                         NdefMap->TLVStruct.prevLenByteValue =
   3823                                     NdefMap->SendRecvBuf[(TempLength -
   3824                                                 PH_FRINFC_MIFARESTD_VAL1)];
   3825                     }
   3826                     Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
   3827                                                             TempLength);
   3828                     if(Result != NFCSTATUS_SUCCESS)
   3829                     {
   3830                         break;
   3831                     }
   3832 
   3833 
   3834                     if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   3835                         NdefMap->StdMifareContainer.NdefBlocks) *
   3836                         PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   3837                         (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   3838                         TempLength)) <
   3839                         (( ShiftLength
   3840                         << 8) + NdefMap->SendRecvBuf[TempLength]))
   3841                     {
   3842                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3843                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   3844 
   3845                         break;
   3846                     }
   3847 
   3848                     if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
   3849                         PH_FRINFC_MIFARESTD_FLAG1)
   3850                     {
   3851                         ShiftLength = (( ShiftLength<< 8) +
   3852                                     NdefMap->SendRecvBuf[TempLength]);
   3853                         NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   3854                         Result = phFriNfc_MapTool_SetCardState(NdefMap,
   3855                                                                 ShiftLength);
   3856                         NdefMap->StdMifareContainer.remainingSize -=
   3857                                             PH_FRINFC_MIFARESTD_VAL4;
   3858                         *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   3859                         break;
   3860                     }
   3861 
   3862                     NdefMap->StdMifareContainer.remainingSize -=
   3863                                 ((ShiftLength<< 8) +
   3864                                 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]);
   3865                     TempLength++;
   3866 
   3867                     /* get the next TLV after the proprietary TLV */
   3868                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag);
   3869 
   3870                     if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
   3871                         (Result == NFCSTATUS_SUCCESS))
   3872                     {
   3873                         NdefMap->TLVStruct.TcheckedinTLVFlag =
   3874                                                 PH_FRINFC_MIFARESTD_FLAG0;
   3875                         NdefMap->TLVStruct.NoLbytesinTLV =
   3876                                             PH_FRINFC_MIFARESTD_VAL0;
   3877                         Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   3878 
   3879                         break;
   3880                     }
   3881                     break;
   3882                 }
   3883             }
   3884         }
   3885         else if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
   3886                 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0))
   3887         {
   3888             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3889                                 NFCSTATUS_INVALID_PARAMETER);
   3890             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   3891                                         PH_FRINFC_MIFARESTD_FLAG1;
   3892             break;
   3893 
   3894         }
   3895         else if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NULLTLV_T)
   3896         {
   3897             TempLength++;
   3898             NdefMap->TLVStruct.NULLTLVCount += PH_FRINFC_MIFARESTD_VAL1;
   3899             ShiftLength = NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)];
   3900             NdefMap->StdMifareContainer.remainingSize -= PH_FRINFC_MIFARESTD_VAL1;
   3901             if(NdefMap->StdMifareContainer.remainingSize <
   3902                     (( ShiftLength << 8) + NdefMap->SendRecvBuf[TempLength]))
   3903             {
   3904                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3905                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   3906                 break;
   3907             }
   3908             Result = phFriNfc_MifStd_H_Chk16Bytes(  NdefMap,
   3909                                                     TempLength);
   3910             if(Result != NFCSTATUS_SUCCESS)
   3911             {
   3912                 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
   3913                 break;
   3914             }
   3915         }
   3916         else
   3917         {
   3918             if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
   3919                 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1))
   3920             {
   3921                 TempLength++;
   3922                 Result = NFCSTATUS_SUCCESS;
   3923                 NdefMap->StdMifareContainer.remainingSize -=
   3924                                                 PH_FRINFC_MIFARESTD_VAL1;
   3925             }
   3926         }
   3927     }
   3928 
   3929     if(NdefMap->TLVStruct.BytesRemainLinTLV >
   3930         NdefMap->StdMifareContainer.remainingSize)
   3931     {
   3932         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3933                                 NFCSTATUS_INVALID_FORMAT);
   3934     }
   3935     else
   3936     {
   3937         if(NdefMap->StdMifareContainer.remainingSize ==
   3938                 PH_FRINFC_MIFARESTD_VAL0)
   3939         {
   3940             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
   3941                         PH_FRINFC_MIFARESTD_FLAG1)?
   3942                         NFCSTATUS_SUCCESS:
   3943                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   3944                                     NFCSTATUS_INVALID_PARAMETER)));
   3945         }
   3946     }
   3947     return Result;
   3948 }
   3949 
   3950 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t    *NdefMap,
   3951                                       uint16_t              *TempLength,
   3952                                        uint8_t              *TL4bytesFlag)
   3953 {
   3954     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3955     uint16_t    LengthRemaining = PH_FRINFC_MIFARESTD_VAL0,
   3956                 TempLen = PH_FRINFC_MIFARESTD_VAL0,
   3957                 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
   3958 
   3959     TempLen = (*TempLength);
   3960     LengthRemaining = (PH_FRINFC_MIFARESTD_BYTES_READ -
   3961                         (TempLen + PH_FRINFC_MIFARESTD_VAL1));
   3962 
   3963     if(*TL4bytesFlag == PH_FRINFC_MIFARESTD_FLAG0)
   3964     {
   3965         (*TempLength) += (NdefMap->SendRecvBuf[TempLen] +
   3966                             PH_FRINFC_MIFARESTD_VAL1);
   3967 
   3968         if(NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0)
   3969         {
   3970             LengthRemaining =
   3971                 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
   3972                 PH_FRINFC_MIFARESTD_VAL0:
   3973                 (NdefMap->SendRecvBuf[TempLen] -
   3974                 LengthRemaining));
   3975         }
   3976         else
   3977         {
   3978             LengthRemaining =
   3979                 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
   3980                 PH_FRINFC_MIFARESTD_VAL0:
   3981                 (NdefMap->SendRecvBuf[TempLen] -
   3982                 LengthRemaining));
   3983         }
   3984     }
   3985     else
   3986     {
   3987         *TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
   3988         if(NdefMap->TLVStruct.NoLbytesinTLV ==
   3989             PH_FRINFC_MIFARESTD_VAL1)
   3990         {
   3991             ShiftLength = NdefMap->TLVStruct.prevLenByteValue;
   3992             (*TempLength) += ((ShiftLength
   3993                                 << 8) + NdefMap->SendRecvBuf[TempLen] +
   3994                             PH_FRINFC_MIFARESTD_VAL1);
   3995 
   3996             LengthRemaining =
   3997                 (((ShiftLength
   3998                 << 8) + NdefMap->SendRecvBuf[TempLen]) -
   3999                 LengthRemaining);
   4000         }
   4001         else
   4002         {
   4003             ShiftLength = NdefMap->SendRecvBuf[(TempLen - PH_FRINFC_MIFARESTD_VAL1)];
   4004             (*TempLength) += ((ShiftLength
   4005                                 << 8) + NdefMap->SendRecvBuf[TempLen] +
   4006                             PH_FRINFC_MIFARESTD_VAL1);
   4007 
   4008             LengthRemaining =
   4009                 (((ShiftLength
   4010                     << 8) + NdefMap->SendRecvBuf[TempLen]) -
   4011                     LengthRemaining);
   4012         }
   4013     }
   4014 
   4015     NdefMap->TLVStruct.NdefTLVByte =
   4016         (uint8_t)(((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
   4017         (*TempLength):
   4018         (LengthRemaining % PH_FRINFC_MIFARESTD_BYTES_READ));
   4019 
   4020     while(LengthRemaining != PH_FRINFC_MIFARESTD_VAL0)
   4021     {
   4022         NdefMap->StdMifareContainer.currentBlock++;
   4023         NdefMap->StdMifareContainer.NdefBlocks++;
   4024         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   4025         LengthRemaining -=
   4026             ((LengthRemaining <= PH_FRINFC_MIFARESTD_BYTES_READ)?
   4027             LengthRemaining:
   4028             PH_FRINFC_MIFARESTD_BYTES_READ);
   4029     }
   4030 
   4031     if(NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0)
   4032     {
   4033         NdefMap->StdMifareContainer.currentBlock++;
   4034         NdefMap->StdMifareContainer.NdefBlocks++;
   4035         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   4036     }
   4037 
   4038     return Result;
   4039 }
   4040 
   4041 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
   4042                                        uint16_t             TempLength)
   4043 {
   4044     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4045     if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   4046     {
   4047         NdefMap->StdMifareContainer.currentBlock++;
   4048         NdefMap->StdMifareContainer.NdefBlocks++;
   4049         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   4050 
   4051         Result =
   4052             ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
   4053             phFriNfc_MifStd_H_GetActCardLen(NdefMap):
   4054             phFriNfc_MifStd_H_AuthSector(NdefMap));
   4055     }
   4056     return Result;
   4057 }
   4058 
   4059 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap,
   4060                                           uint8_t            *CRFlag,
   4061                                           uint8_t            *NDEFFlag)
   4062 {
   4063     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4064     uint16_t    TempLength = PH_FRINFC_MIFARESTD_VAL0,
   4065                 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
   4066     uint8_t     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4067 
   4068     switch(NdefMap->TLVStruct.NoLbytesinTLV)
   4069     {
   4070         case PH_FRINFC_MIFARESTD_VAL3:
   4071             /* if TLV is found then set card state */
   4072             Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
   4073                         PH_FRINFC_MIFARESTD_FLAG1)?
   4074                         phFriNfc_MapTool_SetCardState(NdefMap,
   4075                         NdefMap->SendRecvBuf[TempLength]):
   4076                         Result);
   4077 
   4078             /* Check the length field is less than or
   4079                 equal to 0xFF if yes enter below statement
   4080                 else enter else if*/
   4081             if((NdefMap->SendRecvBuf[TempLength] <
   4082                 PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
   4083                 (Result == NFCSTATUS_SUCCESS))
   4084             {
   4085                 NdefMap->StdMifareContainer.remainingSize -=
   4086                                 PH_FRINFC_MIFARESTD_VAL2;
   4087 
   4088                 Result = ((NdefMap->SendRecvBuf[TempLength] >
   4089                             NdefMap->StdMifareContainer.remainingSize)?
   4090                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   4091                             NFCSTATUS_INVALID_FORMAT)):
   4092                             Result);
   4093                 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4094                 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
   4095                     PH_FRINFC_MIFARESTD_FLAG1) &&
   4096                     (Result == NFCSTATUS_SUCCESS))
   4097                 {
   4098                     NdefMap->TLVStruct.BytesRemainLinTLV =
   4099                     NdefMap->SendRecvBuf[TempLength];
   4100                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4101 
   4102                 }
   4103                 else if(Result == NFCSTATUS_SUCCESS)
   4104                 {
   4105                     TempLength++;
   4106                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
   4107                                     &TempLength, &TL4bytesFlag);
   4108 
   4109                     NdefMap->StdMifareContainer.remainingSize -=
   4110                                     NdefMap->SendRecvBuf[TempLength];
   4111                     if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
   4112                         (*CRFlag == PH_FRINFC_MIFARESTD_FLAG0))
   4113                     {
   4114                         *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4115                         Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   4116                     }
   4117                 }
   4118 
   4119                 else
   4120                 {
   4121                     /* do nothing */
   4122                 }
   4123             }
   4124             else if((NdefMap->SendRecvBuf[TempLength] ==
   4125                     PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
   4126                     (Result == NFCSTATUS_SUCCESS))
   4127             {
   4128                 TempLength++;
   4129                 NdefMap->StdMifareContainer.remainingSize -=
   4130                                 PH_FRINFC_MIFARESTD_VAL4;
   4131                 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4132                 Result = (((((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
   4133                                 NdefMap->SendRecvBuf[(TempLength +
   4134                                 PH_FRINFC_MIFARESTD_VAL1)]) >
   4135                                 NdefMap->StdMifareContainer.remainingSize)?
   4136                                 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   4137                                 NFCSTATUS_INVALID_FORMAT)):
   4138                                 Result);
   4139                 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
   4140                     PH_FRINFC_MIFARESTD_FLAG1) &&
   4141                     (Result == NFCSTATUS_SUCCESS))
   4142                 {
   4143                     NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   4144                     NdefMap->TLVStruct.BytesRemainLinTLV =
   4145                                 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
   4146                                 NdefMap->SendRecvBuf[(TempLength +
   4147                                 PH_FRINFC_MIFARESTD_VAL1)]);
   4148                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4149                 }
   4150                 else if(Result == NFCSTATUS_SUCCESS)
   4151                 {
   4152                     TempLength++;
   4153 
   4154                     Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
   4155                                 &TempLength, &TL4bytesFlag);
   4156                     NdefMap->StdMifareContainer.remainingSize -=
   4157                                 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
   4158                                 NdefMap->SendRecvBuf[(TempLength +
   4159                                 PH_FRINFC_MIFARESTD_VAL1)]);
   4160 
   4161                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4162                     Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   4163                 }
   4164                 else
   4165                 {
   4166                     /* do nothing */
   4167                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4168                 }
   4169             }
   4170             else
   4171             {
   4172                 /* Result = Error */
   4173                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   4174                                 NFCSTATUS_INVALID_FORMAT);
   4175                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4176             }
   4177             break;
   4178 
   4179         case PH_FRINFC_MIFARESTD_VAL2:
   4180         case PH_FRINFC_MIFARESTD_VAL1:
   4181             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   4182                             PH_FRINFC_MIFARESTD_VAL1)?
   4183                             ((NdefMap->TLVStruct.prevLenByteValue << 8) +
   4184                             NdefMap->SendRecvBuf[TempLength]):
   4185                             (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
   4186                             NdefMap->SendRecvBuf[(TempLength +
   4187                             PH_FRINFC_MIFARESTD_VAL1)]));
   4188             if((((  NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   4189                     NdefMap->StdMifareContainer.NdefBlocks) *
   4190                     PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
   4191                     (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   4192                     TempLength)) <
   4193                     ShiftLength)
   4194             {
   4195                 /* Result = Error */
   4196                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   4197                                 NFCSTATUS_INVALID_PARAMETER);
   4198                 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4199             }
   4200             else
   4201             {
   4202                 NdefMap->StdMifareContainer.remainingSize -=
   4203                                     PH_FRINFC_MIFARESTD_VAL2;
   4204                 if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
   4205                         PH_FRINFC_MIFARESTD_FLAG1)
   4206                 {
   4207                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   4208                     if(NdefMap->TLVStruct.BytesRemainLinTLV >
   4209                         NdefMap->StdMifareContainer.remainingSize)
   4210                     {
   4211                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   4212                                                 NFCSTATUS_INVALID_FORMAT);
   4213                     }
   4214                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4215                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4216                 }
   4217                 else
   4218                 {
   4219                     NdefMap->StdMifareContainer.remainingSize -=
   4220                                         ShiftLength;
   4221                     *CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4222                     TempLength += PH_FRINFC_MIFARESTD_VAL2;
   4223                     TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
   4224                     Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1)?
   4225                                 NFCSTATUS_SUCCESS:
   4226                                 phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag));
   4227 
   4228                     *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4229                     Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
   4230                 }
   4231             }
   4232             break;
   4233 
   4234         default:
   4235             break;
   4236     }
   4237     return Result;
   4238 }
   4239 
   4240 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t  *NdefMap)
   4241 {
   4242     switch((NdefMap->StdMifareContainer.currentBlock % 4))
   4243     {
   4244         case PH_FRINFC_MIFARESTD_VAL0:
   4245             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4246                             (NdefMap->StdMifareContainer.currentBlock +
   4247                                         PH_FRINFC_MIFARESTD_MAD_BLK3);
   4248             break;
   4249 
   4250         case PH_FRINFC_MIFARESTD_VAL1:
   4251             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4252                         (NdefMap->StdMifareContainer.currentBlock +
   4253                                         PH_FRINFC_MIFARESTD_MAD_BLK2);
   4254             break;
   4255 
   4256         case PH_FRINFC_MIFARESTD_VAL2:
   4257             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4258                         (NdefMap->StdMifareContainer.currentBlock +
   4259                                         PH_FRINFC_MIFARESTD_MAD_BLK1);
   4260             break;
   4261 
   4262         default:
   4263             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4264                         NdefMap->StdMifareContainer.currentBlock;
   4265             break;
   4266     }
   4267 }
   4268 
   4269 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t  *NdefMap)
   4270 {
   4271     switch((NdefMap->StdMifareContainer.currentBlock % 16))
   4272     {
   4273         case PH_FRINFC_MIFARESTD_MAD_BLK0:
   4274             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4275                             (NdefMap->StdMifareContainer.currentBlock +
   4276                                         PH_FRINFC_MIFARESTD_BLK15);
   4277             break;
   4278 
   4279         case PH_FRINFC_MIFARESTD_MAD_BLK1:
   4280             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4281                         (NdefMap->StdMifareContainer.currentBlock +
   4282                                         PH_FRINFC_MIFARESTD_BLK14);
   4283             break;
   4284 
   4285         case PH_FRINFC_MIFARESTD_MAD_BLK2:
   4286             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4287                         (NdefMap->StdMifareContainer.currentBlock +
   4288                                         PH_FRINFC_MIFARESTD_BLK13);
   4289             break;
   4290 
   4291         case PH_FRINFC_MIFARESTD_MAD_BLK3:
   4292             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4293                         (NdefMap->StdMifareContainer.currentBlock +
   4294                                         PH_FRINFC_MIFARESTD_BLK12);
   4295             break;
   4296 
   4297         case PH_FRINFC_MIFARESTD_BLK4:
   4298             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4299                         (NdefMap->StdMifareContainer.currentBlock +
   4300                                         PH_FRINFC_MIFARESTD_BLK11);
   4301             break;
   4302 
   4303         case PH_FRINFC_MIFARESTD_BLK5:
   4304             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4305                         (NdefMap->StdMifareContainer.currentBlock +
   4306                                         PH_FRINFC_MIFARESTD_BLK10);
   4307             break;
   4308 
   4309         case PH_FRINFC_MIFARESTD_BLK6:
   4310             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4311                         (NdefMap->StdMifareContainer.currentBlock +
   4312                                         PH_FRINFC_MIFARESTD_BLK9);
   4313             break;
   4314 
   4315         case PH_FRINFC_MIFARESTD_BLK7:
   4316             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4317                         (NdefMap->StdMifareContainer.currentBlock +
   4318                                         PH_FRINFC_MIFARESTD_BLK8);
   4319             break;
   4320 
   4321         case PH_FRINFC_MIFARESTD_BLK8:
   4322             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4323                         (NdefMap->StdMifareContainer.currentBlock +
   4324                                         PH_FRINFC_MIFARESTD_BLK7);
   4325             break;
   4326 
   4327         case PH_FRINFC_MIFARESTD_BLK9:
   4328             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4329                         (NdefMap->StdMifareContainer.currentBlock +
   4330                                         PH_FRINFC_MIFARESTD_BLK6);
   4331             break;
   4332 
   4333         case PH_FRINFC_MIFARESTD_BLK10:
   4334             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4335                         (NdefMap->StdMifareContainer.currentBlock +
   4336                                         PH_FRINFC_MIFARESTD_BLK5);
   4337             break;
   4338 
   4339         case PH_FRINFC_MIFARESTD_BLK11:
   4340             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4341                         (NdefMap->StdMifareContainer.currentBlock +
   4342                                         PH_FRINFC_MIFARESTD_BLK4);
   4343             break;
   4344 
   4345         case PH_FRINFC_MIFARESTD_BLK12:
   4346             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4347                         (NdefMap->StdMifareContainer.currentBlock +
   4348                                         PH_FRINFC_MIFARESTD_MAD_BLK3);
   4349             break;
   4350 
   4351         case PH_FRINFC_MIFARESTD_BLK13:
   4352             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4353                         (NdefMap->StdMifareContainer.currentBlock +
   4354                                         PH_FRINFC_MIFARESTD_MAD_BLK2);
   4355             break;
   4356 
   4357         case PH_FRINFC_MIFARESTD_BLK14:
   4358             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4359                         (NdefMap->StdMifareContainer.currentBlock +
   4360                                         PH_FRINFC_MIFARESTD_MAD_BLK1);
   4361             break;
   4362 
   4363         default:
   4364             NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4365                         NdefMap->StdMifareContainer.currentBlock;
   4366             break;
   4367     }
   4368 }
   4369 
   4370 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t        *NdefMap)
   4371 {
   4372     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4373     /* Copy remaining bytes into the AID array
   4374         from Receive Buffer till array number 7 in aid */
   4375     if(NdefMap->StdMifareContainer.currentBlock ==
   4376         PH_FRINFC_MIFARESTD_VAL1)
   4377     {
   4378         /* Helper Function to Store AID Information */
   4379         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
   4380 
   4381         NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL2;
   4382         /* read remaining AIDs from block number 2 */
   4383         Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
   4384                 PH_FRINFC_MIFARESTD_FLAG1)?
   4385                 Result:
   4386                 phFriNfc_MifareStdMap_ChkNdef( NdefMap));
   4387     }
   4388     else if(((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) &&
   4389             (NdefMap->StdMifareContainer.currentBlock ==
   4390             PH_FRINFC_MIFARESTD_MAD_BLK2)) || (
   4391             (NdefMap->StdMifareContainer.currentBlock ==
   4392             PH_FRINFC_MIFARESTD_MAD_BLK66) &&
   4393             (NdefMap->CardType ==
   4394             PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)))
   4395     {
   4396         /* Helper Function to Store AID Information */
   4397         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
   4398 
   4399         NdefMap->StdMifareContainer.aidCompleteFlag =
   4400                         PH_FRINFC_MIFARESTD_FLAG1;
   4401     }/* Mifare 1k and Mifare 4k end Check */
   4402     else if((NdefMap->StdMifareContainer.currentBlock >
   4403             PH_FRINFC_MIFARESTD_VAL1) &&
   4404             (NdefMap->CardType ==
   4405             PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
   4406     {
   4407         phFriNfc_MifStd_H_fillAIDarray(NdefMap);
   4408         /* read remaining AIDs from block number 2 */
   4409         /* Mifare 4k Helper Function */
   4410         Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
   4411                     PH_FRINFC_MIFARESTD_FLAG1)?
   4412                     Result:
   4413                     phFriNfc_MifStd4k_H_CheckNdef(NdefMap));
   4414     } /* Card Type 4k Check */
   4415     else
   4416     {
   4417         /* Since we have decided temporarily not to go
   4418             for any new error codes we are using
   4419             NFCSTATUS_INVALID_PARAMETER even though it is not
   4420             the relevant error code here TBD */
   4421         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
   4422                                 NFCSTATUS_INVALID_PARAMETER);
   4423     }
   4424 
   4425     if(NdefMap->StdMifareContainer.aidCompleteFlag ==
   4426                         PH_FRINFC_MIFARESTD_FLAG1)
   4427     {
   4428         NdefMap->StdMifareContainer.ChkNdefCompleteFlag =
   4429                         PH_FRINFC_MIFARESTD_FLAG1;
   4430         /*  The check for NDEF compliant information is now over for
   4431             the Mifare 1K card.
   4432             Update(decrement) the NoOfNdefCompBlocks as much required,
   4433             depending on the NDEF compliant information found */
   4434         /* Check the Sectors are Ndef Compliant */
   4435         phFriNfc_MifStd_H_ChkNdefCmpltSects(NdefMap);
   4436         if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks == 0) ||
   4437             (NdefMap->StdMifareContainer.NoOfNdefCompBlocks > 255))
   4438         {
   4439             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4440                                 NFCSTATUS_NO_NDEF_SUPPORT);
   4441         }
   4442         else
   4443         {
   4444             NdefMap->StdMifareContainer.aidCompleteFlag =
   4445                             PH_FRINFC_MIFARESTD_FLAG0;
   4446             NdefMap->StdMifareContainer.NFCforumSectFlag =
   4447                                     PH_FRINFC_MIFARESTD_FLAG0;
   4448             NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
   4449             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   4450             Result = ((Result != NFCSTATUS_SUCCESS)?
   4451                         Result:phFriNfc_MifStd_H_AuthSector(NdefMap));
   4452         }
   4453 
   4454     }
   4455     return Result;
   4456 }
   4457 
   4458 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t       *NdefMap)
   4459 {
   4460     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4461     if(NdefMap->TLVStruct.NdefTLVAuthFlag ==
   4462        PH_FRINFC_MIFARESTD_FLAG1)
   4463     {
   4464         NdefMap->TLVStruct.NdefTLVAuthFlag =
   4465                                     PH_FRINFC_MIFARESTD_FLAG0;
   4466         NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG1;
   4467         Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
   4468     }
   4469     else
   4470     {
   4471         NdefMap->StdMifareContainer.AuthDone = 1;
   4472         NdefMap->StdMifareContainer.ReadAcsBitFlag = 1;
   4473         Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
   4474     }
   4475     return Result;
   4476 }
   4477 
   4478 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t     *NdefMap,
   4479                                               uint8_t               BlockNo)
   4480 {
   4481     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4482     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = BlockNo;
   4483     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
   4484     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   4485 #ifndef PH_HAL4_ENABLE
   4486     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
   4487 #else
   4488     NdefMap->Cmd.MfCmd = phHal_eMifareRead;
   4489 #endif
   4490     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   4491     NdefMap->MapCompletionInfo.Context = NdefMap;
   4492     /* Call the Overlapped HAL Transceive function */
   4493     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   4494                                             &NdefMap->MapCompletionInfo,
   4495                                             NdefMap->psRemoteDevInfo,
   4496                                             NdefMap->Cmd,
   4497                                             &NdefMap->psDepAdditionalInfo,
   4498                                             NdefMap->SendRecvBuf,
   4499                                             NdefMap->SendLength,
   4500                                             NdefMap->SendRecvBuf,
   4501                                             NdefMap->SendRecvLength);
   4502     return Result;
   4503 }
   4504 
   4505 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t        *NdefMap)
   4506 {
   4507     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4508     uint8_t     CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4509     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   4510     {
   4511         if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
   4512             PH_FRINFC_MIFARESTD_FLAG1)
   4513         {
   4514             /* check for the correct access bits */
   4515             Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
   4516 
   4517             if((NdefMap->StdMifareContainer.ChkNdefFlag ==
   4518                 PH_FRINFC_MIFARESTD_FLAG1) &&
   4519                 (Result == NFCSTATUS_SUCCESS))
   4520             {
   4521                 if(NdefMap->CardState ==
   4522                     PH_NDEFMAP_CARD_STATE_INVALID)
   4523                 {
   4524                     NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
   4525                     ((NdefMap->StdMifareContainer.currentBlock >=
   4526                     PH_FRINFC_MIFARESTD4K_BLK128)?
   4527                     (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   4528                                     PH_FRINFC_MIFARESTD_BLK15):
   4529                     (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
   4530                                     PH_FRINFC_MIFARESTD_MAD_BLK3));
   4531 
   4532                     NdefMap->StdMifareContainer.ProprforumSectFlag =
   4533                         ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
   4534                         PH_FRINFC_MIFARESTD_FLAG1)?
   4535                         PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG:
   4536                         PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG);
   4537 
   4538                     Result = phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Result);
   4539                 }
   4540                 else
   4541                 {
   4542                     NdefMap->StdMifareContainer.NFCforumSectFlag =
   4543                         (((NdefMap->StdMifareContainer.currentBlock == 64) &&
   4544                         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))?
   4545                         NdefMap->StdMifareContainer.NFCforumSectFlag:
   4546                                             PH_FRINFC_MIFARESTD_FLAG1);
   4547                 }
   4548 
   4549                 if(NdefMap->StdMifareContainer.ProprforumSectFlag !=
   4550                     PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG)
   4551                 {
   4552                     NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4553                                 /* ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4554                                         PH_FRINFC_MIFARESTD_FLAG1)?
   4555                                         PH_FRINFC_MIFARESTD_FLAG0:
   4556                                         PH_FRINFC_MIFARESTD_FLAG1);*/
   4557 
   4558                     NdefMap->StdMifareContainer.ReadCompleteFlag =
   4559                     (uint8_t)((((((NdefMap->StdMifareContainer.currentBlock +
   4560                         PH_FRINFC_MIFARESTD_VAL4) >=
   4561                         PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
   4562                         (NdefMap->CardType ==
   4563                         PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) &&
   4564                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4565                         PH_FRINFC_MIFARESTD_FLAG0)) ||
   4566                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4567                         PH_FRINFC_MIFARESTD_FLAG1))?
   4568                         PH_FRINFC_MIFARESTD_FLAG1:
   4569                         PH_FRINFC_MIFARESTD_FLAG0);
   4570 
   4571                     NdefMap->StdMifareContainer.ReadCompleteFlag =
   4572                     (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock +
   4573                         PH_FRINFC_MIFARESTD_VAL4) >=
   4574                         PH_FRINFC_MIFARESTD4K_MAX_BLK) &&
   4575                         (NdefMap->CardType ==
   4576                         PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)) &&
   4577                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4578                         PH_FRINFC_MIFARESTD_FLAG0)) ||
   4579                         (NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4580                         PH_FRINFC_MIFARESTD_FLAG1))?
   4581                         PH_FRINFC_MIFARESTD_FLAG1:
   4582                         PH_FRINFC_MIFARESTD_FLAG0);
   4583 
   4584                     NdefMap->StdMifareContainer.currentBlock =
   4585                         ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4586                             PH_FRINFC_MIFARESTD_FLAG1)?
   4587                             PH_FRINFC_MIFARESTD_BLK4:
   4588                             NdefMap->StdMifareContainer.currentBlock);
   4589 
   4590                     Result =
   4591                     ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
   4592                             PH_FRINFC_MIFARESTD_FLAG1)?
   4593                             phFriNfc_MifStd_H_BlkChk(NdefMap):
   4594                             Result);
   4595                 }
   4596             }
   4597 
   4598             Result = ((Result != NFCSTATUS_SUCCESS)?
   4599                         Result:
   4600                         phFriNfc_MifStd_H_ChkRdWr(NdefMap));
   4601         }
   4602         else
   4603         {
   4604             NdefMap->StdMifareContainer.ChkNdefFlag =
   4605                 PH_FRINFC_MIFARESTD_FLAG0;
   4606             /* Here its required to read the entire card to know the */
   4607             /* Get exact ndef size of the card */
   4608             Result = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
   4609         }
   4610     }
   4611     else
   4612     {
   4613         /* Since we have decided temporarily not to go
   4614             for any new error codes we are using
   4615             NFCSTATUS_INVALID_PARAMETER even though it is not
   4616             the relevant error code here TBD */
   4617         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
   4618                                 NFCSTATUS_INVALID_PARAMETER);
   4619     }
   4620 
   4621     return Result;
   4622 }
   4623 
   4624 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t        *NdefMap)
   4625 {
   4626     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   4627 
   4628     /* Spec version needs to be checked every time */
   4629     Result = phFriNfc_MapTool_ChkSpcVer(NdefMap, PH_FRINFC_MIFARESTD_VAL9);
   4630 
   4631     /* Check rhe read and write access field
   4632         in GPB is 00b
   4633         bit 0 and 1 for write access check
   4634         bit 2 and 3 for read access check */
   4635     if(Result == NFCSTATUS_SUCCESS)
   4636     {
   4637         if(((NdefMap->SendRecvBuf[
   4638             PH_FRINFC_MIFARESTD_VAL9] &
   4639             PH_FRINFC_MIFARESTD_MASK_GPB_WR) ==
   4640             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
   4641             ((NdefMap->SendRecvBuf[
   4642             PH_FRINFC_MIFARESTD_VAL9] &
   4643             PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
   4644             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
   4645         {
   4646             NdefMap->CardState = (((NdefMap->StdMifareContainer.ChkNdefFlag ==
   4647                                     PH_FRINFC_MIFARESTD_FLAG1) ||
   4648                                     (NdefMap->StdMifareContainer.ReadNdefFlag ==
   4649                                     PH_FRINFC_MIFARESTD_FLAG1) ||
   4650                                     (NdefMap->StdMifareContainer.WrNdefFlag ==
   4651                                     PH_FRINFC_MIFARESTD_FLAG1))?
   4652                                     PH_NDEFMAP_CARD_STATE_INITIALIZED:
   4653                                     PH_NDEFMAP_CARD_STATE_READ_WRITE);
   4654         }
   4655         else if(((NdefMap->SendRecvBuf[
   4656             PH_FRINFC_MIFARESTD_VAL9] &
   4657             PH_FRINFC_MIFARESTD_MASK_GPB_WR) !=
   4658             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
   4659             ((NdefMap->SendRecvBuf[
   4660             PH_FRINFC_MIFARESTD_VAL9] &
   4661             PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
   4662             PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
   4663         {
   4664             /* write access not given
   4665             only read access check */
   4666             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
   4667         }
   4668         else
   4669         {
   4670             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
   4671         }
   4672     }
   4673     return Result;
   4674 }
   4675 
   4676 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t        *NdefMap,
   4677                                                    NFCSTATUS                 status)
   4678 {
   4679     NFCSTATUS Result = status;
   4680     /* if NFC forum sector is not found before the proprietary one then
   4681         authenticate the next sector
   4682         Else it is a error*/
   4683     if(NdefMap->StdMifareContainer.NFCforumSectFlag ==
   4684         PH_FRINFC_MIFARESTD_FLAG0)
   4685     {
   4686         NdefMap->StdMifareContainer.ProprforumSectFlag =
   4687                         PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG;
   4688         if(NdefMap->StdMifareContainer.currentBlock <
   4689             PH_FRINFC_MIFARESTD4K_BLK128)
   4690         {
   4691 #ifdef PH_HAL4_ENABLE
   4692             /* Fix for the disovery problem,
   4693                 if 1st sector is invalid then ignore the remaining sectors and
   4694                 send an error if the card is mifare 1k,
   4695                 if the card is mifare 4k, then update the block number to 67 and
   4696                 continue.
   4697                 Even if the authentication of that block fails then send error */
   4698             if(((NdefMap->StdMifareContainer.currentBlock <
   4699                 PH_FRINFC_MIFARESTD_BLK4) &&
   4700                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
   4701                 ((NdefMap->StdMifareContainer.currentBlock <=
   4702                 PH_FRINFC_MIFARESTD_MAD_BLK67) &&
   4703                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)))
   4704             {
   4705                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4706                                     NFCSTATUS_NO_NDEF_SUPPORT);
   4707             }
   4708             else if((NdefMap->StdMifareContainer.currentBlock <
   4709                 PH_FRINFC_MIFARESTD_BLK4) &&
   4710                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
   4711             {
   4712                 Result = NFCSTATUS_SUCCESS;
   4713                 NdefMap->StdMifareContainer.currentBlock =
   4714                             PH_FRINFC_MIFARESTD_MAD_BLK67;
   4715             }
   4716             else
   4717 #endif /* #ifdef PH_HAL4_ENABLE */
   4718             if(((NdefMap->StdMifareContainer.currentBlock +
   4719                 PH_FRINFC_MIFARESTD_BLK4) >
   4720                 PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
   4721                 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
   4722             {
   4723                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4724                             NFCSTATUS_NO_NDEF_SUPPORT);
   4725             }
   4726             else
   4727             {
   4728                 NdefMap->StdMifareContainer.remainingSize -=
   4729                         (PH_FRINFC_MIFARESTD_MAD_BLK3 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   4730                 NdefMap->StdMifareContainer.currentBlock +=
   4731                                 PH_FRINFC_MIFARESTD_BLK4;
   4732                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   4733             }
   4734         }
   4735         else if((NdefMap->StdMifareContainer.currentBlock +
   4736                 PH_FRINFC_MIFARESTD_BLK15) >
   4737                 PH_FRINFC_MIFARESTD4K_MAX_BLK)
   4738         {
   4739             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4740                         NFCSTATUS_NO_NDEF_SUPPORT);
   4741         }
   4742         else
   4743         {
   4744             NdefMap->StdMifareContainer.remainingSize -=
   4745                         (PH_FRINFC_MIFARESTD_BLK15 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   4746             NdefMap->StdMifareContainer.currentBlock +=
   4747                                     PH_FRINFC_MIFARESTD_BLOCK_BYTES;
   4748             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   4749         }
   4750         Result = ((Result != NFCSTATUS_SUCCESS)?
   4751                 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4752                         NFCSTATUS_NO_NDEF_SUPPORT)):
   4753                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   4754     }
   4755     else if((NdefMap->StdMifareContainer.ProprforumSectFlag ==
   4756             PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG) &&
   4757             (NdefMap->StdMifareContainer.NFCforumSectFlag ==
   4758             PH_FRINFC_MIFARESTD_FLAG1))
   4759     {
   4760         /*  if the proprietary forum sector are found before
   4761             NFC forum sector then again a proprietary
   4762             forum sector are found after the NFC forum
   4763             sector */
   4764         Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4765                             NFCSTATUS_NO_NDEF_SUPPORT);
   4766     }
   4767     else
   4768     {
   4769         NdefMap->StdMifareContainer.ProprforumSectFlag =
   4770                         PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG;
   4771         switch(NdefMap->PrevOperation)
   4772         {
   4773         case PH_FRINFC_NDEFMAP_CHECK_OPE:
   4774         case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
   4775             Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4776                         NFCSTATUS_NO_NDEF_SUPPORT);
   4777             break;
   4778 
   4779         case PH_FRINFC_NDEFMAP_READ_OPE:
   4780             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
   4781                 PH_FRINFC_MIFARESTD_FLAG1) &&
   4782                 (NdefMap->TLVStruct.NoLbytesinTLV ==
   4783                 PH_FRINFC_MIFARESTD_VAL0))
   4784             {
   4785                 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
   4786                 Result = NFCSTATUS_SUCCESS;
   4787             }
   4788             else
   4789             {
   4790                 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4791                         NFCSTATUS_NO_NDEF_SUPPORT);
   4792             }
   4793             break;
   4794 
   4795         case PH_FRINFC_NDEFMAP_WRITE_OPE:
   4796         default:
   4797             /* This means the further write is not possible,
   4798                 EOF_NDEF_CONTAINER_REACHED */
   4799             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   4800                                 PH_FRINFC_MIFARESTD_FLAG1;
   4801             /* Write the length to the L field in the TLV */
   4802             NdefMap->StdMifareContainer.TempBlockNo =
   4803                         NdefMap->StdMifareContainer.currentBlock;
   4804             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
   4805             NdefMap->StdMifareContainer.currentBlock =
   4806                             NdefMap->TLVStruct.NdefTLVBlock;
   4807             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
   4808             break;
   4809         }
   4810     }
   4811     return Result;
   4812 }
   4813 
   4814 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t        *NdefMap)
   4815 {
   4816     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   4817     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR;
   4818     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
   4819 
   4820     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
   4821                     NdefMap->StdMifareContainer.currentBlock);
   4822     return Result;
   4823 }
   4824 
   4825 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t        *NdefMap)
   4826 {
   4827     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4828     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
   4829 
   4830     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   4831     {
   4832         (void)memcpy(&NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1],
   4833                     NdefMap->SendRecvBuf,
   4834                     PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   4835 
   4836         /* Write to Ndef TLV Block */
   4837         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4838                             NdefMap->StdMifareContainer.currentBlock;
   4839 
   4840         TempLength = ((NdefMap->StdMifareContainer.currentBlock ==
   4841                         NdefMap->TLVStruct.NdefTLVBlock)?
   4842                         phFriNfc_MifStd_H_UpdateTLV(NdefMap):
   4843                         phFriNfc_MifStd_H_UpdRemTLV(NdefMap));
   4844 
   4845         NdefMap->StdMifareContainer.remainingSize -=
   4846             ((NdefMap->StdMifareContainer.remSizeUpdFlag ==
   4847             PH_FRINFC_MIFARESTD_FLAG1)?
   4848             PH_FRINFC_MIFARESTD_VAL2:
   4849             PH_FRINFC_MIFARESTD_VAL0);
   4850 
   4851         NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
   4852         NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
   4853         Result = ((TempLength == PH_FRINFC_MIFARESTD_BLOCK_BYTES)?
   4854                     phFriNfc_MifStd_H_WrTLV(NdefMap):
   4855                     phFriNfc_MifStd_H_fillSendBuf(NdefMap, TempLength));
   4856     }
   4857     else
   4858     {
   4859         Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
   4860                                 NFCSTATUS_READ_FAILED);
   4861     }
   4862 
   4863     return Result;
   4864 }
   4865 
   4866 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap)
   4867 {
   4868     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0;
   4869     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_MIFARESTD_VAL1);
   4870     /* Creating TLV */
   4871     if(NdefMap->TLVStruct.NULLTLVCount >= 2)
   4872     {
   4873         if((PH_FRINFC_MIFARESTD_BYTES_READ - TempLength) ==
   4874             PH_FRINFC_MIFARESTD_VAL0)
   4875         {
   4876             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   4877         }
   4878         else
   4879         {
   4880             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   4881             TempLength++;
   4882             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
   4883         }
   4884     }
   4885     else
   4886     {
   4887         switch((PH_FRINFC_MIFARESTD_BYTES_READ -
   4888                 TempLength))
   4889         {
   4890         case PH_FRINFC_MIFARESTD_VAL0:
   4891             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4892         break;
   4893 
   4894         case PH_FRINFC_MIFARESTD_VAL1:
   4895             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4896             TempLength++;
   4897             NdefMap->TLVStruct.prevLenByteValue =
   4898                                     (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
   4899                                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   4900                                     PH_FRINFC_MIFARESTD_VAL0:
   4901                                     NdefMap->SendRecvBuf[TempLength]);
   4902             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4903         break;
   4904 
   4905         case PH_FRINFC_MIFARESTD_VAL2:
   4906             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4907             TempLength++;
   4908             NdefMap->TLVStruct.prevLenByteValue =
   4909                                     (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
   4910                                     PH_FRINFC_MIFARESTD_NDEFTLV_L)?
   4911                                     NdefMap->SendRecvBuf[(TempLength +
   4912                                                 PH_FRINFC_MIFARESTD_VAL1)]:
   4913                                     NdefMap->SendRecvBuf[TempLength]);
   4914             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4915             TempLength++;
   4916             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   4917         break;
   4918 
   4919         default:
   4920             NdefMap->TLVStruct.prevLenByteValue =
   4921                             NdefMap->SendRecvBuf[TempLength];
   4922             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4923             TempLength++;
   4924             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   4925             TempLength++;
   4926             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   4927             TempLength++;
   4928             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
   4929         break;
   4930         }
   4931     }
   4932 
   4933     return TempLength;
   4934 }
   4935 
   4936 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t        *NdefMap,
   4937                                                uint8_t                   Length)
   4938 {
   4939     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   4940     uint16_t    RemainingBytes = PH_FRINFC_MIFARESTD_VAL0,
   4941                 BytesToWrite = PH_FRINFC_MIFARESTD_VAL0;
   4942     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
   4943 
   4944     Length = (Length + PH_FRINFC_MIFARESTD_VAL1);
   4945 
   4946     RemainingBytes = (uint16_t)((NdefMap->StdMifareContainer.remainingSize
   4947                         < (uint16_t)(NdefMap->ApduBufferSize -
   4948                         NdefMap->ApduBuffIndex))?
   4949                         NdefMap->StdMifareContainer.remainingSize:
   4950                         (NdefMap->ApduBufferSize -
   4951                         NdefMap->ApduBuffIndex));
   4952 
   4953     NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
   4954                             NdefMap->StdMifareContainer.currentBlock;
   4955         /* Get the number of bytes that can be written after copying
   4956         the internal buffer */
   4957     BytesToWrite = ((RemainingBytes <
   4958                     ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
   4959                     NdefMap->StdMifareContainer.internalLength))?
   4960                     RemainingBytes:
   4961                     ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
   4962                     NdefMap->StdMifareContainer.internalLength));
   4963 
   4964     if(NdefMap->StdMifareContainer.internalLength >
   4965         PH_FRINFC_MIFARESTD_VAL0)
   4966     {
   4967         /* copy the internal buffer to the send buffer */
   4968         (void)memcpy(&(NdefMap->SendRecvBuf[
   4969                     Length]),
   4970                     NdefMap->StdMifareContainer.internalBuf,
   4971                     NdefMap->StdMifareContainer.internalLength);
   4972     }
   4973 
   4974     /* Copy Bytes to write in the send buffer */
   4975     (void)memcpy(&(NdefMap->SendRecvBuf[
   4976                 (Length +
   4977                 NdefMap->StdMifareContainer.internalLength)]),
   4978                 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
   4979                 BytesToWrite);
   4980 
   4981     /* update number of bytes written from the user buffer */
   4982     NdefMap->NumOfBytesWritten = BytesToWrite;
   4983 
   4984     /* check the exact number of bytes written to a block including the
   4985         internal length */
   4986     *NdefMap->DataCount =
   4987             ((BytesToWrite + NdefMap->StdMifareContainer.internalLength
   4988             + Length) - PH_FRINFC_MIFARESTD_VAL1);
   4989 
   4990     /* if total bytes to write in the card is less than 4 bytes then
   4991     pad zeroes till 4 bytes */
   4992     if((BytesToWrite + NdefMap->StdMifareContainer.internalLength +
   4993         Length) < PH_FRINFC_MIFARESTD_WR_A_BLK)
   4994     {
   4995         for(index = (uint8_t)(BytesToWrite +
   4996                     NdefMap->StdMifareContainer.internalLength +
   4997                     Length);
   4998             index < PH_FRINFC_MIFARESTD_WR_A_BLK;
   4999             index++)
   5000             {
   5001                 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
   5002                                     (BytesToWrite + Length +
   5003                                     NdefMap->StdMifareContainer.internalLength))?
   5004                                     PH_FRINFC_MIFARESTD_TERMTLV_T:
   5005                                     PH_FRINFC_MIFARESTD_NULLTLV_T);
   5006 
   5007                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   5008             }
   5009     }
   5010 #ifdef PH_HAL4_ENABLE
   5011 
   5012     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
   5013 
   5014 #endif /* #ifdef PH_HAL4_ENABLE */
   5015 
   5016     /* A temporary buffer to hold four bytes of data that is
   5017         written to the card */
   5018     (void)memcpy(NdefMap->StdMifareContainer.Buffer,
   5019                 &(NdefMap->SendRecvBuf[
   5020                 PH_FRINFC_MIFARESTD_VAL1]),
   5021                 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   5022 
   5023     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
   5024     Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
   5025     return Result;
   5026 }
   5027 
   5028 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t        *NdefMap)
   5029 {
   5030     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5031 
   5032     /* set the data for additional data exchange*/
   5033     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
   5034     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
   5035     NdefMap->psDepAdditionalInfo.NAD = 0;
   5036     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   5037     NdefMap->MapCompletionInfo.Context = NdefMap;
   5038     /* Write from here */
   5039     NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
   5040 
   5041 #ifndef PH_HAL4_ENABLE
   5042     NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
   5043 #else
   5044     NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
   5045 #endif
   5046 
   5047     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   5048     /* Call the Overlapped HAL Transceive function */
   5049     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   5050                                             &NdefMap->MapCompletionInfo,
   5051                                             NdefMap->psRemoteDevInfo,
   5052                                             NdefMap->Cmd,
   5053                                             &NdefMap->psDepAdditionalInfo,
   5054                                             NdefMap->SendRecvBuf,
   5055                                             NdefMap->SendLength,
   5056                                             NdefMap->SendRecvBuf,
   5057                                             NdefMap->SendRecvLength);
   5058 
   5059 
   5060     return Result;
   5061 }
   5062 
   5063 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t        *NdefMap)
   5064 {
   5065     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5066     /* Check that if complete TLV has been written in the
   5067         card if yes enter the below check or go to else*/
   5068     if(((((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   5069             NdefMap->TLVStruct.NdefTLVByte) ==
   5070             PH_FRINFC_MIFARESTD_VAL1) &&
   5071             (NdefMap->TLVStruct.NULLTLVCount >=
   5072             PH_FRINFC_MIFARESTD_VAL2)) ||
   5073             (((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   5074             NdefMap->TLVStruct.NdefTLVByte) <=
   5075             PH_FRINFC_MIFARESTD_VAL3) &&
   5076             (NdefMap->TLVStruct.NULLTLVCount ==
   5077             PH_FRINFC_MIFARESTD_VAL0))) &&
   5078             (NdefMap->StdMifareContainer.currentBlock ==
   5079             NdefMap->TLVStruct.NdefTLVBlock))
   5080     {
   5081         /* increment the block and chekc the block is in the same sector
   5082             using the block check function */
   5083         NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
   5084         NdefMap->StdMifareContainer.currentBlock++;
   5085         NdefMap->StdMifareContainer.NdefBlocks++;
   5086         Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   5087         if(Result == NFCSTATUS_SUCCESS)
   5088         {
   5089             Result = ((NdefMap->StdMifareContainer.AuthDone ==
   5090                         PH_FRINFC_MIFARESTD_FLAG0)?
   5091                         phFriNfc_MifStd_H_AuthSector(NdefMap):
   5092                         phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
   5093         }
   5094     }
   5095     else
   5096     {
   5097         NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
   5098         if(NdefMap->ApduBuffIndex <
   5099                     (uint16_t)NdefMap->ApduBufferSize)
   5100         {
   5101             if(*NdefMap->DataCount < PH_FRINFC_MIFARESTD_BLOCK_BYTES)
   5102             {
   5103                 /* Write complete, so next byte shall be */
   5104                 NdefMap->StdMifareContainer.internalLength =
   5105                     *NdefMap->DataCount;
   5106 
   5107                 /* Copy bytes less than 16 to internal buffer
   5108                     for the next write this can be used */
   5109                 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   5110                         NdefMap->StdMifareContainer.Buffer,
   5111                         NdefMap->StdMifareContainer.internalLength);
   5112             }
   5113 
   5114             /* Increment the Send Buffer index */
   5115              NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
   5116 
   5117              NdefMap->StdMifareContainer.remainingSize -=
   5118                                         NdefMap->NumOfBytesWritten;
   5119 
   5120              /* Check for the End of Card */
   5121             if((NdefMap->StdMifareContainer.remainingSize  ==
   5122                 PH_FRINFC_MIFARESTD_VAL0) ||
   5123                 (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
   5124             {
   5125                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   5126                 (uint8_t)((NdefMap->StdMifareContainer.remainingSize  == 0)?
   5127                     PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
   5128 
   5129                 if(NdefMap->StdMifareContainer.internalLength ==
   5130                     PH_FRINFC_MIFARESTD_VAL0)
   5131                 {
   5132                     NdefMap->StdMifareContainer.currentBlock++;
   5133                     /* Mifare 4k Card, After 128th Block
   5134                     each sector = 16 blocks in Mifare 4k */
   5135                     Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   5136                     NdefMap->StdMifareContainer.NdefBlocks++;
   5137                 }
   5138 
   5139                 NdefMap->TLVStruct.SetTermTLVFlag =
   5140                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
   5141                             PH_FRINFC_MIFARESTD_VAL0) ||
   5142                             (NdefMap->TLVStruct.SetTermTLVFlag ==
   5143                             PH_FRINFC_MIFARESTD_FLAG1))?
   5144                             PH_FRINFC_MIFARESTD_FLAG1:
   5145                             PH_FRINFC_MIFARESTD_FLAG0);
   5146 
   5147             }
   5148             else
   5149             {
   5150                 NdefMap->StdMifareContainer.currentBlock++;
   5151                 /* Mifare 4k Card, After 128th Block
   5152                 each sector = 16 blocks in Mifare 4k */
   5153                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   5154                 if(Result == NFCSTATUS_SUCCESS)
   5155                 {
   5156                     NdefMap->StdMifareContainer.NdefBlocks++;
   5157                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
   5158                                 PH_FRINFC_MIFARESTD_FLAG1)?
   5159                                 phFriNfc_MifStd_H_WrABlock(NdefMap):
   5160                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   5161                 }
   5162             }
   5163         }
   5164     }
   5165 
   5166     if((Result == NFCSTATUS_SUCCESS) &&
   5167         (NdefMap->TLVStruct.SetTermTLVFlag !=
   5168         PH_FRINFC_MIFARESTD_FLAG1) &&
   5169         (NdefMap->StdMifareContainer.remainingSize >
   5170         PH_FRINFC_MIFARESTD_VAL0))
   5171     {
   5172         Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
   5173     }
   5174     else
   5175     {
   5176         if((Result == NFCSTATUS_SUCCESS) &&
   5177             (NdefMap->TLVStruct.SetTermTLVFlag ==
   5178             PH_FRINFC_MIFARESTD_FLAG1))
   5179         {
   5180             /* Write the length to the L field in the TLV */
   5181             NdefMap->StdMifareContainer.TempBlockNo =
   5182                         NdefMap->StdMifareContainer.currentBlock;
   5183             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
   5184             NdefMap->StdMifareContainer.currentBlock =
   5185                             NdefMap->TLVStruct.NdefTLVBlock;
   5186             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
   5187         }
   5188     }
   5189     return Result;
   5190 }
   5191 
   5192 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t        *NdefMap)
   5193 {
   5194     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
   5195     if(NdefMap->TLVStruct.NULLTLVCount >=
   5196         PH_FRINFC_MIFARESTD_VAL2)
   5197     {
   5198         NdefMap->TLVStruct.prevLenByteValue = NdefMap->SendRecvBuf[TempLength];
   5199         NdefMap->SendRecvBuf[TempLength] =
   5200                         PH_FRINFC_MIFARESTD_NDEFTLV_L0;
   5201     }
   5202     else
   5203     {
   5204         switch((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
   5205             NdefMap->TLVStruct.NdefTLVByte))
   5206         {
   5207         case PH_FRINFC_MIFARESTD_VAL1:
   5208             NdefMap->TLVStruct.prevLenByteValue =
   5209                     (((NdefMap->SendRecvBuf[TempLength] ==
   5210                     PH_FRINFC_MIFARESTD_NDEFTLV_L))?
   5211                     (((uint16_t)NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]
   5212                     << PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
   5213                     NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL2)]):
   5214                     NdefMap->SendRecvBuf[TempLength]);
   5215             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5216             TempLength++;
   5217             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5218             TempLength++;
   5219             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
   5220             break;
   5221 
   5222         case PH_FRINFC_MIFARESTD_VAL2:
   5223             NdefMap->TLVStruct.prevLenByteValue =
   5224                     (((NdefMap->SendRecvBuf[TempLength] ==
   5225                         PH_FRINFC_MIFARESTD_NDEFTLV_L))?
   5226                     (((uint16_t)NdefMap->SendRecvBuf[TempLength] <<
   5227                     PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
   5228                     NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]):
   5229                     NdefMap->SendRecvBuf[TempLength]);
   5230             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5231             TempLength++;
   5232             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
   5233             break;
   5234 
   5235         case PH_FRINFC_MIFARESTD_VAL3:
   5236         default:
   5237             NdefMap->TLVStruct.prevLenByteValue =
   5238                                             ((NdefMap->TLVStruct.prevLenByteValue <<
   5239                                             PH_FRINFC_MIFARESTD_LEFTSHIFT8)
   5240                                             + NdefMap->SendRecvBuf[TempLength]);
   5241             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
   5242             break;
   5243         }
   5244     }
   5245     return TempLength;
   5246 }
   5247 
   5248 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t        *NdefMap)
   5249 {
   5250     uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
   5251                             PH_FRINFC_MIFARESTD_VAL1);
   5252 
   5253     NdefMap->TLVStruct.prevLenByteValue =
   5254                     ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)?
   5255                     (NdefMap->TLVStruct.prevLenByteValue +
   5256                     NdefMap->ApduBuffIndex):
   5257                     NdefMap->ApduBuffIndex);
   5258 
   5259     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
   5260     switch(NdefMap->TLVStruct.NdefTLVByte)
   5261     {
   5262     case PH_FRINFC_MIFARESTD_VAL0:
   5263         if(NdefMap->TLVStruct.prevLenByteValue >=
   5264             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5265         {
   5266             NdefMap->SendRecvBuf[TempLength] =
   5267                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5268                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5269             NdefMap->SendRecvBuf[(TempLength +
   5270                                 PH_FRINFC_MIFARESTD_VAL1)] =
   5271                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5272         }
   5273         else
   5274         {
   5275             NdefMap->SendRecvBuf[TempLength] =
   5276                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5277             NdefMap->SendRecvBuf[(TempLength +
   5278                                 PH_FRINFC_MIFARESTD_VAL1)] =
   5279                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5280 
   5281             NdefMap->StdMifareContainer.RdAfterWrFlag =
   5282                                 PH_FRINFC_MIFARESTD_FLAG0;
   5283         }
   5284         break;
   5285 
   5286     case PH_FRINFC_MIFARESTD_VAL1:
   5287         if(NdefMap->TLVStruct.prevLenByteValue >=
   5288             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5289         {
   5290             NdefMap->SendRecvBuf[TempLength - PH_FRINFC_MIFARESTD_VAL1] =
   5291                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5292             NdefMap->SendRecvBuf[TempLength] =
   5293                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5294                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5295             NdefMap->SendRecvBuf[(TempLength +
   5296                                 PH_FRINFC_MIFARESTD_VAL1)] =
   5297                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5298         }
   5299         else
   5300         {
   5301             NdefMap->SendRecvBuf[TempLength] =
   5302                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5303             NdefMap->SendRecvBuf[(TempLength +
   5304                                 PH_FRINFC_MIFARESTD_VAL1)] =
   5305                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5306             NdefMap->StdMifareContainer.RdAfterWrFlag =
   5307                                 PH_FRINFC_MIFARESTD_FLAG0;
   5308         }
   5309         break;
   5310 
   5311     case PH_FRINFC_MIFARESTD_VAL15:
   5312         /* if "Type" of TLV present at byte 15 */
   5313         if(NdefMap->TLVStruct.prevLenByteValue >=
   5314             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5315         {
   5316             /* Update the null TLV, ndef TLV block and ndef TLV byte */
   5317             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   5318             NdefMap->TLVStruct.NdefTLVBlock =
   5319                                 NdefMap->StdMifareContainer.currentBlock;
   5320             NdefMap->TLVStruct.NdefTLVByte =
   5321                                 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
   5322 
   5323             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
   5324                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5325             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
   5326                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5327             NdefMap->SendRecvBuf[TempLength] =
   5328                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5329                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5330         }
   5331         else
   5332         {
   5333             NdefMap->SendRecvBuf[TempLength] =
   5334                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5335         }
   5336         break;
   5337 
   5338     default:
   5339         /* Already the TLV is present so just append the length field */
   5340         if(NdefMap->TLVStruct.prevLenByteValue >=
   5341             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5342         {
   5343             /* Update the null TLV, ndef TLV block and ndef TLV byte */
   5344             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   5345             NdefMap->TLVStruct.NdefTLVBlock =
   5346                                 NdefMap->StdMifareContainer.currentBlock;
   5347             NdefMap->TLVStruct.NdefTLVByte =
   5348                                 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
   5349 
   5350             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
   5351                                 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5352             NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
   5353                                 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5354             NdefMap->SendRecvBuf[TempLength] =
   5355                                 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5356                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5357             NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
   5358                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5359         }
   5360         else
   5361         {
   5362             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5363             NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
   5364                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5365         }
   5366         NdefMap->StdMifareContainer.RdAfterWrFlag =
   5367                                 PH_FRINFC_MIFARESTD_FLAG0;
   5368         break;
   5369     }
   5370 }
   5371 
   5372 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t        *NdefMap)
   5373 {
   5374     uint8_t     TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
   5375                                 PH_FRINFC_MIFARESTD_VAL1);
   5376 
   5377     NdefMap->TLVStruct.prevLenByteValue = ((NdefMap->Offset ==
   5378                                     PH_FRINFC_NDEFMAP_SEEK_CUR)?
   5379                                     (NdefMap->TLVStruct.prevLenByteValue +
   5380                                     NdefMap->ApduBuffIndex):
   5381                                     NdefMap->ApduBuffIndex);
   5382     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
   5383     switch(NdefMap->TLVStruct.NdefTLVByte)
   5384     {
   5385     case PH_FRINFC_MIFARESTD_VAL13:
   5386         if(NdefMap->TLVStruct.prevLenByteValue >=
   5387             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5388         {
   5389             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5390             TempLength++;
   5391             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5392             TempLength++;
   5393             NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5394                                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5395         }
   5396         else
   5397         {
   5398             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5399             TempLength++;
   5400             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5401             TempLength++;
   5402 
   5403             /* Update the null TLV, ndef TLV block and ndef TLV byte */
   5404             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
   5405             NdefMap->TLVStruct.NdefTLVBlock =
   5406                                 NdefMap->StdMifareContainer.currentBlock;
   5407             NdefMap->TLVStruct.NdefTLVByte =
   5408                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
   5409 
   5410             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5411         }
   5412         break;
   5413 
   5414     case PH_FRINFC_MIFARESTD_VAL14:
   5415         if(NdefMap->TLVStruct.prevLenByteValue >=
   5416             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5417         {
   5418             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5419             TempLength++;
   5420             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5421         }
   5422         else
   5423         {
   5424             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5425             TempLength++;
   5426             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5427         }
   5428         break;
   5429 
   5430     case PH_FRINFC_MIFARESTD_VAL15:
   5431         if(NdefMap->TLVStruct.prevLenByteValue >=
   5432             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5433         {
   5434             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5435         }
   5436         else
   5437         {
   5438             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5439         }
   5440         break;
   5441 
   5442     default:
   5443         if(NdefMap->TLVStruct.prevLenByteValue >=
   5444             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5445         {
   5446             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5447             TempLength++;
   5448             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5449             TempLength++;
   5450             NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5451                                                 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5452             TempLength++;
   5453             NdefMap->SendRecvBuf[TempLength] =
   5454                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5455         }
   5456         else
   5457         {
   5458             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5459             TempLength++;
   5460             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5461             TempLength++;
   5462 
   5463             /* Update the null TLV, ndef TLV block and ndef TLV byte */
   5464             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
   5465             NdefMap->TLVStruct.NdefTLVBlock =
   5466                                 NdefMap->StdMifareContainer.currentBlock;
   5467             NdefMap->TLVStruct.NdefTLVByte =
   5468                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
   5469 
   5470             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5471             TempLength++;
   5472             NdefMap->SendRecvBuf[TempLength] =
   5473                                 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5474         }
   5475         NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
   5476         break;
   5477     }
   5478 }
   5479 
   5480 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t        *NdefMap)
   5481 {
   5482     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5483     if(NdefMap->TLVStruct.NULLTLVCount >= PH_FRINFC_MIFARESTD_VAL2)
   5484     {
   5485         if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0) ||
   5486             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL1) )
   5487         {
   5488             /* In this case, current block is decremented because the
   5489                 NULL TLVs are in the previous block */
   5490             NdefMap->StdMifareContainer.currentBlock--;
   5491             Result = phFriNfc_MifStd_H_BlkChk_1(NdefMap);
   5492         }
   5493         else
   5494         {
   5495             /* case NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL15:
   5496               Current block is incremented to update the remaining TLV
   5497                 structure */
   5498             NdefMap->StdMifareContainer.currentBlock++;
   5499             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   5500         }
   5501     }
   5502     else
   5503     {
   5504         if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL13) ||
   5505             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL14) ||
   5506             (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL15))
   5507         {
   5508             /* Current block is incremented to update the remaining TLV
   5509                 structure */
   5510             NdefMap->StdMifareContainer.currentBlock++;
   5511             Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   5512         }
   5513     }
   5514 
   5515     Result = ((Result == NFCSTATUS_SUCCESS)?
   5516             phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap):
   5517             Result);
   5518     return Result;
   5519 }
   5520 
   5521 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t        *NdefMap)
   5522 {
   5523     /* This function is to check the current block is in the authenticated sector and
   5524         also check the block does not match with the sector trailer block. If there is a
   5525         match then decrement the block and say the caller that the authentication
   5526         is required */
   5527     NFCSTATUS   Result  = NFCSTATUS_SUCCESS;
   5528     uint8_t     SectorID = PH_FRINFC_MIFARESTD_VAL0;
   5529 
   5530     /* Get a Sector ID for the Current Block */
   5531     SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
   5532 
   5533     /* Check the sector id is valid or not and if valid then check the
   5534         current block is greater than 128 */
   5535     if((NdefMap->StdMifareContainer.aid[SectorID] ==
   5536         PH_FRINFC_MIFARESTD_NDEF_COMP) &&
   5537         (((SectorID <= PH_FRINFC_MIFARESTD_VAL15) &&
   5538         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
   5539         ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO39) &&
   5540         (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))))
   5541     {
   5542         if(NdefMap->StdMifareContainer.currentBlock > 128)
   5543         {
   5544             NdefMap->TLVStruct.NdefTLVAuthFlag =
   5545             ((((NdefMap->StdMifareContainer.currentBlock +
   5546                 PH_FRINFC_MIFARESTD_VAL1) %
   5547                 PH_FRINFC_MIFARESTD_MAD_BLK16) ==
   5548                 PH_FRINFC_MIFARESTD_VAL0)?
   5549                 PH_FRINFC_MIFARESTD_FLAG1:
   5550                 PH_FRINFC_MIFARESTD_FLAG0);
   5551 
   5552                 NdefMap->StdMifareContainer.currentBlock -=
   5553             ((((NdefMap->StdMifareContainer.currentBlock +
   5554                 PH_FRINFC_MIFARESTD_VAL1) %
   5555                 PH_FRINFC_MIFARESTD_MAD_BLK16) ==
   5556                 PH_FRINFC_MIFARESTD_VAL0)?
   5557                 PH_FRINFC_MIFARESTD_VAL1:
   5558                 PH_FRINFC_MIFARESTD_VAL0);
   5559 
   5560         }
   5561         else
   5562         {
   5563             NdefMap->TLVStruct.NdefTLVAuthFlag =
   5564             ((((NdefMap->StdMifareContainer.currentBlock +
   5565                 PH_FRINFC_MIFARESTD_VAL1) %
   5566                 PH_FRINFC_MIFARESTD_BLK4) ==
   5567                 PH_FRINFC_MIFARESTD_VAL0)?
   5568                 PH_FRINFC_MIFARESTD_FLAG1:
   5569                 PH_FRINFC_MIFARESTD_FLAG0);
   5570 
   5571             NdefMap->StdMifareContainer.currentBlock -=
   5572             ((((NdefMap->StdMifareContainer.currentBlock +
   5573                 PH_FRINFC_MIFARESTD_VAL1) %
   5574                 PH_FRINFC_MIFARESTD_BLK4) ==
   5575                 PH_FRINFC_MIFARESTD_VAL1)?
   5576                 PH_FRINFC_MIFARESTD_VAL1:
   5577                 PH_FRINFC_MIFARESTD_VAL0);
   5578 
   5579         }
   5580     }
   5581     else
   5582     {
   5583         /*Error: No Ndef Compliant Sectors present.*/
   5584         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   5585                             NFCSTATUS_INVALID_PARAMETER);
   5586     }
   5587 
   5588     return Result;
   5589 }
   5590 
   5591 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t        *NdefMap)
   5592 {
   5593     switch(NdefMap->TLVStruct.NdefTLVByte)
   5594     {
   5595     case PH_FRINFC_MIFARESTD_VAL0:
   5596         /* In the first write ndef length procedure, the
   5597             length is updated, in this case T and L = 0xFF of TLV are
   5598             updated */
   5599         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   5600         NdefMap->TLVStruct.NdefTLVBlock =
   5601                             NdefMap->StdMifareContainer.currentBlock;
   5602         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL14;
   5603 
   5604         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL15] =
   5605                                 PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5606         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] =
   5607                                 PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5608         break;
   5609 
   5610     case PH_FRINFC_MIFARESTD_VAL1:
   5611         /* In the first write ndef length procedure, the
   5612             length is updated, in this case T of TLV is
   5613             updated */
   5614         NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
   5615         NdefMap->TLVStruct.NdefTLVBlock =
   5616                             NdefMap->StdMifareContainer.currentBlock;
   5617         NdefMap->TLVStruct.NdefTLVByte =
   5618                             PH_FRINFC_MIFARESTD_VAL15;
   5619         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5620         break;
   5621 
   5622     case PH_FRINFC_MIFARESTD_VAL15:
   5623     default:
   5624         /* In the first ndef write length, part of the L field or only T
   5625             (if update length is less than 255) is updated */
   5626         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1] =
   5627                                     (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5628         break;
   5629     }
   5630     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
   5631 }
   5632 
   5633 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t        *NdefMap)
   5634 {
   5635     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL1;
   5636     switch(NdefMap->TLVStruct.NdefTLVByte)
   5637     {
   5638     case PH_FRINFC_MIFARESTD_VAL13:
   5639         /* In last write ndef length, part of length (L) field of TLV
   5640             is updated now */
   5641         NdefMap->SendRecvBuf[TempLength] =
   5642                     (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5643         break;
   5644 
   5645     case PH_FRINFC_MIFARESTD_VAL14:
   5646         /* In last write ndef length, part of length (L) field of TLV
   5647                 is updated now */
   5648         if(NdefMap->TLVStruct.prevLenByteValue >=
   5649                     PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5650         {
   5651             NdefMap->SendRecvBuf[TempLength] =
   5652                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5653                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5654             TempLength++;
   5655             NdefMap->SendRecvBuf[TempLength] =
   5656                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5657         }
   5658         else
   5659         {
   5660             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
   5661             NdefMap->TLVStruct.NdefTLVBlock =
   5662                                 NdefMap->StdMifareContainer.currentBlock;
   5663             NdefMap->TLVStruct.NdefTLVByte =
   5664                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
   5665             NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5666             TempLength++;
   5667             NdefMap->SendRecvBuf[TempLength] =
   5668                                         (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5669         }
   5670         break;
   5671 
   5672     case PH_FRINFC_MIFARESTD_VAL15:
   5673     default:
   5674         if(NdefMap->TLVStruct.prevLenByteValue >=
   5675             PH_FRINFC_MIFARESTD_NDEFTLV_L)
   5676         {
   5677             /* In last write ndef length, only T of TLV is updated and
   5678                 length (L) field of TLV is updated now */
   5679             NdefMap->SendRecvBuf[TempLength] =
   5680                             PH_FRINFC_MIFARESTD_NDEFTLV_L;
   5681             TempLength++;
   5682             NdefMap->SendRecvBuf[TempLength] =
   5683                             (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
   5684                             PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
   5685             TempLength++;
   5686             NdefMap->SendRecvBuf[TempLength] =
   5687                             (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5688         }
   5689         else
   5690         {
   5691             NdefMap->SendRecvBuf[TempLength] =
   5692                             PH_FRINFC_MIFARESTD_NULLTLV_T;
   5693             TempLength++;
   5694             NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
   5695             NdefMap->TLVStruct.NdefTLVBlock =
   5696                                 NdefMap->StdMifareContainer.currentBlock;
   5697             NdefMap->TLVStruct.NdefTLVByte =
   5698                                 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
   5699             NdefMap->SendRecvBuf[TempLength] =
   5700                             PH_FRINFC_MIFARESTD_NDEFTLV_T;
   5701             TempLength++;
   5702             NdefMap->SendRecvBuf[TempLength] =
   5703                         (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
   5704         }
   5705         break;
   5706     }
   5707     NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
   5708 }
   5709 
   5710 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t        *NdefMap)
   5711 {
   5712     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5713     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TLV;
   5714     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
   5715 
   5716     Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
   5717                 NdefMap->StdMifareContainer.currentBlock);
   5718     return Result;
   5719 }
   5720 
   5721 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t        *NdefMap)
   5722 {
   5723     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   5724                                     NFCSTATUS_INVALID_DEVICE_REQUEST);
   5725     uint8_t     TempLength = PH_FRINFC_MIFARESTD_VAL0,
   5726                 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
   5727 
   5728     /*TempLength = (uint8_t)(((NdefMap->TLVStruct.NULLTLVCount >=
   5729                 PH_FRINFC_MIFARESTD_VAL2) &&
   5730                 (NdefMap->TLVStruct.BytesRemainLinTLV > 0xFE))?
   5731                 ((NdefMap->TLVStruct.NdefTLVByte +
   5732                 PH_FRINFC_MIFARESTD_VAL2)%
   5733                 PH_FRINFC_MIFARESTD_VAL16):
   5734                 ((NdefMap->TLVStruct.NdefTLVByte +
   5735                 PH_FRINFC_MIFARESTD_VAL4)%
   5736                 PH_FRINFC_MIFARESTD_VAL16));*/
   5737 
   5738     TempLength = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <= 0xFE)?
   5739                         ((NdefMap->TLVStruct.NdefTLVByte +
   5740                         PH_FRINFC_MIFARESTD_VAL2)%
   5741                         PH_FRINFC_MIFARESTD_VAL16):
   5742                         ((NdefMap->TLVStruct.NdefTLVByte +
   5743                         PH_FRINFC_MIFARESTD_VAL4)%
   5744                         PH_FRINFC_MIFARESTD_VAL16));
   5745 
   5746     if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
   5747         (NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize))
   5748     {
   5749         if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
   5750         {
   5751             NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
   5752             /* To read the remaining length (L) in TLV */
   5753             Result = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &TempLength);
   5754         }
   5755     }
   5756     return Result;
   5757 }
   5758 
   5759 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
   5760 {
   5761     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5762     uint8_t     index = PH_FRINFC_MIFARESTD_VAL0;
   5763 
   5764     /* Change the state to check ndef compliancy */
   5765     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_TERM_TLV;
   5766 
   5767     NdefMap->SendRecvBuf[index] =
   5768                         NdefMap->StdMifareContainer.currentBlock;
   5769     index++;
   5770     NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_TERMTLV_T;
   5771     index++;
   5772 
   5773     while(index < PH_FRINFC_MIFARESTD_WR_A_BLK)
   5774     {
   5775         NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_NULLTLV_T;
   5776         index++;
   5777     }
   5778 
   5779     NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
   5780 
   5781     Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
   5782 
   5783     return Result;
   5784 }
   5785 
   5786 
   5787 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t   *NdefMap)
   5788 {
   5789     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5790 
   5791     NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
   5792     if(NdefMap->ApduBuffIndex <
   5793         (uint16_t)NdefMap->ApduBufferSize)
   5794     {
   5795         /* Remaining bytes to write < 16 */
   5796         if(NdefMap->StdMifareContainer.RemainingBufFlag ==
   5797             PH_FRINFC_MIFARESTD_FLAG1)
   5798         {
   5799             /* Write complete, so next byte shall be */
   5800             NdefMap->StdMifareContainer.internalLength =
   5801                 *NdefMap->DataCount;
   5802 
   5803             /* Copy bytes less than 16 to internal buffer
   5804                 for the next write this can be used */
   5805             (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
   5806                     NdefMap->StdMifareContainer.Buffer,
   5807                     NdefMap->StdMifareContainer.internalLength);
   5808 
   5809             /* Increment the Send Buffer index */
   5810             NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
   5811 
   5812             NdefMap->StdMifareContainer.remainingSize -=
   5813                     NdefMap->NumOfBytesWritten;
   5814 
   5815             NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_VAL0;
   5816             /* Check for the End of Card */
   5817                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   5818                     (uint8_t)((NdefMap->StdMifareContainer.remainingSize ==
   5819                     PH_FRINFC_MIFARESTD_VAL0)?
   5820                     PH_FRINFC_MIFARESTD_FLAG1:
   5821                     PH_FRINFC_MIFARESTD_FLAG0);
   5822 
   5823             NdefMap->TLVStruct.SetTermTLVFlag =
   5824                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
   5825                             PH_FRINFC_MIFARESTD_VAL0) ||
   5826                             (NdefMap->TLVStruct.SetTermTLVFlag ==
   5827                             PH_FRINFC_MIFARESTD_FLAG1))?
   5828                             PH_FRINFC_MIFARESTD_FLAG1:
   5829                             PH_FRINFC_MIFARESTD_FLAG0);
   5830 
   5831         } /* internal Buffer > Send Buffer */
   5832         else if(NdefMap->StdMifareContainer.internalBufFlag ==
   5833                 PH_FRINFC_MIFARESTD_FLAG1)
   5834         {
   5835             (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
   5836                     NdefMap->StdMifareContainer.Buffer,
   5837                     *NdefMap->DataCount);
   5838 
   5839             NdefMap->StdMifareContainer.internalLength =
   5840                                     *NdefMap->DataCount;
   5841 
   5842             /* Increment the Send Buffer index */
   5843             NdefMap->ApduBuffIndex +=
   5844                     NdefMap->NumOfBytesWritten;
   5845 
   5846             NdefMap->StdMifareContainer.remainingSize -=
   5847                     NdefMap->NumOfBytesWritten;
   5848 
   5849             NdefMap->StdMifareContainer.internalBufFlag =
   5850                                 PH_FRINFC_MIFARESTD_FLAG0;
   5851             /* Check for the End of Card */
   5852             NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   5853                 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
   5854                     PH_FRINFC_MIFARESTD_VAL0) &&
   5855                     (NdefMap->StdMifareContainer.internalLength ==
   5856                     PH_FRINFC_MIFARESTD_VAL0))?
   5857                     PH_FRINFC_MIFARESTD_FLAG1:
   5858                     PH_FRINFC_MIFARESTD_FLAG0);
   5859 
   5860             NdefMap->TLVStruct.SetTermTLVFlag =
   5861                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
   5862                             PH_FRINFC_MIFARESTD_VAL0) ||
   5863                             (NdefMap->TLVStruct.SetTermTLVFlag ==
   5864                             PH_FRINFC_MIFARESTD_FLAG1))?
   5865                             PH_FRINFC_MIFARESTD_FLAG1:
   5866                             PH_FRINFC_MIFARESTD_FLAG0);
   5867         }
   5868         else
   5869         {
   5870             NdefMap->StdMifareContainer.internalLength = 0;
   5871             /* Increment the Send Buffer index */
   5872             NdefMap->ApduBuffIndex +=
   5873                     NdefMap->NumOfBytesWritten;
   5874             NdefMap->StdMifareContainer.remainingSize -=
   5875                     NdefMap->NumOfBytesWritten;
   5876 
   5877             /* Check for the End of Card */
   5878             if((NdefMap->StdMifareContainer.remainingSize ==
   5879                     PH_FRINFC_MIFARESTD_VAL0) ||
   5880                     (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
   5881             {
   5882                 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
   5883                 (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 0)?
   5884                     PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
   5885 
   5886                 if(NdefMap->StdMifareContainer.internalLength ==
   5887                     PH_FRINFC_MIFARESTD_VAL0)
   5888                 {
   5889                     NdefMap->StdMifareContainer.currentBlock++;
   5890                     /* Mifare 4k Card, After 128th Block
   5891                     each sector = 16 blocks in Mifare 4k */
   5892                     Result = ((NdefMap->StdMifareContainer.remainingSize == 0)?
   5893                                 Result:
   5894                                 phFriNfc_MifStd_H_BlkChk(NdefMap));
   5895                     NdefMap->StdMifareContainer.NdefBlocks++;
   5896                 }
   5897                 NdefMap->TLVStruct.SetTermTLVFlag =
   5898                     (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
   5899                             PH_FRINFC_MIFARESTD_VAL0) ||
   5900                             (NdefMap->TLVStruct.SetTermTLVFlag ==
   5901                             PH_FRINFC_MIFARESTD_FLAG1))?
   5902                             PH_FRINFC_MIFARESTD_FLAG1:
   5903                             PH_FRINFC_MIFARESTD_FLAG0);
   5904             }
   5905             else
   5906             {
   5907                 NdefMap->StdMifareContainer.currentBlock++;
   5908                 NdefMap->StdMifareContainer.WrLength =
   5909                     (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
   5910                 /* Mifare 4k Card, After 128th Block
   5911                 each sector = 16 blocks in Mifare 4k */
   5912                 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
   5913                 if(Result == NFCSTATUS_SUCCESS)
   5914                 {
   5915                     NdefMap->StdMifareContainer.NdefBlocks++;
   5916                     Result = ((NdefMap->StdMifareContainer.AuthDone ==
   5917                                 PH_FRINFC_MIFARESTD_FLAG1)?
   5918                                 phFriNfc_MifStd_H_WrABlock(NdefMap):
   5919                                 phFriNfc_MifStd_H_AuthSector(NdefMap));
   5920                 }
   5921             }
   5922         }
   5923     }
   5924     else
   5925     {
   5926         Result = PHNFCSTVAL(    CID_FRI_NFC_NDEF_MAP,
   5927                                 NFCSTATUS_INVALID_DEVICE_REQUEST);
   5928     }
   5929 
   5930     if((Result == NFCSTATUS_SUCCESS) &&
   5931         (NdefMap->TLVStruct.SetTermTLVFlag !=
   5932         PH_FRINFC_MIFARESTD_FLAG1) &&
   5933         (NdefMap->StdMifareContainer.remainingSize >
   5934         PH_FRINFC_MIFARESTD_VAL0))
   5935     {
   5936         Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
   5937     }
   5938     else
   5939     {
   5940         if((Result == NFCSTATUS_SUCCESS) &&
   5941             (NdefMap->TLVStruct.SetTermTLVFlag ==
   5942             PH_FRINFC_MIFARESTD_FLAG1))
   5943         {
   5944             /* Write the length to the L field in the TLV */
   5945             NdefMap->StdMifareContainer.TempBlockNo =
   5946                         NdefMap->StdMifareContainer.currentBlock;
   5947             phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
   5948             NdefMap->StdMifareContainer.currentBlock =
   5949                             NdefMap->TLVStruct.NdefTLVBlock;
   5950             Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
   5951         }
   5952     }
   5953     return Result;
   5954 }
   5955 
   5956 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t   *NdefMap)
   5957 {
   5958     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5959     /*Set Ndef State*/
   5960     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_DISCONNECT;
   5961     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   5962     NdefMap->MapCompletionInfo.Context = NdefMap;
   5963 
   5964 #ifndef PH_HAL4_ENABLE
   5965     /*Call the Overlapped HAL POLL function */
   5966     Result =  phFriNfc_OvrHal_Disconnect( NdefMap->LowerDevice,
   5967                                           &NdefMap->MapCompletionInfo,
   5968                                           NdefMap->psRemoteDevInfo);
   5969 #else
   5970     /*Call the Overlapped HAL Reconnect function */
   5971     Result =  phFriNfc_OvrHal_Reconnect( NdefMap->LowerDevice,
   5972                                           &NdefMap->MapCompletionInfo,
   5973                                           NdefMap->psRemoteDevInfo);
   5974 #endif
   5975 
   5976     return Result;
   5977 }
   5978 
   5979 #ifndef PH_HAL4_ENABLE
   5980 static NFCSTATUS phFriNfc_MifStd_H_CallPoll(phFriNfc_NdefMap_t   *NdefMap)
   5981 {
   5982     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   5983     /*Set Ndef State*/
   5984     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_POLL;
   5985     /* Opmodes */
   5986     NdefMap->OpModeType[PH_FRINFC_MIFARESTD_VAL0] = phHal_eOpModesMifare;
   5987     NdefMap->OpModeType[PH_FRINFC_MIFARESTD_VAL1] = phHal_eOpModesArrayTerminator;
   5988 
   5989     /* Number of devices to poll */
   5990     NdefMap->NoOfDevices = PH_FRINFC_MIFARESTD_VAL1;
   5991 
   5992     /*Call the Overlapped HAL POLL function */
   5993     Result =  phFriNfc_OvrHal_Poll( NdefMap->LowerDevice,
   5994                                     &NdefMap->MapCompletionInfo,
   5995                                     NdefMap->OpModeType,
   5996                                     NdefMap->psRemoteDevInfo,
   5997                                     &NdefMap->NoOfDevices,
   5998                                     NdefMap->StdMifareContainer.DevInputParam);
   5999     return Result;
   6000 }
   6001 #endif
   6002 
   6003 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t   *NdefMap)
   6004 {
   6005     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   6006     /*Set Ndef State*/
   6007     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CONNECT;
   6008 
   6009     /*Call the Overlapped HAL POLL function */
   6010     Result =  phFriNfc_OvrHal_Connect(  NdefMap->LowerDevice,
   6011                                         &NdefMap->MapCompletionInfo,
   6012                                         NdefMap->psRemoteDevInfo,
   6013                                         NdefMap->StdMifareContainer.DevInputParam);
   6014     return Result;
   6015 }
   6016 
   6017 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t   *NdefMap,
   6018                                     uint8_t              SectorID,
   6019                                     uint8_t              *callbreak)
   6020 {
   6021     /* every last block of a sector needs to be skipped */
   6022     if(((NdefMap->StdMifareContainer.currentBlock + PH_FRINFC_MIFARESTD_INC_1) %
   6023         PH_FRINFC_MIFARESTD_BLK4) == 0)
   6024     {
   6025         NdefMap->StdMifareContainer.currentBlock++;
   6026     }
   6027     else
   6028     {
   6029         if(NdefMap->StdMifareContainer.aid[SectorID] ==
   6030             PH_FRINFC_MIFARESTD_NDEF_COMP)
   6031         {
   6032             /* Check whether the block is first block of a (next)new sector and
   6033             also check if it is first block then internal length is zero
   6034             or not. Because once Authentication is done for the sector again
   6035             we should not authenticate it again */
   6036             if((NdefMap->StdMifareContainer.currentBlock ==
   6037                 (SectorID * PH_FRINFC_MIFARESTD_BLK4)) &&
   6038                 (NdefMap->StdMifareContainer.internalLength == 0))
   6039             {
   6040                 NdefMap->StdMifareContainer.AuthDone = 0;
   6041             }
   6042             *callbreak = 1;
   6043         }
   6044         else
   6045         {
   6046             NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
   6047         }
   6048     }
   6049 }
   6050 
   6051 #ifdef UNIT_TEST
   6052 #include <phUnitTestNfc_MifareStd_static.c>
   6053 #endif
   6054 
   6055 /*	Convert the Mifare card to ReadOnly.
   6056         check preconditions before converting to read only
   6057 	1.shud b rd/write state
   6058 	2.check NDEF  for the card shud b completed
   6059 	3.if alrady read only return */
   6060 NFCSTATUS
   6061 phFriNfc_MifareStdMap_ConvertToReadOnly (
   6062                phFriNfc_NdefMap_t *NdefMap,
   6063                const uint8_t *ScrtKeyB)
   6064 {
   6065     NFCSTATUS result = NFCSTATUS_SUCCESS;
   6066     uint8_t totalNoSectors = 0 , sectorTrailerBlockNo = 0;
   6067 
   6068     if ( NdefMap == NULL)
   6069     {
   6070         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
   6071     }
   6072     else if ( PH_NDEFMAP_CARD_STATE_INVALID == NdefMap->CardState )
   6073     {
   6074         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_STATE);
   6075     }
   6076     else
   6077     {
   6078         /* card state is PH_NDEFMAP_CARD_STATE_READ_WRITE now */
   6079         /* get AID  array and parse */
   6080         if( PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD == NdefMap->CardType )
   6081         {
   6082             totalNoSectors  = PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
   6083         }
   6084         else if ( PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD == NdefMap->CardType )
   6085         {
   6086              totalNoSectors  = PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
   6087         }
   6088 
   6089         /* Store Key B in the context */
   6090         if(ScrtKeyB == NULL)
   6091         {
   6092             memset (NdefMap->StdMifareContainer.UserScrtKeyB, PH_FRINFC_MFSTD_FMT_DEFAULT_KEY,
   6093                     PH_FRINFC_MIFARESTD_KEY_LEN);
   6094         }
   6095         else
   6096         {
   6097             memcpy (NdefMap->StdMifareContainer.UserScrtKeyB, ScrtKeyB, PH_FRINFC_MIFARESTD_KEY_LEN);
   6098         }
   6099 
   6100         NdefMap->StdMifareContainer.TotalNoSectors = totalNoSectors;
   6101         if(totalNoSectors == 0)
   6102         {
   6103             result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
   6104         }
   6105         else
   6106         {
   6107             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
   6108             NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
   6109             NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
   6110             NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
   6111             NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
   6112             NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
   6113             NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
   6114             NdefMap->StdMifareContainer.WriteAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
   6115 
   6116             /* Sector 0 is MAD sector .Start from Sector 1 */
   6117             for(NdefMap->StdMifareContainer.ReadOnlySectorIndex = PH_FRINFC_MIFARESTD_FLAG1;
   6118                 NdefMap->StdMifareContainer.ReadOnlySectorIndex < totalNoSectors;
   6119                 NdefMap->StdMifareContainer.ReadOnlySectorIndex++)
   6120             {
   6121                 /* skip MAD sectors */
   6122                 if( PH_FRINFC_MIFARESTD_SECTOR_NO16 == NdefMap->StdMifareContainer.ReadOnlySectorIndex  )
   6123                 {
   6124                     continue;
   6125                 }
   6126 
   6127                 /* if not NDEF compliant skip  */
   6128                 if( PH_FRINFC_MIFARESTD_NON_NDEF_COMP ==
   6129                     NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
   6130                 {
   6131                     continue;
   6132                 }
   6133 
   6134                 if (PH_FRINFC_MIFARESTD_NDEF_COMP ==
   6135                      NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
   6136                 {
   6137                     /*get the sector trailer block number */
   6138                     sectorTrailerBlockNo =
   6139                         phFriNfc_MifStd_H_GetSectorTrailerBlkNo(NdefMap->StdMifareContainer.ReadOnlySectorIndex);
   6140                     NdefMap->StdMifareContainer.currentBlock = sectorTrailerBlockNo;
   6141                     NdefMap->StdMifareContainer.SectorTrailerBlockNo = sectorTrailerBlockNo;
   6142 
   6143                     /* Proceed to authenticate the sector with Key B
   6144                        and  modify the sector trailor bits to make it read only*/
   6145                     result = phFriNfc_MifStd_H_AuthSector(NdefMap);
   6146 
   6147                     if (result == NFCSTATUS_PENDING )
   6148                     {
   6149                         break;
   6150                     }
   6151                 }
   6152             } /* end for */
   6153 
   6154             /* There are no NDEF sectors in this card , return */
   6155             if(NdefMap->StdMifareContainer.ReadOnlySectorIndex == totalNoSectors &&
   6156                NFCSTATUS_PENDING!= result )
   6157             {
   6158                 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_NO_NDEF_SUPPORT);
   6159             }
   6160         } /* end else */
   6161     }
   6162 
   6163     return result;
   6164 }
   6165 
   6166 /* Get the block number of the sector trailor for the given sector trailer Id */
   6167 static uint8_t phFriNfc_MifStd_H_GetSectorTrailerBlkNo(uint8_t SectorID)
   6168 {
   6169     uint8_t sectorTrailerblockNumber = 0;
   6170 
   6171     /* every last block of a sector needs to be skipped */
   6172     if( SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32 )
   6173     {
   6174         sectorTrailerblockNumber = ( SectorID * PH_FRINFC_MIFARESTD_BLK4 ) + 3;
   6175     }
   6176     else
   6177     {
   6178         sectorTrailerblockNumber = ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
   6179             ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_SECTOR_BLOCKS)) + 15;
   6180     }
   6181 
   6182     return sectorTrailerblockNumber;
   6183 }
   6184 
   6185 /* Called during ConvertToReadonly process to Authenticate NDEF compliant Sector */
   6186 static NFCSTATUS phFriNfc_MifStd_H_ProSectorTrailorAcsBits(phFriNfc_NdefMap_t *NdefMap)
   6187 {
   6188     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   6189 
   6190     if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
   6191     {
   6192         if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
   6193             PH_FRINFC_MIFARESTD_FLAG1)
   6194         {
   6195             /* check for the correct access bits */
   6196             Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
   6197             if(Result  == NFCSTATUS_SUCCESS)
   6198             {
   6199 
   6200                 if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)
   6201                 {
   6202                     /* Go to next sector */
   6203                     Result = phFriNfc_MifStd_H_ProWrSectorTrailor(NdefMap);
   6204                 }
   6205                 else
   6206                 {
   6207                     /* tranceive to write the data into SendRecvBuff */
   6208                     Result = phFriNfc_MifStd_H_WrSectorTrailorBlock(NdefMap);
   6209                 }
   6210             }
   6211         }
   6212     }
   6213     else
   6214     {
   6215         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   6216                      NFCSTATUS_INVALID_PARAMETER);
   6217     }
   6218 
   6219     return Result;
   6220 }
   6221 
   6222 /* Make current NDEF compliant Sector ReadOnly
   6223    modify the sector trailor bits and write it to the card*/
   6224 static NFCSTATUS phFriNfc_MifStd_H_WrSectorTrailorBlock(phFriNfc_NdefMap_t *NdefMap)
   6225 {
   6226     NFCSTATUS status = NFCSTATUS_PENDING;
   6227 
   6228     /* set the data for additional data exchange*/
   6229     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
   6230     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
   6231     NdefMap->psDepAdditionalInfo.NAD = 0;
   6232     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
   6233     NdefMap->MapCompletionInfo.Context = NdefMap;
   6234     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
   6235 
   6236     /* next state (update sector index) */
   6237     NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE_SEC;
   6238 
   6239     /* Buffer Check */
   6240     if(NdefMap->SendRecvBuf != NULL)
   6241     {
   6242         NdefMap->SendRecvBuf[10] = 0x00;
   6243         NdefMap->SendRecvBuf[10] = NdefMap->SendRecvBuf[9] | PH_FRINFC_MIFARESTD_MASK_GPB_WR; /* WR bits 11*/
   6244 
   6245         /*The NdefMap->SendRecvBuf already has the sector trailor.
   6246         modify the bits to make Read Only */
   6247         NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
   6248         NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
   6249         NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
   6250         NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
   6251         NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
   6252         NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
   6253 
   6254         NdefMap->SendRecvBuf[7] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6;/* 0x07 */
   6255         NdefMap->SendRecvBuf[8] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7;/* 0x8F */
   6256         NdefMap->SendRecvBuf[9] = PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8;/* 0x0F */
   6257 
   6258         NdefMap->SendRecvBuf[11] = NdefMap->StdMifareContainer.UserScrtKeyB[0];
   6259         NdefMap->SendRecvBuf[12] = NdefMap->StdMifareContainer.UserScrtKeyB[1];
   6260         NdefMap->SendRecvBuf[13] = NdefMap->StdMifareContainer.UserScrtKeyB[2];
   6261         NdefMap->SendRecvBuf[14] = NdefMap->StdMifareContainer.UserScrtKeyB[3];
   6262         NdefMap->SendRecvBuf[15] = NdefMap->StdMifareContainer.UserScrtKeyB[4];
   6263         NdefMap->SendRecvBuf[16] = NdefMap->StdMifareContainer.UserScrtKeyB[5];
   6264 
   6265         /* Write to Ndef Sector Block */
   6266         NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = NdefMap->StdMifareContainer.currentBlock;
   6267 
   6268         /* Copy Ndef Sector Block into buffer */
   6269         (void)memcpy(NdefMap->StdMifareContainer.Buffer,
   6270                     &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
   6271                     PH_FRINFC_MIFARESTD_BLOCK_BYTES);
   6272 
   6273         /* Write from here */
   6274         NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
   6275 #ifndef PH_HAL4_ENABLE
   6276         NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
   6277 #else
   6278         NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
   6279 #endif
   6280         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   6281 
   6282         /* Call the Overlapped HAL Transceive function */
   6283         status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
   6284                                            &NdefMap->MapCompletionInfo,
   6285                                            NdefMap->psRemoteDevInfo,
   6286                                            NdefMap->Cmd,
   6287                                            &NdefMap->psDepAdditionalInfo,
   6288                                            NdefMap->SendRecvBuf,
   6289                                            NdefMap->SendLength,
   6290                                            NdefMap->SendRecvBuf,
   6291                                            NdefMap->SendRecvLength);
   6292     }
   6293     else
   6294     {
   6295         /* Error: The control should not ideally come here.
   6296            Return Error.*/
   6297 #ifndef PH_HAL4_ENABLE
   6298         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
   6299 #else
   6300         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
   6301 #endif
   6302     }
   6303 
   6304     return status;
   6305 }
   6306 
   6307 /* Make next NDEF compliant Sector ReadOnly */
   6308 static NFCSTATUS phFriNfc_MifStd_H_ProWrSectorTrailor(phFriNfc_NdefMap_t *NdefMap)
   6309 {
   6310     NFCSTATUS status =  NFCSTATUS_FAILED;
   6311     uint8_t sectorTrailerBlockNo = 0;
   6312 
   6313     /*Increment Sector Index */
   6314     NdefMap->StdMifareContainer.ReadOnlySectorIndex++;
   6315 
   6316     /* skip if MAD2 */
   6317     if(PH_FRINFC_MIFARESTD_SECTOR_NO16 == NdefMap->StdMifareContainer.ReadOnlySectorIndex )
   6318     {
   6319         NdefMap->StdMifareContainer.ReadOnlySectorIndex++;
   6320     }
   6321 
   6322     /* if current sector index exceeds total sector index then
   6323        all ndef sectors are made readonly then return success
   6324        If a NON def sector is encountered return success*/
   6325     if (NdefMap->StdMifareContainer.ReadOnlySectorIndex >= NdefMap->StdMifareContainer.TotalNoSectors ||
   6326         PH_FRINFC_MIFARESTD_NON_NDEF_COMP  ==
   6327         NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
   6328     {
   6329         status = NFCSTATUS_SUCCESS;
   6330     }
   6331     else if(PH_FRINFC_MIFARESTD_NDEF_COMP  == NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.ReadOnlySectorIndex])
   6332     {
   6333         /* Convert next NDEF sector to read only */
   6334         sectorTrailerBlockNo = phFriNfc_MifStd_H_GetSectorTrailerBlkNo(NdefMap->StdMifareContainer.ReadOnlySectorIndex);
   6335         NdefMap->StdMifareContainer.currentBlock = sectorTrailerBlockNo;
   6336         NdefMap->StdMifareContainer.SectorTrailerBlockNo = sectorTrailerBlockNo;
   6337 
   6338         status = phFriNfc_MifStd_H_AuthSector(NdefMap);
   6339     }
   6340 
   6341     return status;
   6342 }
   6343 
   6344 #endif  /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
   6345