summaryrefslogtreecommitdiffstats
path: root/src/phFriNfc_NdefMap.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/phFriNfc_NdefMap.c')
-rw-r--r--src/phFriNfc_NdefMap.c1363
1 files changed, 1363 insertions, 0 deletions
diff --git a/src/phFriNfc_NdefMap.c b/src/phFriNfc_NdefMap.c
new file mode 100644
index 0000000..34b8e59
--- /dev/null
+++ b/src/phFriNfc_NdefMap.c
@@ -0,0 +1,1363 @@
+/*
+ * Copyright (C) 2010 NXP Semiconductors
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+/*!
+* \file phFriNfcNdefMap.c
+* \brief NFC Ndef Mapping For Different Smart Cards.
+*
+* Project: NFC-FRI
+*
+* $Date: Mon Mar 29 17:32:37 2010 $
+* $Author: ing02260 $
+* $Revision: 1.37 $
+* $Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
+*
+*/
+
+
+#include <phFriNfc_NdefMap.h>
+
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+#include <phFriNfc_MifareULMap.h>
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
+
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+#include <phFriNfc_TopazMap.h>
+#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */
+
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+#include <phFriNfc_MifareStdMap.h>
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+#include <phFriNfc_DesfireMap.h>
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+#include <phFriNfc_FelicaMap.h>
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+#include <phFriNfc_MockupMap.h>
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+
+
+#include <phFriNfc_OvrHal.h>
+
+/*! \ingroup grp_file_attributes
+* \name NDEF Mapping
+*
+* File: \ref phFriNfcNdefMap.c
+*
+*/
+/*@{*/
+#define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.37 $"
+#define PHFRINFCNDEFMAP_FILEALIASES "$Aliases: NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $"
+/*@}*/
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+/* Desfire capability Container Reset Helper */
+static void phFriNfc_DesfCapCont_HReset(phFriNfc_NdefMap_t *NdefMap);
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+/* Felica Smart Tag Reset Helper */
+static void phFriNfc_Felica_HReset(phFriNfc_NdefMap_t *NdefMap);
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+
+/* \note This function has to be called at the beginning, after creating an
+* instance of \ref phFriNfc_NdefMap_t . Use this function to reset
+* the instance and/or switch to a different underlying device (
+* different NFC device or device mode, or different Remote Device).
+*/
+
+NFCSTATUS phFriNfc_NdefMap_Reset( phFriNfc_NdefMap_t *NdefMap,
+ void *LowerDevice,
+ phHal_sRemoteDevInformation_t *psRemoteDevInfo,
+ phHal_sDevInputParam_t *psDevInputParam,
+ uint8_t *TrxBuffer,
+ uint16_t TrxBufferSize,
+ uint8_t *ReceiveBuffer,
+ uint16_t *ReceiveLength,
+ uint16_t *DataCount)
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+ uint8_t index;
+
+ if ( (ReceiveLength == NULL) || (NdefMap == NULL) || (psRemoteDevInfo == NULL) ||
+ (TrxBuffer == NULL) || (TrxBufferSize == 0) || (LowerDevice == NULL) ||
+ (*ReceiveLength == 0) || (ReceiveBuffer == NULL) || (DataCount == NULL) ||
+ (psDevInputParam == NULL) ||
+ (*ReceiveLength < PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE ))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* Initialise the state to Init */
+ NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
+
+ for(index = 0;index<PH_FRINFC_NDEFMAP_CR;index++)
+ {
+ /* Initialise the NdefMap Completion Routine to Null */
+ NdefMap->CompletionRoutine[index].CompletionRoutine = NULL;
+ /* Initialise the NdefMap Completion Routine context to Null */
+ NdefMap->CompletionRoutine[index].Context = NULL;
+ }
+
+ /* Lower Device(Always Overlapped HAL Struct initialised in application
+ is registred in NdefMap Lower Device) */
+ NdefMap->LowerDevice = LowerDevice;
+
+ /* Remote Device info received from Manual Device Discovery is registered here */
+ NdefMap->psRemoteDevInfo = psRemoteDevInfo;
+
+ /* Transfer Buffer registered */
+ NdefMap->ApduBuffer = TrxBuffer;
+
+ /* Set the MaxApduBufferSize */
+ NdefMap->ApduBufferSize = TrxBufferSize;
+
+ /* Set APDU Buffer Index */
+ NdefMap->ApduBuffIndex = 0;
+
+ /* Register Transfer Buffer Length */
+ NdefMap->SendLength = 0;
+
+ /* Register Receive Buffer */
+ NdefMap->SendRecvBuf = ReceiveBuffer;
+
+ /* Register Receive Buffer Length */
+ NdefMap->SendRecvLength = ReceiveLength;
+
+ /* Register Temporary Receive Buffer Length */
+ NdefMap->TempReceiveLength = *ReceiveLength;
+
+ /* Register Data Count variable and set it to zero */
+ NdefMap->DataCount = DataCount;
+ *NdefMap->DataCount = 0;
+
+ /* Reset the PageOffset */
+ NdefMap->Offset = 0;
+
+ /* Reset the NumOfBytesRead*/
+ NdefMap->NumOfBytesRead = 0;
+
+ /* Reset the NumOfBytesWritten*/
+ NdefMap->NumOfBytesWritten = 0;
+
+ /* Reset the Card Type */
+ NdefMap->CardType = 0;
+
+ /* Reset the Memory Card Size*/
+ NdefMap->CardMemSize = 0;
+
+ /* Reset the Previous Operation*/
+ NdefMap->PrevOperation = 0;
+
+ /* Reset the Desfire Operation Flag*/
+ NdefMap->DespOpFlag = 0;
+
+ /* Reset MapCompletion Info*/
+ NdefMap->MapCompletionInfo.CompletionRoutine = NULL;
+ NdefMap->MapCompletionInfo.Context = NULL;
+
+ /* Reset the ReadingForWriteOperation flag. */
+ NdefMap->ReadingForWriteOperation = 0; /* FALSE */
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ /*Reset Desfire Cap Container elements*/
+ phFriNfc_DesfCapCont_HReset(NdefMap);
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ /*Reset Mifare Standard Container elements*/
+ NdefMap->StdMifareContainer.DevInputParam = psDevInputParam;
+ status = phFriNfc_MifareStdMap_H_Reset(NdefMap);
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ /*Reset Felica Tag elements*/
+ NdefMap->FelicaPollDetails.DevInputParam = psDevInputParam;
+ phFriNfc_Felica_HReset(NdefMap);
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+#if !(defined(PH_FRINFC_MAP_TOPAZ_DISABLED ) || defined (PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED ))
+
+ phFriNfc_TopazMap_H_Reset(NdefMap);
+#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED || PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
+
+
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ status = phFriNfc_MifareUL_H_Reset(NdefMap);
+#endif
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ /*Reset Desfire Cap Container elements*/
+ phFriNfc_Mockup_H_Reset(NdefMap);
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+
+ /*
+ * Fix for PR - 0001256
+ * Date- 08-08-08
+ */
+ NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID;
+ }
+
+ return (status);
+}
+
+/*!
+* Registering the Completion Routine.
+*
+* This function requires the caller to set a Completion Routine
+* which serves as notifier for the upper component.
+* NOTE: Please refer the header file for more information.
+*
+*/
+
+NFCSTATUS phFriNfc_NdefMap_SetCompletionRoutine(phFriNfc_NdefMap_t *NdefMap,
+ uint8_t FunctionID,
+ pphFriNfc_Cr_t CompletionRoutine,
+ void *CompletionRoutineContext)
+{
+ NFCSTATUS status = NFCSTATUS_SUCCESS;
+
+ if ( ( NdefMap == NULL ) || (FunctionID >= PH_FRINFC_NDEFMAP_CR) ||
+ ( CompletionRoutine == NULL) || (CompletionRoutineContext == NULL))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* Register the application callback with the NdefMap Completion Routine */
+ NdefMap->CompletionRoutine[FunctionID].CompletionRoutine = CompletionRoutine;
+
+ /* Register the application context with the NdefMap Completion Routine context */
+ NdefMap->CompletionRoutine[FunctionID].Context = CompletionRoutineContext;
+ }
+
+ return status;
+}
+
+/*!
+* Initiates Reading of NDEF information from the Remote Device.
+*
+* Remote Peer device may be of type any card. Ex: desfire,felica,jewel
+* mifareUL,mifare 1K etc. The function initiates the reading of NDEF
+* information from a Remote Device.
+*
+* This is the main NdefMap read function call.Internally,depending upon
+* the CardType,respective mifare/desfire read functions are called.
+* In future this can be extended to support any types of card.
+*
+* It performs a reset of the state and triggers/starts the raed action (state machine).
+* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action
+* has been triggered.
+*
+* NOTE: Please refer the header file for more information.
+*
+*/
+
+NFCSTATUS phFriNfc_NdefMap_RdNdef( phFriNfc_NdefMap_t *NdefMap,
+ uint8_t *PacketData,
+ uint32_t *PacketDataLength,
+ uint8_t Offset)
+{
+ NFCSTATUS status = NFCSTATUS_PENDING;
+
+
+ /* check for validity of input parameters*/
+ if (( PacketData == NULL )
+ || ( NdefMap == NULL )
+ || ( PacketDataLength == NULL )
+ || ( *PacketDataLength == 0 )
+ || ( ( Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ))
+ || (NdefMap->CompletionRoutine->CompletionRoutine == NULL)
+ || (NdefMap->CompletionRoutine->Context == NULL )
+ )
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID)
+ {
+ /* Card is in invalid state, cannot have any read/write
+ operations*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_INVALID_FORMAT);
+ }
+ else if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED)
+ {
+ /* Can't read any data from the card:TLV length is zero*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED);
+
+ NdefMap->NumOfBytesRead = PacketDataLength;
+ *NdefMap->NumOfBytesRead = 0;
+
+
+ }
+ else if ( (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
+ }
+ else
+ {
+ /* Check the offset given by the user
+ If the offset is 1 (SEEK_BEGIN), reset everything and start
+ reading from the first Page of the card.
+ else if offset is 0 (PH_FRINFC_NDEFMAP_SEEK_CUR), continue reading
+ No need to reset the parameters. */
+
+ if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
+ {
+ NdefMap->ApduBuffIndex = 0;
+ *NdefMap->DataCount = 0;
+ }
+
+ if ( (NdefMap->CardType == PH_FRINFC_NDEFMAP_ISO14443_4A_CARD) &&
+ (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (*NdefMap->DataCount == 0 ))
+ {
+
+ /* A READ operation cannot be done if the previuos operation was WRITE
+ unless the offset is set to PH_FRINFC_NDEFMAP_SEEK_BEGIN Or
+ Read Operation with Offset set to Continue & DataCount set to 0 */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
+ }
+ else
+ {
+ switch ( NdefMap->CardType)
+ {
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
+ /* Mifare card selected. Call Mifare read */
+ status = phFriNfc_MifareUL_RdNdef ( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
+ /* Desfire card selected. Call Desfire read */
+ status = phFriNfc_Desfire_RdNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
+ /* Mifare card selected. Call Mifare read */
+ status = phFriNfc_MifareStdMap_RdNdef ( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
+ /* Desfire card selected. Call Desfire Write */
+ status = phFriNfc_Felica_RdNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
+ /* Topaz card selected. Call Topaz read */
+ status = phFriNfc_TopazMap_RdNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
+ /* Topaz card selected. Call Topaz read */
+ status = phFriNfc_TopazDynamicMap_RdNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
+#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
+ /* Mockup card selected. Call Mockup Write */
+ status = phFriNfc_Mockup_RdNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+
+ default :
+ /* Unknown card type. Return error */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+
+ break;
+ }
+ }
+ }
+ return status;
+}
+
+/*!
+* Initiates Writing of NDEF information to the Remote Device.
+*
+* The function initiates the writing of NDEF information to a Remote Device
+*
+* Remote Peer device may be of type any card. Ex: desfire,felica,jewel
+* mifareUL,mifare 1K etc. The function initiates the reading of NDEF
+* information from a Remote Device.
+*
+* This is a main write api.Internally,depending upon the CardType,
+* respective mifare/desfire write apis are called.In future this can be
+* extended to support any types of card.
+*
+* It performs a reset of the state and starts the action (state machine).
+* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once
+* the action has been triggered.
+*
+* NOTE: Please refer the header file for more information.
+*
+*/
+
+
+NFCSTATUS phFriNfc_NdefMap_WrNdef( phFriNfc_NdefMap_t *NdefMap,
+ uint8_t *PacketData,
+ uint32_t *PacketDataLength,
+ uint8_t Offset)
+{
+ NFCSTATUS status = NFCSTATUS_PENDING;
+ uint8_t StatusChk=0;
+
+ if ( (PacketData == NULL)
+ || ( NdefMap == NULL )
+ /* + Mantis 442 */
+ || ( PacketDataLength == NULL )
+ /* - Mantis 442 */
+ || ( *PacketDataLength == 0 )
+ || ((Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN ))
+ || (NdefMap->CompletionRoutine->CompletionRoutine == NULL)
+ || (NdefMap->CompletionRoutine->Context == NULL)
+ )
+ {
+ /* Invalid input parameter error */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER);
+ }
+ else if (( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) &&
+ (PH_FRINFC_NDEFMAP_TOPAZ_CARD != NdefMap->CardType) &&
+ (PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD != NdefMap->CardType))
+ {
+ /* Card is in invalid state, cannot have any read/write
+ operations*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_INVALID_FORMAT);
+ }
+
+ else if ( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY )
+
+ {
+ /*Can't write to the card :No Grants */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_NOT_ALLOWED);
+
+ /* set the no. bytes written is zero*/
+ NdefMap->WrNdefPacketLength = PacketDataLength;
+ *NdefMap->WrNdefPacketLength = 0;
+
+ }
+ else
+ {
+ /* Check the offset given by the user
+ If the offset is 1 (SEEK_BEGIN), reset everything and start
+ writing from the first Byte of the card.
+ else if offset is 0 (PH_FRINFC_NDEFMAP_SEEK_CUR), continue writing
+ No need to reset the parameters. */
+ if (( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) &&
+ (PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD == NdefMap->CardType))
+ {
+ /* If Topaz Dynamic card CC bytes are not valid then also allow writing,
+ If card is really good then writing will be done properly and reading can be performed,
+ otherwise writing or reading will fail. so, setting card state to
+ NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE */
+ NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE;
+ }
+
+ if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )
+ {
+ NdefMap->ApduBuffIndex = 0;
+ *NdefMap->DataCount = 0;
+ }
+
+ if ( (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_UL_CARD) ||
+ (NdefMap->CardType == PH_FRINFC_NDEFMAP_ISO14443_4A_CARD))
+ {
+ if (( (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN )) ||
+ ( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (*NdefMap->DataCount == 0 )))
+ {
+ /* A WRITE operation cannot be done if the previuos operation was READ
+ unless the offset is set to PH_FRINFC_NDEFMAP_SEEK_BEGIN OR
+ Write Operation with Offset set to Continue & DataCount set to 0 */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
+ StatusChk = 1;
+ }
+ }
+ if(StatusChk != 1)
+ {
+ NdefMap->WrNdefPacketLength = PacketDataLength;
+ switch ( NdefMap->CardType)
+ {
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
+ /* Mifare card selected. Call Mifare Write */
+ status = phFriNfc_MifareUL_WrNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
+ /* Desfire card selected. Call Desfire Write */
+ status = phFriNfc_Desfire_WrNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
+ /* Mifare card selected. Call Mifare read */
+ status = phFriNfc_MifareStdMap_WrNdef ( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
+ /* Desfire card selected. Call Desfire Write */
+ status = phFriNfc_Felica_WrNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
+ /* Topaz card selected. Call Topaz Write */
+ status = phFriNfc_TopazMap_WrNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
+ /* Topaz card selected. Call Topaz Write */
+ status = phFriNfc_TopazDynamicMap_WrNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
+#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */
+
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
+ /* Mockup card selected. Call Mockup Write */
+ status = phFriNfc_Mockup_WrNdef( NdefMap,
+ PacketData,
+ PacketDataLength,
+ Offset);
+ break;
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+ default :
+ /* Unknown card type. Return error */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ break;
+ }
+ }
+ }
+ return status;
+}
+
+/*!
+* Check whether a particular Remote Device is NDEF compliant.
+*
+* The function initiates the ndef compliancy check.
+*
+* This is a main check ndef api.Internally,depending upon the different
+* opmodes,respective mifare/desfire checkNdef apis are called.
+* In future this can be extended to check any types of card ndef
+* compliancy.
+*
+* It performs a reset of the state and starts the action (state machine).
+* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once
+* the action has been triggered.
+*
+* NOTE: Please refer the header file for more information.
+*
+*/
+
+NFCSTATUS phFriNfc_NdefMap_ChkNdef( phFriNfc_NdefMap_t *NdefMap)
+{
+ NFCSTATUS status = NFCSTATUS_PENDING;
+ uint8_t sak;
+
+
+ /* Check for ndefmap context and relevant state. Else return error*/
+ if ( NdefMap == NULL )
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ if( (NdefMap->State != PH_FRINFC_NDEFMAP_STATE_RESET_INIT) ||
+ (NdefMap->psRemoteDevInfo->SessionOpened != 0x01 ) )
+ /* Harsha: If SessionOpened is not 1, this means that connect has not happened */
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST);
+ }
+ else if ( (NdefMap->CompletionRoutine->CompletionRoutine == NULL) || (NdefMap->CompletionRoutine->Context == NULL ))
+ {
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /*
+ * 1.Changed
+ * CardInfo106 Replace with the ReaderA_Info.
+ */
+
+ sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak;
+
+ /*
+ * 3. Changed
+ * Description: Opmode replace with RemDevType.
+ */
+
+
+ switch ( NdefMap->psRemoteDevInfo->RemDevType )
+ {
+ case phHal_eMifare_PICC:
+ case phHal_eISO14443_3A_PICC:
+ /* Remote device is Mifare card . Check for Mifare
+ NDEF compliancy */
+ if(0x00 == sak)
+ {
+ /* The SAK/Sel_Res says the card is of the type
+ Mifare UL */
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ status = phFriNfc_MifareUL_ChkNdef( NdefMap);
+#else /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
+ }
+ else if ((0x08 == (sak & 0x18)) ||
+ (0x18 == (sak & 0x18)))
+ {
+ /* The SAK/Sel_Res says the card is of the type
+ Mifare Standard */
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ status = phFriNfc_MifareStdMap_ChkNdef( NdefMap);
+#else /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
+ }
+ else
+ {
+ /* Invalid Mifare UL card, as the remote device
+ info - opmode says its a Mifare UL card but,
+ The SAK/Sel_Res is wrong */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ }
+ break;
+ case phHal_eISO14443_B_PICC:
+ {
+ status = phFriNfc_Desfire_ChkNdef(NdefMap);
+ }
+ break;
+ case phHal_eISO14443_A_PICC :
+ /* Remote device is Desfire card . Check for Desfire
+ NDEF compliancy */
+ if(0x20 == (sak & 0x20))
+ {
+ /* The SAK/Sel_Res says the card is of the type
+ ISO14443_4A */
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ status = phFriNfc_Desfire_ChkNdef(NdefMap);
+#else /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
+ }
+ else
+ {
+ /* Invalid Desfire card, as the remote device
+ info - opmode says its a desfire card but,
+ The SAK/Sel_Res is wrong */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ }
+ break;
+
+ case phHal_eFelica_PICC:
+
+ /*Set the OpMode Type Flag*/
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+#ifndef PH_HAL4_ENABLE
+ NdefMap->OpModeType[0] = phHal_eOpModesFelica212;
+ NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator;
+#endif /* #ifndef PH_HAL4_ENABLE */
+ status = phFriNfc_Felica_ChkNdef(NdefMap);
+#else /* PH_FRINFC_MAP_FELICA_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/
+
+ break;
+
+#ifndef PH_HAL4_ENABLE
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ case phHal_eFelica424:
+ /*Set the OpMode Ttype Flag*/
+ NdefMap->OpModeType[0] = phHal_eOpModesFelica424;
+ NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator;
+ status = phFriNfc_Felica_ChkNdef(NdefMap);
+#else /* PH_FRINFC_MAP_FELICA_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/
+ break;
+#endif
+
+ case phHal_eJewel_PICC :
+ /* Remote device is Topaz card . Check for Topaz
+ NDEF compliancy */
+#ifdef PH_HAL4_ENABLE
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ /* Decide on the Header bytes to know the
+ Type of the Topaz card.Card could be Static or
+ Dynamic type. These are of type NFFC-NDEF Data Application*/
+ if ( NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.HeaderRom0
+ == PH_FRINFC_TOPAZ_HEADROM0_VAL)
+ {
+
+ status = phFriNfc_TopazMap_ChkNdef(NdefMap);
+ }
+#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
+ else if( NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.HeaderRom0
+ == PH_FRINFC_TOPAZ_DYNAMIC_HEADROM0_VAL)
+ {
+
+ status = phFriNfc_TopazDynamicMap_ChkNdef(NdefMap);
+ }
+#endif
+ else
+ {
+
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+
+ }
+#endif
+
+
+#else
+ if(0xC2 == sak)
+ {
+ /* The SAK/Sel_Res says the card is of the type
+ ISO14443_4A */
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ status = phFriNfc_TopazMap_ChkNdef(NdefMap);
+#else /* PH_FRINFC_MAP_TOPAZ_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED*/
+ }
+ else
+ {
+ /* Invalid Topaz card, as the remote device
+ info - opmode says its a desfire card but,
+ The SAK/Sel_Res is wrong */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ }
+#endif
+ break;
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ case phHal_eOpModesMockup :
+ /*Set the OpMode Ttype Flag*/
+ NdefMap->OpModeType[0] = phHal_eOpModesMockup;
+ NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator;
+ status = phFriNfc_Mockup_ChkNdef(NdefMap);
+ break;
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+
+ default :
+ /* Remote device is not recognised.
+ Probably not NDEF compliant */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ break;
+ }
+ }
+ }
+ return status;
+}
+
+
+/*!
+* \brief Completion Routine, Processing function, needed to avoid long blocking.
+* \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion
+* Routine in order to be able to notify the component that an I/O has finished and data are
+* ready to be processed.
+* This is a main Ndef Map Process api.Internally,depending upon the different
+* CardTypes,respective mifare/desfire process functions are called.
+*
+*/
+
+void phFriNfc_NdefMap_Process( void *Context,
+ NFCSTATUS Status)
+{
+
+ if ( Context != NULL )
+ {
+ phFriNfc_NdefMap_t *NdefMap = (phFriNfc_NdefMap_t *)Context;
+ /*
+ * 4 Changed
+ * Description: Opmode replace with RevDevTyp.
+ */
+
+ switch ( NdefMap->psRemoteDevInfo->RemDevType )
+ {
+ case phHal_eMifare_PICC :
+ case phHal_eISO14443_3A_PICC:
+
+ if((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) ||
+ (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD))
+ {
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ /* Remote device is Mifare Standard card */
+ phFriNfc_MifareStdMap_Process(NdefMap,Status);
+#else /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/
+ }
+ else
+ {
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ /* Remote device is Mifare UL card */
+ phFriNfc_MifareUL_Process(NdefMap,Status);
+#else /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/
+ }
+ break;
+
+ case phHal_eISO14443_A_PICC :
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ /* Remote device is Desfire card */
+ phFriNfc_Desfire_Process(NdefMap, Status);
+#else /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED*/
+ break;
+ case phHal_eISO14443_B_PICC:
+ /* Remote device is Desfire card */
+ phFriNfc_Desfire_Process(NdefMap, Status);
+ break;
+
+ case phHal_eFelica_PICC :
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ /* Remote device is Felica Smart card */
+ phFriNfc_Felica_Process(NdefMap, Status);
+#else /* PH_FRINFC_MAP_FELICA_DISABLED*/
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/
+ break;
+
+ case phHal_eJewel_PICC:
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ if ( NdefMap->CardType == PH_FRINFC_NDEFMAP_TOPAZ_CARD )
+ {
+ /* Remote device is Topaz Smart card */
+ phFriNfc_TopazMap_Process(NdefMap, Status);
+ }
+#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
+ else if ( NdefMap->CardType == PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD )
+ {
+ /* Remote device is Topaz Smart card */
+ phFriNfc_TopazDynamicMap_Process(NdefMap, Status);
+ }
+ else
+ {
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+
+ }
+ break;
+#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED*/
+#endif
+
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ case phHal_eOpModesMockup:
+ /* Remote device is Desfire card */
+ phFriNfc_Mockup_Process(NdefMap, Status);
+ break;
+#endif /* PHFRINFC_OVRHAL_MOCKUP*/
+ default :
+ /* Remote device opmode not recognised.
+ Probably not NDEF compliant */
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ /* set the state back to the Reset_Init state*/
+ NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT;
+
+ /* set the completion routine*/
+ NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_INVALID_OPE].
+ CompletionRoutine(NdefMap->CompletionRoutine->Context, Status);
+ break;
+ }
+ }
+ else
+ {
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_INVALID_PARAMETER);
+ /* The control should not come here. As Context itself is NULL ,
+ Can't call the CR*/
+ }
+}
+
+#if 0
+
+NFCSTATUS phFriNfc_ChkAndParseTLV(phFriNfc_NdefMap_t *NdefMap)
+{
+ NFCSTATUS status = NFCSTATUS_PENDING;
+
+ switch ( NdefMap->CardType )
+ {
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
+
+
+ break;
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
+ status = phFriNfc_Desf_ChkAndParseTLV(NdefMap);
+ return (status);
+
+ break;
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
+
+ break;
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
+ ;
+ break;
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+ default :
+ /* Unknown card type. Return error */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+
+ break;
+ }
+
+ return ( status);
+}
+#endif
+
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+static void phFriNfc_DesfCapCont_HReset(phFriNfc_NdefMap_t *NdefMap)
+{
+ /* Initialise/reset the desfire capability contatiner structure variables*/
+ NdefMap->DesfireCapContainer.DesfVersion = 0;
+ NdefMap->DesfireCapContainer.NdefMsgFid = 0;
+ NdefMap->DesfireCapContainer.NdefFileSize = 0;
+ NdefMap->DesfireCapContainer.MaxCmdSize = 0;
+ NdefMap->DesfireCapContainer.MaxRespSize = 0;
+ NdefMap->DesfireCapContainer.ReadAccess = 0;
+ NdefMap->DesfireCapContainer.WriteAccess = 0;
+}
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+static void phFriNfc_Felica_HReset(phFriNfc_NdefMap_t *NdefMap)
+{
+ uint8_t index=0;
+
+ /* Initialise/reset the different felica structure variables*/
+ /* Reset all the felica Basic staruture variables*/
+ NdefMap->Felica.CurBlockNo = 0;
+
+ for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_BLOCK_SIZE;index++)
+ {
+ NdefMap->Felica.Rd_BytesToCopyBuff[index] = 0;
+ NdefMap->Felica.Wr_RemainedBytesBuff[index] = 0;
+ }
+ NdefMap->Felica.Rd_NoBytesToCopy = 0;
+ NdefMap->Felica.Wr_BytesRemained = 0;
+
+
+ /* Reset all the felica attribute information staruture variables*/
+ for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_ATTR_NDEF_DATA_LEN;index++)
+ {
+ NdefMap->FelicaAttrInfo.LenBytes[index] = 0;
+ }
+
+ NdefMap->FelicaAttrInfo.Nmaxb = 0;
+ NdefMap->FelicaAttrInfo.Nbr = 0;
+ NdefMap->FelicaAttrInfo.Nbw= 0;
+ NdefMap->FelicaAttrInfo.RdWrFlag = 0;
+ NdefMap->FelicaAttrInfo.WriteFlag = 0;
+ NdefMap->Felica.CurrBytesRead=0;
+
+ /* Reset all the felica manufacture details staruture variables*/
+ for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_MANUF_ID_DATA_LEN;index++)
+ {
+ NdefMap->FelicaManufDetails.ManufID[index] = 0;
+ NdefMap->FelicaManufDetails.ManufParameter[index] = 0;
+ }
+ NdefMap->Felica.NoBlocksWritten=0;
+}
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+NFCSTATUS phFriNfc_NdefMap_EraseNdef(phFriNfc_NdefMap_t *NdefMap)
+{
+ NFCSTATUS status = NFCSTATUS_PENDING;
+
+ static uint8_t PktData[3] = PH_FRINFC_NDEFMAP_EMPTY_NDEF_MSG;
+ uint8_t MemOffset = PH_FRINFC_NDEFMAP_SEEK_BEGIN;
+ uint32_t PacketDataLength = sizeof(PktData);
+
+ if (NdefMap == NULL )
+ {
+ /* Invalid input parameter error */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ switch ( NdefMap->CardType)
+ {
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+ case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
+ case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
+#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
+#endif
+#endif
+ /* Mifare card selected. Call Mifare Write */
+ status = phFriNfc_NdefMap_WrNdef( NdefMap,
+ PktData,
+ &PacketDataLength,
+ MemOffset);
+ break;
+
+ case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ /* Felica card selected. Call to write EMPTY NDEF Msg */
+ status = phFriNfc_Felica_EraseNdef( NdefMap );
+#else /* PH_FRINFC_MAP_FELICA_DISABLED*/
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/
+
+ break;
+ default :
+ /* Unknown card type. Return error */
+ status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ break;
+ }
+ }
+ return status;
+}
+/* Harsha: Fix for the mantis entry 0000420: NDEF_MAP: Size of NDEF data:
+no abstracted way for user to know how many bytes to read/write */
+
+/*!
+* \brief Helper API, exposed to the user to enable him to know the size
+* of the NDEF data that he can write in to the card.
+*/
+NFCSTATUS phFriNfc_NdefMap_GetContainerSize(const phFriNfc_NdefMap_t *NdefMap,uint32_t *maxSize, uint32_t *actualSize)
+{
+ NFCSTATUS result = NFCSTATUS_SUCCESS;
+ uint8_t sect_index = 0;
+ uint8_t actual_sect_index = 0;
+ uint8_t count_index = 0;
+
+ if( (NdefMap == NULL) || (maxSize == NULL) || (actualSize == NULL))
+ {
+ /* Invalid input parameter error */
+ result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER);
+ }
+ else
+ {
+ /* Which card ? */
+ switch(NdefMap->CardType)
+ {
+#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD :
+ /* Mifare UL card */
+ /* The integration needs to ensure that the checkNdef
+ function has been called before calling this function,
+ otherwise NdefMap->CardMemSize will be 0 */
+ *maxSize = NdefMap->MifareULContainer.RemainingSize;
+ /* In Mifare UL card, the actual size is the length field
+ value of the TLV */
+ *actualSize = NdefMap->TLVStruct.ActualSize;
+ break;
+#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */
+
+#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED
+ case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD :
+ /* Desfire card */
+ /* The integration needs to ensure that the checkNdef
+ function has been called before calling this function,
+ otherwise NdefMap->DesfireCapContainer.NdefFileSize
+ will be 0 */
+ /* -2 bytes represents the size field bytes*/
+ *maxSize = NdefMap->DesfireCapContainer.NdefFileSize - 2;
+ /* In Desfire card, the actual size cant be calculated so
+ the actual size is given as 0xFFFFFFFF */
+ *actualSize = NdefMap->DesfireCapContainer.NdefDataLen;
+ break;
+#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */
+
+#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_CARD :
+ /* Topaz card */
+ /* The integration needs to ensure that the checkNdef
+ function has been called before calling this function,
+ otherwise NdefMap->CardMemSize will be 0 */
+ *maxSize = NdefMap->TopazContainer.RemainingSize;
+ /* In Topaz card, the actual size is the length field value of the
+ TLV */
+ *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV;
+ break;
+#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED
+ case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD :
+ /* Topaz 512 card */
+ /* The integration needs to ensure that the checkNdef
+ function has been called before calling this function,
+ otherwise NdefMap->CardMemSize will be 0 */
+ *maxSize = NdefMap->TopazContainer.NDEFRWSize;
+ /* In Topaz card, the actual size is the length field value of the
+ TLV */
+ *actualSize = NdefMap->TopazContainer.ActualNDEFMsgSize;
+ break;
+
+#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */
+#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */
+#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD :
+ case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD :
+ /* Mifare std card */
+
+ /* Max size is the number of NDEF compliant blocks in the card
+ multiplied by 16 bytes */
+#ifndef PH_HAL4_ENABLE
+
+ *maxSize = NdefMap->StdMifareContainer.remainingSize;
+
+#else /* #ifndef PH_HAL4_ENABLE */
+
+ while ((PH_FRINFC_MIFARESTD_NDEF_COMP ==
+ NdefMap->StdMifareContainer.aid[count_index]) &&
+ (count_index <
+ PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK))
+ {
+ actual_sect_index++;
+ count_index++;
+ }
+ /* Total number of sectors in 1k = 16 (0 to 15, MAD sector number = 0)
+ Total number of sectors in 4k = 40 (0 to 39,
+ MAD sector number = 0 and 16, After block number 31, each sector
+ has 16 blocks)
+ Every last block of the sector is the sector header, So the blocks
+ that can be read or written in each sector is always
+ (number of blocks in each sector - 1)
+ No of blocks in the one sector till the sector number 0 to 31
+ (total 32 sectors) =
+ 4 blocks, So blocks that can be read/write = (4 - 1 = 3 blocks)
+ No of blocks in the one sector after the sector number 31 to 39 =
+ 16 blocks, So blocks that can be read/write = (16 - 1 = 15 blocks)
+ Each block has 16 bytes
+ To calculate number of bytes in the sector, depending on the number
+ of blocks multiplied by 16
+ */
+ if (PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD ==
+ NdefMap->CardType)
+ {
+ if (actual_sect_index > 32)
+ {
+ sect_index = (actual_sect_index - 32);
+ /* Here, 30 is used because block number 0 and 16 are MAD blocks
+ which cannot be used for reading and writing data
+ 3 and 15 are blocks in each sector which can be read/write
+ 3 indicates the sector is in between (0 and 31)
+ 15 indicates the sector is in between (32 to 39)
+ 16 is always number of bytes in each block
+ 4 is used because each NDEF write has to write using the
+ TLV format and T & L takes 4 bytes length and V is the
+ input data
+ */
+ *maxSize = (((30 * (16 * 3)) + (sect_index * (16 * 15))) - 4);
+ }
+ else if (actual_sect_index <= 16)
+ {
+ *maxSize = (((actual_sect_index - 1) * (16 * 3)) - 4);
+ }
+ else
+ {
+ *maxSize = (((actual_sect_index - 2) * (16 * 3)) - 4);
+ }
+ }
+ else
+ {
+ /* Here, 16 is always number of bytes in each block
+ 3 indicates the sector is in between (0 and 31) */
+ if (actual_sect_index > NdefMap->StdMifareContainer.SectorIndex)
+ {
+ actual_sect_index = NdefMap->StdMifareContainer.SectorIndex;
+ }
+ *maxSize = (((actual_sect_index - 1) * (16 * 3)) - 4);
+ }
+
+#endif /* #ifndef PH_HAL4_ENABLE */
+ *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV;
+
+ break;
+#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */
+
+#ifndef PH_FRINFC_MAP_FELICA_DISABLED
+ case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD :
+ /* Felica card */
+
+ *maxSize = NdefMap->FelicaAttrInfo.Nmaxb * 0x10;
+
+ /* In Felica Card, actual size is calculated using the Length Bytes */
+ *actualSize = NdefMap->FelicaAttrInfo.LenBytes[0];
+ *actualSize = *actualSize << 16;
+ *actualSize += NdefMap->FelicaAttrInfo.LenBytes[1];
+ *actualSize = *actualSize << 8;
+ *actualSize += NdefMap->FelicaAttrInfo.LenBytes[2];
+ break;
+#endif /* PH_FRINFC_MAP_FELICA_DISABLED */
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+ case PH_FRINFC_NDEFMAP_MOCKUP_CARD :
+ *maxSize = 0xFFFFFFFF;
+ /* In Desfire card, the actual size cant be calculated so
+ the actual size is given as 0xFFFFFFFF */
+ *actualSize = 0xFFFFFFFF;
+ break;
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+
+ default :
+ /* Unknown card type. Return error */
+ result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\
+ NFCSTATUS_INVALID_REMOTE_DEVICE);
+ break;
+ }
+ }
+ return(result);
+}
+
+#ifdef PHFRINFC_OVRHAL_MOCKUP
+NFCSTATUS phFriNfc_NdefMap_MockupCardSetter(phFriNfc_NdefMap_t *NdefMap,
+ uint8_t *NdefData,
+ uint32_t NdefActualSize,
+ uint32_t NdefMaxSize,
+ uint32_t CardSize)
+{
+ NFCSTATUS Status = NFCSTATUS_SUCCESS;
+ // First check all parameters
+ if((NdefData != NULL) && (NdefMap != NULL))
+ {
+ // OK we can set
+ NdefMap->MochupContainer.NdefData = NdefData;
+ NdefMap->MochupContainer.NdefActualSize = NdefActualSize;
+ NdefMap->MochupContainer.NdefMaxSize = NdefMaxSize;
+ NdefMap->MochupContainer.CardSize = CardSize;
+ NdefMap->MochupContainer.CurrentBlock = 0;
+
+ } else
+ {
+ Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER);
+ }
+ return Status;
+}
+
+NFCSTATUS phFriNfc_NdefMap_MockupNDefModeEn(uint8_t *pNdefCompliancy, uint8_t *pCardType, uint8_t Enable)
+{
+ *pNdefCompliancy = Enable;
+ *pCardType = PH_FRINFC_NDEFMAP_MOCKUP_CARD;
+ return NFCSTATUS_SUCCESS;
+}
+#endif /* PHFRINFC_OVRHAL_MOCKUP */
+
+
+
+
+
+
+
+