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
37Following are different native commands are wrapped under the ISO commands :
381. Crate Application
392. Select File
403. Get version
414. Create CC/NDEF File
425. Write data to STD File
43In this File above commands are sent using the ISO Wrapper.
44
45Wrapping the native DESFire APDU's procedure
46--------------------------------------------------------------------------------
47CLA         INS     P1      P2      Lc          Data            Le
480x90        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
109CC file and NDEF files */
110static void phFriNfc_Desf_HWrapISONativeCmds(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt,uint8_t CmdType);
111
112/* Gets H/W version details*/
113static NFCSTATUS phFriNfc_Desf_HGetHWVersion(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
114
115/* Gets S/W version details*/
116static NFCSTATUS phFriNfc_Desf_HGetSWVersion(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
117
118/* Updates the version details to context structure*/
119static NFCSTATUS phFriNfc_Desf_HUpdateVersionDetails(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
120
121/*Gets UID details*/
122static NFCSTATUS phFriNfc_Desf_HGetUIDDetails(phFriNfc_sNdefSmtCrdFmt_t * NdefSmtCrdFmt);
123
124/*Creates Application*/
125static NFCSTATUS phFriNfc_Desf_HCreateApp(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
126
127/* Selects Application*/
128static NFCSTATUS phFriNfc_Desf_HSelectApp(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
129
130/*Creates Capability Container File*/
131static NFCSTATUS phFriNfc_Desf_HCreatCCFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
132
133/* Create NDEF File*/
134static NFCSTATUS phFriNfc_Desf_HCreatNDEFFile(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
135
136/* Writes CC Bytes to CC File*/
137static NFCSTATUS phFriNfc_Desf_HWrCCBytes(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
138
139/* Writes NDEF data into NDEF File*/
140static NFCSTATUS phFriNfc_Desf_HWrNDEFData(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
141
142/* Transceive Cmd initiation*/
143static NFCSTATUS phFriNfc_Desf_HSendTransCmd(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
144
145#ifdef FRINFC_READONLY_NDEF
146
147#if 0
148static
149NFCSTATUS
150phFriNfc_Desf_HReadOnlySelectCCFile (
151    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
152#endif /* #if 0 */
153
154static
155NFCSTATUS
156phFriNfc_Desf_HReadOnlyReadCCFile (
157    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
158
159static
160NFCSTATUS
161phFriNfc_Desf_HReadOnlyWriteCCFile (
162    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
163
164static
165NFCSTATUS
166phFriNfc_Desf_HReadOnlySelectApp (
167    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
168
169#ifdef DESFIRE_FMT_EV1
170
171static
172NFCSTATUS
173phFriNfc_Desf_HReadOnlySelectAppEV1 (
174    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
175
176#endif /* #ifdef DESFIRE_FMT_EV1 */
177
178#endif /* #ifdef FRINFC_READONLY_NDEF */
179
180void 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
202static 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
668static 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
688static 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
708static 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
778static 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
799static 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
819static 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
843static 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
862static 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
885static 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
905static 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
926static 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
966NFCSTATUS 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
980static
981NFCSTATUS
982phFriNfc_Desf_HReadOnlySelectCCFile (
983    phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt)
984{
985    NFCSTATUS result = NFCSTATUS_SUCCESS;
986    return result;
987}
988#endif /* #if 0 */
989
990static
991NFCSTATUS
992phFriNfc_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
1073static
1074NFCSTATUS
1075phFriNfc_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
1179static
1180NFCSTATUS
1181phFriNfc_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
1199static
1200NFCSTATUS
1201phFriNfc_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
1219NFCSTATUS
1220phFriNfc_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
1236void 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
1426