diff options
author | Nick Pelly <npelly@google.com> | 2010-09-23 12:47:58 -0700 |
---|---|---|
committer | Nick Pelly <npelly@google.com> | 2010-09-23 13:53:18 -0700 |
commit | 5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a (patch) | |
tree | 190f9251c6db03d3550ec7f30b51a2561c01d9cf /src/phFriNfc_DesfireFormat.c | |
parent | 4ff7c86a2c706b150078274455406f1b04966e1a (diff) | |
download | libnfc-nxp-5d9927ba30ba449badb9f6df0fbeb4d6aedc6e2a.tar.gz |
Initial libnfc checkin
Source: Trusted_NFC_Device_Host_AA03.01e02_google.zip code drop (23-Sep-2010)
Change-Id: Ie47f18423f949a8d3e0815d13f55c814312add24
Signed-off-by: Nick Pelly <npelly@google.com>
Diffstat (limited to 'src/phFriNfc_DesfireFormat.c')
-rw-r--r-- | src/phFriNfc_DesfireFormat.c | 748 |
1 files changed, 748 insertions, 0 deletions
diff --git a/src/phFriNfc_DesfireFormat.c b/src/phFriNfc_DesfireFormat.c new file mode 100644 index 0000000..b23760b --- /dev/null +++ b/src/phFriNfc_DesfireFormat.c @@ -0,0 +1,748 @@ +/* + * Copyright (C) 2010 NXP Semiconductors + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +/*! +* \file phFriNfc_DesfireFormat.c +* \brief This component encapsulates different format functinalities , +* for the Type4/Desfire card. +* +* Project: NFC-FRI +* +* $Date: Fri Feb 20 14:38:17 2009 $ +* $Author: ing07385 $ +* $Revision: 1.4 $ +* $Aliases: NFC_FRI1.1_WK908_R19_1,NFC_FRI1.1_WK910_PREP1,NFC_FRI1.1_WK910_R20_1,NFC_FRI1.1_WK912_PREP1,NFC_FRI1.1_WK912_R21_1,NFC_FRI1.1_WK914_PREP1,NFC_FRI1.1_WK914_R22_1,NFC_FRI1.1_WK914_R22_2,NFC_FRI1.1_WK916_R23_1,NFC_FRI1.1_WK918_R24_1,NFC_FRI1.1_WK920_PREP1,NFC_FRI1.1_WK920_R25_1,NFC_FRI1.1_WK922_PREP1,NFC_FRI1.1_WK922_R26_1,NFC_FRI1.1_WK924_PREP1,NFC_FRI1.1_WK924_R27_1,NFC_FRI1.1_WK926_R28_1,NFC_FRI1.1_WK928_R29_1,NFC_FRI1.1_WK930_R30_1,NFC_FRI1.1_WK934_PREP_1,NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $ +* +*/ +#include <phNfcTypes.h> +#include <phFriNfc_OvrHal.h> +#include <phFriNfc_SmtCrdFmt.h> +#include <phFriNfc_DesfireFormat.h> + + +/* Following section details, how to wrap the native DESFire commands in to ISO commands +Following are different native commands are wrapped under the ISO commands : +1. Crate Application +2. Select File +3. Get version +4. Create CC/NDEF File +5. Write data to STD File +In this File above commands are sent using the ISO Wrapper. + +Wrapping the native DESFire APDU's procedure +-------------------------------------------------------------------------------- +CLA INS P1 P2 Lc Data Le +0x90 Cmd 0x00 0x00 Data Len Cmd. Par's 0x00 +-----------------------------------------------------------------------------------*/ + +/* Helper functions to create app/select app/create data file/read /write from the +CC file and NDEF files */ +static void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,uint8_t CmdType); + +/* Gets H/W version details*/ +static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Gets S/W version details*/ +static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Updates the version details to context structure*/ +static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/*Gets UID details*/ +static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt); + +/*Creates Application*/ +static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Selects Application*/ +static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/*Creates Capability Container File*/ +static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Create NDEF File*/ +static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Writes CC Bytes to CC File*/ +static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Writes NDEF data into NDEF File*/ +static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + +/* Transceive Cmd initiation*/ +static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); + + +void phFriNfc_Desfire_Reset( phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + /* This piece of code may not be useful for the current supported DESFire formatting feature*/ + /* Currently, s/w doesn't support authenticating either PICC Master key nor NFC Forum + Application Master key*/ + + /*NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey[] = PH_FRINFC_SMTCRDFMT_DESF_PICC_MASTER_KEY; + NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey[] = PH_FRINFC_SMTCRDFMT_DESF_NFCFORUM_APP_KEY;*/ + + /* reset to zero PICC and NFC FORUM master keys*/ + (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey, + 0x00, + 16); + + (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey, + 0x00, + 16); + NdefSmtCrdFmt->AddInfo.Type4Info.PrevState = 0; + +} + + +static void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,uint8_t CmdType) +{ + + uint16_t i=0, CmdByte=1; + uint8_t NdefFileBytes[] = PH_FRINFC_DESF_NDEFFILE_BYTES; + uint8_t CCFileBytes[] = PH_FRINFC_DESF_CCFILE_BYTES; + + + /* common elements for all the native commands*/ + + /* Class Byte */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE; + + /* let the place to store the cmd byte type, point to next index*/ + i += 2; + + + /* P1/P2 offsets always set to zero */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2; + i++; + + switch(CmdType) + { + + case PH_FRINFC_DESF_GET_HW_VERSION_CMD : + case PH_FRINFC_DESF_GET_SW_VERSION_CMD : + case PH_FRINFC_DESF_GET_UID_CMD : + + if (CmdType == PH_FRINFC_DESF_GET_HW_VERSION_CMD ) + { + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_GET_VER_CMD; + } + else + { + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP; + } + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + + /* NO Data to send in this cmd*/ + /* we are not suppose to set Le*/ + /* set the length of the buffer*/ + NdefSmtCrdFmt->SendLength = i; + + break; + + case PH_FRINFC_DESF_CREATEAPP_CMD: + + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_AID_CMD; + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN; + i++; + + /* NFC FORUM APPLICATION ID*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE; + i++; + + /* set key settings and number of keys*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_PICC_NFC_KEY_SETTING; + i++; + + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NFCFORUM_APP_NO_OF_KEYS; + i++; + + /* Le bytes*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE; + i++; + + /* set the length of the buffer*/ + NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATEAPP_CMD_SNLEN; + + break; + + case PH_FRINFC_DESF_SELECTAPP_CMD : + + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_SLECT_APP_CMD; + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_SLAPP_WRDT_LEN; + i++; + + /* Data*/ + /* set the send buffer to create the application identifier*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE; + i++; + + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE; + i++; + + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE; + i++; + + /* Le bytes*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE; + i++; + + /* set the length of the buffer*/ + NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_SELECTAPP_CMD_SNLEN; + + break; + + case PH_FRINFC_DESF_CREATECC_CMD : + + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD; + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN; + i++; + + /* set cc file id*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS; + i++; + + /* set the Access Rights are set to full read/write, full cntrl*/ + NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE; + i++; + + /* set the file size*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + + /* Le bytes*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE; + i++; + + /* set the length of the buffer*/ + NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN ; + break; + + case PH_FRINFC_DESF_CREATENDEF_CMD : + + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD; + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN; + i++; + + /* set cc file id*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS; + i++; + + /* set the r/w access rights.Once Authentication part is fixed, + we will use the constants*/ + NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE; + i++; + + NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)NdefSmtCrdFmt->AddInfo.Type4Info.CardSize ; + i++; + NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)(NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 8) ; + i++; + NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)(NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 16); + i++; + + /* Le bytes*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE; + i++; + + /* set the length of the buffer*/ + NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN ; + + break; + + case PH_FRINFC_DESF_WRITECC_CMD: + + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD; + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN; + i++; + + /* set the file id*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID; + i++; + + /* set the offset to zero*/ + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + + /* Set the length of data available to write*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + + /*set the data to be written to the CC file*/ + (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[i], + CCFileBytes, + PH_FRINFC_DESF_CC_FILE_SIZE); + i++; + + i += PH_FRINFC_DESF_CC_FILE_SIZE; + + /* Le bytes*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE; + i++; + + NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN; + break; + + case PH_FRINFC_DESF_WRITENDEF_CMD: + + /* Instruction Cmd code */ + NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD; + + /* Lc: Length of wrapped data */ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRNDEF_WRDT_LEN; + i++; + + /* set the file id*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID; + i++; + + /* set the offset to zero*/ + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + + /* Set the length of data available to write*/ + NdefSmtCrdFmt->SendRecvBuf[i] = 0x02; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + NdefSmtCrdFmt->SendRecvBuf[i] = 0x00; + i++; + + /*set the data to be written to the CC file*/ + + (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[i], + NdefFileBytes, + 2); + i += 2; + + /* Le bytes*/ + NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE; + i++; + + NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITENDEF_CMD_SNLEN; + break; + + default : + break; + } +} + +static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + NFCSTATUS status = NFCSTATUS_SUCCESS; +#ifdef PH_HAL4_ENABLE + /* Removed uint8_t i=0; */ +#else + uint8_t i=0; +#endif /* #ifdef PH_HAL4_ENABLE */ + + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_HW_VERSION; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_HW_VERSION_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + + return ( status); +} + +static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + + if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- 1] == + PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) ) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_SW_VERSION; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_SW_VERSION_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + return status; +} + +static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + NFCSTATUS status = PHNFCSTVAL(CID_NFC_NONE, + NFCSTATUS_SUCCESS); + + if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- + PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP ) ) + { + NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion = NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL3]; + NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion = NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL4]; + if ( ( NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion == PH_FRINFC_DESF4_MAJOR_VERSION )&& + ( NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion == PH_FRINFC_DESF4_MINOR_VERSION )) + { + /* card size of DESFire4 type */ + NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = PH_FRINFC_DESF4_MEMORY_SIZE; + + } + else + { + // need to handle the Desfire8 type cards + // need to use get free memory + status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_INVALID_REMOTE_DEVICE); + + } + } + return status; + +} + +static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt) +{ + + NFCSTATUS status = NFCSTATUS_PENDING; + if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- + PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) ) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_UID; + + /* Helper routine to wrap the native desfire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_UID_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + + return status; + +} + + +static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + + if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL14] == PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE) + && (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL15] == PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE )) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_AID; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATEAPP_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + return ( status); +} + + +static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + + /* check for the response of previous operation, before + issuing the next command*/ + + if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE) && + (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE )) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_SELECT_APP; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_SELECTAPP_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + return ( status); + +} + +static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + + if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) && + (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 )) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_CCFILE; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATECC_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + return ( status); +} + +static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + + if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) && + (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 )) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_NDEFFILE; + + /* Helper routine to wrap the native desfire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATENDEF_CMD); + + status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + + } + + return ( status); + +} + +static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) && + (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 )) + { + + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_CC_FILE; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITECC_CMD); + + result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + return (result); +} + +static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_FORMAT_ERROR); + + + if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) && + (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 )) + { + /*set the state*/ + NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE; + + /* Helper routine to wrap the native DESFire cmds*/ + phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITENDEF_CMD); + + Result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt); + } + return (Result); +} + +static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS status = NFCSTATUS_SUCCESS; + + /* set the command type*/ +#ifdef PH_HAL4_ENABLE + NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_Raw; +#else + NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_CmdListTClCmd; +#endif /* #ifdef PH_HAL4_ENABLE */ + + /* set the Additional Info*/ + NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0; + NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0; + + /*set the completion routines for the desfire card operations*/ + NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = phFriNfc_NdefSmtCrd_Process; + NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NdefSmtCrdFmt; + + /* set the receive length */ + *NdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE; + + + /*Call the Overlapped HAL Transceive function */ + status = phFriNfc_OvrHal_Transceive(NdefSmtCrdFmt->LowerDevice, + &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo, + NdefSmtCrdFmt->psRemoteDevInfo, + NdefSmtCrdFmt->Cmd, + &NdefSmtCrdFmt->psDepAdditionalInfo, + NdefSmtCrdFmt->SendRecvBuf, + NdefSmtCrdFmt->SendLength, + NdefSmtCrdFmt->SendRecvBuf, + NdefSmtCrdFmt->SendRecvLength); + + return (status); + + +} + +NFCSTATUS phFriNfc_Desfire_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt) +{ + + NFCSTATUS status = NFCSTATUS_SUCCESS; + status = phFriNfc_Desf_HGetHWVersion(NdefSmtCrdFmt); + return (status); +} + +void phFriNfc_Desf_Process( void *Context, + NFCSTATUS Status) +{ + + phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt; + + NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context; + + + if((Status & PHNFCSTBLOWER) == (NFCSTATUS_SUCCESS & PHNFCSTBLOWER)) + { + switch(NdefSmtCrdFmt->State) + { + + case PH_FRINFC_DESF_STATE_GET_HW_VERSION : + + /* Check and store the h/w and s/w specific details. + Ex: Major/Minor version, memory storage info. */ + + Status = phFriNfc_Desf_HGetSWVersion(NdefSmtCrdFmt); + + break; + + case PH_FRINFC_DESF_STATE_GET_SW_VERSION : + + /* Check and store the h/w and s/w specific details. + Ex: Major/Minor version, memory storage info. */ + + Status = phFriNfc_Desf_HUpdateVersionDetails(NdefSmtCrdFmt); + if ( Status == NFCSTATUS_SUCCESS ) + { + Status = phFriNfc_Desf_HGetUIDDetails(NdefSmtCrdFmt); + } + break; + case PH_FRINFC_DESF_STATE_GET_UID : + + Status = phFriNfc_Desf_HCreateApp(NdefSmtCrdFmt); + break; + + case PH_FRINFC_DESF_STATE_CREATE_AID : + + Status = phFriNfc_Desf_HSelectApp(NdefSmtCrdFmt); + break; + + case PH_FRINFC_DESF_STATE_SELECT_APP : + + Status = phFriNfc_Desf_HCreatCCFile(NdefSmtCrdFmt); + break; + + case PH_FRINFC_DESF_STATE_CREATE_CCFILE : + + Status = phFriNfc_Desf_HCreatNDEFFile(NdefSmtCrdFmt); + break; + + case PH_FRINFC_DESF_STATE_CREATE_NDEFFILE : + + Status = phFriNfc_Desf_HWrCCBytes(NdefSmtCrdFmt); + break; + + case PH_FRINFC_DESF_STATE_WRITE_CC_FILE : + + Status = phFriNfc_Desf_HWrNDEFData(NdefSmtCrdFmt); + break; + + case PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE : + + if (( NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1 )&& + ( NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 )) + { + Status = PHNFCSTVAL(CID_NFC_NONE, + NFCSTATUS_SUCCESS); + NdefSmtCrdFmt->CardState = 0; + } + break; + + default : + /*set the invalid state*/ + Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, + NFCSTATUS_INVALID_DEVICE_REQUEST); + break; + } + } + /* Handle the all the error cases*/ + if ( (Status & PHNFCSTBLOWER) != (NFCSTATUS_PENDING & PHNFCSTBLOWER)) + { + /* call respective CR */ + phFriNfc_SmtCrdFmt_HCrHandler(NdefSmtCrdFmt,Status); + } + +} + |