15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* 25d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Copyright (C) 2010 NXP Semiconductors 35d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 45d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Licensed under the Apache License, Version 2.0 (the "License"); 55d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * you may not use this file except in compliance with the License. 65d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * You may obtain a copy of the License at 75d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 85d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * http://www.apache.org/licenses/LICENSE-2.0 95d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Unless required by applicable law or agreed to in writing, software 115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * distributed under the License is distributed on an "AS IS" BASIS, 125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * See the License for the specific language governing permissions and 145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * limitations under the License. 155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \file phFriNfcNdefMap.c 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief NFC Ndef Mapping For Different Smart Cards. 205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 23c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen* $Date: Mon Dec 13 14:14:12 2010 $ 245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* $Author: ing02260 $ 25c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen* $Revision: 1.39 $ 26794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* $Aliases: $ 275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_NdefMap.h> 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_MifareULMap.h> 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/ 365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_TopazMap.h> 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */ 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_MifareStdMap.h> 435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_DesfireMap.h> 475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_FelicaMap.h> 515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 53a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#ifndef PH_FRINFC_MAP_ISO15693_DISABLED 54a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#include <phFriNfc_ISO15693Map.h> 55a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#endif /* PH_FRINFC_MAP_ISO15693_DISABLED */ 56a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_MockupMap.h> 595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_OvrHal.h> 635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! \ingroup grp_file_attributes 655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \name NDEF Mapping 665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* File: \ref phFriNfcNdefMap.c 685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@{*/ 71c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen#define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.39 $" 72794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#define PHFRINFCNDEFMAP_FILEALIASES "$Aliases: $" 735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@}*/ 745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Desfire capability Container Reset Helper */ 775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_DesfCapCont_HReset(phFriNfc_NdefMap_t *NdefMap); 785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Felica Smart Tag Reset Helper */ 825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Felica_HReset(phFriNfc_NdefMap_t *NdefMap); 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 86794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands/* \note This function has to be called at the beginning, after creating an 87794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* instance of \ref phFriNfc_NdefMap_t . Use this function to reset 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the instance and/or switch to a different underlying device ( 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* different NFC device or device mode, or different Remote Device). 905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_Reset( phFriNfc_NdefMap_t *NdefMap, 935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *LowerDevice, 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sRemoteDevInformation_t *psRemoteDevInfo, 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phHal_sDevInputParam_t *psDevInputParam, 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *TrxBuffer, 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t TrxBufferSize, 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *ReceiveBuffer, 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t *ReceiveLength, 1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t *DataCount) 1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 1035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index; 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 105794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if ( (ReceiveLength == NULL) || (NdefMap == NULL) || (psRemoteDevInfo == NULL) || 106794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (TrxBuffer == NULL) || (TrxBufferSize == 0) || (LowerDevice == NULL) || 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*ReceiveLength == 0) || (ReceiveBuffer == NULL) || (DataCount == NULL) || 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (psDevInputParam == NULL) || 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*ReceiveLength < PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE )) 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise the state to Init */ 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT; 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(index = 0;index<PH_FRINFC_NDEFMAP_CR;index++) 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise the NdefMap Completion Routine to Null */ 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[index].CompletionRoutine = NULL; 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise the NdefMap Completion Routine context to Null */ 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[index].Context = NULL; 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Lower Device(Always Overlapped HAL Struct initialised in application 1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly is registred in NdefMap Lower Device) */ 1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->LowerDevice = LowerDevice; 1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote Device info received from Manual Device Discovery is registered here */ 1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psRemoteDevInfo = psRemoteDevInfo; 1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Transfer Buffer registered */ 1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer = TrxBuffer; 1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the MaxApduBufferSize */ 1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize = TrxBufferSize; 1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set APDU Buffer Index */ 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register Transfer Buffer Length */ 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = 0; 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register Receive Buffer */ 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf = ReceiveBuffer; 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register Receive Buffer Length */ 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvLength = ReceiveLength; 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register Temporary Receive Buffer Length */ 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->TempReceiveLength = *ReceiveLength; 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register Data Count variable and set it to zero */ 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DataCount = DataCount; 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount = 0; 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the PageOffset */ 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = 0; 1605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the NumOfBytesRead*/ 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->NumOfBytesRead = 0; 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the NumOfBytesWritten*/ 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->NumOfBytesWritten = 0; 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the Card Type */ 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardType = 0; 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the Memory Card Size*/ 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardMemSize = 0; 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the Previous Operation*/ 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the Desfire Operation Flag*/ 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = 0; 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset MapCompletion Info*/ 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.CompletionRoutine = NULL; 1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.Context = NULL; 1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the ReadingForWriteOperation flag. */ 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ReadingForWriteOperation = 0; /* FALSE */ 1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Reset Desfire Cap Container elements*/ 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_DesfCapCont_HReset(NdefMap); 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Reset Mifare Standard Container elements*/ 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->StdMifareContainer.DevInputParam = psDevInputParam; 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareStdMap_H_Reset(NdefMap); 1955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Reset Felica Tag elements*/ 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaPollDetails.DevInputParam = psDevInputParam; 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Felica_HReset(NdefMap); 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if !(defined(PH_FRINFC_MAP_TOPAZ_DISABLED ) || defined (PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED )) 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_TopazMap_H_Reset(NdefMap); 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED || PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */ 2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareUL_H_Reset(NdefMap); 2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Reset Desfire Cap Container elements*/ 2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Mockup_H_Reset(NdefMap); 2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 218794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* 219794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * Fix for PR - 0001256 2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Date- 08-08-08 2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID; 2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (status); 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Registering the Completion Routine. 2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This function requires the caller to set a Completion Routine 2325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* which serves as notifier for the upper component. 2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* NOTE: Please refer the header file for more information. 2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_SetCompletionRoutine(phFriNfc_NdefMap_t *NdefMap, 2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t FunctionID, 2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly pphFriNfc_Cr_t CompletionRoutine, 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly void *CompletionRoutineContext) 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 244794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if ( ( NdefMap == NULL ) || (FunctionID >= PH_FRINFC_NDEFMAP_CR) || 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( CompletionRoutine == NULL) || (CompletionRoutineContext == NULL)) 2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register the application callback with the NdefMap Completion Routine */ 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[FunctionID].CompletionRoutine = CompletionRoutine; 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Register the application context with the NdefMap Completion Routine context */ 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[FunctionID].Context = CompletionRoutineContext; 2565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Initiates Reading of NDEF information from the Remote Device. 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Remote Peer device may be of type any card. Ex: desfire,felica,jewel 265794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* mifareUL,mifare 1K etc. The function initiates the reading of NDEF 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* information from a Remote Device. 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This is the main NdefMap read function call.Internally,depending upon 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the CardType,respective mifare/desfire read functions are called. 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* In future this can be extended to support any types of card. 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and triggers/starts the raed action (state machine). 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* has been triggered. 2755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* NOTE: Please refer the header file for more information. 2775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_RdNdef( phFriNfc_NdefMap_t *NdefMap, 2815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *PacketData, 2825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t *PacketDataLength, 2835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Offset) 2845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 287794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check for validity of input parameters*/ 289794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (( PacketData == NULL ) 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( NdefMap == NULL ) 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( PacketDataLength == NULL ) 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( *PacketDataLength == 0 ) 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( ( Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN )) 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NdefMap->CompletionRoutine->CompletionRoutine == NULL) 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NdefMap->CompletionRoutine->Context == NULL ) 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if (NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 302794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Card is in invalid state, cannot have any read/write 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly operations*/ 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_FORMAT); 306794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INITIALIZED) 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Can't read any data from the card:TLV length is zero*/ 310794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->NumOfBytesRead = PacketDataLength; 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->NumOfBytesRead = 0; 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if ( (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_WRITE_OPE) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN )) 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST); 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the offset given by the user 324794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands If the offset is 1 (SEEK_BEGIN), reset everything and start 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly reading from the first Page of the card. 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if offset is 0 (PH_FRINFC_NDEFMAP_SEEK_CUR), continue reading 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly No need to reset the parameters. */ 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN ) 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount = 0; 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (NdefMap->CardType == PH_FRINFC_NDEFMAP_ISO14443_4A_CARD) && 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (*NdefMap->DataCount == 0 )) 3375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* A READ operation cannot be done if the previuos operation was WRITE 3405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly unless the offset is set to PH_FRINFC_NDEFMAP_SEEK_BEGIN Or 3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Read Operation with Offset set to Continue & DataCount set to 0 */ 3425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST); 3435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch ( NdefMap->CardType) 3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD : 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare card selected. Call Mifare read */ 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareUL_RdNdef ( NdefMap, 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */ 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD : 360794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 361794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 : 362794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Desfire card selected. Call Desfire read */ 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_RdNdef( NdefMap, 3655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 3665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 3675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 3685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD : 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD : 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare card selected. Call Mifare read */ 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareStdMap_RdNdef ( NdefMap, 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD : 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Desfire card selected. Call Desfire Write */ 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Felica_RdNdef( NdefMap, 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 3875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_CARD : 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz card selected. Call Topaz read */ 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazMap_RdNdef( NdefMap, 3965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 3985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD : 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz card selected. Call Topaz read */ 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazDynamicMap_RdNdef( NdefMap, 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */ 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */ 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 411a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#ifndef PH_FRINFC_MAP_ISO15693_DISABLED 412a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen case PH_FRINFC_NDEFMAP_ISO15693_CARD: 413a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen status = phFriNfc_ISO15693_RdNdef( NdefMap, 414a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen PacketData, 415a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen PacketDataLength, 416a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen Offset); 417a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen break; 418a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#endif /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */ 419a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 4205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MOCKUP_CARD : 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mockup card selected. Call Mockup Write */ 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Mockup_RdNdef( NdefMap, 4245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 4255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 4265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 430794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Unknown card type. Return error */ 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Initiates Writing of NDEF information to the Remote Device. 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function initiates the writing of NDEF information to a Remote Device 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Remote Peer device may be of type any card. Ex: desfire,felica,jewel 448794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* mifareUL,mifare 1K etc. The function initiates the reading of NDEF 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* information from a Remote Device. 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 451794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* This is a main write api.Internally,depending upon the CardType, 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* respective mifare/desfire write apis are called.In future this can be 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* extended to support any types of card. 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and starts the action (state machine). 456794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the action has been triggered. 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* NOTE: Please refer the header file for more information. 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_WrNdef( phFriNfc_NdefMap_t *NdefMap, 4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *PacketData, 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t *PacketDataLength, 4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Offset) 4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 470794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint8_t StatusChk=0; 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (PacketData == NULL) 4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( NdefMap == NULL ) 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* + Mantis 442 */ 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( PacketDataLength == NULL ) 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* - Mantis 442 */ 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ( *PacketDataLength == 0 ) 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || ((Offset != PH_FRINFC_NDEFMAP_SEEK_CUR) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN )) 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NdefMap->CompletionRoutine->CompletionRoutine == NULL) 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly || (NdefMap->CompletionRoutine->Context == NULL) 4815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ) 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Invalid input parameter error */ 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER); 485794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 486794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else if (( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) && 487794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (PH_FRINFC_NDEFMAP_TOPAZ_CARD != NdefMap->CardType) && 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD != NdefMap->CardType)) 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 490794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Card is in invalid state, cannot have any read/write 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly operations*/ 4925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_FORMAT); 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if ( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_READ_ONLY ) 4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Can't write to the card :No Grants */ 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NOT_ALLOWED); 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the no. bytes written is zero*/ 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->WrNdefPacketLength = PacketDataLength; 5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->WrNdefPacketLength = 0; 5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 508794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check the offset given by the user 511794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands If the offset is 1 (SEEK_BEGIN), reset everything and start 5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly writing from the first Byte of the card. 5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if offset is 0 (PH_FRINFC_NDEFMAP_SEEK_CUR), continue writing 5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly No need to reset the parameters. */ 515794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (( NdefMap->CardState == PH_NDEFMAP_CARD_STATE_INVALID) && 5165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD == NdefMap->CardType)) 5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* If Topaz Dynamic card CC bytes are not valid then also allow writing, 5195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly If card is really good then writing will be done properly and reading can be performed, 520794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands otherwise writing or reading will fail. so, setting card state to 5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE */ 5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE; 5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN ) 5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount = 0; 5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 531794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if ( (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_UL_CARD) || 5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->CardType == PH_FRINFC_NDEFMAP_ISO14443_4A_CARD)) 5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 534794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (( (NdefMap->PrevOperation == PH_FRINFC_NDEFMAP_READ_OPE) && (Offset != PH_FRINFC_NDEFMAP_SEEK_BEGIN )) || 5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && (*NdefMap->DataCount == 0 ))) 5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* A WRITE operation cannot be done if the previuos operation was READ 5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly unless the offset is set to PH_FRINFC_NDEFMAP_SEEK_BEGIN OR 5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Write Operation with Offset set to Continue & DataCount set to 0 */ 5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST); 5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly StatusChk = 1; 5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(StatusChk != 1) 5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->WrNdefPacketLength = PacketDataLength; 5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch ( NdefMap->CardType) 5485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD : 5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare card selected. Call Mifare Write */ 5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareUL_WrNdef( NdefMap, 5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */ 5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD : 561794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 562794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 : 563794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Desfire card selected. Call Desfire Write */ 5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_WrNdef( NdefMap, 5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 5675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 568794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Offset); 5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD : 5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD : 5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare card selected. Call Mifare read */ 5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareStdMap_WrNdef ( NdefMap, 5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD : 5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Desfire card selected. Call Desfire Write */ 5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Felica_WrNdef( NdefMap, 5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_CARD : 5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz card selected. Call Topaz Write */ 5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazMap_WrNdef( NdefMap, 5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED 6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD : 6035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz card selected. Call Topaz Write */ 6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazDynamicMap_WrNdef( NdefMap, 6055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */ 6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */ 6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 612a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#ifndef PH_FRINFC_MAP_ISO15693_DISABLED 613a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen case PH_FRINFC_NDEFMAP_ISO15693_CARD: 614a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen status = phFriNfc_ISO15693_WrNdef( NdefMap, 615a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen PacketData, 616a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen PacketDataLength, 617a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen Offset); 618a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen break; 619a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#endif /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */ 620a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MOCKUP_CARD : 6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mockup card selected. Call Mockup Write */ 6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Mockup_WrNdef( NdefMap, 6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketData, 6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PacketDataLength, 6285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Offset); 6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 631794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Unknown card type. Return error */ 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 6345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 64280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF 643a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 64480ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS 64580ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_NdefMap_ConvertToReadOnly ( 64680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen phFriNfc_NdefMap_t *NdefMap) 64780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{ 64880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen NFCSTATUS result = NFCSTATUS_PENDING; 64980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 65080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 65180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen /* Check for ndefmap context and relevant state. Else return error*/ 65280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen if (NULL == NdefMap) 65380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 65480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 65580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 65680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen else if ((NdefMap->CompletionRoutine->CompletionRoutine == NULL) 65780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen || (NdefMap->CompletionRoutine->Context == NULL)) 65880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 65980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 66080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 66180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen else 66280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 66380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen switch (NdefMap->CardType) 66480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 66580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen case PH_FRINFC_NDEFMAP_TOPAZ_CARD: 66680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 66780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen result = phFriNfc_TopazMap_ConvertToReadOnly (NdefMap); 66880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen break; 66980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 67080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 671c0bdf30e40dd60628bfafd5f93a3a911e3b91da9Martijn Coenen case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD: 672a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen { 673a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen result = phFriNfc_TopazDynamicMap_ConvertToReadOnly (NdefMap); 674a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen break; 675a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen } 676a6243755a9b438bfbfe0be331ece55953f8cf9ebMartijn Coenen 6774f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen case PH_FRINFC_NDEFMAP_ISO15693_CARD: 67880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen { 6794f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen result = phFriNfc_ISO15693_ConvertToReadOnly (NdefMap); 68080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen break; 68180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 682a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 6834f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen default: 684a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen { 6854f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 6864f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen NFCSTATUS_INVALID_REMOTE_DEVICE); 687a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen break; 688a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen } 68980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 69080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen } 69180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen return result; 69280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen} 693a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 69480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */ 69580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen 6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Check whether a particular Remote Device is NDEF compliant. 6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 699794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* The function initiates the ndef compliancy check. 7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This is a main check ndef api.Internally,depending upon the different 7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* opmodes,respective mifare/desfire checkNdef apis are called. 703794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* In future this can be extended to check any types of card ndef 7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* compliancy. 7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and starts the action (state machine). 707794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once 7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* the action has been triggered. 7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* NOTE: Please refer the header file for more information. 7115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_ChkNdef( phFriNfc_NdefMap_t *NdefMap) 7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t sak; 7185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check for ndefmap context and relevant state. Else return error*/ 7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap == NULL ) 7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NdefMap->State != PH_FRINFC_NDEFMAP_STATE_RESET_INIT) || 7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->psRemoteDevInfo->SessionOpened != 0x01 ) ) 7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Harsha: If SessionOpened is not 1, this means that connect has not happened */ 7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_DEVICE_REQUEST); 7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if ( (NdefMap->CompletionRoutine->CompletionRoutine == NULL) || (NdefMap->CompletionRoutine->Context == NULL )) 7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* 7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 1.Changed 741794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * CardInfo106 Replace with the ReaderA_Info. 7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 7435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sak = NdefMap->psRemoteDevInfo->RemoteDevInfo.Iso14443A_Info.Sak; 7455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 746794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* 7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 3. Changed 7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Description: Opmode replace with RemDevType. 7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch ( NdefMap->psRemoteDevInfo->RemDevType ) 7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 754a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#ifndef PH_FRINFC_MAP_ISO15693_DISABLED 755a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen case phHal_eISO15693_PICC: 756a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen { 757a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen status = phFriNfc_ISO15693_ChkNdef (NdefMap); 758a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen break; 759a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen } 760a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#else /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */ 761a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 762a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NFCSTATUS_INVALID_REMOTE_DEVICE); 763a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#endif /* #ifndef PH_FRINFC_MAP_ISO15693_DISABLED */ 764a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eMifare_PICC: 7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eISO14443_3A_PICC: 7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Mifare card . Check for Mifare 7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NDEF compliancy */ 769794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if(0x00 == sak) 7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The SAK/Sel_Res says the card is of the type 7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Mifare UL */ 7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareUL_ChkNdef( NdefMap); 7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/ 776794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 777794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/ 7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 780794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else if ((0x08 == (sak & 0x18)) || 781eb6da80b266a263350769a0e5629f4089aad32bbSunil Jogi (0x18 == (sak & 0x18)) || 782eb6da80b266a263350769a0e5629f4089aad32bbSunil Jogi (0x01 == sak)) 7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The SAK/Sel_Res says the card is of the type 7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Mifare Standard */ 7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MifareStdMap_ChkNdef( NdefMap); 7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/ 789794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 790794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/ 7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 795794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Invalid Mifare UL card, as the remote device 796794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands info - opmode says its a Mifare UL card but, 7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly The SAK/Sel_Res is wrong */ 798794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eISO14443_B_PICC: 803794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 804794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_ChkNdef(NdefMap); 8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eISO14443_A_PICC : 8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Desfire card . Check for Desfire 8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NDEF compliancy */ 8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(0x20 == (sak & 0x20)) 8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The SAK/Sel_Res says the card is of the type 8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ISO14443_4A */ 8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_ChkNdef(NdefMap); 8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_DESFIRE_DISABLED*/ 817794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 818794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED*/ 8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 823794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Invalid Desfire card, as the remote device 824794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands info - opmode says its a desfire card but, 8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly The SAK/Sel_Res is wrong */ 826794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eFelica_PICC: 8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the OpMode Type Flag*/ 8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_HAL4_ENABLE 8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->OpModeType[0] = phHal_eOpModesFelica212; 8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator; 8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifndef PH_HAL4_ENABLE */ 8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Felica_ChkNdef(NdefMap); 8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_FELICA_DISABLED*/ 841794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 842794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/ 8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_HAL4_ENABLE 8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eFelica424: 8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the OpMode Ttype Flag*/ 8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->OpModeType[0] = phHal_eOpModesFelica424; 8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator; 8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Felica_ChkNdef(NdefMap); 8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_FELICA_DISABLED*/ 855794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 856794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/ 8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewel_PICC : 8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Topaz card . Check for Topaz 8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NDEF compliancy */ 8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Decide on the Header bytes to know the 867794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Type of the Topaz card.Card could be Static or 8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Dynamic type. These are of type NFFC-NDEF Data Application*/ 869794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if ( NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.HeaderRom0 8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly == PH_FRINFC_TOPAZ_HEADROM0_VAL) 8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazMap_ChkNdef(NdefMap); 8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED 876794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else if( NdefMap->psRemoteDevInfo->RemoteDevInfo.Jewel_Info.HeaderRom0 8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly == PH_FRINFC_TOPAZ_DYNAMIC_HEADROM0_VAL) 8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazDynamicMap_ChkNdef(NdefMap); 8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 886794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(0xC2 == sak) 8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The SAK/Sel_Res says the card is of the type 8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ISO14443_4A */ 8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_TopazMap_ChkNdef(NdefMap); 9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_TOPAZ_DISABLED*/ 901794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 902794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED*/ 9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 906794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 907794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Invalid Topaz card, as the remote device 908794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands info - opmode says its a desfire card but, 9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly The SAK/Sel_Res is wrong */ 910794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 913794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif 9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eOpModesMockup : 9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the OpMode Ttype Flag*/ 9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->OpModeType[0] = phHal_eOpModesMockup; 9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->OpModeType[1] = phHal_eOpModesArrayTerminator; 9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Mockup_ChkNdef(NdefMap); 9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly default : 9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is not recognised. 9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Probably not NDEF compliant */ 9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Completion Routine, Processing function, needed to avoid long blocking. 9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion 9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Routine in order to be able to notify the component that an I/O has finished and data are 9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* ready to be processed. 9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This is a main Ndef Map Process api.Internally,depending upon the different 9445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* CardTypes,respective mifare/desfire process functions are called. 9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_NdefMap_Process( void *Context, 9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Context != NULL ) 9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_NdefMap_t *NdefMap = (phFriNfc_NdefMap_t *)Context; 9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* 9565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 4 Changed 9575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * Description: Opmode replace with RevDevTyp. 9585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 9595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch ( NdefMap->psRemoteDevInfo->RemDevType ) 9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eMifare_PICC : 9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eISO14443_3A_PICC: 9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD) || 9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->CardType == PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD)) 9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Mifare Standard card */ 9705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_MifareStdMap_Process(NdefMap,Status); 9715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/ 972794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 973794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 9745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED*/ 9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 9775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 9795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Mifare UL card */ 9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_MifareUL_Process(NdefMap,Status); 9815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/ 982794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 983794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 9845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED*/ 9855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eISO14443_A_PICC : 9895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 9905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Desfire card */ 9915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_Process(NdefMap, Status); 9925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_DESFIRE_DISABLED*/ 993794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 994794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED*/ 9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eISO14443_B_PICC: 9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Desfire card */ 9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_Process(NdefMap, Status); 10005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eFelica_PICC : 10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Felica Smart card */ 10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Felica_Process(NdefMap, Status); 10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_FELICA_DISABLED*/ 1007794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 1008794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/ 10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eJewel_PICC: 10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 10145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->CardType == PH_FRINFC_NDEFMAP_TOPAZ_CARD ) 10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Topaz Smart card */ 10175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_TopazMap_Process(NdefMap, Status); 10185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED 10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if ( NdefMap->CardType == PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD ) 10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Topaz Smart card */ 10235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_TopazDynamicMap_Process(NdefMap, Status); 10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1027794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 1028794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED*/ 10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case phHal_eOpModesMockup: 10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device is Desfire card */ 1039794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Mockup_Process(NdefMap, Status); 10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP*/ 1042794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Remote device opmode not recognised. 10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Probably not NDEF compliant */ 10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the state back to the Reset_Init state*/ 10485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT; 10495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the completion routine*/ 10515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_INVALID_OPE]. 10525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CompletionRoutine(NdefMap->CompletionRoutine->Context, Status); 10535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 10575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 10595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_PARAMETER); 10605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The control should not come here. As Context itself is NULL , 10615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Can't call the CR*/ 10625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 10645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#if 0 10665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_ChkAndParseTLV(phFriNfc_NdefMap_t *NdefMap) 10685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 10695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 10705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch ( NdefMap->CardType ) 10725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 10745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD : 10755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */ 10795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 10815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD : 10825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desf_ChkAndParseTLV(NdefMap); 10835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (status); 10845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 10875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 10895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD : 10905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD : 10915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 10945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 10965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD : 10975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ; 10985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 11005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1101794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 11025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Unknown card type. Return error */ 11035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 11045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 11055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 11075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return ( status); 11105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 11125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 11155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_DesfCapCont_HReset(phFriNfc_NdefMap_t *NdefMap) 11165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise/reset the desfire capability contatiner structure variables*/ 11185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.DesfVersion = 0; 11195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefMsgFid = 0; 11205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefFileSize = 0; 11215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxCmdSize = 0; 11225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxRespSize = 0; 11235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.ReadAccess = 0; 11245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.WriteAccess = 0; 11255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 11275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 11295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Felica_HReset(phFriNfc_NdefMap_t *NdefMap) 11305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t index=0; 11325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Initialise/reset the different felica structure variables*/ 11345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset all the felica Basic staruture variables*/ 11355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.CurBlockNo = 0; 11365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_BLOCK_SIZE;index++) 11385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.Rd_BytesToCopyBuff[index] = 0; 11405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.Wr_RemainedBytesBuff[index] = 0; 11415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.Rd_NoBytesToCopy = 0; 11435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.Wr_BytesRemained = 0; 11445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset all the felica attribute information staruture variables*/ 11475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_ATTR_NDEF_DATA_LEN;index++) 11485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaAttrInfo.LenBytes[index] = 0; 11505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaAttrInfo.Nmaxb = 0; 11535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaAttrInfo.Nbr = 0; 11545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaAttrInfo.Nbw= 0; 11555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaAttrInfo.RdWrFlag = 0; 11565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaAttrInfo.WriteFlag = 0; 11575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.CurrBytesRead=0; 11585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset all the felica manufacture details staruture variables*/ 11605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly for(index = 0;index<PH_FRINFC_NDEFMAP_FELICA_MANUF_ID_DATA_LEN;index++) 11615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaManufDetails.ManufID[index] = 0; 11635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->FelicaManufDetails.ManufParameter[index] = 0; 11645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Felica.NoBlocksWritten=0; 11665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 11685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_EraseNdef(phFriNfc_NdefMap_t *NdefMap) 11705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 11725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly static uint8_t PktData[3] = PH_FRINFC_NDEFMAP_EMPTY_NDEF_MSG; 11745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t MemOffset = PH_FRINFC_NDEFMAP_SEEK_BEGIN; 1175d5dae5f9ae4f79985a032d011b6b3d12749823cdJack Ren static uint32_t PacketDataLength = sizeof(PktData); 11765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NdefMap == NULL ) 11785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Invalid input parameter error */ 11805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER); 11815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 11835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch ( NdefMap->CardType) 11855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 11875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MOCKUP_CARD : 11885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 11895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD : 11905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD : 1191794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 1192794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 : 1193794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 11945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD : 11955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD : 11965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 11975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_CARD : 11985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED 11995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD : 12005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 1201a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#ifndef PH_FRINFC_MAP_ISO15693_DISABLED 1202a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen case PH_FRINFC_NDEFMAP_ISO15693_CARD: 1203a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#endif 12045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 12055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare card selected. Call Mifare Write */ 12065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_NdefMap_WrNdef( NdefMap, 12075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PktData, 12085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &PacketDataLength, 12095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly MemOffset); 12105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD : 12135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 1215794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Felica card selected. Call to write EMPTY NDEF Msg */ 12165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Felica_EraseNdef( NdefMap ); 12175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* PH_FRINFC_MAP_FELICA_DISABLED*/ 1218794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 1219794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS_INVALID_REMOTE_DEVICE); 12205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED*/ 12215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 1223794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 12245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Unknown card type. Return error */ 12255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 12265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 12275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 12315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 12325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Harsha: Fix for the mantis entry 0000420: NDEF_MAP: Size of NDEF data: 12335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyno abstracted way for user to know how many bytes to read/write */ 12345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 12365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Helper API, exposed to the user to enable him to know the size 12375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* of the NDEF data that he can write in to the card. 12385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 12395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_GetContainerSize(const phFriNfc_NdefMap_t *NdefMap,uint32_t *maxSize, uint32_t *actualSize) 12405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 12415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS result = NFCSTATUS_SUCCESS; 12425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t sect_index = 0; 12435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t actual_sect_index = 0; 12445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t count_index = 0; 12455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NdefMap == NULL) || (maxSize == NULL) || (actualSize == NULL)) 12475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Invalid input parameter error */ 12495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,NFCSTATUS_INVALID_PARAMETER); 12505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 12525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Which card ? */ 12545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->CardType) 12555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFAREUL_DISABLED 12575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_UL_CARD : 12585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare UL card */ 1259794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* The integration needs to ensure that the checkNdef 12605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly function has been called before calling this function, 12615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly otherwise NdefMap->CardMemSize will be 0 */ 12625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = NdefMap->MifareULContainer.RemainingSize; 1263794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* In Mifare UL card, the actual size is the length field 12645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly value of the TLV */ 12655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = NdefMap->TLVStruct.ActualSize; 12665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFAREUL_DISABLED */ 12685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 12705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD : 1271794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 1272794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 : 1273794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 12745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Desfire card */ 1275794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* The integration needs to ensure that the checkNdef 12765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly function has been called before calling this function, 1277794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands otherwise NdefMap->DesfireCapContainer.NdefFileSize 12785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly will be 0 */ 12795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* -2 bytes represents the size field bytes*/ 12805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = NdefMap->DesfireCapContainer.NdefFileSize - 2; 1281794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* In Desfire card, the actual size cant be calculated so 12825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly the actual size is given as 0xFFFFFFFF */ 12835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = NdefMap->DesfireCapContainer.NdefDataLen; 12845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 12865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DISABLED 12885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_CARD : 12895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz card */ 1290794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* The integration needs to ensure that the checkNdef 12915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly function has been called before calling this function, 12925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly otherwise NdefMap->CardMemSize will be 0 */ 12935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = NdefMap->TopazContainer.RemainingSize; 1294794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* In Topaz card, the actual size is the length field value of the 12955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TLV */ 12965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV; 12975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 12985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED 12995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_TOPAZ_DYNAMIC_CARD : 13005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Topaz 512 card */ 1301794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* The integration needs to ensure that the checkNdef 13025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly function has been called before calling this function, 13035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly otherwise NdefMap->CardMemSize will be 0 */ 13045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = NdefMap->TopazContainer.NDEFRWSize; 1305794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* In Topaz card, the actual size is the length field value of the 13065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TLV */ 13075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = NdefMap->TopazContainer.ActualNDEFMsgSize; 13085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 13095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DISABLED */ 13115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_TOPAZ_DYNAMIC_DISABLED */ 13125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_MIFARESTD_DISABLED 13135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_1K_CARD : 13145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD : 13155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mifare std card */ 13165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Max size is the number of NDEF compliant blocks in the card 13185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly multiplied by 16 bytes */ 13195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_HAL4_ENABLE 13205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = NdefMap->StdMifareContainer.remainingSize; 13225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else /* #ifndef PH_HAL4_ENABLE */ 13245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1325794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands while ((PH_FRINFC_MIFARESTD_NDEF_COMP == 1326794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->StdMifareContainer.aid[count_index]) && 1327794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (count_index < 13285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_MIFARESTD_TOTALNO_BLK)) 13295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly actual_sect_index++; 13315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly count_index++; 13325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Total number of sectors in 1k = 16 (0 to 15, MAD sector number = 0) 1334794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Total number of sectors in 4k = 40 (0 to 39, 1335794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands MAD sector number = 0 and 16, After block number 31, each sector 13365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly has 16 blocks) 1337794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Every last block of the sector is the sector header, So the blocks 1338794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands that can be read or written in each sector is always 13395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (number of blocks in each sector - 1) 1340794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands No of blocks in the one sector till the sector number 0 to 31 1341794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (total 32 sectors) = 13425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4 blocks, So blocks that can be read/write = (4 - 1 = 3 blocks) 1343794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands No of blocks in the one sector after the sector number 31 to 39 = 13445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16 blocks, So blocks that can be read/write = (16 - 1 = 15 blocks) 1345794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Each block has 16 bytes 13465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly To calculate number of bytes in the sector, depending on the number 13475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly of blocks multiplied by 16 13485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 1349794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (PH_FRINFC_NDEFMAP_MIFARE_STD_4K_CARD == 13505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardType) 1351794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 13525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (actual_sect_index > 32) 13535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly sect_index = (actual_sect_index - 32); 1355794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Here, 30 is used because block number 0 and 16 are MAD blocks 1356794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands which cannot be used for reading and writing data 13575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3 and 15 are blocks in each sector which can be read/write 13585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3 indicates the sector is in between (0 and 31) 13595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15 indicates the sector is in between (32 to 39) 1360794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 16 is always number of bytes in each block 1361794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 4 is used because each NDEF write has to write using the 1362794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands TLV format and T & L takes 4 bytes length and V is the 13635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly input data 13645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 13655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = (((30 * (16 * 3)) + (sect_index * (16 * 15))) - 4); 13665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if (actual_sect_index <= 16) 13685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = (((actual_sect_index - 1) * (16 * 3)) - 4); 13705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = (((actual_sect_index - 2) * (16 * 3)) - 4); 13745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1378794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Here, 16 is always number of bytes in each block 13795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3 indicates the sector is in between (0 and 31) */ 13805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (actual_sect_index > NdefMap->StdMifareContainer.SectorIndex) 13815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly actual_sect_index = NdefMap->StdMifareContainer.SectorIndex; 13835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = (((actual_sect_index - 1) * (16 * 3)) - 4); 13855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1386794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 13875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifndef PH_HAL4_ENABLE */ 13885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = NdefMap->TLVStruct.BytesRemainLinTLV; 13895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 13915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_MIFARESTD_DISABLED */ 13925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_FELICA_DISABLED 13945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_FELICA_SMART_CARD : 13955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Felica card */ 13965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = NdefMap->FelicaAttrInfo.Nmaxb * 0x10; 13985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* In Felica Card, actual size is calculated using the Length Bytes */ 14005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = NdefMap->FelicaAttrInfo.LenBytes[0]; 14015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = *actualSize << 16; 14025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize += NdefMap->FelicaAttrInfo.LenBytes[1]; 14035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *actualSize = *actualSize << 8; 1404794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands *actualSize += NdefMap->FelicaAttrInfo.LenBytes[2]; 14055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 14065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_FELICA_DISABLED */ 14075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1408a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#ifndef PH_FRINFC_MAP_ISO15693_DISABLED 1409a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen case PH_FRINFC_NDEFMAP_ISO15693_CARD: 1410a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen { 14114f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen#if 1 1412a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen uint16_t block_no = 0; 1413a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen uint8_t byte_no = 0; 1414a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 1415a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen block_no = (uint16_t) 1416a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen ISO15693_GET_VALUE_FIELD_BLOCK_NO ( 1417a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NdefMap->ISO15693Container.ndef_tlv_type_blk, 1418a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NdefMap->ISO15693Container.ndef_tlv_type_byte, 1419a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NdefMap->ISO15693Container.actual_ndef_size); 1420a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen byte_no = (uint8_t) 1421a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen ISO15693_GET_VALUE_FIELD_BYTE_NO ( 1422a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NdefMap->ISO15693Container.ndef_tlv_type_blk, 1423a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NdefMap->ISO15693Container.ndef_tlv_type_byte, 1424a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen NdefMap->ISO15693Container.actual_ndef_size); 1425a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 1426a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen *maxSize = (NdefMap->ISO15693Container.max_data_size - 14274f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen ((block_no * ISO15693_BYTES_PER_BLOCK) + byte_no)); 14284f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen#else /* #if 1 */ 1429a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen /* 2 is used to exclude the T and L part of the TLV */ 1430a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen *maxSize = (NdefMap->ISO15693Container.max_data_size 1431a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen - ISO15693_BYTES_PER_BLOCK - 2); 14324f3ef022906e5d3b763fbcfe81e3f5cd53976ab5Martijn Coenen#endif /* #if 1 */ 1433a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen *actualSize = NdefMap->ISO15693Container.actual_ndef_size; 1434a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen break; 1435a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen } 1436a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen#endif 1437a6e012a748e70ab203655d4e1c0d0a77b6515fadMartijn Coenen 14385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 14395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_MOCKUP_CARD : 14405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *maxSize = 0xFFFFFFFF; 1441794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* In Desfire card, the actual size cant be calculated so 14425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly the actual size is given as 0xFFFFFFFF */ 1443794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands *actualSize = 0xFFFFFFFF; 14445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 14455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 14465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1447794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 14485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Unknown card type. Return error */ 14495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 14505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 14515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 14525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return(result); 14555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 14565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PHFRINFC_OVRHAL_MOCKUP 1458794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan BrandsNFCSTATUS phFriNfc_NdefMap_MockupCardSetter(phFriNfc_NdefMap_t *NdefMap, 1459794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint8_t *NdefData, 1460794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint32_t NdefActualSize, 1461794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint32_t NdefMaxSize, 14625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t CardSize) 14635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 14645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status = NFCSTATUS_SUCCESS; 14655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly // First check all parameters 14665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefData != NULL) && (NdefMap != NULL)) 14675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly // OK we can set 1469794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->MochupContainer.NdefData = NdefData; 14705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MochupContainer.NdefActualSize = NdefActualSize; 14715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MochupContainer.NdefMaxSize = NdefMaxSize; 14725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MochupContainer.CardSize = CardSize; 14735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MochupContainer.CurrentBlock = 0; 14745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1475794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } else 14765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1477794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_PARAMETER); 14785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return Status; 14805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 14815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_NdefMap_MockupNDefModeEn(uint8_t *pNdefCompliancy, uint8_t *pCardType, uint8_t Enable) 14835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 14845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *pNdefCompliancy = Enable; 14855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *pCardType = PH_FRINFC_NDEFMAP_MOCKUP_CARD; 14865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return NFCSTATUS_SUCCESS; 14875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 14885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PHFRINFC_OVRHAL_MOCKUP */ 14895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1497