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 phFriNfc_Desfire.c 195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief This component encapsulates read/write/check ndef/process functionalities, 20794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* for the Desfire Card. 215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI 235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 24794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* $Date: Tue Jul 27 08:58:22 2010 $ 25794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* $Author: ing02260 $ 26794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* $Revision: 1.11 $ 27794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* $Aliases: $ 285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_FRINFC_MAP_DESFIRE_DISABLED 325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_OvrHal.h> 345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_DesfireMap.h> 355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_MapTools.h> 365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! \ingroup grp_file_attributes 395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \name NDEF Mapping 405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* File: \ref phFriNfc_Desfire.c 425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@{*/ 45794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#define PHFRINFCNDEFMAP_FILEREVISION "$Revision: 1.11 $" 46794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#define PHFRINFCNDEFMAP_FILEALIASES "$Aliases: $" 475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@}*/ 495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 50794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands/***************** Start of MACROS ********************/ 51794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 52794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands #define DESFIRE_EV1_P2_OFFSET_VALUE (0x0CU) 53794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 54794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 55794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands/***************** End of MACROS ********************/ 56794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@}*/ 585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * \name Desfire Mapping - Helper Functions 615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * 625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*@{*/ 645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 66794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * \brief \copydoc page_ovr Helper function for Desfire. This function specifies 675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * the card is a Desfire card or not. 685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_SelectSmartTag( phFriNfc_NdefMap_t *NdefMap); 705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 72794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * \brief \copydoc page_ovr Helper function for Desfire. This function is used 735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * to selct a file in the card. 745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_SelectFile ( phFriNfc_NdefMap_t *NdefMap); 765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 78794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * \brief \copydoc page_ovr Helper function for Desfire. This function is to 795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * read the card. 805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_ReadBinary( phFriNfc_NdefMap_t *NdefMap); 825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 84794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * \brief \copydoc page_ovr Helper function for Desfire. This function is to 855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * write to the card. 865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_UpdateBinary( phFriNfc_NdefMap_t *NdefMap); 885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 90794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands * \brief \copydoc page_ovr Helper function for Desfire. This function is to 915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly * update the capability container of the card. 925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 93794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brandsstatic NFCSTATUS phFriNfc_Desfire_Update_SmartTagCapContainer( phFriNfc_NdefMap_t *NdefMap); 945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Completion Helper*/ 975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desfire_HCrHandler( phFriNfc_NdefMap_t *NdefMap, 985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status); 995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Calculates the Le Bytes for Read Operation*/ 1015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic uint32_t phFriNfc_Desfire_HGetLeBytes( phFriNfc_NdefMap_t *NdefMap); 1025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 103794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brandsstatic NFCSTATUS phFriNfc_Desf_HChkAndParseTLV( phFriNfc_NdefMap_t *NdefMap, 1045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t BuffIndex); 1055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HSetGet_NLEN( phFriNfc_NdefMap_t *NdefMap); 1075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desfire_HProcReadData( phFriNfc_NdefMap_t *NdefMap); 1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desfire_HChkNDEFFileAccessRights( phFriNfc_NdefMap_t *NdefMap); 1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HSendTransCmd(phFriNfc_NdefMap_t *NdefMap,uint8_t SendRecvLen); 1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Following are the API's are used to get the version of the desfire card*/ 1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HGetHWVersion(phFriNfc_NdefMap_t *NdefMap); 1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HGetSWVersion(phFriNfc_NdefMap_t *NdefMap); 1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HGetUIDDetails(phFriNfc_NdefMap_t *NdefMap); 1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HUpdateVersionDetails(const phFriNfc_NdefMap_t *NdefMap); 1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HGetHWVersion(phFriNfc_NdefMap_t *NdefMap) 1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the state*/ 1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_DESF_STATE_GET_HW_VERSION; 1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Helper routine to wrap the native desfire cmds*/ 1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_DESF_ISO_NATIVE_WRAPPER(); 1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE); 1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (status); 1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HGetSWVersion(phFriNfc_NdefMap_t *NdefMap) 1455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 1485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ( NdefMap->SendRecvBuf[*(NdefMap->SendRecvLength)- 1] == PH_FRINFC_DESF_NATIVE_GETVER_RESP) ) 1495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the state*/ 1515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_DESF_STATE_GET_SW_VERSION; 1525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Helper routine to wrap the native desfire commands*/ 1545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_DESF_ISO_NATIVE_WRAPPER(); 1555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE); 1565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 1585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 160794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 1615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_PARAMETER); 1625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 1645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 1655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HGetUIDDetails(phFriNfc_NdefMap_t *NdefMap) 1685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 1695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 1715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ( NdefMap->SendRecvBuf[*(NdefMap->SendRecvLength)- 1] == PH_FRINFC_DESF_NATIVE_GETVER_RESP) ) 1735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the state*/ 1755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_DESF_STATE_GET_UID; 1765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Helper routine to wrap the native desfire commands*/ 1785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_DESF_ISO_NATIVE_WRAPPER(); 1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE); 1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 185794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_PARAMETER); 1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 1925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HUpdateVersionDetails(const phFriNfc_NdefMap_t *NdefMap) 1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 195794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 1965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_PARAMETER); 1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ( NdefMap->SendRecvBuf[*(NdefMap->SendRecvLength)- 1] == 0xAF) ) 1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = NFCSTATUS_SUCCESS; 2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* We do not need the following details presently.Retained for future use*/ 2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly #if 0 2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->AddInfo.Type4Info.MajorVersion = NdefSmtCrdFmt->SendRecvBuf[3]; 2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->AddInfo.Type4Info.MinorVersion = NdefSmtCrdFmt->SendRecvBuf[4]; 2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( ( NdefMap->AddInfo.Type4Info.MajorVersion == 0x00 )&& 2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( NdefMap->AddInfo.Type4Info.MinorVersion == 0x06 )) 2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* card size of DESFire4 type */ 2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly //NdefMap->AddInfo.Type4Info.CardSize = 0xEDE; 2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly // need to handle the Desfire8 type cards 2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly // need to use get free memory 2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly #endif 2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Initiates Reading of NDEF information from the Desfire Card. 2295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function initiates the reading of NDEF information from a Remote Device. 2315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and starts the action (state machine). 232794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* A periodic call of the \ref phFriNfcNdefMap_Process has to be 2335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* done once the action has been triggered. 2345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_RdNdef( phFriNfc_NdefMap_t *NdefMap, 2375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *PacketData, 2385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t *PacketDataLength, 2395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Offset) 2405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 2415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 2425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize = *PacketDataLength; 2445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To return actual number of bytes read to the caller */ 2455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->NumOfBytesRead = PacketDataLength ; 2465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->NumOfBytesRead = 0; 2475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* store the offset in to map context*/ 2495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = Offset; 2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (Offset == PH_FRINFC_NDEFMAP_SEEK_CUR) && 2525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->DataCount == NdefMap->DesfireCapContainer.NdefDataLen)) 2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* No space on card for Reading : we have already 2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly reached the end of file ! 256794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Offset is set to Continue Operation */ 2575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 2585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 2595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 2615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 2625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* reset the inter flag*/ 2645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.IsNlenPresentFlag = 0; 2655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.SkipNlenBytesFlag = 0; 2665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the desfire read operation */ 2685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_READ_OP; 2695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Save the packet data buffer address in the context */ 2715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer = PacketData; 2725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_READ_OPE; 2745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 275794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 2765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Select smart tag operation. First step for the read operation. */ 277794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 == NdefMap->CardType) 278794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 279794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_SelectFile(NdefMap); 280794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 281794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 282794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 283794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 284794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_SelectSmartTag(NdefMap); 285794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 2865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 2875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 2895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 2905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 2925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Initiates Writing of NDEF information to the Remote Device. 2935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 2945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function initiates the writing of NDEF information to a Remote Device. 2955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* It performs a reset of the state and starts the action (state machine). 2965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* A periodic call of the \ref phFriNfcNdefMap_Process has to be done once the action 2975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* has been triggered. 2985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 2995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_WrNdef( phFriNfc_NdefMap_t *NdefMap, 3015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t *PacketData, 3025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t *PacketDataLength, 3035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t Offset) 3045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 3065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize = *PacketDataLength; 3085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->WrNdefPacketLength = PacketDataLength; 3095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Now, let's initialize *NdefMap->WrNdefPacketLength to zero. 3115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly In case we get an error, this will be correctly set to "no byte written". 3125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly In case there is no error, this will be updated later on, in the _process function. 3135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 3145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->WrNdefPacketLength = 0; 3155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* we have write access. */ 3175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( *NdefMap->DataCount >= PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE) 3185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* No space on card for writing : we have already 3205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly reached the end of file ! 321794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Offset is set to Continue Operation */ 3225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 3235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 3245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Adapt the nb of bytes that the user would like to write */ 3285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the defire write operation*/ 3305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_WRITE_OP; 3315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = PH_FRINFC_NDEFMAP_WRITE_OPE; 3325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Offset = Offset; 3335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Store the packet data buffer*/ 3355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffer = PacketData; 3365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 337794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 338794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 == NdefMap->CardType) 339794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 340794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_SelectFile(NdefMap); 341794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 342794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 343794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 344794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 345794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Select smart tag operation. First step for the write operation. */ 346794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_SelectSmartTag (NdefMap); 347794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 3485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 3505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 3535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Check whether a particular Remote Device is NDEF compliant. 3545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 3555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* The function checks whether the peer device is NDEF compliant. 3565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 3575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 3585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_ChkNdef( phFriNfc_NdefMap_t *NdefMap) 3605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 3645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 365794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 366794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Reset card type */ 367794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->CardType = 0; 368794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 3695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the desfire operation flag*/ 3705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP; 3715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Call Select Smart tag Functinality*/ 3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_SelectSmartTag(NdefMap); 3745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 3755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Need to get the version details of the card, to 3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly identify the the desfire4card type */ 3775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HGetHWVersion(NdefMap); 3785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 3795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (status); 3815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 3825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 3835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HChkAndParseTLV(phFriNfc_NdefMap_t *NdefMap, uint8_t BuffIndex) 3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 3855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 3865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 387794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if((NdefMap->SendRecvBuf[BuffIndex] <= 0x03) || 3885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[BuffIndex] >= 0x06) ) 3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 3915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 3925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 3935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 3945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 3955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check for the type of TLV*/ 396794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->TLVFoundFlag = 3975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((NdefMap->SendRecvBuf[BuffIndex] == 0x04)? 398794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_NDEF_CNTRL_TLV: 3995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_DESF_PROP_CNTRL_TLV); 4005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL( CID_FRI_NFC_NDEF_MAP, 4025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SUCCESS); 4035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HSetGet_NLEN(phFriNfc_NdefMap_t *NdefMap) 4085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 4115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP == NdefMap->DespOpFlag) 4135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Call Select Smart tag Functinality*/ 4165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_SelectSmartTag(NdefMap); 4175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 420794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 4215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Get the Data Count and set it to NoOfBytesWritten 4225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Update the NLEN using Transceive cmd*/ 4235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 424794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /*Form the packet for the update binary command*/ 425794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[0] = 0x00; 426794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[1] = 0xD6; 4275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* As we need to set the NLEN @ first 2 bytes of NDEF File*/ 4295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the p1/p2 offsets */ 4305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = 0x00; /* p1 */ 4315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = 0x00; /* p2 */ 4325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set only two bytes as NLEN*/ 4345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = 0x02; 4355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* update NLEN */ 4375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[5] = (uint8_t)(*NdefMap->DataCount >> PH_FRINFC_NDEFMAP_DESF_SHL8); 4385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[6] = (uint8_t)(*NdefMap->DataCount & (0x00ff)); 4395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = 0x07 ; 4415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Write */ 4435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_UPDATE_BIN_END; 4445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET); 4465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 4485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 4495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desfire_HProcReadData(phFriNfc_NdefMap_t *NdefMap) 4515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 4525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Result = NFCSTATUS_PENDING; 4535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t BufferSize = 0; 4545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t BufIndex=0; 4555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t SizeToCpy=0; 456794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Need to check the Actual Ndef Length before copying the data to buffer*/ 4585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Only NDEF data should be copied , rest all the data should be ignored*/ 4595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Ex : Ndef File Size 50 bytes , but only 5 bytes(NLEN) are relavent to NDEF data*/ 4605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* component should only copy 5 bytes to user buffer*/ 4615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Data has been read successfully in the TRX buffer. */ 4635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* copy it to the user buffer. */ 4645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* while copying need check the offset if its begin need to skip the first 2 bytes 4665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly while copying. If its current no need to skip the first 2 bytes*/ 4675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN ) 4695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BufIndex = (uint8_t)(( NdefMap->DesfireCapContainer.IsNlenPresentFlag == 1 )? 4715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 0:PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES); 4725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the latest NLEN to context*/ 4745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefDataLen = ((*NdefMap->DataCount == 0)? 4755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( (((uint16_t)NdefMap->SendRecvBuf[ 4765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_DESF_CCLEN_BYTE_FIRST_INDEX])<<8)+ \ 4775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_CCLEN_BYTE_SECOND_INDEX]): 4785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefDataLen); 4795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Decide how many byes to be copied into user buffer: depending upon the actual NDEF 481794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands size need to copy the content*/ 4825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (NdefMap->DesfireCapContainer.NdefDataLen) <= (*NdefMap->SendRecvLength - \ 4835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET + BufIndex))) 4845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly SizeToCpy = NdefMap->DesfireCapContainer.NdefDataLen; 4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 4875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 4885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 4895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly SizeToCpy = ((*NdefMap->SendRecvLength)-(PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET+BufIndex)); 4915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 492794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 4935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check do we have Ndef Data len > 0 present in the card.If No Ndef Data 4945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly present in the card , set the card state to Initalised and set an Error*/ 4955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->DesfireCapContainer.NdefDataLen == 0x00 ) 4965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 4975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INITIALIZED; 498794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_EOF_NDEF_CONTAINER_REACHED); 4995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 5005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 5015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 5025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 503794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Result); 5045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 507794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (void)memcpy( (&(NdefMap->ApduBuffer[ 5085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex])), 5095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (&(NdefMap->SendRecvBuf[BufIndex])), 5105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (SizeToCpy)); 5115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Increment the Number of Bytes Read, which will be returned to the caller. */ 513794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands *NdefMap->NumOfBytesRead = (uint32_t)(*NdefMap->NumOfBytesRead + SizeToCpy); 5145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*update the data count*/ 516794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands *NdefMap->DataCount = (uint16_t)(*NdefMap->DataCount + SizeToCpy); 5175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*update the buffer index of the apdu buffer*/ 519794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->ApduBuffIndex = (uint16_t)(NdefMap->ApduBuffIndex + SizeToCpy); 5205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 524794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (void)memcpy( (&(NdefMap->ApduBuffer[ 5255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex])), 5265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf),/* to avoid the length of the NDEF File*/ 5275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*(NdefMap->SendRecvLength)-(PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET))); 5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Increment the Number of Bytes Read, which will be returned to the caller. */ 5305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->NumOfBytesRead +=( *NdefMap->SendRecvLength - \ 5315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET)); 5325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*update the data count*/ 5345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount += \ 5355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (*NdefMap->SendRecvLength - (PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET)); 5365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*update the buffer index of the apdu buffer*/ 5385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex += \ 5395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->SendRecvLength - (PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET ); 5405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check whether we still have to read some more data. */ 5435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (*NdefMap->DataCount < NdefMap->DesfireCapContainer.NdefDataLen ) 544794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 5455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* we have some bytes to read. */ 5465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 5475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Now check, we still have bytes left in the user buffer. */ 548794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands BufferSize = NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex; 5495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(BufferSize != 0) 5505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Before read need to set the flag to intimate the module to 552794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands dont skip the first 2 bytes as we are in mode reading next 5535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly continues available bytes, which will not contain the NLEN 5545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly information in the begining part that is 2 bytes*/ 5555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.IsNlenPresentFlag = 1; 5565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read Operation is not complete */ 5575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = phFriNfc_Desfire_ReadBinary( NdefMap ); 5585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 5595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Result & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER) ) 5605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 5625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Result); 5635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 567794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* There are some more bytes to read, but 5685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly no space in the user buffer */ 5695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS); 5705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex =0; 5715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 572794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Result); 5735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (*NdefMap->DataCount == NdefMap->DesfireCapContainer.NdefDataLen ) 5785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* we have read all the bytes available in the card. */ 5805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_NFC_NONE,NFCSTATUS_SUCCESS); 5815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 5825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Do nothing */ 5835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 5845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 5855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifndef PH_HAL4_ENABLE */ 5865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 5875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 5895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The control should not come here. */ 5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* we have actually read more byte than available in the card. */ 5915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 5925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_HAL4_ENABLE 5935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 5945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_CMD_ABORTED); 5955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 5965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 5975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_FAILED); 5985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 5995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 603794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 6045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 605794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Result); 6065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 6085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 6125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief Completion Routine, Processing function, needed to avoid long blocking. 6135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \note The lower (Overlapped HAL) layer must register a pointer to this function as a Completion 6145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Routine in order to be able to notify the component that an I/O has finished and data are 6155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* ready to be processed. 6165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 6175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 6185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_Desfire_Process(void *Context, 6205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 6215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 6225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the context to Map Module*/ 6235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_NdefMap_t *NdefMap = (phFriNfc_NdefMap_t *)Context; 6245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t ErrFlag = 0; 6255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t NLength = 0, 6265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly SendRecLen=0; 6275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t BytesRead = 0; 628794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 6295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Sujatha P: Fix for 0000255/0000257:[gk] MAP:Handling HAL Errors */ 6315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Status == NFCSTATUS_SUCCESS ) 6325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch (NdefMap->State) 634794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 6355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 6375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 6385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_DESF_STATE_GET_HW_VERSION : 6405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check and store the h/w and s/w specific details. 6425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Ex: Major/Minor version, memory storage info. */ 6435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_HGetSWVersion(NdefMap); 6445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 6465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) 6475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 6495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 6505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_DESF_STATE_GET_SW_VERSION : 6555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check and store the h/w and s/w specific details. 6575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Ex: Major/Minor version, memory storage info. */ 6585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_HUpdateVersionDetails(NdefMap); 6605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Status == NFCSTATUS_SUCCESS ) 6615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_HGetUIDDetails(NdefMap); 6635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 6645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) 6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 670794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_DESF_STATE_GET_UID : 6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the desfire operation flag*/ 6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP; 6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Call Select Smart tag Functinality*/ 6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_SelectSmartTag(NdefMap); 6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 684794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 685794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG_EV1: 686794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 687794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if(( NdefMap->SendRecvBuf[(*(NdefMap->SendRecvLength) - 2)] == 688794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 689794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (NdefMap->SendRecvBuf[(*(NdefMap->SendRecvLength) - 1)] == 690794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 691794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 692e57ef4170474a0929b25bbdc8eb75f316ebffd56Jan Brands NdefMap->CardType = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1; 693794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 694794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = phFriNfc_Desfire_SelectFile(NdefMap); 6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 696794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* handle the error in Transc function*/ 697794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if ((Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) 698794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 699794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* call respective CR */ 700794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Status); 701794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 702794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 703794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 704794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 705794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->CardType = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD; 706794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* The card is not the new desfire, so send select smart tag command 707794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands of the old desfire */ 708794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = phFriNfc_Desfire_SelectSmartTag(NdefMap); 709794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 710794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 711794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 712794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands break; 713794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 714794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 715794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 716794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG: 717794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 718794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if(( NdefMap->SendRecvBuf[(*(NdefMap->SendRecvLength) - 2)] == 719794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 720794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (NdefMap->SendRecvBuf[(*(NdefMap->SendRecvLength) - 1)] == 721794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 722794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#else 723794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW1_INDEX] == 724794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 725794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW2_INDEX] == 726794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 727794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 7285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_SelectFile(NdefMap); 7305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 7325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) 7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Error " Smart Tag Functionality Not Supported"*/ 7415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 7425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SMART_TAG_FUNC_NOT_SUPPORTED); 743794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 744794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->CardType = 0; 745794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 7465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 7485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 7495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 7535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_FILE : 7555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW1_INDEX] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 7575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW2_INDEX] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 7585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*check for the which operation */ 760794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if( (NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_READ_OP) || 7615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP) || 7625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP )) 7635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call for read binary operation*/ 7655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_ReadBinary(NdefMap); 7665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 7685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER) ) 7695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 7715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 7725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*its a write Operation*/ 7755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if(NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_WRITE_OP ) 7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_UpdateBinary (NdefMap); 7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) 7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* unknown/invalid desfire operations*/ 7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*return Error " Select File Operation Failed"*/ 7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_STATE_READ_CAP_CONT: 8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NdefMap->SendRecvBuf[(*(NdefMap->SendRecvLength)-2)] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[(*(NdefMap->SendRecvLength)-1)] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read successful. */ 8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Update the smart tag capability container*/ 8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_Update_SmartTagCapContainer(NdefMap); 8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Status == NFCSTATUS_SUCCESS) 8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP; 817794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 818e57ef4170474a0929b25bbdc8eb75f316ebffd56Jan Brands if (PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 == NdefMap->CardType) 819794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 820794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = phFriNfc_Desfire_SelectFile(NdefMap); 821794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 822794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 823794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 824794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 825794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands Status = phFriNfc_Desfire_HSetGet_NLEN(NdefMap); 826794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* handle the error in Transc function*/ 8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) 8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*return Error " Capability Container Not Found"*/ 8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_STATE_READ_BIN: 8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check how many bytes have been read/returned from the card*/ 8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesRead = phFriNfc_Desfire_HGetLeBytes(NdefMap); 8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the send recev len*/ 8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly SendRecLen = *NdefMap->SendRecvLength - (PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET ); 8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (NdefMap->DesfireCapContainer.SkipNlenBytesFlag == 1) && ((BytesRead == 1) || (BytesRead == 2 ))) 8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesRead += PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES; /* to take care of first 2 len bytes*/ 8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Nothing to process*/ 8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ; 8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read More Number Of Bytes than Expected*/ 8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( ( BytesRead == SendRecLen ) && 871794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands ((NdefMap->SendRecvBuf[(*NdefMap->SendRecvLength-2)] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[(*NdefMap->SendRecvLength-1)] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE))) 8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* this is to check the card state in first Read Operation*/ 8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP ) 8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check the actual length of the ndef data : NLEN*/ 8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NLength = ( (((uint16_t)NdefMap->SendRecvBuf[0])<<PH_FRINFC_NDEFMAP_DESF_SHL8)+ \ 8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[1]); 8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (( NLength > PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE )|| 8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( NLength == 0xFFFF)) 8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag = 1; 8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Store the NLEN into the context */ 8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefDataLen = NLength; 8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_MapTool_SetCardState( NdefMap, 8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NLength); 8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( Status == NFCSTATUS_SUCCESS ) 8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the card type to Desfire*/ 898e57ef4170474a0929b25bbdc8eb75f316ebffd56Jan Brands#ifndef DESFIRE_EV1 8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardType = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD; 900794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the state to specify True for Ndef Compliant*/ 902794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_CHK_NDEF; 903794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the data count back to zero*/; 9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount = 0; 9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the apdu buffer index to zero*/ 9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the Operationg flag to Complete check NDEF Operation*/ 9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP; 9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* End ofNdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP*/ 9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else if ( NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_READ_OP ) 9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HProcReadData(NdefMap); 9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Invalid Desfire Operation */ 9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_REMOTE_DEVICE); 9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*handle the Error case*/ 9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_READ_FAILED); 9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag =1; 9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ErrFlag == 1) 9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount = 0; 9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the buffer index back to zero*/ 9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 944794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Status); 9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_STATE_UPDATE_BIN_BEGIN: 9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW1_INDEX] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW2_INDEX] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Write operation was successful. */ 9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* NdefMap->NumOfBytesWritten have been written on to the card. 9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Update the DataCount and the ApduBufferIndex */ 956794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands *NdefMap->DataCount = (uint16_t)(*NdefMap->DataCount + 957794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->NumOfBytesWritten); 958794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->ApduBuffIndex = (uint16_t)(NdefMap->ApduBuffIndex + 959794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->NumOfBytesWritten); 9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the user-provided buffer size to write */ 9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->WrNdefPacketLength += NdefMap->NumOfBytesWritten; 9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Call Upadte Binary function to check if some more bytes are to be written. */ 9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = phFriNfc_Desfire_UpdateBinary( NdefMap ); 9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*handle the Error case*/ 9705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 9715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_WRITE_FAILED); 9725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the buffer index back to zero*/ 9745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 977794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Status); 9785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 9795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 9805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_STATE_UPDATE_BIN_END : 9815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW1_INDEX] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW1_BYTE) && 9825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_SW2_INDEX] == PH_FRINFC_NDEFMAP_DESF_RAPDU_SW2_BYTE)) 9835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 9845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Updating NLEN operation was successful. */ 9855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Entire Write Operation is complete*/ 9865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the relevant parameters. */ 9875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_NFC_NONE,\ 9885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_SUCCESS); 9895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the state & Data len into context*/ 991794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->CardState = (uint8_t)((NdefMap->CardState == 992794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_NDEFMAP_CARD_STATE_INITIALIZED)? 993794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands PH_NDEFMAP_CARD_STATE_READ_WRITE : 994794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->CardState); 9955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 9965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefDataLen = (uint16_t)(*NdefMap->WrNdefPacketLength); 9975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 9985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Do nothing */ 9995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 10005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 10015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifndef PH_HAL4_ENABLE */ 1002794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 10035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 10055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 10075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*handle the Error case*/ 10085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 10095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_WRITE_FAILED); 10105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the buffer index back to zero*/ 10135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 1014794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 10155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 10165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HCrHandler(NdefMap,Status); 10175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1019794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default: 10205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*define the invalid state*/ 10215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP,\ 10225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_INVALID_DEVICE_REQUEST); 1023794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Status); 10245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 10255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 10285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 10295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 1030794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,Status); 10315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 10325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 10335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 10375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief this shall select the smart tag functinality of the Desfire card. 10385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 10395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Only when this command returns command completed it is a Smart Tag 10405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* compatible product. 10415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 10425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 10435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 10445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_SelectSmartTag(phFriNfc_NdefMap_t *NdefMap) 10455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 10465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 1048794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 1049794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint8_t card_type = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1; 1050794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 10515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*form the packet for Select smart tag command*/ 10535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[0] = 0x00; /* cls */ 10545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[1] = 0xa4; /* ins */ 10555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = 0x04; /* p1 */ 10565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = 0x00; /* p2 */ 10575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = 0x07; /* lc */ 10585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 10595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* next 7 bytes specify the DF Name*/ 10605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[5] = 0xd2; 10615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[6] = 0x76; 10625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[7] = 0x00; 10635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[8] = 0x00; 10645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[9] = 0x85; 10655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[10] = 0x01; 1066794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 1067794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 1068794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 1069794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands switch (NdefMap->DespOpFlag) 1070794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1071794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP: 1072794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1073794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* First select the smart tag using the new desfire EV1 and increment the 1074794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands "sel_index" and if it fails then try the old desfire select smart tag 1075794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands command */ 1076794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (0 == NdefMap->CardType) 1077794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1078794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* p2 1079794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[3] = DESFIRE_EV1_P2_OFFSET_VALUE; */ 1080794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[11] = 0x01; 1081794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Le */ 1082794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[12] = 0x00; 1083794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG_EV1; 1084794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands card_type = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1; 1085794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1086794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 1087794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1088794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[3] = 0x00; /* p2 */ 1089794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[11] = 0x00; 1090794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG; 1091794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands card_type = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD; 1092794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1093794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands break; 1094794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1095794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 1096794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands case PH_FRINFC_NDEFMAP_DESF_READ_OP: 1097794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 1098794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1099794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 == NdefMap->CardType) 1100794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1101794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[11] = 0x01; 1102794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[12] = 0x00; 1103794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->State = (uint8_t)PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG_EV1; 1104794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands card_type = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1; 1105794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1106794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 1107794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1108794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[11] = 0x00; 1109794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->State = (uint8_t)PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG; 1110794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands card_type = PH_FRINFC_NDEFMAP_ISO14443_4A_CARD; 1111794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1112794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands break; 1113794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1114794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1115794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 1116794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#else /* #ifdef DESFIRE_EV1 */ 1117794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 11185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[11] = 0x00; 11195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1120794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 1121794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 11225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the Send length*/ 11235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_NDEFMAP_DESF_CAPDU_SMARTTAG_PKT_SIZE; 1124794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 1125794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 1126794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 == card_type) 1127794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1128794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Send length is updated for the NEW DESFIRE EV1 */ 1129794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendLength = (uint16_t)(NdefMap->SendLength + 1); 1130794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 11315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1132794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#else 11335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Select Smart Tag */ 11345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_SMART_TAG; 1135794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 11365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET); 1138794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 11395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 11405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 11415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 11435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief this shall select/access the capability container of the Desfire 11445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* card. 11455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 1146794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* This shall be used to identify, if NDEF data structure do exist on 1147794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* the smart tag, we receive command completed status. 11485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 11495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 11505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 11515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_SelectFile (phFriNfc_NdefMap_t *NdefMap) 11525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 11535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 11555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check for the invalid/unknown desfire operations*/ 11575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ((NdefMap->DespOpFlag != PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP)&& \ 11585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DespOpFlag != PH_FRINFC_NDEFMAP_DESF_READ_OP)&&\ 11595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ( NdefMap->DespOpFlag != PH_FRINFC_NDEFMAP_DESF_WRITE_OP) && 1160794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands ( NdefMap->DespOpFlag != PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP)) 11615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, NFCSTATUS_INVALID_REMOTE_DEVICE); 11635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 11655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the command*/ 11685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly //NdefMap->Cmd.Iso144434Cmd = phHal_eIso14443_4_CmdListTClCmd; 11695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Form the packet for select file command either for the 11715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Check Ndef/Read/Write functionalities*/ 11725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[0] = 0x00; /* cls */ 11735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[1] = 0xa4; /* ins */ 11745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = 0x00; /* p1 */ 11755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = 0x00; /* p2 */ 11765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = 0x02; /* lc */ 11775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1178794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifdef DESFIRE_EV1 1179794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if (PH_FRINFC_NDEFMAP_ISO14443_4A_CARD_EV1 == NdefMap->CardType) 1180794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 1181794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[3] = DESFIRE_EV1_P2_OFFSET_VALUE; /* p2 */ 1182794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands } 1183794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#endif /* #ifdef DESFIRE_EV1 */ 1184794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 11855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP)) 11865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 11875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* cap container file identifier*/ 1189794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[5] = 0xe1; 11905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[6] = 0x03; 11915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Mantis entry 0394 fixed */ 1193794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else 11945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 11955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[5] = (uint8_t)((NdefMap->DesfireCapContainer.NdefMsgFid) >> PH_FRINFC_NDEFMAP_DESF_SHL8); 11965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[6] = (uint8_t)((NdefMap->DesfireCapContainer.NdefMsgFid) & (0x00ff)); 11975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 11985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Set the Send length*/ 11995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_NDEFMAP_DESF_CAPDU_SELECT_FILE_PKT_SIZE; 12005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Select File */ 12025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_SELECT_FILE; 12035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET); 12055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 12095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 12115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 12135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief this shall read the data from Desfire card. 1214794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* 12155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This is used in two cases namely Reading the Capability container 1216794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* data( le == 0 ) and reading the file data.Maximum bytes to be read during 12175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* a single read binary is known after the reading the data from the capability 12185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* conatainer. 12195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 12205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 12215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 12225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_ReadBinary(phFriNfc_NdefMap_t *NdefMap) 12235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 12245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_PENDING; 12255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint32_t BytesToRead = 0; 12265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t BufIndex=0,OperFlag=0; 12275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t DataCnt=0; 12285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* to read the capability container data*/ 12305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP ) 12315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*specifies capability container shall be read*/ 12335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[0] = 0x00; 12345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[1] = 0xb0; 1235794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[2] = 0x00; /* p1 */ 12365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = 0x00; /* p2 */ 12375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = 0x0F; /* le */ 12385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_NDEFMAP_DESF_CAPDU_READ_BIN_PKT_SIZE; 12405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Cap Container Read */ 12425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_READ_CAP_CONT; 12435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the send receive buffer length*/ 12455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly OperFlag = 1; 12465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*desfire file read operation*/ 12485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 12495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1250794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[0] = 0x00; 12515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[1] = 0xb0; 12525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*TBD the NLEN bytes*/ 1254794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if( *NdefMap->DataCount == 0 ) 12555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* first read */ 12575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the offset p1 and p2*/ 12585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = 0; 12595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = 0; 12605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 12625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* as the p1 of the 8bit is 0, p1 and p2 are used to store the 12645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ofset value*/ 1265794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands DataCnt = *NdefMap->DataCount; 12665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DataCnt += PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES; 12675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = (uint8_t)((DataCnt)>> PH_FRINFC_NDEFMAP_DESF_SHL8); 12685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = (uint8_t)((DataCnt)& (0x00ff)); 12695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* calculate the Le Byte*/ 12715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesToRead = phFriNfc_Desfire_HGetLeBytes(NdefMap); 12725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN ) 12745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* BufIndex represents the 2 NLEN bytes and decides about the presence of 12765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 2 bytes NLEN data*/ 12775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BufIndex = (uint8_t)(( NdefMap->DesfireCapContainer.SkipNlenBytesFlag == 1 ) ? 12795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES:0); 12805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ((BytesToRead == 1) || (BytesToRead == 2)) && (NdefMap->DesfireCapContainer.SkipNlenBytesFlag == 1)) 12825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 12835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesToRead += BufIndex; 12845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the Le byte*/ 12885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* This following code is true for get nlen and current offset set*/ 12895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4]=(uint8_t) BytesToRead ; 12905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Read */ 12925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_READ_BIN; 12935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the send length*/ 12955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = PH_FRINFC_NDEFMAP_DESF_CAPDU_READ_BIN_PKT_SIZE; 12965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly OperFlag = 2; 12975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 12985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 12995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if (OperFlag == 1 ) 13005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1301794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_MAX_SEND_RECV_BUF_SIZE); 13025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1305794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_HSendTransCmd(NdefMap,(uint8_t)(BytesToRead +PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET)); 13065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (status); 13085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 13095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 13115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief this shall write the data to Desfire card. 1312794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* Maximum bytes to be written during a single update binary 13135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* is known after the reading the data from the capability 13145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* conatainer. 1315794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* 13165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* le filed specifes , how many bytes of data to be written to the 13175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Card. 13185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 13195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 13205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 1321794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan BrandsNFCSTATUS phFriNfc_Desfire_UpdateBinary(phFriNfc_NdefMap_t *NdefMap) 13225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 13235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1324794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NFCSTATUS status = NFCSTATUS_PENDING; 13255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t noOfBytesToWrite = 0, DataCnt=0, 13265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index=0; 13275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Do we have space in the file to write? */ 13295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (*NdefMap->DataCount < PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE) && 13305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize)) 13315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Yes, we have some bytes to write */ 1333794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* Check and set the card memory size , if user sent bytes are more than the 13345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly card memory size*/ 13355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >\ 13365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint16_t)(PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE - *NdefMap->DataCount)) 13375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBufferSize =( (PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE) - (*NdefMap->DataCount + NdefMap->ApduBuffIndex)); 13395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Now, we have space in the card to write the data, */ 1342794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /*Form the packet for the update binary command*/ 1343794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[0] = 0x00; 1344794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->SendRecvBuf[1] = 0xD6; 13455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1346794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands if( *NdefMap->DataCount == 0) 13475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the p1/p2 offsets */ 13495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = 0x00; /* p1 */ 13505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = 0x00; /* p2 */ 13515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.SkipNlenBytesFlag = 0; 13525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* as the p1 of the 8bit is 0, p1 and p2 are used to store the 13565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ofset value*/ 1357794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* This sets card offset in a card for a write operation. + 2 is 13585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly added as first 2 offsets represents the size of the NDEF Len present 13595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly in the file*/ 13605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1361794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands DataCnt = *NdefMap->DataCount; 13625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly DataCnt += PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES; 13635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[2] = (uint8_t)((DataCnt)>> PH_FRINFC_NDEFMAP_DESF_SHL8); 13645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[3] = (uint8_t)((DataCnt)& (0x00ff)); 13655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* No need to attach 2 NLEN bytes at the begining. 13665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly as we have already attached in the first write operation.*/ 13675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.SkipNlenBytesFlag = 1; 13685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Calculate the bytes to write */ 13725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= (uint32_t)( NdefMap->DesfireCapContainer.MaxCmdSize )) 13735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly noOfBytesToWrite = ( ( NdefMap->DesfireCapContainer.SkipNlenBytesFlag == 1) ? 13765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxCmdSize : 13775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.MaxCmdSize - PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES)); 13785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read only till the available buffer space */ 13825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly noOfBytesToWrite = (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex); 13835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 13855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN ) 13865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->DesfireCapContainer.SkipNlenBytesFlag == 1 ) 13885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index = 5; 13905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To Specify the NDEF data len written : updated at the of write cycle*/ 13915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = (uint8_t)noOfBytesToWrite; 13925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 13935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 13945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 13955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Leave space to update NLEN */ 13965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[5] = 0x00; 13975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[6] = 0x00; 13985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly index =7; 13995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* To Specify the NDEF data len written : updated at the of write cycle*/ 14005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = (uint8_t)noOfBytesToWrite + PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES; 14015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* copy the data to SendRecvBuf from the apdu buffer*/ 14045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy( &NdefMap->SendRecvBuf[index], 14055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->ApduBuffer[NdefMap->ApduBuffIndex], 14065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly noOfBytesToWrite); 14075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = (noOfBytesToWrite + index); 14085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 14105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[4] = (uint8_t)noOfBytesToWrite; 14125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* copy the data to SendRecvBuf from the apdu buffer*/ 14145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (void)memcpy( &NdefMap->SendRecvBuf[5], 14155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->ApduBuffer[NdefMap->ApduBuffIndex], 14165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly noOfBytesToWrite); 14175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength = (noOfBytesToWrite + 5); 14185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Store the number of bytes being written in the context structure, so that 14215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly the parameters can be updated, after a successful write operation. */ 14225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->NumOfBytesWritten = noOfBytesToWrite; 14235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Change the state to Write */ 14255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_DESF_STATE_UPDATE_BIN_BEGIN; 14265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1427794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands status = phFriNfc_Desfire_HSendTransCmd(NdefMap,PH_FRINFC_NDEFMAP_DESF_RESP_OFFSET); 14285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } /* if(NdefMap->ApduBuffIndex < NdefMap->ApduBufferSize) */ 14305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 14315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (*NdefMap->DataCount == PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE) || 14335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->ApduBuffIndex == NdefMap->ApduBufferSize)) 14345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1435794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* The NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_SET_LEN_OP is not 14365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly required, because the DespOpFlag shall be WRITE_OP 14375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly */ 14385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Update the NLEN Bytes*/ 14395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 14405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Do nothing */ 14415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 14425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DespOpFlag = PH_FRINFC_NDEFMAP_DESF_SET_LEN_OP; 14435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 14445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desfire_HSetGet_NLEN(NdefMap); 14455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 14475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* The control should not come here. 14495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly wrong internal calculation. 14505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly we have actually written more than the space available 14515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly in the card ! */ 14525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifndef PH_HAL4_ENABLE 14535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 14545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_CMD_ABORTED); 14555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 14565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 14575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_FAILED); 14585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 14595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Reset the relevant parameters. */ 14605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->ApduBuffIndex = 0; 14615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->PrevOperation = 0; 14625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* call respective CR */ 1464794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands phFriNfc_Desfire_HCrHandler(NdefMap,status); 14655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* if(*NdefMap->DataCount < PH_NFCFRI_NDEFMAP_DESF_NDEF_FILE_SIZE) */ 14695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return status; 14715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 14725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desfire_HChkNDEFFileAccessRights(phFriNfc_NdefMap_t *NdefMap) 14755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 14765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (NdefMap->DesfireCapContainer.ReadAccess == 0x00) && 14775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.WriteAccess == 0x00 )) 14785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the card state to Read/write State*/ 1480794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* This state can be either INITIALISED or READWRITE. but default 14815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly is INITIALISED */ 14825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_WRITE; 14835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 1485794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands else if((NdefMap->DesfireCapContainer.ReadAccess == 0x00) && 14865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.WriteAccess == 0xFF )) 14875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the card state to Read Only State*/ 14895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_READ_ONLY; 14905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 14925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 14935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Set the card state to invalid State*/ 14945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CardState = PH_NDEFMAP_CARD_STATE_INVALID; 14955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 14965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 14975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 14985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 14995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief this shall update the Desfire capability container structure. 1500794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* 15015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This function shall store version,maximum Ndef data structure size, 1502794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* Read Access permissions, Write Access permissions , Maximum data size 1503794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* that can be sent using a single Update Binary, maximum data size that 15045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* can be read from the Desfire using a singlr read binary. 1505794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands* These vaues shall be stored and used during the read/update binary 15065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* operations. 15075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 15085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 15095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic 1510794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan BrandsNFCSTATUS phFriNfc_Desfire_Update_SmartTagCapContainer(phFriNfc_NdefMap_t *NdefMap) 15115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 15125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t CapContSize = 0, 15135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* this is initalised 2 because CCLEN includes the field size bytes i.e 2bytes*/ 15145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen= 0; 15155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint8_t ErrFlag = 0; 15165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status= NFCSTATUS_SUCCESS; 15185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Check the Size of Cap Container */ 15205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CapContSize = ( (((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_CCLEN_BYTE_FIRST_INDEX])<<8)+ \ 15215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_CCLEN_BYTE_SECOND_INDEX]); 15225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen += 2; 15245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (CapContSize < 0x0f) || (CapContSize == 0xffff)) 15265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag =1; 15285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 15305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Version : Smart Tag Spec version */ 15325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check for the validity of Major and Minor Version numbers*/ 15335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_MapTool_ChkSpcVer ( NdefMap, 15345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly PH_FRINFC_NDEFMAP_DESF_VER_INDEX); 15355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( status != NFCSTATUS_SUCCESS ) 15365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag =1; 15385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 15405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen += 1; 15425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1543794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /*Get Response APDU data size 1544794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands to check the integration s/w response size*/ 15455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 15465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1547794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint16_t max_rsp_size = 15485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLE_BYTE_FIRST_INDEX]) << 8)\ 15495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly + NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLE_BYTE_SECOND_INDEX]); 15505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxRespSize = 1551794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands ((max_rsp_size > PHHAL_MAX_DATASIZE)? 15525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PHHAL_MAX_DATASIZE) : max_rsp_size); 15535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 15555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxRespSize = 15565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLE_BYTE_FIRST_INDEX]) << 8)\ 15575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly +NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLE_BYTE_SECOND_INDEX]); 15585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 15595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1560794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /*Get Command APDU data size*/ 15615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE 15625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1563794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands uint16_t max_cmd_size = 15645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLC_BYTE_FIRST_INDEX])<<8)\ 15655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly + NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLC_BYTE_SECOND_INDEX]); 15665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1567794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->DesfireCapContainer.MaxCmdSize = 1568794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands ((max_cmd_size > PHHAL_MAX_DATASIZE)? 15695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (PHHAL_MAX_DATASIZE): max_cmd_size); 15705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 1572794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->DesfireCapContainer.MaxCmdSize = 15735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLC_BYTE_FIRST_INDEX])<<8)\ 15745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly +NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_MLC_BYTE_SECOND_INDEX]); 15755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */ 15765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check for the Validity of Cmd & Resp Size*/ 15775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check the Validity of the Cmd Size*/ 15785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( (NdefMap->DesfireCapContainer.MaxRespSize < 0x0f) || 1579794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands ( NdefMap->DesfireCapContainer.MaxCmdSize == 0x00)) 15805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag=1; 15825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 15845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 15855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen += 4; 15875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check and Parse the TLV structure */ 15895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* In future this chk can be extended to Propritery TLV */ 15905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly //status = phFriNfc_ChkAndParseTLV(NdefMap); 15915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_Desf_HChkAndParseTLV(NdefMap,PH_FRINFC_NDEFMAP_DESF_TLV_INDEX); 15925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (status == NFCSTATUS_SUCCESS) && (NdefMap->TLVFoundFlag == PH_FRINFC_NDEFMAP_DESF_NDEF_CNTRL_TLV)) 15935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 15945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen += 1; 15955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 15965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check the TLV length*/ 15975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_TLV_LEN_INDEX]) > 0x00 ) && 15985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_TLV_LEN_INDEX]) <= 0xFE )&& 15995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (( NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_TLV_LEN_INDEX]) == 0x06 )) 16005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen +=1; 16025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* store the contents in to the container structure*/ 16035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.NdefMsgFid = ( (((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_NDEF_FILEID_BYTE_FIRST_INDEX])<<PH_FRINFC_NDEFMAP_DESF_SHL8)+ \ 16045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_NDEF_FILEID_BYTE_SECOND_INDEX]); 16055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen +=2; 16075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Invalid Msg File Id : User Can't Have read/write Opeartion*/ 16095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( (NdefMap->DesfireCapContainer.NdefMsgFid == 0xFFFF) || 16105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.NdefMsgFid == 0xE102) || 16115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.NdefMsgFid == 0xE103) || 16125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.NdefMsgFid == 0x3F00) || 16135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (NdefMap->DesfireCapContainer.NdefMsgFid == 0x3FFF ) ) 16145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag=1; 16175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 1619794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands { 16205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Get Ndef Size*/ 1621794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->DesfireCapContainer.NdefFileSize = 16225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ((((uint16_t)NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_NDEF_FILESZ_BYTE_FIRST_INDEX])<<8) 16235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly | (NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_NDEF_FILESZ_BYTE_SECOND_INDEX] & 0x00ff)); 16245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Check Ndef Size*/ 16275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TBD : Do we need to minus 2 bytes of size it self?*/ 16285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( ((NdefMap->DesfireCapContainer.NdefFileSize -2) <= 0x0004 ) || 1629794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands ((NdefMap->DesfireCapContainer.NdefFileSize -2) == 0xFFFD ) ) 16305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag=1; 16325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 16345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen +=2; 16365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Ndef File Read Access*/ 16385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.ReadAccess = NdefMap->\ 16395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_NDEF_FILERD_ACCESS_INDEX] ; 16405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Ndef File Write Access*/ 16425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.WriteAccess = NdefMap->SendRecvBuf[PH_FRINFC_NDEFMAP_DESF_NDEF_FILEWR_ACCESS_INDEX]; 16435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLen +=2; 16455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly phFriNfc_Desfire_HChkNDEFFileAccessRights(NdefMap); 16475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 16515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* TLV Lenth is of two byte value 16545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly TBD: As the length of TLV is fixed for 6 bytes. We need not 16555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly handle the 2 byte value*/ 16565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 16615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->TLVFoundFlag == PH_FRINFC_NDEFMAP_DESF_PROP_CNTRL_TLV ) 16635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*TBD: To Handle The Proprietery TLV*/ 16655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 16675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Invalid T found case*/ 16695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag =1; 16705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* check for the entire LENGTH Validity 16735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CCLEN + TLV L value == CCLEN*/ 167421e3ef10d17f32291873006bdec560dea8b6f9bbSunil Jogi if ( CapContSize < CCLen ) 16755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly ErrFlag=1; 16775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* if NdefMap->DesfireCapContainer.MaxRespSize < 0x0f */ 16805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* Chkeck Map Version*/ 16815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly }/* CC size invalid*/ 16825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if( ErrFlag == 1 ) 16835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = PHNFCSTVAL(CID_FRI_NFC_NDEF_MAP, 16855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS_NO_NDEF_SUPPORT); 16865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 16875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return ( status ); 16885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 16895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic uint32_t phFriNfc_Desfire_HGetLeBytes(phFriNfc_NdefMap_t *NdefMap) 16915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 16925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*Represents the LE byte*/ 16935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly uint16_t BytesToRead =0; 16945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 16955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if ( NdefMap->DespOpFlag == PH_FRINFC_NDEFMAP_DESF_GET_LEN_OP ) 16965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 16975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesToRead = PH_FRINFC_NDEFMAP_DESF_NLEN_SIZE_IN_BYTES; 16985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.SkipNlenBytesFlag =0; 16995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 17015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Calculate Le bytes : No of bytes to read*/ 17045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Check for User Apdu Buffer Size and Msg Size of Desfire Capability container */ 17055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if((NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex) >= NdefMap->DesfireCapContainer.MaxRespSize) 17065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* We have enough buffer space to read the whole capability container 17085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly size bytes 17095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Now, check do we have NdefMap->DesfireCapContainer.MaxRespSize to read ? */ 17105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1711794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands BytesToRead = (((NdefMap->DesfireCapContainer.NdefDataLen - *NdefMap->DataCount) >= 17125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxRespSize) ? 17135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->DesfireCapContainer.MaxRespSize : 1714794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands (NdefMap->DesfireCapContainer.NdefDataLen - 17155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->DataCount)); 17165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly else 17185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* Read only till the available buffer space */ 17205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesToRead = (uint16_t)(NdefMap->ApduBufferSize - NdefMap->ApduBuffIndex); 17215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly if(BytesToRead >= (uint16_t)(NdefMap->DesfireCapContainer.NdefDataLen - *NdefMap->DataCount)) 17225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 17235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly BytesToRead = (NdefMap->DesfireCapContainer.NdefDataLen - *NdefMap->DataCount); 17245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1727794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands NdefMap->DesfireCapContainer.SkipNlenBytesFlag = 17285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly (uint8_t)(((NdefMap->Offset == PH_FRINFC_NDEFMAP_SEEK_BEGIN )&&( *NdefMap->DataCount == 0 )) ? 17295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1 : 0); 17305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (BytesToRead); 17335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 17345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*! 17385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief this shall notify the integration software with respective 17395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* success/error status along with the completion routines. 17405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 17415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* This routine is called from the desfire process function. 17425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* 17435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/ 17445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desfire_HCrHandler( phFriNfc_NdefMap_t *NdefMap, 17465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS Status) 17475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 17485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the state back to the Reset_Init state*/ 17495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->State = PH_FRINFC_NDEFMAP_STATE_RESET_INIT; 17505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly switch(NdefMap->DespOpFlag) 17525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly { 1753794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /* check which routine has the problem and set the CR*/ 17545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_NDEF_CHK_OP : 17555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the completion routine*/ 17565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_CHK_NDEF].\ 17575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CompletionRoutine(NdefMap->CompletionRoutine->Context,\ 17585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status); 17595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 17605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_READ_OP : 17625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the completion routine*/ 17635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_RD_NDEF].\ 17645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CompletionRoutine(NdefMap->CompletionRoutine->Context,\ 17655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status); 17665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 17675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly case PH_FRINFC_NDEFMAP_DESF_WRITE_OP : 17695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the completion routine*/ 17705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_WR_NDEF].\ 17715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CompletionRoutine(NdefMap->CompletionRoutine->Context,\ 17725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status); 17735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 17745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1775794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands default : 17765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the completion routine*/ 17775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->CompletionRoutine[PH_FRINFC_NDEFMAP_CR_INVALID_OPE].\ 17785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly CompletionRoutine(NdefMap->CompletionRoutine->Context,\ 17795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly Status); 17805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly break; 17815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly } 17835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 17845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desfire_HSendTransCmd(phFriNfc_NdefMap_t *NdefMap,uint8_t SendRecvLen) 17865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{ 17875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NFCSTATUS status = NFCSTATUS_SUCCESS; 17895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 17905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the command type*/ 1791794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands#ifndef PH_HAL4_ENABLE 17925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.Iso144434Cmd = phHal_eIso14443_4_CmdListTClCmd; 17935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else 17945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd.Iso144434Cmd = phHal_eIso14443_4_Raw; 17955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 1796794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands 17975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the Additional Info*/ 17985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.DepFlags.MetaChaining = 0; 17995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psDepAdditionalInfo.DepFlags.NADPresent = 0; 18005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /*set the completion routines for the desfire card operations*/ 18025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.CompletionRoutine = phFriNfc_Desfire_Process; 18035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->MapCompletionInfo.Context = NdefMap; 18045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly /* set the receive length */ 18065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly *NdefMap->SendRecvLength = ((uint16_t)(SendRecvLen)); 18075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 1809794aa72f7bd1e5b1fb51efb957cb925c7cfed746Jan Brands /*Call the Overlapped HAL Transceive function */ 18105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly status = phFriNfc_OvrHal_Transceive(NdefMap->LowerDevice, 18115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->MapCompletionInfo, 18125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->psRemoteDevInfo, 18135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->Cmd, 18145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly &NdefMap->psDepAdditionalInfo, 18155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf, 18165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendLength, 18175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvBuf, 18185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly NdefMap->SendRecvLength); 18195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly return (status); 18215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly} 18245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef UNIT_TEST 18275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phUnitTestNfc_Desfire_static.c> 18285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif 18295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly 18305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* PH_FRINFC_MAP_DESFIRE_DISABLED */ 1831