2 * Copyright (C) 2010 NXP Semiconductors
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * \file phFriNfc_MifareStdMap.c
19 * \brief NFC Ndef Mapping For Remote Devices.
23 * $Date: Thu May 6 10:01:55 2010 $
26 * $Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $
30 #ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
32 #include <phFriNfc_MifareStdMap.h>
33 #include <phFriNfc_OvrHal.h>
35 #ifndef PH_HAL4_ENABLE
36 #include <phFriNfc_OvrHalCmd.h>
39 #include <phFriNfc_MapTools.h>
41 /*! \ingroup grp_file_attributes
44 * File: \ref phFriNfcNdefMap.c
48 #define PHFRINFCMIFARESTDMAP_FILEREVISION "$Revision: 1.22 $"
49 #define PHFRINFCMIFARESTDMAP_FILEALIASES "$Aliases: NFC_FRI1.1_WK1017_R34_4,NFC_FRI1.1_WK1023_R35_1 $"
54 * \name Mifare Standard Mapping - Helper Functions
60 * \brief \copydoc page_ovr Helper function for Mifare Std. This function Reads
61 * a block from the card.
63 static NFCSTATUS phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t *NdefMap);
66 * \brief \copydoc page_ovr Helper function for Mifare Std. This function writes
67 * into a block of the card.
69 static NFCSTATUS phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t *NdefMap);
72 * \brief \copydoc page_ovr Helper function for Mifare Std. This function authenticates
73 * one sector at a time.
75 static NFCSTATUS phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t *NdefMap);
78 * \brief \copydoc page_ovr Helper function for Mifare 4k Check Ndef to
79 * get the next AID blocks
81 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t *NdefMap);
84 * \brief \copydoc page_ovr Helper function for Check Ndef to store the AIDs
86 static void phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t *NdefMap);
89 * \brief \copydoc page_ovr Helper function to get the Sector from the current block
91 static uint8_t phFriNfc_MifStd_H_GetSect(uint8_t BlockNumber);
94 * \brief \copydoc page_ovr Helper function to check the Ndef compliance of the
95 * current block, if the block is not Ndef Compliant, increment the block till
96 * the next Ndef compliant block using the Get Sector Helper function
98 static NFCSTATUS phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t *NdefMap);
101 * \brief \copydoc page_ovr Helper function to read the access bits of each sector
103 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t *NdefMap);
106 * \brief \copydoc page_ovr Helper function to check the access bits of each sector
108 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t *NdefMap);
111 * \brief \copydoc page_ovr Helper function for read access bits, depending
112 * on the read/write/check ndef function called
114 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t *NdefMap);
117 * \brief \copydoc page_ovr Helper function for check ndef to check the
118 * ndef compliant sectors
120 static void phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t *NdefMap);
124 * \brief \copydoc page_ovr Helper function for read ndef to check the
125 * the length L of the ndef TLV
127 static uint8_t phFriNfc_MifStd_H_ChkNdefLen(phFriNfc_NdefMap_t *NdefMap,
132 * \brief \copydoc page_ovr Helper function for read ndef to copy the
133 * card data to the user buffer
135 static NFCSTATUS phFriNfc_MifStd_H_RdNdefTLV(phFriNfc_NdefMap_t *NdefMap,
136 uint8_t *Temp16Bytes);
141 * \brief \copydoc page_ovr Helper function for read ndef to process the
142 * remaining bytes of length (L) in the TLV
144 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t *NdefMap,
146 uint8_t *Temp16Bytes);
149 * \brief \copydoc page_ovr Helper function for read ndef to process the
152 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap);
155 * \brief \copydoc page_ovr Helper function for read ndef to check the
156 * internal bytes without ndef tlv flag
158 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t *NdefMap,
160 uint8_t *TempintBytes);
163 * \brief \copydoc page_ovr Helper function for read ndef to check the
164 * internal bytes without ndef tlv flag
166 static NFCSTATUS phFriNfc_MifStd_H_IntLenWithNdef(phFriNfc_NdefMap_t *NdefMap,
167 uint8_t *TempintBytes);
170 * \brief \copydoc page_ovr Helper function for write ndef to add the TLV
173 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap);
176 * \brief \copydoc page_ovr Helper function for write ndef to write the Length TLV
179 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap);
182 * \brief \copydoc page_ovr Helper function for check ndef to check the ndef
183 * compliant blocks is 0
185 static NFCSTATUS phFriNfc_MifStd_H_ChkNdefCmpltBlocks(phFriNfc_NdefMap_t *NdefMap);
188 * \brief \copydoc page_ovr Helper function to set the authentication flag
189 * for the ndef TLV block
191 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t *NdefMap);
194 * \brief \copydoc page_ovr Helper function to reset ndef TLV values. This is
195 * used when the offset is BEGIN
197 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t *NdefMap);
200 * \brief \copydoc page_ovr Helper function to read the first ndef compliant block to
203 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap);
206 * \brief \copydoc page_ovr Helper function to get the actual length of card
209 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap);
212 * \brief \copydoc page_ovr Helper function to check all the TLVs
215 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
219 * \brief \copydoc page_ovr Helper function to get the next TLV
222 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t *NdefMap,
223 uint16_t *TempLength,
224 uint8_t *TL4bytesFlag);
227 * \brief \copydoc page_ovr Helper function to know whether the read
228 * 16 bytes are parsed completely
230 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t *NdefMap,
231 uint16_t TempLength);
234 * \brief \copydoc page_ovr Helper function to know whether the read
235 * 16 bytes are parsed completely
237 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap,
242 * \brief \copydoc page_ovr Helper function to call the Completion Routine
245 static void phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t *NdefMap,
249 * \brief \copydoc page_ovr Helper function to get the Mifare 1k Sector Trailer
252 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t *NdefMap);
255 * \brief \copydoc page_ovr Helper function to get the Mifare 4k Sector Trailer
258 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t *NdefMap);
261 * \brief \copydoc page_ovr Helper function to process the check ndef call
264 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t *NdefMap);
267 * \brief \copydoc page_ovr Helper function to process the authentication of a sector
270 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t *NdefMap);
273 * \brief \copydoc page_ovr Helper function to read 16 bytes from a specifed block no.
276 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t *NdefMap,
280 * \brief \copydoc page_ovr Helper function to process access bits of the
283 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t *NdefMap);
286 * \brief \copydoc page_ovr Helper function to check the GPB bytes
288 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t *NdefMap);
291 * \brief \copydoc page_ovr Helper function to check for the different
292 * status value in the process because of proprietary forum sector
294 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t *NdefMap,
298 * \brief \copydoc page_ovr Helper function to read the NDEF TLV block
300 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t *NdefMap);
303 * \brief \copydoc page_ovr Helper function to process the NDEF TLV block
304 * read bytes to start write from the NDEF TLV
306 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t *NdefMap);
309 * \brief \copydoc page_ovr Helper function to fill the send buffer to write
311 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t *NdefMap,
315 * \brief \copydoc page_ovr Helper function to write 16 bytes in a block
317 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t *NdefMap);
320 * \brief \copydoc page_ovr Helper function to process the write TLV bytes in a block
322 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t *NdefMap);
325 * \brief \copydoc page_ovr Helper function to update the remaining TLV
327 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t *NdefMap);
330 * \brief \copydoc page_ovr Helper function to update the length field if more than one
331 * NULL TLVs exists before of the NDEF TLV
333 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t *NdefMap);
336 * \brief \copydoc page_ovr Helper function to update the length field if more than one
337 * NULL TLVs does not exists before the TLV
339 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t *NdefMap);
342 * \brief \copydoc page_ovr Helper function to increment/decrement the ndef tlv block
345 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t *NdefMap);
348 * \brief \copydoc page_ovr Helper function to check the current block is valid or not
349 * if not valid decrement the current block till the valid block
351 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t *NdefMap);
354 * \brief \copydoc page_ovr Helper function update the length of the TLV if NULL TLVs
355 * greater than or equal to 2
357 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t *NdefMap);
360 * \brief \copydoc page_ovr Helper function update the length of the TLV if NULL TLVs
363 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t *NdefMap);
366 * \brief \copydoc page_ovr Helper function to read the TLV block
368 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t *NdefMap);
371 * \brief \copydoc page_ovr Helper function to process the read TLV block
373 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t *NdefMap);
376 * \brief \copydoc page_ovr Helper function to write the terminator TLV
378 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t *NdefMap);
381 * \brief \copydoc page_ovr Helper function to process the write a block function
383 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t *NdefMap);
385 #ifndef PH_HAL4_ENABLE
387 * \brief \copydoc page_ovr Helper function to call poll function after the
388 * authentication has failed
390 static NFCSTATUS phFriNfc_MifStd_H_CallPoll(phFriNfc_NdefMap_t *NdefMap);
394 * \brief \copydoc page_ovr Helper function to call connect function after the
395 * authentication has failed
397 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t *NdefMap);
400 * \brief \copydoc page_ovr Helper function to call disconnect function after the
401 * authentication has failed
403 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t *NdefMap);
406 * \brief \copydoc page_ovr Helper function to call know the ndef compliant block using
408 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t *NdefMap,
414 * \name Mifare Standard Mapping - Constants.
418 /* As per the spec, the value of this macro
419 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1 shall be 0xA0 */
420 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1 0xA0 /**< \internal Authenticate Command for MAD Sector */
422 /* As per the spec, the value of this macro
423 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2 shall be 0xA1 */
424 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2 0xA1 /**< \internal Authenticate Command for MAD Sector */
426 /* As per the spec, the value of this macro
427 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3 shall be 0xA2 */
428 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3 0xA2 /**< \internal Authenticate Command for MAD Sector */
430 /* As per the spec, the value of this macro
431 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4 shall be 0xA3 */
432 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4 0xA3 /**< \internal Authenticate Command for MAD Sector */
434 /* As per the spec, the value of this macro
435 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5 shall be 0xA4 */
436 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5 0xA4 /**< \internal Authenticate Command for MAD Sector */
438 /* As per the spec, the value of this macro
439 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6 shall be 0xA5 */
440 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6 0xA5 /**< \internal Authenticate Command for MAD Sector */
442 /* As per the spec, the value of this macro
443 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1 shall be 0xD3 */
444 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1 0xD3 /**< \internal Authenticate Command for NDEF Sectors 1 */
446 /* As per the spec, the value of this macro
447 PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2 shall be 0xF7 */
448 #define PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2 0xF7 /**< \internal Authenticate Command for NDEF Sectors 2 */
449 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2 0x03 /**< \internal Ndef Compliant command 1 */
450 #define PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1 0xE1 /**< \internal Ndef Compliant command 2 */
452 /* Enable access bits check for the MAD sector
453 #define ENABLE_ACS_BIT_CHK_FOR_MAD */
456 NFCSTATUS phFriNfc_MifareStdMap_H_Reset(phFriNfc_NdefMap_t *NdefMap)
458 NFCSTATUS status = NFCSTATUS_SUCCESS;
459 uint8_t index = PH_FRINFC_MIFARESTD_VAL0;
460 if ( NdefMap == NULL)
462 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
466 /* Current Block stores the present block accessed in the card */
467 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL0;
469 for(index = PH_FRINFC_MIFARESTD_VAL0; index <
470 PH_FRINFC_NDEFMAP_MIFARESTD_ST15_BYTES; index++)
472 /* internal buffer to store the odd bytes of length < 15 */
473 NdefMap->StdMifareContainer.internalBuf[index] = PH_FRINFC_MIFARESTD_VAL0;
475 /* odd bytes length stored in the internal buffer */
476 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
478 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
480 /* Flag to get that last few bytes are taken from the user buffer */
481 NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
483 /* Flag to find that the read/write operation has reached the end of the card.
484 Further reading/writing is not possible */
485 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
487 /* Flag to get that last few bytes are taken from the internal buffer */
488 NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG0;
490 /* Authentication Flag for every sector */
491 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
493 /* Used in Check Ndef for storing the sector ID */
494 NdefMap->StdMifareContainer.SectorIndex = PH_FRINFC_MIFARESTD_VAL0;
496 NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL0;
498 NdefMap->StdMifareContainer.NoOfNdefCompBlocks = PH_FRINFC_MIFARESTD_VAL0;
500 NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
502 NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
504 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
506 NdefMap->TLVStruct.prevLenByteValue = PH_FRINFC_MIFARESTD_VAL0;
508 NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
510 NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_VAL0;
512 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
514 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
516 NdefMap->StdMifareContainer.remainingSize = PH_FRINFC_MIFARESTD_VAL0;
518 NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
520 NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
522 NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG0;
524 NdefMap->StdMifareContainer.aidCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
526 NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
528 NdefMap->StdMifareContainer.ProprforumSectFlag = PH_FRINFC_MIFARESTD_PROP_1ST_CONFIG;
530 NdefMap->StdMifareContainer.ReadCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
532 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
534 NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
536 NdefMap->StdMifareContainer.ChkNdefCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
543 * \brief Check whether a particular Remote Device is NDEF compliant.
545 * The function checks whether the peer device is NDEF compliant.
547 * \param[in] NdefMap Pointer to a valid instance of the \ref phFriNfc_NdefMap_t
548 * structure describing the component context.
550 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
551 * \retval Others An error has occurred.
555 NFCSTATUS phFriNfc_MifareStdMap_ChkNdef( phFriNfc_NdefMap_t *NdefMap)
557 NFCSTATUS status = NFCSTATUS_PENDING;
561 if ( NdefMap == NULL)
563 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
567 /* set the data for additional data exchange*/
568 NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
569 NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
570 NdefMap->psDepAdditionalInfo.NAD = 0;
571 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
572 NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_CHK_NDEF;
574 /* Get the Select Response and Sense Response to get
575 the exact Card Type either Mifare 1k or 4k */
576 #ifndef PH_HAL4_ENABLE
577 sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo106.
579 atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.CardInfo106.
580 Startup106.SensRes[0];
582 sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
583 atq = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.AtqA[0];
584 PHNFC_UNUSED_VARIABLE(atq);
587 if (0x08 == (sak & 0x18))
589 /* Total Number of Blocks in Mifare 1k Card */
590 NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
591 PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK;
592 NdefMap->StdMifareContainer.remainingSize =
593 ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0)?
594 (PH_FRINFC_NDEFMAP_MIFARESTD_1KNDEF_COMPBLOCK *
595 PH_FRINFC_MIFARESTD_BLOCK_BYTES):
596 NdefMap->StdMifareContainer.remainingSize);
597 NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD;
601 /* Total Number of Blocks in Mifare 4k Card */
602 NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
603 PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK;
604 NdefMap->StdMifareContainer.remainingSize =
605 ((NdefMap->CardType == PH_FRINFC_MIFARESTD_VAL0)?
606 (PH_FRINFC_NDEFMAP_MIFARESTD_4KNDEF_COMPBLOCK *
607 PH_FRINFC_MIFARESTD_BLOCK_BYTES):
608 NdefMap->StdMifareContainer.remainingSize);
609 NdefMap->CardType = PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD;
613 /* phFriNfc_MifareStdMap_ChkNdef should be called only
614 when currentBlock is 0 OR 64,65 and 66 (for Mifare 4k).
615 Otherwise return error */
616 /* and also Check the Authentication Flag */
617 if((NdefMap->StdMifareContainer.currentBlock != 0) &&
618 (NdefMap->StdMifareContainer.currentBlock != 1) &&
619 (NdefMap->StdMifareContainer.currentBlock != 2) &&
620 (NdefMap->StdMifareContainer.currentBlock != 64) &&
621 (NdefMap->StdMifareContainer.currentBlock != 65) &&
622 (NdefMap->StdMifareContainer.currentBlock != 66) )
624 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
626 else if( NdefMap->StdMifareContainer.AuthDone == 0)
628 /* Block 0 contains Manufacturer information and
629 also other informaton. So go for block 1 which
630 contains AIDs. Authenticating any of the block
631 in a sector, Authenticates the whole sector */
632 if(NdefMap->StdMifareContainer.currentBlock == 0)
634 NdefMap->StdMifareContainer.currentBlock = 1;
637 status = phFriNfc_MifStd_H_AuthSector(NdefMap);
641 /* Mifare 1k, sak = 0x08 atq = 0x04
642 Mifare 4k, sak = 0x38 atq = 0x02 */
643 if ((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD) ||
644 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
646 /* Change the state to Check Ndef Compliant */
647 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP;
648 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_CHECK_OPE;
649 NdefMap->StdMifareContainer.ChkNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
651 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
652 NdefMap->MapCompletionInfo.Context = NdefMap;
654 #ifndef PH_HAL4_ENABLE
655 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
657 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
659 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
660 NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
661 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
663 /* Call the Overlapped HAL Transceive function */
664 status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
665 &NdefMap->MapCompletionInfo,
666 NdefMap->psRemoteDevInfo,
668 &NdefMap->psDepAdditionalInfo,
669 NdefMap->SendRecvBuf,
671 NdefMap->SendRecvBuf,
672 NdefMap->SendRecvLength);
676 /* Since we have decided temporarily not to go
677 for any new error codes we are using
678 NFCSTATUS_INVALID_PARAMETER even though it is not
679 the relevant error code here TBD */
680 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
689 * \brief Initiates Reading of NDEF information from the Remote Device.
691 * The function initiates the reading of NDEF information from a Remote Device.
692 * It performs a reset of the state and starts the action (state machine).
693 * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
694 * has been triggered.
696 NFCSTATUS phFriNfc_MifareStdMap_RdNdef( phFriNfc_NdefMap_t *NdefMap,
698 uint32_t *PacketDataLength,
701 NFCSTATUS status = NFCSTATUS_PENDING;
703 NdefMap->ApduBufferSize = *PacketDataLength;
704 NdefMap->NumOfBytesRead = PacketDataLength;
705 *NdefMap->NumOfBytesRead = 0;
706 NdefMap->ApduBuffIndex = 0;
707 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
708 NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_RD_NDEF;
710 if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
711 || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED))
713 /* Card state is not correct */
714 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
715 NFCSTATUS_INVALID_PARAMETER);
719 if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) || ( NdefMap->PrevOperation ==
720 PH_FRINFC_NDEFMAP_WRITE_OPE))
722 phFriNfc_MifStd_H_RdWrReset(NdefMap);
723 NdefMap->StdMifareContainer.ReadNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
724 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
726 /* Offset = Current, but the read has reached the End of Card */
727 if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
728 (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
729 PH_FRINFC_MIFARESTD_FLAG1))
731 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
735 NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
736 ( NdefMap->PrevOperation ==
737 PH_FRINFC_NDEFMAP_WRITE_OPE))?
738 PH_FRINFC_NDEFMAP_SEEK_BEGIN:
740 status = phFriNfc_MifStd_H_BlkChk(NdefMap);
741 if(status == NFCSTATUS_SUCCESS)
743 NdefMap->ApduBuffer = PacketData;
745 /* Read Operation in Progress */
746 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
748 /* Check Authentication Flag */
750 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
751 phFriNfc_MifStd_H_RdABlock(NdefMap):
752 phFriNfc_MifStd_H_AuthSector(NdefMap));
760 * \brief Initiates Writing of NDEF information to the Remote Device.
762 * The function initiates the writing of NDEF information to a Remote Device.
763 * It performs a reset of the state and starts the action (state machine).
764 * A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
765 * has been triggered.
767 NFCSTATUS phFriNfc_MifareStdMap_WrNdef( phFriNfc_NdefMap_t *NdefMap,
769 uint32_t *PacketDataLength,
772 NFCSTATUS status = NFCSTATUS_PENDING;
774 NdefMap->ApduBuffer = PacketData;
775 NdefMap->ApduBufferSize = *PacketDataLength;
776 NdefMap->ApduBuffIndex = PH_FRINFC_MIFARESTD_VAL0;
777 NdefMap->WrNdefPacketLength = PacketDataLength;
778 *NdefMap->WrNdefPacketLength = PH_FRINFC_MIFARESTD_VAL0;
779 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
780 NdefMap->StdMifareContainer.CRIndex = PH_FRINFC_NDEFMAP_CR_WR_NDEF;
782 if((NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
783 || (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY))
785 /* Card state is not correct */
786 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
787 NFCSTATUS_INVALID_PARAMETER);
791 if( (Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN) ||
792 (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE))
794 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
795 NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
796 NdefMap->StdMifareContainer.WrNdefFlag = PH_FRINFC_MIFARESTD_FLAG1;
797 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
798 NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
799 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
800 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
801 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
802 NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
803 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
804 NdefMap->StdMifareContainer.remainingSize =
805 (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
806 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
807 NdefMap->StdMifareContainer.currentBlock =
808 PH_FRINFC_MIFARESTD_BLK4;
809 NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
810 NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
811 /* This macro is added, to be compliant with the previous HAL 2.0
812 For HAL 2.0, polling is done before writing data to the mifare
813 std (if the offset is BEGIN), because if an error is reported
814 during read or write and again write is called, the PN531 state is
815 unchanged (so write will fail), to bring the PN531 to the correct
816 state, polling is done.
817 Changed on 13th Jan 2009
819 #ifdef PH_HAL4_ENABLE
820 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
822 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
823 #endif /* #ifdef PH_HAL4_ENABLE */
824 NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
825 NdefMap->StdMifareContainer.FirstWriteFlag = PH_FRINFC_MIFARESTD_FLAG1;
828 if(((Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
829 (NdefMap->StdMifareContainer.ReadWriteCompleteFlag ==
830 PH_FRINFC_MIFARESTD_FLAG1)) || ((NdefMap->StdMifareContainer.PollFlag ==
831 PH_FRINFC_MIFARESTD_FLAG1) && (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)))
833 /* Offset = Current, but the read has reached the End of Card */
834 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
835 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
839 NdefMap->Offset = (((Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN) &&
840 ( NdefMap->PrevOperation ==
841 PH_FRINFC_NDEFMAP_READ_OPE))?
842 PH_FRINFC_NDEFMAP_SEEK_BEGIN:
844 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
845 status = phFriNfc_MifStd_H_BlkChk(NdefMap);
846 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
847 if(status == NFCSTATUS_SUCCESS)
849 if(NdefMap->StdMifareContainer.PollFlag ==
850 PH_FRINFC_MIFARESTD_FLAG1)
852 /* if poll flag is set then call disconnect because the authentication
853 has failed so reactivation of card is required */
854 status = phFriNfc_MifStd_H_CallDisCon(NdefMap);
856 /* Check Authentication Flag */
857 else if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
859 status = ((NdefMap->Offset ==
860 PH_FRINFC_NDEFMAP_SEEK_BEGIN)?
861 phFriNfc_MifStd_H_RdBeforeWr(NdefMap):
862 phFriNfc_MifStd_H_WrABlock(NdefMap));
866 status = phFriNfc_MifStd_H_AuthSector(NdefMap);
876 * \brief Completion Routine, Processing function, needed to avoid long blocking.
877 * \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
878 * Routine in order to be able to notify the component that an I/O has finished and data are
879 * ready to be processed.
883 void phFriNfc_MifareStdMap_Process( void *Context,
887 phFriNfc_NdefMap_t *NdefMap;
889 uint8_t NDEFFlag = 0,
895 NdefMap = (phFriNfc_NdefMap_t *)Context;
898 if((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER))
900 switch(NdefMap->State)
902 case PH_FRINFC_NDEFMAP_STATE_CHK_NDEF_COMP:
903 Status = phFriNfc_MifStd_H_ProChkNdef(NdefMap);
904 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
905 PH_FRINFC_MIFARESTD_FLAG1:
906 PH_FRINFC_MIFARESTD_FLAG0);
909 case PH_FRINFC_NDEFMAP_STATE_READ:
911 /* Receive Length for read shall always be equal to 16 */
912 if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
913 (NdefMap->ApduBuffIndex < (uint16_t)NdefMap->ApduBufferSize))
915 Temp16Bytes = PH_FRINFC_MIFARESTD_VAL0;
916 NDEFFlag = (uint8_t)PH_FRINFC_MIFARESTD_FLAG1;
917 if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
919 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
920 CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
921 /* To read the remaining length (L) in TLV */
922 Status = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &Temp16Bytes);
923 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
924 PH_FRINFC_MIFARESTD_FLAG1:
925 PH_FRINFC_MIFARESTD_FLAG0);
928 /* check the NDEFFlag is set. if this is not set, then
929 in the above RemainTLV function all the 16 bytes has been
932 if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
933 (NdefMap->TLVStruct.NdefTLVFoundFlag ==
934 PH_FRINFC_MIFARESTD_FLAG1))
936 /* if the block is NDEF TLV then get data from here */
937 Status = phFriNfc_MifStd_H_RdNdefTLV(NdefMap, &Temp16Bytes);
943 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_RECEIVE_LENGTH);
944 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
948 case PH_FRINFC_NDEFMAP_STATE_WRITE:
949 Status = phFriNfc_MifStd_H_ProWrABlock(NdefMap);
950 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
951 PH_FRINFC_MIFARESTD_FLAG1:
952 PH_FRINFC_MIFARESTD_FLAG0);
954 /* Call Completion Routine if CR Flag is Set to 1 */
955 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
957 *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
961 case PH_FRINFC_NDEFMAP_STATE_AUTH:
962 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
963 Status = phFriNfc_MifStd_H_ProAuth(NdefMap);
964 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
965 PH_FRINFC_MIFARESTD_FLAG1:
966 PH_FRINFC_MIFARESTD_FLAG0);
969 case PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT:
970 Status = phFriNfc_MifStd_H_ProAcsBits(NdefMap);
971 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
972 PH_FRINFC_MIFARESTD_FLAG1:
973 PH_FRINFC_MIFARESTD_FLAG0);
976 case PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN:
977 if(NdefMap->StdMifareContainer.RdAfterWrFlag ==
978 PH_FRINFC_MIFARESTD_FLAG1)
980 Status = phFriNfc_MifStd_H_CallWrNdefLen(NdefMap);
981 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
982 PH_FRINFC_MIFARESTD_FLAG1:
983 PH_FRINFC_MIFARESTD_FLAG0);
988 if(NdefMap->StdMifareContainer.TempBlockNo ==
989 NdefMap->StdMifareContainer.currentBlock)
991 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
992 NdefMap->StdMifareContainer.Buffer,
993 NdefMap->StdMifareContainer.internalLength);
995 *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
996 NdefMap->StdMifareContainer.currentBlock =
997 NdefMap->StdMifareContainer.TempBlockNo;
998 NdefMap->CardState = (uint8_t)((NdefMap->CardState ==
999 PH_NDEFMAP_CARD_STATE_INITIALIZED)?
1000 PH_NDEFMAP_CARD_STATE_READ_WRITE:
1001 NdefMap->CardState);
1002 CRFlag = (uint8_t)PH_FRINFC_MIFARESTD_FLAG1;
1004 /*NdefMap->StdMifareContainer.remainingSize -=
1005 (((NdefMap->ApduBufferSize) > (PH_FRINFC_MIFARESTD_NDEFTLV_L -
1006 PH_FRINFC_MIFARESTD_VAL1))?
1007 ((uint16_t)(*NdefMap->WrNdefPacketLength +
1008 PH_FRINFC_MIFARESTD_VAL4)):
1009 ((uint16_t)(*NdefMap->WrNdefPacketLength +
1010 PH_FRINFC_MIFARESTD_VAL2)));*/
1013 case PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN:
1014 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1015 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1016 NFCSTATUS_INVALID_DEVICE_REQUEST);
1017 if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
1019 /* Size of NdefMap->SendRecvBuf is set by phLibNfc_Gen_NdefMapReset to PH_LIBNFC_GEN_MAX_BUFFER */
1020 /* We don't have to check memory here */
1021 for (i = PH_FRINFC_MIFARESTD_BYTES_READ; i > 0; i--)
1023 NdefMap->SendRecvBuf[i] = NdefMap->SendRecvBuf[i-1];
1025 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
1026 NdefMap->StdMifareContainer.currentBlock;
1027 Status = phFriNfc_MifStd_H_WriteNdefLen(NdefMap);
1028 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1029 PH_FRINFC_MIFARESTD_FLAG1:
1030 PH_FRINFC_MIFARESTD_FLAG0);
1034 case PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE:
1035 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
1036 if(NdefMap->TLVStruct.NoLbytesinTLV > PH_FRINFC_MIFARESTD_VAL0)
1038 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
1039 Status = phFriNfc_MifStd_H_ChkRemainTLVs(NdefMap, &CRFlag, &NDEFFlag);
1040 NdefMap->TLVStruct.NoLbytesinTLV =
1041 PH_FRINFC_MIFARESTD_VAL0;
1043 if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
1044 (CRFlag != PH_FRINFC_MIFARESTD_FLAG1))
1046 Status = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
1048 if(((NdefMap->StdMifareContainer.ReadNdefFlag ==
1049 PH_FRINFC_MIFARESTD_FLAG1) ||
1050 (NdefMap->StdMifareContainer.WrNdefFlag ==
1051 PH_FRINFC_MIFARESTD_FLAG1))&&
1052 (Status != NFCSTATUS_PENDING))
1054 NdefMap->StdMifareContainer.NFCforumSectFlag =
1055 PH_FRINFC_MIFARESTD_FLAG1;
1056 CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
1057 /* if the card state has changed to initialised and
1058 read ndef is called then error is returned */
1059 if(((NdefMap->StdMifareContainer.WrNdefFlag ==
1060 PH_FRINFC_MIFARESTD_FLAG1) &&
1061 (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY)) ||
1062 ((NdefMap->StdMifareContainer.ReadNdefFlag ==
1063 PH_FRINFC_MIFARESTD_FLAG1) &&
1064 (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)))
1066 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1067 NFCSTATUS_NO_NDEF_SUPPORT);
1069 if(NdefMap->StdMifareContainer.AuthDone ==
1070 PH_FRINFC_MIFARESTD_FLAG0)
1072 Status = phFriNfc_MifStd_H_AuthSector(NdefMap);
1076 Status = ((NdefMap->StdMifareContainer.ReadNdefFlag ==
1077 PH_FRINFC_MIFARESTD_FLAG1)?
1078 phFriNfc_MifStd_H_RdTLV(NdefMap):
1079 phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
1081 NdefMap->StdMifareContainer.ReadNdefFlag =
1082 PH_FRINFC_MIFARESTD_FLAG0;
1083 NdefMap->StdMifareContainer.WrNdefFlag =
1084 PH_FRINFC_MIFARESTD_FLAG0;
1087 if(NdefMap->StdMifareContainer.ChkNdefFlag ==
1088 PH_FRINFC_MIFARESTD_FLAG1)
1090 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1091 PH_FRINFC_MIFARESTD_FLAG1:
1092 PH_FRINFC_MIFARESTD_FLAG0);
1096 case PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR:
1097 /* Read flag says that already part of TLV has been written */
1098 Status = phFriNfc_MifStd_H_ProBytesToWr(NdefMap);
1099 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1100 PH_FRINFC_MIFARESTD_FLAG1:
1101 PH_FRINFC_MIFARESTD_FLAG0);
1104 case PH_FRINFC_NDEFMAP_STATE_WR_TLV:
1105 Status = phFriNfc_MifStd_H_ProWrTLV(NdefMap);
1106 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1107 PH_FRINFC_MIFARESTD_FLAG1:
1108 PH_FRINFC_MIFARESTD_FLAG0);
1111 case PH_FRINFC_NDEFMAP_STATE_RD_TLV:
1112 Status = phFriNfc_MifStd_H_ProRdTLV(NdefMap);
1113 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1114 PH_FRINFC_MIFARESTD_FLAG1:
1115 PH_FRINFC_MIFARESTD_FLAG0);
1118 case PH_FRINFC_NDEFMAP_STATE_TERM_TLV:
1119 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
1120 NdefMap->StdMifareContainer.currentBlock =
1121 NdefMap->TLVStruct.NdefTLVBlock;
1122 Status = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
1123 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1124 PH_FRINFC_MIFARESTD_FLAG1:
1125 PH_FRINFC_MIFARESTD_FLAG0);
1128 case PH_FRINFC_NDEFMAP_STATE_DISCONNECT:
1129 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG0;
1131 #ifndef PH_HAL4_ENABLE
1132 Status = phFriNfc_MifStd_H_CallPoll(NdefMap);
1133 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1134 PH_FRINFC_MIFARESTD_FLAG1:
1135 PH_FRINFC_MIFARESTD_FLAG0);
1138 case PH_FRINFC_NDEFMAP_STATE_POLL:
1140 Status = phFriNfc_MifStd_H_CallConnect(NdefMap);
1141 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1142 PH_FRINFC_MIFARESTD_FLAG1:
1143 PH_FRINFC_MIFARESTD_FLAG0);
1146 case PH_FRINFC_NDEFMAP_STATE_CONNECT:
1147 if(NdefMap->StdMifareContainer.FirstReadFlag == PH_FRINFC_MIFARESTD_FLAG1)
1149 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG0;
1150 Status = phFriNfc_MifStd_H_AuthSector(NdefMap);
1154 Status = ((((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) &&
1155 (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE)) ||
1156 (NdefMap->StdMifareContainer.WrLength >
1157 PH_FRINFC_MIFARESTD_VAL0))?
1158 phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Status):
1159 phFriNfc_MifStd_H_AuthSector(NdefMap));
1161 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1162 PH_FRINFC_MIFARESTD_FLAG1:
1163 PH_FRINFC_MIFARESTD_FLAG0);
1167 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1168 NFCSTATUS_INVALID_DEVICE_REQUEST);
1169 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1173 else if(NdefMap->State == PH_FRINFC_NDEFMAP_STATE_AUTH)
1175 NdefMap->StdMifareContainer.PollFlag = PH_FRINFC_MIFARESTD_FLAG1;
1176 if(NdefMap->StdMifareContainer.FirstWriteFlag ==
1177 PH_FRINFC_MIFARESTD_FLAG1)
1179 NdefMap->StdMifareContainer.FirstWriteFlag =
1180 PH_FRINFC_MIFARESTD_FLAG0;
1181 NdefMap->StdMifareContainer.WrLength =
1182 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
1183 PH_FRINFC_MIFARESTD_FLAG0)?
1184 PH_FRINFC_MIFARESTD_VAL1:
1185 NdefMap->StdMifareContainer.WrLength);
1187 /*if(NdefMap->StdMifareContainer.WrLength != PH_FRINFC_MIFARESTD_VAL0)
1189 Status = NFCSTATUS_SUCCESS;
1190 NdefMap->StdMifareContainer.ReadCompleteFlag =
1191 PH_FRINFC_MIFARESTD_FLAG1;
1192 *NdefMap->WrNdefPacketLength = NdefMap->ApduBuffIndex;
1193 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1195 else*/ if(NdefMap->StdMifareContainer.WrLength == PH_FRINFC_MIFARESTD_VAL0)
1197 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1198 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
1199 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1203 /* Authentication has failed */
1204 Status = phFriNfc_MifStd_H_CallDisCon(NdefMap);
1205 CRFlag = (uint8_t)((Status != NFCSTATUS_PENDING)?
1206 PH_FRINFC_MIFARESTD_FLAG1:
1207 PH_FRINFC_MIFARESTD_FLAG0);
1212 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1213 NFCSTATUS_INVALID_DEVICE_REQUEST);
1214 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
1216 /* Call Completion Routine if CR Flag is Set to 1 */
1217 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
1219 phFriNfc_MifStd_H_Complete(NdefMap, Status);
1223 static NFCSTATUS phFriNfc_MifStd_H_RdABlock(phFriNfc_NdefMap_t *NdefMap)
1225 NFCSTATUS status = NFCSTATUS_PENDING;
1227 /* set the data for additional data exchange*/
1228 NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
1229 NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
1230 NdefMap->psDepAdditionalInfo.NAD = 0;
1232 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_READ;
1233 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
1234 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1235 NdefMap->MapCompletionInfo.Context = NdefMap;
1237 if( NdefMap->ApduBuffIndex <
1238 (uint16_t)NdefMap->ApduBufferSize)
1241 if(NdefMap->StdMifareContainer.internalLength > PH_FRINFC_MIFARESTD_VAL0)
1243 status = phFriNfc_MifStd_H_ChkIntLen(NdefMap);
1244 }/* internal Length Check */
1247 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
1248 NdefMap->StdMifareContainer.currentBlock;
1249 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
1250 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1252 #ifndef PH_HAL4_ENABLE
1253 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
1255 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
1257 /* Call the Overlapped HAL Transceive function */
1258 status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
1259 &NdefMap->MapCompletionInfo,
1260 NdefMap->psRemoteDevInfo,
1262 &NdefMap->psDepAdditionalInfo,
1263 NdefMap->SendRecvBuf,
1264 NdefMap->SendLength,
1265 NdefMap->SendRecvBuf,
1266 NdefMap->SendRecvLength);
1271 /* Check for the Card Size */
1272 if((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
1273 NdefMap->StdMifareContainer.NdefBlocks) *
1274 PH_FRINFC_MIFARESTD_BYTES_READ) == 0) ||
1275 (NdefMap->ApduBufferSize == NdefMap->ApduBuffIndex))
1277 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
1278 (uint8_t)((((NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
1279 NdefMap->StdMifareContainer.NdefBlocks) *
1280 PH_FRINFC_MIFARESTD_BYTES_READ) == 0)?
1281 PH_FRINFC_MIFARESTD_FLAG1:
1282 PH_FRINFC_MIFARESTD_FLAG0);
1283 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
1284 status = PHNFCSTVAL(CID_NFC_NONE,
1289 /*Error: The control should not ideally come here.
1291 #ifndef PH_HAL4_ENABLE
1292 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
1294 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
1302 static NFCSTATUS phFriNfc_MifStd_H_WrABlock(phFriNfc_NdefMap_t *NdefMap)
1304 NFCSTATUS status = NFCSTATUS_PENDING;
1306 uint16_t RemainingBytes = 0,
1310 uint8_t Temp16Bytes = 0;
1312 /* set the data for additional data exchange*/
1313 NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
1314 NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
1315 NdefMap->psDepAdditionalInfo.NAD = 0;
1316 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1317 NdefMap->MapCompletionInfo.Context = NdefMap;
1318 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
1320 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WRITE;
1322 /* User Buffer Check */
1323 if( NdefMap->ApduBuffIndex <
1324 (uint16_t)NdefMap->ApduBufferSize)
1326 RemainingBytes = (((uint16_t)(NdefMap->ApduBufferSize -
1327 NdefMap->ApduBuffIndex) <
1328 NdefMap->StdMifareContainer.remainingSize )?
1329 (uint16_t)(NdefMap->ApduBufferSize -
1330 NdefMap->ApduBuffIndex):
1331 NdefMap->StdMifareContainer.remainingSize);
1333 NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
1334 Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
1335 /* Check for internal bytes */
1337 if(NdefMap->StdMifareContainer.internalLength > 0)
1339 /* copy the bytes previously written in the internal Buffer */
1340 (void)memcpy(&( NdefMap->SendRecvBuf[Temp16Bytes]),
1341 NdefMap->StdMifareContainer.internalBuf,
1342 NdefMap->StdMifareContainer.internalLength);
1344 Temp16Bytes += (uint8_t)(NdefMap->StdMifareContainer.internalLength);
1345 if(RemainingBytes >= ( MIFARE_MAX_SEND_BUF_TO_WRITE -
1348 /* Copy the Remaining bytes from the user buffer to make the send
1349 data and length = 16 */
1350 (void)memcpy(&(NdefMap->SendRecvBuf[Temp16Bytes]),
1351 NdefMap->ApduBuffer,
1352 (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
1354 NdefMap->NumOfBytesWritten =
1355 (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1356 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1357 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1361 (void)memcpy(&(NdefMap->SendRecvBuf[Temp16Bytes]),
1362 NdefMap->ApduBuffer,
1365 NdefMap->StdMifareContainer.internalBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
1366 NdefMap->NumOfBytesWritten = RemainingBytes;
1367 Temp16Bytes += (uint8_t)(RemainingBytes);
1368 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1370 BytesRemained = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1371 /* Pad empty bytes with Zeroes to complete 16 bytes*/
1372 for(index = 0; index < BytesRemained; index++)
1374 NdefMap->SendRecvBuf[(Temp16Bytes + index)] =
1375 (uint8_t)((index == PH_FRINFC_MIFARESTD_VAL0)?
1376 PH_FRINFC_MIFARESTD_TERMTLV_T:
1377 PH_FRINFC_MIFARESTD_NULLTLV_T);
1378 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
1380 Temp16Bytes += (uint8_t)(BytesRemained);
1385 if(RemainingBytes >= (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes))
1387 /* Bytes left to write < 16
1388 copy remaining bytes */
1389 (void)memcpy( &(NdefMap->SendRecvBuf[
1391 &(NdefMap->ApduBuffer[
1392 NdefMap->ApduBuffIndex]),
1393 (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes));
1395 NdefMap->NumOfBytesWritten = (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1396 Temp16Bytes += (MIFARE_MAX_SEND_BUF_TO_WRITE - Temp16Bytes);
1397 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1401 /* Bytes left to write < 16
1402 copy remaining bytes */
1403 (void)memcpy(&(NdefMap->SendRecvBuf[
1405 &(NdefMap->ApduBuffer[
1406 NdefMap->ApduBuffIndex]),
1409 NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_FLAG1;
1410 NdefMap->NumOfBytesWritten = RemainingBytes;
1411 Temp16Bytes += (uint8_t)(RemainingBytes);
1412 *NdefMap->DataCount = (Temp16Bytes - PH_FRINFC_MIFARESTD_VAL1);
1415 /* Pad empty bytes with Zeroes to complete 16 bytes*/
1416 for(index = Temp16Bytes; index < MIFARE_MAX_SEND_BUF_TO_WRITE; index++)
1418 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
1420 PH_FRINFC_MIFARESTD_TERMTLV_T:
1421 PH_FRINFC_MIFARESTD_NULLTLV_T);
1423 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
1427 /* Buffer to store 16 bytes which is writing to the present block */
1428 (void)memcpy( NdefMap->StdMifareContainer.Buffer,
1429 &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_INC_1]),
1430 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
1432 /* Write from here */
1433 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
1434 #ifndef PH_HAL4_ENABLE
1435 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
1437 NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
1439 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1440 /* Call the Overlapped HAL Transceive function */
1441 status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
1442 &NdefMap->MapCompletionInfo,
1443 NdefMap->psRemoteDevInfo,
1445 &NdefMap->psDepAdditionalInfo,
1446 NdefMap->SendRecvBuf,
1447 NdefMap->SendLength,
1448 NdefMap->SendRecvBuf,
1449 NdefMap->SendRecvLength);
1451 else/* Check User Buffer */
1453 if(NdefMap->StdMifareContainer.NdefBlocks >
1454 NdefMap->StdMifareContainer.NoOfNdefCompBlocks)
1456 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
1457 PH_FRINFC_MIFARESTD_FLAG1;
1458 status = PHNFCSTVAL(CID_NFC_NONE,
1461 else if( NdefMap->ApduBuffIndex ==
1462 (uint16_t)NdefMap->ApduBufferSize)
1464 status = PHNFCSTVAL(CID_NFC_NONE,
1469 /*Error: The control should not ideally come here.
1471 #ifndef PH_HAL4_ENABLE
1472 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_CMD_ABORTED);
1474 status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_FAILED);
1481 static NFCSTATUS phFriNfc_MifStd_H_AuthSector(phFriNfc_NdefMap_t *NdefMap)
1483 NFCSTATUS status = NFCSTATUS_PENDING;
1485 /* set the data for additional data exchange*/
1486 NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
1487 NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
1488 NdefMap->psDepAdditionalInfo.NAD = 0;
1489 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
1490 NdefMap->MapCompletionInfo.Context = NdefMap;
1492 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1493 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_AUTH;
1496 #ifndef PH_HAL4_ENABLE
1497 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentA;
1499 NdefMap->Cmd.MfCmd = phHal_eMifareAuthentA;
1501 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
1502 ((NdefMap->TLVStruct.NdefTLVAuthFlag ==
1503 PH_FRINFC_MIFARESTD_FLAG1)?
1504 NdefMap->TLVStruct.NdefTLVBlock:
1505 NdefMap->StdMifareContainer.currentBlock);
1507 /* if MAD blocks then authentication key is
1508 0xA0, 0xA1, 0xA2, 0xA3, 0xA4, 0xA5 else
1509 0xD3, 0xF7, 0xD3, 0xF7, 0xD3, 0xF7 */
1510 if(( (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK0) &&
1511 (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK1) &&
1512 (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK2) &&
1513 (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK64) &&
1514 (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK65) &&
1515 (NdefMap->StdMifareContainer.currentBlock != PH_FRINFC_MIFARESTD_MAD_BLK66)) ||
1516 (NdefMap->TLVStruct.NdefTLVAuthFlag ==
1517 (uint8_t)PH_FRINFC_MIFARESTD_FLAG1))
1519 NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1520 NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1521 NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1522 NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1523 NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT1; /* 0xD3 */
1524 NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_NDEFSECT2; /* 0xF7 */
1528 NdefMap->SendRecvBuf[1] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT1; /* 0xA0 */
1529 NdefMap->SendRecvBuf[2] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT2; /* 0xA1 */
1530 NdefMap->SendRecvBuf[3] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT3; /* 0xA2 */
1531 NdefMap->SendRecvBuf[4] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT4; /* 0xA3 */
1532 NdefMap->SendRecvBuf[5] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT5; /* 0xA4 */
1533 NdefMap->SendRecvBuf[6] = PH_FRINFC_NDEFMAP_MIFARESTD_AUTH_MADSECT6; /* 0xA5 */
1536 NdefMap->SendLength = MIFARE_AUTHENTICATE_CMD_LENGTH;
1537 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
1538 /* Call the Overlapped HAL Transceive function */
1539 status = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
1540 &NdefMap->MapCompletionInfo,
1541 NdefMap->psRemoteDevInfo,
1543 &NdefMap->psDepAdditionalInfo,
1544 NdefMap->SendRecvBuf,
1545 NdefMap->SendLength,
1546 NdefMap->SendRecvBuf,
1547 NdefMap->SendRecvLength);
1552 static void phFriNfc_MifStd_H_Complete(phFriNfc_NdefMap_t *NdefMap,
1555 /* set the state back to the Reset_Init state*/
1556 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
1558 /* set the completion routine*/
1559 NdefMap->CompletionRoutine[NdefMap->StdMifareContainer.CRIndex].
1560 CompletionRoutine(NdefMap->CompletionRoutine->Context, Result);
1563 static NFCSTATUS phFriNfc_MifStd4k_H_CheckNdef(phFriNfc_NdefMap_t *NdefMap)
1565 NFCSTATUS Result = NFCSTATUS_SUCCESS;
1567 /* Get the AID Block */
1568 if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2)
1570 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK64;
1571 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
1573 else if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1575 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK65;
1579 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_MAD_BLK66;
1582 Result = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
1588 static void phFriNfc_MifStd_H_fillAIDarray(phFriNfc_NdefMap_t *NdefMap)
1590 uint8_t byteindex = 0;
1592 if( (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
1593 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64))
1595 /* The First Two Bytes in Receive Buffer
1596 are CRC bytes so it is not copied
1597 instead, 0 is copied in AID[0] & AID[1] */
1598 NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
1599 PH_FRINFC_MIFARESTD_NDEF_COMP;
1600 NdefMap->StdMifareContainer.SectorIndex++;
1604 while(byteindex < PH_FRINFC_MIFARESTD_BYTES_READ)
1606 if((NdefMap->SendRecvBuf[byteindex] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL2) &&
1607 (NdefMap->SendRecvBuf[(byteindex + 1)] == PH_FRINFC_NDEFMAP_MIFARESTD_NDEF_COMPVAL1))
1609 /* This flag is set when a NFC forum sector is found in a
1610 MAD block for the first time*/
1611 NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG1;
1612 NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
1613 PH_FRINFC_MIFARESTD_NDEF_COMP;
1614 NdefMap->StdMifareContainer.SectorIndex++;
1618 NdefMap->StdMifareContainer.aid[NdefMap->StdMifareContainer.SectorIndex] =
1619 PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1620 NdefMap->StdMifareContainer.SectorIndex++;
1621 /* AID complete flag is set when a non NFC forum sector is found in a
1622 MAD block after the NFC forum sector. After setting this, all other
1623 values are ignored and are NOT NDEF compliant */
1624 NdefMap->StdMifareContainer.aidCompleteFlag =
1625 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
1626 PH_FRINFC_MIFARESTD_FLAG1)?
1627 PH_FRINFC_MIFARESTD_FLAG1:
1628 PH_FRINFC_MIFARESTD_FLAG0);
1630 NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
1631 if(NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1)
1639 /* If "aidCompleteFlag" is set then the remaining sectors are made NOT
1641 if((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
1642 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
1644 /* for Mifare 1k there are 16 sectors, till this number all sectors
1645 are made NOT NDEF compliant */
1646 for(byteindex = NdefMap->StdMifareContainer.SectorIndex;
1647 byteindex < PH_FRINFC_MIFARESTD1K_TOTAL_SECTOR;
1650 NdefMap->StdMifareContainer.aid[byteindex] =
1651 PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1656 /* for Mifare 4k there are 40 sectors, till this number all sectors
1657 are made NOT NDEF compliant */
1658 if((NdefMap->StdMifareContainer.aidCompleteFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
1659 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
1661 for(byteindex = NdefMap->StdMifareContainer.SectorIndex;
1662 byteindex < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR;
1665 NdefMap->StdMifareContainer.aid[byteindex] =
1666 PH_FRINFC_MIFARESTD_NON_NDEF_COMP;
1672 static NFCSTATUS phFriNfc_MifStd_H_BlkChk(phFriNfc_NdefMap_t *NdefMap)
1674 NFCSTATUS Result = NFCSTATUS_SUCCESS;
1675 uint8_t SectorID = 0, callbreak = 0;
1679 /* Get a Sector ID for the Current Block */
1680 SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
1681 /* Check the card Type 1k or 4k */
1682 /* enter if Mifare 1k card. For Mifare 4k go to else */
1683 if(NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)
1685 /* if Sector Id > 15 No Sectors to write */
1688 SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
1689 /*Error: No Ndef Compliant Sectors present.*/
1690 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1691 NFCSTATUS_INVALID_PARAMETER);
1696 phFriNfc_MifStd1k_H_BlkChk(NdefMap, SectorID, &callbreak);
1698 } /* End of if */ /* End of Mifare 1k check */
1699 else /* Mifare 4k check starts here */
1701 /* Sector > 39 no ndef compliant sectors found*/
1702 if(SectorID > PH_FRINFC_MIFARESTD_SECTOR_NO39)
1704 /*Error: No Ndef Compliant Sectors present.*/
1705 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
1706 NFCSTATUS_INVALID_PARAMETER);
1709 else if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64)
1711 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1713 else if(SectorID < PH_FRINFC_MIFARESTD_SECTOR_NO32) /* sector < 32 contains 4 blocks in each sector */
1715 /* If the block checked is 63, the 3 blocks after this
1716 are AID(MAD) blocks so its need to be skipped */
1717 if(NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK63)
1719 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
1723 phFriNfc_MifStd1k_H_BlkChk(NdefMap, SectorID, &callbreak);
1728 /* every last block of a sector needs to be skipped */
1729 if(((NdefMap->StdMifareContainer.currentBlock + 1) %
1730 PH_FRINFC_MIFARESTD_BLOCK_BYTES) == 0)
1732 NdefMap->StdMifareContainer.currentBlock++;
1736 if(NdefMap->StdMifareContainer.aid[SectorID] ==
1737 PH_FRINFC_MIFARESTD_NDEF_COMP)
1739 /* Check whether the block is first block of a (next)new sector and
1740 also check if it is first block then internal length is zero
1741 or not. Because once Authentication is done for the sector again
1742 we should not authenticate it again */
1743 /* In this case 32 sectors contains 4 blocks and next remaining 8 sectors
1744 contains 16 blocks that is why (32 * 4) + (sectorID - 32) *16*/
1745 if((NdefMap->StdMifareContainer.currentBlock ==
1746 ((PH_FRINFC_MIFARESTD_SECTOR_NO32 * PH_FRINFC_MIFARESTD_BLK4) +
1747 ((SectorID - PH_FRINFC_MIFARESTD_SECTOR_NO32) * PH_FRINFC_MIFARESTD_BLOCK_BYTES))) &&
1748 (NdefMap->StdMifareContainer.internalLength == 0))
1750 NdefMap->StdMifareContainer.AuthDone = 0;
1756 NdefMap->StdMifareContainer.currentBlock += 16;
1770 static uint8_t phFriNfc_MifStd_H_GetSect(uint8_t BlockNumber)
1772 uint8_t SectorID = 0;
1774 if(BlockNumber >= PH_FRINFC_MIFARESTD4K_BLK128)
1776 SectorID = (uint8_t)(PH_FRINFC_MIFARESTD_SECTOR_NO32 +
1777 ((BlockNumber - PH_FRINFC_MIFARESTD4K_BLK128)/
1778 PH_FRINFC_MIFARESTD_BLOCK_BYTES));
1782 SectorID = (BlockNumber/PH_FRINFC_MIFARESTD_BLK4);
1787 static NFCSTATUS phFriNfc_MifStd_H_RdAcsBit(phFriNfc_NdefMap_t *NdefMap)
1789 NFCSTATUS Result = NFCSTATUS_SUCCESS;
1790 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_ACS_BIT;
1792 if(NdefMap->StdMifareContainer.ReadAcsBitFlag == PH_FRINFC_MIFARESTD_FLAG1)
1794 /* Get the sector trailer */
1795 ((NdefMap->StdMifareContainer.currentBlock > 127)?
1796 phFriNfc_MifStd_H_Get4kStTrail(NdefMap):
1797 phFriNfc_MifStd_H_Get1kStTrail(NdefMap));
1801 /* Give the current block to read */
1802 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
1803 NdefMap->StdMifareContainer.currentBlock;
1806 Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
1807 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0]);
1812 static NFCSTATUS phFriNfc_MifStd_H_ChkAcsBit(phFriNfc_NdefMap_t *NdefMap)
1814 NFCSTATUS Result = NFCSTATUS_SUCCESS;
1816 /* Blocks from 0 to 3 and from 64 to 67(MAD blocks) */
1817 if((NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK0) ||
1818 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK1) ||
1819 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK2) ||
1820 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK3) ||
1821 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK64) ||
1822 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK65) ||
1823 (NdefMap->StdMifareContainer.currentBlock == PH_FRINFC_MIFARESTD_MAD_BLK66) )
1825 /* Access bits check removed for the MAD blocks */
1826 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1828 if(((NdefMap->SendRecvBuf[
1829 PH_FRINFC_MIFARESTD_VAL6] &
1830 PH_FRINFC_MIFARESTD_MASK_FF) ==
1831 PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE6) &&
1832 ((NdefMap->SendRecvBuf[
1833 PH_FRINFC_MIFARESTD_VAL7] &
1834 PH_FRINFC_MIFARESTD_MASK_FF) ==
1835 PH_FRINFC_MIFARESTD_MADSECT_ACS_BYTE7) &&
1836 ((NdefMap->SendRecvBuf[
1837 PH_FRINFC_MIFARESTD_VAL8] &
1838 PH_FRINFC_MIFARESTD_MASK_FF) ==
1839 PH_FRINFC_MIFARESTD_ACS_BYTE8))
1841 NdefMap->StdMifareContainer.WriteFlag =
1842 PH_FRINFC_MIFARESTD_FLAG0;
1843 NdefMap->StdMifareContainer.ReadFlag =
1844 PH_FRINFC_MIFARESTD_FLAG1;
1848 NdefMap->StdMifareContainer.WriteFlag =
1849 PH_FRINFC_MIFARESTD_FLAG0;
1850 NdefMap->StdMifareContainer.ReadFlag =
1851 PH_FRINFC_MIFARESTD_FLAG0;
1854 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1856 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED;
1858 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1862 /* Check for Access bytes 6, 7 and 8 value =
1863 0x7F, 0x07, 0x88 NFC forum sectors*/
1864 if(((NdefMap->SendRecvBuf[
1865 PH_FRINFC_MIFARESTD_VAL6] &
1866 PH_FRINFC_MIFARESTD_MASK_FF) ==
1867 PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE6) &&
1868 ((NdefMap->SendRecvBuf[
1869 PH_FRINFC_MIFARESTD_VAL7] &
1870 PH_FRINFC_MIFARESTD_MASK_FF) ==
1871 PH_FRINFC_MIFARESTD_NFCSECT_ACS_BYTE7) &&
1872 ((NdefMap->SendRecvBuf[
1873 PH_FRINFC_MIFARESTD_VAL8] &
1874 PH_FRINFC_MIFARESTD_MASK_FF) ==
1875 PH_FRINFC_MIFARESTD_ACS_BYTE8))
1877 NdefMap->StdMifareContainer.WriteFlag =
1878 PH_FRINFC_MIFARESTD_FLAG1;
1879 NdefMap->StdMifareContainer.ReadFlag =
1880 PH_FRINFC_MIFARESTD_FLAG1;
1882 else if(((NdefMap->SendRecvBuf[
1883 PH_FRINFC_MIFARESTD_VAL6] &
1884 PH_FRINFC_MIFARESTD_MASK_FF) ==
1885 PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE6) &&
1886 ((NdefMap->SendRecvBuf[
1887 PH_FRINFC_MIFARESTD_VAL7] &
1888 PH_FRINFC_MIFARESTD_MASK_FF) ==
1889 PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE7) &&
1890 ((NdefMap->SendRecvBuf[
1891 PH_FRINFC_MIFARESTD_VAL8] &
1892 PH_FRINFC_MIFARESTD_MASK_FF) ==
1893 PH_FRINFC_MIFARESTD_NFCSECT_RDACS_BYTE8))
1895 /* Read Only state */
1896 /* Check for Access bytes 6, 7 and 8 value =
1897 0x55, 0xAD, 0x2A NFC forum Sectors*/
1898 NdefMap->StdMifareContainer.WriteFlag =
1899 PH_FRINFC_MIFARESTD_FLAG0;
1900 NdefMap->StdMifareContainer.ReadFlag =
1901 PH_FRINFC_MIFARESTD_FLAG1;
1905 NdefMap->StdMifareContainer.WriteFlag =
1906 PH_FRINFC_MIFARESTD_FLAG0;
1907 NdefMap->StdMifareContainer.ReadFlag =
1908 PH_FRINFC_MIFARESTD_FLAG0;
1911 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1915 #else /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1917 Result = phFriNfc_MifStd_H_GPBChk(NdefMap);
1919 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1923 #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD
1925 Result = phFriNfc_MifStd_H_GPBChk(NdefMap);
1927 #endif /* #ifdef ENABLE_ACS_BIT_CHK_FOR_MAD */
1932 static NFCSTATUS phFriNfc_MifStd_H_ChkRdWr(phFriNfc_NdefMap_t *NdefMap)
1934 NFCSTATUS Result = NFCSTATUS_SUCCESS;
1935 switch(NdefMap->PrevOperation)
1937 case PH_FRINFC_NDEFMAP_CHECK_OPE:
1938 if(NdefMap->CardState ==
1939 PH_NDEFMAP_CARD_STATE_INVALID)
1941 /* No permission to read */
1942 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
1943 NFCSTATUS_READ_FAILED);
1945 else if((NdefMap->StdMifareContainer.currentBlock > 3) &&
1946 (NdefMap->StdMifareContainer.ChkNdefCompleteFlag ==
1947 PH_FRINFC_MIFARESTD_FLAG1) &&
1948 (NdefMap->StdMifareContainer.currentBlock !=
1949 PH_FRINFC_MIFARESTD_MAD_BLK65) &&
1950 (NdefMap->StdMifareContainer.currentBlock !=
1951 PH_FRINFC_MIFARESTD_MAD_BLK66))
1953 /* NdefMap->StdMifareContainer.currentBlock =
1954 ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
1955 PH_FRINFC_MIFARESTD_FLAG1)?
1956 NdefMap->StdMifareContainer.currentBlock:
1957 (NdefMap->StdMifareContainer.currentBlock +
1958 PH_FRINFC_MIFARESTD_VAL4));
1959 NdefMap->StdMifareContainer.currentBlock =
1960 ((NdefMap->StdMifareContainer.currentBlock ==
1961 PH_FRINFC_MIFARESTD_MAD_BLK64)?
1962 (NdefMap->StdMifareContainer.currentBlock +
1963 PH_FRINFC_MIFARESTD_VAL4):
1964 NdefMap->StdMifareContainer.currentBlock);*/
1966 Result = ((NdefMap->StdMifareContainer.ReadAcsBitFlag ==
1967 PH_FRINFC_MIFARESTD_FLAG0)?
1968 phFriNfc_MifStd_H_RdAcsBit(NdefMap):
1969 phFriNfc_MifStd_H_AuthSector(NdefMap));
1973 Result = phFriNfc_MifareStdMap_ChkNdef(NdefMap);
1977 case PH_FRINFC_NDEFMAP_READ_OPE:
1978 if(NdefMap->CardState ==
1979 PH_NDEFMAP_CARD_STATE_INVALID)
1981 /* No permission to Read */
1982 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
1983 NFCSTATUS_READ_FAILED);
1985 else if(NdefMap->StdMifareContainer.ReadNdefFlag ==
1986 PH_FRINFC_MIFARESTD_FLAG1)
1988 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
1992 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
1996 case PH_FRINFC_NDEFMAP_WRITE_OPE:
1997 if((NdefMap->CardState ==
1998 PH_NDEFMAP_CARD_STATE_INVALID) ||
1999 (NdefMap->CardState ==
2000 PH_NDEFMAP_CARD_STATE_READ_ONLY))
2002 /* No permission to Read */
2003 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
2004 NFCSTATUS_WRITE_FAILED);
2006 else if(NdefMap->StdMifareContainer.WrNdefFlag ==
2007 PH_FRINFC_MIFARESTD_FLAG1)
2009 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
2011 else if(NdefMap->StdMifareContainer.RdBeforeWrFlag ==
2012 PH_FRINFC_MIFARESTD_FLAG1)
2014 /*NdefMap->StdMifareContainer.ReadFlag =
2015 PH_FRINFC_MIFARESTD_FLAG0;*/
2016 Result = phFriNfc_MifStd_H_RdBeforeWr(NdefMap);
2018 else if(NdefMap->StdMifareContainer.RdAfterWrFlag ==
2019 PH_FRINFC_MIFARESTD_FLAG1)
2021 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
2025 Result = (((NdefMap->TLVStruct.NdefTLVBlock ==
2026 NdefMap->StdMifareContainer.currentBlock) &&
2028 PH_FRINFC_NDEFMAP_SEEK_BEGIN))?
2029 phFriNfc_MifStd_H_RdBeforeWr(NdefMap):
2030 phFriNfc_MifStd_H_WrABlock(NdefMap));
2034 case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
2035 Result = ((NdefMap->StdMifareContainer.ReadFlag ==
2036 PH_FRINFC_MIFARESTD_FLAG0)?
2037 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
2038 NFCSTATUS_READ_FAILED)):
2039 phFriNfc_MifStd_H_GetActCardLen(NdefMap));
2043 /* Operation is not correct */
2044 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
2045 NFCSTATUS_INVALID_PARAMETER);
2052 static void phFriNfc_MifStd_H_ChkNdefCmpltSects(phFriNfc_NdefMap_t *NdefMap)
2055 if(NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)
2057 for(index = 0; index < PH_FRINFC_MIFARESTD4K_TOTAL_SECTOR; index++)
2059 /* For Mifare 4k, Block 0 to 31 contains 4 blocks */
2060 /* sector 0 and 15 are aid blocks */
2061 if(index != PH_FRINFC_MIFARESTD_SECTOR_NO16)
2063 if(( (index < 32) && (index != PH_FRINFC_MIFARESTD_SECTOR_NO0))
2064 && (NdefMap->StdMifareContainer.aid[index] ==
2065 PH_FRINFC_MIFARESTD_NON_NDEF_COMP))
2067 /* Only 3 blocks can be read/written till sector 31 */
2068 NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
2069 PH_FRINFC_MIFARESTD_MAD_BLK3;
2074 /* For Mifare 4k, Block 32 to 39 contains 16 blocks */
2075 if(NdefMap->StdMifareContainer.aid[index] ==
2076 PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
2078 /* Only 15 blocks can be read/written from sector 31 */
2079 NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
2080 PH_FRINFC_MIFARESTD_BLK15;
2084 } /* For index > 40 */
2088 for(index = PH_FRINFC_MIFARESTD_SECTOR_NO1;
2089 index < PH_FRINFC_MIFARESTD_SECTOR_NO16; index++)
2091 if(NdefMap->StdMifareContainer.aid[index] ==
2092 PH_FRINFC_MIFARESTD_NON_NDEF_COMP)
2094 /* Only three blocks can be read/written in
2095 a sector. So if a sector is non-ndef
2096 compliant, decrement 3 */
2097 NdefMap->StdMifareContainer.NoOfNdefCompBlocks -=
2098 PH_FRINFC_MIFARESTD_MAD_BLK3;
2105 static uint8_t phFriNfc_MifStd_H_ChkNdefLen(phFriNfc_NdefMap_t *NdefMap,
2109 uint8_t NoLengthBytesinTLV = 0,
2110 TempBuffer[16] = {0};
2111 uint16_t TempLength = 0;
2113 TempLength = ((NdefMap->StdMifareContainer.internalLength > 0)?
2114 NdefMap->StdMifareContainer.internalLength :
2115 PH_FRINFC_MIFARESTD_BYTES_READ);
2117 if(NdefMap->StdMifareContainer.internalLength > 0)
2119 (void)memcpy( TempBuffer,
2120 NdefMap->StdMifareContainer.internalBuf,
2125 (void)memcpy( TempBuffer,
2126 NdefMap->SendRecvBuf,
2130 /* if number of bytes for length (L) in TLV is greater than 0*/
2131 if(NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_VAL0)
2133 switch(NdefMap->TLVStruct.NoLbytesinTLV)
2135 /* there are two bytes remaining in the length (L) of TLV */
2136 case PH_FRINFC_MIFARESTD_VAL2:
2137 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES2;
2138 /* Get the value of the length (L) of the TLV */
2139 NdefMap->TLVStruct.BytesRemainLinTLV = *TempBuffer;
2140 NdefMap->TLVStruct.BytesRemainLinTLV =
2141 ((NdefMap->TLVStruct.BytesRemainLinTLV
2142 << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + (TempBuffer[
2143 PH_FRINFC_MIFARESTD_INC_1]));
2145 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <
2146 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2147 PH_FRINFC_MIFARESTD_FLAG1 :
2148 PH_FRINFC_MIFARESTD_FLAG0);
2149 NdefMap->TLVStruct.BytesRemainLinTLV = ((*CRFlag ==
2150 PH_FRINFC_MIFARESTD_FLAG1)?
2151 PH_FRINFC_MIFARESTD_VAL0:
2152 NdefMap->TLVStruct.BytesRemainLinTLV);
2155 /* there is only one byte remaining in the length (L) of TLV */
2156 case PH_FRINFC_MIFARESTD_VAL1:
2157 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
2158 /* Get the value of the length (L) of the TLV */
2159 NdefMap->TLVStruct.BytesRemainLinTLV =
2160 NdefMap->TLVStruct.prevLenByteValue;
2162 NdefMap->TLVStruct.BytesRemainLinTLV =
2163 ((NdefMap->TLVStruct.BytesRemainLinTLV
2164 << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + (*TempBuffer));
2165 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <
2166 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2167 PH_FRINFC_MIFARESTD_FLAG1 :
2168 PH_FRINFC_MIFARESTD_FLAG0);
2170 NdefMap->TLVStruct.BytesRemainLinTLV = ((*CRFlag ==
2171 PH_FRINFC_MIFARESTD_FLAG1)?
2172 PH_FRINFC_MIFARESTD_VAL0:
2173 NdefMap->TLVStruct.BytesRemainLinTLV);
2179 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2180 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2181 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2183 else if(TempBuffer[NDEFlength] <
2184 PH_FRINFC_MIFARESTD_NDEFTLV_L)
2186 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
2187 /* Get the value of the length (L) of the TLV */
2188 NdefMap->TLVStruct.BytesRemainLinTLV =
2189 TempBuffer[NDEFlength];
2191 /* if NDEFLength has reached 16 bytes, then the next coming byte is not of type in TLV */
2192 NdefMap->TLVStruct.TcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
2193 == PH_FRINFC_MIFARESTD_BYTES_READ)?
2194 PH_FRINFC_MIFARESTD_FLAG1 :
2195 PH_FRINFC_MIFARESTD_FLAG0);
2196 /* if NDEFLength has reached 16 bytes, then the next coming byte is not of length in TLV */
2197 NdefMap->TLVStruct.LcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
2198 == PH_FRINFC_MIFARESTD_BYTES_READ)?
2199 PH_FRINFC_MIFARESTD_FLAG1 :
2200 PH_FRINFC_MIFARESTD_FLAG0);
2204 if((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
2205 == PH_FRINFC_MIFARESTD_BYTES_READ)
2207 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES1;
2208 /* Number of bytes left for length (L) field in TLV */
2209 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL2;
2210 /* if NDEFLength has reached 16 bytes, then the next coming byte is not of type in TLV */
2211 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2212 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2214 else if((NDEFlength + PH_FRINFC_MIFARESTD_INC_2)
2215 == PH_FRINFC_MIFARESTD_BYTES_READ)
2217 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES2;
2218 /* Number of bytes left for length (L) field in TLV */
2219 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL1;
2220 /* if NDEFLength has reached 16 bytes, then the next byte is not of type in TLV */
2221 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2222 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2223 /* copy the value of the length field */
2224 NdefMap->TLVStruct.prevLenByteValue =
2225 NdefMap->SendRecvBuf[(NDEFlength + PH_FRINFC_MIFARESTD_INC_1)];
2229 /* if NDEFLength has reached 16 bytes, then the next byte is not of type in TLV */
2230 NdefMap->TLVStruct.TcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_3)
2231 == PH_FRINFC_MIFARESTD_BYTES_READ)?
2232 PH_FRINFC_MIFARESTD_FLAG1 :
2233 PH_FRINFC_MIFARESTD_FLAG0);
2235 /* if NDEFLength has reached 16 bytes, then the next byte is not of length in TLV */
2236 NdefMap->TLVStruct.LcheckedinTLVFlag = (((NDEFlength + PH_FRINFC_MIFARESTD_INC_1)
2237 == PH_FRINFC_MIFARESTD_BYTES_READ)?
2238 PH_FRINFC_MIFARESTD_FLAG1 :
2239 PH_FRINFC_MIFARESTD_FLAG0);
2241 /* Number of bytes left for length (L) field in TLV */
2242 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
2244 NoLengthBytesinTLV = PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES3;
2245 /* Get the value of the length (L) of the TLV */
2246 NdefMap->TLVStruct.BytesRemainLinTLV =
2247 TempBuffer[(NDEFlength +
2248 PH_FRINFC_MIFARESTD_INC_1)];
2250 NdefMap->TLVStruct.BytesRemainLinTLV =
2251 ((NdefMap->TLVStruct.BytesRemainLinTLV
2252 << PH_FRINFC_MIFARESTD_LEFTSHIFT8) + TempBuffer[
2253 (NDEFlength +PH_FRINFC_MIFARESTD_INC_2)]);
2255 *CRFlag = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <
2256 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
2257 PH_FRINFC_MIFARESTD_FLAG1 :
2258 PH_FRINFC_MIFARESTD_FLAG0);
2261 return NoLengthBytesinTLV;
2265 static NFCSTATUS phFriNfc_MifStd_H_RdNdefTLV(phFriNfc_NdefMap_t *NdefMap,
2266 uint8_t *Temp16Bytes)
2268 NFCSTATUS Result = NFCSTATUS_SUCCESS;
2269 uint8_t NDEFlength = 0,
2272 uint16_t RemainingBytes = 0;
2274 while(PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->TLVStruct.NdefTLVFoundFlag)
2276 RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
2277 NdefMap->ApduBuffIndex);
2278 if(((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2279 NdefMap->StdMifareContainer.NdefBlocks) *
2280 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
2281 PH_FRINFC_MIFARESTD_BLOCK_BYTES) <
2284 /* If the user Buffer is greater than the Card Size
2285 set LastBlockFlag = 1. This Flag is used to read bytes
2286 till the end of the card only */
2287 RemainingBytes = ((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
2288 NdefMap->StdMifareContainer.NdefBlocks) * 16) +
2289 NdefMap->StdMifareContainer.internalLength);
2292 /* Ndef TLV flag to 0 */
2293 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2295 if((NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
2296 (NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
2297 (NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0))
2299 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2303 /* if type (T) of TLV flag is not set then only the below check is valid
2304 because, for eg. assume, type (T) of TLV flag is set then this means
2305 that it is already checked from the previous 16 bytes data (T is the
2306 last byte of 16 bytes */
2307 if(NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
2309 CRFlag = ((NdefMap->SendRecvBuf[(*Temp16Bytes)]!=
2310 PH_FRINFC_MIFARESTD_NDEFTLV_T)?
2311 PH_FRINFC_MIFARESTD_FLAG1:
2312 PH_FRINFC_MIFARESTD_FLAG0);
2314 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2316 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
2317 PH_FRINFC_MIFARESTD_FLAG1;
2318 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
2321 /* skip Type T of the TLV */
2322 *Temp16Bytes += PH_FRINFC_MIFARESTD_INC_1;
2326 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2329 if((*Temp16Bytes + PH_FRINFC_MIFARESTD_VAL1) == PH_FRINFC_MIFARESTD_BYTES_READ)
2331 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2332 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2333 /* 16 bytes completed */
2334 NdefMap->StdMifareContainer.currentBlock++;
2335 NdefMap->StdMifareContainer.NdefBlocks++;
2336 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2337 if(Result == NFCSTATUS_SUCCESS)
2339 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2341 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2345 Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2350 /* skip number of bytes taken by L in TLV, if L is already read */
2351 if(NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
2353 /*CRFlag = (((*(NdefMap->SendRecvBuf + *Temp16Bytes) ==
2354 PH_FRINFC_MIFARESTD_NDEFTLV_L0) &&
2355 (NdefMap->TLVStruct.NoLbytesinTLV ==
2356 PH_FRINFC_MIFARESTD_VAL0))?
2357 PH_FRINFC_MIFARESTD_FLAG1:
2358 PH_FRINFC_MIFARESTD_FLAG0);*/
2360 NDEFlength = *Temp16Bytes;
2361 *Temp16Bytes += phFriNfc_MifStd_H_ChkNdefLen(NdefMap,
2364 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2366 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
2367 PH_FRINFC_MIFARESTD_FLAG1;
2374 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2377 if(*Temp16Bytes == PH_FRINFC_MIFARESTD_BYTES_READ)
2379 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2380 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
2381 /* 16 bytes completed */
2382 NdefMap->StdMifareContainer.currentBlock++;
2383 NdefMap->StdMifareContainer.NdefBlocks++;
2384 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2385 if(Result == NFCSTATUS_SUCCESS)
2387 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2389 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2393 Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2399 if((NdefMap->TLVStruct.BytesRemainLinTLV <=
2400 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
2402 NdefMap->TLVStruct.BytesRemainLinTLV))
2404 /* Copy data to user buffer */
2405 (void)memcpy(&(NdefMap->ApduBuffer[
2406 NdefMap->ApduBuffIndex]),
2407 &(NdefMap->SendRecvBuf[
2410 NdefMap->ApduBuffIndex += RemainingBytes;
2411 *Temp16Bytes += ((uint8_t)RemainingBytes);
2412 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2414 if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
2416 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2417 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2418 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2422 /* copy the bytes to internal buffer that are read,
2423 but not used for the user buffer */
2424 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
2425 &(NdefMap->SendRecvBuf[(*Temp16Bytes)]),
2426 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes));
2428 /* TempLength of the internal buffer */
2429 NdefMap->StdMifareContainer.internalLength =
2430 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
2432 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2435 else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
2436 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
2438 NdefMap->TLVStruct.BytesRemainLinTLV))
2440 /* Copy data to user buffer */
2441 (void)memcpy(&(NdefMap->ApduBuffer[
2442 NdefMap->ApduBuffIndex]),
2443 &(NdefMap->SendRecvBuf[
2445 NdefMap->TLVStruct.BytesRemainLinTLV);
2446 /* increment the user buffer index */
2447 NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2448 *Temp16Bytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
2449 NdefMap->TLVStruct.BytesRemainLinTLV = 0;
2450 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2451 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2452 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2454 /* check for 16 bytes of data been used */
2455 if(*Temp16Bytes == PH_FRINFC_MIFARESTD_BYTES_READ)
2457 /* 16 bytes completed */
2458 NdefMap->StdMifareContainer.currentBlock++;
2459 NdefMap->StdMifareContainer.NdefBlocks++;
2460 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2461 if(Result == NFCSTATUS_SUCCESS)
2463 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2465 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2469 Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2475 else if((NdefMap->TLVStruct.BytesRemainLinTLV >
2476 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
2478 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)))
2480 /* Copy data to user buffer */
2481 (void)memcpy(&(NdefMap->ApduBuffer[
2482 NdefMap->ApduBuffIndex]),
2483 &(NdefMap->SendRecvBuf[
2486 NdefMap->ApduBuffIndex += RemainingBytes;
2487 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2488 if(RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes))
2490 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2491 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2492 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2493 PH_FRINFC_MIFARESTD_FLAG1:
2494 PH_FRINFC_MIFARESTD_FLAG0);
2496 /* 16 bytes completed */
2497 NdefMap->StdMifareContainer.currentBlock++;
2498 NdefMap->StdMifareContainer.NdefBlocks++;
2502 /* copy the bytes to internal buffer, that are read,
2503 but not used for the user buffer */
2504 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
2505 &(NdefMap->SendRecvBuf[((*Temp16Bytes) + RemainingBytes)]),
2506 (PH_FRINFC_MIFARESTD_BYTES_READ -
2507 (*Temp16Bytes + RemainingBytes)));
2509 /* Length of the internal buffer */
2510 NdefMap->StdMifareContainer.internalLength =
2511 (PH_FRINFC_MIFARESTD_BYTES_READ -
2512 (*Temp16Bytes + RemainingBytes));
2514 *Temp16Bytes += ((uint8_t)RemainingBytes);
2515 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2520 if((NdefMap->TLVStruct.BytesRemainLinTLV >
2521 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)) &&
2523 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes)))
2525 /* Copy data to user buffer */
2526 (void)memcpy(&(NdefMap->ApduBuffer[
2527 NdefMap->ApduBuffIndex]),
2528 &(NdefMap->SendRecvBuf[
2530 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes));
2531 NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
2532 NdefMap->TLVStruct.BytesRemainLinTLV -=
2533 (PH_FRINFC_MIFARESTD_BYTES_READ - *Temp16Bytes);
2534 *Temp16Bytes = PH_FRINFC_MIFARESTD_BYTES_READ;
2537 /* 16 bytes completed */
2538 NdefMap->StdMifareContainer.currentBlock++;
2539 NdefMap->StdMifareContainer.NdefBlocks++;
2540 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2541 if(Result == NFCSTATUS_SUCCESS)
2543 Result = ((NdefMap->StdMifareContainer.AuthDone ==
2544 PH_FRINFC_MIFARESTD_FLAG1)?
2545 phFriNfc_MifStd_H_RdABlock(NdefMap):
2546 phFriNfc_MifStd_H_AuthSector(NdefMap));
2553 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2555 Result = (((RdFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
2556 (NdefMap->ApduBuffIndex == PH_FRINFC_MIFARESTD_VAL0))?
2557 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
2558 NFCSTATUS_EOF_CARD_REACHED)):
2560 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
2561 phFriNfc_MifStd_H_Complete(NdefMap, Result);
2567 static NFCSTATUS phFriNfc_MifStd_H_RemainTLV(phFriNfc_NdefMap_t *NdefMap,
2569 uint8_t *Temp16Bytes)
2571 NFCSTATUS Result = NFCSTATUS_SUCCESS;
2573 uint16_t RemainingBytes = 0;
2575 RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
2576 NdefMap->ApduBuffIndex);
2578 if(NdefMap->StdMifareContainer.remainingSize <
2581 /* If the user Buffer is greater than the Card Size
2582 set LastBlockFlag = 1. This Flag is used to read bytes
2583 till the end of the card only */
2584 RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
2587 /* Remaining Bytes of length (L) in TLV <= 16 */
2588 if((NdefMap->TLVStruct.BytesRemainLinTLV <=
2589 (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2590 (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
2592 /* Copy data to user buffer */
2593 (void)memcpy(&(NdefMap->ApduBuffer[
2594 NdefMap->ApduBuffIndex]),
2595 &(NdefMap->SendRecvBuf[
2598 NdefMap->ApduBuffIndex += RemainingBytes;
2599 NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2601 /* copy the bytes to internal buffer, that are read,
2602 but not used for the user buffer */
2603 if(RemainingBytes != NdefMap->TLVStruct.BytesRemainLinTLV)
2605 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2606 #ifdef PH_HAL4_ENABLE
2607 &(NdefMap->SendRecvBuf[((*Temp16Bytes) + RemainingBytes)]),
2609 &(NdefMap->SendRecvBuf[RemainingBytes]),
2610 #endif /* #ifdef PH_HAL4_ENABLE */
2611 ((PH_FRINFC_MIFARESTD_BYTES_READ -
2612 (*Temp16Bytes)) - RemainingBytes));
2614 /* internal buffer length */
2615 NdefMap->StdMifareContainer.internalLength =
2616 ((PH_FRINFC_MIFARESTD_BYTES_READ -
2617 (*Temp16Bytes)) - RemainingBytes);
2619 *Temp16Bytes += ((uint8_t)RemainingBytes);
2620 /* Remaining Bytes of length value in TLV */
2621 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2623 if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2625 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2626 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2627 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2628 PH_FRINFC_MIFARESTD_FLAG1:
2629 PH_FRINFC_MIFARESTD_FLAG0);
2631 /* internal length bytes completed */
2632 NdefMap->StdMifareContainer.currentBlock++;
2633 NdefMap->StdMifareContainer.NdefBlocks++;
2636 if(NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0)
2638 /* Remaining Bytes of length (L) in TLV is Zero means that the next
2639 coming bytes are containing type (T), length (L) in TLV */
2640 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2641 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2642 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2644 /* call completion routine */
2645 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2646 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2648 else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
2649 (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2650 (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
2652 /* Copy data to user buffer */
2653 (void)memcpy(&(NdefMap->ApduBuffer[
2654 NdefMap->ApduBuffIndex]),
2655 &(NdefMap->SendRecvBuf[
2657 NdefMap->TLVStruct.BytesRemainLinTLV);
2658 NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2659 NdefMap->StdMifareContainer.remainingSize -=
2660 NdefMap->TLVStruct.BytesRemainLinTLV;
2661 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2662 *Temp16Bytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
2663 NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2665 *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2667 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2668 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2669 /* 16 bytes completed */
2670 if(NdefMap->TLVStruct.BytesRemainLinTLV ==
2671 PH_FRINFC_MIFARESTD_BYTES_READ)
2673 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2674 NdefMap->TLVStruct.BytesRemainLinTLV =
2675 PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2676 NdefMap->StdMifareContainer.currentBlock++;
2677 NdefMap->StdMifareContainer.NdefBlocks++;
2678 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2679 if(Result == NFCSTATUS_SUCCESS)
2681 if(NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)
2683 Result = phFriNfc_MifStd_H_RdABlock(NdefMap);
2687 Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
2693 NdefMap->TLVStruct.BytesRemainLinTLV =
2694 PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2695 /* The read operation has finished. so, completion routine
2696 can be called. set the Completion routine(CR) flag */
2697 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2700 else if((NdefMap->TLVStruct.BytesRemainLinTLV >
2701 (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2702 (RemainingBytes <= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
2704 /* Copy data to user buffer */
2705 (void)memcpy(&(NdefMap->ApduBuffer[
2706 NdefMap->ApduBuffIndex]),
2707 &(NdefMap->SendRecvBuf[
2710 NdefMap->ApduBuffIndex += RemainingBytes;
2711 NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2713 /* Remaining Bytes of length (L) in TLV */
2714 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2716 The below macro PH_HAL4_ENABLE is added because,
2717 there is an error with the following sequence
2718 Read begin (for ex : with 10 bytes)
2719 Read current (for ex : with 10 bytes). Here error buffer
2721 Reason : During first read, internal buffer is updated
2722 with the wrong buffer values
2723 Actually, if we read the first block (means TLV block), it
2724 contains even the TLV structure. so to copy the actual buffer,
2725 the TLV shall be excluded
2727 #ifdef PH_HAL4_ENABLE
2728 /* copy the bytes to internal buffer, that are read,
2729 but not used for the user buffer */
2730 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2731 &(NdefMap->SendRecvBuf[(RemainingBytes + (*Temp16Bytes))]),
2732 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
2735 /* internal buffer length */
2736 NdefMap->StdMifareContainer.internalLength =
2737 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
2739 /* copy the bytes to internal buffer, that are read,
2740 but not used for the user buffer */
2741 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2742 &(NdefMap->SendRecvBuf[RemainingBytes]),
2743 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))
2746 /* internal buffer length */
2747 NdefMap->StdMifareContainer.internalLength =
2748 ((PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)) - RemainingBytes);
2749 #endif /* #ifdef PH_HAL4_ENABLE */
2751 if(RemainingBytes == (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)))
2753 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2754 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2755 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2756 PH_FRINFC_MIFARESTD_FLAG1:
2757 PH_FRINFC_MIFARESTD_FLAG0);
2759 /* internal length bytes completed */
2760 NdefMap->StdMifareContainer.currentBlock++;
2761 NdefMap->StdMifareContainer.NdefBlocks++;
2763 *Temp16Bytes += ((uint8_t)RemainingBytes);
2764 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2765 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2766 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2770 if((NdefMap->TLVStruct.BytesRemainLinTLV >
2771 (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))) &&
2772 (RemainingBytes > (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes))))
2774 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2775 /* Copy data to user buffer */
2776 (void)memcpy(&(NdefMap->ApduBuffer
2777 [NdefMap->ApduBuffIndex]),
2778 &(NdefMap->SendRecvBuf[
2780 (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes)));
2781 NdefMap->ApduBuffIndex += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2782 NdefMap->StdMifareContainer.remainingSize -=
2783 (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2784 NdefMap->TLVStruct.BytesRemainLinTLV -= (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2785 *Temp16Bytes += (PH_FRINFC_MIFARESTD_BYTES_READ - (*Temp16Bytes));
2786 if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
2788 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
2790 /* 16 bytes completed */
2791 NdefMap->StdMifareContainer.currentBlock++;
2792 NdefMap->StdMifareContainer.NdefBlocks++;
2793 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2794 if(Result == NFCSTATUS_SUCCESS)
2796 Result = ((NdefMap->StdMifareContainer.AuthDone ==
2797 PH_FRINFC_MIFARESTD_FLAG1)?
2798 phFriNfc_MifStd_H_RdABlock(NdefMap):
2799 phFriNfc_MifStd_H_AuthSector(NdefMap));
2804 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
2806 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
2807 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2808 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2809 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2810 PH_FRINFC_MIFARESTD_FLAG1:
2811 PH_FRINFC_MIFARESTD_FLAG0);
2817 static NFCSTATUS phFriNfc_MifStd_H_ChkIntLen(phFriNfc_NdefMap_t *NdefMap)
2819 NFCSTATUS Result = NFCSTATUS_SUCCESS;
2820 uint8_t NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
2821 uint8_t TempintBytes = 0;
2823 if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
2825 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
2826 /* To read the remaining length (L) in TLV */
2827 Result = phFriNfc_MifStd_H_IntLenWioutNdef(NdefMap, &NDEFFlag, &TempintBytes);
2829 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
2830 /* check the NDEFFlag is set. if this is not set, then
2831 in the above RemainTLV function all the 16 bytes has been
2834 if((NDEFFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
2835 (NdefMap->TLVStruct.NdefTLVFoundFlag ==
2836 PH_FRINFC_MIFARESTD_FLAG1))
2838 /* if the block is NDEF TLV then get data from here */
2839 Result = phFriNfc_MifStd_H_IntLenWithNdef(NdefMap, &TempintBytes);
2845 static NFCSTATUS phFriNfc_MifStd_H_IntLenWioutNdef(phFriNfc_NdefMap_t *NdefMap,
2847 uint8_t *TempintBytes)
2849 NFCSTATUS Result = NFCSTATUS_SUCCESS;
2851 uint16_t RemainingBytes = 0;
2853 RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
2854 NdefMap->ApduBuffIndex);
2856 if(NdefMap->StdMifareContainer.remainingSize <
2859 /* If the user Buffer is greater than the Card Size
2860 set LastBlockFlag = 1. This Flag is used to read bytes
2861 till the end of the card only */
2862 RemainingBytes = NdefMap->StdMifareContainer.remainingSize;
2865 /* Remaining Bytes of length (L) in TLV <= internal length */
2866 if((NdefMap->TLVStruct.BytesRemainLinTLV <=
2867 NdefMap->StdMifareContainer.internalLength) &&
2868 (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
2870 (void)memcpy(&(NdefMap->ApduBuffer[
2871 NdefMap->ApduBuffIndex]),
2872 &(NdefMap->StdMifareContainer.internalBuf[
2875 NdefMap->ApduBuffIndex += RemainingBytes;
2876 NdefMap->StdMifareContainer.remainingSize -= RemainingBytes;
2877 *TempintBytes += ((uint8_t)RemainingBytes);
2879 /* copy the bytes to internal buffer, that are read,
2880 but not used for the user buffer */
2881 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2882 &(NdefMap->StdMifareContainer.internalBuf[RemainingBytes]),
2883 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
2885 /* internal buffer length */
2886 NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
2888 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2889 if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
2891 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2892 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2893 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2894 PH_FRINFC_MIFARESTD_FLAG1:
2895 PH_FRINFC_MIFARESTD_FLAG0);
2897 /* internal length bytes completed */
2898 NdefMap->StdMifareContainer.currentBlock++;
2899 NdefMap->StdMifareContainer.NdefBlocks++;
2902 /* Remaining Bytes of length value in TLV */
2903 if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
2905 /* Remaining Bytes of length (L) in TLV is Zero means that the next
2906 coming bytes are containing type (T), length (L) in TLV */
2907 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2908 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2909 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2911 /* call completion routine */
2912 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2913 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2915 else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
2916 NdefMap->StdMifareContainer.internalLength) &&
2917 (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
2919 (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
2920 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
2921 NdefMap->TLVStruct.BytesRemainLinTLV);
2923 NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
2924 NdefMap->StdMifareContainer.remainingSize -=
2925 NdefMap->TLVStruct.BytesRemainLinTLV;
2926 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
2928 *TempintBytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
2929 *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2931 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2932 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
2934 NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
2935 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
2936 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
2937 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
2938 PH_FRINFC_MIFARESTD_FLAG1:
2939 PH_FRINFC_MIFARESTD_FLAG0);
2940 #ifdef PH_HAL4_ENABLE
2942 if (PH_FRINFC_MIFARESTD_FLAG1 ==
2943 NdefMap->StdMifareContainer.ReadWriteCompleteFlag)
2945 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
2948 #endif /* #ifdef PH_HAL4_ENABLE */
2950 if( NdefMap->TLVStruct.BytesRemainLinTLV ==
2951 NdefMap->StdMifareContainer.internalLength)
2953 /* Remaining Bytes in Length (L) field of TLV is 0 */
2954 NdefMap->TLVStruct.BytesRemainLinTLV =
2955 PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2956 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
2957 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
2958 /* internal length bytes completed */
2959 NdefMap->StdMifareContainer.currentBlock++;
2960 NdefMap->StdMifareContainer.NdefBlocks++;
2961 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
2962 if(Result == NFCSTATUS_SUCCESS)
2965 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
2966 phFriNfc_MifStd_H_RdABlock(NdefMap):
2967 phFriNfc_MifStd_H_AuthSector(NdefMap));
2972 /* Remaining Bytes in Length (L) field of TLV is 0 */
2973 NdefMap->TLVStruct.BytesRemainLinTLV =
2974 PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0;
2975 *Flag = PH_FRINFC_MIFARESTD_FLAG1;
2978 else if((NdefMap->TLVStruct.BytesRemainLinTLV >
2979 NdefMap->StdMifareContainer.internalLength) &&
2980 (RemainingBytes <= NdefMap->StdMifareContainer.internalLength))
2982 (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
2983 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
2986 NdefMap->ApduBuffIndex += RemainingBytes;
2987 NdefMap->StdMifareContainer.remainingSize -=
2989 *TempintBytes += ((uint8_t)RemainingBytes);
2990 /* Remaining Bytes of length (L) in TLV */
2991 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
2993 /* copy the bytes to internal buffer, that are read,
2994 but not used for the user buffer */
2995 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
2996 &(NdefMap->StdMifareContainer.internalBuf[RemainingBytes]),
2997 (NdefMap->StdMifareContainer.internalLength - RemainingBytes));
2999 /* internal buffer length */
3000 NdefMap->StdMifareContainer.internalLength -= RemainingBytes;
3001 if(NdefMap->StdMifareContainer.internalLength == PH_FRINFC_MIFARESTD_VAL0)
3003 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
3004 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
3005 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
3006 PH_FRINFC_MIFARESTD_FLAG1:
3007 PH_FRINFC_MIFARESTD_FLAG0);
3009 /* internal length bytes completed */
3010 NdefMap->StdMifareContainer.currentBlock++;
3011 NdefMap->StdMifareContainer.NdefBlocks++;
3014 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
3015 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3016 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
3020 if((NdefMap->TLVStruct.BytesRemainLinTLV >
3021 NdefMap->StdMifareContainer.internalLength) &&
3022 (RemainingBytes > NdefMap->StdMifareContainer.internalLength))
3024 (void)memcpy(&(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
3025 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
3026 NdefMap->StdMifareContainer.internalLength);
3027 *Flag = PH_FRINFC_MIFARESTD_FLAG0;
3028 NdefMap->ApduBuffIndex += NdefMap->StdMifareContainer.internalLength;
3029 NdefMap->StdMifareContainer.remainingSize -=
3030 NdefMap->StdMifareContainer.internalLength;
3031 NdefMap->TLVStruct.BytesRemainLinTLV -= NdefMap->StdMifareContainer.internalLength;
3033 if(NdefMap->TLVStruct.BytesRemainLinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0)
3035 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
3038 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3039 /* internal length bytes completed */
3040 NdefMap->StdMifareContainer.currentBlock++;
3041 NdefMap->StdMifareContainer.NdefBlocks++;
3042 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3043 if(Result == NFCSTATUS_SUCCESS)
3045 Result = ((NdefMap->StdMifareContainer.AuthDone ==
3046 PH_FRINFC_MIFARESTD_FLAG1)?
3047 phFriNfc_MifStd_H_RdABlock(NdefMap):
3048 phFriNfc_MifStd_H_AuthSector(NdefMap));
3053 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3055 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = (uint8_t)
3056 (((NdefMap->StdMifareContainer.remainingSize == PH_FRINFC_MIFARESTD_VAL0) ||
3057 (NdefMap->TLVStruct.BytesRemainLinTLV == PH_FRINFC_MIFARESTD_VAL0))?
3058 PH_FRINFC_MIFARESTD_FLAG1:
3059 PH_FRINFC_MIFARESTD_FLAG0);
3060 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
3065 static NFCSTATUS phFriNfc_MifStd_H_IntLenWithNdef(phFriNfc_NdefMap_t *NdefMap,
3066 uint8_t *TempintBytes)
3068 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3069 uint16_t RemainingBytes = 0;
3070 uint8_t CRFlag = PH_FRINFC_MIFARESTD_FLAG0,
3071 RdFlag = PH_FRINFC_MIFARESTD_FLAG0,
3074 RemainingBytes = (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
3075 while(PH_FRINFC_MIFARESTD_FLAG1 == NdefMap->TLVStruct.NdefTLVFoundFlag)
3077 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG0;
3078 RemainingBytes = ((uint16_t)NdefMap->ApduBufferSize -
3079 NdefMap->ApduBuffIndex);
3080 if(((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3081 NdefMap->StdMifareContainer.NdefBlocks) *
3082 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
3083 (NdefMap->StdMifareContainer.internalLength -
3087 /* If the user Buffer is greater than the Card Size
3088 set LastBlockFlag = 1. This Flag is used to read bytes
3089 till the end of the card only */
3090 RemainingBytes = ((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3091 NdefMap->StdMifareContainer.NdefBlocks) * 16) +
3092 (NdefMap->StdMifareContainer.internalLength -
3097 if((NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
3098 (NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1) &&
3099 (NdefMap->TLVStruct.NoLbytesinTLV != PH_FRINFC_MIFARESTD_NDEFTLV_LBYTES0))
3105 /* if type (T) of TLV flag is not set then only the below check is valid
3106 because, for eg. assume, type (T) of TLV flag is set then this means
3107 that it is already checked from the previous internal bytes data (T is the
3108 last byte of internal bytes */
3109 if(NdefMap->TLVStruct.TcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
3111 CRFlag =(uint8_t) ((NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]!=
3112 PH_FRINFC_MIFARESTD_NDEFTLV_T)?
3113 PH_FRINFC_MIFARESTD_FLAG1:
3114 PH_FRINFC_MIFARESTD_FLAG0);
3116 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3118 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3119 PH_FRINFC_MIFARESTD_FLAG1;
3120 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
3123 /* skip Type T of the TLV */
3124 *TempintBytes += PH_FRINFC_MIFARESTD_INC_1;
3128 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3131 if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
3133 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3134 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3135 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
3136 /* 16 bytes completed */
3137 NdefMap->StdMifareContainer.currentBlock++;
3138 NdefMap->StdMifareContainer.NdefBlocks++;
3139 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3140 if(Result == NFCSTATUS_SUCCESS)
3143 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
3144 phFriNfc_MifStd_H_RdABlock(NdefMap):
3145 phFriNfc_MifStd_H_AuthSector(NdefMap));
3150 /* skip number of bytes taken by L in TLV, if L is already read */
3151 if(NdefMap->TLVStruct.LcheckedinTLVFlag != PH_FRINFC_MIFARESTD_FLAG1)
3153 CRFlag = (uint8_t)((NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]==
3154 PH_FRINFC_MIFARESTD_NDEFTLV_L0)?
3155 PH_FRINFC_MIFARESTD_FLAG1:
3156 PH_FRINFC_MIFARESTD_FLAG0);
3158 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3160 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3161 PH_FRINFC_MIFARESTD_FLAG1;
3162 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
3165 NDEFlength = *TempintBytes;
3166 *TempintBytes += phFriNfc_MifStd_H_ChkNdefLen(NdefMap,
3169 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3171 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3172 PH_FRINFC_MIFARESTD_FLAG1;
3173 RdFlag = PH_FRINFC_MIFARESTD_FLAG1;
3179 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3182 if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
3184 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3185 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3186 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
3187 /* 16 bytes completed */
3188 NdefMap->StdMifareContainer.currentBlock++;
3189 NdefMap->StdMifareContainer.NdefBlocks++;
3190 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3191 if(Result == NFCSTATUS_SUCCESS)
3193 Result = ((NdefMap->StdMifareContainer.AuthDone ==
3194 PH_FRINFC_MIFARESTD_FLAG1)?
3195 phFriNfc_MifStd_H_RdABlock(NdefMap):
3196 phFriNfc_MifStd_H_AuthSector(NdefMap));
3201 if( (NdefMap->TLVStruct.BytesRemainLinTLV <=
3202 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
3203 (RemainingBytes <= NdefMap->TLVStruct.BytesRemainLinTLV))
3205 /* Copy the internal bytes to the user buffer */
3206 (void)memcpy(&(NdefMap->ApduBuffer[
3207 NdefMap->ApduBuffIndex]),
3208 &(NdefMap->StdMifareContainer.internalBuf[
3212 NdefMap->ApduBuffIndex += RemainingBytes;
3213 *TempintBytes += ((uint8_t)RemainingBytes);
3214 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
3215 if(NdefMap->TLVStruct.BytesRemainLinTLV == 0)
3217 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3219 /* Update the internal length */
3220 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
3221 &(NdefMap->StdMifareContainer.internalBuf[
3224 NdefMap->StdMifareContainer.internalLength -= (*TempintBytes +
3227 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3230 else if((NdefMap->TLVStruct.BytesRemainLinTLV <=
3231 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
3232 (RemainingBytes > NdefMap->TLVStruct.BytesRemainLinTLV))
3234 /* Copy data to user buffer */
3235 (void)memcpy(&(NdefMap->ApduBuffer[
3236 NdefMap->ApduBuffIndex]),
3237 &(NdefMap->StdMifareContainer.internalBuf[
3239 NdefMap->TLVStruct.BytesRemainLinTLV);
3241 /* increment the user buffer index */
3242 NdefMap->ApduBuffIndex += NdefMap->TLVStruct.BytesRemainLinTLV;
3243 *TempintBytes += ((uint8_t)NdefMap->TLVStruct.BytesRemainLinTLV);
3244 NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
3245 NdefMap->TLVStruct.NdefTLVFoundFlag = PH_FRINFC_MIFARESTD_FLAG1;
3247 /* check for internal length bytes of data been used */
3248 if(*TempintBytes == NdefMap->StdMifareContainer.internalLength)
3250 /* 16 bytes completed */
3251 NdefMap->StdMifareContainer.currentBlock++;
3252 NdefMap->StdMifareContainer.NdefBlocks++;
3253 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3254 if(Result == NFCSTATUS_SUCCESS)
3256 Result = ((NdefMap->StdMifareContainer.AuthDone ==
3257 PH_FRINFC_MIFARESTD_FLAG1)?
3258 phFriNfc_MifStd_H_RdABlock(NdefMap):
3259 phFriNfc_MifStd_H_AuthSector(NdefMap));
3264 else if((NdefMap->TLVStruct.BytesRemainLinTLV >
3265 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
3266 (RemainingBytes <= (NdefMap->StdMifareContainer.internalLength -
3269 /* Copy data to user buffer */
3270 (void)memcpy(&(NdefMap->ApduBuffer[
3271 NdefMap->ApduBuffIndex]),
3272 &(NdefMap->StdMifareContainer.internalBuf[
3275 NdefMap->ApduBuffIndex += RemainingBytes;
3276 *TempintBytes += ((uint8_t)RemainingBytes);
3277 NdefMap->TLVStruct.BytesRemainLinTLV -= RemainingBytes;
3279 /* copy the bytes to internal buffer, that are read,
3280 but not used for the user buffer */
3281 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
3282 &(NdefMap->StdMifareContainer.internalBuf[(*TempintBytes)]),
3283 (NdefMap->StdMifareContainer.internalLength - *TempintBytes));
3285 /* Length of the internal buffer */
3286 NdefMap->StdMifareContainer.internalLength -= *TempintBytes;
3287 CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3292 if((NdefMap->TLVStruct.BytesRemainLinTLV >
3293 (NdefMap->StdMifareContainer.internalLength - *TempintBytes)) &&
3294 (RemainingBytes > (NdefMap->StdMifareContainer.internalLength -
3297 /* Copy data to user buffer */
3298 (void)memcpy(&(NdefMap->ApduBuffer[
3299 NdefMap->ApduBuffIndex]),
3300 &(NdefMap->StdMifareContainer.internalBuf[
3302 (NdefMap->StdMifareContainer.internalLength -
3304 NdefMap->ApduBuffIndex += (NdefMap->StdMifareContainer.internalLength -
3306 NdefMap->TLVStruct.BytesRemainLinTLV -=
3307 (NdefMap->StdMifareContainer.internalLength - *TempintBytes);
3308 *TempintBytes += (uint8_t)(NdefMap->StdMifareContainer.internalLength -
3311 NdefMap->StdMifareContainer.internalLength -= *TempintBytes;
3313 /* 16 bytes completed */
3314 NdefMap->StdMifareContainer.currentBlock++;
3315 NdefMap->StdMifareContainer.NdefBlocks++;
3316 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3317 if(Result == NFCSTATUS_SUCCESS)
3319 Result = ((NdefMap->StdMifareContainer.AuthDone ==
3320 PH_FRINFC_MIFARESTD_FLAG1)?
3321 phFriNfc_MifStd_H_RdABlock(NdefMap):
3322 phFriNfc_MifStd_H_AuthSector(NdefMap));
3329 if(((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3330 NdefMap->StdMifareContainer.NdefBlocks) *
3331 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
3332 NdefMap->StdMifareContainer.internalLength) ==
3333 PH_FRINFC_MIFARESTD_VAL0)
3335 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3336 PH_FRINFC_MIFARESTD_FLAG1;
3339 if(CRFlag == PH_FRINFC_MIFARESTD_FLAG1)
3341 Result = (((RdFlag == PH_FRINFC_MIFARESTD_FLAG1) &&
3342 (NdefMap->ApduBuffIndex == PH_FRINFC_MIFARESTD_VAL0))?
3343 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
3344 NFCSTATUS_EOF_NDEF_CONTAINER_REACHED)):
3347 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
3354 static NFCSTATUS phFriNfc_MifStd_H_WriteNdefLen(phFriNfc_NdefMap_t *NdefMap)
3356 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3357 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_NDEF_LEN;
3359 /* If Current block = Ndef TLV block then the starting point
3360 is writing from type of TLV
3363 if(NdefMap->StdMifareContainer.currentBlock ==
3364 NdefMap->TLVStruct.NdefTLVBlock)
3367 if(NdefMap->TLVStruct.NULLTLVCount >=
3368 PH_FRINFC_MIFARESTD_VAL2)
3370 phFriNfc_MifStd_H_fillTLV1(NdefMap);
3374 phFriNfc_MifStd_H_fillTLV2(NdefMap);
3379 if(NdefMap->TLVStruct.NULLTLVCount >=
3380 PH_FRINFC_MIFARESTD_VAL2)
3382 phFriNfc_MifStd_H_fillTLV1_1(NdefMap);
3386 phFriNfc_MifStd_H_fillTLV2_1(NdefMap);
3390 (void)memcpy( NdefMap->StdMifareContainer.Buffer,
3391 &(NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1]),
3392 PH_FRINFC_MIFARESTD_BYTES_READ);
3395 /* Write from here */
3396 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
3398 #ifndef PH_HAL4_ENABLE
3399 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
3401 NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
3404 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
3405 /* Call the Overlapped HAL Transceive function */
3406 Result = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
3407 &NdefMap->MapCompletionInfo,
3408 NdefMap->psRemoteDevInfo,
3410 &NdefMap->psDepAdditionalInfo,
3411 NdefMap->SendRecvBuf,
3412 NdefMap->SendLength,
3413 NdefMap->SendRecvBuf,
3414 NdefMap->SendRecvLength);
3419 static NFCSTATUS phFriNfc_MifStd_H_ChkNdefCmpltBlocks(phFriNfc_NdefMap_t *NdefMap)
3421 NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3422 NFCSTATUS_INVALID_PARAMETER);
3423 /* If NoOfNdefCompBlocks is found to be zero,
3424 should we warn the user */
3425 if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks !=
3426 PH_FRINFC_MIFARESTD_VAL0) &&
3427 (NdefMap->StdMifareContainer.NoOfNdefCompBlocks <=
3428 PH_FRINFC_MIFARESTD4K_MAX_BLOCKS))
3430 /* Reading/writing to the card can start only
3432 NdefMap->StdMifareContainer.currentBlock = 4;
3433 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
3434 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3435 if((Result == NFCSTATUS_SUCCESS) &&
3436 (NdefMap->StdMifareContainer.AuthDone ==
3437 PH_FRINFC_MIFARESTD_FLAG1))
3439 NdefMap->StdMifareContainer.ReadAcsBitFlag = 0;
3440 Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
3444 Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
3451 static void phFriNfc_MifStd_H_RdWrReset(phFriNfc_NdefMap_t *NdefMap)
3453 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
3454 NdefMap->StdMifareContainer.NdefBlocks = PH_FRINFC_MIFARESTD_VAL1;
3455 NdefMap->TLVStruct.BytesRemainLinTLV = PH_FRINFC_MIFARESTD_VAL0;
3456 NdefMap->TLVStruct.LcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3457 NdefMap->TLVStruct.TcheckedinTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
3458 NdefMap->TLVStruct.NdefTLVAuthFlag = PH_FRINFC_MIFARESTD_FLAG0;
3459 NdefMap->TLVStruct.NdefTLVBlock = PH_FRINFC_MIFARESTD_MAD_BLK0;
3460 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
3461 NdefMap->TLVStruct.NoLbytesinTLV = PH_FRINFC_MIFARESTD_VAL0;
3462 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3463 NdefMap->StdMifareContainer.internalLength = PH_FRINFC_MIFARESTD_VAL0;
3464 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
3465 NdefMap->StdMifareContainer.NFCforumSectFlag = PH_FRINFC_MIFARESTD_FLAG0;
3466 NdefMap->StdMifareContainer.FirstReadFlag = PH_FRINFC_MIFARESTD_FLAG1;
3467 NdefMap->StdMifareContainer.ReadWriteCompleteFlag = PH_FRINFC_MIFARESTD_FLAG0;
3468 NdefMap->StdMifareContainer.remainingSize = (uint16_t)
3469 (NdefMap->StdMifareContainer.NoOfNdefCompBlocks *
3470 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
3471 NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL1;
3475 static NFCSTATUS phFriNfc_MifStd_H_RdtoWrNdefLen(phFriNfc_NdefMap_t *NdefMap)
3477 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3478 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TO_WR_NDEF_LEN;
3480 if(NdefMap->TLVStruct.NdefTLVAuthFlag == PH_FRINFC_MIFARESTD_FLAG1)
3482 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG0;
3483 Result = phFriNfc_MifStd_H_AuthSector(NdefMap);
3487 NdefMap->SendRecvBuf[0] = NdefMap->StdMifareContainer.currentBlock;
3488 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
3489 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
3491 #ifndef PH_HAL4_ENABLE
3492 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
3494 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
3496 /* Call the Overlapped HAL Transceive function */
3497 Result = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
3498 &NdefMap->MapCompletionInfo,
3499 NdefMap->psRemoteDevInfo,
3501 &NdefMap->psDepAdditionalInfo,
3502 NdefMap->SendRecvBuf,
3503 NdefMap->SendLength,
3504 NdefMap->SendRecvBuf,
3505 NdefMap->SendRecvLength);
3511 static void phFriNfc_MifStd_H_SetNdefBlkAuth(phFriNfc_NdefMap_t *NdefMap)
3513 NdefMap->TLVStruct.NdefTLVAuthFlag =
3514 ((phFriNfc_MifStd_H_GetSect(NdefMap->TLVStruct.NdefTLVBlock)
3515 == phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock))?
3516 PH_FRINFC_MIFARESTD_FLAG0:
3517 PH_FRINFC_MIFARESTD_FLAG1);
3520 static NFCSTATUS phFriNfc_MifStd_H_GetActCardLen(phFriNfc_NdefMap_t *NdefMap)
3522 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3523 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_GET_ACT_CARDSIZE;
3524 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
3526 Result = ((NdefMap->StdMifareContainer.AuthDone ==
3527 PH_FRINFC_MIFARESTD_FLAG0)?
3528 phFriNfc_MifStd_H_AuthSector(NdefMap):
3529 phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
3530 NdefMap->StdMifareContainer.currentBlock));
3535 static NFCSTATUS phFriNfc_MifStd_H_ChkTLVs(phFriNfc_NdefMap_t *NdefMap,
3538 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3539 uint16_t TempLength = PH_FRINFC_MIFARESTD_VAL0,
3540 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3541 uint8_t TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3542 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE;
3543 TempLength = NdefMap->TLVStruct.NdefTLVByte;
3546 #ifdef PH_HAL4_ENABLE
3547 if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
3548 (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T) &&
3549 (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NDEFTLV_T) &&
3550 (FALSE == NdefMap->TLVStruct.NdefTLVFoundFlag))
3552 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3553 NFCSTATUS_NO_NDEF_SUPPORT);
3554 NdefMap->TLVStruct.BytesRemainLinTLV = 0;
3555 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
3556 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3561 #endif /* #ifdef PH_HAL4_ENABLE */
3562 if((NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_TERMTLV_T) &&
3563 (NdefMap->SendRecvBuf[TempLength] != PH_FRINFC_MIFARESTD_NULLTLV_T))
3565 if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NDEFTLV_T)
3567 NdefMap->TLVStruct.NdefTLVBlock =
3568 NdefMap->StdMifareContainer.currentBlock;
3569 NdefMap->TLVStruct.NdefTLVByte = (uint8_t)TempLength;
3570 NdefMap->TLVStruct.NdefTLVFoundFlag =
3571 ((NdefMap->SendRecvBuf[TempLength] ==
3572 PH_FRINFC_MIFARESTD_NDEFTLV_T)?
3573 PH_FRINFC_MIFARESTD_FLAG1:
3574 PH_FRINFC_MIFARESTD_FLAG0);
3576 NdefMap->TLVStruct.NULLTLVCount = ((NdefMap->TLVStruct.NULLTLVCount
3577 == PH_FRINFC_MIFARESTD_VAL1)?
3578 PH_FRINFC_MIFARESTD_VAL0:
3579 NdefMap->TLVStruct.NULLTLVCount);
3583 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3587 if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3589 NdefMap->TLVStruct.TcheckedinTLVFlag =
3590 PH_FRINFC_MIFARESTD_FLAG1;
3591 NdefMap->TLVStruct.NoLbytesinTLV =
3592 PH_FRINFC_MIFARESTD_VAL3;
3594 Result = phFriNfc_MifStd_H_Chk16Bytes( NdefMap,
3596 if(Result != NFCSTATUS_SUCCESS)
3598 *CRFlag = (uint8_t)((Result == NFCSTATUS_PENDING)?
3599 PH_FRINFC_MIFARESTD_FLAG0:
3600 PH_FRINFC_MIFARESTD_FLAG1);
3604 if((((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3605 NdefMap->StdMifareContainer.NdefBlocks) *
3606 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
3607 (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
3609 NdefMap->SendRecvBuf[TempLength]) &&
3610 ((NdefMap->SendRecvBuf[TempLength] <
3611 PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
3612 (NdefMap->TLVStruct.NdefTLVFoundFlag !=
3613 PH_FRINFC_MIFARESTD_VAL1)))
3615 /* Result = Error */
3616 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3617 NFCSTATUS_INVALID_PARAMETER);
3618 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3622 if((((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3623 NdefMap->StdMifareContainer.NdefBlocks) *
3624 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
3625 (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
3627 NdefMap->SendRecvBuf[TempLength]) &&
3628 ((NdefMap->SendRecvBuf[TempLength] ==
3629 PH_FRINFC_MIFARESTD_VAL0) &&
3630 (NdefMap->TLVStruct.NdefTLVFoundFlag ==
3631 PH_FRINFC_MIFARESTD_VAL1)))
3633 /* Result = Error */
3634 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3635 NFCSTATUS_INVALID_PARAMETER);
3636 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3640 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3641 PH_FRINFC_MIFARESTD_FLAG1) &&
3642 (NdefMap->SendRecvBuf[TempLength] <
3643 PH_FRINFC_MIFARESTD_NDEFTLV_L))
3645 Result = phFriNfc_MapTool_SetCardState(NdefMap,
3646 NdefMap->SendRecvBuf[TempLength]);
3647 NdefMap->TLVStruct.BytesRemainLinTLV =
3648 NdefMap->SendRecvBuf[TempLength];
3649 NdefMap->StdMifareContainer.remainingSize -=
3650 PH_FRINFC_MIFARESTD_VAL2;
3651 /* This flag is set */
3652 NdefMap->StdMifareContainer.remSizeUpdFlag =
3653 (uint8_t)((NdefMap->TLVStruct.NULLTLVCount >=
3654 PH_FRINFC_MIFARESTD_VAL2)?
3655 PH_FRINFC_MIFARESTD_FLAG0:
3656 PH_FRINFC_MIFARESTD_FLAG1);
3658 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3662 NdefMap->StdMifareContainer.remainingSize -=
3663 (( NdefMap->SendRecvBuf[TempLength] <
3664 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
3665 (NdefMap->SendRecvBuf[TempLength]
3666 + PH_FRINFC_MIFARESTD_VAL2):
3667 PH_FRINFC_MIFARESTD_VAL0);
3669 if(( NdefMap->SendRecvBuf[TempLength] ==
3670 PH_FRINFC_MIFARESTD_VAL0))
3672 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3673 NFCSTATUS_INVALID_PARAMETER);
3674 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3678 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3679 /* get the next TLV after the proprietary TLV */
3681 ((NdefMap->SendRecvBuf[TempLength] <
3682 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
3683 phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag):
3686 if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
3687 (Result == NFCSTATUS_SUCCESS))
3689 NdefMap->TLVStruct.TcheckedinTLVFlag =
3690 PH_FRINFC_MIFARESTD_FLAG0;
3691 NdefMap->TLVStruct.NoLbytesinTLV =
3692 PH_FRINFC_MIFARESTD_VAL0;
3694 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3695 *CRFlag = (uint8_t)((Result != NFCSTATUS_PENDING)?
3696 PH_FRINFC_MIFARESTD_FLAG1:
3697 PH_FRINFC_MIFARESTD_FLAG0);
3702 if(Result == NFCSTATUS_PENDING)
3704 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
3705 Result = ((NdefMap->SendRecvBuf[TempLength] ==
3706 PH_FRINFC_MIFARESTD_NDEFTLV_L) ?
3708 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3709 NFCSTATUS_INVALID_PARAMETER)));
3711 if(Result != NFCSTATUS_SUCCESS)
3713 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3716 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
3719 if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3721 NdefMap->TLVStruct.TcheckedinTLVFlag =
3722 PH_FRINFC_MIFARESTD_FLAG1;
3723 NdefMap->TLVStruct.NoLbytesinTLV =
3724 PH_FRINFC_MIFARESTD_VAL2;
3726 Result = phFriNfc_MifStd_H_Chk16Bytes( NdefMap,
3728 if(Result != NFCSTATUS_SUCCESS)
3733 ShiftLength = NdefMap->SendRecvBuf[TempLength];
3735 if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3737 NdefMap->TLVStruct.TcheckedinTLVFlag =
3738 PH_FRINFC_MIFARESTD_FLAG1;
3739 NdefMap->TLVStruct.NoLbytesinTLV =
3740 PH_FRINFC_MIFARESTD_VAL1;
3741 NdefMap->TLVStruct.prevLenByteValue =
3742 NdefMap->SendRecvBuf[(TempLength -
3743 PH_FRINFC_MIFARESTD_VAL1)];
3745 Result = phFriNfc_MifStd_H_Chk16Bytes( NdefMap,
3747 if(Result != NFCSTATUS_SUCCESS)
3753 if(((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
3754 NdefMap->StdMifareContainer.NdefBlocks) *
3755 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
3756 (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
3759 << 8) + NdefMap->SendRecvBuf[TempLength]))
3761 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3762 NFCSTATUS_INVALID_REMOTE_DEVICE);
3767 if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
3768 PH_FRINFC_MIFARESTD_FLAG1)
3770 ShiftLength = (( ShiftLength<< 8) +
3771 NdefMap->SendRecvBuf[TempLength]);
3772 NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
3773 Result = phFriNfc_MapTool_SetCardState(NdefMap,
3775 NdefMap->StdMifareContainer.remainingSize -=
3776 PH_FRINFC_MIFARESTD_VAL4;
3777 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
3781 NdefMap->StdMifareContainer.remainingSize -=
3782 ((ShiftLength<< 8) +
3783 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]);
3786 /* get the next TLV after the proprietary TLV */
3787 Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag);
3789 if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
3790 (Result == NFCSTATUS_SUCCESS))
3792 NdefMap->TLVStruct.TcheckedinTLVFlag =
3793 PH_FRINFC_MIFARESTD_FLAG0;
3794 NdefMap->TLVStruct.NoLbytesinTLV =
3795 PH_FRINFC_MIFARESTD_VAL0;
3796 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
3804 else if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
3805 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0))
3807 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3808 NFCSTATUS_INVALID_PARAMETER);
3809 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
3810 PH_FRINFC_MIFARESTD_FLAG1;
3814 else if(NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_NULLTLV_T)
3817 NdefMap->TLVStruct.NULLTLVCount += PH_FRINFC_MIFARESTD_VAL1;
3818 ShiftLength = NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)];
3819 NdefMap->StdMifareContainer.remainingSize -= PH_FRINFC_MIFARESTD_VAL1;
3820 if(NdefMap->StdMifareContainer.remainingSize <
3821 (( ShiftLength << 8) + NdefMap->SendRecvBuf[TempLength]))
3823 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3824 NFCSTATUS_INVALID_REMOTE_DEVICE);
3827 Result = phFriNfc_MifStd_H_Chk16Bytes( NdefMap,
3829 if(Result != NFCSTATUS_SUCCESS)
3831 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL0;
3837 if((NdefMap->SendRecvBuf[TempLength] == PH_FRINFC_MIFARESTD_TERMTLV_T) &&
3838 (NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1))
3841 Result = NFCSTATUS_SUCCESS;
3842 NdefMap->StdMifareContainer.remainingSize -=
3843 PH_FRINFC_MIFARESTD_VAL1;
3848 if(NdefMap->TLVStruct.BytesRemainLinTLV >
3849 NdefMap->StdMifareContainer.remainingSize)
3851 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3852 NFCSTATUS_INVALID_FORMAT);
3856 if(NdefMap->StdMifareContainer.remainingSize ==
3857 PH_FRINFC_MIFARESTD_VAL0)
3859 Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3860 PH_FRINFC_MIFARESTD_FLAG1)?
3862 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
3863 NFCSTATUS_INVALID_PARAMETER)));
3869 static NFCSTATUS phFriNfc_MifStd_H_GetNxtTLV(phFriNfc_NdefMap_t *NdefMap,
3870 uint16_t *TempLength,
3871 uint8_t *TL4bytesFlag)
3873 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3874 uint16_t LengthRemaining = PH_FRINFC_MIFARESTD_VAL0,
3875 TempLen = PH_FRINFC_MIFARESTD_VAL0,
3876 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3878 TempLen = (*TempLength);
3879 LengthRemaining = (PH_FRINFC_MIFARESTD_BYTES_READ -
3880 (TempLen + PH_FRINFC_MIFARESTD_VAL1));
3882 if(*TL4bytesFlag == PH_FRINFC_MIFARESTD_FLAG0)
3884 (*TempLength) += (NdefMap->SendRecvBuf[TempLen] +
3885 PH_FRINFC_MIFARESTD_VAL1);
3887 if(NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG0)
3890 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3891 PH_FRINFC_MIFARESTD_VAL0:
3892 (NdefMap->SendRecvBuf[TempLen] -
3898 (((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3899 PH_FRINFC_MIFARESTD_VAL0:
3900 (NdefMap->SendRecvBuf[TempLen] -
3906 *TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3907 if(NdefMap->TLVStruct.NoLbytesinTLV ==
3908 PH_FRINFC_MIFARESTD_VAL1)
3910 ShiftLength = NdefMap->TLVStruct.prevLenByteValue;
3911 (*TempLength) += ((ShiftLength
3912 << 8) + NdefMap->SendRecvBuf[TempLen] +
3913 PH_FRINFC_MIFARESTD_VAL1);
3917 << 8) + NdefMap->SendRecvBuf[TempLen]) -
3922 ShiftLength = NdefMap->SendRecvBuf[(TempLen - PH_FRINFC_MIFARESTD_VAL1)];
3923 (*TempLength) += ((ShiftLength
3924 << 8) + NdefMap->SendRecvBuf[TempLen] +
3925 PH_FRINFC_MIFARESTD_VAL1);
3929 << 8) + NdefMap->SendRecvBuf[TempLen]) -
3934 NdefMap->TLVStruct.NdefTLVByte =
3935 (uint8_t)(((*TempLength) < PH_FRINFC_MIFARESTD_BYTES_READ)?
3937 (LengthRemaining % PH_FRINFC_MIFARESTD_BYTES_READ));
3939 while(LengthRemaining != PH_FRINFC_MIFARESTD_VAL0)
3941 NdefMap->StdMifareContainer.currentBlock++;
3942 NdefMap->StdMifareContainer.NdefBlocks++;
3943 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3945 ((LengthRemaining <= PH_FRINFC_MIFARESTD_BYTES_READ)?
3947 PH_FRINFC_MIFARESTD_BYTES_READ);
3950 if(NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0)
3952 NdefMap->StdMifareContainer.currentBlock++;
3953 NdefMap->StdMifareContainer.NdefBlocks++;
3954 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3960 static NFCSTATUS phFriNfc_MifStd_H_Chk16Bytes(phFriNfc_NdefMap_t *NdefMap,
3961 uint16_t TempLength)
3963 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3964 if(TempLength == PH_FRINFC_MIFARESTD_BYTES_READ)
3966 NdefMap->StdMifareContainer.currentBlock++;
3967 NdefMap->StdMifareContainer.NdefBlocks++;
3968 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
3971 ((NdefMap->StdMifareContainer.AuthDone == PH_FRINFC_MIFARESTD_FLAG1)?
3972 phFriNfc_MifStd_H_GetActCardLen(NdefMap):
3973 phFriNfc_MifStd_H_AuthSector(NdefMap));
3978 static NFCSTATUS phFriNfc_MifStd_H_ChkRemainTLVs(phFriNfc_NdefMap_t *NdefMap,
3982 NFCSTATUS Result = NFCSTATUS_SUCCESS;
3983 uint16_t TempLength = PH_FRINFC_MIFARESTD_VAL0,
3984 ShiftLength = PH_FRINFC_MIFARESTD_VAL0;
3985 uint8_t TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
3987 switch(NdefMap->TLVStruct.NoLbytesinTLV)
3989 case PH_FRINFC_MIFARESTD_VAL3:
3990 /* if TLV is found then set card state */
3991 Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag ==
3992 PH_FRINFC_MIFARESTD_FLAG1)?
3993 phFriNfc_MapTool_SetCardState(NdefMap,
3994 NdefMap->SendRecvBuf[TempLength]):
3997 /* Check the length field is less than or
3998 equal to 0xFF if yes enter below statement
3999 else enter else if*/
4000 if((NdefMap->SendRecvBuf[TempLength] <
4001 PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
4002 (Result == NFCSTATUS_SUCCESS))
4004 NdefMap->StdMifareContainer.remainingSize -=
4005 PH_FRINFC_MIFARESTD_VAL2;
4007 Result = ((NdefMap->SendRecvBuf[TempLength] >
4008 NdefMap->StdMifareContainer.remainingSize)?
4009 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
4010 NFCSTATUS_INVALID_FORMAT)):
4012 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
4013 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
4014 PH_FRINFC_MIFARESTD_FLAG1) &&
4015 (Result == NFCSTATUS_SUCCESS))
4017 NdefMap->TLVStruct.BytesRemainLinTLV =
4018 NdefMap->SendRecvBuf[TempLength];
4019 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4022 else if(Result == NFCSTATUS_SUCCESS)
4025 Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
4026 &TempLength, &TL4bytesFlag);
4028 NdefMap->StdMifareContainer.remainingSize -=
4029 NdefMap->SendRecvBuf[TempLength];
4030 if((TempLength >= PH_FRINFC_MIFARESTD_BYTES_READ) &&
4031 (*CRFlag == PH_FRINFC_MIFARESTD_FLAG0))
4033 *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4034 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
4043 else if((NdefMap->SendRecvBuf[TempLength] ==
4044 PH_FRINFC_MIFARESTD_NDEFTLV_L) &&
4045 (Result == NFCSTATUS_SUCCESS))
4048 NdefMap->StdMifareContainer.remainingSize -=
4049 PH_FRINFC_MIFARESTD_VAL4;
4050 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG0;
4051 Result = (((((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
4052 NdefMap->SendRecvBuf[(TempLength +
4053 PH_FRINFC_MIFARESTD_VAL1)]) >
4054 NdefMap->StdMifareContainer.remainingSize)?
4055 (PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
4056 NFCSTATUS_INVALID_FORMAT)):
4058 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
4059 PH_FRINFC_MIFARESTD_FLAG1) &&
4060 (Result == NFCSTATUS_SUCCESS))
4062 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
4063 NdefMap->TLVStruct.BytesRemainLinTLV =
4064 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
4065 NdefMap->SendRecvBuf[(TempLength +
4066 PH_FRINFC_MIFARESTD_VAL1)]);
4067 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4069 else if(Result == NFCSTATUS_SUCCESS)
4073 Result = phFriNfc_MifStd_H_GetNxtTLV(NdefMap,
4074 &TempLength, &TL4bytesFlag);
4075 NdefMap->StdMifareContainer.remainingSize -=
4076 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
4077 NdefMap->SendRecvBuf[(TempLength +
4078 PH_FRINFC_MIFARESTD_VAL1)]);
4080 *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4081 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
4086 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4091 /* Result = Error */
4092 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
4093 NFCSTATUS_INVALID_FORMAT);
4094 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4098 case PH_FRINFC_MIFARESTD_VAL2:
4099 case PH_FRINFC_MIFARESTD_VAL1:
4100 ShiftLength = ((NdefMap->TLVStruct.NoLbytesinTLV ==
4101 PH_FRINFC_MIFARESTD_VAL1)?
4102 ((NdefMap->TLVStruct.prevLenByteValue << 8) +
4103 NdefMap->SendRecvBuf[TempLength]):
4104 (((uint16_t)NdefMap->SendRecvBuf[TempLength] << 8) +
4105 NdefMap->SendRecvBuf[(TempLength +
4106 PH_FRINFC_MIFARESTD_VAL1)]));
4107 if(((( NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
4108 NdefMap->StdMifareContainer.NdefBlocks) *
4109 PH_FRINFC_MIFARESTD_BLOCK_BYTES) +
4110 (PH_FRINFC_MIFARESTD_BLOCK_BYTES -
4114 /* Result = Error */
4115 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
4116 NFCSTATUS_INVALID_PARAMETER);
4117 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4121 NdefMap->StdMifareContainer.remainingSize -=
4122 PH_FRINFC_MIFARESTD_VAL2;
4123 if(NdefMap->TLVStruct.NdefTLVFoundFlag ==
4124 PH_FRINFC_MIFARESTD_FLAG1)
4126 NdefMap->TLVStruct.BytesRemainLinTLV = ShiftLength;
4127 if(NdefMap->TLVStruct.BytesRemainLinTLV >
4128 NdefMap->StdMifareContainer.remainingSize)
4130 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
4131 NFCSTATUS_INVALID_FORMAT);
4133 *CRFlag = PH_FRINFC_MIFARESTD_FLAG1;
4134 *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4138 NdefMap->StdMifareContainer.remainingSize -=
4140 *CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
4141 TempLength += PH_FRINFC_MIFARESTD_VAL2;
4142 TL4bytesFlag = PH_FRINFC_MIFARESTD_FLAG1;
4143 Result = ((NdefMap->TLVStruct.NdefTLVFoundFlag == PH_FRINFC_MIFARESTD_FLAG1)?
4145 phFriNfc_MifStd_H_GetNxtTLV(NdefMap, &TempLength, &TL4bytesFlag));
4147 *NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
4148 Result = phFriNfc_MifStd_H_GetActCardLen(NdefMap);
4159 static void phFriNfc_MifStd_H_Get1kStTrail(phFriNfc_NdefMap_t *NdefMap)
4161 switch((NdefMap->StdMifareContainer.currentBlock % 4))
4163 case PH_FRINFC_MIFARESTD_VAL0:
4164 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4165 (NdefMap->StdMifareContainer.currentBlock +
4166 PH_FRINFC_MIFARESTD_MAD_BLK3);
4169 case PH_FRINFC_MIFARESTD_VAL1:
4170 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4171 (NdefMap->StdMifareContainer.currentBlock +
4172 PH_FRINFC_MIFARESTD_MAD_BLK2);
4175 case PH_FRINFC_MIFARESTD_VAL2:
4176 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4177 (NdefMap->StdMifareContainer.currentBlock +
4178 PH_FRINFC_MIFARESTD_MAD_BLK1);
4182 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4183 NdefMap->StdMifareContainer.currentBlock;
4188 static void phFriNfc_MifStd_H_Get4kStTrail(phFriNfc_NdefMap_t *NdefMap)
4190 switch((NdefMap->StdMifareContainer.currentBlock % 16))
4192 case PH_FRINFC_MIFARESTD_MAD_BLK0:
4193 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4194 (NdefMap->StdMifareContainer.currentBlock +
4195 PH_FRINFC_MIFARESTD_BLK15);
4198 case PH_FRINFC_MIFARESTD_MAD_BLK1:
4199 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4200 (NdefMap->StdMifareContainer.currentBlock +
4201 PH_FRINFC_MIFARESTD_BLK14);
4204 case PH_FRINFC_MIFARESTD_MAD_BLK2:
4205 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4206 (NdefMap->StdMifareContainer.currentBlock +
4207 PH_FRINFC_MIFARESTD_BLK13);
4210 case PH_FRINFC_MIFARESTD_MAD_BLK3:
4211 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4212 (NdefMap->StdMifareContainer.currentBlock +
4213 PH_FRINFC_MIFARESTD_BLK12);
4216 case PH_FRINFC_MIFARESTD_BLK4:
4217 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4218 (NdefMap->StdMifareContainer.currentBlock +
4219 PH_FRINFC_MIFARESTD_BLK11);
4222 case PH_FRINFC_MIFARESTD_BLK5:
4223 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4224 (NdefMap->StdMifareContainer.currentBlock +
4225 PH_FRINFC_MIFARESTD_BLK10);
4228 case PH_FRINFC_MIFARESTD_BLK6:
4229 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4230 (NdefMap->StdMifareContainer.currentBlock +
4231 PH_FRINFC_MIFARESTD_BLK9);
4234 case PH_FRINFC_MIFARESTD_BLK7:
4235 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4236 (NdefMap->StdMifareContainer.currentBlock +
4237 PH_FRINFC_MIFARESTD_BLK8);
4240 case PH_FRINFC_MIFARESTD_BLK8:
4241 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4242 (NdefMap->StdMifareContainer.currentBlock +
4243 PH_FRINFC_MIFARESTD_BLK7);
4246 case PH_FRINFC_MIFARESTD_BLK9:
4247 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4248 (NdefMap->StdMifareContainer.currentBlock +
4249 PH_FRINFC_MIFARESTD_BLK6);
4252 case PH_FRINFC_MIFARESTD_BLK10:
4253 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4254 (NdefMap->StdMifareContainer.currentBlock +
4255 PH_FRINFC_MIFARESTD_BLK5);
4258 case PH_FRINFC_MIFARESTD_BLK11:
4259 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4260 (NdefMap->StdMifareContainer.currentBlock +
4261 PH_FRINFC_MIFARESTD_BLK4);
4264 case PH_FRINFC_MIFARESTD_BLK12:
4265 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4266 (NdefMap->StdMifareContainer.currentBlock +
4267 PH_FRINFC_MIFARESTD_MAD_BLK3);
4270 case PH_FRINFC_MIFARESTD_BLK13:
4271 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4272 (NdefMap->StdMifareContainer.currentBlock +
4273 PH_FRINFC_MIFARESTD_MAD_BLK2);
4276 case PH_FRINFC_MIFARESTD_BLK14:
4277 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4278 (NdefMap->StdMifareContainer.currentBlock +
4279 PH_FRINFC_MIFARESTD_MAD_BLK1);
4283 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4284 NdefMap->StdMifareContainer.currentBlock;
4289 static NFCSTATUS phFriNfc_MifStd_H_ProChkNdef(phFriNfc_NdefMap_t *NdefMap)
4291 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4292 /* Copy remaining bytes into the AID array
4293 from Receive Buffer till array number 7 in aid */
4294 if(NdefMap->StdMifareContainer.currentBlock ==
4295 PH_FRINFC_MIFARESTD_VAL1)
4297 /* Helper Function to Store AID Information */
4298 phFriNfc_MifStd_H_fillAIDarray(NdefMap);
4300 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_VAL2;
4301 /* read remaining AIDs from block number 2 */
4302 Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
4303 PH_FRINFC_MIFARESTD_FLAG1)?
4305 phFriNfc_MifareStdMap_ChkNdef( NdefMap));
4307 else if(((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) &&
4308 (NdefMap->StdMifareContainer.currentBlock ==
4309 PH_FRINFC_MIFARESTD_MAD_BLK2)) || (
4310 (NdefMap->StdMifareContainer.currentBlock ==
4311 PH_FRINFC_MIFARESTD_MAD_BLK66) &&
4312 (NdefMap->CardType ==
4313 PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)))
4315 /* Helper Function to Store AID Information */
4316 phFriNfc_MifStd_H_fillAIDarray(NdefMap);
4318 NdefMap->StdMifareContainer.aidCompleteFlag =
4319 PH_FRINFC_MIFARESTD_FLAG1;
4320 }/* Mifare 1k and Mifare 4k end Check */
4321 else if((NdefMap->StdMifareContainer.currentBlock >
4322 PH_FRINFC_MIFARESTD_VAL1) &&
4323 (NdefMap->CardType ==
4324 PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
4326 phFriNfc_MifStd_H_fillAIDarray(NdefMap);
4327 /* read remaining AIDs from block number 2 */
4328 /* Mifare 4k Helper Function */
4329 Result = ((NdefMap->StdMifareContainer.aidCompleteFlag ==
4330 PH_FRINFC_MIFARESTD_FLAG1)?
4332 phFriNfc_MifStd4k_H_CheckNdef(NdefMap));
4333 } /* Card Type 4k Check */
4336 /* Since we have decided temporarily not to go
4337 for any new error codes we are using
4338 NFCSTATUS_INVALID_PARAMETER even though it is not
4339 the relevant error code here TBD */
4340 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4341 NFCSTATUS_INVALID_PARAMETER);
4344 if(NdefMap->StdMifareContainer.aidCompleteFlag ==
4345 PH_FRINFC_MIFARESTD_FLAG1)
4347 NdefMap->StdMifareContainer.ChkNdefCompleteFlag =
4348 PH_FRINFC_MIFARESTD_FLAG1;
4349 /* The check for NDEF compliant information is now over for
4351 Update(decrement) the NoOfNdefCompBlocks as much required,
4352 depending on the NDEF compliant information found */
4353 /* Check the Sectors are Ndef Compliant */
4354 phFriNfc_MifStd_H_ChkNdefCmpltSects(NdefMap);
4355 if((NdefMap->StdMifareContainer.NoOfNdefCompBlocks == 0) ||
4356 (NdefMap->StdMifareContainer.NoOfNdefCompBlocks > 255))
4358 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4359 NFCSTATUS_NO_NDEF_SUPPORT);
4363 NdefMap->StdMifareContainer.aidCompleteFlag =
4364 PH_FRINFC_MIFARESTD_FLAG0;
4365 NdefMap->StdMifareContainer.NFCforumSectFlag =
4366 PH_FRINFC_MIFARESTD_FLAG0;
4367 NdefMap->StdMifareContainer.currentBlock = PH_FRINFC_MIFARESTD_BLK4;
4368 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4369 Result = ((Result != NFCSTATUS_SUCCESS)?
4370 Result:phFriNfc_MifStd_H_AuthSector(NdefMap));
4377 static NFCSTATUS phFriNfc_MifStd_H_ProAuth(phFriNfc_NdefMap_t *NdefMap)
4379 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4380 if(NdefMap->TLVStruct.NdefTLVAuthFlag ==
4381 PH_FRINFC_MIFARESTD_FLAG1)
4383 NdefMap->TLVStruct.NdefTLVAuthFlag =
4384 PH_FRINFC_MIFARESTD_FLAG0;
4385 NdefMap->StdMifareContainer.AuthDone = PH_FRINFC_MIFARESTD_FLAG1;
4386 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
4390 NdefMap->StdMifareContainer.AuthDone = 1;
4391 NdefMap->StdMifareContainer.ReadAcsBitFlag = 1;
4392 Result = phFriNfc_MifStd_H_RdAcsBit(NdefMap);
4397 static NFCSTATUS phFriNfc_MifStd_H_Rd16Bytes(phFriNfc_NdefMap_t *NdefMap,
4400 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4401 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] = BlockNo;
4402 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_READ;
4403 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
4404 #ifndef PH_HAL4_ENABLE
4405 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareRead;
4407 NdefMap->Cmd.MfCmd = phHal_eMifareRead;
4409 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
4410 NdefMap->MapCompletionInfo.Context = NdefMap;
4411 /* Call the Overlapped HAL Transceive function */
4412 Result = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
4413 &NdefMap->MapCompletionInfo,
4414 NdefMap->psRemoteDevInfo,
4416 &NdefMap->psDepAdditionalInfo,
4417 NdefMap->SendRecvBuf,
4418 NdefMap->SendLength,
4419 NdefMap->SendRecvBuf,
4420 NdefMap->SendRecvLength);
4424 static NFCSTATUS phFriNfc_MifStd_H_ProAcsBits(phFriNfc_NdefMap_t *NdefMap)
4426 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4427 uint8_t CRFlag = PH_FRINFC_MIFARESTD_FLAG0;
4428 if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
4430 if(NdefMap->StdMifareContainer.ReadAcsBitFlag ==
4431 PH_FRINFC_MIFARESTD_FLAG1)
4433 /* check for the correct access bits */
4434 Result = phFriNfc_MifStd_H_ChkAcsBit(NdefMap);
4436 if((NdefMap->StdMifareContainer.ChkNdefFlag ==
4437 PH_FRINFC_MIFARESTD_FLAG1) &&
4438 (Result == NFCSTATUS_SUCCESS))
4440 if(NdefMap->CardState ==
4441 PH_NDEFMAP_CARD_STATE_INVALID)
4443 NdefMap->StdMifareContainer.NoOfNdefCompBlocks =
4444 ((NdefMap->StdMifareContainer.currentBlock >=
4445 PH_FRINFC_MIFARESTD4K_BLK128)?
4446 (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
4447 PH_FRINFC_MIFARESTD_BLK15):
4448 (NdefMap->StdMifareContainer.NoOfNdefCompBlocks -
4449 PH_FRINFC_MIFARESTD_MAD_BLK3));
4451 NdefMap->StdMifareContainer.ProprforumSectFlag =
4452 ((NdefMap->StdMifareContainer.NFCforumSectFlag ==
4453 PH_FRINFC_MIFARESTD_FLAG1)?
4454 PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG:
4455 PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG);
4457 Result = phFriNfc_MifStd_H_ProStatNotValid(NdefMap, Result);
4461 NdefMap->StdMifareContainer.NFCforumSectFlag =
4462 (((NdefMap->StdMifareContainer.currentBlock == 64) &&
4463 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))?
4464 NdefMap->StdMifareContainer.NFCforumSectFlag:
4465 PH_FRINFC_MIFARESTD_FLAG1);
4468 if(NdefMap->StdMifareContainer.ProprforumSectFlag !=
4469 PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG)
4471 NdefMap->StdMifareContainer.ReadAcsBitFlag = PH_FRINFC_MIFARESTD_FLAG0;
4472 /* ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
4473 PH_FRINFC_MIFARESTD_FLAG1)?
4474 PH_FRINFC_MIFARESTD_FLAG0:
4475 PH_FRINFC_MIFARESTD_FLAG1);*/
4477 NdefMap->StdMifareContainer.ReadCompleteFlag =
4478 (uint8_t)((((((NdefMap->StdMifareContainer.currentBlock +
4479 PH_FRINFC_MIFARESTD_VAL4) >=
4480 PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
4481 (NdefMap->CardType ==
4482 PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) &&
4483 (NdefMap->StdMifareContainer.ReadCompleteFlag ==
4484 PH_FRINFC_MIFARESTD_FLAG0)) ||
4485 (NdefMap->StdMifareContainer.ReadCompleteFlag ==
4486 PH_FRINFC_MIFARESTD_FLAG1))?
4487 PH_FRINFC_MIFARESTD_FLAG1:
4488 PH_FRINFC_MIFARESTD_FLAG0);
4490 NdefMap->StdMifareContainer.ReadCompleteFlag =
4491 (uint8_t)((((((uint16_t)(NdefMap->StdMifareContainer.currentBlock +
4492 PH_FRINFC_MIFARESTD_VAL4) >=
4493 PH_FRINFC_MIFARESTD4K_MAX_BLK) &&
4494 (NdefMap->CardType ==
4495 PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)) &&
4496 (NdefMap->StdMifareContainer.ReadCompleteFlag ==
4497 PH_FRINFC_MIFARESTD_FLAG0)) ||
4498 (NdefMap->StdMifareContainer.ReadCompleteFlag ==
4499 PH_FRINFC_MIFARESTD_FLAG1))?
4500 PH_FRINFC_MIFARESTD_FLAG1:
4501 PH_FRINFC_MIFARESTD_FLAG0);
4503 NdefMap->StdMifareContainer.currentBlock =
4504 ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
4505 PH_FRINFC_MIFARESTD_FLAG1)?
4506 PH_FRINFC_MIFARESTD_BLK4:
4507 NdefMap->StdMifareContainer.currentBlock);
4510 ((NdefMap->StdMifareContainer.ReadCompleteFlag ==
4511 PH_FRINFC_MIFARESTD_FLAG1)?
4512 phFriNfc_MifStd_H_BlkChk(NdefMap):
4517 Result = ((Result != NFCSTATUS_SUCCESS)?
4519 phFriNfc_MifStd_H_ChkRdWr(NdefMap));
4523 NdefMap->StdMifareContainer.ChkNdefFlag =
4524 PH_FRINFC_MIFARESTD_FLAG0;
4525 /* Here its required to read the entire card to know the */
4526 /* Get exact ndef size of the card */
4527 Result = phFriNfc_MifStd_H_ChkTLVs(NdefMap, &CRFlag);
4532 /* Since we have decided temporarily not to go
4533 for any new error codes we are using
4534 NFCSTATUS_INVALID_PARAMETER even though it is not
4535 the relevant error code here TBD */
4536 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4537 NFCSTATUS_INVALID_PARAMETER);
4543 static NFCSTATUS phFriNfc_MifStd_H_GPBChk(phFriNfc_NdefMap_t *NdefMap)
4545 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4547 /* Spec version needs to be checked every time */
4548 Result = phFriNfc_MapTool_ChkSpcVer(NdefMap, PH_FRINFC_MIFARESTD_VAL9);
4550 /* Check rhe read and write access field
4552 bit 0 and 1 for write access check
4553 bit 2 and 3 for read access check */
4554 if(Result == NFCSTATUS_SUCCESS)
4556 if(((NdefMap->SendRecvBuf[
4557 PH_FRINFC_MIFARESTD_VAL9] &
4558 PH_FRINFC_MIFARESTD_MASK_GPB_WR) ==
4559 PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
4560 ((NdefMap->SendRecvBuf[
4561 PH_FRINFC_MIFARESTD_VAL9] &
4562 PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
4563 PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
4565 NdefMap->CardState = (((NdefMap->StdMifareContainer.ChkNdefFlag ==
4566 PH_FRINFC_MIFARESTD_FLAG1) ||
4567 (NdefMap->StdMifareContainer.ReadNdefFlag ==
4568 PH_FRINFC_MIFARESTD_FLAG1) ||
4569 (NdefMap->StdMifareContainer.WrNdefFlag ==
4570 PH_FRINFC_MIFARESTD_FLAG1))?
4571 PH_NDEFMAP_CARD_STATE_INITIALIZED:
4572 PH_NDEFMAP_CARD_STATE_READ_WRITE);
4574 else if(((NdefMap->SendRecvBuf[
4575 PH_FRINFC_MIFARESTD_VAL9] &
4576 PH_FRINFC_MIFARESTD_MASK_GPB_WR) !=
4577 PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL) &&
4578 ((NdefMap->SendRecvBuf[
4579 PH_FRINFC_MIFARESTD_VAL9] &
4580 PH_FRINFC_MIFARESTD_MASK_GPB_RD) ==
4581 PH_FRINFC_MIFARESTD_GPB_RD_WR_VAL))
4583 /* write access not given
4584 only read access check */
4585 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY;
4589 NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
4595 static NFCSTATUS phFriNfc_MifStd_H_ProStatNotValid(phFriNfc_NdefMap_t *NdefMap,
4598 NFCSTATUS Result = status;
4599 /* if NFC forum sector is not found before the proprietary one then
4600 authenticate the next sector
4601 Else it is a error*/
4602 if(NdefMap->StdMifareContainer.NFCforumSectFlag ==
4603 PH_FRINFC_MIFARESTD_FLAG0)
4605 NdefMap->StdMifareContainer.ProprforumSectFlag =
4606 PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG;
4607 if(NdefMap->StdMifareContainer.currentBlock <
4608 PH_FRINFC_MIFARESTD4K_BLK128)
4610 #ifdef PH_HAL4_ENABLE
4611 /* Fix for the disovery problem,
4612 if 1st sector is invalid then ignore the remaining sectors and
4613 send an error if the card is mifare 1k,
4614 if the card is mifare 4k, then update the block number to 67 and
4616 Even if the authentication of that block fails then send error */
4617 if(((NdefMap->StdMifareContainer.currentBlock <
4618 PH_FRINFC_MIFARESTD_BLK4) &&
4619 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
4620 ((NdefMap->StdMifareContainer.currentBlock <=
4621 PH_FRINFC_MIFARESTD_MAD_BLK67) &&
4622 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)))
4624 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4625 NFCSTATUS_NO_NDEF_SUPPORT);
4627 else if((NdefMap->StdMifareContainer.currentBlock <
4628 PH_FRINFC_MIFARESTD_BLK4) &&
4629 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
4631 Result = NFCSTATUS_SUCCESS;
4632 NdefMap->StdMifareContainer.currentBlock =
4633 PH_FRINFC_MIFARESTD_MAD_BLK67;
4636 #endif /* #ifdef PH_HAL4_ENABLE */
4637 if(((NdefMap->StdMifareContainer.currentBlock +
4638 PH_FRINFC_MIFARESTD_BLK4) >
4639 PH_FRINFC_MIFARESTD1K_MAX_BLK) &&
4640 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD))
4642 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4643 NFCSTATUS_NO_NDEF_SUPPORT);
4647 NdefMap->StdMifareContainer.remainingSize -=
4648 (PH_FRINFC_MIFARESTD_MAD_BLK3 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4649 NdefMap->StdMifareContainer.currentBlock +=
4650 PH_FRINFC_MIFARESTD_BLK4;
4651 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4654 else if((NdefMap->StdMifareContainer.currentBlock +
4655 PH_FRINFC_MIFARESTD_BLK15) >
4656 PH_FRINFC_MIFARESTD4K_MAX_BLK)
4658 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4659 NFCSTATUS_NO_NDEF_SUPPORT);
4663 NdefMap->StdMifareContainer.remainingSize -=
4664 (PH_FRINFC_MIFARESTD_BLK15 * PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4665 NdefMap->StdMifareContainer.currentBlock +=
4666 PH_FRINFC_MIFARESTD_BLOCK_BYTES;
4667 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
4669 Result = ((Result != NFCSTATUS_SUCCESS)?
4670 (PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4671 NFCSTATUS_NO_NDEF_SUPPORT)):
4672 phFriNfc_MifStd_H_AuthSector(NdefMap));
4674 else if((NdefMap->StdMifareContainer.ProprforumSectFlag ==
4675 PH_FRINFC_MIFARESTD_PROP_3RD_CONFIG) &&
4676 (NdefMap->StdMifareContainer.NFCforumSectFlag ==
4677 PH_FRINFC_MIFARESTD_FLAG1))
4679 /* if the proprietary forum sector are found before
4680 NFC forum sector then again a proprietary
4681 forum sector are found after the NFC forum
4683 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4684 NFCSTATUS_NO_NDEF_SUPPORT);
4688 NdefMap->StdMifareContainer.ProprforumSectFlag =
4689 PH_FRINFC_MIFARESTD_PROP_2ND_CONFIG;
4690 switch(NdefMap->PrevOperation)
4692 case PH_FRINFC_NDEFMAP_CHECK_OPE:
4693 case PH_FRINFC_NDEFMAP_GET_ACTSIZE_OPE:
4694 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4695 NFCSTATUS_NO_NDEF_SUPPORT);
4698 case PH_FRINFC_NDEFMAP_READ_OPE:
4699 if((NdefMap->TLVStruct.NdefTLVFoundFlag ==
4700 PH_FRINFC_MIFARESTD_FLAG1) &&
4701 (NdefMap->TLVStruct.NoLbytesinTLV ==
4702 PH_FRINFC_MIFARESTD_VAL0))
4704 *NdefMap->NumOfBytesRead = NdefMap->ApduBuffIndex;
4705 Result = NFCSTATUS_SUCCESS;
4709 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4710 NFCSTATUS_NO_NDEF_SUPPORT);
4714 case PH_FRINFC_NDEFMAP_WRITE_OPE:
4716 /* This means the further write is not possible,
4717 EOF_NDEF_CONTAINER_REACHED */
4718 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
4719 PH_FRINFC_MIFARESTD_FLAG1;
4720 /* Write the length to the L field in the TLV */
4721 NdefMap->StdMifareContainer.TempBlockNo =
4722 NdefMap->StdMifareContainer.currentBlock;
4723 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
4724 NdefMap->StdMifareContainer.currentBlock =
4725 NdefMap->TLVStruct.NdefTLVBlock;
4726 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
4733 static NFCSTATUS phFriNfc_MifStd_H_RdBeforeWr(phFriNfc_NdefMap_t *NdefMap)
4735 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4736 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_BEF_WR;
4737 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE;
4739 Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
4740 NdefMap->StdMifareContainer.currentBlock);
4744 static NFCSTATUS phFriNfc_MifStd_H_ProBytesToWr(phFriNfc_NdefMap_t *NdefMap)
4746 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4747 uint8_t TempLength = PH_FRINFC_MIFARESTD_VAL0;
4749 if(*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ)
4751 (void)memcpy(&NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1],
4752 NdefMap->SendRecvBuf,
4753 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4755 /* Write to Ndef TLV Block */
4756 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4757 NdefMap->StdMifareContainer.currentBlock;
4759 TempLength = ((NdefMap->StdMifareContainer.currentBlock ==
4760 NdefMap->TLVStruct.NdefTLVBlock)?
4761 phFriNfc_MifStd_H_UpdateTLV(NdefMap):
4762 phFriNfc_MifStd_H_UpdRemTLV(NdefMap));
4764 NdefMap->StdMifareContainer.remainingSize -=
4765 ((NdefMap->StdMifareContainer.remSizeUpdFlag ==
4766 PH_FRINFC_MIFARESTD_FLAG1)?
4767 PH_FRINFC_MIFARESTD_VAL2:
4768 PH_FRINFC_MIFARESTD_VAL0);
4770 NdefMap->StdMifareContainer.remSizeUpdFlag = PH_FRINFC_MIFARESTD_FLAG0;
4771 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
4772 Result = ((TempLength == PH_FRINFC_MIFARESTD_BLOCK_BYTES)?
4773 phFriNfc_MifStd_H_WrTLV(NdefMap):
4774 phFriNfc_MifStd_H_fillSendBuf(NdefMap, TempLength));
4778 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
4779 NFCSTATUS_READ_FAILED);
4785 static uint8_t phFriNfc_MifStd_H_UpdateTLV(phFriNfc_NdefMap_t *NdefMap)
4787 uint8_t TempLength = PH_FRINFC_MIFARESTD_VAL0;
4788 TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte + PH_FRINFC_MIFARESTD_VAL1);
4790 if(NdefMap->TLVStruct.NULLTLVCount >= 2)
4792 if((PH_FRINFC_MIFARESTD_BYTES_READ - TempLength) ==
4793 PH_FRINFC_MIFARESTD_VAL0)
4795 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4799 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4801 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4806 switch((PH_FRINFC_MIFARESTD_BYTES_READ -
4809 case PH_FRINFC_MIFARESTD_VAL0:
4810 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4813 case PH_FRINFC_MIFARESTD_VAL1:
4814 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4816 NdefMap->TLVStruct.prevLenByteValue =
4817 (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
4818 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
4819 PH_FRINFC_MIFARESTD_VAL0:
4820 NdefMap->SendRecvBuf[TempLength]);
4821 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4824 case PH_FRINFC_MIFARESTD_VAL2:
4825 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4827 NdefMap->TLVStruct.prevLenByteValue =
4828 (uint16_t)((NdefMap->SendRecvBuf[TempLength] >=
4829 PH_FRINFC_MIFARESTD_NDEFTLV_L)?
4830 NdefMap->SendRecvBuf[(TempLength +
4831 PH_FRINFC_MIFARESTD_VAL1)]:
4832 NdefMap->SendRecvBuf[TempLength]);
4833 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4835 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4839 NdefMap->TLVStruct.prevLenByteValue =
4840 NdefMap->SendRecvBuf[TempLength];
4841 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4843 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
4845 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
4847 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
4855 static NFCSTATUS phFriNfc_MifStd_H_fillSendBuf(phFriNfc_NdefMap_t *NdefMap,
4858 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4859 uint16_t RemainingBytes = PH_FRINFC_MIFARESTD_VAL0,
4860 BytesToWrite = PH_FRINFC_MIFARESTD_VAL0;
4861 uint8_t index = PH_FRINFC_MIFARESTD_VAL0;
4863 Length = (Length + PH_FRINFC_MIFARESTD_VAL1);
4865 RemainingBytes = (uint16_t)((NdefMap->StdMifareContainer.remainingSize
4866 < (uint16_t)(NdefMap->ApduBufferSize -
4867 NdefMap->ApduBuffIndex))?
4868 NdefMap->StdMifareContainer.remainingSize:
4869 (NdefMap->ApduBufferSize -
4870 NdefMap->ApduBuffIndex));
4872 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL0] =
4873 NdefMap->StdMifareContainer.currentBlock;
4874 /* Get the number of bytes that can be written after copying
4875 the internal buffer */
4876 BytesToWrite = ((RemainingBytes <
4877 ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
4878 NdefMap->StdMifareContainer.internalLength))?
4880 ((PH_FRINFC_MIFARESTD_WR_A_BLK - Length) -
4881 NdefMap->StdMifareContainer.internalLength));
4883 if(NdefMap->StdMifareContainer.internalLength >
4884 PH_FRINFC_MIFARESTD_VAL0)
4886 /* copy the internal buffer to the send buffer */
4887 (void)memcpy(&(NdefMap->SendRecvBuf[
4889 NdefMap->StdMifareContainer.internalBuf,
4890 NdefMap->StdMifareContainer.internalLength);
4893 /* Copy Bytes to write in the send buffer */
4894 (void)memcpy(&(NdefMap->SendRecvBuf[
4896 NdefMap->StdMifareContainer.internalLength)]),
4897 &(NdefMap->ApduBuffer[NdefMap->ApduBuffIndex]),
4900 /* update number of bytes written from the user buffer */
4901 NdefMap->NumOfBytesWritten = BytesToWrite;
4903 /* check the exact number of bytes written to a block including the
4905 *NdefMap->DataCount =
4906 ((BytesToWrite + NdefMap->StdMifareContainer.internalLength
4907 + Length) - PH_FRINFC_MIFARESTD_VAL1);
4909 /* if total bytes to write in the card is less than 4 bytes then
4910 pad zeroes till 4 bytes */
4911 if((BytesToWrite + NdefMap->StdMifareContainer.internalLength +
4912 Length) < PH_FRINFC_MIFARESTD_WR_A_BLK)
4914 for(index = (uint8_t)(BytesToWrite +
4915 NdefMap->StdMifareContainer.internalLength +
4917 index < PH_FRINFC_MIFARESTD_WR_A_BLK;
4920 NdefMap->SendRecvBuf[index] = (uint8_t)((index ==
4921 (BytesToWrite + Length +
4922 NdefMap->StdMifareContainer.internalLength))?
4923 PH_FRINFC_MIFARESTD_TERMTLV_T:
4924 PH_FRINFC_MIFARESTD_NULLTLV_T);
4926 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
4929 #ifdef PH_HAL4_ENABLE
4931 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG1;
4933 #endif /* #ifdef PH_HAL4_ENABLE */
4935 /* A temporary buffer to hold four bytes of data that is
4936 written to the card */
4937 (void)memcpy(NdefMap->StdMifareContainer.Buffer,
4938 &(NdefMap->SendRecvBuf[
4939 PH_FRINFC_MIFARESTD_VAL1]),
4940 PH_FRINFC_MIFARESTD_BLOCK_BYTES);
4942 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_WR_TLV;
4943 Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
4947 static NFCSTATUS phFriNfc_MifStd_H_WrTLV(phFriNfc_NdefMap_t *NdefMap)
4949 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4951 /* set the data for additional data exchange*/
4952 NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
4953 NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0;
4954 NdefMap->psDepAdditionalInfo.NAD = 0;
4955 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
4956 NdefMap->MapCompletionInfo.Context = NdefMap;
4957 /* Write from here */
4958 NdefMap->SendLength = MIFARE_MAX_SEND_BUF_TO_WRITE;
4960 #ifndef PH_HAL4_ENABLE
4961 NdefMap->Cmd.MfCmd = phHal_eMifareCmdListMifareWrite16;
4963 NdefMap->Cmd.MfCmd = phHal_eMifareWrite16;
4966 *NdefMap->SendRecvLength = NdefMap->TempReceiveLength;
4967 /* Call the Overlapped HAL Transceive function */
4968 Result = phFriNfc_OvrHal_Transceive( NdefMap->LowerDevice,
4969 &NdefMap->MapCompletionInfo,
4970 NdefMap->psRemoteDevInfo,
4972 &NdefMap->psDepAdditionalInfo,
4973 NdefMap->SendRecvBuf,
4974 NdefMap->SendLength,
4975 NdefMap->SendRecvBuf,
4976 NdefMap->SendRecvLength);
4982 static NFCSTATUS phFriNfc_MifStd_H_ProWrTLV(phFriNfc_NdefMap_t *NdefMap)
4984 NFCSTATUS Result = NFCSTATUS_SUCCESS;
4985 /* Check that if complete TLV has been written in the
4986 card if yes enter the below check or go to else*/
4987 if(((((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
4988 NdefMap->TLVStruct.NdefTLVByte) ==
4989 PH_FRINFC_MIFARESTD_VAL1) &&
4990 (NdefMap->TLVStruct.NULLTLVCount >=
4991 PH_FRINFC_MIFARESTD_VAL2)) ||
4992 (((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
4993 NdefMap->TLVStruct.NdefTLVByte) <=
4994 PH_FRINFC_MIFARESTD_VAL3) &&
4995 (NdefMap->TLVStruct.NULLTLVCount ==
4996 PH_FRINFC_MIFARESTD_VAL0))) &&
4997 (NdefMap->StdMifareContainer.currentBlock ==
4998 NdefMap->TLVStruct.NdefTLVBlock))
5000 /* increment the block and chekc the block is in the same sector
5001 using the block check function */
5002 NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5003 NdefMap->StdMifareContainer.currentBlock++;
5004 NdefMap->StdMifareContainer.NdefBlocks++;
5005 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5006 if(Result == NFCSTATUS_SUCCESS)
5008 Result = ((NdefMap->StdMifareContainer.AuthDone ==
5009 PH_FRINFC_MIFARESTD_FLAG0)?
5010 phFriNfc_MifStd_H_AuthSector(NdefMap):
5011 phFriNfc_MifStd_H_RdBeforeWr(NdefMap));
5016 NdefMap->StdMifareContainer.RdBeforeWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5017 if(NdefMap->ApduBuffIndex <
5018 (uint16_t)NdefMap->ApduBufferSize)
5020 if(*NdefMap->DataCount < PH_FRINFC_MIFARESTD_BLOCK_BYTES)
5022 /* Write complete, so next byte shall be */
5023 NdefMap->StdMifareContainer.internalLength =
5024 *NdefMap->DataCount;
5026 /* Copy bytes less than 16 to internal buffer
5027 for the next write this can be used */
5028 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
5029 NdefMap->StdMifareContainer.Buffer,
5030 NdefMap->StdMifareContainer.internalLength);
5033 /* Increment the Send Buffer index */
5034 NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
5036 NdefMap->StdMifareContainer.remainingSize -=
5037 NdefMap->NumOfBytesWritten;
5039 /* Check for the End of Card */
5040 if((NdefMap->StdMifareContainer.remainingSize ==
5041 PH_FRINFC_MIFARESTD_VAL0) ||
5042 (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
5044 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5045 (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 0)?
5046 PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
5048 if(NdefMap->StdMifareContainer.internalLength ==
5049 PH_FRINFC_MIFARESTD_VAL0)
5051 NdefMap->StdMifareContainer.currentBlock++;
5052 /* Mifare 4k Card, After 128th Block
5053 each sector = 16 blocks in Mifare 4k */
5054 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5055 NdefMap->StdMifareContainer.NdefBlocks++;
5058 NdefMap->TLVStruct.SetTermTLVFlag =
5059 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5060 PH_FRINFC_MIFARESTD_VAL0) ||
5061 (NdefMap->TLVStruct.SetTermTLVFlag ==
5062 PH_FRINFC_MIFARESTD_FLAG1))?
5063 PH_FRINFC_MIFARESTD_FLAG1:
5064 PH_FRINFC_MIFARESTD_FLAG0);
5069 NdefMap->StdMifareContainer.currentBlock++;
5070 /* Mifare 4k Card, After 128th Block
5071 each sector = 16 blocks in Mifare 4k */
5072 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5073 if(Result == NFCSTATUS_SUCCESS)
5075 NdefMap->StdMifareContainer.NdefBlocks++;
5076 Result = ((NdefMap->StdMifareContainer.AuthDone ==
5077 PH_FRINFC_MIFARESTD_FLAG1)?
5078 phFriNfc_MifStd_H_WrABlock(NdefMap):
5079 phFriNfc_MifStd_H_AuthSector(NdefMap));
5085 if((Result == NFCSTATUS_SUCCESS) &&
5086 (NdefMap->TLVStruct.SetTermTLVFlag !=
5087 PH_FRINFC_MIFARESTD_FLAG1) &&
5088 (NdefMap->StdMifareContainer.remainingSize >
5089 PH_FRINFC_MIFARESTD_VAL0))
5091 Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
5095 if((Result == NFCSTATUS_SUCCESS) &&
5096 (NdefMap->TLVStruct.SetTermTLVFlag ==
5097 PH_FRINFC_MIFARESTD_FLAG1))
5099 /* Write the length to the L field in the TLV */
5100 NdefMap->StdMifareContainer.TempBlockNo =
5101 NdefMap->StdMifareContainer.currentBlock;
5102 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
5103 NdefMap->StdMifareContainer.currentBlock =
5104 NdefMap->TLVStruct.NdefTLVBlock;
5105 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
5111 static uint8_t phFriNfc_MifStd_H_UpdRemTLV(phFriNfc_NdefMap_t *NdefMap)
5113 uint8_t TempLength = PH_FRINFC_MIFARESTD_VAL1;
5114 if(NdefMap->TLVStruct.NULLTLVCount >=
5115 PH_FRINFC_MIFARESTD_VAL2)
5117 NdefMap->TLVStruct.prevLenByteValue = NdefMap->SendRecvBuf[TempLength];
5118 NdefMap->SendRecvBuf[TempLength] =
5119 PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5123 switch((PH_FRINFC_MIFARESTD_BLOCK_BYTES -
5124 NdefMap->TLVStruct.NdefTLVByte))
5126 case PH_FRINFC_MIFARESTD_VAL1:
5127 NdefMap->TLVStruct.prevLenByteValue =
5128 (((NdefMap->SendRecvBuf[TempLength] ==
5129 PH_FRINFC_MIFARESTD_NDEFTLV_L))?
5130 (((uint16_t)NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]
5131 << PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
5132 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL2)]):
5133 NdefMap->SendRecvBuf[TempLength]);
5134 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5136 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5138 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5141 case PH_FRINFC_MIFARESTD_VAL2:
5142 NdefMap->TLVStruct.prevLenByteValue =
5143 (((NdefMap->SendRecvBuf[TempLength] ==
5144 PH_FRINFC_MIFARESTD_NDEFTLV_L))?
5145 (((uint16_t)NdefMap->SendRecvBuf[TempLength] <<
5146 PH_FRINFC_MIFARESTD_LEFTSHIFT8) +
5147 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)]):
5148 NdefMap->SendRecvBuf[TempLength]);
5149 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5151 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5154 case PH_FRINFC_MIFARESTD_VAL3:
5156 NdefMap->TLVStruct.prevLenByteValue =
5157 ((NdefMap->TLVStruct.prevLenByteValue <<
5158 PH_FRINFC_MIFARESTD_LEFTSHIFT8)
5159 + NdefMap->SendRecvBuf[TempLength]);
5160 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L0;
5167 static void phFriNfc_MifStd_H_fillTLV1(phFriNfc_NdefMap_t *NdefMap)
5169 uint8_t TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
5170 PH_FRINFC_MIFARESTD_VAL1);
5172 NdefMap->TLVStruct.prevLenByteValue =
5173 ((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_CUR)?
5174 (NdefMap->TLVStruct.prevLenByteValue +
5175 NdefMap->ApduBuffIndex):
5176 NdefMap->ApduBuffIndex);
5178 NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5179 switch(NdefMap->TLVStruct.NdefTLVByte)
5181 case PH_FRINFC_MIFARESTD_VAL0:
5182 if(NdefMap->TLVStruct.prevLenByteValue >=
5183 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5185 NdefMap->SendRecvBuf[TempLength] =
5186 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5187 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5188 NdefMap->SendRecvBuf[(TempLength +
5189 PH_FRINFC_MIFARESTD_VAL1)] =
5190 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5194 NdefMap->SendRecvBuf[TempLength] =
5195 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5196 NdefMap->SendRecvBuf[(TempLength +
5197 PH_FRINFC_MIFARESTD_VAL1)] =
5198 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5200 NdefMap->StdMifareContainer.RdAfterWrFlag =
5201 PH_FRINFC_MIFARESTD_FLAG0;
5205 case PH_FRINFC_MIFARESTD_VAL1:
5206 if(NdefMap->TLVStruct.prevLenByteValue >=
5207 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5209 NdefMap->SendRecvBuf[TempLength - PH_FRINFC_MIFARESTD_VAL1] =
5210 PH_FRINFC_MIFARESTD_NDEFTLV_L;
5211 NdefMap->SendRecvBuf[TempLength] =
5212 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5213 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5214 NdefMap->SendRecvBuf[(TempLength +
5215 PH_FRINFC_MIFARESTD_VAL1)] =
5216 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5220 NdefMap->SendRecvBuf[TempLength] =
5221 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5222 NdefMap->SendRecvBuf[(TempLength +
5223 PH_FRINFC_MIFARESTD_VAL1)] =
5224 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5225 NdefMap->StdMifareContainer.RdAfterWrFlag =
5226 PH_FRINFC_MIFARESTD_FLAG0;
5230 case PH_FRINFC_MIFARESTD_VAL15:
5231 /* if "Type" of TLV present at byte 15 */
5232 if(NdefMap->TLVStruct.prevLenByteValue >=
5233 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5235 /* Update the null TLV, ndef TLV block and ndef TLV byte */
5236 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5237 NdefMap->TLVStruct.NdefTLVBlock =
5238 NdefMap->StdMifareContainer.currentBlock;
5239 NdefMap->TLVStruct.NdefTLVByte =
5240 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
5242 NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
5243 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5244 NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
5245 PH_FRINFC_MIFARESTD_NDEFTLV_L;
5246 NdefMap->SendRecvBuf[TempLength] =
5247 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5248 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5252 NdefMap->SendRecvBuf[TempLength] =
5253 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5258 /* Already the TLV is present so just append the length field */
5259 if(NdefMap->TLVStruct.prevLenByteValue >=
5260 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5262 /* Update the null TLV, ndef TLV block and ndef TLV byte */
5263 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5264 NdefMap->TLVStruct.NdefTLVBlock =
5265 NdefMap->StdMifareContainer.currentBlock;
5266 NdefMap->TLVStruct.NdefTLVByte =
5267 (TempLength - PH_FRINFC_MIFARESTD_VAL3);
5269 NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL2)] =
5270 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_T;
5271 NdefMap->SendRecvBuf[(TempLength - PH_FRINFC_MIFARESTD_VAL1)] =
5272 (uint8_t)PH_FRINFC_MIFARESTD_NDEFTLV_L;
5273 NdefMap->SendRecvBuf[TempLength] =
5274 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5275 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5276 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
5277 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5281 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5282 NdefMap->SendRecvBuf[(TempLength + PH_FRINFC_MIFARESTD_VAL1)] =
5283 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5285 NdefMap->StdMifareContainer.RdAfterWrFlag =
5286 PH_FRINFC_MIFARESTD_FLAG0;
5291 static void phFriNfc_MifStd_H_fillTLV2(phFriNfc_NdefMap_t *NdefMap)
5293 uint8_t TempLength = (uint8_t)(NdefMap->TLVStruct.NdefTLVByte +
5294 PH_FRINFC_MIFARESTD_VAL1);
5296 NdefMap->TLVStruct.prevLenByteValue = ((NdefMap->Offset ==
5297 PH_FRINFC_NDEFMAP_SEEK_CUR)?
5298 (NdefMap->TLVStruct.prevLenByteValue +
5299 NdefMap->ApduBuffIndex):
5300 NdefMap->ApduBuffIndex);
5301 NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG1;
5302 switch(NdefMap->TLVStruct.NdefTLVByte)
5304 case PH_FRINFC_MIFARESTD_VAL13:
5305 if(NdefMap->TLVStruct.prevLenByteValue >=
5306 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5308 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5310 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
5312 NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5313 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5317 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5319 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5322 /* Update the null TLV, ndef TLV block and ndef TLV byte */
5323 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5324 NdefMap->TLVStruct.NdefTLVBlock =
5325 NdefMap->StdMifareContainer.currentBlock;
5326 NdefMap->TLVStruct.NdefTLVByte =
5327 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5329 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5333 case PH_FRINFC_MIFARESTD_VAL14:
5334 if(NdefMap->TLVStruct.prevLenByteValue >=
5335 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5337 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5339 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
5343 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5345 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5349 case PH_FRINFC_MIFARESTD_VAL15:
5350 if(NdefMap->TLVStruct.prevLenByteValue >=
5351 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5353 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5357 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5362 if(NdefMap->TLVStruct.prevLenByteValue >=
5363 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5365 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5367 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_L;
5369 NdefMap->SendRecvBuf[TempLength] = (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5370 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5372 NdefMap->SendRecvBuf[TempLength] =
5373 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5377 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5379 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5382 /* Update the null TLV, ndef TLV block and ndef TLV byte */
5383 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5384 NdefMap->TLVStruct.NdefTLVBlock =
5385 NdefMap->StdMifareContainer.currentBlock;
5386 NdefMap->TLVStruct.NdefTLVByte =
5387 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5389 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5391 NdefMap->SendRecvBuf[TempLength] =
5392 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5394 NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5399 static NFCSTATUS phFriNfc_MifStd_H_CallWrNdefLen(phFriNfc_NdefMap_t *NdefMap)
5401 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5402 if(NdefMap->TLVStruct.NULLTLVCount >= PH_FRINFC_MIFARESTD_VAL2)
5404 if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL0) ||
5405 (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL1) )
5407 /* In this case, current block is decremented because the
5408 NULL TLVs are in the previous block */
5409 NdefMap->StdMifareContainer.currentBlock--;
5410 Result = phFriNfc_MifStd_H_BlkChk_1(NdefMap);
5414 /* case NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL15:
5415 Current block is incremented to update the remaining TLV
5417 NdefMap->StdMifareContainer.currentBlock++;
5418 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5423 if((NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL13) ||
5424 (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL14) ||
5425 (NdefMap->TLVStruct.NdefTLVByte == PH_FRINFC_MIFARESTD_VAL15))
5427 /* Current block is incremented to update the remaining TLV
5429 NdefMap->StdMifareContainer.currentBlock++;
5430 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5434 Result = ((Result == NFCSTATUS_SUCCESS)?
5435 phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap):
5440 static NFCSTATUS phFriNfc_MifStd_H_BlkChk_1(phFriNfc_NdefMap_t *NdefMap)
5442 /* This function is to check the current block is in the authenticated sector and
5443 also check the block does not match with the sector trailer block. If there is a
5444 match then decrement the block and say the caller that the authentication
5446 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5447 uint8_t SectorID = PH_FRINFC_MIFARESTD_VAL0;
5449 /* Get a Sector ID for the Current Block */
5450 SectorID = phFriNfc_MifStd_H_GetSect(NdefMap->StdMifareContainer.currentBlock);
5452 /* Check the sector id is valid or not and if valid then check the
5453 current block is greater than 128 */
5454 if((NdefMap->StdMifareContainer.aid[SectorID] ==
5455 PH_FRINFC_MIFARESTD_NDEF_COMP) &&
5456 (((SectorID <= PH_FRINFC_MIFARESTD_VAL15) &&
5457 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD)) ||
5458 ((SectorID <= PH_FRINFC_MIFARESTD_SECTOR_NO39) &&
5459 (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))))
5461 if(NdefMap->StdMifareContainer.currentBlock > 128)
5463 NdefMap->TLVStruct.NdefTLVAuthFlag =
5464 ((((NdefMap->StdMifareContainer.currentBlock +
5465 PH_FRINFC_MIFARESTD_VAL1) %
5466 PH_FRINFC_MIFARESTD_MAD_BLK16) ==
5467 PH_FRINFC_MIFARESTD_VAL0)?
5468 PH_FRINFC_MIFARESTD_FLAG1:
5469 PH_FRINFC_MIFARESTD_FLAG0);
5471 NdefMap->StdMifareContainer.currentBlock -=
5472 ((((NdefMap->StdMifareContainer.currentBlock +
5473 PH_FRINFC_MIFARESTD_VAL1) %
5474 PH_FRINFC_MIFARESTD_MAD_BLK16) ==
5475 PH_FRINFC_MIFARESTD_VAL0)?
5476 PH_FRINFC_MIFARESTD_VAL1:
5477 PH_FRINFC_MIFARESTD_VAL0);
5482 NdefMap->TLVStruct.NdefTLVAuthFlag =
5483 ((((NdefMap->StdMifareContainer.currentBlock +
5484 PH_FRINFC_MIFARESTD_VAL1) %
5485 PH_FRINFC_MIFARESTD_BLK4) ==
5486 PH_FRINFC_MIFARESTD_VAL0)?
5487 PH_FRINFC_MIFARESTD_FLAG1:
5488 PH_FRINFC_MIFARESTD_FLAG0);
5490 NdefMap->StdMifareContainer.currentBlock -=
5491 ((((NdefMap->StdMifareContainer.currentBlock +
5492 PH_FRINFC_MIFARESTD_VAL1) %
5493 PH_FRINFC_MIFARESTD_BLK4) ==
5494 PH_FRINFC_MIFARESTD_VAL1)?
5495 PH_FRINFC_MIFARESTD_VAL1:
5496 PH_FRINFC_MIFARESTD_VAL0);
5502 /*Error: No Ndef Compliant Sectors present.*/
5503 Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
5504 NFCSTATUS_INVALID_PARAMETER);
5510 static void phFriNfc_MifStd_H_fillTLV1_1(phFriNfc_NdefMap_t *NdefMap)
5512 switch(NdefMap->TLVStruct.NdefTLVByte)
5514 case PH_FRINFC_MIFARESTD_VAL0:
5515 /* In the first write ndef length procedure, the
5516 length is updated, in this case T and L = 0xFF of TLV are
5518 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5519 NdefMap->TLVStruct.NdefTLVBlock =
5520 NdefMap->StdMifareContainer.currentBlock;
5521 NdefMap->TLVStruct.NdefTLVByte = PH_FRINFC_MIFARESTD_VAL14;
5523 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL15] =
5524 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5525 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] =
5526 PH_FRINFC_MIFARESTD_NDEFTLV_L;
5529 case PH_FRINFC_MIFARESTD_VAL1:
5530 /* In the first write ndef length procedure, the
5531 length is updated, in this case T of TLV is
5533 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL0;
5534 NdefMap->TLVStruct.NdefTLVBlock =
5535 NdefMap->StdMifareContainer.currentBlock;
5536 NdefMap->TLVStruct.NdefTLVByte =
5537 PH_FRINFC_MIFARESTD_VAL15;
5538 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL16] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5541 case PH_FRINFC_MIFARESTD_VAL15:
5543 /* In the first ndef write length, part of the L field or only T
5544 (if update length is less than 255) is updated */
5545 NdefMap->SendRecvBuf[PH_FRINFC_MIFARESTD_VAL1] =
5546 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5549 NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5552 static void phFriNfc_MifStd_H_fillTLV2_1(phFriNfc_NdefMap_t *NdefMap)
5554 uint8_t TempLength = PH_FRINFC_MIFARESTD_VAL1;
5555 switch(NdefMap->TLVStruct.NdefTLVByte)
5557 case PH_FRINFC_MIFARESTD_VAL13:
5558 /* In last write ndef length, part of length (L) field of TLV
5560 NdefMap->SendRecvBuf[TempLength] =
5561 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5564 case PH_FRINFC_MIFARESTD_VAL14:
5565 /* In last write ndef length, part of length (L) field of TLV
5567 if(NdefMap->TLVStruct.prevLenByteValue >=
5568 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5570 NdefMap->SendRecvBuf[TempLength] =
5571 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5572 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5574 NdefMap->SendRecvBuf[TempLength] =
5575 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5579 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5580 NdefMap->TLVStruct.NdefTLVBlock =
5581 NdefMap->StdMifareContainer.currentBlock;
5582 NdefMap->TLVStruct.NdefTLVByte =
5583 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5584 NdefMap->SendRecvBuf[TempLength] = PH_FRINFC_MIFARESTD_NDEFTLV_T;
5586 NdefMap->SendRecvBuf[TempLength] =
5587 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5591 case PH_FRINFC_MIFARESTD_VAL15:
5593 if(NdefMap->TLVStruct.prevLenByteValue >=
5594 PH_FRINFC_MIFARESTD_NDEFTLV_L)
5596 /* In last write ndef length, only T of TLV is updated and
5597 length (L) field of TLV is updated now */
5598 NdefMap->SendRecvBuf[TempLength] =
5599 PH_FRINFC_MIFARESTD_NDEFTLV_L;
5601 NdefMap->SendRecvBuf[TempLength] =
5602 (uint8_t)(NdefMap->TLVStruct.prevLenByteValue >>
5603 PH_FRINFC_MIFARESTD_RIGHTSHIFT8);
5605 NdefMap->SendRecvBuf[TempLength] =
5606 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5610 NdefMap->SendRecvBuf[TempLength] =
5611 PH_FRINFC_MIFARESTD_NULLTLV_T;
5613 NdefMap->TLVStruct.NULLTLVCount = PH_FRINFC_MIFARESTD_VAL2;
5614 NdefMap->TLVStruct.NdefTLVBlock =
5615 NdefMap->StdMifareContainer.currentBlock;
5616 NdefMap->TLVStruct.NdefTLVByte =
5617 (TempLength - PH_FRINFC_MIFARESTD_VAL1);
5618 NdefMap->SendRecvBuf[TempLength] =
5619 PH_FRINFC_MIFARESTD_NDEFTLV_T;
5621 NdefMap->SendRecvBuf[TempLength] =
5622 (uint8_t)NdefMap->TLVStruct.prevLenByteValue;
5626 NdefMap->StdMifareContainer.RdAfterWrFlag = PH_FRINFC_MIFARESTD_FLAG0;
5629 static NFCSTATUS phFriNfc_MifStd_H_RdTLV(phFriNfc_NdefMap_t *NdefMap)
5631 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5632 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RD_TLV;
5633 NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE;
5635 Result = phFriNfc_MifStd_H_Rd16Bytes(NdefMap,
5636 NdefMap->StdMifareContainer.currentBlock);
5640 static NFCSTATUS phFriNfc_MifStd_H_ProRdTLV(phFriNfc_NdefMap_t *NdefMap)
5642 NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
5643 NFCSTATUS_INVALID_DEVICE_REQUEST);
5644 uint8_t TempLength = PH_FRINFC_MIFARESTD_VAL0,
5645 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG1;
5647 /*TempLength = (uint8_t)(((NdefMap->TLVStruct.NULLTLVCount >=
5648 PH_FRINFC_MIFARESTD_VAL2) &&
5649 (NdefMap->TLVStruct.BytesRemainLinTLV > 0xFE))?
5650 ((NdefMap->TLVStruct.NdefTLVByte +
5651 PH_FRINFC_MIFARESTD_VAL2)%
5652 PH_FRINFC_MIFARESTD_VAL16):
5653 ((NdefMap->TLVStruct.NdefTLVByte +
5654 PH_FRINFC_MIFARESTD_VAL4)%
5655 PH_FRINFC_MIFARESTD_VAL16));*/
5657 TempLength = (uint8_t)((NdefMap->TLVStruct.BytesRemainLinTLV <= 0xFE)?
5658 ((NdefMap->TLVStruct.NdefTLVByte +
5659 PH_FRINFC_MIFARESTD_VAL2)%
5660 PH_FRINFC_MIFARESTD_VAL16):
5661 ((NdefMap->TLVStruct.NdefTLVByte +
5662 PH_FRINFC_MIFARESTD_VAL4)%
5663 PH_FRINFC_MIFARESTD_VAL16));
5665 if((*NdefMap->SendRecvLength == PH_FRINFC_MIFARESTD_BYTES_READ) &&
5666 (NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize))
5668 if(NdefMap->TLVStruct.BytesRemainLinTLV != 0)
5670 NDEFFlag = PH_FRINFC_MIFARESTD_FLAG0;
5671 /* To read the remaining length (L) in TLV */
5672 Result = phFriNfc_MifStd_H_RemainTLV(NdefMap, &NDEFFlag, &TempLength);
5678 static NFCSTATUS phFriNfc_MifStd_H_WrTermTLV(phFriNfc_NdefMap_t *NdefMap)
5680 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5681 uint8_t index = PH_FRINFC_MIFARESTD_VAL0;
5683 /* Change the state to check ndef compliancy */
5684 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_TERM_TLV;
5686 NdefMap->SendRecvBuf[index] =
5687 NdefMap->StdMifareContainer.currentBlock;
5689 NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_TERMTLV_T;
5692 while(index < PH_FRINFC_MIFARESTD_WR_A_BLK)
5694 NdefMap->SendRecvBuf[index] = PH_FRINFC_MIFARESTD_NULLTLV_T;
5698 NdefMap->TLVStruct.SetTermTLVFlag = PH_FRINFC_MIFARESTD_FLAG0;
5700 Result = phFriNfc_MifStd_H_WrTLV(NdefMap);
5706 static NFCSTATUS phFriNfc_MifStd_H_ProWrABlock(phFriNfc_NdefMap_t *NdefMap)
5708 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5710 NdefMap->StdMifareContainer.WrLength = PH_FRINFC_MIFARESTD_VAL0;
5711 if(NdefMap->ApduBuffIndex <
5712 (uint16_t)NdefMap->ApduBufferSize)
5714 /* Remaining bytes to write < 16 */
5715 if(NdefMap->StdMifareContainer.RemainingBufFlag ==
5716 PH_FRINFC_MIFARESTD_FLAG1)
5718 /* Write complete, so next byte shall be */
5719 NdefMap->StdMifareContainer.internalLength =
5720 *NdefMap->DataCount;
5722 /* Copy bytes less than 16 to internal buffer
5723 for the next write this can be used */
5724 (void)memcpy( NdefMap->StdMifareContainer.internalBuf,
5725 NdefMap->StdMifareContainer.Buffer,
5726 NdefMap->StdMifareContainer.internalLength);
5728 /* Increment the Send Buffer index */
5729 NdefMap->ApduBuffIndex += NdefMap->NumOfBytesWritten;
5731 NdefMap->StdMifareContainer.remainingSize -=
5732 NdefMap->NumOfBytesWritten;
5734 NdefMap->StdMifareContainer.RemainingBufFlag = PH_FRINFC_MIFARESTD_VAL0;
5735 /* Check for the End of Card */
5736 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5737 (uint8_t)((NdefMap->StdMifareContainer.remainingSize ==
5738 PH_FRINFC_MIFARESTD_VAL0)?
5739 PH_FRINFC_MIFARESTD_FLAG1:
5740 PH_FRINFC_MIFARESTD_FLAG0);
5742 NdefMap->TLVStruct.SetTermTLVFlag =
5743 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5744 PH_FRINFC_MIFARESTD_VAL0) ||
5745 (NdefMap->TLVStruct.SetTermTLVFlag ==
5746 PH_FRINFC_MIFARESTD_FLAG1))?
5747 PH_FRINFC_MIFARESTD_FLAG1:
5748 PH_FRINFC_MIFARESTD_FLAG0);
5750 } /* internal Buffer > Send Buffer */
5751 else if(NdefMap->StdMifareContainer.internalBufFlag ==
5752 PH_FRINFC_MIFARESTD_FLAG1)
5754 (void)memcpy(NdefMap->StdMifareContainer.internalBuf,
5755 NdefMap->StdMifareContainer.Buffer,
5756 *NdefMap->DataCount);
5758 NdefMap->StdMifareContainer.internalLength =
5759 *NdefMap->DataCount;
5761 /* Increment the Send Buffer index */
5762 NdefMap->ApduBuffIndex +=
5763 NdefMap->NumOfBytesWritten;
5765 NdefMap->StdMifareContainer.remainingSize -=
5766 NdefMap->NumOfBytesWritten;
5768 NdefMap->StdMifareContainer.internalBufFlag =
5769 PH_FRINFC_MIFARESTD_FLAG0;
5770 /* Check for the End of Card */
5771 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5772 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5773 PH_FRINFC_MIFARESTD_VAL0) &&
5774 (NdefMap->StdMifareContainer.internalLength ==
5775 PH_FRINFC_MIFARESTD_VAL0))?
5776 PH_FRINFC_MIFARESTD_FLAG1:
5777 PH_FRINFC_MIFARESTD_FLAG0);
5779 NdefMap->TLVStruct.SetTermTLVFlag =
5780 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5781 PH_FRINFC_MIFARESTD_VAL0) ||
5782 (NdefMap->TLVStruct.SetTermTLVFlag ==
5783 PH_FRINFC_MIFARESTD_FLAG1))?
5784 PH_FRINFC_MIFARESTD_FLAG1:
5785 PH_FRINFC_MIFARESTD_FLAG0);
5789 NdefMap->StdMifareContainer.internalLength = 0;
5790 /* Increment the Send Buffer index */
5791 NdefMap->ApduBuffIndex +=
5792 NdefMap->NumOfBytesWritten;
5793 NdefMap->StdMifareContainer.remainingSize -=
5794 NdefMap->NumOfBytesWritten;
5796 /* Check for the End of Card */
5797 if((NdefMap->StdMifareContainer.remainingSize ==
5798 PH_FRINFC_MIFARESTD_VAL0) ||
5799 (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize))
5801 NdefMap->StdMifareContainer.ReadWriteCompleteFlag =
5802 (uint8_t)((NdefMap->StdMifareContainer.remainingSize == 0)?
5803 PH_FRINFC_MIFARESTD_FLAG1:PH_FRINFC_MIFARESTD_FLAG0);
5805 if(NdefMap->StdMifareContainer.internalLength ==
5806 PH_FRINFC_MIFARESTD_VAL0)
5808 NdefMap->StdMifareContainer.currentBlock++;
5809 /* Mifare 4k Card, After 128th Block
5810 each sector = 16 blocks in Mifare 4k */
5811 Result = ((NdefMap->StdMifareContainer.remainingSize == 0)?
5813 phFriNfc_MifStd_H_BlkChk(NdefMap));
5814 NdefMap->StdMifareContainer.NdefBlocks++;
5816 NdefMap->TLVStruct.SetTermTLVFlag =
5817 (uint8_t)(((NdefMap->StdMifareContainer.remainingSize ==
5818 PH_FRINFC_MIFARESTD_VAL0) ||
5819 (NdefMap->TLVStruct.SetTermTLVFlag ==
5820 PH_FRINFC_MIFARESTD_FLAG1))?
5821 PH_FRINFC_MIFARESTD_FLAG1:
5822 PH_FRINFC_MIFARESTD_FLAG0);
5826 NdefMap->StdMifareContainer.currentBlock++;
5827 NdefMap->StdMifareContainer.WrLength =
5828 (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex);
5829 /* Mifare 4k Card, After 128th Block
5830 each sector = 16 blocks in Mifare 4k */
5831 Result = phFriNfc_MifStd_H_BlkChk(NdefMap);
5832 if(Result == NFCSTATUS_SUCCESS)
5834 NdefMap->StdMifareContainer.NdefBlocks++;
5835 Result = ((NdefMap->StdMifareContainer.AuthDone ==
5836 PH_FRINFC_MIFARESTD_FLAG1)?
5837 phFriNfc_MifStd_H_WrABlock(NdefMap):
5838 phFriNfc_MifStd_H_AuthSector(NdefMap));
5845 Result = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP,
5846 NFCSTATUS_INVALID_DEVICE_REQUEST);
5849 if((Result == NFCSTATUS_SUCCESS) &&
5850 (NdefMap->TLVStruct.SetTermTLVFlag !=
5851 PH_FRINFC_MIFARESTD_FLAG1) &&
5852 (NdefMap->StdMifareContainer.remainingSize >
5853 PH_FRINFC_MIFARESTD_VAL0))
5855 Result = phFriNfc_MifStd_H_WrTermTLV(NdefMap);
5859 if((Result == NFCSTATUS_SUCCESS) &&
5860 (NdefMap->TLVStruct.SetTermTLVFlag ==
5861 PH_FRINFC_MIFARESTD_FLAG1))
5863 /* Write the length to the L field in the TLV */
5864 NdefMap->StdMifareContainer.TempBlockNo =
5865 NdefMap->StdMifareContainer.currentBlock;
5866 phFriNfc_MifStd_H_SetNdefBlkAuth(NdefMap);
5867 NdefMap->StdMifareContainer.currentBlock =
5868 NdefMap->TLVStruct.NdefTLVBlock;
5869 Result = phFriNfc_MifStd_H_RdtoWrNdefLen(NdefMap);
5875 static NFCSTATUS phFriNfc_MifStd_H_CallDisCon(phFriNfc_NdefMap_t *NdefMap)
5877 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5879 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_DISCONNECT;
5880 NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_MifareStdMap_Process;
5881 NdefMap->MapCompletionInfo.Context = NdefMap;
5883 #ifndef PH_HAL4_ENABLE
5884 /*Call the Overlapped HAL POLL function */
5885 Result = phFriNfc_OvrHal_Disconnect( NdefMap->LowerDevice,
5886 &NdefMap->MapCompletionInfo,
5887 NdefMap->psRemoteDevInfo);
5889 /*Call the Overlapped HAL Reconnect function */
5890 Result = phFriNfc_OvrHal_Reconnect( NdefMap->LowerDevice,
5891 &NdefMap->MapCompletionInfo,
5892 NdefMap->psRemoteDevInfo);
5898 #ifndef PH_HAL4_ENABLE
5899 static NFCSTATUS phFriNfc_MifStd_H_CallPoll(phFriNfc_NdefMap_t *NdefMap)
5901 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5903 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_POLL;
5905 NdefMap->OpModeType[PH_FRINFC_MIFARESTD_VAL0] = phHal_eOpModesMifare;
5906 NdefMap->OpModeType[PH_FRINFC_MIFARESTD_VAL1] = phHal_eOpModesArrayTerminator;
5908 /* Number of devices to poll */
5909 NdefMap->NoOfDevices = PH_FRINFC_MIFARESTD_VAL1;
5911 /*Call the Overlapped HAL POLL function */
5912 Result = phFriNfc_OvrHal_Poll( NdefMap->LowerDevice,
5913 &NdefMap->MapCompletionInfo,
5914 NdefMap->OpModeType,
5915 NdefMap->psRemoteDevInfo,
5916 &NdefMap->NoOfDevices,
5917 NdefMap->StdMifareContainer.DevInputParam);
5922 static NFCSTATUS phFriNfc_MifStd_H_CallConnect(phFriNfc_NdefMap_t *NdefMap)
5924 NFCSTATUS Result = NFCSTATUS_SUCCESS;
5926 NdefMap->State = PH_FRINFC_NDEFMAP_STATE_CONNECT;
5928 /*Call the Overlapped HAL POLL function */
5929 Result = phFriNfc_OvrHal_Connect( NdefMap->LowerDevice,
5930 &NdefMap->MapCompletionInfo,
5931 NdefMap->psRemoteDevInfo,
5932 NdefMap->StdMifareContainer.DevInputParam);
5936 static void phFriNfc_MifStd1k_H_BlkChk(phFriNfc_NdefMap_t *NdefMap,
5940 /* every last block of a sector needs to be skipped */
5941 if(((NdefMap->StdMifareContainer.currentBlock + PH_FRINFC_MIFARESTD_INC_1) %
5942 PH_FRINFC_MIFARESTD_BLK4) == 0)
5944 NdefMap->StdMifareContainer.currentBlock++;
5948 if(NdefMap->StdMifareContainer.aid[SectorID] ==
5949 PH_FRINFC_MIFARESTD_NDEF_COMP)
5951 /* Check whether the block is first block of a (next)new sector and
5952 also check if it is first block then internal length is zero
5953 or not. Because once Authentication is done for the sector again
5954 we should not authenticate it again */
5955 if((NdefMap->StdMifareContainer.currentBlock ==
5956 (SectorID * PH_FRINFC_MIFARESTD_BLK4)) &&
5957 (NdefMap->StdMifareContainer.internalLength == 0))
5959 NdefMap->StdMifareContainer.AuthDone = 0;
5965 NdefMap->StdMifareContainer.currentBlock += PH_FRINFC_MIFARESTD_BLK4;
5971 #include <phUnitTestNfc_MifareStd_static.c>
5974 #endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */