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