merge with master
[adaptation/devices/nfc-plugin-nxp.git] / src / phFriNfc_DesfireFormat.c
1 /*\r
2  * Copyright (C) 2010 NXP Semiconductors\r
3  *\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
7  *\r
8  *      http://www.apache.org/licenses/LICENSE-2.0\r
9  *\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
15  */\r
16 \r
17 /*!\r
18 * \file  phFriNfc_DesfireFormat.c\r
19 * \brief This component encapsulates different format functinalities ,\r
20 *        for the Type4/Desfire card. \r
21 *\r
22 * Project: NFC-FRI\r
23 *\r
24 * $Date: Thu Oct 28 17:44:00 2010 $\r
25 * $Author: ing02260 $\r
26 * $Revision: 1.8 $\r
27 * $Aliases:  $\r
28 *\r
29 */\r
30 #include <phNfcTypes.h>\r
31 #include <phFriNfc_OvrHal.h>\r
32 #include <phFriNfc_SmtCrdFmt.h>\r
33 #include <phFriNfc_DesfireFormat.h>\r
34 \r
35 \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
39 2. Select File\r
40 3. Get version\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
44 \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
50 \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
54 \r
55 #ifdef FRINFC_READONLY_NDEF\r
56 \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
61 \r
62 #endif /* #ifdef FRINFC_READONLY_NDEF */\r
63 \r
64 #ifdef DESFIRE_FMT_EV1\r
65 \r
66 #define DESFIRE_CARD_TYPE_EV1                               0x01U\r
67 \r
68 #define DESFIRE_EV1_MAPPING_VERSION                         0x20U\r
69 \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
74 \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
79 \r
80 #define DESFIRE_2K_CARD                                     2048U\r
81 #define DESFIRE_4K_CARD                                     4096U\r
82 #define DESFIRE_8K_CARD                                     7680U\r
83 \r
84 #define DESFIRE_EV1_KEY_SETTINGS_2                          0x21U\r
85 \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
89 \r
90 #define DESFIRE_EV1_FIRST_ISO_FILE_ID                       0x05U\r
91 #define DESFIRE_EV1_SECOND_ISO_FILE_ID                      0xE1U\r
92 \r
93 #define DESFIRE_EV1_ISO_APP_DF_NAME                         {0xD2, 0x76, 0x00, 0x00, 0x85, 0x01, 0x01}\r
94 \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
98 \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
102 \r
103 \r
104 #define PH_FRINFC_DESF_STATE_REACTIVATE                     0x0FU\r
105 \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
111 \r
112 /* Gets H/W version details*/\r
113 static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
114 \r
115 /* Gets S/W version details*/\r
116 static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
117 \r
118 /* Updates the version details to context structure*/\r
119 static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
120 \r
121 /*Gets UID details*/\r
122 static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt);\r
123 \r
124 /*Creates Application*/\r
125 static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
126 \r
127 /* Selects Application*/\r
128 static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
129 \r
130 /*Creates Capability Container File*/\r
131 static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
132 \r
133 /* Create NDEF File*/\r
134 static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
135 \r
136 /* Writes CC Bytes to CC File*/\r
137 static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
138 \r
139 /* Writes NDEF data into NDEF File*/\r
140 static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
141 \r
142 /* Transceive Cmd initiation*/\r
143 static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);\r
144 \r
145 #ifdef FRINFC_READONLY_NDEF\r
146 \r
147 #if 0\r
148 static \r
149 NFCSTATUS \r
150 phFriNfc_Desf_HReadOnlySelectCCFile (\r
151     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
152 #endif /* #if 0 */\r
153 \r
154 static \r
155 NFCSTATUS \r
156 phFriNfc_Desf_HReadOnlyReadCCFile (\r
157     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
158 \r
159 static \r
160 NFCSTATUS \r
161 phFriNfc_Desf_HReadOnlyWriteCCFile (\r
162     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
163 \r
164 static \r
165 NFCSTATUS \r
166 phFriNfc_Desf_HReadOnlySelectApp (\r
167     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
168 \r
169 #ifdef DESFIRE_FMT_EV1\r
170 \r
171 static \r
172 NFCSTATUS \r
173 phFriNfc_Desf_HReadOnlySelectAppEV1 (\r
174     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);\r
175 \r
176 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
177 \r
178 #endif /* #ifdef FRINFC_READONLY_NDEF */\r
179 \r
180 void phFriNfc_Desfire_Reset( phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)\r
181 {\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
185 \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
188 \r
189     /* reset to zero PICC and NFC FORUM master keys*/\r
190     (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.PICCMasterKey, \r
191                 0x00,\r
192                                                                 16);\r
193 \r
194     (void)memset((void *)NdefSmtCrdFmt->AddInfo.Type4Info.NFCForumMasterkey,\r
195                 0x00,\r
196                                                                 16);\r
197     NdefSmtCrdFmt->AddInfo.Type4Info.PrevState = 0;\r
198 \r
199 }\r
200 \r
201 \r
202 static void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt,uint8_t CmdType)\r
203 {\r
204 \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
208     \r
209 \r
210     /* common elements for all the native commands*/\r
211 \r
212     /* Class Byte */\r
213     NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;\r
214 \r
215     /* let the place to store the cmd byte type, point to next index*/\r
216     i += 2;\r
217 \r
218     \r
219     /* P1/P2 offsets always set to zero */\r
220     NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;\r
221     i++;\r
222     NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;\r
223     i++;\r
224 \r
225     switch(CmdType)\r
226     {\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
230         {\r
231             if (CmdType == PH_FRINFC_DESF_GET_HW_VERSION_CMD )\r
232             {\r
233                 /* Instruction Cmd code */\r
234                 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_GET_VER_CMD;\r
235             }\r
236             else\r
237             {\r
238                 /* Instruction Cmd code */\r
239                 NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP;\r
240             }\r
241             \r
242             /*  Lc: Length of wrapped data */\r
243             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
244             i++;\r
245 \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
250 \r
251             break;\r
252         }\r
253 \r
254         case PH_FRINFC_DESF_CREATEAPP_CMD:\r
255         {\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
259 \r
260             /* Instruction Cmd code */\r
261             NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_AID_CMD;\r
262             \r
263 #ifdef DESFIRE_FMT_EV1\r
264             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
265             {\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
270                 i++;\r
271                 /* NFC FORUM APPLICATION ID*/\r
272                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_AID_BYTE;\r
273                 i++;\r
274                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_AID_BYTE;\r
275                 i++;\r
276                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_THIRD_AID_BYTE;\r
277                 i++;\r
278             }\r
279             else\r
280 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
281             {\r
282                 /*  Lc: Length of wrapped data */\r
283                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN;\r
284                 i++;\r
285                 /* NFC FORUM APPLICATION ID*/\r
286                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE;\r
287                 i++;\r
288                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE;\r
289                 i++;\r
290                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE;\r
291                 i++;\r
292             }\r
293             /* set key settings and number of keys*/\r
294             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_PICC_NFC_KEY_SETTING;\r
295             i++;\r
296 #ifdef DESFIRE_FMT_EV1\r
297             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
298             {\r
299                 /* set key settings and number of keys*/\r
300                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_KEY_SETTINGS_2;\r
301                 i++;\r
302             }\r
303             else\r
304 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
305             {\r
306                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NFCFORUM_APP_NO_OF_KEYS;\r
307                 i++;\r
308             }\r
309 \r
310 #ifdef DESFIRE_FMT_EV1\r
311             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
312             {\r
313                 /* ISO File ID */\r
314                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_ISO_FILE_ID;\r
315                 i++;\r
316                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_ISO_FILE_ID;\r
317                 i++;\r
318                 /* DF file name */\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
322             }\r
323 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
324 \r
325             /* Le bytes*/\r
326             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
327             i++;\r
328 \r
329 #ifdef DESFIRE_FMT_EV1\r
330             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
331             {\r
332                 /* set the length of the buffer*/\r
333                 NdefSmtCrdFmt->SendLength = i;\r
334             }\r
335             else\r
336 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
337             {\r
338                 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATEAPP_CMD_SNLEN;\r
339             }\r
340             break;\r
341         }\r
342 \r
343         case PH_FRINFC_DESF_SELECTAPP_CMD:\r
344         {\r
345             /* Instruction Cmd code */\r
346             NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_SLECT_APP_CMD;\r
347 \r
348             /*  Lc: Length of wrapped data */\r
349             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_SLAPP_WRDT_LEN;\r
350             i++;\r
351 \r
352 #ifdef DESFIRE_FMT_EV1\r
353             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
354             {\r
355                 /* Data*/\r
356                 /* set the send buffer to create the application identifier*/\r
357                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_AID_BYTE;\r
358                 i++;\r
359 \r
360                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_AID_BYTE;\r
361                 i++;\r
362 \r
363                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_THIRD_AID_BYTE;\r
364                 i++;\r
365             }\r
366             else\r
367 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
368             {\r
369                 /* Data*/\r
370                 /* set the send buffer to create the application identifier*/\r
371                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_FIRST_AID_BYTE;\r
372                 i++;\r
373 \r
374                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_SEC_AID_BYTE;\r
375                 i++;\r
376 \r
377                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_THIRD_AID_BYTE;\r
378                 i++;\r
379             }\r
380 \r
381             /* Le bytes*/\r
382             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
383             i++;\r
384 \r
385             /* set the length of the buffer*/\r
386             NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_SELECTAPP_CMD_SNLEN;        \r
387             break;\r
388         }\r
389 \r
390         case PH_FRINFC_DESF_CREATECC_CMD:\r
391         {\r
392             /* Instruction Cmd code */\r
393             NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD;\r
394             \r
395 #ifdef DESFIRE_FMT_EV1\r
396             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
397             {\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
402                 i++;\r
403                 /*  set cc file id* */\r
404                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;\r
405                 i++;\r
406                 /* ISO File ID */\r
407                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_CC_FILE_ID_BYTE;\r
408                 i++;\r
409                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_CC_FILE_ID_BYTE;\r
410                 i++;\r
411             }\r
412             else\r
413 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
414             {\r
415                 /*  Lc: Length of wrapped data */\r
416                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN;\r
417                 i++;\r
418                 /* set cc file id*/\r
419                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;\r
420                 i++;\r
421             }\r
422             \r
423             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS;\r
424             i++;\r
425 \r
426             /* set the Access Rights are set to full read/write, full cntrl*/\r
427             NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;\r
428             i++;\r
429             NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;\r
430             i++;\r
431 \r
432             /* set the file size*/\r
433             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;\r
434             i++;\r
435             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
436             i++;\r
437             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
438             i++;\r
439 \r
440             /* Le bytes*/\r
441             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
442             i++;\r
443 #ifdef DESFIRE_FMT_EV1\r
444             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
445             {\r
446                 /* set the length of the buffer*/\r
447                 NdefSmtCrdFmt->SendLength = i;\r
448             }\r
449             else\r
450 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
451             {\r
452                 /* set the length of the buffer*/\r
453                 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN;\r
454             }\r
455             break;\r
456         }\r
457 \r
458         case PH_FRINFC_DESF_CREATENDEF_CMD:\r
459         {\r
460             /* Instruction Cmd code */\r
461             NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_CREATE_DATA_FILE_CMD;\r
462 \r
463 #ifdef DESFIRE_FMT_EV1\r
464             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
465             {\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
470                 i++;\r
471                 /*  set NDEF file id* */\r
472                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_NDEF_FILE_ID;\r
473                 i++;\r
474                 /* ISO File ID */\r
475                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_FIRST_NDEF_FILE_ID_BYTE;\r
476                 i++;\r
477                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_SECOND_NDEF_FILE_ID_BYTE;\r
478                 i++;\r
479             }\r
480             else\r
481 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
482             {\r
483                 /*  Lc: Length of wrapped data */\r
484                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN;\r
485                 i++;\r
486 \r
487                 /* set NDEF file id*/\r
488                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID;\r
489                 i++;\r
490             }\r
491             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_COMM_SETTINGS;\r
492             i++;\r
493 \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
497             i++;\r
498             NdefSmtCrdFmt->SendRecvBuf[i] = 0xEE;\r
499             i++;\r
500 \r
501             NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)NdefSmtCrdFmt->AddInfo.Type4Info.CardSize;\r
502             i++;\r
503             NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)\r
504                                     (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 8);\r
505             i++;\r
506             NdefSmtCrdFmt->SendRecvBuf[i]= (uint8_t)\r
507                                     (NdefSmtCrdFmt->AddInfo.Type4Info.CardSize >> 16); \r
508             i++;\r
509             \r
510             /* Le bytes*/\r
511             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
512             i++;\r
513 \r
514 #ifdef DESFIRE_FMT_EV1\r
515             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
516             {\r
517                 /* set the length of the buffer*/\r
518                 NdefSmtCrdFmt->SendLength = i;\r
519             }\r
520             else\r
521 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
522             {\r
523                 /* set the length of the buffer*/\r
524                 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN;\r
525             }\r
526             break;\r
527         }\r
528 \r
529         case PH_FRINFC_DESF_WRITECC_CMD:\r
530         {\r
531             /* Instruction Cmd code */\r
532             NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD;\r
533 \r
534             /*  Lc: Length of wrapped data */\r
535             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN;\r
536             i++;\r
537 \r
538 #ifdef DESFIRE_FMT_EV1\r
539             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
540             {\r
541                 /* set the file id*/\r
542                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;\r
543                 i++;\r
544             }\r
545             else\r
546 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
547             {\r
548                 /* set the file id*/\r
549                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;\r
550                 i++;\r
551             }\r
552 \r
553             /* set the offset to zero*/\r
554             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
555             i++;\r
556             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
557             i++;\r
558             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
559             i++;\r
560 \r
561             /* Set the length of data available to write*/\r
562             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;\r
563             i++;\r
564             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
565             i++;\r
566             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
567             i++;\r
568 #ifdef DESFIRE_FMT_EV1\r
569             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
570             {\r
571                 CCFileBytes[2] = (uint8_t)DESFIRE_EV1_MAPPING_VERSION;\r
572             \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
579             }\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
585 #else\r
586             i++;\r
587 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
588 \r
589             i = (uint16_t)(i + sizeof (CCFileBytes));\r
590 \r
591             /* Le bytes*/\r
592             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
593             i++;\r
594 #ifdef DESFIRE_FMT_EV1\r
595             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
596             {\r
597                 NdefSmtCrdFmt->SendLength = i;\r
598             }\r
599             else\r
600 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
601             {\r
602                 NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN;\r
603             }\r
604             break;\r
605         }\r
606 \r
607         case PH_FRINFC_DESF_WRITENDEF_CMD:\r
608         {\r
609             /* Instruction Cmd code */\r
610             NdefSmtCrdFmt->SendRecvBuf[CmdByte] = PH_FRINFC_DESF_WRITE_CMD;\r
611 \r
612             /*  Lc: Length of wrapped data */\r
613             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRNDEF_WRDT_LEN;\r
614             i++;\r
615 \r
616 #ifdef DESFIRE_FMT_EV1\r
617             if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
618             {\r
619                 /* set the file id*/\r
620                 NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_NDEF_FILE_ID;\r
621                 i++;\r
622             }\r
623             else\r
624 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
625             {\r
626                 /* set the file id*/\r
627                 NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NDEF_FILE_ID;\r
628                 i++;\r
629             }\r
630 \r
631             /* set the offset to zero*/\r
632             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
633             i++;\r
634             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
635             i++;\r
636             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
637             i++;\r
638 \r
639             /* Set the length of data available to write*/\r
640             NdefSmtCrdFmt->SendRecvBuf[i] = 0x02;\r
641             i++;\r
642             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
643             i++;\r
644             NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
645             i++;\r
646 \r
647             /*set the data to be written to the CC file*/\r
648 \r
649             (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[i],\r
650                         NdefFileBytes, sizeof (NdefFileBytes));\r
651             i = (uint16_t)(i + sizeof (NdefFileBytes));\r
652             \r
653             /* Le bytes*/\r
654             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
655             i++;\r
656 \r
657             NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITENDEF_CMD_SNLEN;\r
658             break;\r
659         }\r
660 \r
661         default:\r
662         {\r
663             break;\r
664         }\r
665     }\r
666 }\r
667 \r
668 static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)\r
669 {\r
670     NFCSTATUS status = NFCSTATUS_SUCCESS;\r
671 #ifdef PH_HAL4_ENABLE \r
672     /* Removed uint8_t i=0; */\r
673 #else\r
674     uint8_t i=0;\r
675 #endif /* #ifdef PH_HAL4_ENABLE */\r
676 \r
677     /*set the state*/\r
678     NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_HW_VERSION;\r
679 \r
680     /* Helper routine to wrap the native DESFire cmds*/\r
681     phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_HW_VERSION_CMD);\r
682 \r
683     status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
684 \r
685     return ( status);\r
686 }\r
687 \r
688 static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
689 {\r
690 \r
691     NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
692         NFCSTATUS_FORMAT_ERROR);\r
693 \r
694     if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- 1] == \r
695                 PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP) )\r
696     {\r
697         /*set the state*/\r
698         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_SW_VERSION;\r
699 \r
700         /* Helper routine to wrap the native DESFire cmds*/\r
701         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_SW_VERSION_CMD);\r
702 \r
703         status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
704     }\r
705     return status;\r
706 }\r
707 \r
708 static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
709 {\r
710     NFCSTATUS status = PHNFCSTVAL(CID_NFC_NONE,\r
711                                 NFCSTATUS_SUCCESS);\r
712 \r
713     if( ( NdefSmtCrdFmt->SendRecvBuf[*(NdefSmtCrdFmt->SendRecvLength)- \r
714         PH_SMTCRDFMT_DESF_VAL1] ==  PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP ) )\r
715     {\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
718 \r
719         if ((PH_FRINFC_DESF4_MAJOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MajorVersion) &&\r
720              (PH_FRINFC_DESF4_MINOR_VERSION == NdefSmtCrdFmt->AddInfo.Type4Info.MinorVersion))\r
721         {\r
722             /* card size of DESFire4 type */\r
723             NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = PH_FRINFC_DESF4_MEMORY_SIZE;\r
724 \r
725         }\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
729         {\r
730             NdefSmtCrdFmt->CardType = DESFIRE_CARD_TYPE_EV1;\r
731         }\r
732 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
733         else\r
734         {\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
739             \r
740         }\r
741 #ifdef DESFIRE_FMT_EV1\r
742         if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
743         {\r
744             switch (NdefSmtCrdFmt->SendRecvBuf[5])\r
745             {\r
746                 case DESFIRE_TAG_SIZE_IDENTIFIER_2K:\r
747                 {\r
748                     NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_2K_CARD;\r
749                     break;\r
750                 }\r
751 \r
752                 case DESFIRE_TAG_SIZE_IDENTIFIER_4K:\r
753                 {\r
754                     NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_4K_CARD;\r
755                     break;\r
756                 }\r
757 \r
758                 case DESFIRE_TAG_SIZE_IDENTIFIER_8K:\r
759                 {\r
760                     NdefSmtCrdFmt->AddInfo.Type4Info.CardSize = DESFIRE_8K_CARD;\r
761                     break;\r
762                 }\r
763 \r
764                 default:\r
765                 {\r
766                     status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT,\r
767                                         NFCSTATUS_INVALID_REMOTE_DEVICE);\r
768                     break;\r
769                 }\r
770             }\r
771         }\r
772 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
773     }\r
774 \r
775     return status;\r
776 }\r
777 \r
778 static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt)\r
779 {\r
780 \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
784     {\r
785         /*set the state*/\r
786         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_GET_UID;\r
787 \r
788         /* Helper routine to wrap the native desfire cmds*/\r
789         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_GET_UID_CMD);\r
790 \r
791         status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
792     }\r
793 \r
794     return status;\r
795 \r
796 }\r
797 \r
798 \r
799 static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
800 {\r
801     NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
802         NFCSTATUS_FORMAT_ERROR);\r
803 \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
806     {\r
807         /*set the state*/\r
808         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_AID;\r
809 \r
810         /* Helper routine to wrap the native DESFire cmds*/\r
811         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATEAPP_CMD);\r
812 \r
813         status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
814     }\r
815     return ( status);\r
816 }\r
817 \r
818 \r
819 static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
820 {\r
821 \r
822     NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
823         NFCSTATUS_FORMAT_ERROR);\r
824 \r
825     /* check for the response of previous operation, before\r
826     issuing the next command*/\r
827 \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
830     {\r
831         /*set the state*/\r
832         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_SELECT_APP;\r
833 \r
834         /* Helper routine to wrap the native DESFire cmds*/\r
835         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_SELECTAPP_CMD);\r
836 \r
837         status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
838     }\r
839     return ( status);\r
840 \r
841 }\r
842 \r
843 static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)\r
844 {\r
845     NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
846         NFCSTATUS_FORMAT_ERROR);\r
847 \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
850     {\r
851         /*set the state*/\r
852         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_CCFILE;\r
853 \r
854         /* Helper routine to wrap the native DESFire cmds*/\r
855         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATECC_CMD);\r
856 \r
857         status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
858     }\r
859     return ( status);\r
860 }\r
861 \r
862 static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
863 {\r
864 \r
865     NFCSTATUS status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
866         NFCSTATUS_FORMAT_ERROR);\r
867 \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
870     {   \r
871         /*set the state*/\r
872         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_CREATE_NDEFFILE;\r
873 \r
874         /* Helper routine to wrap the native desfire cmds*/\r
875         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_CREATENDEF_CMD);\r
876 \r
877         status = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
878 \r
879     }\r
880 \r
881     return ( status);\r
882 \r
883 }\r
884 \r
885 static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
886 {\r
887 \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
892     {\r
893 \r
894         /*set the state*/\r
895         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_CC_FILE;\r
896 \r
897         /* Helper routine to wrap the native DESFire cmds*/\r
898         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITECC_CMD);\r
899 \r
900         result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
901     }\r
902     return (result);\r
903 }\r
904 \r
905 static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
906 {\r
907 \r
908     NFCSTATUS Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
909         NFCSTATUS_FORMAT_ERROR);\r
910 \r
911 \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
914     {\r
915         /*set the state*/\r
916         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE;\r
917 \r
918         /* Helper routine to wrap the native DESFire cmds*/\r
919         phFriNfc_Desf_HWrapISONativeCmds(NdefSmtCrdFmt,PH_FRINFC_DESF_WRITENDEF_CMD);\r
920 \r
921         Result = phFriNfc_Desf_HSendTransCmd(NdefSmtCrdFmt);\r
922     }\r
923     return (Result);\r
924 }\r
925 \r
926 static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
927 {\r
928 \r
929     NFCSTATUS status =  NFCSTATUS_SUCCESS;\r
930 \r
931     /* set the command type*/\r
932 #ifdef PH_HAL4_ENABLE\r
933     NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_Raw;\r
934 #else\r
935     NdefSmtCrdFmt->Cmd.Iso144434Cmd = phHal_eIso14443_4_CmdListTClCmd;\r
936 #endif /* #ifdef PH_HAL4_ENABLE */\r
937 \r
938     /* set the Additional Info*/\r
939     NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.MetaChaining = 0;\r
940     NdefSmtCrdFmt->psDepAdditionalInfo.DepFlags.NADPresent = 0;\r
941 \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
945 \r
946     /* set the receive length */\r
947     *NdefSmtCrdFmt->SendRecvLength = PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE;\r
948     \r
949 \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
960 \r
961     return (status);\r
962 \r
963 \r
964 }\r
965 \r
966 NFCSTATUS phFriNfc_Desfire_Format(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt)\r
967 {\r
968 \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
974     return (status);\r
975 }\r
976 \r
977 #ifdef FRINFC_READONLY_NDEF\r
978 \r
979 #if 0\r
980 static \r
981 NFCSTATUS \r
982 phFriNfc_Desf_HReadOnlySelectCCFile (\r
983     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
984 {\r
985     NFCSTATUS result = NFCSTATUS_SUCCESS;\r
986     return result;\r
987 }\r
988 #endif /* #if 0 */\r
989 \r
990 static \r
991 NFCSTATUS \r
992 phFriNfc_Desf_HReadOnlyReadCCFile (\r
993     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
994 {\r
995     NFCSTATUS       result = NFCSTATUS_SUCCESS;\r
996     uint16_t        i = 0;\r
997 \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
1002     {\r
1003         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_READ_CC_FILE;\r
1004 \r
1005         /* Class Byte */\r
1006         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;\r
1007         i++;\r
1008 \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
1012         i++;\r
1013 \r
1014         \r
1015         /* P1/P2 offsets always set to zero */\r
1016         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;\r
1017         i++;\r
1018         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;\r
1019         i++;\r
1020 \r
1021         /*  Lc: Length of wrapped data */\r
1022         NdefSmtCrdFmt->SendRecvBuf[i] = NATIVE_WRAPPER_READ_DATA_LC_VALUE;\r
1023         i++;\r
1024 \r
1025 #ifdef DESFIRE_FMT_EV1\r
1026         if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
1027         {\r
1028             /* set the file id*/\r
1029             NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;\r
1030             i++;\r
1031         }\r
1032         else\r
1033 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1034         {\r
1035             /* set the file id*/\r
1036             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;\r
1037             i++;\r
1038         }\r
1039 \r
1040         /* set the offset to zero*/\r
1041         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1042         i++;\r
1043         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1044         i++;\r
1045         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1046         i++;\r
1047 \r
1048         /* Set the length of data available to read */\r
1049         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;\r
1050         i++;\r
1051         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1052         i++;\r
1053         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1054         i++;\r
1055 \r
1056         /* Le Value is set 0 */\r
1057         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
1058         i++;\r
1059 \r
1060         NdefSmtCrdFmt->SendLength = i;\r
1061 \r
1062         result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);\r
1063     }\r
1064     else\r
1065     {\r
1066         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
1067                             NFCSTATUS_FORMAT_ERROR);\r
1068     }\r
1069 \r
1070     return result;\r
1071 }\r
1072 \r
1073 static \r
1074 NFCSTATUS \r
1075 phFriNfc_Desf_HReadOnlyWriteCCFile (\r
1076     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
1077 {\r
1078     NFCSTATUS   result = NFCSTATUS_SUCCESS;\r
1079     uint8_t     read_cc_btyes[CC_BYTES_SIZE] = {0};\r
1080     uint16_t    i = 0;\r
1081 \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
1086     {\r
1087         NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE;\r
1088 \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
1092 \r
1093         /* Class Byte */\r
1094         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_CLASS_BYTE;\r
1095         i++;\r
1096 \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
1100         i++;\r
1101 \r
1102         \r
1103         /* P1/P2 offsets always set to zero */\r
1104         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P1;\r
1105         i++;\r
1106         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_OFFSET_P2;\r
1107         i++;\r
1108 \r
1109         /*  Lc: Length of wrapped data */\r
1110         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN;\r
1111         i++;\r
1112 \r
1113 #ifdef DESFIRE_FMT_EV1\r
1114         if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
1115         {\r
1116             /* set the file id*/\r
1117             NdefSmtCrdFmt->SendRecvBuf[i] = DESFIRE_EV1_CC_FILE_ID;\r
1118             i++;\r
1119         }\r
1120         else\r
1121 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1122         {\r
1123             /* set the file id*/\r
1124             NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_ID;\r
1125             i++;\r
1126         }\r
1127 \r
1128         /* set the offset to zero*/\r
1129         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1130         i++;\r
1131         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1132         i++;\r
1133         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1134         i++;\r
1135 \r
1136         /* Set the length of data available to write*/\r
1137         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_CC_FILE_SIZE;\r
1138         i++;\r
1139         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1140         i++;\r
1141         NdefSmtCrdFmt->SendRecvBuf[i] = 0x00;\r
1142         i++;\r
1143 \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
1148 #else\r
1149         i++;\r
1150 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1151 \r
1152         i = (uint16_t)(i + sizeof (read_cc_btyes));\r
1153 \r
1154         /* Le bytes*/\r
1155         NdefSmtCrdFmt->SendRecvBuf[i] = PH_FRINFC_DESF_NATIVE_LE_BYTE;\r
1156         i++;\r
1157 #ifdef DESFIRE_FMT_EV1\r
1158         if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
1159         {\r
1160             NdefSmtCrdFmt->SendLength = i;\r
1161         }\r
1162         else\r
1163 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1164         {\r
1165             NdefSmtCrdFmt->SendLength = PH_FRINFC_DESF_WRITECC_CMD_SNLEN;\r
1166         }\r
1167 \r
1168         result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);\r
1169     }\r
1170     else\r
1171     {\r
1172         result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
1173                             NFCSTATUS_FORMAT_ERROR);\r
1174     }\r
1175 \r
1176     return result;\r
1177 }\r
1178 \r
1179 static \r
1180 NFCSTATUS \r
1181 phFriNfc_Desf_HReadOnlySelectApp (\r
1182     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
1183 {\r
1184     NFCSTATUS result = NFCSTATUS_SUCCESS;\r
1185 \r
1186     NdefSmtCrdFmt->CardType = 0;\r
1187 \r
1188     NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_SELECT_APP;\r
1189 \r
1190     /* Helper routine to wrap the native DESFire cmds */\r
1191     phFriNfc_Desf_HWrapISONativeCmds (NdefSmtCrdFmt, PH_FRINFC_DESF_SELECTAPP_CMD);\r
1192 \r
1193     result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);\r
1194 \r
1195     return result;\r
1196 }\r
1197 \r
1198 #ifdef DESFIRE_FMT_EV1\r
1199 static \r
1200 NFCSTATUS \r
1201 phFriNfc_Desf_HReadOnlySelectAppEV1 (\r
1202     phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)\r
1203 {\r
1204     NFCSTATUS result = NFCSTATUS_SUCCESS;\r
1205 \r
1206     NdefSmtCrdFmt->CardType = DESFIRE_CARD_TYPE_EV1;\r
1207 \r
1208     NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1;    \r
1209 \r
1210     /* Helper routine to wrap the native DESFire cmds */\r
1211     phFriNfc_Desf_HWrapISONativeCmds (NdefSmtCrdFmt, PH_FRINFC_DESF_SELECTAPP_CMD);\r
1212 \r
1213     result = phFriNfc_Desf_HSendTransCmd (NdefSmtCrdFmt);\r
1214 \r
1215     return result;\r
1216 }\r
1217 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1218 \r
1219 NFCSTATUS \r
1220 phFriNfc_Desfire_ConvertToReadOnly (\r
1221     phFriNfc_sNdefSmtCrdFmt_t   *NdefSmtCrdFmt)\r
1222 {\r
1223     NFCSTATUS result = NFCSTATUS_SUCCESS;\r
1224 \r
1225 #ifdef DESFIRE_FMT_EV1\r
1226     result = phFriNfc_Desf_HReadOnlySelectAppEV1 (NdefSmtCrdFmt);\r
1227 #else\r
1228     result = phFriNfc_Desf_HReadOnlySelectApp (NdefSmtCrdFmt);\r
1229 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1230     \r
1231     return result;\r
1232 }\r
1233 \r
1234 #endif /* #ifdef FRINFC_READONLY_NDEF */\r
1235 \r
1236 void phFriNfc_Desf_Process( void       *Context,\r
1237                            NFCSTATUS   Status)\r
1238 {\r
1239 \r
1240     phFriNfc_sNdefSmtCrdFmt_t      *NdefSmtCrdFmt; \r
1241 \r
1242     NdefSmtCrdFmt = (phFriNfc_sNdefSmtCrdFmt_t *)Context;\r
1243 \r
1244     if((NFCSTATUS_SUCCESS & PHNFCSTBLOWER) == (Status & PHNFCSTBLOWER))\r
1245     {\r
1246         switch(NdefSmtCrdFmt->State)\r
1247         {\r
1248 #ifdef FRINFC_READONLY_NDEF\r
1249 #ifdef DESFIRE_FMT_EV1\r
1250             case PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1:\r
1251             {\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
1256                 {\r
1257                     Status = phFriNfc_Desf_HReadOnlyReadCCFile (NdefSmtCrdFmt);\r
1258                 }\r
1259                 else\r
1260                 {\r
1261                     Status = phFriNfc_Desf_HReadOnlySelectApp (NdefSmtCrdFmt);\r
1262                 }\r
1263                 break;\r
1264             }\r
1265 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1266 \r
1267             case PH_FRINFC_DESF_STATE_RO_SELECT_APP:\r
1268             {\r
1269                 Status = phFriNfc_Desf_HReadOnlyReadCCFile (NdefSmtCrdFmt);\r
1270                 break;\r
1271             }\r
1272 \r
1273             case PH_FRINFC_DESF_STATE_RO_READ_CC_FILE:\r
1274             {\r
1275                 Status = phFriNfc_Desf_HReadOnlyWriteCCFile (NdefSmtCrdFmt);\r
1276                 break;\r
1277             }\r
1278 \r
1279             case PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE:\r
1280             {\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
1285                 {\r
1286                     /* SUCCESSFULL Formatting */\r
1287 #ifdef DESFIRE_FMT_EV1\r
1288                     if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
1289                     {\r
1290                         Status = phFriNfc_OvrHal_Reconnect (\r
1291                                                 NdefSmtCrdFmt->LowerDevice, \r
1292                                                 &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo, \r
1293                                                 NdefSmtCrdFmt->psRemoteDevInfo);\r
1294 \r
1295                         if (NFCSTATUS_PENDING == Status)\r
1296                         {\r
1297                             NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_REACTIVATE;\r
1298                         }\r
1299                     }                   \r
1300 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1301                 }\r
1302                 else\r
1303                 {\r
1304                     Status = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT,\r
1305                                         NFCSTATUS_FORMAT_ERROR);\r
1306                 }\r
1307                 break;\r
1308             }\r
1309 \r
1310 #endif /* #ifdef FRINFC_READONLY_NDEF */\r
1311             case PH_FRINFC_DESF_STATE_GET_HW_VERSION:\r
1312             {\r
1313                 /* Check and store the h/w and s/w specific details.\r
1314                     Ex: Major/Minor version, memory storage info. */\r
1315 \r
1316                 Status = phFriNfc_Desf_HGetSWVersion (NdefSmtCrdFmt);\r
1317             \r
1318                 break;\r
1319             }\r
1320 \r
1321             case PH_FRINFC_DESF_STATE_GET_SW_VERSION:\r
1322             {\r
1323                 /* Check and store the h/w and s/w specific details.\r
1324                     Ex: Major/Minor version, memory storage info. */\r
1325 \r
1326                 Status = phFriNfc_Desf_HUpdateVersionDetails (NdefSmtCrdFmt);\r
1327                 if ( Status == NFCSTATUS_SUCCESS )\r
1328                 {\r
1329                     Status = phFriNfc_Desf_HGetUIDDetails (NdefSmtCrdFmt);\r
1330                 }\r
1331                 break;\r
1332             }\r
1333 \r
1334             case PH_FRINFC_DESF_STATE_GET_UID:\r
1335             {\r
1336                 Status = phFriNfc_Desf_HCreateApp (NdefSmtCrdFmt);\r
1337                 break;\r
1338             }\r
1339 \r
1340             case PH_FRINFC_DESF_STATE_CREATE_AID:\r
1341             {\r
1342                 Status = phFriNfc_Desf_HSelectApp (NdefSmtCrdFmt);\r
1343                 break;  \r
1344             }\r
1345 \r
1346             case PH_FRINFC_DESF_STATE_SELECT_APP:\r
1347             {\r
1348                 Status = phFriNfc_Desf_HCreatCCFile (NdefSmtCrdFmt);\r
1349                 break;\r
1350             }\r
1351 \r
1352             case PH_FRINFC_DESF_STATE_CREATE_CCFILE:\r
1353             {\r
1354                 Status = phFriNfc_Desf_HCreatNDEFFile (NdefSmtCrdFmt);\r
1355                 break;\r
1356             }\r
1357 \r
1358             case PH_FRINFC_DESF_STATE_CREATE_NDEFFILE:\r
1359             {\r
1360                 Status = phFriNfc_Desf_HWrCCBytes (NdefSmtCrdFmt);\r
1361                 break;\r
1362             }\r
1363 \r
1364             case PH_FRINFC_DESF_STATE_WRITE_CC_FILE:\r
1365             {\r
1366                 Status = phFriNfc_Desf_HWrNDEFData (NdefSmtCrdFmt);\r
1367                 break;\r
1368             }\r
1369 \r
1370             case PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE:\r
1371             {\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
1376                 {\r
1377                     NdefSmtCrdFmt->CardState = 0;\r
1378 #ifdef DESFIRE_FMT_EV1\r
1379                     if (DESFIRE_CARD_TYPE_EV1 == NdefSmtCrdFmt->CardType)\r
1380                     {\r
1381                         Status = phFriNfc_OvrHal_Reconnect (\r
1382                                                 NdefSmtCrdFmt->LowerDevice, \r
1383                                                 &NdefSmtCrdFmt->SmtCrdFmtCompletionInfo, \r
1384                                                 NdefSmtCrdFmt->psRemoteDevInfo);\r
1385 \r
1386                         if (NFCSTATUS_PENDING == Status)\r
1387                         {\r
1388                             NdefSmtCrdFmt->State = PH_FRINFC_DESF_STATE_REACTIVATE;\r
1389                         }\r
1390                     }\r
1391                     else\r
1392 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1393                     {\r
1394                         Status = PHNFCSTVAL (CID_NFC_NONE, NFCSTATUS_SUCCESS);                        \r
1395                     }\r
1396                 }\r
1397                 break;\r
1398             }\r
1399 \r
1400 #ifdef DESFIRE_FMT_EV1\r
1401             case PH_FRINFC_DESF_STATE_REACTIVATE:\r
1402             {\r
1403                 /* Do nothing */\r
1404                 break;\r
1405             }\r
1406 #endif /* #ifdef DESFIRE_FMT_EV1 */\r
1407 \r
1408             default:\r
1409             {\r
1410                 /*set the invalid state*/\r
1411                 Status = PHNFCSTVAL (CID_FRI_NFC_NDEF_SMTCRDFMT, \r
1412                                     NFCSTATUS_INVALID_DEVICE_REQUEST);\r
1413                 break;\r
1414             }\r
1415         }\r
1416     }\r
1417     /* Handle the all the error cases*/\r
1418     if ((NFCSTATUS_PENDING & PHNFCSTBLOWER) != (Status & PHNFCSTBLOWER))\r
1419     {\r
1420         /* call respective CR */\r
1421         phFriNfc_SmtCrdFmt_HCrHandler(NdefSmtCrdFmt,Status);\r
1422     }\r
1423 \r
1424 }\r
1425 \r