2 * Copyright (C) 2010 NXP Semiconductors
\r
4 * Licensed under the Apache License, Version 2.0 (the "License");
\r
5 * you may not use this file except in compliance with the License.
\r
6 * You may obtain a copy of the License at
\r
8 * http://www.apache.org/licenses/LICENSE-2.0
\r
10 * Unless required by applicable law or agreed to in writing, software
\r
11 * distributed under the License is distributed on an "AS IS" BASIS,
\r
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
\r
13 * See the License for the specific language governing permissions and
\r
14 * limitations under the License.
\r
18 * \file phFriNfc_DesfireFormat.c
\r
19 * \brief This component encapsulates different format functinalities ,
\r
20 * for the Type4/Desfire card.
\r
24 * $Date: Thu Oct 28 17:44:00 2010 $
\r
25 * $Author: ing02260 $
\r
30 #include <phNfcTypes.h>
\r
31 #include <phFriNfc_OvrHal.h>
\r
32 #include <phFriNfc_SmtCrdFmt.h>
\r
33 #include <phFriNfc_DesfireFormat.h>
\r
36 /* Following section details, how to wrap the native DESFire commands in to ISO commands
\r
37 Following are different native commands are wrapped under the ISO commands :
\r
38 1. Crate Application
\r
41 4. Create CC/NDEF File
\r
42 5. Write data to STD File
\r
43 In this File above commands are sent using the ISO Wrapper.
\r
45 Wrapping the native DESFire APDU's procedure
\r
46 --------------------------------------------------------------------------------
\r
47 CLA INS P1 P2 Lc Data Le
\r
48 0x90 Cmd 0x00 0x00 Data Len Cmd. Par's 0x00
\r
49 -----------------------------------------------------------------------------------*/
\r
51 /****************************** Macro definitions start ********************************/
\r
52 /* This settings can be changed, depending on the requirement*/
\r
53 #define PH_FRINFC_DESF_PICC_NFC_KEY_SETTING 0x0FU
\r
55 #ifdef FRINFC_READONLY_NDEF
\r
57 #define READ_ONLY_NDEF_DESFIRE 0xFFU
\r
58 #define CC_BYTES_SIZE 0x0FU
\r
59 #define PH_FRINFC_DESF_READ_DATA_CMD 0xBDU
\r
60 #define NATIVE_WRAPPER_READ_DATA_LC_VALUE 0x07U
\r
62 #endif /* #ifdef FRINFC_READONLY_NDEF */
\r
64 #ifdef DESFIRE_FMT_EV1
\r
66 #define DESFIRE_CARD_TYPE_EV1 0x01U
\r
68 #define DESFIRE_EV1_MAPPING_VERSION 0x20U
\r
70 #define DESFIRE_EV1_HW_MAJOR_VERSION 0x01U
\r
71 #define DESFIRE_EV1_HW_MINOR_VERSION 0x00U
\r
72 #define DESFIRE_EV1_SW_MAJOR_VERSION 0x01U
\r
73 #define DESFIRE_EV1_SW_MINOR_VERSION 0x03U
\r
75 /* The below values are received for the command GET VERSION */
\r
76 #define DESFIRE_TAG_SIZE_IDENTIFIER_2K 0x16U
\r
77 #define DESFIRE_TAG_SIZE_IDENTIFIER_4K 0x18U
\r
78 #define DESFIRE_TAG_SIZE_IDENTIFIER_8K 0x1AU
\r
80 #define DESFIRE_2K_CARD 2048U
\r
81 #define DESFIRE_4K_CARD 4096U
\r
82 #define DESFIRE_8K_CARD 7680U
\r
84 #define DESFIRE_EV1_KEY_SETTINGS_2 0x21U
\r
86 #define DESFIRE_EV1_FIRST_AID_BYTE 0x01U
\r
87 #define DESFIRE_EV1_SECOND_AID_BYTE 0x00U
\r
88 #define DESFIRE_EV1_THIRD_AID_BYTE 0x00U
\r
90 #define DESFIRE_EV1_FIRST_ISO_FILE_ID 0x05U
\r
91 #define DESFIRE_EV1_SECOND_ISO_FILE_ID 0xE1U
\r
93 #define DESFIRE_EV1_ISO_APP_DF_NAME {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01}
\r
95 #define DESFIRE_EV1_CC_FILE_ID 0x01U
\r
96 #define DESFIRE_EV1_FIRST_CC_FILE_ID_BYTE 0x03U
\r
97 #define DESFIRE_EV1_SECOND_CC_FILE_ID_BYTE 0xE1U
\r
99 #define DESFIRE_EV1_NDEF_FILE_ID 0x02U
\r
100 #define DESFIRE_EV1_FIRST_NDEF_FILE_ID_BYTE 0x04U
\r
101 #define DESFIRE_EV1_SECOND_NDEF_FILE_ID_BYTE 0xE1U
\r
104 #define PH_FRINFC_DESF_STATE_REACTIVATE 0x0FU
\r
106 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
107 /****************************** Macro definitions end ********************************/
\r
108 /* Helper functions to create app/select app/create data file/read /write from the
\r
109 CC file and NDEF files */
\r
110 static void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,uint8_t CmdType);
\r
112 /* Gets H/W version details*/
\r
113 static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
115 /* Gets S/W version details*/
\r
116 static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
118 /* Updates the version details to context structure*/
\r
119 static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
121 /*Gets UID details*/
\r
122 static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt);
\r
124 /*Creates Application*/
\r
125 static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
127 /* Selects Application*/
\r
128 static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
130 /*Creates Capability Container File*/
\r
131 static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
133 /* Create NDEF File*/
\r
134 static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
136 /* Writes CC Bytes to CC File*/
\r
137 static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
139 /* Writes NDEF data into NDEF File*/
\r
140 static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
142 /* Transceive Cmd initiation*/
\r
143 static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
145 #ifdef FRINFC_READONLY_NDEF
\r
150 phFriNfc_Desf_HReadOnlySelectCCFile (
\r
151 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
156 phFriNfc_Desf_HReadOnlyReadCCFile (
\r
157 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
161 phFriNfc_Desf_HReadOnlyWriteCCFile (
\r
162 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
166 phFriNfc_Desf_HReadOnlySelectApp (
\r
167 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
169 #ifdef DESFIRE_FMT_EV1
\r
173 phFriNfc_Desf_HReadOnlySelectAppEV1 (
\r
174 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
\r
176 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
178 #endif /* #ifdef FRINFC_READONLY_NDEF */
\r
180 void phFriNfc_Desfire_Reset( phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
182 /* This piece of code may not be useful for the current supported DESFire formatting feature*/
\r
183 /* Currently, s/w doesn't support authenticating either PICC Master key nor NFC Forum
\r
184 Application Master key*/
\r
186 /*NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey[] = PH_FRINFC_SMTCRDFMT_DESF_PICC_MASTER_KEY;
\r
187 NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey[] = PH_FRINFC_SMTCRDFMT_DESF_NFCFORUM_APP_KEY;*/
\r
189 /* reset to zero PICC and NFC FORUM master keys*/
\r
190 (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey,
\r
194 (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey,
\r
197 NdefSmtCrdFmt->AddInfo.Type4Info.PrevState = 0;
\r
202 static void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,uint8_t CmdType)
\r
205 uint16_t i=0, CmdByte=1;
\r
206 uint8_t NdefFileBytes[] = PH_FRINFC_DESF_NDEFFILE_BYTES;
\r
207 uint8_t CCFileBytes[] = PH_FRINFC_DESF_CCFILE_BYTES;
\r
210 /* common elements for all the native commands*/
\r
213 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;
\r
215 /* let the place to store the cmd byte type, point to next index*/
\r
219 /* P1/P2 offsets always set to zero */
\r
220 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;
\r
222 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;
\r
227 case PH_FRINFC_DESF_GET_HW_VERSION_CMD :
\r
228 case PH_FRINFC_DESF_GET_SW_VERSION_CMD :
\r
229 case PH_FRINFC_DESF_GET_UID_CMD :
\r
231 if (CmdType == PH_FRINFC_DESF_GET_HW_VERSION_CMD )
\r
233 /* Instruction Cmd code */
\r
234 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_GET_VER_CMD;
\r
238 /* Instruction Cmd code */
\r
239 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP;
\r
242 /* Lc: Length of wrapped data */
\r
243 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
246 /* NO Data to send in this cmd*/
\r
247 /* we are not suppose to set Le*/
\r
248 /* set the length of the buffer*/
\r
249 NdefSmtCrdFmt->SendLength = i;
\r
254 case PH_FRINFC_DESF_CREATEAPP_CMD:
\r
256 #ifdef DESFIRE_FMT_EV1
\r
257 uint8_t df_name[] = DESFIRE_EV1_ISO_APP_DF_NAME;
\r
258 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
260 /* Instruction Cmd code */
\r
261 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_AID_CMD;
\r
263 #ifdef DESFIRE_FMT_EV1
\r
264 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
266 /* Lc: Length of wrapped data,
\r
267 here the magic number 2 is for the ISO File ID for the application */
\r
268 NdefSmtCrdFmt->SendRecvBuf[i] = (uint8_t)(PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN +
\r
269 sizeof (df_name) + 2);
\r
271 /* NFC FORUM APPLICATION ID*/
\r
272 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_AID_BYTE;
\r
274 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_AID_BYTE;
\r
276 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_THIRD_AID_BYTE;
\r
280 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
282 /* Lc: Length of wrapped data */
\r
283 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN;
\r
285 /* NFC FORUM APPLICATION ID*/
\r
286 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE;
\r
288 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE;
\r
290 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE;
\r
293 /* set key settings and number of keys*/
\r
294 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_PICC_NFC_KEY_SETTING;
\r
296 #ifdef DESFIRE_FMT_EV1
\r
297 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
299 /* set key settings and number of keys*/
\r
300 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_KEY_SETTINGS_2;
\r
304 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
306 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NFCFORUM_APP_NO_OF_KEYS;
\r
310 #ifdef DESFIRE_FMT_EV1
\r
311 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
314 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_ISO_FILE_ID;
\r
316 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_ISO_FILE_ID;
\r
319 (void)memcpy ((void *)&NdefSmtCrdFmt->SendRecvBuf[i],
\r
320 (void *)df_name, sizeof (df_name));
\r
321 i = (uint16_t)(i + sizeof (df_name));
\r
323 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
326 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
329 #ifdef DESFIRE_FMT_EV1
\r
330 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
332 /* set the length of the buffer*/
\r
333 NdefSmtCrdFmt->SendLength = i;
\r
336 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
338 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATEAPP_CMD_SNLEN;
\r
343 case PH_FRINFC_DESF_SELECTAPP_CMD:
\r
345 /* Instruction Cmd code */
\r
346 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_SLECT_APP_CMD;
\r
348 /* Lc: Length of wrapped data */
\r
349 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_SLAPP_WRDT_LEN;
\r
352 #ifdef DESFIRE_FMT_EV1
\r
353 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
356 /* set the send buffer to create the application identifier*/
\r
357 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_AID_BYTE;
\r
360 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_AID_BYTE;
\r
363 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_THIRD_AID_BYTE;
\r
367 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
370 /* set the send buffer to create the application identifier*/
\r
371 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE;
\r
374 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE;
\r
377 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE;
\r
382 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
385 /* set the length of the buffer*/
\r
386 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_SELECTAPP_CMD_SNLEN;
\r
390 case PH_FRINFC_DESF_CREATECC_CMD:
\r
392 /* Instruction Cmd code */
\r
393 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD;
\r
395 #ifdef DESFIRE_FMT_EV1
\r
396 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
398 /* Lc: Length of wrapped data,
\r
399 here the magic number 2 is added as part of the ISO File ID in the packet */
\r
400 NdefSmtCrdFmt->SendRecvBuf[i] = (uint8_t)
\r
401 (PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN + 2);
\r
403 /* set cc file id* */
\r
404 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
\r
407 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_CC_FILE_ID_BYTE;
\r
409 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_CC_FILE_ID_BYTE;
\r
413 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
415 /* Lc: Length of wrapped data */
\r
416 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN;
\r
418 /* set cc file id*/
\r
419 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
\r
423 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS;
\r
426 /* set the Access Rights are set to full read/write, full cntrl*/
\r
427 NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
\r
429 NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
\r
432 /* set the file size*/
\r
433 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
\r
435 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
437 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
441 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
443 #ifdef DESFIRE_FMT_EV1
\r
444 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
446 /* set the length of the buffer*/
\r
447 NdefSmtCrdFmt->SendLength = i;
\r
450 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
452 /* set the length of the buffer*/
\r
453 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN;
\r
458 case PH_FRINFC_DESF_CREATENDEF_CMD:
\r
460 /* Instruction Cmd code */
\r
461 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD;
\r
463 #ifdef DESFIRE_FMT_EV1
\r
464 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
466 /* Lc: Length of wrapped data,
\r
467 here the magic number 2 is added as part of the ISO File ID in the packet */
\r
468 NdefSmtCrdFmt->SendRecvBuf[i] = (uint8_t)
\r
469 (PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN + 2);
\r
471 /* set NDEF file id* */
\r
472 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_NDEF_FILE_ID;
\r
475 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_NDEF_FILE_ID_BYTE;
\r
477 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_NDEF_FILE_ID_BYTE;
\r
481 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
483 /* Lc: Length of wrapped data */
\r
484 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN;
\r
487 /* set NDEF file id*/
\r
488 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID;
\r
491 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS;
\r
494 /* set the r/w access rights.Once Authentication part is fixed,
\r
495 we will use the constants*/
\r
496 NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
\r
498 NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;
\r
501 NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)NdefSmtCrdFmt->AddInfo.Type4Info.CardSize;
\r
503 NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)
\r
504 (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 8);
\r
506 NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)
\r
507 (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 16);
\r
511 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
514 #ifdef DESFIRE_FMT_EV1
\r
515 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
517 /* set the length of the buffer*/
\r
518 NdefSmtCrdFmt->SendLength = i;
\r
521 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
523 /* set the length of the buffer*/
\r
524 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN;
\r
529 case PH_FRINFC_DESF_WRITECC_CMD:
\r
531 /* Instruction Cmd code */
\r
532 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD;
\r
534 /* Lc: Length of wrapped data */
\r
535 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN;
\r
538 #ifdef DESFIRE_FMT_EV1
\r
539 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
541 /* set the file id*/
\r
542 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
\r
546 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
548 /* set the file id*/
\r
549 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
\r
553 /* set the offset to zero*/
\r
554 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
556 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
558 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
561 /* Set the length of data available to write*/
\r
562 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
\r
564 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
566 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
568 #ifdef DESFIRE_FMT_EV1
\r
569 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
571 CCFileBytes[2] = (uint8_t)DESFIRE_EV1_MAPPING_VERSION;
\r
573 /* Length value is updated in the CC as per the card size received from
\r
574 the GetVersion command */
\r
575 CCFileBytes[11] = (uint8_t)
\r
576 (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 8);
\r
577 CCFileBytes[12] = (uint8_t)
\r
578 (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize);
\r
580 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
581 /*set the data to be written to the CC file*/
\r
582 (void)memcpy ((void *)&NdefSmtCrdFmt->SendRecvBuf[i],
\r
583 (void *)CCFileBytes, sizeof (CCFileBytes));
\r
584 #ifdef DESFIRE_FMT_EV1
\r
587 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
589 i = (uint16_t)(i + sizeof (CCFileBytes));
\r
592 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
594 #ifdef DESFIRE_FMT_EV1
\r
595 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
597 NdefSmtCrdFmt->SendLength = i;
\r
600 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
602 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN;
\r
607 case PH_FRINFC_DESF_WRITENDEF_CMD:
\r
609 /* Instruction Cmd code */
\r
610 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD;
\r
612 /* Lc: Length of wrapped data */
\r
613 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRNDEF_WRDT_LEN;
\r
616 #ifdef DESFIRE_FMT_EV1
\r
617 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
619 /* set the file id*/
\r
620 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_NDEF_FILE_ID;
\r
624 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
626 /* set the file id*/
\r
627 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID;
\r
631 /* set the offset to zero*/
\r
632 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
634 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
636 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
639 /* Set the length of data available to write*/
\r
640 NdefSmtCrdFmt->SendRecvBuf[i] = 0x02;
\r
642 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
644 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
647 /*set the data to be written to the CC file*/
\r
649 (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[i],
\r
650 NdefFileBytes, sizeof (NdefFileBytes));
\r
651 i = (uint16_t)(i + sizeof (NdefFileBytes));
\r
654 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
657 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITENDEF_CMD_SNLEN;
\r
668 static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
670 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
671 #ifdef PH_HAL4_ENABLE
\r
672 /* Removed uint8_t i=0; */
\r
675 #endif /* #ifdef PH_HAL4_ENABLE */
\r
678 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_HW_VERSION;
\r
680 /* Helper routine to wrap the native DESFire cmds*/
\r
681 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_HW_VERSION_CMD);
\r
683 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
688 static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
691 NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
692 NFCSTATUS_FORMAT_ERROR);
\r
694 if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- 1] ==
\r
695 PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) )
\r
698 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_SW_VERSION;
\r
700 /* Helper routine to wrap the native DESFire cmds*/
\r
701 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_SW_VERSION_CMD);
\r
703 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
708 static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
710 NFCSTATUS status = PHNFCSTVAL(CID_NFC_NONE,
\r
711 NFCSTATUS_SUCCESS);
\r
713 if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)-
\r
714 PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP ) )
\r
716 NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion = NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL3];
\r
717 NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion = NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL4];
\r
719 if ((PH_FRINFC_DESF4_MAJOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion) &&
\r
720 (PH_FRINFC_DESF4_MINOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion))
\r
722 /* card size of DESFire4 type */
\r
723 NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = PH_FRINFC_DESF4_MEMORY_SIZE;
\r
726 #ifdef DESFIRE_FMT_EV1
\r
727 else if ((DESFIRE_EV1_SW_MAJOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion) &&
\r
728 (DESFIRE_EV1_SW_MINOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion))
\r
730 NdefSmtCrdFmt->CardType = DESFIRE_CARD_TYPE_EV1;
\r
732 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
735 // need to handle the Desfire8 type cards
\r
736 // need to use get free memory
\r
737 status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
738 NFCSTATUS_INVALID_REMOTE_DEVICE);
\r
741 #ifdef DESFIRE_FMT_EV1
\r
742 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
744 switch (NdefSmtCrdFmt->SendRecvBuf[5])
\r
746 case DESFIRE_TAG_SIZE_IDENTIFIER_2K:
\r
748 NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_2K_CARD;
\r
752 case DESFIRE_TAG_SIZE_IDENTIFIER_4K:
\r
754 NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_4K_CARD;
\r
758 case DESFIRE_TAG_SIZE_IDENTIFIER_8K:
\r
760 NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_8K_CARD;
\r
766 status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
767 NFCSTATUS_INVALID_REMOTE_DEVICE);
\r
772 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
778 static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt)
\r
781 NFCSTATUS status = NFCSTATUS_PENDING;
\r
782 if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)-
\r
783 PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) )
\r
786 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_UID;
\r
788 /* Helper routine to wrap the native desfire cmds*/
\r
789 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_UID_CMD);
\r
791 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
799 static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
801 NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
802 NFCSTATUS_FORMAT_ERROR);
\r
804 if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL14] == PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE)
\r
805 && (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL15] == PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE ))
\r
808 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_AID;
\r
810 /* Helper routine to wrap the native DESFire cmds*/
\r
811 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATEAPP_CMD);
\r
813 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
819 static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
822 NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
823 NFCSTATUS_FORMAT_ERROR);
\r
825 /* check for the response of previous operation, before
\r
826 issuing the next command*/
\r
828 if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE) &&
\r
829 (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE ))
\r
832 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_SELECT_APP;
\r
834 /* Helper routine to wrap the native DESFire cmds*/
\r
835 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_SELECTAPP_CMD);
\r
837 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
843 static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
845 NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
846 NFCSTATUS_FORMAT_ERROR);
\r
848 if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
\r
849 (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
\r
852 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_CCFILE;
\r
854 /* Helper routine to wrap the native DESFire cmds*/
\r
855 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATECC_CMD);
\r
857 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
862 static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
865 NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
866 NFCSTATUS_FORMAT_ERROR);
\r
868 if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
\r
869 (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
\r
872 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_NDEFFILE;
\r
874 /* Helper routine to wrap the native desfire cmds*/
\r
875 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATENDEF_CMD);
\r
877 status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
885 static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
888 NFCSTATUS result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
889 NFCSTATUS_FORMAT_ERROR);
\r
890 if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
\r
891 (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
\r
895 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_CC_FILE;
\r
897 /* Helper routine to wrap the native DESFire cmds*/
\r
898 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITECC_CMD);
\r
900 result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
905 static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
908 NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
909 NFCSTATUS_FORMAT_ERROR);
\r
912 if ( (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0] == PH_FRINFC_DESF_NATIVE_RESP_BYTE1) &&
\r
913 (NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1] == PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ))
\r
916 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE;
\r
918 /* Helper routine to wrap the native DESFire cmds*/
\r
919 phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITENDEF_CMD);
\r
921 Result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);
\r
926 static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
929 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
931 /* set the command type*/
\r
932 #ifdef PH_HAL4_ENABLE
\r
933 NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_Raw;
\r
935 NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_CmdListTClCmd;
\r
936 #endif /* #ifdef PH_HAL4_ENABLE */
\r
938 /* set the Additional Info*/
\r
939 NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0;
\r
940 NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0;
\r
942 /*set the completion routines for the desfire card operations*/
\r
943 NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.CompletionRoutine = phFriNfc_NdefSmtCrd_Process;
\r
944 NdefSmtCrdFmt->SmtCrdFmtCompletionInfo.Context = NdefSmtCrdFmt;
\r
946 /* set the receive length */
\r
947 *NdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE;
\r
950 /*Call the Overlapped HAL Transceive function */
\r
951 status = phFriNfc_OvrHal_Transceive(NdefSmtCrdFmt->LowerDevice,
\r
952 &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
\r
953 NdefSmtCrdFmt->psRemoteDevInfo,
\r
954 NdefSmtCrdFmt->Cmd,
\r
955 &NdefSmtCrdFmt->psDepAdditionalInfo,
\r
956 NdefSmtCrdFmt->SendRecvBuf,
\r
957 NdefSmtCrdFmt->SendLength,
\r
958 NdefSmtCrdFmt->SendRecvBuf,
\r
959 NdefSmtCrdFmt->SendRecvLength);
\r
966 NFCSTATUS phFriNfc_Desfire_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
969 NFCSTATUS status = NFCSTATUS_SUCCESS;
\r
970 #ifdef DESFIRE_FMT_EV1
\r
971 NdefSmtCrdFmt->CardType = 0;
\r
972 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
973 status = phFriNfc_Desf_HGetHWVersion(NdefSmtCrdFmt);
\r
977 #ifdef FRINFC_READONLY_NDEF
\r
982 phFriNfc_Desf_HReadOnlySelectCCFile (
\r
983 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
985 NFCSTATUS result = NFCSTATUS_SUCCESS;
\r
992 phFriNfc_Desf_HReadOnlyReadCCFile (
\r
993 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
995 NFCSTATUS result = NFCSTATUS_SUCCESS;
\r
998 if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
\r
999 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
\r
1000 && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
\r
1001 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
\r
1003 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_READ_CC_FILE;
\r
1006 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;
\r
1009 /* let the place to store the cmd byte type, point to next index
\r
1010 Instruction Cmd code */
\r
1011 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_READ_DATA_CMD;
\r
1015 /* P1/P2 offsets always set to zero */
\r
1016 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;
\r
1018 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;
\r
1021 /* Lc: Length of wrapped data */
\r
1022 NdefSmtCrdFmt->SendRecvBuf[i] = NATIVE_WRAPPER_READ_DATA_LC_VALUE;
\r
1025 #ifdef DESFIRE_FMT_EV1
\r
1026 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
1028 /* set the file id*/
\r
1029 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
\r
1033 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1035 /* set the file id*/
\r
1036 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
\r
1040 /* set the offset to zero*/
\r
1041 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1043 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1045 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1048 /* Set the length of data available to read */
\r
1049 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
\r
1051 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1053 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1056 /* Le Value is set 0 */
\r
1057 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
1060 NdefSmtCrdFmt->SendLength = i;
\r
1062 result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
\r
1066 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
1067 NFCSTATUS_FORMAT_ERROR);
\r
1075 phFriNfc_Desf_HReadOnlyWriteCCFile (
\r
1076 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
1078 NFCSTATUS result = NFCSTATUS_SUCCESS;
\r
1079 uint8_t read_cc_btyes[CC_BYTES_SIZE] = {0};
\r
1082 if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
\r
1083 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
\r
1084 && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
\r
1085 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
\r
1087 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE;
\r
1089 memcpy ((void *)read_cc_btyes, (void *)NdefSmtCrdFmt->SendRecvBuf,
\r
1090 sizeof (read_cc_btyes));
\r
1091 read_cc_btyes[(sizeof (read_cc_btyes) - 1)] = READ_ONLY_NDEF_DESFIRE;
\r
1094 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;
\r
1097 /* let the place to store the cmd byte type, point to next index
\r
1098 Instruction Cmd code */
\r
1099 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_WRITE_CMD;
\r
1103 /* P1/P2 offsets always set to zero */
\r
1104 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;
\r
1106 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;
\r
1109 /* Lc: Length of wrapped data */
\r
1110 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN;
\r
1113 #ifdef DESFIRE_FMT_EV1
\r
1114 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
1116 /* set the file id*/
\r
1117 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;
\r
1121 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1123 /* set the file id*/
\r
1124 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;
\r
1128 /* set the offset to zero*/
\r
1129 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1131 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1133 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1136 /* Set the length of data available to write*/
\r
1137 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;
\r
1139 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1141 NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;
\r
1144 /*set the data to be written to the CC file*/
\r
1145 (void)memcpy ((void *)&NdefSmtCrdFmt->SendRecvBuf[i],
\r
1146 (void *)read_cc_btyes, sizeof (read_cc_btyes));
\r
1147 #ifdef DESFIRE_FMT_EV1
\r
1150 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1152 i = (uint16_t)(i + sizeof (read_cc_btyes));
\r
1155 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;
\r
1157 #ifdef DESFIRE_FMT_EV1
\r
1158 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
1160 NdefSmtCrdFmt->SendLength = i;
\r
1163 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1165 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN;
\r
1168 result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
\r
1172 result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
1173 NFCSTATUS_FORMAT_ERROR);
\r
1181 phFriNfc_Desf_HReadOnlySelectApp (
\r
1182 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
1184 NFCSTATUS result = NFCSTATUS_SUCCESS;
\r
1186 NdefSmtCrdFmt->CardType = 0;
\r
1188 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_SELECT_APP;
\r
1190 /* Helper routine to wrap the native DESFire cmds */
\r
1191 phFriNfc_Desf_HWrapISONativeCmds (NdefSmtCrdFmt, PH_FRINFC_DESF_SELECTAPP_CMD);
\r
1193 result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
\r
1198 #ifdef DESFIRE_FMT_EV1
\r
1201 phFriNfc_Desf_HReadOnlySelectAppEV1 (
\r
1202 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
1204 NFCSTATUS result = NFCSTATUS_SUCCESS;
\r
1206 NdefSmtCrdFmt->CardType = DESFIRE_CARD_TYPE_EV1;
\r
1208 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1;
\r
1210 /* Helper routine to wrap the native DESFire cmds */
\r
1211 phFriNfc_Desf_HWrapISONativeCmds (NdefSmtCrdFmt, PH_FRINFC_DESF_SELECTAPP_CMD);
\r
1213 result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);
\r
1217 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1220 phFriNfc_Desfire_ConvertToReadOnly (
\r
1221 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
\r
1223 NFCSTATUS result = NFCSTATUS_SUCCESS;
\r
1225 #ifdef DESFIRE_FMT_EV1
\r
1226 result = phFriNfc_Desf_HReadOnlySelectAppEV1 (NdefSmtCrdFmt);
\r
1228 result = phFriNfc_Desf_HReadOnlySelectApp (NdefSmtCrdFmt);
\r
1229 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1234 #endif /* #ifdef FRINFC_READONLY_NDEF */
\r
1236 void phFriNfc_Desf_Process( void *Context,
\r
1240 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt;
\r
1242 NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context;
\r
1244 if((NFCSTATUS_SUCCESS & PHNFCSTBLOWER) == (Status & PHNFCSTBLOWER))
\r
1246 switch(NdefSmtCrdFmt->State)
\r
1248 #ifdef FRINFC_READONLY_NDEF
\r
1249 #ifdef DESFIRE_FMT_EV1
\r
1250 case PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1:
\r
1252 if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
\r
1253 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
\r
1254 && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
\r
1255 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
\r
1257 Status = phFriNfc_Desf_HReadOnlyReadCCFile (NdefSmtCrdFmt);
\r
1261 Status = phFriNfc_Desf_HReadOnlySelectApp (NdefSmtCrdFmt);
\r
1265 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1267 case PH_FRINFC_DESF_STATE_RO_SELECT_APP:
\r
1269 Status = phFriNfc_Desf_HReadOnlyReadCCFile (NdefSmtCrdFmt);
\r
1273 case PH_FRINFC_DESF_STATE_RO_READ_CC_FILE:
\r
1275 Status = phFriNfc_Desf_HReadOnlyWriteCCFile (NdefSmtCrdFmt);
\r
1279 case PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE:
\r
1281 if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
\r
1282 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 2)])
\r
1283 && (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
\r
1284 NdefSmtCrdFmt->SendRecvBuf[(*NdefSmtCrdFmt->SendRecvLength - 1)]))
\r
1286 /* SUCCESSFULL Formatting */
\r
1287 #ifdef DESFIRE_FMT_EV1
\r
1288 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
1290 Status = phFriNfc_OvrHal_Reconnect (
\r
1291 NdefSmtCrdFmt->LowerDevice,
\r
1292 &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
\r
1293 NdefSmtCrdFmt->psRemoteDevInfo);
\r
1295 if (NFCSTATUS_PENDING == Status)
\r
1297 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_REACTIVATE;
\r
1300 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1304 Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
1305 NFCSTATUS_FORMAT_ERROR);
\r
1310 #endif /* #ifdef FRINFC_READONLY_NDEF */
\r
1311 case PH_FRINFC_DESF_STATE_GET_HW_VERSION:
\r
1313 /* Check and store the h/w and s/w specific details.
\r
1314 Ex: Major/Minor version, memory storage info. */
\r
1316 Status = phFriNfc_Desf_HGetSWVersion (NdefSmtCrdFmt);
\r
1321 case PH_FRINFC_DESF_STATE_GET_SW_VERSION:
\r
1323 /* Check and store the h/w and s/w specific details.
\r
1324 Ex: Major/Minor version, memory storage info. */
\r
1326 Status = phFriNfc_Desf_HUpdateVersionDetails (NdefSmtCrdFmt);
\r
1327 if ( Status == NFCSTATUS_SUCCESS )
\r
1329 Status = phFriNfc_Desf_HGetUIDDetails (NdefSmtCrdFmt);
\r
1334 case PH_FRINFC_DESF_STATE_GET_UID:
\r
1336 Status = phFriNfc_Desf_HCreateApp (NdefSmtCrdFmt);
\r
1340 case PH_FRINFC_DESF_STATE_CREATE_AID:
\r
1342 Status = phFriNfc_Desf_HSelectApp (NdefSmtCrdFmt);
\r
1346 case PH_FRINFC_DESF_STATE_SELECT_APP:
\r
1348 Status = phFriNfc_Desf_HCreatCCFile (NdefSmtCrdFmt);
\r
1352 case PH_FRINFC_DESF_STATE_CREATE_CCFILE:
\r
1354 Status = phFriNfc_Desf_HCreatNDEFFile (NdefSmtCrdFmt);
\r
1358 case PH_FRINFC_DESF_STATE_CREATE_NDEFFILE:
\r
1360 Status = phFriNfc_Desf_HWrCCBytes (NdefSmtCrdFmt);
\r
1364 case PH_FRINFC_DESF_STATE_WRITE_CC_FILE:
\r
1366 Status = phFriNfc_Desf_HWrNDEFData (NdefSmtCrdFmt);
\r
1370 case PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE:
\r
1372 if ((PH_FRINFC_DESF_NATIVE_RESP_BYTE1 ==
\r
1373 NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL0]) &&
\r
1374 (PH_FRINFC_DESF_NATIVE_RESP_BYTE2 ==
\r
1375 NdefSmtCrdFmt->SendRecvBuf[PH_SMTCRDFMT_DESF_VAL1]))
\r
1377 NdefSmtCrdFmt->CardState = 0;
\r
1378 #ifdef DESFIRE_FMT_EV1
\r
1379 if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)
\r
1381 Status = phFriNfc_OvrHal_Reconnect (
\r
1382 NdefSmtCrdFmt->LowerDevice,
\r
1383 &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo,
\r
1384 NdefSmtCrdFmt->psRemoteDevInfo);
\r
1386 if (NFCSTATUS_PENDING == Status)
\r
1388 NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_REACTIVATE;
\r
1392 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1394 Status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);
\r
1400 #ifdef DESFIRE_FMT_EV1
\r
1401 case PH_FRINFC_DESF_STATE_REACTIVATE:
\r
1406 #endif /* #ifdef DESFIRE_FMT_EV1 */
\r
1410 /*set the invalid state*/
\r
1411 Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,
\r
1412 NFCSTATUS_INVALID_DEVICE_REQUEST);
\r
1417 /* Handle the all the error cases*/
\r
1418 if ((NFCSTATUS_PENDING & PHNFCSTBLOWER) != (Status & PHNFCSTBLOWER))
\r
1420 /* call respective CR */
\r
1421 phFriNfc_SmtCrdFmt_HCrHandler(NdefSmtCrdFmt,Status);
\r