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