diff options
Diffstat (limited to 'src/phFriNfc_NdefMap.c')
-rw-r--r-- | src/phFriNfc_NdefMap.c | 1363 |
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 */ + + + + + + + + |