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.36 $
     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 -
    650 						PH_FRINFC_NDEFMAP_MFUL_BLOCK4)
    651                             * PH_FRINFC_NDEFMAP_MFUL_VAL4) + (NdefMap->TLVStruct.NdefTLVByte - 1) + 4)))
    652 
    653                     {
    654                         Status = phFriNfc_MfUL_H_CopyRdBytes(NdefMap);
    655                     }
    656 
    657                     if (Status == NFCSTATUS_SUCCESS)
    658                     {
    659                         if(NdefMap->MifareULContainer.ReadBufIndex >=
    660                             (NdefMap->TLVStruct.ActualSize + (((NdefMap->TLVStruct.NdefTLVBlock -
    661 							PH_FRINFC_NDEFMAP_MFUL_BLOCK4)
    662                             * PH_FRINFC_NDEFMAP_MFUL_VAL4) + (NdefMap->TLVStruct.NdefTLVByte - 1) + 4)))
    663                         {
    664 
    665                             phFriNfc_MfUL_CalcByteNum(NdefMap);
    666 #if 0
    667                             for (i = 0; i < 16; i++)
    668                             {
    669                                 if ((NdefMap->MifareULContainer.ReadBuf[i] ==
    670                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T) &&
    671                                     ((NdefMap->MifareULContainer.ReadBuf[i + 1] ==
    672                                     NdefMap->TLVStruct.ActualSize) ||
    673                                     (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)))
    674                                 {
    675                                     if (NdefMap->MifareULContainer.ReadBuf[i + 1] == 0xFF)
    676                                     {
    677                                         TemLength = NdefMap->MifareULContainer.ReadBuf[i + 2] |
    678                                             ((uint16_t)NdefMap->MifareULContainer.ReadBuf[i + 3] << 8);
    679 
    680                                         if (TemLength == NdefMap->TLVStruct.ActualSize)
    681                                         {
    682                                             NdefMap->MifareULContainer.ByteNumber = i + 1;
    683                                             break;
    684                                         }
    685                                     }
    686                                     else
    687                                     {
    688                                         NdefMap->MifareULContainer.ByteNumber = i + 1;
    689                                         break;
    690                                     }
    691                                 }
    692                             }
    693 #endif
    694 
    695                             if (NdefMap->MifareULContainer.ReadBuf
    696                                 [NdefMap->MifareULContainer.ByteNumber] == 0xFF)
    697                             {
    698                                 NdefMap->MifareULContainer.ByteNumber =
    699                                     NdefMap->MifareULContainer.ByteNumber + 3;
    700                             }
    701                             else
    702                             {
    703                                 NdefMap->MifareULContainer.ByteNumber =
    704                                     NdefMap->MifareULContainer.ByteNumber + 1;
    705                             }
    706 
    707                             Status = phFriNfc_MfUL_H_CpDataToUserBuf(NdefMap);
    708                             if (NdefMap->MifareULContainer.CurrentSector > 0)
    709                             {
    710                                 NdefMap->MifareULContainer.CurrentSector = 0;
    711                                 NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_READ;
    712 
    713                                 Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    714                                     NdefMap->MifareULContainer.CurrentSector, 1,
    715                                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
    716                                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
    717                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    718                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    719                             }
    720                             else
    721                             {
    722                                 CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    723                             }
    724                         }
    725                         else
    726                         {
    727                             Status = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
    728                             CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    729                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    730                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    731                         }
    732                     }
    733                     else
    734                     {
    735 
    736                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    737                     }
    738                 }
    739                 else
    740                 {
    741                     /* read error */
    742                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    743                                         NFCSTATUS_INVALID_RECEIVE_LENGTH);
    744                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    745                 }
    746             break;
    747 
    748             case PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE:
    749                 Status = phFriNfc_MfUL_H_ProWrittenBytes(NdefMap);
    750                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    751                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    752                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    753             break;
    754 
    755             case PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP:
    756                 if (*NdefMap->SendRecvLength ==
    757                     PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
    758                 {
    759                     switch(NdefMap->PrevOperation)
    760                     {
    761                     case PH_FRINFC_NDEFMAP_CHECK_OPE:
    762                     case PH_FRINFC_NDEFMAP_READ_OPE:
    763                             CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    764                             if(NdefMap->TLVStruct.NoLbytesinTLV >
    765                                 PH_FRINFC_NDEFMAP_MFUL_VAL0)
    766                             {
    767                                 Status = phFriNfc_MfUL_H_ChkRemainTLV(NdefMap, &CRFlag);
    768                             }
    769                             else
    770                             {
    771                                 if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
    772                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)
    773                                 {
    774                                     /* Find the NDEF TLV */
    775                                     Status = phFriNfc_MfUL_H_findNDEFTLV(NdefMap, &CRFlag);
    776                                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
    777                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    778                                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    779                                 }
    780                             }
    781                             if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
    782                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
    783                                 (NdefMap->TLVStruct.NoLbytesinTLV ==
    784                                 PH_FRINFC_NDEFMAP_MFUL_VAL0))
    785                             {
    786                                 CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    787                                 /* Ndef TLV found, so call the next function depending on the
    788                                     check/read/write ndef operation */
    789 
    790                                 if (NdefMap->MifareULContainer.CurrentSector > 0)
    791                                 {
    792                                     NdefMap->MifareULContainer.CurrentSector = 0;
    793                                     NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP;
    794 
    795                                     Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    796                                         NdefMap->MifareULContainer.CurrentSector, 1,
    797                                         PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
    798                                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING )?
    799                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    800                                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    801                                 }
    802                                 else
    803                                 {
    804                                     /* Sector is 0 no need to send sector select */
    805                                     Status = phFriNfc_MfUL_H_NxtOp(NdefMap, &CRFlag);
    806                                 }
    807                             }
    808 
    809 #ifdef PH_HAL4_ENABLE
    810                             if ((Status != NFCSTATUS_PENDING ) &&
    811                                 (Status != NFCSTATUS_SUCCESS) &&
    812                                 (PH_FRINFC_NDEFMAP_CHECK_OPE ==
    813                                 NdefMap->PrevOperation))
    814                             {
    815                                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
    816                             }
    817 #endif /* #ifdef PH_HAL4_ENABLE */
    818                         break;
    819 
    820                     case PH_FRINFC_NDEFMAP_WRITE_OPE:
    821                         /* Remove UpdateWrLen */
    822                         Status = ((NdefMap->TLVStruct.WrLenFlag ==
    823                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)?
    824                                     phFriNfc_MfUL_H_UpdateWrLen(NdefMap):
    825                                     phFriNfc_MfUL_H_CallWrOp(NdefMap));
    826                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    827                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    828                                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    829                         break;
    830 
    831                     default:
    832                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    833                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
    834                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    835                         break;
    836 
    837                     }
    838                 }
    839             break;
    840 
    841             case PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV:
    842                 Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
    843                 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    844                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    845                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    846             break;
    847 
    848             case PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV:
    849                 if(((((NdefMap->TLVStruct.NdefTLVByte -
    850                     PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
    851                     PH_FRINFC_NDEFMAP_MFUL_VAL3) &&
    852                     (NdefMap->MifareULContainer.CurrentBlock ==
    853                     (NdefMap->TLVStruct.NdefTLVBlock +
    854                     PH_FRINFC_NDEFMAP_MFUL_VAL1))) ||
    855                     (((NdefMap->TLVStruct.NdefTLVByte -
    856                         PH_FRINFC_NDEFMAP_MFUL_VAL1) <
    857                     PH_FRINFC_NDEFMAP_MFUL_VAL3) && (
    858                     NdefMap->MifareULContainer.CurrentBlock ==
    859                     NdefMap->TLVStruct.NdefTLVBlock))))
    860                 {
    861                     (void)memcpy(NdefMap->MifareULContainer.InternalBuf,
    862                                 NdefMap->MifareULContainer.Buffer,
    863                                 NdefMap->MifareULContainer.InternalLength);
    864                 }
    865                 (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
    866                             NdefMap->MifareULContainer.Buffer,
    867                             PH_FRINFC_NDEFMAP_MFUL_VAL4);
    868 
    869                 NdefMap->CardState =(uint8_t) ((NdefMap->CardState ==
    870                                     PH_NDEFMAP_CARD_STATE_INITIALIZED)?
    871                                     PH_NDEFMAP_CARD_STATE_READ_WRITE:
    872                                     NdefMap->CardState);
    873                 NdefMap->ApduBuffIndex = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    874                 NdefMap->NumOfBytesWritten = PH_FRINFC_NDEFMAP_MFUL_VAL0;
    875 
    876                 if (NdefMap->MifareULContainer.CurrentSector > 0)
    877                 {
    878                     /* Reset sector */
    879                     NdefMap->MifareULContainer.CurrentSector = 0;
    880                     NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV;
    881 
    882                     Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    883                             NdefMap->MifareULContainer.CurrentSector, 1,
    884                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
    885                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    886                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    887                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    888                 }
    889                 else
    890                 {
    891                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    892                 }
    893 
    894             break;
    895 
    896             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1:
    897                  /* check the received bytes size equals 1 byte*/
    898                 if (*NdefMap->SendRecvLength ==
    899                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
    900                 {
    901                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
    902                     {
    903                         /* Send second command */
    904                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    905                             NdefMap->MifareULContainer.CurrentSector, 2,
    906                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2);
    907                     }
    908                     else
    909                     {
    910                         /* read error */
    911                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    912                                 NFCSTATUS_INVALID_FORMAT);
    913                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    914                     }
    915                 }
    916                 else
    917                 {
    918                     /* read error */
    919                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    920                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
    921                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    922 
    923                 }
    924             break;
    925 
    926             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_2:
    927                 {
    928                     NdefMap->MifareULContainer.CurrentBlock +=
    929                                 PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
    930 
    931                     Status = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
    932                                 NdefMap->MifareULContainer.CurrentBlock);
    933                 }
    934             break;
    935 
    936             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1:
    937                  /* check the received bytes size equals 1 byte*/
    938                 if (*NdefMap->SendRecvLength ==
    939                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
    940                 {
    941                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
    942                     {
    943                         /* Send second command */
    944                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    945                             NdefMap->MifareULContainer.CurrentSector, 2,
    946                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2);
    947                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG0;
    948                     }
    949                     else
    950                     {
    951                         /* read error */
    952                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    953                                 NFCSTATUS_INVALID_FORMAT);
    954                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    955                     }
    956                 }
    957                 else
    958                 {
    959                     /* read error */
    960                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
    961                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
    962                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
    963 
    964                 }
    965             break;
    966 
    967             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_2:
    968                 {
    969                     if (NdefMap->MifareULContainer.CurrentBlock == 0xFF)
    970                     {
    971                         NdefMap->MifareULContainer.CurrentBlock = 0;
    972                     }
    973                     else
    974                     {
    975                         NdefMap->MifareULContainer.CurrentBlock =
    976                             (NdefMap->TLVStruct.NdefTLVBlock / 4) * 4;
    977                     }
    978 
    979                     Status = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
    980                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
    981                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
    982                                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
    983                 }
    984             break;
    985 
    986             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1:
    987                  /* check the received bytes size equals 1 byte*/
    988                 if (*NdefMap->SendRecvLength ==
    989                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
    990                 {
    991                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
    992                     {
    993                         /* Send second command */
    994                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
    995                             NdefMap->MifareULContainer.CurrentSector, 2,
    996                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2);
    997                     }
    998                     else
    999                     {
   1000                         /* read error */
   1001                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1002                                 NFCSTATUS_INVALID_FORMAT);
   1003                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1004                     }
   1005                 }
   1006                 else
   1007                 {
   1008                     /* read error */
   1009                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1010                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1011                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1012 
   1013                 }
   1014             break;
   1015 
   1016             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_2:
   1017                 {
   1018                     NdefMap->MifareULContainer.CurrentBlock = 0;
   1019                     Status = phFriNfc_MfUL_H_fillSendBufToWr(NdefMap);
   1020 
   1021                     if((Status == NFCSTATUS_SUCCESS) &&
   1022                         (NdefMap->TLVStruct.SetTermTLVFlag !=
   1023                             PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
   1024                             (NdefMap->MifareULContainer.RemainingSize >
   1025                             PH_FRINFC_NDEFMAP_MFUL_VAL0))
   1026                     {
   1027                         Status = phFriNfc_MfUL_H_WrTermTLV(NdefMap);
   1028                     }
   1029                     else
   1030                     {
   1031                         if((Status == NFCSTATUS_SUCCESS) &&
   1032                             (NdefMap->TLVStruct.SetTermTLVFlag ==
   1033                             PH_FRINFC_NDEFMAP_MFUL_FLAG1))
   1034                         {
   1035                             Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
   1036                         }
   1037                     }
   1038 
   1039                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1040                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1041                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1042                 }
   1043             break;
   1044 
   1045             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_1:
   1046                  /* check the received bytes size equals 1 byte*/
   1047                 if (*NdefMap->SendRecvLength ==
   1048                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1049                 {
   1050                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
   1051                     {
   1052                         /* Send second command */
   1053                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
   1054                             NdefMap->MifareULContainer.CurrentSector, 2,
   1055                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2);
   1056                     }
   1057                     else
   1058                     {
   1059                         /* read error */
   1060                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1061                                 NFCSTATUS_INVALID_FORMAT);
   1062                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1063                     }
   1064                 }
   1065                 else
   1066                 {
   1067                     /* read error */
   1068                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1069                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1070                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1071 
   1072                 }
   1073             break;
   1074 
   1075             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_INIT_2:
   1076                 {
   1077                     Status = ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
   1078                         phFriNfc_MfUL_H_RdBeforeWrite(NdefMap):
   1079                         phFriNfc_MfUL_H_fillSendBufToWr(NdefMap));
   1080 
   1081 
   1082                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1083                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1084                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1085                 }
   1086             break;
   1087 
   1088 
   1089             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1:
   1090                  /* check the received bytes size equals 1 byte*/
   1091                 if (*NdefMap->SendRecvLength ==
   1092                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1093                 {
   1094                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
   1095                     {
   1096                         /* Send second command */
   1097                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
   1098                             NdefMap->MifareULContainer.CurrentSector, 2,
   1099                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2);
   1100                     }
   1101                     else
   1102                     {
   1103                         /* read error */
   1104                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1105                                 NFCSTATUS_INVALID_FORMAT);
   1106                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1107                     }
   1108                 }
   1109                 else
   1110                 {
   1111                     /* read error */
   1112                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1113                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1114                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1115 
   1116                 }
   1117             break;
   1118 
   1119             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_2:
   1120                 {
   1121                     NdefMap->MifareULContainer.CurrentBlock = 0;
   1122 
   1123                     NdefMap->SendRecvBuf[index] =
   1124                                         NdefMap->MifareULContainer.CurrentBlock;
   1125                     index++;
   1126                     NdefMap->SendRecvBuf[index] =
   1127                                             PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   1128                     index++;
   1129 
   1130                     if((((NdefMap->TLVStruct.NdefTLVByte -
   1131                             PH_FRINFC_NDEFMAP_MFUL_VAL1) == PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
   1132                             ((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1133                             == PH_FRINFC_NDEFMAP_MFUL_VAL3)))
   1134                         {
   1135                             /* Length to know how many bytes has to be written to the card */
   1136                         TemLength = (((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
   1137                                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1138                                         PH_FRINFC_NDEFMAP_MFUL_VAL2:
   1139                                         PH_FRINFC_NDEFMAP_MFUL_VAL3);
   1140 
   1141                         if(NdefMap->ApduBufferSize >= TemLength)
   1142                         {
   1143                             /* Prepare the receive buffer */
   1144                             (void)memcpy(&(NdefMap->SendRecvBuf[
   1145                                             index]),
   1146                                             &(NdefMap->ApduBuffer[
   1147                                             NdefMap->ApduBuffIndex]),
   1148                                             TemLength);
   1149 
   1150                             /* Number of bytes written to the card from user buffer */
   1151                             NdefMap->NumOfBytesWritten = TemLength;
   1152 
   1153                             index = index+(uint8_t)TemLength;
   1154                             /* Exact number of bytes written in the card including TLV */
   1155                             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1156                         }
   1157                         else
   1158                         {
   1159                             /* Prepare the receive buffer */
   1160                             (void)memcpy(&(NdefMap->SendRecvBuf[
   1161                                             index]),
   1162                                             &(NdefMap->ApduBuffer[
   1163                                             NdefMap->ApduBuffIndex]),
   1164                                             (uint16_t)NdefMap->ApduBufferSize);
   1165 
   1166                             /* Number of bytes written to the card from user buffer */
   1167                             NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
   1168 
   1169                             index= index +(uint8_t)NdefMap->ApduBufferSize;
   1170                             /* Exact number of bytes written in the card including TLV */
   1171                             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1172 
   1173                             for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK; i++)
   1174                             {
   1175                                 NdefMap->SendRecvBuf[i] = (uint8_t)((i == index)?
   1176                                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
   1177                                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
   1178                                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1179                             }
   1180                         }
   1181 
   1182                         /* store the bytes in buffer till the bytes are
   1183                             written in a block */
   1184                         (void)memcpy(NdefMap->MifareULContainer.Buffer,
   1185                                         &(NdefMap->SendRecvBuf[
   1186                                         PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   1187                                         (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   1188                                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1189 
   1190                         (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   1191                                     NdefMap->MifareULContainer.Buffer,
   1192                                     (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   1193                                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1194 
   1195                         /* Change the state to check ndef compliancy */
   1196                         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   1197 
   1198                         Status = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   1199                     }
   1200 
   1201 
   1202                     CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1203                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1204                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1205                 }
   1206             break;
   1207 
   1208             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1:
   1209                  /* check the received bytes size equals 1 byte*/
   1210                 if (*NdefMap->SendRecvLength ==
   1211                     PH_FRINFC_NDEFMAP_MFUL_VAL1)
   1212                 {
   1213                     if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] == 0x0A)
   1214                     {
   1215                         /* Send second command */
   1216                         Status = phFriNfc_MfUL_H_SelectSector(NdefMap,
   1217                             NdefMap->MifareULContainer.CurrentSector, 2,
   1218                             PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2);
   1219                     }
   1220                     else
   1221                     {
   1222                         /* read error */
   1223                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1224                                 NFCSTATUS_INVALID_FORMAT);
   1225                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1226                     }
   1227                 }
   1228                 else
   1229                 {
   1230                     /* read error */
   1231                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1232                             NFCSTATUS_INVALID_RECEIVE_LENGTH);
   1233                     CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1234 
   1235                 }
   1236             break;
   1237 
   1238             case PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_2:
   1239                 {
   1240                     if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP)
   1241                     {
   1242                         Status = phFriNfc_MfUL_H_NxtOp(NdefMap, &CRFlag);
   1243                     }
   1244                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_READ)
   1245                     {
   1246                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1247                     }
   1248                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE)
   1249                     {
   1250                         Status = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
   1251                         CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
   1252                             PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1253                             PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1254                     }
   1255                     else if (NdefMap->PrevState == PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV)
   1256                     {
   1257                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1258                     }
   1259                     else
   1260                     {
   1261                         /* read error */
   1262                         Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1263                                     NFCSTATUS_READ_FAILED);
   1264                         CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1265 
   1266                     }
   1267                 }
   1268             break;
   1269 
   1270             default:
   1271                 /*set the invalid state*/
   1272                 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
   1273                 phFriNfc_MifareUL_H_Complete(NdefMap, Status);
   1274             break;
   1275         }
   1276         if(CRFlag == PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1277         {
   1278             /* call the CR routine*/
   1279             phFriNfc_MifareUL_H_Complete(NdefMap, Status);
   1280         }
   1281     }
   1282     else
   1283     {
   1284         phFriNfc_MifareUL_H_Complete(NdefMap,Status);
   1285     }
   1286 }
   1287 
   1288 static NFCSTATUS phFriNfc_MfUL_H_ChkCCBytes(phFriNfc_NdefMap_t  *NdefMap )
   1289 {
   1290     NFCSTATUS Result = PHNFCSTVAL(  CID_FRI_NFC_NDEF_MAP,
   1291                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1292 
   1293 #ifdef LOCK_BITS_CHECK_ENABLE
   1294         switch(NdefMap->SendRecvBuf[7])
   1295 #else
   1296         switch(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE3])
   1297 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1298         {
   1299             case PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RW:
   1300                 /* This state can be either INITIALISED or READWRITE. but default
   1301                     is INITIALISED */
   1302                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
   1303                 break;
   1304 
   1305             case PH_FRINFC_NDEFMAP_MFUL_CC_BYTE3_RO:
   1306                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
   1307                 break;
   1308 
   1309             default :
   1310                 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
   1311         }
   1312 
   1313 
   1314 
   1315         /* Check for Ndef compliancy : 0 and 1 byte spcifies the ndef compliancy
   1316            2 byte specifies the version of the MF UL tag*/
   1317 #ifdef LOCK_BITS_CHECK_ENABLE
   1318         if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE4] ==
   1319 #else
   1320         if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE0] ==
   1321 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1322             PH_FRINFC_NDEFMAP_MFUL_CC_BYTE0) && (
   1323             (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED) ||
   1324             (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)))
   1325         {
   1326             /* Check the version number */
   1327             Result =phFriNfc_MapTool_ChkSpcVer( NdefMap,
   1328 #ifdef LOCK_BITS_CHECK_ENABLE
   1329                                                 5);
   1330 
   1331 #else
   1332                                                 PH_FRINFC_NDEFMAP_MFUL_BYTE1);
   1333 
   1334 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1335 #if 0
   1336 #ifdef PH_NDEF_MIFARE_ULC
   1337             if (Result == NFCSTATUS_SUCCESS)
   1338             {
   1339 #ifdef LOCK_BITS_CHECK_ENABLE
   1340 
   1341                 if (NdefMap->SendRecvBuf[6] == 0x06)
   1342                 {
   1343                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1344                 }
   1345                 else if (NdefMap->SendRecvBuf[6] == 0x12)
   1346                 {
   1347 //                  NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;
   1348                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1349                 }
   1350 
   1351 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1352 
   1353                 if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] == 0x06)
   1354                 {
   1355                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1356                 }
   1357                 else if (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] == 0x12)
   1358                 {
   1359 //                  NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_ULC_CARD;
   1360                     NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_UL_CARD;
   1361                 }
   1362 
   1363 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1364                 else
   1365                 {
   1366                     Result = PHNFCSTVAL(  CID_FRI_NFC_NDEF_MAP,
   1367                                                         NFCSTATUS_INVALID_REMOTE_DEVICE);
   1368                 }
   1369             }
   1370 #else
   1371 
   1372         /*  Check the CC header size: Only valid ones are
   1373                 0x06 for 48 bytes. */
   1374 #ifdef LOCK_BITS_CHECK_ENABLE
   1375             Result = ((( NdefMap->SendRecvBuf[6] !=
   1376 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1377             Result = ((( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] !=
   1378 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1379                         PH_FRINFC_NDEFMAP_MFUL_CC_BYTE2) || (Result !=
   1380                         NFCSTATUS_SUCCESS))?
   1381                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1382                         NFCSTATUS_INVALID_REMOTE_DEVICE)):
   1383                         Result);
   1384 #endif /* #ifdef PH_NDEF_MIFARE_ULC */
   1385 #endif
   1386             NdefMap->MifareULContainer.RemainingSize =
   1387             NdefMap->CardMemSize = ((Result == NFCSTATUS_SUCCESS)?
   1388 #ifdef LOCK_BITS_CHECK_ENABLE
   1389                                     (NdefMap->SendRecvBuf[6] *
   1390 #else /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1391                                     (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_BYTE2] *
   1392 #endif /* #ifdef LOCK_BITS_CHECK_ENABLE */
   1393                                     PH_FRINFC_NDEFMAP_MFUL_MUL8):
   1394                                     NdefMap->CardMemSize);
   1395 
   1396             if (NdefMap->CardMemSize > 256)
   1397             {
   1398                 NdefMap->CardMemSize = NdefMap->CardMemSize - 2;
   1399                 NdefMap->MifareULContainer.RemainingSize = NdefMap->CardMemSize;
   1400             }
   1401 
   1402         }
   1403         else
   1404         {
   1405             NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
   1406         }
   1407 
   1408 
   1409     return Result;
   1410 }
   1411 
   1412 /*!
   1413  * \brief this shall notify the integration software with respective
   1414  *  success/error status along with the completion routines.
   1415  *
   1416  *  This routine is called from the mifareul process function.
   1417  *
   1418  */
   1419 
   1420 static void phFriNfc_MifareUL_H_Complete(phFriNfc_NdefMap_t  *NdefMap,
   1421                                         NFCSTATUS            Status)
   1422 {
   1423     if(NdefMap!=NULL)
   1424     {
   1425         if((PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE   ==  NdefMap->State)
   1426             &&  (NFCSTATUS_SUCCESS !=  Status))
   1427         {
   1428             *NdefMap->WrNdefPacketLength    =   0;
   1429         }
   1430         /* set the state back to the Reset_Init state*/
   1431         NdefMap->State =  PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
   1432 
   1433         /* set the completion routine*/
   1434         NdefMap->CompletionRoutine[NdefMap->MifareULContainer.CRindex].
   1435             CompletionRoutine(NdefMap->CompletionRoutine->Context, Status);
   1436     }
   1437 }
   1438 
   1439 static NFCSTATUS   phFriNfc_MfUL_H_Rd16Bytes( phFriNfc_NdefMap_t  *NdefMap)
   1440 {
   1441     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1442                     NFCSTATUS_INVALID_PARAMETER);
   1443 
   1444     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_READ;
   1445 
   1446     /*  Set the previous operation flag to read. */
   1447     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
   1448 
   1449     /*  Have we already read the entire file? */
   1450     if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)
   1451     {
   1452         /* set the data for additional data exchange */
   1453         NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1454         NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1455         NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1456         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   1457                                 NdefMap->MifareULContainer.CurrentBlock;
   1458         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1459         *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1460         /*
   1461          * Changed
   1462          * Description: replace with  phHal_eMifareRead
   1463          */
   1464 
   1465         NdefMap->Cmd.MfCmd =  phHal_eMifareRead;
   1466 
   1467         /* Call the overlapped HAL Transceive function */
   1468         Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   1469                                                 &NdefMap->MapCompletionInfo,
   1470                                                 NdefMap->psRemoteDevInfo,
   1471                                                 NdefMap->Cmd,
   1472                                                 &NdefMap->psDepAdditionalInfo,
   1473                                                 NdefMap->SendRecvBuf,
   1474                                                 NdefMap->SendLength,
   1475                                                 NdefMap->SendRecvBuf,
   1476                                                 NdefMap->SendRecvLength);
   1477     }
   1478     return Result;
   1479 }
   1480 
   1481 static NFCSTATUS   phFriNfc_MfUL_H_Wr4bytes(  phFriNfc_NdefMap_t  *NdefMap)
   1482 {
   1483     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   1484 
   1485     /* set the receive length*/
   1486     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   1487 
   1488     NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
   1489 
   1490     /*
   1491      * Changed
   1492      * Description: phHal_eMifareCmdListMifareWrite4 replace with phHal_eMifareWrite4
   1493      */
   1494     /* set the cmd to mifare read*/
   1495     NdefMap->Cmd.MfCmd = phHal_eMifareWrite4;
   1496 
   1497     /* Set the CR and context for Mifare operations*/
   1498     NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareUL_Process;
   1499     NdefMap->MapCompletionInfo.Context = NdefMap;
   1500 
   1501     NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK;
   1502     /*Call the Overlapped HAL Transceive function */
   1503     Result = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice,
   1504                                         &NdefMap->MapCompletionInfo,
   1505                                         NdefMap->psRemoteDevInfo,
   1506                                         NdefMap->Cmd,
   1507                                         &NdefMap->psDepAdditionalInfo,
   1508                                         NdefMap->SendRecvBuf,
   1509                                         NdefMap->SendLength,
   1510                                         NdefMap->SendRecvBuf,
   1511                                         NdefMap->SendRecvLength);
   1512     return Result;
   1513 }
   1514 
   1515 static NFCSTATUS phFriNfc_MfUL_H_findNDEFTLV(phFriNfc_NdefMap_t     *NdefMap,
   1516                                             uint8_t                 *CRFlag)
   1517 {
   1518     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   1519     uint16_t    ShiftLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   1520                 TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   1521                 Temp16Bytes = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   1522     Temp16Bytes = ((NdefMap->TLVStruct.NdefTLVByte > PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1523                     (NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1):
   1524                     NdefMap->TLVStruct.NdefTLVByte);
   1525     for(;;)
   1526     {
   1527         if(NdefMap->SendRecvBuf[Temp16Bytes] ==
   1528                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV)
   1529         {
   1530             NdefMap->MifareULContainer.RemainingSize -=
   1531                         PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1532 #ifdef PH_HAL4_ENABLE
   1533             /* This check is added to know the remaining size in
   1534             the card is not 0, if this is 0, then complete card has
   1535             been read */
   1536             if (NdefMap->MifareULContainer.RemainingSize ==
   1537                         PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1538             {
   1539                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1540                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1541                 break;
   1542             }
   1543             else
   1544             {
   1545                 Result = NFCSTATUS_SUCCESS;
   1546             }
   1547 #else
   1548             Result = ((NdefMap->MifareULContainer.RemainingSize ==
   1549                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1550                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1551                                     NFCSTATUS_NO_NDEF_SUPPORT)):
   1552                         NFCSTATUS_SUCCESS);
   1553 #endif /* #ifdef PH_HAL4_ENABLE */
   1554             Temp16Bytes++;
   1555 #ifdef PH_HAL4_ENABLE
   1556             /* This code is added to read next 16 bytes. This means previous
   1557             16 bytes read contains only NULL TLV, so read further to get the
   1558             NDEF TLV */
   1559             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1560                                                 Temp16Bytes);
   1561             if(NFCSTATUS_SUCCESS != Result)
   1562             {
   1563                 NdefMap->TLVStruct.NdefTLVBlock =
   1564                     NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL4;
   1565                 break;
   1566             }
   1567 #endif /* #ifdef PH_HAL4_ENABLE */
   1568         }
   1569         else
   1570         {
   1571             Result = ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1572                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV)?
   1573                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1574                                     NFCSTATUS_NO_NDEF_SUPPORT)):
   1575                         NFCSTATUS_SUCCESS);
   1576 
   1577             if(Result != NFCSTATUS_SUCCESS)
   1578             {
   1579                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1580                 break;
   1581             }
   1582 
   1583 #ifdef PH_NDEF_MIFARE_ULC
   1584             if ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1585                         PH_FRINFC_NDEFMAP_MFUL_LOCK_CTRL_TLV) ||
   1586                         (NdefMap->SendRecvBuf[Temp16Bytes] ==
   1587                         PH_FRINFC_NDEFMAP_MFUL_MEM_CTRL_TLV) )
   1588             {
   1589 
   1590                  NdefMap->TLVStruct.NdefTLVByte =
   1591                                     ((Temp16Bytes %
   1592                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1593                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1594 
   1595                  Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1596                                                 Temp16Bytes);
   1597                 if(Result != NFCSTATUS_SUCCESS)
   1598                 {
   1599                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1600                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1601                     NdefMap->TLVStruct.NoLbytesinTLV =
   1602                                             PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1603                     break;
   1604                 }
   1605                 Temp16Bytes++;
   1606                 NdefMap->MifareULContainer.RemainingSize -=
   1607                                 PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1608 
   1609                 if(NdefMap->MifareULContainer.RemainingSize ==
   1610                   PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1611                 {
   1612                     Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1613                                         NFCSTATUS_NO_NDEF_SUPPORT));
   1614                     break;
   1615                 }
   1616 
   1617                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1618                                                     Temp16Bytes);
   1619                 if(Result != NFCSTATUS_SUCCESS)
   1620                 {
   1621                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1622                                         PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1623                     NdefMap->TLVStruct.NoLbytesinTLV =
   1624                                         PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1625                     break;
   1626                 }
   1627 
   1628 
   1629                  /* If the value of the Length(L) in TLV is FF then enter else
   1630                             check for the card memory */
   1631                 if((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1632                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
   1633                     ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1634                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
   1635                     (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1636                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
   1637                 {
   1638                     /* In the present case, the card space is not greater
   1639                         than 0xFF */
   1640                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1641                                         NFCSTATUS_NO_NDEF_SUPPORT);
   1642 
   1643                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1644                     break;
   1645                 }
   1646                 else
   1647                 {
   1648                     NdefMap->TLVStruct.BytesRemainLinTLV =
   1649                                     NdefMap->SendRecvBuf[Temp16Bytes];
   1650 
   1651                     NdefMap->TLVStruct.ActualSize =
   1652                                     NdefMap->SendRecvBuf[Temp16Bytes];
   1653 
   1654                     if((NdefMap->MifareULContainer.RemainingSize <
   1655                         NdefMap->SendRecvBuf[Temp16Bytes]) ||
   1656                         (NdefMap->MifareULContainer.RemainingSize <
   1657                         PH_FRINFC_NDEFMAP_MFUL_VAL2) ||
   1658                         (NdefMap->TLVStruct.BytesRemainLinTLV >
   1659                         (NdefMap->MifareULContainer.RemainingSize)) ||
   1660                         ((NdefMap->TLVStruct.BytesRemainLinTLV ==
   1661                         PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
   1662                         (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)))
   1663                     {
   1664                         /* No NDEF TLV found */
   1665                         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1666                                             NFCSTATUS_NO_NDEF_SUPPORT);
   1667                         *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1668                         break;
   1669                     }
   1670 
   1671                     if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1672                         PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1673                     {
   1674                         NdefMap->TLVStruct.NdefTLVByte =
   1675                                         (((Temp16Bytes + PH_FRINFC_NDEFMAP_MFUL_VAL1 +
   1676                                         NdefMap->SendRecvBuf[Temp16Bytes]) %
   1677                                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1678                                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1679 #if 0
   1680                         NdefMap->TLVStruct.NdefTLVBlock =
   1681                                         (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   1682                                         + ((Temp16Bytes +
   1683                                         NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
   1684                                         PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1685 #endif
   1686                         NdefMap->TLVStruct.NdefTLVBlock =
   1687                                         (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock / PH_FRINFC_NDEFMAP_MFUL_VAL4) *
   1688                                             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   1689                                             + ((Temp16Bytes + NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
   1690                                             PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1691 
   1692 
   1693                         TemLength = (Temp16Bytes +
   1694                                 NdefMap->SendRecvBuf[Temp16Bytes]);
   1695 
   1696                         NdefMap->MifareULContainer.RemainingSize =
   1697                                         (NdefMap->MifareULContainer.RemainingSize -
   1698                                         (NdefMap->SendRecvBuf[Temp16Bytes]
   1699                                         + PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1700 
   1701                         /* If the Length (L) in TLV < 16 bytes */
   1702                         Temp16Bytes = ((TemLength >=
   1703                                 PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1704                                 PH_FRINFC_NDEFMAP_MFUL_VAL0:
   1705                                 (TemLength +
   1706                                 PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1707 
   1708                         Result = ((TemLength >=
   1709                                 PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1710                                 phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   1711                                             NdefMap->TLVStruct.NdefTLVBlock):
   1712                                 NFCSTATUS_SUCCESS);
   1713 
   1714                         if(TemLength >= PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
   1715                         {
   1716                             break;
   1717                         }
   1718                         TemLength = Temp16Bytes;
   1719                     }
   1720                 }
   1721 
   1722 
   1723 
   1724 
   1725 #if 0
   1726 
   1727                  NdefMap->MifareULContainer.RemainingSize =
   1728                                     (NdefMap->MifareULContainer.RemainingSize -
   1729                                     (NdefMap->SendRecvBuf[Temp16Bytes + 1]
   1730                                     + PH_FRINFC_NDEFMAP_MFUL_VAL2));
   1731 
   1732                 NdefMap->TLVStruct.NdefTLVBlock =
   1733                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   1734                                     + ((Temp16Bytes +
   1735                                     NdefMap->SendRecvBuf[Temp16Bytes + 1] + 2)/
   1736                                     PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1737 
   1738 
   1739                 Temp16Bytes = Temp16Bytes +
   1740                         NdefMap->SendRecvBuf[Temp16Bytes + 1] + 2;
   1741 #endif
   1742             }
   1743 #endif /* #ifdef PH_NDEF_MIFARE_ULC */
   1744             else {
   1745 
   1746             /* Check the byte for 0x03 Type of NDEF TLV */
   1747             NdefMap->TLVStruct.NdefTLVFoundFlag =
   1748                     ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1749                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T)?
   1750                     PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   1751                     PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   1752 
   1753             if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
   1754                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1755             {
   1756                 ShiftLength = (Temp16Bytes +
   1757                                     NdefMap->SendRecvBuf[Temp16Bytes]);
   1758 
   1759                  NdefMap->TLVStruct.NdefTLVByte =
   1760                                     ((Temp16Bytes %
   1761                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1762                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1763 
   1764                 NdefMap->TLVStruct.NdefTLVBlock =
   1765                                     (uint8_t)(((NdefMap->TLVStruct.NdefTLVBlock /4) * 4)
   1766                                     + (Temp16Bytes)/
   1767                                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
   1768 
   1769                 NdefMap->TLVStruct.NdefTLVSector = NdefMap->MifareULContainer.CurrentSector;
   1770 
   1771             }
   1772 #ifdef PH_HAL4_ENABLE
   1773             else
   1774             {
   1775                 /* if the Type of the NDEF TLV is not found, then return
   1776                     error saying no ndef TLV found*/
   1777                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1778                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1779                 break;
   1780 #if 0
   1781                 /* This change is added to continue the loop, if the Type of the
   1782                     NDEF TLV is not found
   1783                     16 bytes are read, so for each byte, there is a check for the
   1784                     Type (T) of the TLV, if T != 0x03, then increment the byte
   1785                     count and restart the loop, till the T = 0x03 is found or all
   1786                     the bytes in the card is completely read.
   1787                 */
   1788                 Temp16Bytes = (uint16_t)(Temp16Bytes + 1);
   1789                 NdefMap->MifareULContainer.RemainingSize -=
   1790                         PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1791                 if (NdefMap->MifareULContainer.RemainingSize ==
   1792                             PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1793                 {
   1794                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1795                                         NFCSTATUS_NO_NDEF_SUPPORT);
   1796                     break;
   1797                 }
   1798                 else
   1799                 {
   1800                     Result = NFCSTATUS_SUCCESS;
   1801                     Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1802                                                 Temp16Bytes);
   1803                     if(NFCSTATUS_PENDING == Result)
   1804                     {
   1805                         break;
   1806                     }
   1807                     continue;
   1808                 }
   1809 #endif /* #if 0 */
   1810             }
   1811 #endif /* #ifdef PH_HAL4_ENABLE */
   1812 
   1813             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1814                                                 Temp16Bytes);
   1815             if(Result != NFCSTATUS_SUCCESS)
   1816             {
   1817                 NdefMap->TLVStruct.TcheckedinTLVFlag =
   1818                                         PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1819                 NdefMap->TLVStruct.NoLbytesinTLV =
   1820                                         PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1821                 break;
   1822             }
   1823             Temp16Bytes++;
   1824             NdefMap->MifareULContainer.RemainingSize -=
   1825                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1826 
   1827             if(NdefMap->MifareULContainer.RemainingSize ==
   1828               PH_FRINFC_NDEFMAP_MFUL_VAL0)
   1829             {
   1830                 Result = (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1831                                     NFCSTATUS_NO_NDEF_SUPPORT));
   1832                 break;
   1833             }
   1834 
   1835             Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1836                                                 Temp16Bytes);
   1837             if(Result != NFCSTATUS_SUCCESS)
   1838             {
   1839                 NdefMap->TLVStruct.TcheckedinTLVFlag =
   1840                                     PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1841                 NdefMap->TLVStruct.NoLbytesinTLV =
   1842                                     PH_FRINFC_NDEFMAP_MFUL_VAL3;
   1843                 break;
   1844             }
   1845 
   1846             /* If the value of the Length(L) in TLV is FF then enter else
   1847                 check for the card memory */
   1848             if((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1849                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
   1850                 ((NdefMap->SendRecvBuf[Temp16Bytes] ==
   1851                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
   1852                 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1853                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
   1854             {
   1855                 /* In the present case, the card space is not greater
   1856                     than 0xFF */
   1857                 /*
   1858                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1859                                     NFCSTATUS_NO_NDEF_SUPPORT);
   1860 
   1861                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1862                 break;
   1863                 */
   1864 
   1865                 Temp16Bytes++;
   1866                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1867                                                     Temp16Bytes);
   1868                 if(Result != NFCSTATUS_SUCCESS)
   1869                 {
   1870                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1871                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1872                     NdefMap->TLVStruct.NoLbytesinTLV =
   1873                                             PH_FRINFC_NDEFMAP_MFUL_VAL2;
   1874 
   1875                     break;
   1876                 }
   1877 
   1878                 ShiftLength = (uint16_t) NdefMap->SendRecvBuf[Temp16Bytes];
   1879                 NdefMap->MifareULContainer.RemainingSize--;
   1880 
   1881                 Temp16Bytes++;
   1882                 Result = phFriNfc_MfUL_H_Chk16Bytes(NdefMap,
   1883                                                     Temp16Bytes);
   1884                 if(Result != NFCSTATUS_SUCCESS)
   1885                 {
   1886                     NdefMap->TLVStruct.TcheckedinTLVFlag =
   1887                                             PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1888                     NdefMap->TLVStruct.NoLbytesinTLV =
   1889                                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
   1890                     NdefMap->TLVStruct.prevLenByteValue =
   1891                                     NdefMap->SendRecvBuf[Temp16Bytes - 1];
   1892                     break;
   1893                 }
   1894 
   1895 
   1896                 ShiftLength =
   1897                     (uint16_t) (NdefMap->SendRecvBuf[Temp16Bytes]
   1898                          | (ShiftLength << PH_FRINFC_NDEFMAP_MFUL_SHIFT8));
   1899 
   1900     //          NdefMap->MifareULContainer.RemainingSize--;
   1901 
   1902                 if(ShiftLength > (NdefMap->MifareULContainer.RemainingSize))
   1903                 {
   1904                     // Size in the Length(L) of TLV is greater
   1905                     //than the actual size of the card
   1906                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1907                                         NFCSTATUS_INVALID_PARAMETER);
   1908                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1909                     break;
   1910                 }
   1911 
   1912         //      NdefMap->MifareULContainer.RemainingSize--;
   1913                 /*
   1914                 NdefMap->TLVStruct.NdefTLVByte =
   1915                                     (NdefMap->SendRecvBuf[Temp16Bytes] %
   1916                                     PH_FRINFC_NDEFMAP_MFUL_VAL4);
   1917 
   1918                 NdefMap->TLVStruct.NdefTLVBlock =
   1919                                 (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   1920                             + (Temp16Bytes/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1921                 */
   1922 
   1923                 NdefMap->TLVStruct.ActualSize =
   1924                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   1925 
   1926                 NdefMap->TLVStruct.NdefTLVFoundFlag = 1;
   1927 
   1928                 NdefMap->TLVStruct.NdefTLVSector = NdefMap->MifareULContainer.CurrentSector;
   1929 
   1930 
   1931                 Result = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   1932                                     PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   1933                                     phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   1934                                     Result);
   1935 /*
   1936                 Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   1937                                                     NdefMap->TLVStruct.NdefTLVBlock);
   1938 */
   1939                 break;
   1940             }
   1941             else
   1942             {
   1943                 NdefMap->TLVStruct.BytesRemainLinTLV =
   1944                                 NdefMap->SendRecvBuf[Temp16Bytes];
   1945 
   1946                 NdefMap->TLVStruct.ActualSize =
   1947                                 NdefMap->SendRecvBuf[Temp16Bytes];
   1948 
   1949                 if((NdefMap->MifareULContainer.RemainingSize <
   1950                     NdefMap->SendRecvBuf[Temp16Bytes]) ||
   1951                     (NdefMap->MifareULContainer.RemainingSize <
   1952                     PH_FRINFC_NDEFMAP_MFUL_VAL2) ||
   1953                     (NdefMap->TLVStruct.BytesRemainLinTLV >
   1954                     (NdefMap->MifareULContainer.RemainingSize)) ||
   1955                     ((NdefMap->TLVStruct.BytesRemainLinTLV ==
   1956                     PH_FRINFC_NDEFMAP_MFUL_VAL0) &&
   1957                     (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE)))
   1958                 {
   1959                     /* No NDEF TLV found */
   1960                     Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   1961                                         NFCSTATUS_NO_NDEF_SUPPORT);
   1962                     *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   1963                     break;
   1964                 }
   1965 
   1966                 if(NdefMap->TLVStruct.NdefTLVFoundFlag !=
   1967                     PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   1968                 {
   1969                     NdefMap->TLVStruct.NdefTLVByte =
   1970                                     (((Temp16Bytes + PH_FRINFC_NDEFMAP_MFUL_VAL1 +
   1971                                     NdefMap->SendRecvBuf[Temp16Bytes]) %
   1972                                     PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   1973                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   1974                     NdefMap->TLVStruct.NdefTLVBlock =
   1975                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   1976                                     + ((Temp16Bytes +
   1977                                     NdefMap->SendRecvBuf[Temp16Bytes] + 1)/
   1978                                     PH_FRINFC_NDEFMAP_MFUL_VAL4));
   1979 
   1980                     TemLength = (Temp16Bytes +
   1981                             NdefMap->SendRecvBuf[Temp16Bytes]);
   1982 
   1983                     NdefMap->MifareULContainer.RemainingSize =
   1984                                     (NdefMap->MifareULContainer.RemainingSize -
   1985                                     (NdefMap->SendRecvBuf[Temp16Bytes]
   1986                                     + PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1987 
   1988                     /* If the Length (L) in TLV < 16 bytes */
   1989                     Temp16Bytes = ((TemLength >=
   1990                             PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1991                             PH_FRINFC_NDEFMAP_MFUL_VAL0:
   1992                             (TemLength +
   1993                             PH_FRINFC_NDEFMAP_MFUL_VAL1));
   1994 
   1995                     Result = ((TemLength >=
   1996                             PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   1997                             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   1998                                         NdefMap->TLVStruct.NdefTLVBlock):
   1999                             NFCSTATUS_SUCCESS);
   2000 
   2001                     if(TemLength >= PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
   2002                     {
   2003                         break;
   2004                     }
   2005                     TemLength = Temp16Bytes;
   2006                 }
   2007             }
   2008             if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
   2009                         PH_FRINFC_NDEFMAP_MFUL_FLAG1)
   2010             {
   2011 #if 0
   2012                 NdefMap->TLVStruct.NdefTLVBlock =
   2013                                     (uint8_t)(NdefMap->TLVStruct.NdefTLVBlock
   2014                                     + ((Temp16Bytes + 1)/
   2015                                     PH_FRINFC_NDEFMAP_MFUL_VAL4)) - 1;
   2016 #endif
   2017                 NdefMap->MifareULContainer.RemainingSize =
   2018                                     (NdefMap->MifareULContainer.RemainingSize -
   2019                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2020                     ShiftLength = NdefMap->SendRecvBuf[Temp16Bytes];
   2021                     Result = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   2022                             PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2023                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   2024                             Result);
   2025 
   2026                 break;
   2027             }
   2028         }
   2029         }
   2030     }
   2031 
   2032     return Result;
   2033 }
   2034 
   2035 
   2036 static NFCSTATUS phFriNfc_MfUL_H_Chk16Bytes(phFriNfc_NdefMap_t   *NdefMap,
   2037                                             uint16_t             TempLength)
   2038 {
   2039     uint16_t localCurrentBlock;
   2040 
   2041     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2042     if(TempLength == PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)
   2043     {
   2044         localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock +
   2045                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
   2046 
   2047         if (localCurrentBlock < 256)
   2048         {
   2049             NdefMap->MifareULContainer.CurrentBlock +=
   2050                                 PH_FRINFC_NDEFMAP_MFUL_BLOCK4;
   2051 
   2052             Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2053                             NdefMap->MifareULContainer.CurrentBlock);
   2054         }
   2055         else
   2056         {
   2057             /* Go to next sector */
   2058             NdefMap->MifareULContainer.CurrentSector++;
   2059 
   2060             Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2061                 NdefMap->MifareULContainer.CurrentSector, 1,
   2062                 PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_CHK_1);
   2063         }
   2064     }
   2065 
   2066     return Result;
   2067 }
   2068 
   2069 
   2070 static void phFriNfc_MfUL_H_UpdateCrc( uint8_t ch,
   2071                                           uint16_t *lpwCrc )
   2072 {
   2073     ch = (ch^(uint8_t)((*lpwCrc) & 0x00FF));
   2074     ch = (ch^(ch<<4));
   2075     *lpwCrc = (*lpwCrc >> 8)^((uint16_t)ch << 8)^ \
   2076                 ((uint16_t)ch<<3)^((uint16_t)ch>>4);
   2077 
   2078     return;
   2079 }
   2080 
   2081 static void phFriNfc_MfUL_H_ComputeCrc( int      CRCType,
   2082                                  uint8_t  *Data,
   2083                                  int      Length,
   2084                                  uint8_t  *TransmitFirst,
   2085                                  uint8_t  *TransmitSecond
   2086                                  )
   2087 {
   2088     uint8_t chBlock;
   2089     uint16_t wCrc;
   2090     switch(CRCType)
   2091     {
   2092     case CRC_A:
   2093         wCrc = 0x6363; /* ITU-V.41 */
   2094         break;
   2095     case CRC_B:
   2096         wCrc = 0xFFFF; /* ISO/IEC 13239 (formerly ISO/IEC 3309) */
   2097         break;
   2098     default:
   2099         return;
   2100     }
   2101 
   2102     do
   2103     {
   2104         chBlock = *Data++;
   2105         phFriNfc_MfUL_H_UpdateCrc(chBlock, &wCrc);
   2106     } while (--Length);
   2107     *TransmitFirst = (uint8_t) (wCrc & 0xFF);
   2108     *TransmitSecond = (uint8_t) ((wCrc >> 8) & 0xFF);
   2109     return;
   2110 }
   2111 
   2112 
   2113 
   2114 static NFCSTATUS  phFriNfc_MfUL_H_SelectSector(phFriNfc_NdefMap_t  *NdefMap,
   2115                                                    uint8_t              SectorNo,
   2116                                                    uint8_t              CmdNo,
   2117                                                    uint8_t              NextState)
   2118 {
   2119 
   2120     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2121 
   2122     /* set the data for additional data exchange */
   2123     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2124     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2125     NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2126 
   2127     NdefMap->State = NextState;
   2128 
   2129     if (CmdNo == 1)
   2130     {
   2131         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = 0x00;
   2132         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2133         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = 0xC2;
   2134         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL3] = 0xFF;
   2135         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL4;
   2136     }
   2137     else
   2138     {
   2139         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = 0x00;
   2140         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2141         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = SectorNo;
   2142         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL3] = 0;
   2143         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL4] = 0;
   2144         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL5] = 0;
   2145         NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL5 + 1;
   2146     }
   2147 
   2148     /* Calculate CRC */
   2149 
   2150     phFriNfc_MfUL_H_ComputeCrc(CRC_A, &NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2],
   2151             NdefMap->SendLength - 2,
   2152             &NdefMap->SendRecvBuf[NdefMap->SendLength],
   2153             &NdefMap->SendRecvBuf[NdefMap->SendLength + 1]);
   2154 
   2155     NdefMap->SendLength += PH_FRINFC_NDEFMAP_MFUL_VAL2;
   2156 
   2157 
   2158     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   2159 
   2160     NdefMap->Cmd.MfCmd = phHal_eMifareRaw;
   2161 
   2162     /* Call the overlapped HAL Transceive function */
   2163     Result = phFriNfc_OvrHal_Transceive(     NdefMap->LowerDevice,
   2164                                              &NdefMap->MapCompletionInfo,
   2165                                              NdefMap->psRemoteDevInfo,
   2166                                              NdefMap->Cmd,
   2167                                              &NdefMap->psDepAdditionalInfo,
   2168                                              NdefMap->SendRecvBuf,
   2169                                              NdefMap->SendLength,
   2170                                              NdefMap->SendRecvBuf,
   2171                                              NdefMap->SendRecvLength);
   2172      return Result;
   2173 }
   2174 
   2175 
   2176 static NFCSTATUS   phFriNfc_MfUL_H_RdCardfindNdefTLV( phFriNfc_NdefMap_t  *NdefMap,
   2177                                                    uint8_t              BlockNo)
   2178 {
   2179     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2180     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_FND_NDEF_COMP;
   2181     /* set the data for additional data exchange */
   2182     NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2183     NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2184     NdefMap->psDepAdditionalInfo.NAD = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2185     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   2186                                                     BlockNo;
   2187     NdefMap->SendLength = PH_FRINFC_NDEFMAP_MFUL_VAL1;
   2188     *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
   2189 
   2190     /*
   2191      * Changed
   2192      * Description: phHal_eMifareCmdListMifareRead replace with phHal_eMifareRead
   2193      */
   2194     NdefMap->Cmd.MfCmd = phHal_eMifareRead;
   2195 
   2196     /* Call the overlapped HAL Transceive function */
   2197     Result = phFriNfc_OvrHal_Transceive(    NdefMap->LowerDevice,
   2198                                             &NdefMap->MapCompletionInfo,
   2199                                             NdefMap->psRemoteDevInfo,
   2200                                             NdefMap->Cmd,
   2201                                             &NdefMap->psDepAdditionalInfo,
   2202                                             NdefMap->SendRecvBuf,
   2203                                             NdefMap->SendLength,
   2204                                             NdefMap->SendRecvBuf,
   2205                                             NdefMap->SendRecvLength);
   2206     return Result;
   2207 }
   2208 
   2209 static NFCSTATUS phFriNfc_MfUL_H_ChkRemainTLV(phFriNfc_NdefMap_t  *NdefMap,
   2210                                               uint8_t             *CRFlag)
   2211 {
   2212     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2213     uint16_t    TempLength = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   2214                 ShiftLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2215 
   2216     switch(NdefMap->TLVStruct.NoLbytesinTLV)
   2217     {
   2218         case PH_FRINFC_NDEFMAP_MFUL_VAL1:
   2219         case PH_FRINFC_NDEFMAP_MFUL_VAL2:
   2220             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   2221                             PH_FRINFC_NDEFMAP_MFUL_VAL1)?
   2222                             NdefMap->TLVStruct.prevLenByteValue:
   2223                             NdefMap->SendRecvBuf[TempLength]);
   2224             ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
   2225                             PH_FRINFC_NDEFMAP_MFUL_VAL1)?
   2226                             (((uint16_t)(NdefMap->SendRecvBuf[TempLength]) <<
   2227                             PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   2228                             ShiftLength):
   2229                             (((uint16_t)(NdefMap->SendRecvBuf[(TempLength +
   2230                             PH_FRINFC_NDEFMAP_MFUL_VAL1)]) <<
   2231                             PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   2232                             ShiftLength));
   2233 
   2234             NdefMap->MifareULContainer.RemainingSize -=
   2235                                             PH_FRINFC_NDEFMAP_MFUL_VAL1;
   2236 
   2237             NdefMap->TLVStruct.ActualSize =
   2238             NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   2239 
   2240             /* Check for remaining free space in the card with the
   2241                 length (L) of TLV OR length(L) of TLV is less than
   2242                 255 bytes (The length (L) of TLV for 3 byte should not
   2243                 be less than 255) */
   2244             Result = ((((NdefMap->MifareULContainer.RemainingSize)<=
   2245                         ShiftLength) || (ShiftLength <
   2246                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF))?
   2247                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2248                         NFCSTATUS_INVALID_PARAMETER)):
   2249                         Result);
   2250 
   2251 
   2252             Result = ((Result == NFCSTATUS_SUCCESS)?
   2253                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   2254                             Result);
   2255 
   2256             *CRFlag = (uint8_t)((Result == (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2257                         NFCSTATUS_INVALID_PARAMETER)))?
   2258                         PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2259                         PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2260 
   2261 
   2262             if(Result == NFCSTATUS_SUCCESS)
   2263             {
   2264 
   2265                 NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-
   2266                     NdefMap->TLVStruct.NoLbytesinTLV;
   2267 /*
   2268                 NdefMap->TLVStruct.NdefTLVByte = ((ShiftLength%
   2269                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   2270                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2271 
   2272                 NdefMap->TLVStruct.NdefTLVBlock =
   2273                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   2274                         + (ShiftLength/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   2275                 NdefMap->MifareULContainer.CurrentBlock =
   2276                                 NdefMap->TLVStruct.NdefTLVBlock;
   2277 
   2278                 Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2279                                                 NdefMap->TLVStruct.NdefTLVBlock);
   2280                                                 */
   2281             }
   2282             break;
   2283 
   2284         default:
   2285             if((NdefMap->SendRecvBuf[TempLength] ==
   2286                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_LFF) ||
   2287                 ((NdefMap->SendRecvBuf[TempLength] ==
   2288                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L) &&
   2289                 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   2290                 PH_FRINFC_NDEFMAP_MFUL_FLAG1)))
   2291             {
   2292                 /* In the present case, the card space is not greater
   2293                     than 0xFF */
   2294 /*
   2295                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2296                                     NFCSTATUS_NO_NDEF_SUPPORT);
   2297 
   2298                 *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2299 
   2300 */
   2301 
   2302                 ShiftLength = NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_NDEFMAP_MFUL_VAL1)];
   2303                 ShiftLength = (((uint16_t)(NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_NDEFMAP_MFUL_VAL2)])
   2304                                 << PH_FRINFC_NDEFMAP_MFUL_SHIFT8) |
   2305                                 ShiftLength);
   2306                 Result = ((ShiftLength > (NdefMap->MifareULContainer.RemainingSize))?
   2307                             (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2308                             NFCSTATUS_INVALID_PARAMETER)):
   2309                             Result);
   2310 
   2311 
   2312                 Result = ((Result == NFCSTATUS_SUCCESS)?
   2313                                             phFriNfc_MapTool_SetCardState(  NdefMap, ShiftLength):
   2314                                             Result);
   2315 
   2316                 NdefMap->TLVStruct.ActualSize =
   2317                     NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
   2318 
   2319                 if(Result == NFCSTATUS_SUCCESS)
   2320                 {
   2321 
   2322                     NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-
   2323                     NdefMap->TLVStruct.NoLbytesinTLV;
   2324 /*
   2325                     NdefMap->TLVStruct.NdefTLVByte = ((ShiftLength%
   2326                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   2327                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2328 
   2329                     NdefMap->TLVStruct.NdefTLVBlock =
   2330                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   2331                         + (ShiftLength/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   2332 
   2333                     NdefMap->MifareULContainer.CurrentBlock =
   2334                                 NdefMap->TLVStruct.NdefTLVBlock;
   2335 
   2336                     Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2337                                                         NdefMap->TLVStruct.NdefTLVBlock);
   2338 */
   2339                 }
   2340             }
   2341             else
   2342             {
   2343                 /* length (L) value in TLV shall not be greater than
   2344                     remaining free space in the card */
   2345                 Result = ((NdefMap->SendRecvBuf[TempLength] >
   2346                     NdefMap->MifareULContainer.RemainingSize)?
   2347                         (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2348                         NFCSTATUS_INVALID_PARAMETER)):
   2349                         Result);
   2350 
   2351                 NdefMap->TLVStruct.ActualSize =
   2352                 NdefMap->TLVStruct.BytesRemainLinTLV =
   2353                                 NdefMap->SendRecvBuf[TempLength];
   2354                 NdefMap->MifareULContainer.RemainingSize--;
   2355 
   2356                 if((Result == NFCSTATUS_SUCCESS) &&
   2357                     (NdefMap->TLVStruct.NdefTLVFoundFlag !=
   2358                     PH_FRINFC_NDEFMAP_MFUL_FLAG1))
   2359                 {
   2360                     phFriNfc_MfUL_H_UpdateLen(NdefMap,
   2361                                 (uint16_t)NdefMap->SendRecvBuf[TempLength]);
   2362 
   2363                     NdefMap->MifareULContainer.CurrentBlock =
   2364                                         NdefMap->TLVStruct.NdefTLVBlock;
   2365                     TempLength=TempLength+(NdefMap->SendRecvBuf[TempLength]);
   2366                     Result =((TempLength < PH_FRINFC_NDEFMAP_MFUL_RDBYTES_16)?
   2367                             phFriNfc_MfUL_H_findNDEFTLV(NdefMap, CRFlag):
   2368                             phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2369                                     NdefMap->TLVStruct.NdefTLVBlock));
   2370                 }
   2371             }
   2372             break;
   2373     }
   2374     NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2375 
   2376     Result = phFriNfc_MapTool_SetCardState(  NdefMap, NdefMap->TLVStruct.ActualSize);
   2377 
   2378     return Result;
   2379 }
   2380 
   2381 static void phFriNfc_MfUL_H_UpdateLen(phFriNfc_NdefMap_t        *NdefMap,
   2382                                       uint16_t                  DataLen)
   2383 {
   2384     NdefMap->MifareULContainer.RemainingSize= NdefMap->MifareULContainer.RemainingSize-DataLen;
   2385     NdefMap->TLVStruct.NdefTLVByte = ((DataLen %
   2386                         PH_FRINFC_NDEFMAP_MFUL_VAL4) +
   2387                         PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2388     NdefMap->TLVStruct.NdefTLVBlock =
   2389                         (uint8_t)(NdefMap->MifareULContainer.CurrentBlock
   2390                         + (DataLen/PH_FRINFC_NDEFMAP_MFUL_VAL4));
   2391 }
   2392 
   2393  static NFCSTATUS phFriNfc_MfUL_H_NxtOp(phFriNfc_NdefMap_t       *NdefMap,
   2394                                        uint8_t                  *CRFlag)
   2395 {
   2396     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2397 
   2398     switch(NdefMap->PrevOperation)
   2399     {
   2400         case PH_FRINFC_NDEFMAP_CHECK_OPE:
   2401             *CRFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2402 			/* Fix to check if the actual size in the TLV is greater than card */
   2403             if (NdefMap->TLVStruct.ActualSize > (NdefMap->CardMemSize - 2))
   2404             {
   2405                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2406                                     NFCSTATUS_NO_NDEF_SUPPORT);
   2407             }
   2408             break;
   2409 
   2410         case PH_FRINFC_NDEFMAP_READ_OPE:
   2411             if (NdefMap->TLVStruct.NdefTLVSector == 1)
   2412             {
   2413                 /* Goto sector 1 */
   2414                 NdefMap->MifareULContainer.CurrentSector = 1;
   2415                 NdefMap->MifareULContainer.CurrentBlock = 0;
   2416 
   2417                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2418                         NdefMap->MifareULContainer.CurrentSector, 1,
   2419                         PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1);
   2420             }
   2421             else
   2422             {
   2423                 NdefMap->MifareULContainer.CurrentBlock = (NdefMap->TLVStruct.NdefTLVBlock / 4) * 4;
   2424 
   2425                 Result = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
   2426             }
   2427 #if 0
   2428             NdefMap->MifareULContainer.CurrentBlock =
   2429                 PH_FRINFC_NDEFMAP_MFUL_VAL4;
   2430 
   2431              Result = phFriNfc_MfUL_H_Rd16Bytes(NdefMap);
   2432 #endif
   2433 
   2434 
   2435             *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
   2436                         PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2437                         PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2438             break;
   2439 
   2440         case PH_FRINFC_NDEFMAP_WRITE_OPE:
   2441             break;
   2442 
   2443         default:
   2444             break;
   2445     }
   2446     return Result;
   2447 }
   2448 
   2449 
   2450 
   2451 static NFCSTATUS phFriNfc_MfUL_H_CopyRdBytes(phFriNfc_NdefMap_t  *NdefMap)
   2452 {
   2453     NFCSTATUS Result = NFCSTATUS_SUCCESS;
   2454     uint16_t localCurrentBlock;
   2455 
   2456 #ifndef NDEF_READ_CHANGE
   2457 	uint16_t			v_field_byte = 0;
   2458 
   2459 	if (NdefMap->MifareULContainer.CurrentBlock
   2460 		== NdefMap->TLVStruct.NdefTLVBlock)
   2461 	{
   2462 		if (NdefMap->CardMemSize > (0x12 * PH_FRINFC_NDEFMAP_MFUL_MUL8))
   2463 		{
   2464 			v_field_byte = NdefMap->TLVStruct.NdefTLVByte;
   2465 		}
   2466 
   2467 		/* Calculate the Value field of the TLV to read */
   2468 		if (NdefMap->TLVStruct.ActualSize >= 0xFF)
   2469 		{
   2470 
   2471 			/* here
   2472 				3 is the 3 LENGTH bytes to skip
   2473 				4 is the block size
   2474 				1 is to increment the byte number
   2475 			*/
   2476 			v_field_byte = (uint16_t)
   2477 							(((v_field_byte + 3) % 4) + 1);
   2478 		}
   2479 		else
   2480 		{
   2481 			/* less than 0xFF */
   2482 #if 0
   2483 			if ((0x03 == v_field_byte)
   2484 				|| (0x04 == v_field_byte))
   2485 			{
   2486 				/*
   2487 					here
   2488 					1 is the 1 LENGTH byte to skip
   2489 					4 is the block size
   2490 					1 is to increment the byte number
   2491 				*/
   2492 				v_field_byte = (uint16_t)
   2493 								(((v_field_byte + 1) % 4) + 1);
   2494 			}
   2495 			else
   2496 			{
   2497 				v_field_byte = (uint16_t)
   2498 								(v_field_byte + 1);
   2499 			}
   2500 #endif /* #if 0 */
   2501 		}
   2502 	}
   2503 #endif /* #ifndef NDEF_READ_CHANGE */
   2504 
   2505 #ifndef NDEF_READ_CHANGE
   2506 	(void)memcpy(&(NdefMap->MifareULContainer.ReadBuf[
   2507                 NdefMap->MifareULContainer.ReadBufIndex]),
   2508                 (void *)(NdefMap->SendRecvBuf + v_field_byte),
   2509                 (*NdefMap->SendRecvLength - v_field_byte));
   2510 
   2511 	NdefMap->MifareULContainer.ReadBufIndex = (uint16_t)
   2512 		(NdefMap->MifareULContainer.ReadBufIndex +
   2513 		(*NdefMap->SendRecvLength - v_field_byte));
   2514 #else /* #ifndef NDEF_READ_CHANGE */
   2515 
   2516     (void)memcpy(&(NdefMap->MifareULContainer.ReadBuf[
   2517                 NdefMap->MifareULContainer.ReadBufIndex]),
   2518                 NdefMap->SendRecvBuf,
   2519                 *NdefMap->SendRecvLength);
   2520 
   2521     NdefMap->MifareULContainer.ReadBufIndex=NdefMap->MifareULContainer.ReadBufIndex +*NdefMap->SendRecvLength;
   2522 #endif /* #ifndef NDEF_READ_CHANGE */
   2523 
   2524     localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock+
   2525                             (uint8_t)((NdefMap->MifareULContainer.ReadBufIndex !=
   2526                             NdefMap->CardMemSize)?
   2527                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4:
   2528                             PH_FRINFC_NDEFMAP_MFUL_VAL0);
   2529     if (localCurrentBlock < 256)
   2530     {
   2531         NdefMap->MifareULContainer.CurrentBlock =  NdefMap->MifareULContainer.CurrentBlock+
   2532                             (uint8_t)((NdefMap->MifareULContainer.ReadBufIndex !=
   2533                             NdefMap->CardMemSize)?
   2534                             PH_FRINFC_NDEFMAP_MFUL_BLOCK4:
   2535                             PH_FRINFC_NDEFMAP_MFUL_VAL0);
   2536     }
   2537     else
   2538     {
   2539         /* Go to next sector */
   2540         if (NdefMap->MifareULContainer.CurrentSector == 0)
   2541         {
   2542             NdefMap->MifareULContainer.CurrentSector++;
   2543             NdefMap->MifareULContainer.CurrentBlock = 0xff;
   2544 
   2545             Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2546                     NdefMap->MifareULContainer.CurrentSector, 1,
   2547                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_READ_1);
   2548         }
   2549     }
   2550 
   2551     return Result;
   2552 }
   2553 
   2554 static NFCSTATUS phFriNfc_MfUL_H_CpDataToUserBuf(phFriNfc_NdefMap_t *NdefMap)
   2555 {
   2556     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2557 
   2558     /* Check the user buffer size with the
   2559     L value of TLV */
   2560     if(NdefMap->ApduBufferSize >=
   2561         NdefMap->TLVStruct.BytesRemainLinTLV)
   2562     {
   2563         (void)memcpy(NdefMap->ApduBuffer,
   2564             &(NdefMap->MifareULContainer.ReadBuf[
   2565             NdefMap->MifareULContainer.ByteNumber]),
   2566             NdefMap->TLVStruct.BytesRemainLinTLV);
   2567 
   2568         *(NdefMap->NumOfBytesRead) =
   2569                     NdefMap->TLVStruct.BytesRemainLinTLV;
   2570         NdefMap->MifareULContainer.ByteNumber =
   2571                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2572         NdefMap->MifareULContainer.ReadWriteCompleteFlag =
   2573                                 PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2574         NdefMap->MifareULContainer.RemainingSize =  NdefMap->MifareULContainer.RemainingSize-
   2575                                                     NdefMap->TLVStruct.BytesRemainLinTLV;
   2576         NdefMap->TLVStruct.BytesRemainLinTLV =
   2577                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2578     }
   2579     else
   2580     {
   2581         (void)memcpy(NdefMap->ApduBuffer,
   2582             &(NdefMap->MifareULContainer.ReadBuf[
   2583             NdefMap->MifareULContainer.ByteNumber]),
   2584             NdefMap->ApduBufferSize);
   2585 
   2586         *(NdefMap->NumOfBytesRead) =
   2587                     NdefMap->ApduBufferSize;
   2588         NdefMap->MifareULContainer.ByteNumber = NdefMap->MifareULContainer.ByteNumber+
   2589                                                 (uint16_t)NdefMap->ApduBufferSize;
   2590         NdefMap->MifareULContainer.RemainingSize=NdefMap->MifareULContainer.RemainingSize-
   2591                                                      (uint16_t)NdefMap->ApduBufferSize;
   2592         NdefMap->TLVStruct.BytesRemainLinTLV =  NdefMap->TLVStruct.BytesRemainLinTLV-
   2593                     (uint16_t)NdefMap->ApduBufferSize;
   2594     }
   2595     return Result;
   2596 }
   2597 
   2598 static NFCSTATUS phFriNfc_MfUL_H_RdBeforeWrite(phFriNfc_NdefMap_t       *NdefMap)
   2599 {
   2600     uint16_t localCurrentBlock = NdefMap->TLVStruct.NdefTLVBlock;
   2601 
   2602     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2603     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   2604                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2605     /*            BytesToWrite = PH_FRINFC_NDEFMAP_MFUL_VAL0;*/
   2606     uint16_t    TemLength = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2607 
   2608     switch((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1))
   2609     {
   2610         case PH_FRINFC_NDEFMAP_MFUL_VAL0:
   2611             /* go the NDEF TLV block to start write */
   2612             NdefMap->MifareULContainer.CurrentBlock =
   2613                 NdefMap->TLVStruct.NdefTLVBlock;
   2614             /* fill send buffer for write */
   2615             NdefMap->SendRecvBuf[index] =
   2616                                 NdefMap->MifareULContainer.CurrentBlock;
   2617             index++;
   2618             NdefMap->SendRecvBuf[index] =
   2619                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_T;
   2620             index++;
   2621             if (NdefMap->ApduBufferSize > 254)
   2622             {
   2623                 NdefMap->SendRecvBuf[index] = 0xFF;
   2624                 index++;
   2625                 NdefMap->SendRecvBuf[index] =
   2626                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2627                 index++;
   2628                 NdefMap->SendRecvBuf[index] =
   2629                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2630                 index++;
   2631             }
   2632             else
   2633             {
   2634                 NdefMap->SendRecvBuf[index] =
   2635                                     PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2636                 index++;
   2637             }
   2638 
   2639 
   2640             break;
   2641 
   2642         case PH_FRINFC_NDEFMAP_MFUL_VAL1:
   2643         case PH_FRINFC_NDEFMAP_MFUL_VAL2:
   2644             /* read to get the previous bytes */
   2645             Result = phFriNfc_MfUL_H_RdCardfindNdefTLV(NdefMap,
   2646                             NdefMap->TLVStruct.NdefTLVBlock);
   2647             break;
   2648 
   2649         case PH_FRINFC_NDEFMAP_MFUL_VAL3:
   2650 
   2651             localCurrentBlock = (NdefMap->MifareULContainer.CurrentBlock +
   2652                                 PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2653 
   2654             if (localCurrentBlock < 256)
   2655             {
   2656 
   2657                 NdefMap->MifareULContainer.CurrentBlock =
   2658                             (NdefMap->MifareULContainer.CurrentBlock +
   2659                                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2660                 NdefMap->SendRecvBuf[index] =
   2661                                     NdefMap->MifareULContainer.CurrentBlock;
   2662                 index++;
   2663 
   2664                 if (NdefMap->ApduBufferSize > 254)
   2665                 {
   2666                     NdefMap->SendRecvBuf[index] = 0xFF;
   2667                     index++;
   2668                     NdefMap->SendRecvBuf[index] =
   2669                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2670                     index++;
   2671                     NdefMap->SendRecvBuf[index] =
   2672                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2673                     index++;
   2674                 }
   2675                 else
   2676                 {
   2677                     NdefMap->SendRecvBuf[index] =
   2678                                         PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2679                     index++;
   2680                 }
   2681             }
   2682             else
   2683             {
   2684                 /* Go to next sector */
   2685                 NdefMap->MifareULContainer.CurrentSector++;
   2686 
   2687                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2688                     NdefMap->MifareULContainer.CurrentSector, 1,
   2689                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RW_1);
   2690             }
   2691             break;
   2692 
   2693         default:
   2694             Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2695                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   2696             break;
   2697     }
   2698 
   2699     if((((NdefMap->TLVStruct.NdefTLVByte -
   2700         PH_FRINFC_NDEFMAP_MFUL_VAL1) == PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
   2701         ((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1)
   2702         == PH_FRINFC_NDEFMAP_MFUL_VAL3)) && localCurrentBlock < 256)
   2703     {
   2704         /* Length to know how many bytes has to be written to the card */
   2705         TemLength = (((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
   2706                         PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2707                         PH_FRINFC_NDEFMAP_MFUL_VAL2:
   2708                         PH_FRINFC_NDEFMAP_MFUL_VAL3);
   2709 
   2710         if (NdefMap->ApduBufferSize > 254)
   2711         {
   2712             TemLength -= 2;
   2713         }
   2714 
   2715         if(NdefMap->ApduBufferSize >= TemLength)
   2716         {
   2717             /* Prepare the receive buffer */
   2718             (void)memcpy(&(NdefMap->SendRecvBuf[
   2719                             index]),
   2720                             &(NdefMap->ApduBuffer[
   2721                             NdefMap->ApduBuffIndex]),
   2722                             TemLength);
   2723 
   2724             /* Number of bytes written to the card from user buffer */
   2725             NdefMap->NumOfBytesWritten = TemLength;
   2726 
   2727             index = index+(uint8_t)TemLength;
   2728             /* Exact number of bytes written in the card including TLV */
   2729             if (index >= 1)
   2730             {
   2731                 *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2732             }
   2733             else
   2734             {
   2735                 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2736                                 NFCSTATUS_INVALID_REMOTE_DEVICE);
   2737             }
   2738         }
   2739         else
   2740         {
   2741             /* Prepare the receive buffer */
   2742             (void)memcpy(&(NdefMap->SendRecvBuf[
   2743                             index]),
   2744                             &(NdefMap->ApduBuffer[
   2745                             NdefMap->ApduBuffIndex]),
   2746                             (uint16_t)NdefMap->ApduBufferSize);
   2747 
   2748             /* Number of bytes written to the card from user buffer */
   2749             NdefMap->NumOfBytesWritten = (uint16_t)NdefMap->ApduBufferSize;
   2750 
   2751             index= index +(uint8_t)NdefMap->ApduBufferSize;
   2752             /* Exact number of bytes written in the card including TLV */
   2753             *NdefMap->DataCount = (index - PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2754 
   2755             for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK; i++)
   2756             {
   2757                 NdefMap->SendRecvBuf[i] = (uint8_t)((i == index)?
   2758                         PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
   2759                         PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
   2760                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   2761             }
   2762         }
   2763 
   2764         /* store the bytes in buffer till the bytes are
   2765             written in a block */
   2766         (void)memcpy(NdefMap->MifareULContainer.Buffer,
   2767                         &(NdefMap->SendRecvBuf[
   2768                         PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2769                         (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   2770                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   2771 
   2772         (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   2773                     NdefMap->MifareULContainer.Buffer,
   2774                     (PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK -
   2775                         PH_FRINFC_NDEFMAP_MFUL_VAL1));
   2776 
   2777         /* Change the state to check ndef compliancy */
   2778         NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   2779 
   2780         Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   2781     }
   2782     return Result;
   2783 }
   2784 
   2785 static NFCSTATUS phFriNfc_MfUL_H_CallWrOp(phFriNfc_NdefMap_t        *NdefMap)
   2786 {
   2787     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2788    /* uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL1;*/
   2789 
   2790 
   2791     NdefMap->MifareULContainer.CurrentBlock =
   2792                         NdefMap->TLVStruct.NdefTLVBlock;
   2793 
   2794     (void)memcpy(&(NdefMap->SendRecvBuf[
   2795                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2796                 NdefMap->SendRecvBuf,
   2797                 PH_FRINFC_NDEFMAP_MFUL_VAL4);
   2798 
   2799     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   2800                             NdefMap->MifareULContainer.CurrentBlock;
   2801 
   2802     if (NdefMap->ApduBufferSize > 254)
   2803     {
   2804          NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
   2805                             PH_FRINFC_NDEFMAP_MFUL_VAL1)] = 0xFF;
   2806 
   2807 
   2808         if((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_NDEFMAP_MFUL_VAL1) <
   2809             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   2810         {
   2811             NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
   2812                             PH_FRINFC_NDEFMAP_MFUL_VAL2 )] = 0x00;
   2813 
   2814             NdefMap->NumOfLReminWrite = 1;
   2815 
   2816         }
   2817         else
   2818         {
   2819             NdefMap->NumOfLReminWrite = 2;
   2820         }
   2821         NdefMap->NumOfBytesWritten = 0;
   2822     }
   2823     else
   2824     {
   2825         /* Write the length value = 0 */
   2826         NdefMap->SendRecvBuf[(NdefMap->TLVStruct.NdefTLVByte +
   2827                                 PH_FRINFC_NDEFMAP_MFUL_VAL1)] =
   2828                                 PH_FRINFC_NDEFMAP_MFUL_NDEFTLV_L;
   2829 
   2830         if((NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_NDEFMAP_MFUL_VAL1) <
   2831             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   2832         {
   2833             /* Only one byte  */
   2834             (void)memcpy(&(NdefMap->SendRecvBuf[
   2835                     PH_FRINFC_NDEFMAP_MFUL_VAL4]),
   2836                     &(NdefMap->ApduBuffer[
   2837                     NdefMap->ApduBuffIndex]),
   2838                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2839             /* Number of bytes written to the card from user buffer */
   2840             NdefMap->NumOfBytesWritten = PH_FRINFC_NDEFMAP_MFUL_VAL1;
   2841         }
   2842     }
   2843 
   2844     (void)memcpy(NdefMap->MifareULContainer.Buffer,
   2845                 &(NdefMap->SendRecvBuf[
   2846                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   2847                 PH_FRINFC_NDEFMAP_MFUL_VAL4);
   2848 
   2849     /* Copy the Ndef TLV buffer to send buffer */
   2850     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   2851                 NdefMap->MifareULContainer.Buffer,
   2852                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   2853 
   2854     /* Exact number of bytes written in the card including TLV */
   2855     *NdefMap->DataCount = PH_FRINFC_NDEFMAP_MFUL_VAL4;
   2856 
   2857     /* Change the state to check ndef compliancy */
   2858     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   2859 
   2860     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   2861 
   2862     return Result;
   2863 }
   2864 
   2865 static NFCSTATUS phFriNfc_MfUL_H_ProWrittenBytes(phFriNfc_NdefMap_t *NdefMap)
   2866 {
   2867     uint16_t localCurrentBlock;
   2868     NFCSTATUS   Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
   2869                         NFCSTATUS_INVALID_REMOTE_DEVICE);
   2870 
   2871     if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)
   2872     {
   2873         NdefMap->ApduBuffIndex =  NdefMap->ApduBuffIndex+NdefMap->NumOfBytesWritten;
   2874         if(*NdefMap->DataCount <
   2875             PH_FRINFC_NDEFMAP_MFUL_VAL4)
   2876         {
   2877             (void)memcpy(NdefMap->MifareULContainer.InternalBuf,
   2878                         NdefMap->MifareULContainer.Buffer,
   2879                         *NdefMap->DataCount);
   2880 
   2881             NdefMap->MifareULContainer.InternalLength = *NdefMap->DataCount;
   2882         }
   2883         else
   2884         {
   2885             NdefMap->MifareULContainer.InternalLength =
   2886                                 PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2887         }
   2888 
   2889         NdefMap->MifareULContainer.RemainingSize=  NdefMap->MifareULContainer.RemainingSize-
   2890                                             NdefMap->NumOfBytesWritten;
   2891         if((NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize) ||
   2892             (NdefMap->MifareULContainer.RemainingSize ==
   2893             PH_FRINFC_NDEFMAP_MFUL_VAL0))
   2894         {
   2895             Result = NFCSTATUS_SUCCESS;
   2896             NdefMap->MifareULContainer.ReadWriteCompleteFlag =
   2897                 (uint8_t)((NdefMap->MifareULContainer.RemainingSize ==
   2898                 PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2899                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2900                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2901 
   2902                 NdefMap->TLVStruct.SetTermTLVFlag =
   2903                 (uint8_t)(((NdefMap->MifareULContainer.RemainingSize ==
   2904                 PH_FRINFC_NDEFMAP_MFUL_VAL0) ||
   2905                 (NdefMap->TLVStruct.SetTermTLVFlag ==
   2906                 PH_FRINFC_NDEFMAP_MFUL_FLAG1))?
   2907                 PH_FRINFC_NDEFMAP_MFUL_FLAG1:
   2908                 PH_FRINFC_NDEFMAP_MFUL_FLAG0);
   2909 
   2910                 NdefMap->MifareULContainer.CurrentBlock = NdefMap->MifareULContainer.CurrentBlock+
   2911                     (uint8_t)((NdefMap->MifareULContainer.InternalLength !=
   2912                     PH_FRINFC_NDEFMAP_MFUL_VAL0)?
   2913                     PH_FRINFC_NDEFMAP_MFUL_VAL0:
   2914                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   2915 
   2916             *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
   2917         }
   2918         else
   2919         {
   2920             localCurrentBlock = NdefMap->MifareULContainer.CurrentBlock + 1;
   2921             if (localCurrentBlock < 256)
   2922             {
   2923                 NdefMap->MifareULContainer.CurrentBlock++;
   2924                 Result = phFriNfc_MfUL_H_fillSendBufToWr(NdefMap);
   2925             }
   2926             else
   2927             {
   2928                 /* Go to next sector */
   2929                 NdefMap->MifareULContainer.CurrentSector++;
   2930 
   2931                 Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   2932                     NdefMap->MifareULContainer.CurrentSector, 1,
   2933                     PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_WRITE_1);
   2934             }
   2935         }
   2936     }
   2937 
   2938     if((Result == NFCSTATUS_SUCCESS) &&
   2939         (NdefMap->TLVStruct.SetTermTLVFlag !=
   2940         PH_FRINFC_NDEFMAP_MFUL_FLAG1) &&
   2941         (NdefMap->MifareULContainer.RemainingSize >
   2942         PH_FRINFC_NDEFMAP_MFUL_VAL0))
   2943     {
   2944         Result = phFriNfc_MfUL_H_WrTermTLV(NdefMap);
   2945     }
   2946     else
   2947     {
   2948         if((Result == NFCSTATUS_SUCCESS) &&
   2949             (NdefMap->TLVStruct.SetTermTLVFlag ==
   2950             PH_FRINFC_NDEFMAP_MFUL_FLAG1))
   2951         {
   2952             Result = phFriNfc_MfUL_H_UpdateWrLen(NdefMap);
   2953         }
   2954     }
   2955     return Result;
   2956 }
   2957 static NFCSTATUS phFriNfc_MfUL_H_fillSendBufToWr(phFriNfc_NdefMap_t *NdefMap)
   2958 {
   2959     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   2960     uint16_t    RemainingBytes = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   2961                 BytesToWrite = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2962     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   2963 
   2964     RemainingBytes = (uint16_t)(( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) <=
   2965                         NdefMap->MifareULContainer.RemainingSize)?
   2966                         (uint16_t)(NdefMap->ApduBufferSize -
   2967                         NdefMap->ApduBuffIndex):
   2968                         NdefMap->MifareULContainer.RemainingSize);
   2969 
   2970     NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] =
   2971                         NdefMap->MifareULContainer.CurrentBlock;
   2972 
   2973     /* Get the number of bytes that can be written after copying
   2974         the internal buffer */
   2975     BytesToWrite = ((RemainingBytes <
   2976                     (PH_FRINFC_NDEFMAP_MFUL_BYTE4 -
   2977                     NdefMap->MifareULContainer.InternalLength))?
   2978                     RemainingBytes:
   2979                     (PH_FRINFC_NDEFMAP_MFUL_BYTE4 -
   2980                     NdefMap->MifareULContainer.InternalLength));
   2981 
   2982     if (NdefMap->NumOfBytesWritten == 0 && NdefMap->NumOfLReminWrite > 0)
   2983     {
   2984         BytesToWrite = BytesToWrite - NdefMap->NumOfLReminWrite;
   2985 
   2986         if (NdefMap->NumOfLReminWrite == 1)
   2987         {
   2988             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2989         }
   2990         else
   2991         {
   2992             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1] = 0x00;
   2993             NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL2] = 0x00;
   2994         }
   2995     }
   2996 
   2997     if(NdefMap->MifareULContainer.InternalLength >
   2998         PH_FRINFC_NDEFMAP_MFUL_VAL0)
   2999     {
   3000         /* copy the internal buffer to the send buffer */
   3001         (void)memcpy(&(NdefMap->SendRecvBuf[
   3002                     PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3003                     NdefMap->MifareULContainer.InternalBuf,
   3004                     NdefMap->MifareULContainer.InternalLength);
   3005 
   3006     }
   3007 
   3008     /* Copy Bytes to write in the send buffer */
   3009     (void)memcpy(&(NdefMap->SendRecvBuf[
   3010                 (PH_FRINFC_NDEFMAP_MFUL_VAL1 +
   3011                 NdefMap->MifareULContainer.InternalLength) +
   3012                 NdefMap->NumOfLReminWrite]),
   3013                 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
   3014                 BytesToWrite);
   3015 
   3016     /* update number of bytes written from the user buffer */
   3017     NdefMap->NumOfBytesWritten = BytesToWrite;
   3018 
   3019     /* check the exact number of bytes written to a block including the
   3020         internal length */
   3021     *NdefMap->DataCount =
   3022             (BytesToWrite + NdefMap->MifareULContainer.InternalLength +
   3023                     NdefMap->NumOfLReminWrite);
   3024 
   3025 
   3026     /* if total bytes to write in the card is less than 4 bytes then
   3027     pad zeroes till 4 bytes */
   3028     if((BytesToWrite + NdefMap->MifareULContainer.InternalLength +
   3029         NdefMap->NumOfLReminWrite)
   3030             < PH_FRINFC_NDEFMAP_MFUL_BYTE4)
   3031     {
   3032         for(index = (uint8_t)((BytesToWrite + NdefMap->MifareULContainer.InternalLength + NdefMap->NumOfLReminWrite) +
   3033                     PH_FRINFC_NDEFMAP_MFUL_VAL1);
   3034             index < PH_FRINFC_NDEFMAP_MFUL_WR_A_BLK;
   3035             index++)
   3036             {
   3037                 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
   3038                                     ((BytesToWrite +
   3039                                     NdefMap->MifareULContainer.InternalLength + NdefMap->NumOfLReminWrite) +
   3040                                     PH_FRINFC_NDEFMAP_MFUL_VAL1))?
   3041                                     PH_FRINFC_NDEFMAP_MFUL_TERMTLV:
   3042                                     PH_FRINFC_NDEFMAP_MFUL_NULLTLV);
   3043 
   3044                 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_NDEFMAP_MFUL_FLAG1;
   3045             }
   3046     }
   3047 
   3048     /* A temporary buffer to hold four bytes of data that is
   3049         written to the card */
   3050     (void)memcpy(NdefMap->MifareULContainer.Buffer,
   3051                 &(NdefMap->SendRecvBuf[
   3052                 PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3053                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3054 
   3055 
   3056 
   3057         if((NdefMap->TLVStruct.NdefTLVByte - PH_FRINFC_NDEFMAP_MFUL_VAL1) <
   3058         PH_FRINFC_NDEFMAP_MFUL_VAL3)
   3059         {
   3060             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3061                 NdefMap->MifareULContainer.CurrentSector))
   3062             {
   3063                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3064                         NdefMap->TLVStruct.NdefTLVBlock)
   3065                 {
   3066                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   3067                         NdefMap->MifareULContainer.Buffer,
   3068                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3069                 }
   3070             }
   3071 
   3072             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3073                 NdefMap->MifareULContainer.CurrentSector) ||
   3074                 (NdefMap->TLVStruct.NdefTLVBlock == 0xFF))
   3075             {
   3076                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3077                     (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL1))
   3078                 {
   3079                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer1,
   3080                     NdefMap->MifareULContainer.Buffer,
   3081                     PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3082                 }
   3083             }
   3084         }
   3085         else
   3086         {
   3087             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3088                 NdefMap->MifareULContainer.CurrentSector))
   3089             {
   3090                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3091                     (NdefMap->TLVStruct.NdefTLVBlock +
   3092                     PH_FRINFC_NDEFMAP_MFUL_VAL1))
   3093                 {
   3094                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer,
   3095                                 NdefMap->MifareULContainer.Buffer,
   3096                                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3097                 }
   3098             }
   3099 
   3100             if ((NdefMap->TLVStruct.NdefTLVSector ==
   3101                 NdefMap->MifareULContainer.CurrentSector)||
   3102                 (NdefMap->TLVStruct.NdefTLVBlock == 0xFF))
   3103             {
   3104                 if(NdefMap->MifareULContainer.CurrentBlock ==
   3105                     (NdefMap->TLVStruct.NdefTLVBlock + PH_FRINFC_NDEFMAP_MFUL_VAL2))
   3106                 {
   3107                     (void)memcpy(NdefMap->TLVStruct.NdefTLVBuffer1,
   3108                                 NdefMap->MifareULContainer.Buffer,
   3109                                 PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3110                 }
   3111             }
   3112         }
   3113 
   3114 
   3115     /* Change the state to check ndef compliancy */
   3116     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   3117 
   3118     NdefMap->NumOfLReminWrite = 0;
   3119 
   3120     /* Start writing to the current block */
   3121     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   3122 
   3123     return Result;
   3124 }
   3125 static NFCSTATUS phFriNfc_MfUL_H_WrTermTLV(phFriNfc_NdefMap_t   *NdefMap)
   3126 {
   3127     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3128     uint8_t     index = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   3129                 i = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   3130 
   3131     /* Change the state to check ndef compliancy */
   3132     NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV;
   3133 
   3134     NdefMap->SendRecvBuf[index] =
   3135                         (NdefMap->MifareULContainer.CurrentBlock +
   3136                         PH_FRINFC_NDEFMAP_MFUL_VAL0);
   3137     index++;
   3138     NdefMap->SendRecvBuf[index] = PH_FRINFC_NDEFMAP_MFUL_TERMTLV;
   3139     index++;
   3140 
   3141     for(i = index; i < PH_FRINFC_NDEFMAP_MFUL_VAL4; i++)
   3142     {
   3143         NdefMap->SendRecvBuf[i] = PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
   3144     }
   3145 
   3146     Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   3147     return Result;
   3148 }
   3149 
   3150 static NFCSTATUS phFriNfc_MfUL_H_UpdateWrLen(phFriNfc_NdefMap_t *NdefMap)
   3151 {
   3152     NFCSTATUS   Result = NFCSTATUS_SUCCESS;
   3153     uint16_t    BlockNo = PH_FRINFC_NDEFMAP_MFUL_VAL0,
   3154                 ByteNo = PH_FRINFC_NDEFMAP_MFUL_VAL0;
   3155 
   3156     if ((NdefMap->TLVStruct.NdefTLVSector ==
   3157         NdefMap->MifareULContainer.CurrentSector) ||
   3158         ((NdefMap->TLVStruct.NdefTLVBlock == 0xFF) &&
   3159         (NdefMap->TLVStruct.NdefTLVByte == 4) &&
   3160         (NdefMap->TLVStruct.NdefTLVSector == 0)))
   3161     {
   3162         BlockNo = (((NdefMap->TLVStruct.NdefTLVByte -
   3163                     PH_FRINFC_NDEFMAP_MFUL_VAL1) !=
   3164                     PH_FRINFC_NDEFMAP_MFUL_VAL3)?
   3165                     NdefMap->TLVStruct.NdefTLVBlock:
   3166                     (NdefMap->TLVStruct.NdefTLVBlock +
   3167                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
   3168 
   3169         ByteNo = (((NdefMap->TLVStruct.NdefTLVByte -
   3170                     PH_FRINFC_NDEFMAP_MFUL_VAL1) ==
   3171                     PH_FRINFC_NDEFMAP_MFUL_VAL3)?
   3172                     PH_FRINFC_NDEFMAP_MFUL_VAL1:
   3173                     (NdefMap->TLVStruct.NdefTLVByte +
   3174                     PH_FRINFC_NDEFMAP_MFUL_VAL1));
   3175 
   3176         if (NdefMap->NumOfLReminWrite > 0)
   3177         {
   3178             BlockNo++;
   3179 
   3180             /* Copy the Ndef TLV buffer to send buffer */
   3181             (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3182                         NdefMap->TLVStruct.NdefTLVBuffer1,
   3183                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3184 
   3185             if (NdefMap->NumOfLReminWrite == 1)
   3186             {
   3187                 /* NdefMap->SendRecvBuf[1] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8); */
   3188 				NdefMap->SendRecvBuf[1] = (uint8_t) NdefMap->ApduBuffIndex;
   3189 
   3190             }
   3191             else if (NdefMap->NumOfLReminWrite == 2)
   3192             {
   3193 				NdefMap->SendRecvBuf[1] = (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
   3194                 NdefMap->SendRecvBuf[2]= (uint8_t) (NdefMap->ApduBuffIndex);
   3195 
   3196             }
   3197             else
   3198             {
   3199 
   3200             }
   3201             NdefMap->NumOfLReminWrite = 0;
   3202         }
   3203         else
   3204         {
   3205             /* Copy the Ndef TLV buffer to send buffer */
   3206             (void)memcpy(&(NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3207                         NdefMap->TLVStruct.NdefTLVBuffer,
   3208                         PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3209 
   3210 
   3211             if (NdefMap->ApduBuffIndex > 254)
   3212             {
   3213                 ByteNo++;
   3214                 if  ((ByteNo == 3) || (ByteNo == 2))
   3215                 {
   3216                     NdefMap->SendRecvBuf[ByteNo]= (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
   3217                     ByteNo++;
   3218                     NdefMap->SendRecvBuf[ByteNo] = (uint8_t) (NdefMap->ApduBuffIndex);
   3219                     ByteNo++;
   3220                     NdefMap->NumOfLReminWrite = 0;
   3221                 }
   3222                 else if (ByteNo == 4)
   3223                 {
   3224                     /* NdefMap->SendRecvBuf[ByteNo]= (uint8_t) (NdefMap->ApduBuffIndex); */
   3225 					NdefMap->SendRecvBuf[ByteNo]= (uint8_t) ((NdefMap->ApduBuffIndex & 0xFF00) >> 8);
   3226                     ByteNo++;
   3227                     NdefMap->NumOfLReminWrite = 1;
   3228                 }
   3229                 else
   3230                 {
   3231                     NdefMap->NumOfLReminWrite = 2;
   3232                 }
   3233             }
   3234             else
   3235             {
   3236                 NdefMap->SendRecvBuf[ByteNo]=
   3237                                     (uint8_t)((NdefMap->Offset ==
   3238                                     PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
   3239                                     (uint8_t)NdefMap->ApduBuffIndex:
   3240                                     (NdefMap->ApduBuffIndex +
   3241                                     NdefMap->SendRecvBuf[ByteNo]));
   3242             }
   3243         }
   3244 
   3245         (void)memcpy(NdefMap->MifareULContainer.Buffer,
   3246                     &(NdefMap->SendRecvBuf[
   3247                     PH_FRINFC_NDEFMAP_MFUL_VAL1]),
   3248                     PH_FRINFC_NDEFMAP_MFUL_BYTE4);
   3249 
   3250         NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_MFUL_VAL0] = (uint8_t)BlockNo;
   3251         Result = phFriNfc_MfUL_H_Wr4bytes(NdefMap);
   3252 
   3253         if (NdefMap->NumOfLReminWrite == 0)
   3254         {
   3255             NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_WR_LEN_TLV;
   3256         }
   3257         else
   3258         {
   3259             NdefMap->State = PH_FRINFC_NDEFMAP_MFUL_STATE_TERM_TLV;
   3260         }
   3261     }
   3262     else if (NdefMap->TLVStruct.NdefTLVSector == 0)
   3263     {
   3264         /* Reset sector */
   3265         NdefMap->MifareULContainer.CurrentSector = 0;
   3266         NdefMap->PrevState = PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   3267 
   3268         Result = phFriNfc_MfUL_H_SelectSector(NdefMap,
   3269                 NdefMap->MifareULContainer.CurrentSector, 1,
   3270                 PH_FRINFC_NDEFMAP_MFUL_STATE_SELECT_SECTOR_RESET_1);
   3271 
   3272     }
   3273     else
   3274     {
   3275         Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
   3276     }
   3277 
   3278 
   3279     return Result;
   3280 }
   3281 #ifdef UNIT_TEST
   3282 extern void phFriNfc_MifareUL_UnitTest(void *Context,uint32_t Length)
   3283 {
   3284         uint8_t value=10;
   3285         uint8_t* CrFlag=&value;
   3286         phFriNfc_NdefMap_t *pNdefMap=(phFriNfc_NdefMap_t*)Context;
   3287         phFriNfc_MfUL_H_UpdateLen(pNdefMap,(uint16_t) Length);
   3288         phFriNfc_MfUL_H_WrTermTLV(pNdefMap);
   3289         phFriNfc_MfUL_H_CallWrOp(pNdefMap);
   3290         phFriNfc_MfUL_H_UpdateWrLen(pNdefMap);
   3291         phFriNfc_MfUL_H_ChkRemainTLV(pNdefMap,CrFlag);
   3292         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
   3293 
   3294         pNdefMap->PrevOperation=PH_FRINFC_NDEFMAP_READ_OPE;
   3295         phFriNfc_MfUL_H_NxtOp(pNdefMap,CrFlag);
   3296 
   3297         pNdefMap->PrevOperation=PH_FRINFC_NDEFMAP_WRITE_OPE;
   3298         phFriNfc_MfUL_H_NxtOp(pNdefMap,CrFlag);
   3299 
   3300         pNdefMap->TLVStruct.NoLbytesinTLV=PH_FRINFC_NDEFMAP_MFUL_VAL1;
   3301         phFriNfc_MfUL_H_ChkRemainTLV(pNdefMap,CrFlag);
   3302 
   3303         pNdefMap->SendRecvBuf[0x00]= PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
   3304         phFriNfc_MfUL_H_findNDEFTLV(pNdefMap,CrFlag);
   3305 
   3306 
   3307         pNdefMap->SendRecvBuf[0x00]= PH_FRINFC_NDEFMAP_MFUL_NULLTLV;
   3308         phFriNfc_MfUL_H_findNDEFTLV(pNdefMap,CrFlag);
   3309 
   3310 
   3311         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3312         pNdefMap->TLVStruct.NdefTLVByte=1;
   3313         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3314 
   3315         pNdefMap->TLVStruct.NdefTLVByte=3;
   3316         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3317 
   3318         pNdefMap->TLVStruct.NdefTLVByte=4;
   3319         phFriNfc_MfUL_H_RdBeforeWrite(pNdefMap);
   3320 
   3321 
   3322         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
   3323         phFriNfc_MifareUL_H_Complete(NULL,NFCSTATUS_SUCCESS);
   3324         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
   3325         pNdefMap->State=PH_FRINFC_NDEFMAP_MFUL_STATE_WRITE;
   3326         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_SUCCESS);
   3327 
   3328         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_FAILED);
   3329         phFriNfc_MifareUL_H_Complete(NULL,NFCSTATUS_SUCCESS);
   3330         phFriNfc_MifareUL_H_Complete(pNdefMap,NFCSTATUS_FAILED);
   3331 
   3332         *pNdefMap->DataCount=0x3;
   3333         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
   3334 
   3335         pNdefMap->ApduBuffIndex=0x31;
   3336         phFriNfc_MfUL_H_ProWrittenBytes(pNdefMap);
   3337 
   3338 
   3339 
   3340 }
   3341 
   3342 #endif
   3343 #endif  /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
   3344 
   3345