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