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