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_MifareUL.c
     19  * \brief This component encapsulates read/write/check ndef/process functionalities,
     20  *        for the Mifare UL card.
     21  *
     22  * Project: NFC-FRI
     23  *
     24  * $Date: Wed Feb 17 15:18:08 2010 $
     25  * $Author: ing07385 $
     26  * $Revision: 1.35 $
     27  * $Aliases: NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
     28  *
     29  */
     30 
     31 #ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
     32 
     33 #include <phFriNfc_NdefMap.h>
     34 #include <phFriNfc_MifareULMap.h>
     35 #include <phFriNfc_MapTools.h>
     36 #include <phFriNfc_OvrHal.h>
     37 #include <phFriNfc.h>
     38 
     39 
     40 /*! \ingroup grp_file_attributes
     41  *  \name NDEF Mapping
     42  *
     43  * File: \ref phFriNfc_MifareUL.c
     44  *
     45  */
     46 /*@{*/
     47 #define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.35 $"
     48 #define PHFRINFCNDEFMAP_FILEALIASES  "$Aliases: NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $"
     49 /*@}*/
     50 /* Completion Helper */
     51 static void phFriNfc_MifareUL_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
     52                                         NFCSTATUS            Status);
     53 
     54 /*!
     55  * \brief \copydoc page_ovr Helper function for Mifare UL. This function reads
     56  *  a 16 bytes from the card.
     57  */
     58 static NFCSTATUS phFriNfc_MfUL_H_Rd16Bytes( phFriNfc_NdefMap_t  *NdefMap);
     59 
     60 /*!
     61  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
     62  *  to find NDEF TLV
     63  */
     64 static NFCSTATUS phFriNfc_MfUL_H_findNDEFTLV(phFriNfc_NdefMap_t *NdefMap,
     65                                         uint8_t                 *CRFlag);
     66 
     67 /*!
     68  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
     69  *  to check the completing the reading 16 bytes
     70  */
     71 static NFCSTATUS phFriNfc_MfUL_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
     72                                             uint16_t             TempLength);
     73 
     74 
     75 /*!
     76  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
     77  *  to read 16 bytes for the finding the ndef TLV
     78  */
     79 static NFCSTATUS phFriNfc_MfUL_H_RdCardfindNdefTLV( phFriNfc_NdefMap_t  *NdefMap,
     80                                                  uint8_t                BlockNo);
     81 
     82 /*!
     83  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
     84  *  to check the remaining size of the 3 byte of length field in TLV
     85  */
     86 static NFCSTATUS phFriNfc_MfUL_H_ChkRemainTLV(phFriNfc_NdefMap_t  *NdefMap,
     87                                               uint8_t             *CRFlag);
     88 
     89 /*!
     90  * \brief \copydoc page_ovr Helper function for Mifare UL. This function is
     91  *  to byte and block number of the next TLV in the card and updating the
     92  *  remaining free space in the card
     93  */
     94 static void phFriNfc_MfUL_H_UpdateLen(phFriNfc_NdefMap_t        *NdefMap,
     95                                       uint16_t                  DataLen);
     96 
     97 /*!
     98  * \brief \copydoc page_ovr Helper function for Mifare UL. Depending on the
     99  * operation (read/write/check ndef), the next function is called
    100  */
    101 static NFCSTATUS phFriNfc_MfUL_H_NxtOp(phFriNfc_NdefMap_t       *NdefMap,
    102                                        uint8_t                  *CRFlag);
    103 
    104 /*!
    105  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    106  * function is to copy the read bytes to the internal "ReadBuf" buffer
    107  */
    108 static NFCSTATUS phFriNfc_MfUL_H_CopyRdBytes(phFriNfc_NdefMap_t  *NdefMap);
    109 
    110 /*!
    111  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    112  * function is to copy the read bytes to the user buffer
    113  */
    114 static NFCSTATUS phFriNfc_MfUL_H_CpDataToUserBuf(phFriNfc_NdefMap_t *NdefMap);
    115 
    116 /*!
    117  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    118  * function is to write 4 bytes to 1 block in the card
    119  */
    120 static NFCSTATUS   phFriNfc_MfUL_H_Wr4bytes(phFriNfc_NdefMap_t  *NdefMap);
    121 
    122 /*!
    123  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    124  * function is to check the CC bytes in block 3 card
    125  */
    126 static NFCSTATUS phFriNfc_MfUL_H_ChkCCBytes(phFriNfc_NdefMap_t  *NdefMap);
    127 
    128 /*!
    129  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    130  * function is to read the TLVs and then start writing
    131  */
    132 static NFCSTATUS phFriNfc_MfUL_H_RdBeforeWrite(phFriNfc_NdefMap_t  *NdefMap);
    133 
    134 /*!
    135  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    136  * function is to call write operation after reading the NDEF TLV block
    137  */
    138 static NFCSTATUS phFriNfc_MfUL_H_CallWrOp(phFriNfc_NdefMap_t        *NdefMap);
    139 
    140 /*!
    141  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    142  * function is to process the written data
    143  */
    144 static NFCSTATUS phFriNfc_MfUL_H_ProWrittenBytes(phFriNfc_NdefMap_t *NdefMap);
    145 
    146 /*!
    147  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    148  * function is to fill the send buffer before write
    149  */
    150 static NFCSTATUS phFriNfc_MfUL_H_fillSendBufToWr(phFriNfc_NdefMap_t *NdefMap);
    151 
    152 /*!
    153  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    154  * function is to update the length L of the TLV
    155  */
    156 static NFCSTATUS phFriNfc_MfUL_H_UpdateWrLen(phFriNfc_NdefMap_t *NdefMap);
    157 
    158 /*!
    159  * \brief \copydoc page_ovr Helper function for Mifare UL function. This
    160  * function is to write the terminator TLV after writing all the bytes
    161  */
    162 static NFCSTATUS phFriNfc_MfUL_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap);
    163 
    164 #ifdef LOCK_BITS_CHECK_ENABLE
    165     static
    166     void
    167     phFriNfc_MfUL_H_ChkLockBits (
    168         phFriNfc_NdefMap_t *NdefMap);
    169 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
    170 
    171 /*!
    172  * \brief \copydoc select sector function for Mifare UL function. This
    173  * function is to write the terminator TLV after writing all the bytes
    174  */
    175 static NFCSTATUS  phFriNfc_MfUL_H_SelectSector(phFriNfc_NdefMap_t  *NdefMap,
    176                                                    uint8_t              SectorNo,
    177                                                    uint8_t              CmdNo,
    178                                                    uint8_t              NextState);
    179 
    180 
    181 
    182 static void phFriNfc_MfUL_H_UpdateCrc( uint8_t ch,
    183                                           uint16_t *lpwCrc );
    184 
    185 static void phFriNfc_MfUL_H_ComputeCrc( int      CRCType,
    186                                  uint8_t  *Data,
    187                                  int      Length,
    188                                  uint8_t  *TransmitFirst,
    189                                  uint8_t  *TransmitSecond
    190                                  );
    191 
    192 static void
    193 phFriNfc_MfUL_CalcByteNum(phFriNfc_NdefMap_t *NdefMap);
    194 
    195 
    196 #define CRC_A 0
    197 #define CRC_B 1
    198 
    199 
    200 NFCSTATUS phFriNfc_MifareUL_H_Reset(phFriNfc_NdefMap_t        *NdefMap)
    201 {
    202     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
    203 
    204     if ( NdefMap == NULL)
    205     {
    206         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
    207     }
    208     else
    209     {
    210         /* TLV structure initialisation */
    211         NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_NDEFMAP_MFUL_VAL4;
    212         NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    213         NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    214         NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    215         NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    216         NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    217         NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    218         NdefMap->TLVStruct.ActualSize = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    219         NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    220         NdefMap->TLVStruct.WrLenFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    221 
    222         /* Mifare UL container initialisation */
    223         NdefMap->MifareULContainer.ByteNumber = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    224         NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    225         NdefMap->MifareULContainer.CurrentSector = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    226         NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    227         NdefMap->MifareULContainer.InternalLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    228         NdefMap->MifareULContainer.ReadBufIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    229         NdefMap->MifareULContainer.ReadWriteCompleteFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    230         NdefMap->MifareULContainer.RemainingSize = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    231 
    232         /* Fill all the structure related buffer to ZERO */
    233         (void)memset(NdefMap->TLVStruct.NdefTLVBuffer,
    234                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
    235                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
    236         (void)memset(NdefMap->MifareULContainer.Buffer,
    237                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
    238                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
    239         (void)memset(NdefMap->MifareULContainer.InternalBuf,
    240                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
    241                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
    242         (void)memset(NdefMap->MifareULContainer.ReadBuf,
    243                     PH_FRINFC_NDEFMAP_MFUL_VAL0,
    244                     PH_FRINFC_NDEFMAP_MFUL_VAL64);
    245     }
    246     return Result;
    247 }
    248 
    249 /*!
    250  * \brief Initiates Reading of NDEF information from the Mifare UL.
    251  *
    252  * It performs a reset of the state and starts the action (state machine).
    253  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
    254  * has been triggered.
    255  */
    256 
    257 NFCSTATUS phFriNfc_MifareUL_RdNdef( phFriNfc_NdefMap_t  *NdefMap,
    258                                     uint8_t             *PacketData,
    259                                     uint32_t            *PacketDataLength,
    260                                     uint8_t             Offset)
    261 {
    262     NFCSTATUS                   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    263                                                     NFCSTATUS_INVALID_PARAMETER);
    264 
    265     if((NdefMap != NULL) && (PacketData != NULL) && (PacketDataLength != NULL) &&
    266         (*PacketDataLength != PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
    267         (Offset <= PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
    268         (NdefMap->CompletionRoutine->CompletionRoutine != NULL) &&
    269         (NdefMap->CompletionRoutine->Context != NULL ) &&
    270         ((NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INITIALIZED) &&
    271         (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INVALID)))
    272     {
    273         /*Register PacketData to Data Buffer of NdefMap */
    274         NdefMap->ApduBuffer = PacketData;
    275         /*Register PacketDataLength to Data Length of NdefMap */
    276         NdefMap->ApduBufferSize = *PacketDataLength ;
    277         /*  To return actual number of bytes read to the caller */
    278         NdefMap->NumOfBytesRead = PacketDataLength ;
    279         *NdefMap->NumOfBytesRead = 0;
    280 
    281         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
    282             PH_FRINFC_NDEFMAP_WRITE_OPE))
    283         {
    284             NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
    285             NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    286             NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    287             NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
    288             NdefMap->MifareULContainer.RemainingSize = NdefMap->CardMemSize;
    289             NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    290             NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    291             NdefMap->MifareULContainer.ReadBufIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    292             NdefMap->MifareULContainer.ReadWriteCompleteFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    293         }
    294 
    295         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
    296         NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
    297 
    298         if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
    299             (NdefMap->MifareULContainer.ReadWriteCompleteFlag ==
    300                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1))
    301         {
    302             /*  No space on card for reading : we have already
    303                 reached the end of file !
    304                 Offset is set to Continue Operation */
    305             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    306                             NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
    307         }
    308         else
    309         {
    310             NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
    311                                 ( NdefMap->PrevOperation != PH_FRINFC_NDEFMAP_READ_OPE))?
    312                                 PH_FRINFC_NDEFMAP_SEEK_BEGIN:
    313                                 Offset);
    314 
    315             Result = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
    316             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap, NdefMap->MifareULContainer.CurrentBlock):
    317             phFriNfc_MfUL_H_CpDataToUserBuf(NdefMap));
    318         }
    319     }
    320     return Result;
    321 }
    322 
    323 
    324 /*!
    325  * \brief Initiates writing of NDEF information to the Mifare UL.
    326  *
    327  * The function initiates the writing of NDEF information to a Mifare UL.
    328  * It performs a reset of the state and starts the action (state machine).
    329  * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
    330  * has been triggered.
    331  */
    332 
    333 NFCSTATUS phFriNfc_MifareUL_WrNdef( phFriNfc_NdefMap_t  *NdefMap,
    334                                     uint8_t             *PacketData,
    335                                     uint32_t            *PacketDataLength,
    336                                     uint8_t             Offset)
    337 {
    338       NFCSTATUS                   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    339                                                     NFCSTATUS_INVALID_PARAMETER);
    340 
    341 
    342 
    343         if((NdefMap != NULL) && (PacketData != NULL) && (PacketDataLength != NULL) &&
    344             (*PacketDataLength != PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
    345             (Offset <= PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
    346             (NdefMap->CompletionRoutine->CompletionRoutine != NULL) &&
    347             (NdefMap->CompletionRoutine->Context != NULL ) &&
    348             ((NdefMap->CardState != PH_NDEFMAP_CARD_STATE_READ_ONLY) &&
    349             (NdefMap->CardState != PH_NDEFMAP_CARD_STATE_INVALID)))
    350         {
    351             NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
    352             /*Register PacketData to Data Buffer of NdefMap */
    353             NdefMap->ApduBuffer = PacketData;
    354             /*Register PacketDataLength to Data Length of NdefMap */
    355             NdefMap->ApduBufferSize = *PacketDataLength ;
    356             /*  To return actual number of bytes read to the caller */
    357             NdefMap->WrNdefPacketLength = PacketDataLength ;
    358             *NdefMap->WrNdefPacketLength = 0;
    359 
    360             if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
    361                 PH_FRINFC_NDEFMAP_READ_OPE))
    362             {
    363                 NdefMap->MifareULContainer.CurrentSector = NdefMap->TLVStruct.NdefTLVSector;
    364                 NdefMap->MifareULContainer.CurrentBlock = NdefMap->TLVStruct.NdefTLVBlock;
    365                 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    366                 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    367                 NdefMap->MifareULContainer.ReadBufIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    368                 NdefMap->MifareULContainer.ReadWriteCompleteFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    369                 NdefMap->TLVStruct.WrLenFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    370                 NdefMap->MifareULContainer.InternalLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    371                 NdefMap->MifareULContainer.RemainingSize =
    372                                     (NdefMap->CardMemSize -
    373                                     (((NdefMap->TLVStruct.NdefTLVBlock -
    374                                     PH_FRINFC_NDEFMAP_MFUL_BYTE4) *
    375                                     PH_FRINFC_NDEFMAP_MFUL_BYTE4) +
    376                                     NdefMap->TLVStruct.NdefTLVByte +
    377                                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
    378             }
    379             NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
    380             NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
    381 
    382             if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
    383                 (NdefMap->MifareULContainer.ReadWriteCompleteFlag ==
    384                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1))
    385             {
    386                 /*  No space on card for reading : we have already
    387                     reached the end of file !
    388                     Offset is set to Continue Operation */
    389                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    390                                 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
    391             }
    392             else
    393             {
    394                 NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
    395                                     ( NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))?
    396                                     PH_FRINFC_NDEFMAP_SEEK_BEGIN:
    397                                     Offset);
    398 
    399                 if (NdefMap->TLVStruct.NdefTLVSector == 1)
    400                 {
    401                     NdefMap->MifareULContainer.CurrentSector = 1;
    402 
    403                     /* Change to sector 1 */
    404                     Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
    405                     NdefMap->MifareULContainer.CurrentSector, 1,
    406                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_1);
    407 
    408                 }
    409                 else
    410                 {
    411                     Result = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
    412                         phFriNfc_MfUL_H_RdBeforeWrite(NdefMap):
    413                         phFriNfc_MfUL_H_fillSendBufToWr(NdefMap));
    414                 }
    415             }
    416         }
    417 
    418 
    419     return Result;
    420 }
    421 
    422 
    423 
    424 /*!
    425  * \brief Check whether a particular Mifare UL is NDEF compliant.
    426  *
    427  * The function checks whether the peer device is NDEF compliant.
    428  *
    429  */
    430 
    431 NFCSTATUS phFriNfc_MifareUL_ChkNdef( phFriNfc_NdefMap_t     *NdefMap)
    432 {
    433     NFCSTATUS                   status =    NFCSTATUS_PENDING;
    434     uint8_t                     index=0,
    435                                 pSensRes[2] = {0};
    436 
    437     /* set the data for additional data exchange*/
    438     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
    439     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
    440     NdefMap->psDepAdditionalInfo.NAD = 0;
    441 
    442     /*
    443      *  Changed
    444      *  Description: CardInfo106 replase
    445      */
    446 
    447     /* retrive remote card information */
    448     pSensRes[0]  = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
    449 
    450     NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_NDEFMAP_MFUL_VAL4;
    451 #ifdef LOCK_BITS_CHECK_ENABLE
    452     NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK2;
    453 #else
    454     NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK3;
    455 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
    456     NdefMap->MifareULContainer.CRindex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
    457 
    458     /* Check for Mifare Bit information  */
    459     if (((pSensRes[0] & PH_FRINFC_NDEFMAP_MFUL_CHECK_RESP) == PH_FRINFC_NDEFMAP_MFUL_CHECK_RESP))
    460     {
    461         NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
    462         /* set the offset*/
    463         NdefMap->SendRecvBuf[index] = NdefMap->MifareULContainer.CurrentBlock;
    464 
    465         /*set the send length*/
    466         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_MAX_SEND_BUF_TO_READ;
    467 
    468         /* Change the state to check ndef compliancy */
    469         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_CHK_NDEF_COMP;
    470 
    471         /* Set the card type as Mifare UL */
    472         NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
    473 
    474         /* set the cmd to mifare read*/
    475         /*
    476          * Changed
    477          * Description: phHal_eMifareCmdListMifareRead replace with phHal_eMifareRead
    478          */
    479         NdefMap->Cmd.MfCmd = phHal_eMifareRead;
    480 
    481         /* Set the CR and context for Mifare operations*/
    482         NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareUL_Process;
    483         NdefMap->MapCompletionInfo.Context = NdefMap;
    484 
    485         /*Set the Length*/
    486         *NdefMap->SendRecvLength = PH_FRINFC_NDEFMAP_MF_READ_BLOCK_SIZE;
    487 
    488 
    489         /*Call the Overlapped HAL Transceive function */
    490         status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
    491                                             &NdefMap->MapCompletionInfo,
    492                                             NdefMap->psRemoteDevInfo,
    493                                             NdefMap->Cmd,
    494                                             &NdefMap->psDepAdditionalInfo,
    495                                             NdefMap->SendRecvBuf,
    496                                             NdefMap->SendLength,
    497                                             NdefMap->SendRecvBuf,
    498                                             NdefMap->SendRecvLength);
    499     }
    500     else
    501     {
    502         status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_REMOTE_DEVICE);
    503     }
    504     return status;
    505 }
    506 
    507 static void
    508 phFriNfc_MfUL_CalcByteNum(phFriNfc_NdefMap_t *NdefMap)
    509 {
    510     uint8_t     i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    511     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    512 
    513 
    514     for (i = 0; i < 16; i++)
    515     {
    516         if ((NdefMap->MifareULContainer.ReadBuf[i] ==
    517         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T) &&
    518         ((NdefMap->MifareULContainer.ReadBuf[i + 1] ==
    519         NdefMap->TLVStruct.ActualSize) ||
    520         (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)))
    521         {
    522             if (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)
    523             {
    524                 TemLength = NdefMap->MifareULContainer.ReadBuf[i + 2] |
    525                 ((uint16_t)NdefMap->MifareULContainer.ReadBuf[i + 3] << 8);
    526 
    527                 if (TemLength == NdefMap->TLVStruct.ActualSize)
    528                 {
    529                     NdefMap->MifareULContainer.ByteNumber = i + 1;
    530                     break;
    531                 }
    532             }
    533             else
    534             {
    535                 NdefMap->MifareULContainer.ByteNumber = i + 1;
    536                 break;
    537             }
    538         }
    539      }
    540 
    541     return;
    542 }
    543 
    544 
    545 #ifdef LOCK_BITS_CHECK_ENABLE
    546 
    547 #define MIF_UL_LOCK_BIT_CHECK           0xFF
    548 #define MIF_UL_LOCK_BIT_0_VALUE         0x0F
    549 #define MIF_UL_LOCK_BIT_1_VALUE         0x00
    550 
    551 static
    552 void
    553 phFriNfc_MfUL_H_ChkLockBits (
    554     phFriNfc_NdefMap_t *NdefMap)
    555 {
    556     uint8_t         index = 2;
    557 
    558     if (((NdefMap->SendRecvBuf[index] &
    559         MIF_UL_LOCK_BIT_CHECK) > MIF_UL_LOCK_BIT_0_VALUE) ||
    560         (MIF_UL_LOCK_BIT_1_VALUE !=
    561         (NdefMap->SendRecvBuf[(index + 1)] & MIF_UL_LOCK_BIT_CHECK)))
    562     {
    563         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
    564     }
    565 }
    566 
    567 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE  */
    568 
    569 /*!
    570  * \brief Completion Routine, Processing function, needed to avoid long
    571  * blocking.
    572  * \note The lower (Overlapped HAL) layer must register a pointer to
    573  *  this function as a Completion
    574  *  Routine in order to be able to notify the component that an I/O
    575  *  has finished and data are ready to be processed.
    576  *
    577  */
    578 
    579 void phFriNfc_MifareUL_Process( void        *Context,
    580                                 NFCSTATUS   Status)
    581 
    582 {
    583 
    584     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
    585                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    586     phFriNfc_NdefMap_t          *NdefMap;
    587     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    588     /*uint16_t                    TempByte = PH_FRINFC_NDEFMAP_MFUL_VAL0; */
    589     static uint8_t                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    590 
    591     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    592 
    593     /* set the context to Map module */
    594 
    595     NdefMap = (phFriNfc_NdefMap_t *)Context;
    596 
    597     if ( Status == NFCSTATUS_SUCCESS )
    598     {
    599         switch (NdefMap->State)
    600         {
    601             case PH_FRINFC_NDEFMAP_MFUL_STATE_CHK_NDEF_COMP:
    602                 if (*NdefMap->SendRecvLength ==
    603                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
    604                 {
    605                     /* Checks for the Ndef Compliency and validy of the memory size*/
    606                     Status = phFriNfc_MfUL_H_ChkCCBytes(NdefMap);
    607                     CRFlag = (uint8_t)((Status != NFCSTATUS_SUCCESS)?
    608                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    609                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    610 
    611 #ifdef LOCK_BITS_CHECK_ENABLE
    612 
    613                     /* Check for lock bits */
    614                     if (NFCSTATUS_SUCCESS == Status)
    615                     {
    616                         phFriNfc_MfUL_H_ChkLockBits(NdefMap);
    617                     }
    618 
    619 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
    620 
    621                     /* Find the NDEF TLV */
    622                     NdefMap->MifareULContainer.CurrentBlock = PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
    623                     Status = ((Status != NFCSTATUS_SUCCESS)?
    624                                 Status:
    625                                 phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
    626                                             NdefMap->MifareULContainer.CurrentBlock));
    627                     CRFlag = (uint8_t)(((Status != NFCSTATUS_PENDING ) ||
    628                                 (CRFlag == PH_FRINFC_NDEFMAP_MFUL_FLAG1))?
    629                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    630                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    631 
    632 #ifdef PH_HAL4_ENABLE
    633                     if ((Status != NFCSTATUS_PENDING ) &&
    634                         (Status != NFCSTATUS_SUCCESS))
    635                     {
    636                         NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
    637                     }
    638 #endif /* #ifdef PH_HAL4_ENABLE */
    639                 }
    640             break;
    641 
    642 
    643             case PH_FRINFC_NDEFMAP_MFUL_STATE_READ:
    644                 /* check the received bytes size equals 16 bytes*/
    645                 if (*NdefMap->SendRecvLength ==
    646                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
    647                 {
    648                     if(NdefMap->MifareULContainer.ReadBufIndex <
    649                         (NdefMap->TLVStruct.ActualSize + (((NdefMap->TLVStruct.NdefTLVBlock - PH_FRINFC_NDEFMAP_MFUL_BLOCK4)
    650                             * PH_FRINFC_NDEFMAP_MFUL_VAL4) + (NdefMap->TLVStruct.NdefTLVByte - 1) + 4)))
    651                     {
    652                         Status = phFriNfc_MfUL_H_CopyRdBytes(NdefMap);
    653                     }
    654 
    655                     if (Status == NFCSTATUS_SUCCESS)
    656                     {
    657                         if(NdefMap->MifareULContainer.ReadBufIndex >=
    658                             (NdefMap->TLVStruct.ActualSize + (((NdefMap->TLVStruct.NdefTLVBlock - PH_FRINFC_NDEFMAP_MFUL_BLOCK4)
    659                             * PH_FRINFC_NDEFMAP_MFUL_VAL4) + (NdefMap->TLVStruct.NdefTLVByte - 1) + 4)))
    660                         {
    661 
    662                             phFriNfc_MfUL_CalcByteNum(NdefMap);
    663 #if 0
    664                             for (i = 0; i < 16; i++)
    665                             {
    666                                 if ((NdefMap->MifareULContainer.ReadBuf[i] ==
    667                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T) &&
    668                                     ((NdefMap->MifareULContainer.ReadBuf[i + 1] ==
    669                                     NdefMap->TLVStruct.ActualSize) ||
    670                                     (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)))
    671                                 {
    672                                     if (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)
    673                                     {
    674                                         TemLength = NdefMap->MifareULContainer.ReadBuf[i + 2] |
    675                                             ((uint16_t)NdefMap->MifareULContainer.ReadBuf[i + 3] << 8);
    676 
    677                                         if (TemLength == NdefMap->TLVStruct.ActualSize)
    678                                         {
    679                                             NdefMap->MifareULContainer.ByteNumber = i + 1;
    680                                             break;
    681                                         }
    682                                     }
    683                                     else
    684                                     {
    685                                         NdefMap->MifareULContainer.ByteNumber = i + 1;
    686                                         break;
    687                                     }
    688                                 }
    689                             }
    690 #endif
    691 
    692                             if (NdefMap->MifareULContainer.ReadBuf
    693                                 [NdefMap->MifareULContainer.ByteNumber] == 0xFF)
    694                             {
    695                                 NdefMap->MifareULContainer.ByteNumber =
    696                                     NdefMap->MifareULContainer.ByteNumber + 3;
    697                             }
    698                             else
    699                             {
    700                                 NdefMap->MifareULContainer.ByteNumber =
    701                                     NdefMap->MifareULContainer.ByteNumber + 1;
    702                             }
    703 
    704                             Status = phFriNfc_MfUL_H_CpDataToUserBuf(NdefMap);
    705                             if (NdefMap->MifareULContainer.CurrentSector > 0)
    706                             {
    707                                 NdefMap->MifareULContainer.CurrentSector = 0;
    708                                 NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_READ;
    709 
    710                                 Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    711                                     NdefMap->MifareULContainer.CurrentSector, 1,
    712                                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
    713                                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
    714                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    715                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    716                             }
    717                             else
    718                             {
    719                                 CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    720                             }
    721                         }
    722                         else
    723                         {
    724                             Status = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
    725                             CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    726                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    727                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    728                         }
    729                     }
    730                     else
    731                     {
    732 
    733                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    734                     }
    735                 }
    736                 else
    737                 {
    738                     /* read error */
    739                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    740                                         NFCSTATUS_INVALID_RECEIVE_LENGTH);
    741                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    742                 }
    743             break;
    744 
    745             case PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE:
    746                 Status = phFriNfc_MfUL_H_ProWrittenBytes(NdefMap);
    747                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    748                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    749                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    750             break;
    751 
    752             case PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP:
    753                 if (*NdefMap->SendRecvLength ==
    754                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
    755                 {
    756                     switch(NdefMap->PrevOperation)
    757                     {
    758                     case PH_FRINFC_NDEFMAP_CHECK_OPE:
    759                     case PH_FRINFC_NDEFMAP_READ_OPE:
    760                             CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    761                             if(NdefMap->TLVStruct.NoLbytesinTLV >
    762                                 PH_FRINFC_NDEFMAP_MFUL_VAL0)
    763                             {
    764                                 Status = phFriNfc_MfUL_H_ChkRemainTLV(NdefMap, &CRFlag);
    765                             }
    766                             else
    767                             {
    768                                 if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
    769                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)
    770                                 {
    771                                     /* Find the NDEF TLV */
    772                                     Status = phFriNfc_MfUL_H_findNDEFTLV(NdefMap, &CRFlag);
    773                                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
    774                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    775                                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    776                                 }
    777                             }
    778                             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
    779                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
    780                                 (NdefMap->TLVStruct.NoLbytesinTLV ==
    781                                 PH_FRINFC_NDEFMAP_MFUL_VAL0))
    782                             {
    783                                 CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    784                                 /* Ndef TLV found, so call the next function depending on the
    785                                     check/read/write ndef operation */
    786 
    787                                 if (NdefMap->MifareULContainer.CurrentSector > 0)
    788                                 {
    789                                     NdefMap->MifareULContainer.CurrentSector = 0;
    790                                     NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP;
    791 
    792                                     Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    793                                         NdefMap->MifareULContainer.CurrentSector, 1,
    794                                         PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
    795                                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
    796                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    797                                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    798                                 }
    799                                 else
    800                                 {
    801                                     /* Sector is 0 no need to send sector select */
    802                                     Status = phFriNfc_MfUL_H_NxtOp(NdefMap, &CRFlag);
    803                                 }
    804                             }
    805 
    806 #ifdef PH_HAL4_ENABLE
    807                             if ((Status != NFCSTATUS_PENDING ) &&
    808                                 (Status != NFCSTATUS_SUCCESS) &&
    809                                 (PH_FRINFC_NDEFMAP_CHECK_OPE ==
    810                                 NdefMap->PrevOperation))
    811                             {
    812                                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
    813                             }
    814 #endif /* #ifdef PH_HAL4_ENABLE */
    815                         break;
    816 
    817                     case PH_FRINFC_NDEFMAP_WRITE_OPE:
    818                         /* Remove UpdateWrLen */
    819                         Status = ((NdefMap->TLVStruct.WrLenFlag ==
    820                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)?
    821                                     phFriNfc_MfUL_H_UpdateWrLen(NdefMap):
    822                                     phFriNfc_MfUL_H_CallWrOp(NdefMap));
    823                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    824                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    825                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    826                         break;
    827 
    828                     default:
    829                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    830                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
    831                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    832                         break;
    833 
    834                     }
    835                 }
    836             break;
    837 
    838             case PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV:
    839                 Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
    840                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    841                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    842                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    843             break;
    844 
    845             case PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV:
    846                 if(((((NdefMap->TLVStruct.NdefTLVByte -
    847                     PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
    848                     PH_FRINFC_NDEFMAP_MFUL_VAL3) &&
    849                     (NdefMap->MifareULContainer.CurrentBlock ==
    850                     (NdefMap->TLVStruct.NdefTLVBlock +
    851                     PH_FRINFC_NDEFMAP_MFUL_VAL1))) ||
    852                     (((NdefMap->TLVStruct.NdefTLVByte -
    853                         PH_FRINFC_NDEFMAP_MFUL_VAL1) <
    854                     PH_FRINFC_NDEFMAP_MFUL_VAL3) && (
    855                     NdefMap->MifareULContainer.CurrentBlock ==
    856                     NdefMap->TLVStruct.NdefTLVBlock))))
    857                 {
    858                     (void)memcpy(NdefMap->MifareULContainer.InternalBuf,
    859                                 NdefMap->MifareULContainer.Buffer,
    860                                 NdefMap->MifareULContainer.InternalLength);
    861                 }
    862                 (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
    863                             NdefMap->MifareULContainer.Buffer,
    864                             PH_FRINFC_NDEFMAP_MFUL_VAL4);
    865 
    866                 NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
    867                                     PH_NDEFMAP_CARD_STATE_INITIALIZED)?
    868                                     PH_NDEFMAP_CARD_STATE_READ_WRITE:
    869                                     NdefMap->CardState);
    870                 NdefMap->ApduBuffIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    871                 NdefMap->NumOfBytesWritten = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    872 
    873                 if (NdefMap->MifareULContainer.CurrentSector > 0)
    874                 {
    875                     /* Reset sector */
    876                     NdefMap->MifareULContainer.CurrentSector = 0;
    877                     NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV;
    878 
    879                     Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    880                             NdefMap->MifareULContainer.CurrentSector, 1,
    881                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
    882                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    883                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    884                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    885                 }
    886                 else
    887                 {
    888                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    889                 }
    890 
    891             break;
    892 
    893             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1:
    894                  /* check the received bytes size equals 1 byte*/
    895                 if (*NdefMap->SendRecvLength ==
    896                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
    897                 {
    898                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
    899                     {
    900                         /* Send second command */
    901                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    902                             NdefMap->MifareULContainer.CurrentSector, 2,
    903                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2);
    904                     }
    905                     else
    906                     {
    907                         /* read error */
    908                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    909                                 NFCSTATUS_INVALID_FORMAT);
    910                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    911                     }
    912                 }
    913                 else
    914                 {
    915                     /* read error */
    916                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    917                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
    918                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    919 
    920                 }
    921             break;
    922 
    923             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2:
    924                 {
    925                     NdefMap->MifareULContainer.CurrentBlock +=
    926                                 PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
    927 
    928                     Status = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
    929                                 NdefMap->MifareULContainer.CurrentBlock);
    930                 }
    931             break;
    932 
    933             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1:
    934                  /* check the received bytes size equals 1 byte*/
    935                 if (*NdefMap->SendRecvLength ==
    936                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
    937                 {
    938                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
    939                     {
    940                         /* Send second command */
    941                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    942                             NdefMap->MifareULContainer.CurrentSector, 2,
    943                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2);
    944                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    945                     }
    946                     else
    947                     {
    948                         /* read error */
    949                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    950                                 NFCSTATUS_INVALID_FORMAT);
    951                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    952                     }
    953                 }
    954                 else
    955                 {
    956                     /* read error */
    957                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    958                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
    959                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    960 
    961                 }
    962             break;
    963 
    964             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2:
    965                 {
    966                     if (NdefMap->MifareULContainer.CurrentBlock == 0xFF)
    967                     {
    968                         NdefMap->MifareULContainer.CurrentBlock = 0;
    969                     }
    970                     else
    971                     {
    972                         NdefMap->MifareULContainer.CurrentBlock =
    973                             (NdefMap->TLVStruct.NdefTLVBlock / 4) * 4;
    974                     }
    975 
    976                     Status = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
    977                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    978                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    979                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    980                 }
    981             break;
    982 
    983             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1:
    984                  /* check the received bytes size equals 1 byte*/
    985                 if (*NdefMap->SendRecvLength ==
    986                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
    987                 {
    988                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
    989                     {
    990                         /* Send second command */
    991                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    992                             NdefMap->MifareULContainer.CurrentSector, 2,
    993                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2);
    994                     }
    995                     else
    996                     {
    997                         /* read error */
    998                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    999                                 NFCSTATUS_INVALID_FORMAT);
   1000                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1001                     }
   1002                 }
   1003                 else
   1004                 {
   1005                     /* read error */
   1006                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1007                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1008                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1009 
   1010                 }
   1011             break;
   1012 
   1013             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2:
   1014                 {
   1015                     NdefMap->MifareULContainer.CurrentBlock = 0;
   1016                     Status = phFriNfc_MfUL_H_fillSendBufToWr(NdefMap);
   1017 
   1018                     if((Status == NFCSTATUS_SUCCESS) &&
   1019                         (NdefMap->TLVStruct.SetTermTLVFlag !=
   1020                             PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
   1021                             (NdefMap->MifareULContainer.RemainingSize >
   1022                             PH_FRINFC_NDEFMAP_MFUL_VAL0))
   1023                     {
   1024                         Status = phFriNfc_MfUL_H_WrTermTLV(NdefMap);
   1025                     }
   1026                     else
   1027                     {
   1028                         if((Status == NFCSTATUS_SUCCESS) &&
   1029                             (NdefMap->TLVStruct.SetTermTLVFlag ==
   1030                             PH_FRINFC_NDEFMAP_MFUL_FLAG1))
   1031                         {
   1032                             Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
   1033                         }
   1034                     }
   1035 
   1036                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1037                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1038                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1039                 }
   1040             break;
   1041 
   1042             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_1:
   1043                  /* check the received bytes size equals 1 byte*/
   1044                 if (*NdefMap->SendRecvLength ==
   1045                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1046                 {
   1047                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
   1048                     {
   1049                         /* Send second command */
   1050                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
   1051                             NdefMap->MifareULContainer.CurrentSector, 2,
   1052                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2);
   1053                     }
   1054                     else
   1055                     {
   1056                         /* read error */
   1057                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1058                                 NFCSTATUS_INVALID_FORMAT);
   1059                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1060                     }
   1061                 }
   1062                 else
   1063                 {
   1064                     /* read error */
   1065                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1066                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1067                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1068 
   1069                 }
   1070             break;
   1071 
   1072             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2:
   1073                 {
   1074                     Status = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
   1075                         phFriNfc_MfUL_H_RdBeforeWrite(NdefMap):
   1076                         phFriNfc_MfUL_H_fillSendBufToWr(NdefMap));
   1077 
   1078 
   1079                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1080                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1081                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1082                 }
   1083             break;
   1084 
   1085 
   1086             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1:
   1087                  /* check the received bytes size equals 1 byte*/
   1088                 if (*NdefMap->SendRecvLength ==
   1089                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1090                 {
   1091                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
   1092                     {
   1093                         /* Send second command */
   1094                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
   1095                             NdefMap->MifareULContainer.CurrentSector, 2,
   1096                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2);
   1097                     }
   1098                     else
   1099                     {
   1100                         /* read error */
   1101                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1102                                 NFCSTATUS_INVALID_FORMAT);
   1103                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1104                     }
   1105                 }
   1106                 else
   1107                 {
   1108                     /* read error */
   1109                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1110                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1111                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1112 
   1113                 }
   1114             break;
   1115 
   1116             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2:
   1117                 {
   1118                     NdefMap->MifareULContainer.CurrentBlock = 0;
   1119 
   1120                     NdefMap->SendRecvBuf[index] =
   1121                                         NdefMap->MifareULContainer.CurrentBlock;
   1122                     index++;
   1123                     NdefMap->SendRecvBuf[index] =
   1124                                             PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   1125                     index++;
   1126 
   1127                     if((((NdefMap->TLVStruct.NdefTLVByte -
   1128                             PH_FRINFC_NDEFMAP_MFUL_VAL1) == PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
   1129                             ((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1130                             == PH_FRINFC_NDEFMAP_MFUL_VAL3)))
   1131                         {
   1132                             /* Length to know how many bytes has to be written to the card */
   1133                         TemLength = (((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
   1134                                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1135                                         PH_FRINFC_NDEFMAP_MFUL_VAL2:
   1136                                         PH_FRINFC_NDEFMAP_MFUL_VAL3);
   1137 
   1138                         if(NdefMap->ApduBufferSize >= TemLength)
   1139                         {
   1140                             /* Prepare the receive buffer */
   1141                             (void)memcpy(&(NdefMap->SendRecvBuf[
   1142                                             index]),
   1143                                             &(NdefMap->ApduBuffer[
   1144                                             NdefMap->ApduBuffIndex]),
   1145                                             TemLength);
   1146 
   1147                             /* Number of bytes written to the card from user buffer */
   1148                             NdefMap->NumOfBytesWritten = TemLength;
   1149 
   1150                             index = index+(uint8_t)TemLength;
   1151                             /* Exact number of bytes written in the card including TLV */
   1152                             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1153                         }
   1154                         else
   1155                         {
   1156                             /* Prepare the receive buffer */
   1157                             (void)memcpy(&(NdefMap->SendRecvBuf[
   1158                                             index]),
   1159                                             &(NdefMap->ApduBuffer[
   1160                                             NdefMap->ApduBuffIndex]),
   1161                                             (uint16_t)NdefMap->ApduBufferSize);
   1162 
   1163                             /* Number of bytes written to the card from user buffer */
   1164                             NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
   1165 
   1166                             index= index +(uint8_t)NdefMap->ApduBufferSize;
   1167                             /* Exact number of bytes written in the card including TLV */
   1168                             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1169 
   1170                             for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK; i++)
   1171                             {
   1172                                 NdefMap->SendRecvBuf[i] = (uint8_t)((i == index)?
   1173                                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
   1174                                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
   1175                                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1176                             }
   1177                         }
   1178 
   1179                         /* store the bytes in buffer till the bytes are
   1180                             written in a block */
   1181                         (void)memcpy(NdefMap->MifareULContainer.Buffer,
   1182                                         &(NdefMap->SendRecvBuf[
   1183                                         PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   1184                                         (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   1185                                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1186 
   1187                         (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   1188                                     NdefMap->MifareULContainer.Buffer,
   1189                                     (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   1190                                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1191 
   1192                         /* Change the state to check ndef compliancy */
   1193                         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   1194 
   1195                         Status = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   1196                     }
   1197 
   1198 
   1199                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1200                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1201                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1202                 }
   1203             break;
   1204 
   1205             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1:
   1206                  /* check the received bytes size equals 1 byte*/
   1207                 if (*NdefMap->SendRecvLength ==
   1208                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1209                 {
   1210                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
   1211                     {
   1212                         /* Send second command */
   1213                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
   1214                             NdefMap->MifareULContainer.CurrentSector, 2,
   1215                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2);
   1216                     }
   1217                     else
   1218                     {
   1219                         /* read error */
   1220                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1221                                 NFCSTATUS_INVALID_FORMAT);
   1222                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1223                     }
   1224                 }
   1225                 else
   1226                 {
   1227                     /* read error */
   1228                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1229                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1230                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1231 
   1232                 }
   1233             break;
   1234 
   1235             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2:
   1236                 {
   1237                     if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP)
   1238                     {
   1239                         Status = phFriNfc_MfUL_H_NxtOp(NdefMap, &CRFlag);
   1240                     }
   1241                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_READ)
   1242                     {
   1243                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1244                     }
   1245                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE)
   1246                     {
   1247                         Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
   1248                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1249                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1250                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1251                     }
   1252                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV)
   1253                     {
   1254                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1255                     }
   1256                     else
   1257                     {
   1258                         /* read error */
   1259                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1260                                     NFCSTATUS_READ_FAILED);
   1261                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1262 
   1263                     }
   1264                 }
   1265             break;
   1266 
   1267             default:
   1268                 /*set the invalid state*/
   1269                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
   1270                 phFriNfc_MifareUL_H_Complete(NdefMap, Status);
   1271             break;
   1272         }
   1273         if(CRFlag == PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1274         {
   1275             /* call the CR routine*/
   1276             phFriNfc_MifareUL_H_Complete(NdefMap, Status);
   1277         }
   1278     }
   1279     else
   1280     {
   1281         phFriNfc_MifareUL_H_Complete(NdefMap,Status);
   1282     }
   1283 }
   1284 
   1285 static NFCSTATUS phFriNfc_MfUL_H_ChkCCBytes(phFriNfc_NdefMap_t  *NdefMap )
   1286 {
   1287     NFCSTATUS Result = PHNFCSTVAL(  CID_FRI_NFC_NDEF_MAP,
   1288                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1289 
   1290 #ifdef LOCK_BITS_CHECK_ENABLE
   1291         switch(NdefMap->SendRecvBuf[7])
   1292 #else
   1293         switch(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE3])
   1294 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1295         {
   1296             case PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RW:
   1297                 /* This state can be either INITIALISED or READWRITE. but default
   1298                     is INITIALISED */
   1299                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
   1300                 break;
   1301 
   1302             case PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RO:
   1303                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
   1304                 break;
   1305 
   1306             default :
   1307                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
   1308         }
   1309 
   1310 
   1311 
   1312         /* Check for Ndef compliancy : 0 and 1 byte spcifies the ndef compliancy
   1313            2 byte specifies the version of the MF UL tag*/
   1314 #ifdef LOCK_BITS_CHECK_ENABLE
   1315         if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE4] ==
   1316 #else
   1317         if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE0] ==
   1318 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1319             PH_FRINFC_NDEFMAP_MFUL_CC_BYTE0) && (
   1320             (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED) ||
   1321             (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)))
   1322         {
   1323             /* Check the version number */
   1324             Result =phFriNfc_MapTool_ChkSpcVer( NdefMap,
   1325 #ifdef LOCK_BITS_CHECK_ENABLE
   1326                                                 5);
   1327 
   1328 #else
   1329                                                 PH_FRINFC_NDEFMAP_MFUL_BYTE1);
   1330 
   1331 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1332 #if 0
   1333 #ifdef PH_NDEF_MIFARE_ULC
   1334             if (Result == NFCSTATUS_SUCCESS)
   1335             {
   1336 #ifdef LOCK_BITS_CHECK_ENABLE
   1337 
   1338                 if (NdefMap->SendRecvBuf[6] == 0x06)
   1339                 {
   1340                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1341                 }
   1342                 else if (NdefMap->SendRecvBuf[6] == 0x12)
   1343                 {
   1344 //                  NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;
   1345                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1346                 }
   1347 
   1348 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1349 
   1350                 if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] == 0x06)
   1351                 {
   1352                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1353                 }
   1354                 else if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] == 0x12)
   1355                 {
   1356 //                  NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;
   1357                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1358                 }
   1359 
   1360 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1361                 else
   1362                 {
   1363                     Result = PHNFCSTVAL(  CID_FRI_NFC_NDEF_MAP,
   1364                                                         NFCSTATUS_INVALID_REMOTE_DEVICE);
   1365                 }
   1366             }
   1367 #else
   1368 
   1369         /*  Check the CC header size: Only valid ones are
   1370                 0x06 for 48 bytes. */
   1371 #ifdef LOCK_BITS_CHECK_ENABLE
   1372             Result = ((( NdefMap->SendRecvBuf[6] !=
   1373 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1374             Result = ((( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] !=
   1375 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1376                         PH_FRINFC_NDEFMAP_MFUL_CC_BYTE2) || (Result !=
   1377                         NFCSTATUS_SUCCESS))?
   1378                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1379                         NFCSTATUS_INVALID_REMOTE_DEVICE)):
   1380                         Result);
   1381 #endif /* #ifdef PH_NDEF_MIFARE_ULC */
   1382 #endif
   1383             NdefMap->MifareULContainer.RemainingSize =
   1384             NdefMap->CardMemSize = ((Result == NFCSTATUS_SUCCESS)?
   1385 #ifdef LOCK_BITS_CHECK_ENABLE
   1386                                     (NdefMap->SendRecvBuf[6] *
   1387 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1388                                     (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] *
   1389 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1390                                     PH_FRINFC_NDEFMAP_MFUL_MUL8):
   1391                                     NdefMap->CardMemSize);
   1392 
   1393             if (NdefMap->CardMemSize > 256)
   1394             {
   1395                 NdefMap->CardMemSize = NdefMap->CardMemSize - 2;
   1396                 NdefMap->MifareULContainer.RemainingSize = NdefMap->CardMemSize;
   1397             }
   1398 
   1399         }
   1400         else
   1401         {
   1402             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
   1403         }
   1404 
   1405 
   1406     return Result;
   1407 }
   1408 
   1409 /*!
   1410  * \brief this shall notify the integration software with respective
   1411  *  success/error status along with the completion routines.
   1412  *
   1413  *  This routine is called from the mifareul process function.
   1414  *
   1415  */
   1416 
   1417 static void phFriNfc_MifareUL_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
   1418                                         NFCSTATUS            Status)
   1419 {
   1420     if(NdefMap!=NULL)
   1421     {
   1422         if((PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE   ==  NdefMap->State)
   1423             &&  (NFCSTATUS_SUCCESS !=  Status))
   1424         {
   1425             *NdefMap->WrNdefPacketLength    =   0;
   1426         }
   1427         /* set the state back to the Reset_Init state*/
   1428         NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
   1429 
   1430         /* set the completion routine*/
   1431         NdefMap->CompletionRoutine[NdefMap->MifareULContainer.CRindex].
   1432             CompletionRoutine(NdefMap->CompletionRoutine->Context, Status);
   1433     }
   1434 }
   1435 
   1436 static NFCSTATUS   phFriNfc_MfUL_H_Rd16Bytes( phFriNfc_NdefMap_t  *NdefMap)
   1437 {
   1438     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1439                     NFCSTATUS_INVALID_PARAMETER);
   1440 
   1441     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_READ;
   1442 
   1443     /*  Set the previous operation flag to read. */
   1444     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
   1445 
   1446     /*  Have we already read the entire file? */
   1447     if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)
   1448     {
   1449         /* set the data for additional data exchange */
   1450         NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1451         NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1452         NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1453         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   1454                                 NdefMap->MifareULContainer.CurrentBlock;
   1455         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1456         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1457         /*
   1458          * Changed
   1459          * Description: replace with  phHal_eMifareRead
   1460          */
   1461 
   1462         NdefMap->Cmd.MfCmd =  phHal_eMifareRead;
   1463 
   1464         /* Call the overlapped HAL Transceive function */
   1465         Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   1466                                                 &NdefMap->MapCompletionInfo,
   1467                                                 NdefMap->psRemoteDevInfo,
   1468                                                 NdefMap->Cmd,
   1469                                                 &NdefMap->psDepAdditionalInfo,
   1470                                                 NdefMap->SendRecvBuf,
   1471                                                 NdefMap->SendLength,
   1472                                                 NdefMap->SendRecvBuf,
   1473                                                 NdefMap->SendRecvLength);
   1474     }
   1475     return Result;
   1476 }
   1477 
   1478 static NFCSTATUS   phFriNfc_MfUL_H_Wr4bytes(  phFriNfc_NdefMap_t  *NdefMap)
   1479 {
   1480     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   1481 
   1482     /* set the receive length*/
   1483     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1484 
   1485     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
   1486 
   1487     /*
   1488      * Changed
   1489      * Description: phHal_eMifareCmdListMifareWrite4 replace with phHal_eMifareWrite4
   1490      */
   1491     /* set the cmd to mifare read*/
   1492     NdefMap->Cmd.MfCmd = phHal_eMifareWrite4;
   1493 
   1494     /* Set the CR and context for Mifare operations*/
   1495     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareUL_Process;
   1496     NdefMap->MapCompletionInfo.Context = NdefMap;
   1497 
   1498     NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK;
   1499     /*Call the Overlapped HAL Transceive function */
   1500     Result = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
   1501                                         &NdefMap->MapCompletionInfo,
   1502                                         NdefMap->psRemoteDevInfo,
   1503                                         NdefMap->Cmd,
   1504                                         &NdefMap->psDepAdditionalInfo,
   1505                                         NdefMap->SendRecvBuf,
   1506                                         NdefMap->SendLength,
   1507                                         NdefMap->SendRecvBuf,
   1508                                         NdefMap->SendRecvLength);
   1509     return Result;
   1510 }
   1511 
   1512 static NFCSTATUS phFriNfc_MfUL_H_findNDEFTLV(phFriNfc_NdefMap_t     *NdefMap,
   1513                                             uint8_t                 *CRFlag)
   1514 {
   1515     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   1516     uint16_t    ShiftLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   1517                 TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   1518                 Temp16Bytes = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1519     Temp16Bytes = ((NdefMap->TLVStruct.NdefTLVByte > PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1520                     (NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1):
   1521                     NdefMap->TLVStruct.NdefTLVByte);
   1522     for(;;)
   1523     {
   1524         if(NdefMap->SendRecvBuf[Temp16Bytes] ==
   1525                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV)
   1526         {
   1527             NdefMap->MifareULContainer.RemainingSize -=
   1528                         PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1529 #ifdef PH_HAL4_ENABLE
   1530             /* This check is added to know the remaining size in
   1531             the card is not 0, if this is 0, then complete card has
   1532             been read */
   1533             if (NdefMap->MifareULContainer.RemainingSize ==
   1534                         PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1535             {
   1536                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1537                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1538                 break;
   1539             }
   1540             else
   1541             {
   1542                 Result = NFCSTATUS_SUCCESS;
   1543             }
   1544 #else
   1545             Result = ((NdefMap->MifareULContainer.RemainingSize ==
   1546                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1547                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1548                                     NFCSTATUS_NO_NDEF_SUPPORT)):
   1549                         NFCSTATUS_SUCCESS);
   1550 #endif /* #ifdef PH_HAL4_ENABLE */
   1551             Temp16Bytes++;
   1552 #ifdef PH_HAL4_ENABLE
   1553             /* This code is added to read next 16 bytes. This means previous
   1554             16 bytes read contains only NULL TLV, so read further to get the
   1555             NDEF TLV */
   1556             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1557                                                 Temp16Bytes);
   1558             if(NFCSTATUS_SUCCESS != Result)
   1559             {
   1560                 NdefMap->TLVStruct.NdefTLVBlock =
   1561                     NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL4;
   1562                 break;
   1563             }
   1564 #endif /* #ifdef PH_HAL4_ENABLE */
   1565         }
   1566         else
   1567         {
   1568             Result = ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1569                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV)?
   1570                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1571                                     NFCSTATUS_NO_NDEF_SUPPORT)):
   1572                         NFCSTATUS_SUCCESS);
   1573 
   1574             if(Result != NFCSTATUS_SUCCESS)
   1575             {
   1576                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1577                 break;
   1578             }
   1579 
   1580 #ifdef PH_NDEF_MIFARE_ULC
   1581             if ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1582                         PH_FRINFC_NDEFMAP_MFUL_LOCK_CTRL_TLV) ||
   1583                         (NdefMap->SendRecvBuf[Temp16Bytes] ==
   1584                         PH_FRINFC_NDEFMAP_MFUL_MEM_CTRL_TLV) )
   1585             {
   1586 
   1587                  NdefMap->TLVStruct.NdefTLVByte =
   1588                                     ((Temp16Bytes %
   1589                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1590                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1591 
   1592                  Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1593                                                 Temp16Bytes);
   1594                 if(Result != NFCSTATUS_SUCCESS)
   1595                 {
   1596                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1597                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1598                     NdefMap->TLVStruct.NoLbytesinTLV =
   1599                                             PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1600                     break;
   1601                 }
   1602                 Temp16Bytes++;
   1603                 NdefMap->MifareULContainer.RemainingSize -=
   1604                                 PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1605 
   1606                 if(NdefMap->MifareULContainer.RemainingSize ==
   1607                   PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1608                 {
   1609                     Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1610                                         NFCSTATUS_NO_NDEF_SUPPORT));
   1611                     break;
   1612                 }
   1613 
   1614                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1615                                                     Temp16Bytes);
   1616                 if(Result != NFCSTATUS_SUCCESS)
   1617                 {
   1618                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1619                                         PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1620                     NdefMap->TLVStruct.NoLbytesinTLV =
   1621                                         PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1622                     break;
   1623                 }
   1624 
   1625 
   1626                  /* If the value of the Length(L) in TLV is FF then enter else
   1627                             check for the card memory */
   1628                 if((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1629                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
   1630                     ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1631                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
   1632                     (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1633                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
   1634                 {
   1635                     /* In the present case, the card space is not greater
   1636                         than 0xFF */
   1637                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1638                                         NFCSTATUS_NO_NDEF_SUPPORT);
   1639 
   1640                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1641                     break;
   1642                 }
   1643                 else
   1644                 {
   1645                     NdefMap->TLVStruct.BytesRemainLinTLV =
   1646                                     NdefMap->SendRecvBuf[Temp16Bytes];
   1647 
   1648                     NdefMap->TLVStruct.ActualSize =
   1649                                     NdefMap->SendRecvBuf[Temp16Bytes];
   1650 
   1651                     if((NdefMap->MifareULContainer.RemainingSize <
   1652                         NdefMap->SendRecvBuf[Temp16Bytes]) ||
   1653                         (NdefMap->MifareULContainer.RemainingSize <
   1654                         PH_FRINFC_NDEFMAP_MFUL_VAL2) ||
   1655                         (NdefMap->TLVStruct.BytesRemainLinTLV >
   1656                         (NdefMap->MifareULContainer.RemainingSize)) ||
   1657                         ((NdefMap->TLVStruct.BytesRemainLinTLV ==
   1658                         PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
   1659                         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)))
   1660                     {
   1661                         /* No NDEF TLV found */
   1662                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1663                                             NFCSTATUS_NO_NDEF_SUPPORT);
   1664                         *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1665                         break;
   1666                     }
   1667 
   1668                     if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1669                         PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1670                     {
   1671                         NdefMap->TLVStruct.NdefTLVByte =
   1672                                         (((Temp16Bytes + PH_FRINFC_NDEFMAP_MFUL_VAL1 +
   1673                                         NdefMap->SendRecvBuf[Temp16Bytes]) %
   1674                                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1675                                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1676 #if 0
   1677                         NdefMap->TLVStruct.NdefTLVBlock =
   1678                                         (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   1679                                         + ((Temp16Bytes +
   1680                                         NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
   1681                                         PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1682 #endif
   1683                         NdefMap->TLVStruct.NdefTLVBlock =
   1684                                         (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock / PH_FRINFC_NDEFMAP_MFUL_VAL4) *
   1685                                             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   1686                                             + ((Temp16Bytes + NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
   1687                                             PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1688 
   1689 
   1690                         TemLength = (Temp16Bytes +
   1691                                 NdefMap->SendRecvBuf[Temp16Bytes]);
   1692 
   1693                         NdefMap->MifareULContainer.RemainingSize =
   1694                                         (NdefMap->MifareULContainer.RemainingSize -
   1695                                         (NdefMap->SendRecvBuf[Temp16Bytes]
   1696                                         + PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1697 
   1698                         /* If the Length (L) in TLV < 16 bytes */
   1699                         Temp16Bytes = ((TemLength >=
   1700                                 PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1701                                 PH_FRINFC_NDEFMAP_MFUL_VAL0:
   1702                                 (TemLength +
   1703                                 PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1704 
   1705                         Result = ((TemLength >=
   1706                                 PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1707                                 phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   1708                                             NdefMap->TLVStruct.NdefTLVBlock):
   1709                                 NFCSTATUS_SUCCESS);
   1710 
   1711                         if(TemLength >= PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
   1712                         {
   1713                             break;
   1714                         }
   1715                         TemLength = Temp16Bytes;
   1716                     }
   1717                 }
   1718 
   1719 
   1720 
   1721 
   1722 #if 0
   1723 
   1724                  NdefMap->MifareULContainer.RemainingSize =
   1725                                     (NdefMap->MifareULContainer.RemainingSize -
   1726                                     (NdefMap->SendRecvBuf[Temp16Bytes + 1]
   1727                                     + PH_FRINFC_NDEFMAP_MFUL_VAL2));
   1728 
   1729                 NdefMap->TLVStruct.NdefTLVBlock =
   1730                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   1731                                     + ((Temp16Bytes +
   1732                                     NdefMap->SendRecvBuf[Temp16Bytes + 1] + 2)/
   1733                                     PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1734 
   1735 
   1736                 Temp16Bytes = Temp16Bytes +
   1737                         NdefMap->SendRecvBuf[Temp16Bytes + 1] + 2;
   1738 #endif
   1739             }
   1740 #endif /* #ifdef PH_NDEF_MIFARE_ULC */
   1741             else {
   1742 
   1743             /* Check the byte for 0x03 Type of NDEF TLV */
   1744             NdefMap->TLVStruct.NdefTLVFoundFlag =
   1745                     ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1746                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T)?
   1747                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1748                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1749 
   1750             if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
   1751                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1752             {
   1753                 ShiftLength = (Temp16Bytes +
   1754                                     NdefMap->SendRecvBuf[Temp16Bytes]);
   1755 
   1756                  NdefMap->TLVStruct.NdefTLVByte =
   1757                                     ((Temp16Bytes %
   1758                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1759                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1760 
   1761                 NdefMap->TLVStruct.NdefTLVBlock =
   1762                                     (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock /4) * 4)
   1763                                     + (Temp16Bytes)/
   1764                                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
   1765 
   1766                 NdefMap->TLVStruct.NdefTLVSector = NdefMap->MifareULContainer.CurrentSector;
   1767 
   1768             }
   1769 #ifdef PH_HAL4_ENABLE
   1770             else
   1771             {
   1772                 /* if the Type of the NDEF TLV is not found, then return
   1773                     error saying no ndef TLV found*/
   1774                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1775                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1776                 break;
   1777 #if 0
   1778                 /* This change is added to continue the loop, if the Type of the
   1779                     NDEF TLV is not found
   1780                     16 bytes are read, so for each byte, there is a check for the
   1781                     Type (T) of the TLV, if T != 0x03, then increment the byte
   1782                     count and restart the loop, till the T = 0x03 is found or all
   1783                     the bytes in the card is completely read.
   1784                 */
   1785                 Temp16Bytes = (uint16_t)(Temp16Bytes + 1);
   1786                 NdefMap->MifareULContainer.RemainingSize -=
   1787                         PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1788                 if (NdefMap->MifareULContainer.RemainingSize ==
   1789                             PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1790                 {
   1791                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1792                                         NFCSTATUS_NO_NDEF_SUPPORT);
   1793                     break;
   1794                 }
   1795                 else
   1796                 {
   1797                     Result = NFCSTATUS_SUCCESS;
   1798                     Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1799                                                 Temp16Bytes);
   1800                     if(NFCSTATUS_PENDING == Result)
   1801                     {
   1802                         break;
   1803                     }
   1804                     continue;
   1805                 }
   1806 #endif /* #if 0 */
   1807             }
   1808 #endif /* #ifdef PH_HAL4_ENABLE */
   1809 
   1810             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1811                                                 Temp16Bytes);
   1812             if(Result != NFCSTATUS_SUCCESS)
   1813             {
   1814                 NdefMap->TLVStruct.TcheckedinTLVFlag =
   1815                                         PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1816                 NdefMap->TLVStruct.NoLbytesinTLV =
   1817                                         PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1818                 break;
   1819             }
   1820             Temp16Bytes++;
   1821             NdefMap->MifareULContainer.RemainingSize -=
   1822                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1823 
   1824             if(NdefMap->MifareULContainer.RemainingSize ==
   1825               PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1826             {
   1827                 Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1828                                     NFCSTATUS_NO_NDEF_SUPPORT));
   1829                 break;
   1830             }
   1831 
   1832             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1833                                                 Temp16Bytes);
   1834             if(Result != NFCSTATUS_SUCCESS)
   1835             {
   1836                 NdefMap->TLVStruct.TcheckedinTLVFlag =
   1837                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1838                 NdefMap->TLVStruct.NoLbytesinTLV =
   1839                                     PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1840                 break;
   1841             }
   1842 
   1843             /* If the value of the Length(L) in TLV is FF then enter else
   1844                 check for the card memory */
   1845             if((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1846                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
   1847                 ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1848                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
   1849                 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1850                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
   1851             {
   1852                 /* In the present case, the card space is not greater
   1853                     than 0xFF */
   1854                 /*
   1855                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1856                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1857 
   1858                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1859                 break;
   1860                 */
   1861 
   1862                 Temp16Bytes++;
   1863                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1864                                                     Temp16Bytes);
   1865                 if(Result != NFCSTATUS_SUCCESS)
   1866                 {
   1867                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1868                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1869                     NdefMap->TLVStruct.NoLbytesinTLV =
   1870                                             PH_FRINFC_NDEFMAP_MFUL_VAL2;
   1871 
   1872                     break;
   1873                 }
   1874 
   1875                 ShiftLength = (uint16_t) NdefMap->SendRecvBuf[Temp16Bytes];
   1876                 NdefMap->MifareULContainer.RemainingSize--;
   1877 
   1878                 Temp16Bytes++;
   1879                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1880                                                     Temp16Bytes);
   1881                 if(Result != NFCSTATUS_SUCCESS)
   1882                 {
   1883                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1884                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1885                     NdefMap->TLVStruct.NoLbytesinTLV =
   1886                                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1887                     NdefMap->TLVStruct.prevLenByteValue =
   1888                                     NdefMap->SendRecvBuf[Temp16Bytes - 1];
   1889                     break;
   1890                 }
   1891 
   1892 
   1893                 ShiftLength =
   1894                     (((uint16_t) (NdefMap->SendRecvBuf[Temp16Bytes])
   1895                         << PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   1896                         ShiftLength);
   1897 
   1898     //          NdefMap->MifareULContainer.RemainingSize--;
   1899 
   1900                 if(ShiftLength > (NdefMap->MifareULContainer.RemainingSize))
   1901                 {
   1902                     // Size in the Length(L) of TLV is greater
   1903                     //than the actual size of the card
   1904                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1905                                         NFCSTATUS_INVALID_PARAMETER);
   1906                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1907                     break;
   1908                 }
   1909 
   1910         //      NdefMap->MifareULContainer.RemainingSize--;
   1911                 /*
   1912                 NdefMap->TLVStruct.NdefTLVByte =
   1913                                     (NdefMap->SendRecvBuf[Temp16Bytes] %
   1914                                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
   1915 
   1916                 NdefMap->TLVStruct.NdefTLVBlock =
   1917                                 (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   1918                             + (Temp16Bytes/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1919                 */
   1920 
   1921                 NdefMap->TLVStruct.ActualSize =
   1922                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   1923 
   1924                 NdefMap->TLVStruct.NdefTLVFoundFlag = 1;
   1925 
   1926                 NdefMap->TLVStruct.NdefTLVSector = NdefMap->MifareULContainer.CurrentSector;
   1927 
   1928 
   1929                 Result = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   1930                                     PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1931                                     phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   1932                                     Result);
   1933 /*
   1934                 Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   1935                                                     NdefMap->TLVStruct.NdefTLVBlock);
   1936 */
   1937                 break;
   1938             }
   1939             else
   1940             {
   1941                 NdefMap->TLVStruct.BytesRemainLinTLV =
   1942                                 NdefMap->SendRecvBuf[Temp16Bytes];
   1943 
   1944                 NdefMap->TLVStruct.ActualSize =
   1945                                 NdefMap->SendRecvBuf[Temp16Bytes];
   1946 
   1947                 if((NdefMap->MifareULContainer.RemainingSize <
   1948                     NdefMap->SendRecvBuf[Temp16Bytes]) ||
   1949                     (NdefMap->MifareULContainer.RemainingSize <
   1950                     PH_FRINFC_NDEFMAP_MFUL_VAL2) ||
   1951                     (NdefMap->TLVStruct.BytesRemainLinTLV >
   1952                     (NdefMap->MifareULContainer.RemainingSize)) ||
   1953                     ((NdefMap->TLVStruct.BytesRemainLinTLV ==
   1954                     PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
   1955                     (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)))
   1956                 {
   1957                     /* No NDEF TLV found */
   1958                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1959                                         NFCSTATUS_NO_NDEF_SUPPORT);
   1960                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1961                     break;
   1962                 }
   1963 
   1964                 if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1965                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1966                 {
   1967                     NdefMap->TLVStruct.NdefTLVByte =
   1968                                     (((Temp16Bytes + PH_FRINFC_NDEFMAP_MFUL_VAL1 +
   1969                                     NdefMap->SendRecvBuf[Temp16Bytes]) %
   1970                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1971                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1972                     NdefMap->TLVStruct.NdefTLVBlock =
   1973                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   1974                                     + ((Temp16Bytes +
   1975                                     NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
   1976                                     PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1977 
   1978                     TemLength = (Temp16Bytes +
   1979                             NdefMap->SendRecvBuf[Temp16Bytes]);
   1980 
   1981                     NdefMap->MifareULContainer.RemainingSize =
   1982                                     (NdefMap->MifareULContainer.RemainingSize -
   1983                                     (NdefMap->SendRecvBuf[Temp16Bytes]
   1984                                     + PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1985 
   1986                     /* If the Length (L) in TLV < 16 bytes */
   1987                     Temp16Bytes = ((TemLength >=
   1988                             PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1989                             PH_FRINFC_NDEFMAP_MFUL_VAL0:
   1990                             (TemLength +
   1991                             PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1992 
   1993                     Result = ((TemLength >=
   1994                             PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1995                             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   1996                                         NdefMap->TLVStruct.NdefTLVBlock):
   1997                             NFCSTATUS_SUCCESS);
   1998 
   1999                     if(TemLength >= PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
   2000                     {
   2001                         break;
   2002                     }
   2003                     TemLength = Temp16Bytes;
   2004                 }
   2005             }
   2006             if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
   2007                         PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   2008             {
   2009 #if 0
   2010                 NdefMap->TLVStruct.NdefTLVBlock =
   2011                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   2012                                     + ((Temp16Bytes + 1)/
   2013                                     PH_FRINFC_NDEFMAP_MFUL_VAL4)) - 1;
   2014 #endif
   2015                 NdefMap->MifareULContainer.RemainingSize =
   2016                                     (NdefMap->MifareULContainer.RemainingSize -
   2017                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2018                     ShiftLength = NdefMap->SendRecvBuf[Temp16Bytes];
   2019                     Result = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   2020                             PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2021                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   2022                             Result);
   2023 
   2024                 break;
   2025             }
   2026         }
   2027         }
   2028     }
   2029 
   2030     return Result;
   2031 }
   2032 
   2033 
   2034 static NFCSTATUS phFriNfc_MfUL_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
   2035                                             uint16_t             TempLength)
   2036 {
   2037     uint16_t localCurrentBlock;
   2038 
   2039     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2040     if(TempLength == PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
   2041     {
   2042         localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock +
   2043                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
   2044 
   2045         if (localCurrentBlock < 256)
   2046         {
   2047             NdefMap->MifareULContainer.CurrentBlock +=
   2048                                 PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
   2049 
   2050             Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2051                             NdefMap->MifareULContainer.CurrentBlock);
   2052         }
   2053         else
   2054         {
   2055             /* Go to next sector */
   2056             NdefMap->MifareULContainer.CurrentSector++;
   2057 
   2058             Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2059                 NdefMap->MifareULContainer.CurrentSector, 1,
   2060                 PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1);
   2061         }
   2062     }
   2063 
   2064     return Result;
   2065 }
   2066 
   2067 
   2068 static void phFriNfc_MfUL_H_UpdateCrc( uint8_t ch,
   2069                                           uint16_t *lpwCrc )
   2070 {
   2071     ch = (ch^(uint8_t)((*lpwCrc) & 0x00FF));
   2072     ch = (ch^(ch<<4));
   2073     *lpwCrc = (*lpwCrc >> 8)^((uint16_t)ch << 8)^ \
   2074                 ((uint16_t)ch<<3)^((uint16_t)ch>>4);
   2075 
   2076     return;
   2077 }
   2078 
   2079 static void phFriNfc_MfUL_H_ComputeCrc( int      CRCType,
   2080                                  uint8_t  *Data,
   2081                                  int      Length,
   2082                                  uint8_t  *TransmitFirst,
   2083                                  uint8_t  *TransmitSecond
   2084                                  )
   2085 {
   2086     uint8_t chBlock;
   2087     uint16_t wCrc;
   2088     switch(CRCType)
   2089     {
   2090     case CRC_A:
   2091         wCrc = 0x6363; /* ITU-V.41 */
   2092         break;
   2093     case CRC_B:
   2094         wCrc = 0xFFFF; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
   2095         break;
   2096     default:
   2097         return;
   2098     }
   2099 
   2100     do
   2101     {
   2102         chBlock = *Data++;
   2103         phFriNfc_MfUL_H_UpdateCrc(chBlock, &wCrc);
   2104     } while (--Length);
   2105     *TransmitFirst = (uint8_t) (wCrc & 0xFF);
   2106     *TransmitSecond = (uint8_t) ((wCrc >> 8) & 0xFF);
   2107     return;
   2108 }
   2109 
   2110 
   2111 
   2112 static NFCSTATUS  phFriNfc_MfUL_H_SelectSector(phFriNfc_NdefMap_t  *NdefMap,
   2113                                                    uint8_t              SectorNo,
   2114                                                    uint8_t              CmdNo,
   2115                                                    uint8_t              NextState)
   2116 {
   2117 
   2118     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2119 
   2120     /* set the data for additional data exchange */
   2121     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2122     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2123     NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2124 
   2125     NdefMap->State = NextState;
   2126 
   2127     if (CmdNo == 1)
   2128     {
   2129         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = 0x00;
   2130         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2131         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = 0xC2;
   2132         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL3] = 0xFF;
   2133         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL4;
   2134     }
   2135     else
   2136     {
   2137         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = 0x00;
   2138         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2139         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = SectorNo;
   2140         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL3] = 0;
   2141         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL4] = 0;
   2142         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL5] = 0;
   2143         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL5 + 1;
   2144     }
   2145 
   2146     /* Calculate CRC */
   2147 
   2148     phFriNfc_MfUL_H_ComputeCrc(CRC_A, &NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2],
   2149             NdefMap->SendLength - 2,
   2150             &NdefMap->SendRecvBuf[NdefMap->SendLength],
   2151             &NdefMap->SendRecvBuf[NdefMap->SendLength + 1]);
   2152 
   2153     NdefMap->SendLength += PH_FRINFC_NDEFMAP_MFUL_VAL2;
   2154 
   2155 
   2156     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   2157 
   2158     NdefMap->Cmd.MfCmd = phHal_eMifareRaw;
   2159 
   2160     /* Call the overlapped HAL Transceive function */
   2161     Result = phFriNfc_OvrHal_Transceive(     NdefMap->LowerDevice,
   2162                                              &NdefMap->MapCompletionInfo,
   2163                                              NdefMap->psRemoteDevInfo,
   2164                                              NdefMap->Cmd,
   2165                                              &NdefMap->psDepAdditionalInfo,
   2166                                              NdefMap->SendRecvBuf,
   2167                                              NdefMap->SendLength,
   2168                                              NdefMap->SendRecvBuf,
   2169                                              NdefMap->SendRecvLength);
   2170      return Result;
   2171 }
   2172 
   2173 
   2174 static NFCSTATUS   phFriNfc_MfUL_H_RdCardfindNdefTLV( phFriNfc_NdefMap_t  *NdefMap,
   2175                                                    uint8_t              BlockNo)
   2176 {
   2177     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2178     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP;
   2179     /* set the data for additional data exchange */
   2180     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2181     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2182     NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2183     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   2184                                                     BlockNo;
   2185     NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL1;
   2186     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   2187 
   2188     /*
   2189      * Changed
   2190      * Description: phHal_eMifareCmdListMifareRead replace with phHal_eMifareRead
   2191      */
   2192     NdefMap->Cmd.MfCmd = phHal_eMifareRead;
   2193 
   2194     /* Call the overlapped HAL Transceive function */
   2195     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   2196                                             &NdefMap->MapCompletionInfo,
   2197                                             NdefMap->psRemoteDevInfo,
   2198                                             NdefMap->Cmd,
   2199                                             &NdefMap->psDepAdditionalInfo,
   2200                                             NdefMap->SendRecvBuf,
   2201                                             NdefMap->SendLength,
   2202                                             NdefMap->SendRecvBuf,
   2203                                             NdefMap->SendRecvLength);
   2204     return Result;
   2205 }
   2206 
   2207 static NFCSTATUS phFriNfc_MfUL_H_ChkRemainTLV(phFriNfc_NdefMap_t  *NdefMap,
   2208                                               uint8_t             *CRFlag)
   2209 {
   2210     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2211     uint16_t    TempLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   2212                 ShiftLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2213 
   2214     switch(NdefMap->TLVStruct.NoLbytesinTLV)
   2215     {
   2216         case PH_FRINFC_NDEFMAP_MFUL_VAL1:
   2217         case PH_FRINFC_NDEFMAP_MFUL_VAL2:
   2218             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   2219                             PH_FRINFC_NDEFMAP_MFUL_VAL1)?
   2220                             NdefMap->TLVStruct.prevLenByteValue:
   2221                             NdefMap->SendRecvBuf[TempLength]);
   2222             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   2223                             PH_FRINFC_NDEFMAP_MFUL_VAL1)?
   2224                             (((uint16_t)(NdefMap->SendRecvBuf[TempLength]) <<
   2225                             PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   2226                             ShiftLength):
   2227                             (((uint16_t)(NdefMap->SendRecvBuf[(TempLength +
   2228                             PH_FRINFC_NDEFMAP_MFUL_VAL1)]) <<
   2229                             PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   2230                             ShiftLength));
   2231 
   2232             NdefMap->MifareULContainer.RemainingSize -=
   2233                                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
   2234 
   2235             NdefMap->TLVStruct.ActualSize =
   2236             NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   2237 
   2238             /* Check for remaining free space in the card with the
   2239                 length (L) of TLV OR length(L) of TLV is less than
   2240                 255 bytes (The length (L) of TLV for 3 byte should not
   2241                 be less than 255) */
   2242             Result = ((((NdefMap->MifareULContainer.RemainingSize)<=
   2243                         ShiftLength) || (ShiftLength <
   2244                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF))?
   2245                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2246                         NFCSTATUS_INVALID_PARAMETER)):
   2247                         Result);
   2248 
   2249 
   2250             Result = ((Result == NFCSTATUS_SUCCESS)?
   2251                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   2252                             Result);
   2253 
   2254             *CRFlag = (uint8_t)((Result == (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2255                         NFCSTATUS_INVALID_PARAMETER)))?
   2256                         PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2257                         PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2258 
   2259 
   2260             if(Result == NFCSTATUS_SUCCESS)
   2261             {
   2262 
   2263                 NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-
   2264                     NdefMap->TLVStruct.NoLbytesinTLV;
   2265 /*
   2266                 NdefMap->TLVStruct.NdefTLVByte = ((ShiftLength%
   2267                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   2268                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2269 
   2270                 NdefMap->TLVStruct.NdefTLVBlock =
   2271                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   2272                         + (ShiftLength/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   2273                 NdefMap->MifareULContainer.CurrentBlock =
   2274                                 NdefMap->TLVStruct.NdefTLVBlock;
   2275 
   2276                 Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2277                                                 NdefMap->TLVStruct.NdefTLVBlock);
   2278                                                 */
   2279             }
   2280             break;
   2281 
   2282         default:
   2283             if((NdefMap->SendRecvBuf[TempLength] ==
   2284                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
   2285                 ((NdefMap->SendRecvBuf[TempLength] ==
   2286                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
   2287                 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   2288                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
   2289             {
   2290                 /* In the present case, the card space is not greater
   2291                     than 0xFF */
   2292 /*
   2293                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2294                                     NFCSTATUS_NO_NDEF_SUPPORT);
   2295 
   2296                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2297 
   2298 */
   2299 
   2300                 ShiftLength = NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_NDEFMAP_MFUL_VAL1)];
   2301                 ShiftLength = (((uint16_t)(NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_NDEFMAP_MFUL_VAL2)])
   2302                                 << PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   2303                                 ShiftLength);
   2304                 Result = ((ShiftLength > (NdefMap->MifareULContainer.RemainingSize))?
   2305                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2306                             NFCSTATUS_INVALID_PARAMETER)):
   2307                             Result);
   2308 
   2309 
   2310                 Result = ((Result == NFCSTATUS_SUCCESS)?
   2311                                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   2312                                             Result);
   2313 
   2314                 NdefMap->TLVStruct.ActualSize =
   2315                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   2316 
   2317                 if(Result == NFCSTATUS_SUCCESS)
   2318                 {
   2319 
   2320                     NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-
   2321                     NdefMap->TLVStruct.NoLbytesinTLV;
   2322 /*
   2323                     NdefMap->TLVStruct.NdefTLVByte = ((ShiftLength%
   2324                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   2325                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2326 
   2327                     NdefMap->TLVStruct.NdefTLVBlock =
   2328                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   2329                         + (ShiftLength/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   2330 
   2331                     NdefMap->MifareULContainer.CurrentBlock =
   2332                                 NdefMap->TLVStruct.NdefTLVBlock;
   2333 
   2334                     Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2335                                                         NdefMap->TLVStruct.NdefTLVBlock);
   2336 */
   2337                 }
   2338             }
   2339             else
   2340             {
   2341                 /* length (L) value in TLV shall not be greater than
   2342                     remaining free space in the card */
   2343                 Result = ((NdefMap->SendRecvBuf[TempLength] >
   2344                     NdefMap->MifareULContainer.RemainingSize)?
   2345                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2346                         NFCSTATUS_INVALID_PARAMETER)):
   2347                         Result);
   2348 
   2349                 NdefMap->TLVStruct.ActualSize =
   2350                 NdefMap->TLVStruct.BytesRemainLinTLV =
   2351                                 NdefMap->SendRecvBuf[TempLength];
   2352                 NdefMap->MifareULContainer.RemainingSize--;
   2353 
   2354                 if((Result == NFCSTATUS_SUCCESS) &&
   2355                     (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   2356                     PH_FRINFC_NDEFMAP_MFUL_FLAG1))
   2357                 {
   2358                     phFriNfc_MfUL_H_UpdateLen(NdefMap,
   2359                                 (uint16_t)NdefMap->SendRecvBuf[TempLength]);
   2360 
   2361                     NdefMap->MifareULContainer.CurrentBlock =
   2362                                         NdefMap->TLVStruct.NdefTLVBlock;
   2363                     TempLength=TempLength+(NdefMap->SendRecvBuf[TempLength]);
   2364                     Result =((TempLength < PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   2365                             phFriNfc_MfUL_H_findNDEFTLV(NdefMap, CRFlag):
   2366                             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2367                                     NdefMap->TLVStruct.NdefTLVBlock));
   2368                 }
   2369             }
   2370             break;
   2371     }
   2372     NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2373 
   2374     Result = phFriNfc_MapTool_SetCardState(  NdefMap, NdefMap->TLVStruct.ActualSize);
   2375 
   2376     return Result;
   2377 }
   2378 
   2379 static void phFriNfc_MfUL_H_UpdateLen(phFriNfc_NdefMap_t        *NdefMap,
   2380                                       uint16_t                  DataLen)
   2381 {
   2382     NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-DataLen;
   2383     NdefMap->TLVStruct.NdefTLVByte = ((DataLen %
   2384                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   2385                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2386     NdefMap->TLVStruct.NdefTLVBlock =
   2387                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   2388                         + (DataLen/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   2389 }
   2390 
   2391  static NFCSTATUS phFriNfc_MfUL_H_NxtOp(phFriNfc_NdefMap_t       *NdefMap,
   2392                                        uint8_t                  *CRFlag)
   2393 {
   2394     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2395 
   2396     switch(NdefMap->PrevOperation)
   2397     {
   2398         case PH_FRINFC_NDEFMAP_CHECK_OPE:
   2399             *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2400             break;
   2401 
   2402         case PH_FRINFC_NDEFMAP_READ_OPE:
   2403             if (NdefMap->TLVStruct.NdefTLVSector == 1)
   2404             {
   2405                 /* Goto sector 1 */
   2406                 NdefMap->MifareULContainer.CurrentSector = 1;
   2407                 NdefMap->MifareULContainer.CurrentBlock = 0;
   2408 
   2409                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2410                         NdefMap->MifareULContainer.CurrentSector, 1,
   2411                         PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1);
   2412             }
   2413             else
   2414             {
   2415                 NdefMap->MifareULContainer.CurrentBlock = (NdefMap->TLVStruct.NdefTLVBlock / 4) * 4;
   2416                 Result = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
   2417             }
   2418 #if 0
   2419             NdefMap->MifareULContainer.CurrentBlock =
   2420                 PH_FRINFC_NDEFMAP_MFUL_VAL4;
   2421 
   2422              Result = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
   2423 #endif
   2424 
   2425 
   2426             *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
   2427                         PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2428                         PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2429             break;
   2430 
   2431         case PH_FRINFC_NDEFMAP_WRITE_OPE:
   2432             break;
   2433 
   2434         default:
   2435             break;
   2436     }
   2437     return Result;
   2438 }
   2439 
   2440 
   2441 
   2442 static NFCSTATUS phFriNfc_MfUL_H_CopyRdBytes(phFriNfc_NdefMap_t  *NdefMap)
   2443 {
   2444     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   2445     uint16_t localCurrentBlock;
   2446 
   2447     (void)memcpy(&(NdefMap->MifareULContainer.ReadBuf[
   2448                 NdefMap->MifareULContainer.ReadBufIndex]),
   2449                 NdefMap->SendRecvBuf,
   2450                 *NdefMap->SendRecvLength);
   2451     NdefMap->MifareULContainer.ReadBufIndex=NdefMap->MifareULContainer.ReadBufIndex +*NdefMap->SendRecvLength;
   2452 
   2453     localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock+
   2454                             (uint8_t)((NdefMap->MifareULContainer.ReadBufIndex !=
   2455                             NdefMap->CardMemSize)?
   2456                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4:
   2457                             PH_FRINFC_NDEFMAP_MFUL_VAL0);
   2458     if (localCurrentBlock < 256)
   2459     {
   2460         NdefMap->MifareULContainer.CurrentBlock =  NdefMap->MifareULContainer.CurrentBlock+
   2461                             (uint8_t)((NdefMap->MifareULContainer.ReadBufIndex !=
   2462                             NdefMap->CardMemSize)?
   2463                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4:
   2464                             PH_FRINFC_NDEFMAP_MFUL_VAL0);
   2465     }
   2466     else
   2467     {
   2468         /* Go to next sector */
   2469         if (NdefMap->MifareULContainer.CurrentSector == 0)
   2470         {
   2471             NdefMap->MifareULContainer.CurrentSector++;
   2472             NdefMap->MifareULContainer.CurrentBlock = 0xff;
   2473 
   2474             Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2475                     NdefMap->MifareULContainer.CurrentSector, 1,
   2476                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1);
   2477         }
   2478     }
   2479 
   2480     return Result;
   2481 }
   2482 
   2483 static NFCSTATUS phFriNfc_MfUL_H_CpDataToUserBuf(phFriNfc_NdefMap_t *NdefMap)
   2484 {
   2485     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2486 
   2487     /* Check the user buffer size with the
   2488     L value of TLV */
   2489     if(NdefMap->ApduBufferSize >=
   2490         NdefMap->TLVStruct.BytesRemainLinTLV)
   2491     {
   2492         (void)memcpy(NdefMap->ApduBuffer,
   2493             &(NdefMap->MifareULContainer.ReadBuf[
   2494             NdefMap->MifareULContainer.ByteNumber]),
   2495             NdefMap->TLVStruct.BytesRemainLinTLV);
   2496 
   2497         *(NdefMap->NumOfBytesRead) =
   2498                     NdefMap->TLVStruct.BytesRemainLinTLV;
   2499         NdefMap->MifareULContainer.ByteNumber =
   2500                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2501         NdefMap->MifareULContainer.ReadWriteCompleteFlag =
   2502                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2503         NdefMap->MifareULContainer.RemainingSize =  NdefMap->MifareULContainer.RemainingSize-
   2504                                                     NdefMap->TLVStruct.BytesRemainLinTLV;
   2505         NdefMap->TLVStruct.BytesRemainLinTLV =
   2506                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2507     }
   2508     else
   2509     {
   2510         (void)memcpy(NdefMap->ApduBuffer,
   2511             &(NdefMap->MifareULContainer.ReadBuf[
   2512             NdefMap->MifareULContainer.ByteNumber]),
   2513             NdefMap->ApduBufferSize);
   2514 
   2515         *(NdefMap->NumOfBytesRead) =
   2516                     NdefMap->ApduBufferSize;
   2517         NdefMap->MifareULContainer.ByteNumber = NdefMap->MifareULContainer.ByteNumber+
   2518                                                 (uint16_t)NdefMap->ApduBufferSize;
   2519         NdefMap->MifareULContainer.RemainingSize=NdefMap->MifareULContainer.RemainingSize-
   2520                                                      (uint16_t)NdefMap->ApduBufferSize;
   2521         NdefMap->TLVStruct.BytesRemainLinTLV =  NdefMap->TLVStruct.BytesRemainLinTLV-
   2522                     (uint16_t)NdefMap->ApduBufferSize;
   2523     }
   2524     return Result;
   2525 }
   2526 
   2527 static NFCSTATUS phFriNfc_MfUL_H_RdBeforeWrite(phFriNfc_NdefMap_t       *NdefMap)
   2528 {
   2529     uint16_t localCurrentBlock = NdefMap->TLVStruct.NdefTLVBlock;
   2530 
   2531     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2532     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   2533                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2534     /*            BytesToWrite = PH_FRINFC_NDEFMAP_MFUL_VAL0;*/
   2535     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2536 
   2537     switch((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1))
   2538     {
   2539         case PH_FRINFC_NDEFMAP_MFUL_VAL0:
   2540             /* go the NDEF TLV block to start write */
   2541             NdefMap->MifareULContainer.CurrentBlock =
   2542                 NdefMap->TLVStruct.NdefTLVBlock;
   2543             /* fill send buffer for write */
   2544             NdefMap->SendRecvBuf[index] =
   2545                                 NdefMap->MifareULContainer.CurrentBlock;
   2546             index++;
   2547             NdefMap->SendRecvBuf[index] =
   2548                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T;
   2549             index++;
   2550             if (NdefMap->ApduBufferSize > 254)
   2551             {
   2552                 NdefMap->SendRecvBuf[index] = 0xFF;
   2553                 index++;
   2554                 NdefMap->SendRecvBuf[index] =
   2555                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2556                 index++;
   2557                 NdefMap->SendRecvBuf[index] =
   2558                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2559                 index++;
   2560             }
   2561             else
   2562             {
   2563                 NdefMap->SendRecvBuf[index] =
   2564                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2565                 index++;
   2566             }
   2567 
   2568 
   2569             break;
   2570 
   2571         case PH_FRINFC_NDEFMAP_MFUL_VAL1:
   2572         case PH_FRINFC_NDEFMAP_MFUL_VAL2:
   2573             /* read to get the previous bytes */
   2574             Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2575                             NdefMap->TLVStruct.NdefTLVBlock);
   2576             break;
   2577 
   2578         case PH_FRINFC_NDEFMAP_MFUL_VAL3:
   2579 
   2580             localCurrentBlock = (NdefMap->MifareULContainer.CurrentBlock +
   2581                                 PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2582 
   2583             if (localCurrentBlock < 256)
   2584             {
   2585 
   2586                 NdefMap->MifareULContainer.CurrentBlock =
   2587                             (NdefMap->MifareULContainer.CurrentBlock +
   2588                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2589                 NdefMap->SendRecvBuf[index] =
   2590                                     NdefMap->MifareULContainer.CurrentBlock;
   2591                 index++;
   2592 
   2593                 if (NdefMap->ApduBufferSize > 254)
   2594                 {
   2595                     NdefMap->SendRecvBuf[index] = 0xFF;
   2596                     index++;
   2597                     NdefMap->SendRecvBuf[index] =
   2598                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2599                     index++;
   2600                     NdefMap->SendRecvBuf[index] =
   2601                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2602                     index++;
   2603                 }
   2604                 else
   2605                 {
   2606                     NdefMap->SendRecvBuf[index] =
   2607                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2608                     index++;
   2609                 }
   2610             }
   2611             else
   2612             {
   2613                 /* Go to next sector */
   2614                 NdefMap->MifareULContainer.CurrentSector++;
   2615 
   2616                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2617                     NdefMap->MifareULContainer.CurrentSector, 1,
   2618                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1);
   2619             }
   2620             break;
   2621 
   2622         default:
   2623             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2624                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   2625             break;
   2626     }
   2627 
   2628     if((((NdefMap->TLVStruct.NdefTLVByte -
   2629         PH_FRINFC_NDEFMAP_MFUL_VAL1) == PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
   2630         ((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1)
   2631         == PH_FRINFC_NDEFMAP_MFUL_VAL3)) && localCurrentBlock < 256)
   2632     {
   2633         /* Length to know how many bytes has to be written to the card */
   2634         TemLength = (((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
   2635                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2636                         PH_FRINFC_NDEFMAP_MFUL_VAL2:
   2637                         PH_FRINFC_NDEFMAP_MFUL_VAL3);
   2638 
   2639         if (NdefMap->ApduBufferSize > 254)
   2640         {
   2641             TemLength -= 2;
   2642         }
   2643 
   2644         if(NdefMap->ApduBufferSize >= TemLength)
   2645         {
   2646             /* Prepare the receive buffer */
   2647             (void)memcpy(&(NdefMap->SendRecvBuf[
   2648                             index]),
   2649                             &(NdefMap->ApduBuffer[
   2650                             NdefMap->ApduBuffIndex]),
   2651                             TemLength);
   2652 
   2653             /* Number of bytes written to the card from user buffer */
   2654             NdefMap->NumOfBytesWritten = TemLength;
   2655 
   2656             index = index+(uint8_t)TemLength;
   2657             /* Exact number of bytes written in the card including TLV */
   2658             if (index >= 1)
   2659             {
   2660                 *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2661             }
   2662             else
   2663             {
   2664                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2665                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   2666             }
   2667         }
   2668         else
   2669         {
   2670             /* Prepare the receive buffer */
   2671             (void)memcpy(&(NdefMap->SendRecvBuf[
   2672                             index]),
   2673                             &(NdefMap->ApduBuffer[
   2674                             NdefMap->ApduBuffIndex]),
   2675                             (uint16_t)NdefMap->ApduBufferSize);
   2676 
   2677             /* Number of bytes written to the card from user buffer */
   2678             NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
   2679 
   2680             index= index +(uint8_t)NdefMap->ApduBufferSize;
   2681             /* Exact number of bytes written in the card including TLV */
   2682             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2683 
   2684             for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK; i++)
   2685             {
   2686                 NdefMap->SendRecvBuf[i] = (uint8_t)((i == index)?
   2687                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
   2688                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
   2689                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2690             }
   2691         }
   2692 
   2693         /* store the bytes in buffer till the bytes are
   2694             written in a block */
   2695         (void)memcpy(NdefMap->MifareULContainer.Buffer,
   2696                         &(NdefMap->SendRecvBuf[
   2697                         PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2698                         (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   2699                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   2700 
   2701         (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   2702                     NdefMap->MifareULContainer.Buffer,
   2703                     (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   2704                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   2705 
   2706         /* Change the state to check ndef compliancy */
   2707         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   2708 
   2709         Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   2710     }
   2711     return Result;
   2712 }
   2713 
   2714 static NFCSTATUS phFriNfc_MfUL_H_CallWrOp(phFriNfc_NdefMap_t        *NdefMap)
   2715 {
   2716     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2717    /* uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL1;*/
   2718 
   2719 
   2720     NdefMap->MifareULContainer.CurrentBlock =
   2721                         NdefMap->TLVStruct.NdefTLVBlock;
   2722 
   2723     (void)memcpy(&(NdefMap->SendRecvBuf[
   2724                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2725                 NdefMap->SendRecvBuf,
   2726                 PH_FRINFC_NDEFMAP_MFUL_VAL4);
   2727 
   2728     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   2729                             NdefMap->MifareULContainer.CurrentBlock;
   2730 
   2731     if (NdefMap->ApduBufferSize > 254)
   2732     {
   2733          NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
   2734                             PH_FRINFC_NDEFMAP_MFUL_VAL1)] = 0xFF;
   2735 
   2736 
   2737         if((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_NDEFMAP_MFUL_VAL1) <
   2738             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   2739         {
   2740             NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
   2741                             PH_FRINFC_NDEFMAP_MFUL_VAL2 )] = 0x00;
   2742 
   2743             NdefMap->NumOfLReminWrite = 1;
   2744 
   2745         }
   2746         else
   2747         {
   2748             NdefMap->NumOfLReminWrite = 2;
   2749         }
   2750         NdefMap->NumOfBytesWritten = 0;
   2751     }
   2752     else
   2753     {
   2754         /* Write the length value = 0 */
   2755         NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
   2756                                 PH_FRINFC_NDEFMAP_MFUL_VAL1)] =
   2757                                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2758 
   2759         if((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_NDEFMAP_MFUL_VAL1) <
   2760             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   2761         {
   2762             /* Only one byte  */
   2763             (void)memcpy(&(NdefMap->SendRecvBuf[
   2764                     PH_FRINFC_NDEFMAP_MFUL_VAL4]),
   2765                     &(NdefMap->ApduBuffer[
   2766                     NdefMap->ApduBuffIndex]),
   2767                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2768             /* Number of bytes written to the card from user buffer */
   2769             NdefMap->NumOfBytesWritten = PH_FRINFC_NDEFMAP_MFUL_VAL1;
   2770         }
   2771     }
   2772 
   2773     (void)memcpy(NdefMap->MifareULContainer.Buffer,
   2774                 &(NdefMap->SendRecvBuf[
   2775                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2776                 PH_FRINFC_NDEFMAP_MFUL_VAL4);
   2777 
   2778     /* Copy the Ndef TLV buffer to send buffer */
   2779     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   2780                 NdefMap->MifareULContainer.Buffer,
   2781                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   2782 
   2783     /* Exact number of bytes written in the card including TLV */
   2784     *NdefMap->DataCount = PH_FRINFC_NDEFMAP_MFUL_VAL4;
   2785 
   2786     /* Change the state to check ndef compliancy */
   2787     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   2788 
   2789     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   2790 
   2791     return Result;
   2792 }
   2793 
   2794 static NFCSTATUS phFriNfc_MfUL_H_ProWrittenBytes(phFriNfc_NdefMap_t *NdefMap)
   2795 {
   2796     uint16_t localCurrentBlock;
   2797     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2798                         NFCSTATUS_INVALID_REMOTE_DEVICE);
   2799 
   2800     if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)
   2801     {
   2802         NdefMap->ApduBuffIndex =  NdefMap->ApduBuffIndex+NdefMap->NumOfBytesWritten;
   2803         if(*NdefMap->DataCount <
   2804             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   2805         {
   2806             (void)memcpy(NdefMap->MifareULContainer.InternalBuf,
   2807                         NdefMap->MifareULContainer.Buffer,
   2808                         *NdefMap->DataCount);
   2809 
   2810             NdefMap->MifareULContainer.InternalLength = *NdefMap->DataCount;
   2811         }
   2812         else
   2813         {
   2814             NdefMap->MifareULContainer.InternalLength =
   2815                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2816         }
   2817 
   2818         NdefMap->MifareULContainer.RemainingSize=  NdefMap->MifareULContainer.RemainingSize-
   2819                                             NdefMap->NumOfBytesWritten;
   2820         if((NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize) ||
   2821             (NdefMap->MifareULContainer.RemainingSize ==
   2822             PH_FRINFC_NDEFMAP_MFUL_VAL0))
   2823         {
   2824             Result = NFCSTATUS_SUCCESS;
   2825             NdefMap->MifareULContainer.ReadWriteCompleteFlag =
   2826                 (uint8_t)((NdefMap->MifareULContainer.RemainingSize ==
   2827                 PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2828                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2829                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2830 
   2831                 NdefMap->TLVStruct.SetTermTLVFlag =
   2832                 (uint8_t)(((NdefMap->MifareULContainer.RemainingSize ==
   2833                 PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
   2834                 (NdefMap->TLVStruct.SetTermTLVFlag ==
   2835                 PH_FRINFC_NDEFMAP_MFUL_FLAG1))?
   2836                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2837                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2838 
   2839                 NdefMap->MifareULContainer.CurrentBlock = NdefMap->MifareULContainer.CurrentBlock+
   2840                     (uint8_t)((NdefMap->MifareULContainer.InternalLength !=
   2841                     PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2842                     PH_FRINFC_NDEFMAP_MFUL_VAL0:
   2843                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2844 
   2845             *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
   2846         }
   2847         else
   2848         {
   2849             localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock + 1;
   2850             if (localCurrentBlock < 256)
   2851             {
   2852                 NdefMap->MifareULContainer.CurrentBlock++;
   2853                 Result = phFriNfc_MfUL_H_fillSendBufToWr(NdefMap);
   2854             }
   2855             else
   2856             {
   2857                 /* Go to next sector */
   2858                 NdefMap->MifareULContainer.CurrentSector++;
   2859 
   2860                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2861                     NdefMap->MifareULContainer.CurrentSector, 1,
   2862                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1);
   2863             }
   2864         }
   2865     }
   2866 
   2867     if((Result == NFCSTATUS_SUCCESS) &&
   2868         (NdefMap->TLVStruct.SetTermTLVFlag !=
   2869         PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
   2870         (NdefMap->MifareULContainer.RemainingSize >
   2871         PH_FRINFC_NDEFMAP_MFUL_VAL0))
   2872     {
   2873         Result = phFriNfc_MfUL_H_WrTermTLV(NdefMap);
   2874     }
   2875     else
   2876     {
   2877         if((Result == NFCSTATUS_SUCCESS) &&
   2878             (NdefMap->TLVStruct.SetTermTLVFlag ==
   2879             PH_FRINFC_NDEFMAP_MFUL_FLAG1))
   2880         {
   2881             Result = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
   2882         }
   2883     }
   2884     return Result;
   2885 }
   2886 static NFCSTATUS phFriNfc_MfUL_H_fillSendBufToWr(phFriNfc_NdefMap_t *NdefMap)
   2887 {
   2888     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2889     uint16_t    RemainingBytes = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   2890                 BytesToWrite = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2891     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2892 
   2893     RemainingBytes = (uint16_t)(( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) <=
   2894                         NdefMap->MifareULContainer.RemainingSize)?
   2895                         (uint16_t)(NdefMap->ApduBufferSize -
   2896                         NdefMap->ApduBuffIndex):
   2897                         NdefMap->MifareULContainer.RemainingSize);
   2898 
   2899     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   2900                         NdefMap->MifareULContainer.CurrentBlock;
   2901 
   2902     /* Get the number of bytes that can be written after copying
   2903         the internal buffer */
   2904     BytesToWrite = ((RemainingBytes <
   2905                     (PH_FRINFC_NDEFMAP_MFUL_BYTE4 -
   2906                     NdefMap->MifareULContainer.InternalLength))?
   2907                     RemainingBytes:
   2908                     (PH_FRINFC_NDEFMAP_MFUL_BYTE4 -
   2909                     NdefMap->MifareULContainer.InternalLength));
   2910 
   2911     if (NdefMap->NumOfBytesWritten == 0 && NdefMap->NumOfLReminWrite > 0)
   2912     {
   2913         BytesToWrite = BytesToWrite - NdefMap->NumOfLReminWrite;
   2914 
   2915         if (NdefMap->NumOfLReminWrite == 1)
   2916         {
   2917             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2918         }
   2919         else
   2920         {
   2921             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2922             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = 0x00;
   2923         }
   2924     }
   2925 
   2926     if(NdefMap->MifareULContainer.InternalLength >
   2927         PH_FRINFC_NDEFMAP_MFUL_VAL0)
   2928     {
   2929         /* copy the internal buffer to the send buffer */
   2930         (void)memcpy(&(NdefMap->SendRecvBuf[
   2931                     PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2932                     NdefMap->MifareULContainer.InternalBuf,
   2933                     NdefMap->MifareULContainer.InternalLength);
   2934 
   2935     }
   2936 
   2937     /* Copy Bytes to write in the send buffer */
   2938     (void)memcpy(&(NdefMap->SendRecvBuf[
   2939                 (PH_FRINFC_NDEFMAP_MFUL_VAL1 +
   2940                 NdefMap->MifareULContainer.InternalLength) +
   2941                 NdefMap->NumOfLReminWrite]),
   2942                 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
   2943                 BytesToWrite);
   2944 
   2945     /* update number of bytes written from the user buffer */
   2946     NdefMap->NumOfBytesWritten = BytesToWrite;
   2947 
   2948     /* check the exact number of bytes written to a block including the
   2949         internal length */
   2950     *NdefMap->DataCount =
   2951             (BytesToWrite + NdefMap->MifareULContainer.InternalLength +
   2952                     NdefMap->NumOfLReminWrite);
   2953 
   2954 
   2955     /* if total bytes to write in the card is less than 4 bytes then
   2956     pad zeroes till 4 bytes */
   2957     if((BytesToWrite + NdefMap->MifareULContainer.InternalLength +
   2958         NdefMap->NumOfLReminWrite)
   2959             < PH_FRINFC_NDEFMAP_MFUL_BYTE4)
   2960     {
   2961         for(index = (uint8_t)((BytesToWrite + NdefMap->MifareULContainer.InternalLength + NdefMap->NumOfLReminWrite) +
   2962                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2963             index < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK;
   2964             index++)
   2965             {
   2966                 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
   2967                                     ((BytesToWrite +
   2968                                     NdefMap->MifareULContainer.InternalLength + NdefMap->NumOfLReminWrite) +
   2969                                     PH_FRINFC_NDEFMAP_MFUL_VAL1))?
   2970                                     PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
   2971                                     PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
   2972 
   2973                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2974             }
   2975     }
   2976 
   2977     /* A temporary buffer to hold four bytes of data that is
   2978         written to the card */
   2979     (void)memcpy(NdefMap->MifareULContainer.Buffer,
   2980                 &(NdefMap->SendRecvBuf[
   2981                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2982                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   2983 
   2984 
   2985 
   2986         if((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) <
   2987         PH_FRINFC_NDEFMAP_MFUL_VAL3)
   2988         {
   2989             if ((NdefMap->TLVStruct.NdefTLVSector ==
   2990                 NdefMap->MifareULContainer.CurrentSector))
   2991             {
   2992                 if(NdefMap->MifareULContainer.CurrentBlock ==
   2993                         NdefMap->TLVStruct.NdefTLVBlock)
   2994                 {
   2995                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   2996                         NdefMap->MifareULContainer.Buffer,
   2997                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   2998                 }
   2999             }
   3000 
   3001             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3002                 NdefMap->MifareULContainer.CurrentSector) ||
   3003                 (NdefMap->TLVStruct.NdefTLVBlock == 0xFF))
   3004             {
   3005                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3006                     (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL1))
   3007                 {
   3008                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer1,
   3009                     NdefMap->MifareULContainer.Buffer,
   3010                     PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3011                 }
   3012             }
   3013         }
   3014         else
   3015         {
   3016             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3017                 NdefMap->MifareULContainer.CurrentSector))
   3018             {
   3019                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3020                     (NdefMap->TLVStruct.NdefTLVBlock +
   3021                     PH_FRINFC_NDEFMAP_MFUL_VAL1))
   3022                 {
   3023                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   3024                                 NdefMap->MifareULContainer.Buffer,
   3025                                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3026                 }
   3027             }
   3028 
   3029             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3030                 NdefMap->MifareULContainer.CurrentSector)||
   3031                 (NdefMap->TLVStruct.NdefTLVBlock == 0xFF))
   3032             {
   3033                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3034                     (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL2))
   3035                 {
   3036                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer1,
   3037                                 NdefMap->MifareULContainer.Buffer,
   3038                                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3039                 }
   3040             }
   3041         }
   3042 
   3043 
   3044     /* Change the state to check ndef compliancy */
   3045     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   3046 
   3047     NdefMap->NumOfLReminWrite = 0;
   3048 
   3049     /* Start writing to the current block */
   3050     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   3051 
   3052     return Result;
   3053 }
   3054 static NFCSTATUS phFriNfc_MfUL_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
   3055 {
   3056     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3057     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   3058                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   3059 
   3060     /* Change the state to check ndef compliancy */
   3061     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV;
   3062 
   3063     NdefMap->SendRecvBuf[index] =
   3064                         (NdefMap->MifareULContainer.CurrentBlock +
   3065                         PH_FRINFC_NDEFMAP_MFUL_VAL0);
   3066     index++;
   3067     NdefMap->SendRecvBuf[index] = PH_FRINFC_NDEFMAP_MFUL_TERMTLV;
   3068     index++;
   3069 
   3070     for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_VAL4; i++)
   3071     {
   3072         NdefMap->SendRecvBuf[i] = PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
   3073     }
   3074 
   3075     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   3076     return Result;
   3077 }
   3078 
   3079 static NFCSTATUS phFriNfc_MfUL_H_UpdateWrLen(phFriNfc_NdefMap_t *NdefMap)
   3080 {
   3081     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3082     uint16_t    BlockNo = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   3083                 ByteNo = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   3084 
   3085     if ((NdefMap->TLVStruct.NdefTLVSector ==
   3086         NdefMap->MifareULContainer.CurrentSector) ||
   3087         ((NdefMap->TLVStruct.NdefTLVBlock == 0xFF) &&
   3088         (NdefMap->TLVStruct.NdefTLVByte == 4) &&
   3089         (NdefMap->TLVStruct.NdefTLVSector == 0)))
   3090     {
   3091         BlockNo = (((NdefMap->TLVStruct.NdefTLVByte -
   3092                     PH_FRINFC_NDEFMAP_MFUL_VAL1) !=
   3093                     PH_FRINFC_NDEFMAP_MFUL_VAL3)?
   3094                     NdefMap->TLVStruct.NdefTLVBlock:
   3095                     (NdefMap->TLVStruct.NdefTLVBlock +
   3096                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
   3097 
   3098         ByteNo = (((NdefMap->TLVStruct.NdefTLVByte -
   3099                     PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
   3100                     PH_FRINFC_NDEFMAP_MFUL_VAL3)?
   3101                     PH_FRINFC_NDEFMAP_MFUL_VAL1:
   3102                     (NdefMap->TLVStruct.NdefTLVByte +
   3103                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
   3104 
   3105         if (NdefMap->NumOfLReminWrite > 0)
   3106         {
   3107             BlockNo++;
   3108 
   3109             /* Copy the Ndef TLV buffer to send buffer */
   3110             (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3111                         NdefMap->TLVStruct.NdefTLVBuffer1,
   3112                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3113 
   3114             if (NdefMap->NumOfLReminWrite == 1)
   3115             {
   3116                 NdefMap->SendRecvBuf[1] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
   3117 
   3118             }
   3119             else if (NdefMap->NumOfLReminWrite == 2)
   3120             {
   3121                 NdefMap->SendRecvBuf[1]= (uint8_t) (NdefMap->ApduBuffIndex);
   3122                 NdefMap->SendRecvBuf[2] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
   3123             }
   3124             else
   3125             {
   3126 
   3127             }
   3128             NdefMap->NumOfLReminWrite = 0;
   3129         }
   3130         else
   3131         {
   3132             /* Copy the Ndef TLV buffer to send buffer */
   3133             (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3134                         NdefMap->TLVStruct.NdefTLVBuffer,
   3135                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3136 
   3137 
   3138             if (NdefMap->ApduBuffIndex > 254)
   3139             {
   3140                 ByteNo++;
   3141                 if  ((ByteNo == 3) || (ByteNo == 2))
   3142                 {
   3143                     NdefMap->SendRecvBuf[ByteNo]= (uint8_t) (NdefMap->ApduBuffIndex);
   3144                     ByteNo++;
   3145                     NdefMap->SendRecvBuf[ByteNo] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
   3146                     ByteNo++;
   3147                     NdefMap->NumOfLReminWrite = 0;
   3148                 }
   3149                 else if (ByteNo == 4)
   3150                 {
   3151                     NdefMap->SendRecvBuf[ByteNo]= (uint8_t) (NdefMap->ApduBuffIndex);
   3152                     ByteNo++;
   3153                     NdefMap->NumOfLReminWrite = 1;
   3154                 }
   3155                 else
   3156                 {
   3157                     NdefMap->NumOfLReminWrite = 2;
   3158                 }
   3159             }
   3160             else
   3161             {
   3162                 NdefMap->SendRecvBuf[ByteNo]=
   3163                                     (uint8_t)((NdefMap->Offset ==
   3164                                     PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
   3165                                     (uint8_t)NdefMap->ApduBuffIndex:
   3166                                     (NdefMap->ApduBuffIndex +
   3167                                     NdefMap->SendRecvBuf[ByteNo]));
   3168             }
   3169         }
   3170 
   3171         (void)memcpy(NdefMap->MifareULContainer.Buffer,
   3172                     &(NdefMap->SendRecvBuf[
   3173                     PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3174                     PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3175 
   3176         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = (uint8_t)BlockNo;
   3177         Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   3178 
   3179         if (NdefMap->NumOfLReminWrite == 0)
   3180         {
   3181             NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV;
   3182         }
   3183         else
   3184         {
   3185             NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV;
   3186         }
   3187     }
   3188     else if (NdefMap->TLVStruct.NdefTLVSector == 0)
   3189     {
   3190         /* Reset sector */
   3191         NdefMap->MifareULContainer.CurrentSector = 0;
   3192         NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   3193 
   3194         Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   3195                 NdefMap->MifareULContainer.CurrentSector, 1,
   3196                 PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
   3197 
   3198     }
   3199     else
   3200     {
   3201         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
   3202     }
   3203 
   3204 
   3205     return Result;
   3206 }
   3207 #ifdef UNIT_TEST
   3208 extern void phFriNfc_MifareUL_UnitTest(void *Context,uint32_t Length)
   3209 {
   3210         uint8_t value=10;
   3211         uint8_t* CrFlag=&value;
   3212         phFriNfc_NdefMap_t *pNdefMap=(phFriNfc_NdefMap_t*)Context;
   3213         phFriNfc_MfUL_H_UpdateLen(pNdefMap,(uint16_t) Length);
   3214         phFriNfc_MfUL_H_WrTermTLV(pNdefMap);
   3215         phFriNfc_MfUL_H_CallWrOp(pNdefMap);
   3216         phFriNfc_MfUL_H_UpdateWrLen(pNdefMap);
   3217         phFriNfc_MfUL_H_ChkRemainTLV(pNdefMap,CrFlag);
   3218         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
   3219 
   3220         pNdefMap->PrevOperation=PH_FRINFC_NDEFMAP_READ_OPE;
   3221         phFriNfc_MfUL_H_NxtOp(pNdefMap,CrFlag);
   3222 
   3223         pNdefMap->PrevOperation=PH_FRINFC_NDEFMAP_WRITE_OPE;
   3224         phFriNfc_MfUL_H_NxtOp(pNdefMap,CrFlag);
   3225 
   3226         pNdefMap->TLVStruct.NoLbytesinTLV=PH_FRINFC_NDEFMAP_MFUL_VAL1;
   3227         phFriNfc_MfUL_H_ChkRemainTLV(pNdefMap,CrFlag);
   3228 
   3229         pNdefMap->SendRecvBuf[0x00]= PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
   3230         phFriNfc_MfUL_H_findNDEFTLV(pNdefMap,CrFlag);
   3231 
   3232 
   3233         pNdefMap->SendRecvBuf[0x00]= PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
   3234         phFriNfc_MfUL_H_findNDEFTLV(pNdefMap,CrFlag);
   3235 
   3236 
   3237         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3238         pNdefMap->TLVStruct.NdefTLVByte=1;
   3239         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3240 
   3241         pNdefMap->TLVStruct.NdefTLVByte=3;
   3242         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3243 
   3244         pNdefMap->TLVStruct.NdefTLVByte=4;
   3245         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3246 
   3247 
   3248         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
   3249         phFriNfc_MifareUL_H_Complete(NULL,NFCSTATUS_SUCCESS);
   3250         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
   3251         pNdefMap->State=PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   3252         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
   3253 
   3254         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_FAILED);
   3255         phFriNfc_MifareUL_H_Complete(NULL,NFCSTATUS_SUCCESS);
   3256         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_FAILED);
   3257 
   3258         *pNdefMap->DataCount=0x3;
   3259         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
   3260 
   3261         pNdefMap->ApduBuffIndex=0x31;
   3262         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
   3263 
   3264 
   3265 
   3266 }
   3267 
   3268 #endif
   3269 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
   3270 
   3271