15d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*
23d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * Copyright (C) 2010 NXP Semiconductors
33d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen *
43d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * Licensed under the Apache License, Version 2.0 (the "License");
53d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * you may not use this file except in compliance with the License.
63d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * You may obtain a copy of the License at
73d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen *
83d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen *      http://www.apache.org/licenses/LICENSE-2.0
93d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen *
103d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * Unless required by applicable law or agreed to in writing, software
113d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * distributed under the License is distributed on an "AS IS" BASIS,
123d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
133d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * See the License for the specific language governing permissions and
143d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen * limitations under the License.
153d254b6b7034191c1134c4aa0ea66e3749a3af69Martijn Coenen */
165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*!
185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \file  phFriNfc_DesfireFormat.c
195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* \brief This component encapsulates different format functinalities ,
205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*        for the Type4/Desfire card.
215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*
225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly* Project: NFC-FRI
235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*
2480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen* $Date: Thu Oct 28 17:44:00 2010 $
25eff5a3da9704a7d49f0990152c84c172630da679Jan Brands* $Author: ing02260 $
2680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen* $Revision: 1.8 $
27eff5a3da9704a7d49f0990152c84c172630da679Jan Brands* $Aliases:  $
285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*
295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly*/
305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phNfcTypes.h>
315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_OvrHal.h>
325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_SmtCrdFmt.h>
335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#include <phFriNfc_DesfireFormat.h>
345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Following section details, how to wrap the native DESFire commands in to ISO commands
375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyFollowing are different native commands are wrapped under the ISO commands :
385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly1. Crate Application
395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly2. Select File
405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly3. Get version
415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly4. Create CC/NDEF File
425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly5. Write data to STD File
435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyIn this File above commands are sent using the ISO Wrapper.
445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyWrapping the native DESFire APDU's procedure
465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly--------------------------------------------------------------------------------
475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyCLA         INS     P1      P2      Lc          Data            Le
485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly0x90        Cmd     0x00    0x00    Data Len    Cmd. Par's      0x00
495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly-----------------------------------------------------------------------------------*/
505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
51eff5a3da9704a7d49f0990152c84c172630da679Jan Brands/****************************** Macro definitions start ********************************/
52eff5a3da9704a7d49f0990152c84c172630da679Jan Brands/* This settings can be changed, depending on the requirement*/
53eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define  PH_FRINFC_DESF_PICC_NFC_KEY_SETTING                0x0FU
54eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
5580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF
5680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
5780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    #define READ_ONLY_NDEF_DESFIRE                          0xFFU
5880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    #define CC_BYTES_SIZE                                   0x0FU
5980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    #define PH_FRINFC_DESF_READ_DATA_CMD                    0xBDU
6080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    #define NATIVE_WRAPPER_READ_DATA_LC_VALUE               0x07U
6180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
6280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */
6380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
64eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
65eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
66eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_CARD_TYPE_EV1                               0x01U
67eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
68eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_MAPPING_VERSION                         0x20U
69eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
70eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_HW_MAJOR_VERSION                        0x01U
71eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_HW_MINOR_VERSION                        0x00U
72eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_SW_MAJOR_VERSION                        0x01U
73eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_SW_MINOR_VERSION                        0x03U
74eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
75eff5a3da9704a7d49f0990152c84c172630da679Jan Brands/* The below values are received for the command GET VERSION */
76eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_TAG_SIZE_IDENTIFIER_2K                      0x16U
77eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_TAG_SIZE_IDENTIFIER_4K                      0x18U
78eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_TAG_SIZE_IDENTIFIER_8K                      0x1AU
79eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
80eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_2K_CARD                                     2048U
81eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_4K_CARD                                     4096U
82eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_8K_CARD                                     7680U
83eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
8480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#define DESFIRE_EV1_KEY_SETTINGS_2                          0x21U
85eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
86eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_FIRST_AID_BYTE                          0x01U
87eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_SECOND_AID_BYTE                         0x00U
88eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_THIRD_AID_BYTE                          0x00U
89eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
90eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_FIRST_ISO_FILE_ID                       0x05U
91eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_SECOND_ISO_FILE_ID                      0xE1U
92eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
93eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_ISO_APP_DF_NAME                         {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01}
94eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
95eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_CC_FILE_ID                              0x01U
96eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_FIRST_CC_FILE_ID_BYTE                   0x03U
97eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_SECOND_CC_FILE_ID_BYTE                  0xE1U
98eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
99eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_NDEF_FILE_ID                            0x02U
100eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_FIRST_NDEF_FILE_ID_BYTE                 0x04U
101eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define DESFIRE_EV1_SECOND_NDEF_FILE_ID_BYTE                0xE1U
102eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
103eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
104eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#define PH_FRINFC_DESF_STATE_REACTIVATE                     0x0FU
105eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
106eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
107eff5a3da9704a7d49f0990152c84c172630da679Jan Brands/****************************** Macro definitions end ********************************/
1085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Helper functions to create app/select app/create data file/read /write from the
1095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyCC file and NDEF files */
1105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt,uint8_t CmdType);
1115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Gets H/W version details*/
1135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Gets S/W version details*/
1165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
1175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Updates the version details to context structure*/
1195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
1205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Gets UID details*/
1225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt);
1235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Creates Application*/
1255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Selects Application*/
1285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/*Creates Capability Container File*/
1315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Create NDEF File*/
1345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Writes CC Bytes to CC File*/
1375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Writes NDEF data into NDEF File*/
1405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly/* Transceive Cmd initiation*/
1435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
1445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF
14680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
14780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#if 0
14880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
14980ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
15080ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlySelectCCFile (
15180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
15280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #if 0 */
15380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
15480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
15580ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
15680ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlyReadCCFile (
15780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
15880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
15980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
16080ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
16180ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlyWriteCCFile (
16280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
16380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
16480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
16580ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
16680ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlySelectApp (
16780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
16880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
16980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
17080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
17180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
17280ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
17380ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlySelectAppEV1 (
17480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
17580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
17680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
17780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
17880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */
1795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_Desfire_Reset( phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
1815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
1825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* This piece of code may not be useful for the current supported DESFire formatting feature*/
1835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Currently, s/w doesn't support authenticating either PICC Master key nor NFC Forum
1845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    Application Master key*/
1855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey[] = PH_FRINFC_SMTCRDFMT_DESF_PICC_MASTER_KEY;
1875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey[]  = PH_FRINFC_SMTCRDFMT_DESF_NFCFORUM_APP_KEY;*/
1885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* reset to zero PICC and NFC FORUM master keys*/
1905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey,
191eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                0x00,
192eff5a3da9704a7d49f0990152c84c172630da679Jan Brands								16);
1935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey,
195eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                0x00,
196eff5a3da9704a7d49f0990152c84c172630da679Jan Brands								16);
1975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->AddInfo.Type4Info.PrevState = 0;
1985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
2005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt,uint8_t CmdType)
2035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
2045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint16_t i=0, CmdByte=1;
2065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t NdefFileBytes[] = PH_FRINFC_DESF_NDEFFILE_BYTES;
2075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t CCFileBytes[]  = PH_FRINFC_DESF_CCFILE_BYTES;
2085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* common elements for all the native commands*/
2115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Class Byte */
2135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;
2145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* let the place to store the cmd byte type, point to next index*/
2165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    i += 2;
2175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* P1/P2 offsets always set to zero */
2205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;
2215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    i++;
2225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;
2235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    i++;
2245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
2255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    switch(CmdType)
2265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
227eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_GET_HW_VERSION_CMD :
228eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_GET_SW_VERSION_CMD :
229eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_GET_UID_CMD :
230eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
231eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (CmdType == PH_FRINFC_DESF_GET_HW_VERSION_CMD )
232eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
233eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Instruction Cmd code */
234eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_GET_VER_CMD;
235eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
236eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
237eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
238eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Instruction Cmd code */
239eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP;
240eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
241eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
242eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /*  Lc: Length of wrapped data */
243eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
244eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
245eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
246eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* NO Data to send in this cmd*/
247eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* we are not suppose to set Le*/
248eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the length of the buffer*/
249eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendLength = i;
2505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
251eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
252eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
2535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
254eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_CREATEAPP_CMD:
2555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
256eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
257eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            uint8_t             df_name[] = DESFIRE_EV1_ISO_APP_DF_NAME;
258eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
259eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
2605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Instruction Cmd code */
261eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_AID_CMD;
262eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
263eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
264eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
265eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
266eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  Lc: Length of wrapped data,
267eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    here the magic number 2 is for the ISO File ID for the application */
268eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = (uint8_t)(PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN +
269eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                                sizeof (df_name) + 2);
270eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
271eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* NFC FORUM APPLICATION ID*/
272eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_AID_BYTE;
273eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
274eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_AID_BYTE;
275eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
276eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_THIRD_AID_BYTE;
277eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
278eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
279eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
280eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
281eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
282eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  Lc: Length of wrapped data */
283eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN;
284eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
285eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* NFC FORUM APPLICATION ID*/
286eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE;
287eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
288eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE;
289eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
290eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE;
291eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
292eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
293eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set key settings and number of keys*/
294eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_PICC_NFC_KEY_SETTING;
295eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
296eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
297eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
298eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
299eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set key settings and number of keys*/
300eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_KEY_SETTINGS_2;
301eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
302eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
303eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
304eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
305eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
306eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NFCFORUM_APP_NO_OF_KEYS;
307eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
308eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
309eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
310eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
311eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
312eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
313eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* ISO File ID */
314eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_ISO_FILE_ID;
315eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
316eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_ISO_FILE_ID;
317eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
318eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* DF file name */
319eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                (void)memcpy ((void *)&NdefSmtCrdFmt->SendRecvBuf[i],
320eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                (void *)df_name, sizeof (df_name));
321eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i = (uint16_t)(i + sizeof (df_name));
322eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
323eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
324eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
325eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Le bytes*/
326eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
327eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
328eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
329eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
330eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
331eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
332eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the length of the buffer*/
333eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = i;
334eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
335eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
336eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
337eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
338eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATEAPP_CMD_SNLEN;
339eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
340eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
3415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
342eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
343eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_SELECTAPP_CMD:
3445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
3455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* Instruction Cmd code */
346eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_SLECT_APP_CMD;
3475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
348eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /*  Lc: Length of wrapped data */
349eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_SLAPP_WRDT_LEN;
350eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
3515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
352eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
353eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
354eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
355eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Data*/
356eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the send buffer to create the application identifier*/
357eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_AID_BYTE;
358eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
3595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
360eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_AID_BYTE;
361eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
3625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
363eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_THIRD_AID_BYTE;
364eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
365eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
366eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
367eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
368eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
369eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Data*/
370eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the send buffer to create the application identifier*/
371eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE;
372eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
3735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
374eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE;
375eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
3765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
377eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE;
378eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
379eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
3805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
381eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Le bytes*/
382eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
383eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
3845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
385eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the length of the buffer*/
386eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_SELECTAPP_CMD_SNLEN;
387eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
388eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
3895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
390eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_CREATECC_CMD:
391eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
392eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Instruction Cmd code */
393eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD;
394eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
395eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
396eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
397eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
398eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  Lc: Length of wrapped data,
399eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                here the magic number 2 is added as part of the ISO File ID in the packet */
400eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = (uint8_t)
401eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                    (PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN + 2);
402eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
403eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  set cc file id* */
404eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
405eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
406eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* ISO File ID */
407eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_CC_FILE_ID_BYTE;
408eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
409eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_CC_FILE_ID_BYTE;
410eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
411eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
412eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
413eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
414eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
415eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  Lc: Length of wrapped data */
416eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN;
417eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
418eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set cc file id*/
419eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
420eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
421eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
422eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
423eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS;
424eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
425eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
426eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the Access Rights are set to full read/write, full cntrl*/
427eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
428eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
429eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
430eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
431eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
432eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the file size*/
433eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
434eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
435eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
436eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
437eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
438eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
439eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
440eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Le bytes*/
441eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
442eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
443eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
444eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
445eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
446eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the length of the buffer*/
447eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = i;
448eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
449eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
450eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
451eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
452eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the length of the buffer*/
453eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN;
454eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
455eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
456eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
4575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
458eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_CREATENDEF_CMD:
459eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
460eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Instruction Cmd code */
461eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD;
4625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
463eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
464eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
465eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
466eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  Lc: Length of wrapped data,
467eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                here the magic number 2 is added as part of the ISO File ID in the packet */
468eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = (uint8_t)
469eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                    (PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN + 2);
470eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
471eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  set NDEF file id* */
472eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_NDEF_FILE_ID;
473eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
474eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* ISO File ID */
475eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_NDEF_FILE_ID_BYTE;
476eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
477eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_NDEF_FILE_ID_BYTE;
478eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
479eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
480eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
481eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
482eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
483eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*  Lc: Length of wrapped data */
484eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN;
485eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
4865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
487eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set NDEF file id*/
488eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID;
489eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
490eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
491eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS;
492eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
493eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
494eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the r/w access rights.Once Authentication part is fixed,
495eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            we will use the constants*/
496eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
497eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
498eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
499eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
500eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
501eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)NdefSmtCrdFmt->AddInfo.Type4Info.CardSize;
502eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
503eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)
504eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                    (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 8);
505eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
506eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)
507eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                    (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 16);
508eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
509eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
510eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Le bytes*/
511eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
512eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
5135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
514eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
515eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
516eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
517eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the length of the buffer*/
518eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = i;
519eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
520eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
521eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
522eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
523eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the length of the buffer*/
524eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN;
525eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
526eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
527eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
5285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
529eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_WRITECC_CMD:
530eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
531eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Instruction Cmd code */
532eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD;
5335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
534eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /*  Lc: Length of wrapped data */
535eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN;
536eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
5375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
538eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
539eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
540eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
541eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the file id*/
542eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
543eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
544eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
545eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
546eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
547eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
548eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the file id*/
549eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
550eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
551eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
5525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
553eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the offset to zero*/
554eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
555eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
556eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
557eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
558eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
559eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
560eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
561eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Set the length of data available to write*/
562eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
563eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
564eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
565eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
566eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
567eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
568eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
569eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
570eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
571eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                CCFileBytes[2] = (uint8_t)DESFIRE_EV1_MAPPING_VERSION;
572eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
573eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Length value is updated in the CC as per the card size received from
574eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    the GetVersion command */
575eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                CCFileBytes[11] = (uint8_t)
576eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 8);
577eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                CCFileBytes[12] = (uint8_t)
578eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize);
579eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
580eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
581eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /*set the data to be written to the CC file*/
582eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            (void)memcpy ((void *)&NdefSmtCrdFmt->SendRecvBuf[i],
583eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        (void *)CCFileBytes, sizeof (CCFileBytes));
584eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
585eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#else
586eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
587eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
5885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
589eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i = (uint16_t)(i + sizeof (CCFileBytes));
5905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
591eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Le bytes*/
592eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
593eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
594eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
595eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
596eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
597eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = i;
598eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
599eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
600eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
601eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
602eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN;
603eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
604eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
605eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
606eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
607eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        case PH_FRINFC_DESF_WRITENDEF_CMD:
608eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
609eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Instruction Cmd code */
610eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD;
611eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
612eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /*  Lc: Length of wrapped data */
613eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRNDEF_WRDT_LEN;
614eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
615eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
616eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
617eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
618eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
619eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the file id*/
620eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_NDEF_FILE_ID;
621eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
622eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
623eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            else
624eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
625eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
626eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* set the file id*/
627eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID;
628eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                i++;
629eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
630eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
631eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* set the offset to zero*/
632eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
633eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
634eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
635eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
636eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
637eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
638eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
639eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Set the length of data available to write*/
640eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x02;
641eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
642eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
643eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
644eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
645eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
646eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
647eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /*set the data to be written to the CC file*/
648eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
649eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[i],
650eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        NdefFileBytes, sizeof (NdefFileBytes));
651eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i = (uint16_t)(i + sizeof (NdefFileBytes));
652eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
653eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            /* Le bytes*/
654eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
655eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            i++;
656eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
657eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITENDEF_CMD_SNLEN;
658eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
659eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
660eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
661eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        default:
662eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
663eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            break;
664eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
6655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
6665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
6695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_SUCCESS;
6715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
6725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Removed uint8_t i=0; */
6735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
6745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    uint8_t i=0;
6755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */
6765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the state*/
6785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_HW_VERSION;
6795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Helper routine to wrap the native DESFire cmds*/
6815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_HW_VERSION_CMD);
6825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
6845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return ( status);
6865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
6875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
6895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
6905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
6925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
6935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
6945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- 1] ==
6955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) )
6965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
6975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
6985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_SW_VERSION;
6995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native DESFire cmds*/
7015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_SW_VERSION_CMD);
7025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
7045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
7065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
7095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = PHNFCSTVAL(CID_NFC_NONE,
711eff5a3da9704a7d49f0990152c84c172630da679Jan Brands				NFCSTATUS_SUCCESS);
7125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)-
7145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        PH_SMTCRDFMT_DESF_VAL1] ==  PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP ) )
7155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion = NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL3];
7175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion = NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL4];
71880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
71980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        if ((PH_FRINFC_DESF4_MAJOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion) &&
72080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen             (PH_FRINFC_DESF4_MINOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion))
7215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            /* card size of DESFire4 type */
7235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = PH_FRINFC_DESF4_MEMORY_SIZE;
7245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
726eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
727eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        else if ((DESFIRE_EV1_SW_MAJOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion) &&
728eff5a3da9704a7d49f0990152c84c172630da679Jan Brands             (DESFIRE_EV1_SW_MINOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion))
729eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
730eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            NdefSmtCrdFmt->CardType = DESFIRE_CARD_TYPE_EV1;
731eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
732eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
7335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        else
7345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
7355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            // need to handle the Desfire8 type cards
7365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            // need to use get free memory
737eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
738eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                NFCSTATUS_INVALID_REMOTE_DEVICE);
7395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
741eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
742eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
743eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        {
744eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            switch (NdefSmtCrdFmt->SendRecvBuf[5])
745eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
746eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                case DESFIRE_TAG_SIZE_IDENTIFIER_2K:
747eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                {
748eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_2K_CARD;
749eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    break;
750eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                }
751eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
752eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                case DESFIRE_TAG_SIZE_IDENTIFIER_4K:
753eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                {
754eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_4K_CARD;
755eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    break;
756eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                }
757eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
758eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                case DESFIRE_TAG_SIZE_IDENTIFIER_8K:
759eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                {
760eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_8K_CARD;
761eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    break;
762eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                }
763eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
764eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                default:
765eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                {
766eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
767eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                        NFCSTATUS_INVALID_REMOTE_DEVICE);
768eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    break;
769eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                }
770eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
771eff5a3da9704a7d49f0990152c84c172630da679Jan Brands        }
772eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
7735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
775eff5a3da9704a7d49f0990152c84c172630da679Jan Brands    return status;
7765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt)
7795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
7805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = NFCSTATUS_PENDING;
7825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)-
7835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        PH_SMTCRDFMT_DESF_VAL1] ==  PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) )
7845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
7855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
7865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_UID;
7875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native desfire cmds*/
7895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_UID_CMD);
7905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
7925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
7935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return status;
7955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
7975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
7995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
8005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
8025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
8035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL14] == PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE)
8055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly         && (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL15] == PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE ))
8065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
8085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_AID;
8095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native DESFire cmds*/
8115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATEAPP_CMD);
8125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
8145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return ( status);
8165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
8205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
8235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
8245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* check for the response of previous operation, before
8265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    issuing the next command*/
8275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE) &&
8295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE ))
8305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
8325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_SELECT_APP;
8335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native DESFire cmds*/
8355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_SELECTAPP_CMD);
8365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
8385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return ( status);
8405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
8445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
8465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
8475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
8495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
8505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
8525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_CCFILE;
8535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native DESFire cmds*/
8555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATECC_CMD);
8565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
8585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return ( status);
8605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
8635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
8665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
8675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
8695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
8705d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8715d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
8725d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_NDEFFILE;
8735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native desfire cmds*/
8755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATENDEF_CMD);
8765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8775d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
8785d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8795d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
8805d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8815d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return ( status);
8825d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8835d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
8845d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8855d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
8865d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
8875d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8885d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
8895d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
8905d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
8915d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
8925d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
8935d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8945d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
8955d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_CC_FILE;
8965d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
8975d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native DESFire cmds*/
8985d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITECC_CMD);
8995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9005d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
9015d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9025d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (result);
9035d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
9045d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9055d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
9065d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
9075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9085d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
9095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NFCSTATUS_FORMAT_ERROR);
9105d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9115d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9125d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
9135d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
9145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
9155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /*set the state*/
9165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE;
9175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9185d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* Helper routine to wrap the native DESFire cmds*/
9195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITENDEF_CMD);
9205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        Result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
9225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
9235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (Result);
9245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
9255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9265d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellystatic NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
9275d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
9285d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9295d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status =  NFCSTATUS_SUCCESS;
9305d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9315d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the command type*/
9325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#ifdef PH_HAL4_ENABLE
9335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_Raw;
9345d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#else
9355d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_CmdListTClCmd;
9365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly#endif /* #ifdef PH_HAL4_ENABLE */
9375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the Additional Info*/
9395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
9405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0;
9415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*set the completion routines for the desfire card operations*/
9435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = phFriNfc_NdefSmtCrd_Process;
9445d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NdefSmtCrdFmt;
9455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* set the receive length */
9475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    *NdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE;
9485d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9495d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9505d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /*Call the Overlapped HAL Transceive function */
9515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status = phFriNfc_OvrHal_Transceive(NdefSmtCrdFmt->LowerDevice,
9525d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
9535d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->psRemoteDevInfo,
9545d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->Cmd,
9555d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        &NdefSmtCrdFmt->psDepAdditionalInfo,
9565d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->SendRecvBuf,
9575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->SendLength,
9585d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->SendRecvBuf,
9595d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        NdefSmtCrdFmt->SendRecvLength);
9605d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9615d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
9625d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9645d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
9655d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9665d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick PellyNFCSTATUS phFriNfc_Desfire_Format(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)
9675d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
9685d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
9695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NFCSTATUS status =  NFCSTATUS_SUCCESS;
970eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
971eff5a3da9704a7d49f0990152c84c172630da679Jan Brands    NdefSmtCrdFmt->CardType = 0;
972eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
9735d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    status =  phFriNfc_Desf_HGetHWVersion(NdefSmtCrdFmt);
9745d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    return (status);
9755d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
9765d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
97780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF
97880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
97980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#if 0
98080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
98180ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
98280ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlySelectCCFile (
98380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
98480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{
98580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NFCSTATUS result = NFCSTATUS_SUCCESS;
98680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    return result;
98780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen}
98880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #if 0 */
98980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
99080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
99180ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
99280ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlyReadCCFile (
99380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
99480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{
99580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NFCSTATUS       result = NFCSTATUS_SUCCESS;
99680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    uint16_t        i = 0;
99780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
99880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
99980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
100080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
100180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
100280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    {
100380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_READ_CC_FILE;
100480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
100580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* Class Byte */
100680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;
100780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
100880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
100980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* let the place to store the cmd byte type, point to next index
101080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            Instruction Cmd code */
101180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_READ_DATA_CMD;
101280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
101380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
101480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
101580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* P1/P2 offsets always set to zero */
101680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;
101780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
101880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;
101980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
102080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
102180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /*  Lc: Length of wrapped data */
102280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = NATIVE_WRAPPER_READ_DATA_LC_VALUE;
102380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
102480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
102580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
102680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
102780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        {
102880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            /* set the file id*/
102980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
103080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            i++;
103180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        }
103280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        else
103380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
103480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        {
103580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            /* set the file id*/
103680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
103780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            i++;
103880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        }
103980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
104080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* set the offset to zero*/
104180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
104280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
104380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
104480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
104580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
104680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
104780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
104880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* Set the length of data available to read */
104980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
105080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
105180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
105280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
105380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
105480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
105580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
105680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* Le Value is set 0 */
105780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
105880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
105980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
106080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendLength = i;
106180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
106280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
106380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    }
106480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    else
106580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    {
106680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
106780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                            NFCSTATUS_FORMAT_ERROR);
106880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    }
106980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
107080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    return result;
107180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen}
107280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
107380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
107480ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
107580ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlyWriteCCFile (
107680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
107780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{
107880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NFCSTATUS   result = NFCSTATUS_SUCCESS;
107980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    uint8_t     read_cc_btyes[CC_BYTES_SIZE] = {0};
108080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    uint16_t    i = 0;
108180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
108280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
108380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
108480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
108580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
108680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    {
108780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE;
108880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
108980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        memcpy ((void *)read_cc_btyes, (void *)NdefSmtCrdFmt->SendRecvBuf,
109080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                sizeof (read_cc_btyes));
109180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        read_cc_btyes[(sizeof (read_cc_btyes) - 1)] = READ_ONLY_NDEF_DESFIRE;
109280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
109380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* Class Byte */
109480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;
109580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
109680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
109780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* let the place to store the cmd byte type, point to next index
109880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            Instruction Cmd code */
109980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_WRITE_CMD;
110080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
110180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
110280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
110380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* P1/P2 offsets always set to zero */
110480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;
110580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
110680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;
110780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
110880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
110980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /*  Lc: Length of wrapped data */
111080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN;
111180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
111280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
111380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
111480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
111580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        {
111680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            /* set the file id*/
111780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
111880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            i++;
111980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        }
112080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        else
112180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
112280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        {
112380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            /* set the file id*/
112480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
112580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            i++;
112680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        }
112780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
112880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* set the offset to zero*/
112980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
113080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
113180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
113280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
113380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
113480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
113580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
113680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* Set the length of data available to write*/
113780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
113880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
113980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
114080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
114180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
114280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
114380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
114480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /*set the data to be written to the CC file*/
114580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        (void)memcpy ((void *)&NdefSmtCrdFmt->SendRecvBuf[i],
114680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    (void *)read_cc_btyes, sizeof (read_cc_btyes));
114780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
114880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#else
114980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
115080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
115180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
115280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i = (uint16_t)(i + sizeof (read_cc_btyes));
115380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
115480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        /* Le bytes*/
115580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
115680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        i++;
115780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
115880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
115980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        {
116080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            NdefSmtCrdFmt->SendLength = i;
116180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        }
116280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        else
116380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
116480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        {
116580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN;
116680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        }
116780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
116880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
116980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    }
117080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    else
117180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    {
117280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen        result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
117380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                            NFCSTATUS_FORMAT_ERROR);
117480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    }
117580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
117680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    return result;
117780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen}
117880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
117980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
118080ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
118180ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlySelectApp (
118280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
118380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{
118480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NFCSTATUS result = NFCSTATUS_SUCCESS;
118580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
118680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NdefSmtCrdFmt->CardType = 0;
118780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
118880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_SELECT_APP;
118980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
119080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    /* Helper routine to wrap the native DESFire cmds */
119180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_Desf_HWrapISONativeCmds (NdefSmtCrdFmt, PH_FRINFC_DESF_SELECTAPP_CMD);
119280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
119380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
119480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
119580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    return result;
119680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen}
119780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
119880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
119980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenenstatic
120080ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
120180ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desf_HReadOnlySelectAppEV1 (
120280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
120380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{
120480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NFCSTATUS result = NFCSTATUS_SUCCESS;
120580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
120680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NdefSmtCrdFmt->CardType = DESFIRE_CARD_TYPE_EV1;
120780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
120880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1;
120980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
121080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    /* Helper routine to wrap the native DESFire cmds */
121180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_Desf_HWrapISONativeCmds (NdefSmtCrdFmt, PH_FRINFC_DESF_SELECTAPP_CMD);
121280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
121380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
121480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
121580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    return result;
121680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen}
121780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
121880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
121980ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenNFCSTATUS
122080ee29b88ec489e2bbf6ae446692229d36755429Martijn CoenenphFriNfc_Desfire_ConvertToReadOnly (
122180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    phFriNfc_sNdefSmtCrdFmt_t   *NdefSmtCrdFmt)
122280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen{
122380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    NFCSTATUS result = NFCSTATUS_SUCCESS;
122480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
122580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
122680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    result = phFriNfc_Desf_HReadOnlySelectAppEV1 (NdefSmtCrdFmt);
122780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#else
122880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    result = phFriNfc_Desf_HReadOnlySelectApp (NdefSmtCrdFmt);
122980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
123080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
123180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen    return result;
123280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen}
123380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
123480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */
123580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
12365d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pellyvoid phFriNfc_Desf_Process( void       *Context,
12375d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly                           NFCSTATUS   Status)
12385d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly{
12395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12405d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    phFriNfc_sNdefSmtCrdFmt_t      *NdefSmtCrdFmt;
12415d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
12425d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context;
12435d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1244eff5a3da9704a7d49f0990152c84c172630da679Jan Brands    if((NFCSTATUS_SUCCESS & PHNFCSTBLOWER) == (Status & PHNFCSTBLOWER))
12455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
12465d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        switch(NdefSmtCrdFmt->State)
12475d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        {
124880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef FRINFC_READONLY_NDEF
124980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
125080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            case PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1:
125180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            {
125280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
125380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
125480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
125580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
125680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                {
125780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    Status = phFriNfc_Desf_HReadOnlyReadCCFile (NdefSmtCrdFmt);
125880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                }
125980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                else
126080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                {
126180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    Status = phFriNfc_Desf_HReadOnlySelectApp (NdefSmtCrdFmt);
126280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                }
126380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                break;
126480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            }
126580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
126680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
126780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            case PH_FRINFC_DESF_STATE_RO_SELECT_APP:
126880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            {
126980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                Status = phFriNfc_Desf_HReadOnlyReadCCFile (NdefSmtCrdFmt);
127080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                break;
127180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            }
127280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
127380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            case PH_FRINFC_DESF_STATE_RO_READ_CC_FILE:
127480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            {
127580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                Status = phFriNfc_Desf_HReadOnlyWriteCCFile (NdefSmtCrdFmt);
127680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                break;
127780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            }
127880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
127980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            case PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE:
128080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            {
128180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
128280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
128380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
128480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
128580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                {
128680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    /* SUCCESSFULL Formatting */
128780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#ifdef DESFIRE_FMT_EV1
128880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
128980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    {
129080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                        Status = phFriNfc_OvrHal_Reconnect (
129180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                                                NdefSmtCrdFmt->LowerDevice,
129280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                                                &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
129380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                                                NdefSmtCrdFmt->psRemoteDevInfo);
129480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
129580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                        if (NFCSTATUS_PENDING == Status)
129680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                        {
129780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                            NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_REACTIVATE;
129880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                        }
129980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    }
130080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef DESFIRE_FMT_EV1 */
130180ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                }
130280ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                else
130380ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                {
130480ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                    Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
130580ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                                        NFCSTATUS_FORMAT_ERROR);
130680ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                }
130780ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen                break;
130880ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen            }
130980ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen
131080ee29b88ec489e2bbf6ae446692229d36755429Martijn Coenen#endif /* #ifdef FRINFC_READONLY_NDEF */
1311eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_GET_HW_VERSION:
1312eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1313eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Check and store the h/w and s/w specific details.
1314eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    Ex: Major/Minor version, memory storage info. */
13155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1316eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HGetSWVersion (NdefSmtCrdFmt);
1317eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
1318eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1319eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1321eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_GET_SW_VERSION:
13225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1323eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Check and store the h/w and s/w specific details.
1324eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    Ex: Major/Minor version, memory storage info. */
1325eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
1326eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HUpdateVersionDetails (NdefSmtCrdFmt);
1327eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                if ( Status == NFCSTATUS_SUCCESS )
1328eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                {
1329eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    Status = phFriNfc_Desf_HGetUIDDetails (NdefSmtCrdFmt);
1330eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                }
1331eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
13325d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
13335d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1334eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_GET_UID:
1335eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1336eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HCreateApp (NdefSmtCrdFmt);
1337eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1338eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13395d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1340eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_CREATE_AID:
1341eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1342eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HSelectApp (NdefSmtCrdFmt);
1343eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1344eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13455d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1346eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_SELECT_APP:
1347eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1348eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HCreatCCFile (NdefSmtCrdFmt);
1349eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1350eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13515d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1352eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_CREATE_CCFILE:
1353eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1354eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HCreatNDEFFile (NdefSmtCrdFmt);
1355eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1356eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13575d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1358eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_CREATE_NDEFFILE:
1359eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1360eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HWrCCBytes (NdefSmtCrdFmt);
1361eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1362eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13635d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1364eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_WRITE_CC_FILE:
1365eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1366eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = phFriNfc_Desf_HWrNDEFData (NdefSmtCrdFmt);
1367eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1368eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13695d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1370eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE:
1371eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1372eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
1373eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0]) &&
1374eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
1375eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1]))
1376eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                {
1377eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    NdefSmtCrdFmt->CardState = 0;
1378eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
1379eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
1380eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    {
1381eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        Status = phFriNfc_OvrHal_Reconnect (
1382eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                                NdefSmtCrdFmt->LowerDevice,
1383eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                                &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
1384eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                                NdefSmtCrdFmt->psRemoteDevInfo);
1385eff5a3da9704a7d49f0990152c84c172630da679Jan Brands
1386eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        if (NFCSTATUS_PENDING == Status)
1387eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        {
1388eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                            NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_REACTIVATE;
1389eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        }
1390eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    }
1391eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    else
1392eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
1393eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    {
1394eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                        Status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);
1395eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                    }
1396eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                }
1397eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1398eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
13995d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1400eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#ifdef DESFIRE_FMT_EV1
1401eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            case PH_FRINFC_DESF_STATE_REACTIVATE:
1402eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            {
1403eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /* Do nothing */
1404eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
1405eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            }
1406eff5a3da9704a7d49f0990152c84c172630da679Jan Brands#endif /* #ifdef DESFIRE_FMT_EV1 */
14075d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1408eff5a3da9704a7d49f0990152c84c172630da679Jan Brands            default:
14095d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            {
1410eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                /*set the invalid state*/
1411eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
1412eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                                    NFCSTATUS_INVALID_DEVICE_REQUEST);
1413eff5a3da9704a7d49f0990152c84c172630da679Jan Brands                break;
14145d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly            }
14155d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        }
14165d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
14175d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    /* Handle the all the error cases*/
1418eff5a3da9704a7d49f0990152c84c172630da679Jan Brands    if ((NFCSTATUS_PENDING & PHNFCSTBLOWER) != (Status & PHNFCSTBLOWER))
14195d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    {
14205d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        /* call respective CR */
14215d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly        phFriNfc_SmtCrdFmt_HCrHandler(NdefSmtCrdFmt,Status);
14225d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly    }
14235d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
14245d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly}
14255d9927ba30ba449badb9f6df0fbeb4d6aedc6e2aNick Pelly
1426