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_MifStdFormat.h
19 * \brief NFC Ndef Formatting For Mifare standard card.
20 *
21 * Project: NFC-FRI
22 *
23 * $Date: Fri Sep 25 15:24:17 2009 $
24 * $Author: ing07299 $
25 * $Revision: 1.4 $
26 * $Aliases: NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $
27 *
28 */
29
30#ifndef PHFRINFC_MIFSTDFORMAT_H
31#define PHFRINFC_MIFSTDFORMAT_H
32
33#include <phFriNfc.h>
34#ifdef PH_HAL4_ENABLE
35    #include <phHal4Nfc.h>
36#else
37    #include <phHalNfc.h>
38#endif /* #ifdef PH_HAL4_ENABLE */
39#include <phNfcStatus.h>
40#include <phNfcTypes.h>
41#include <phFriNfc_SmtCrdFmt.h>
42
43#define PH_FRINFC_MIFSTD_FORMAT_FILEREVISION "$Revision: 1.4 $"
44#define PH_FRINFC_MIFSTD_FORMAT_FILEALIASES  "$Aliases: NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $"
45
46
47/*!
48 * \name Mifare standard - constants for the state
49 *
50 */
51/*@{*/
52#define PH_FRINFC_MFSTD_FMT_RESET_INIT          0 /*!< Reset state */
53#define PH_FRINFC_MFSTD_FMT_AUTH_SECT           1 /*!< Sector authentication is in progress */
54#define PH_FRINFC_MFSTD_FMT_DIS_CON             2 /*!< Disconnect is in progress */
55#define PH_FRINFC_MFSTD_FMT_CON                 3 /*!< Connect is in progress */
56#define PH_FRINFC_MFSTD_FMT_POLL                4 /*!< Poll is in progress */
57#define PH_FRINFC_MFSTD_FMT_RD_SECT_TR          5 /*!< Read sector trailer is in progress */
58#define PH_FRINFC_MFSTD_FMT_WR_SECT_TR          6 /*!< Write sector trailer is in progress */
59#define PH_FRINFC_MFSTD_FMT_WR_TLV              7 /*!< Write sector trailer is in progress */
60#define PH_FRINFC_MFSTD_FMT_WR_MAD_BLK          8 /*!< Write MAD is in progress */
61#define PH_FRINFC_MFSTD_FMT_UPD_MAD_BLK         9 /*!< Write MAD is in progress */
62/*@}*/
63
64/*!
65* \name Mifare standard - Authenticate states
66*
67*/
68/*@{*/
69#define PH_FRINFC_MFSTD_FMT_AUTH_DEF_KEY    0   /*!< Trying to authenticate with the default key */
70#define PH_FRINFC_MFSTD_FMT_AUTH_NFC_KEY    1   /*!< Trying to authenticate with the MAD key */
71#define PH_FRINFC_MFSTD_FMT_AUTH_MAD_KEY    2   /*!< Trying to authenticate with the NFC forum key */
72#define PH_FRINFC_MFSTD_FMT_AUTH_KEYB       3   /*!< Trying to authenticate with key B */
73#define PH_FRINFC_MFSTD_FMT_AUTH_SCRT_KEYB  4   /*!< Trying to authenticate with secret key B */
74
75/*@}*/
76
77/*!
78* \name Mifare standard - Update MAD block flag
79*
80*/
81/*@{*/
82#define PH_FRINFC_MFSTD_FMT_NOT_A_MAD_BLK       0   /*!< Not a MAD block */
83#define PH_FRINFC_MFSTD_FMT_MAD_BLK_1           1   /*!< MAD block number 1 */
84#define PH_FRINFC_MFSTD_FMT_MAD_BLK_2           2   /*!< MAD block number 2 */
85#define PH_FRINFC_MFSTD_FMT_MAD_BLK_64          64  /*!< MAD block number 64 (only used for Mifare 4k card) */
86#define PH_FRINFC_MFSTD_FMT_MAD_BLK_65          65  /*!< MAD block number 65 (only used for Mifare 4k card) */
87#define PH_FRINFC_MFSTD_FMT_MAD_BLK_66          66  /*!< MAD block number 66 (only used for Mifare 4k card) */
88
89/*@}*/
90
91/*!
92* \name Mifare standard - Update MAD block flag
93*
94*/
95/*@{*/
96#define  PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_KEYA_ACS_BIT_1K        {0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0x78,0x77,0x88,0xC1}
97#define  PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_KEYA_ACS_BIT_4K        {0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0x78,0x77,0x88,0xC2}
98#define  PH_FRINFC_SMTCRDFMT_NFCFORUMSECT_KEYA_ACS_BIT           {0xD3,0xF7,0xD3,0xF7,0xD3,0xF7,0x7F,0x07,0x88,0x40}
99
100/*@}*/
101/*!
102 * \name Mifare standard - Key and access bit constants
103 *
104 */
105/*@{*/
106#define PH_FRINFC_MFSTD_FMT_NFC_SECT_KEYA0      0xD3    /*!< NFC forum sector key A */
107#define PH_FRINFC_MFSTD_FMT_NFC_SECT_KEYA1      0xF7    /*!< NFC forum sector key A */
108
109#define PH_FRINFC_MFSTD_FMT_MAD_SECT_KEYA0      0xA0    /*!< MAD sector key A */
110#define PH_FRINFC_MFSTD_FMT_MAD_SECT_KEYA1      0xA1    /*!< MAD sector key A */
111#define PH_FRINFC_MFSTD_FMT_MAD_SECT_KEYA2      0xA2    /*!< MAD sector key A */
112#define PH_FRINFC_MFSTD_FMT_MAD_SECT_KEYA3      0xA3    /*!< MAD sector key A */
113#define PH_FRINFC_MFSTD_FMT_MAD_SECT_KEYA4      0xA4    /*!< MAD sector key A */
114#define PH_FRINFC_MFSTD_FMT_MAD_SECT_KEYA5      0xA5    /*!< MAD sector key A */
115
116#define PH_FRINFC_MFSTD_FMT_DEFAULT_KEY         0xFF    /*!< Default key A or B */
117
118#define PH_FRINFC_MFSTD_FMT_MAD_SECT_ACS6       0x78    /*!< MAD sector access bits 6 */
119#define PH_FRINFC_MFSTD_FMT_MAD_SECT_ACS7       0x77    /*!< MAD sector access bits 7 */
120#define PH_FRINFC_MFSTD_FMT_MAD_SECT_ACS8       0x88    /*!< MAD sector access bits 8 */
121#define PH_FRINFC_MFSTD_FMT_MAD_SECT_GPB        0xC1    /*!< MAD sector GPB */
122
123#define PH_FRINFC_MFSTD_FMT_NFC_SECT_ACS_RW6    0x7F    /*!< NFC forum sector access bits 6 for read write */
124#define PH_FRINFC_MFSTD_FMT_NFC_SECT_ACS_RW7    0x07    /*!< NFC forum sector access bits 7 for read write */
125#define PH_FRINFC_MFSTD_FMT_NFC_SECT_ACS_RW8    0x88    /*!< NFC forum sector access bits 8 for read write */
126#define PH_FRINFC_MFSTD_FMT_NFC_SECT_GPB_RW     0x40    /*!< NFC forum sector GPB for read write */
127
128#define PH_FRINFC_MFSTD_FMT_NFC_SECT_ACS_RO6    0x07    /*!< NFC forum sector access bits 6 for read only */
129#define PH_FRINFC_MFSTD_FMT_NFC_SECT_ACS_RO7    0x8F    /*!< NFC forum sector access bits 7 for read only */
130#define PH_FRINFC_MFSTD_FMT_NFC_SECT_ACS_RO8    0x0F    /*!< NFC forum sector access bits 8 for read only */
131#define PH_FRINFC_MFSTD_FMT_NFC_SECT_GPB_R0     0x43    /*!< NFC forum sector GPB for read only */
132
133/*@}*/
134
135/*!
136 * \name Mifare standard - enums the values
137 *
138 */
139/*@{*/
140typedef enum{
141PH_FRINFC_MFSTD_FMT_VAL_0,
142PH_FRINFC_MFSTD_FMT_VAL_1,
143PH_FRINFC_MFSTD_FMT_VAL_2,
144PH_FRINFC_MFSTD_FMT_VAL_3,
145PH_FRINFC_MFSTD_FMT_VAL_4,
146PH_FRINFC_MFSTD_FMT_VAL_5,
147PH_FRINFC_MFSTD_FMT_VAL_6,
148PH_FRINFC_MFSTD_FMT_VAL_7,
149PH_FRINFC_MFSTD_FMT_VAL_8,
150PH_FRINFC_MFSTD_FMT_VAL_9,
151PH_FRINFC_MFSTD_FMT_VAL_10,
152PH_FRINFC_MFSTD_FMT_VAL_11
153}phFriNfc_MfStdVal;
154/*@}*/
155
156/*!
157 * \name Mifare standard - NDEF information constants
158 *
159 */
160/*@{*/
161#define PH_FRINFC_MFSTD_FMT_NON_NDEF_COMPL  0       /*!< Sector is not ndef compliant */
162#define PH_FRINFC_MFSTD_FMT_NDEF_COMPL      1       /*!< Sector is ndef compliant */
163#define PH_FRINFC_MFSTD_FMT_NDEF_INFO1      0x03    /*!< If sector is ndef compliant, then one of the MAD
164                                                        sector byte is 0x03 */
165#define PH_FRINFC_MFSTD_FMT_NDEF_INFO2      0xE1    /*!< If sector is ndef compliant, then one of the MAD
166                                                        sector byte is 0xE1 */
167/*@}*/
168
169/*!
170 * \name Mifare standard - constants
171 *
172 */
173/*@{*/
174#define PH_FRINFC_MFSTD_FMT_MAX_RECV_LENGTH     252 /*!< Maximum receive length */
175#define PH_FRINFC_MFSTD_FMT_WR_SEND_LENGTH      17  /*!< Send length for write */
176#define PH_FRINFC_MFSTD_FMT_MAX_SECT_IND_1K     16  /*!< Maximum sector index for Mifare 1k = 16 */
177#define PH_FRINFC_MFSTD_FMT_MAX_SECT_IND_4K     40  /*!< Maximum sector index for Mifare 4k = 40 */
178#define PH_FRINFC_MFSTD_FMT_MAX_BLOCKS_1K       64  /*!< Maximum sector index for Mifare 1k = 16 */
179#define PH_FRINFC_MFSTD_FMT_MAX_BLOCKS_4K       256 /*!< Maximum sector index for Mifare 4k = 40 */
180/*@}*/
181
182/*!
183 * \name Mifare standard - constants for filling send buffer, calculating the block number,
184 * checking the authenticate state
185 *
186 */
187/*@{*/
188/* Copy default keyA to send buffer */
189#ifdef PH_HAL4_ENABLE
190
191#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_DEF(mem)\
192do \
193{\
194    (void)memset(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
195                PH_FRINFC_MFSTD_FMT_DEFAULT_KEY,\
196                PH_FRINFC_MFSTD_FMT_VAL_6);\
197    NdefSmtCrdFmt->Cmd.MfCmd = ((NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState == \
198            PH_FRINFC_MFSTD_FMT_AUTH_DEF_KEY)? \
199            phHal_eMifareAuthentA: \
200            phHal_eMifareAuthentB); \
201    NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7; \
202}while(0)
203
204/* Copy NFC forum sector keyA to send buffer */
205#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_NFCSECT_KEYA(mem)\
206do \
207{\
208    (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
209        NdefSmtCrdFmt->AddInfo.MfStdInfo.NFCForumSect_KeyA,\
210        PH_FRINFC_MFSTD_FMT_VAL_6);\
211        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareAuthentA;\
212        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7;\
213} while(0)
214
215/* Copy MAD sector keyA to send buffer */
216#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_MADSECT_KEYA(mem)\
217do \
218{\
219    (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
220        NdefSmtCrdFmt->AddInfo.MfStdInfo.MADSect_KeyA,\
221        PH_FRINFC_MFSTD_FMT_VAL_6);\
222        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareAuthentA;\
223        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7;\
224} while(0)
225
226#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_SCRT_KEY(mem) \
227do \
228{\
229    (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
230               NdefSmtCrdFmt->AddInfo.MfStdInfo.ScrtKeyB,\
231               PH_FRINFC_MFSTD_FMT_VAL_6);\
232               NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareAuthentB;\
233               NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7;\
234} while(0)
235
236#else
237
238#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_DEF(mem)\
239do \
240{\
241    (void)memset(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
242                PH_FRINFC_MFSTD_FMT_DEFAULT_KEY,\
243                PH_FRINFC_MFSTD_FMT_VAL_6);\
244    NdefSmtCrdFmt->Cmd.MfCmd = ((NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState == \
245            PH_FRINFC_MFSTD_FMT_AUTH_DEF_KEY)? \
246            phHal_eMifareCmdListMifareAuthentA: \
247            phHal_eMifareCmdListMifareAuthentB); \
248    NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7; \
249}while(0)
250
251/* Copy NFC forum sector keyA to send buffer */
252#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_NFCSECT_KEYA(mem)\
253do \
254{\
255    (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
256        NdefSmtCrdFmt->AddInfo.MfStdInfo.NFCForumSect_KeyA,\
257        PH_FRINFC_MFSTD_FMT_VAL_6);\
258        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentA;\
259        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7;\
260} while(0)
261
262/* Copy MAD sector keyA to send buffer */
263#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_MADSECT_KEYA(mem)\
264do \
265{\
266    (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
267        NdefSmtCrdFmt->AddInfo.MfStdInfo.MADSect_KeyA,\
268        PH_FRINFC_MFSTD_FMT_VAL_6);\
269        NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentA;\
270        NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7;\
271} while(0)
272
273#define PH_FRINFC_MFSTD_FMT_AUTH_SEND_BUF_SCRT_KEY(mem) \
274do \
275{\
276    (void)memcpy(&NdefSmtCrdFmt->SendRecvBuf[PH_FRINFC_MFSTD_FMT_VAL_1],\
277               NdefSmtCrdFmt->AddInfo.MfStdInfo.ScrtKeyB,\
278               PH_FRINFC_MFSTD_FMT_VAL_6);\
279               NdefSmtCrdFmt->Cmd.MfCmd = phHal_eMifareCmdListMifareAuthentB;\
280               NdefSmtCrdFmt->SendLength = PH_FRINFC_MFSTD_FMT_VAL_7;\
281} while(0)
282
283#endif /* #ifdef PH_HAL4_ENABLE */
284
285
286/* Get the next block */
287#define PH_FRINFC_MFSTD_FMT_CUR_BLK_INC() \
288                    NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock += \
289                        ((NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock >= 127)?\
290                        16:4)
291
292/* Get the sector index */
293#define PH_FRINFC_MFSTD_FMT_SECT_INDEX_CALC \
294                    ((NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock >= 128)?\
295                    (32 + ((NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock - 128)/16)):\
296                    (NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock/4))
297
298#define PH_FRINFC_MFSTD_FMT_CUR_BLK_CHK\
299                    ((NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD) && \
300                    (NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock >= \
301                    PH_FRINFC_MFSTD_FMT_MAX_BLOCKS_1K)) || \
302                    ((NdefSmtCrdFmt->CardType == PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD) && \
303                    (NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock >= \
304                    PH_FRINFC_MFSTD_FMT_MAX_BLOCKS_4K))
305
306/* Get the next authenticate state */
307#define PH_FRINFC_MFSTD_FMT_NXT_AUTH_STATE() \
308do \
309{\
310    switch(NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState)\
311    {\
312        case PH_FRINFC_MFSTD_FMT_AUTH_DEF_KEY:\
313        {\
314            NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState = (uint8_t) \
315                ((((NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock <= 3) || \
316                ((NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock > 63) && \
317                (NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock < 67))))? \
318                PH_FRINFC_MFSTD_FMT_AUTH_MAD_KEY: \
319                PH_FRINFC_MFSTD_FMT_AUTH_NFC_KEY);\
320        }\
321        break;\
322        case PH_FRINFC_MFSTD_FMT_AUTH_NFC_KEY:\
323        {\
324        NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState = \
325                            PH_FRINFC_MFSTD_FMT_AUTH_KEYB;\
326        }\
327        break;\
328        case PH_FRINFC_MFSTD_FMT_AUTH_MAD_KEY:\
329        {\
330        NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState = \
331                        PH_FRINFC_MFSTD_FMT_AUTH_NFC_KEY;\
332        }\
333        break;\
334        case PH_FRINFC_MFSTD_FMT_AUTH_KEYB:\
335        { \
336        NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState = \
337                        PH_FRINFC_MFSTD_FMT_AUTH_SCRT_KEYB;\
338        } \
339        break;\
340        case PH_FRINFC_MFSTD_FMT_AUTH_SCRT_KEYB:\
341        default:\
342        { \
343        NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState = \
344                        PH_FRINFC_MFSTD_FMT_AUTH_DEF_KEY;\
345        }\
346        break;\
347    }\
348} while(0)
349
350
351/* Increment the sector index */
352#define PH_FRINFC_MFSTD_FMT_INCR_SECT \
353do \
354{\
355    SectIndex++;\
356    SectIndex = (uint8_t)((SectIndex == 16)?\
357                        (SectIndex + PH_FRINFC_MFSTD_FMT_VAL_1):\
358                        SectIndex);\
359} while(0)
360
361
362/* Increment the sector index */
363#define PH_FRINFC_MFSTD_FMT_CHK_SECT_ARRAY \
364do \
365{\
366    while ((index < PH_FRINFC_MFSTD_FMT_MAX_SECT_IND_4K) && \
367            (memcompare != PH_FRINFC_MFSTD_FMT_VAL_0))\
368    {\
369        /* Compare any one among the sectors is NDEF COMPLIANT */\
370        memcompare = (uint32_t)phFriNfc_MfStd_MemCompare(&Buffer[PH_FRINFC_MFSTD_FMT_VAL_0], \
371        &NdefSmtCrdFmt->AddInfo.MfStdInfo.SectCompl[index],\
372        PH_FRINFC_MFSTD_FMT_VAL_1);\
373        /* increment the index */\
374        index += (uint8_t)((index == (PH_FRINFC_MFSTD_FMT_MAX_SECT_IND_1K - \
375                            PH_FRINFC_MFSTD_FMT_VAL_1))?\
376                            PH_FRINFC_MFSTD_FMT_VAL_2:\
377                            PH_FRINFC_MFSTD_FMT_VAL_1);\
378    }\
379} while(0)
380
381#define PH_FRINFC_MFSTD_FMT_CHK_END_OF_CARD() \
382do \
383{ \
384    phFriNfc_MfStd_H_NdefComplSect(NdefSmtCrdFmt->CardType, \
385                                NdefSmtCrdFmt->AddInfo.MfStdInfo.SectCompl); \
386    PH_FRINFC_MFSTD_FMT_CHK_SECT_ARRAY; \
387    if(memcompare == PH_FRINFC_MFSTD_FMT_VAL_0) \
388    { \
389        phFriNfc_MfStd_H_StrNdefData(NdefSmtCrdFmt); \
390        NdefSmtCrdFmt->AddInfo.MfStdInfo.CurrentBlock = \
391                                PH_FRINFC_MFSTD_FMT_VAL_1; \
392        NdefSmtCrdFmt->AddInfo.MfStdInfo.UpdMADBlk = \
393            PH_FRINFC_MFSTD_FMT_MAD_BLK_1; \
394        NdefSmtCrdFmt->AddInfo.MfStdInfo.AuthState = \
395            PH_FRINFC_MFSTD_FMT_AUTH_SCRT_KEYB; \
396        NdefSmtCrdFmt->State = PH_FRINFC_MFSTD_FMT_AUTH_SECT; \
397        Result = phFriNfc_MfStd_H_WrRdAuth(NdefSmtCrdFmt); \
398    } \
399    else \
400    { \
401        Result = PHNFCSTVAL(CID_FRI_NFC_NDEF_SMTCRDFMT, \
402                            NFCSTATUS_FORMAT_ERROR); \
403    } \
404} while(0)
405/*@}*/
406
407
408/**
409 * \ingroup grp_fri_smart_card_formatting
410 * \brief Smart Card Formatting \b Reset function
411 *
412 * \copydoc page_reg Resets the component instance to the initial state and initializes the
413 *          internal variables.
414 */
415void phFriNfc_MfStd_Reset(phFriNfc_sNdefSmtCrdFmt_t    *NdefSmtCrdFmt);
416
417/*!
418 * \ingroup grp_fri_smart_card_formatting
419 *
420 * \brief Initiates the card formatting procedure for Remote Smart Card Type.
421 *
422 * \copydoc page_ovr  The function initiates and formats the Smart Card.After this formation, remote
423 * card would be properly initialized and Ndef Compliant.
424 * Depending upon the different card type, this function handles formatting procedure.
425 * This function also handles the different recovery procedures for different types of the cards. For both
426 * Format and Recovery Management same API is used.
427 *
428 * \param[in] phFriNfc_sNdefSmartCardFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
429 *                             structure describing the component context.
430 * \retval  NFCSTATUS_PENDING   The action has been successfully triggered.
431 * \retval  Other values        An error has occurred.
432 *
433 */
434NFCSTATUS phFriNfc_MfStd_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, const uint8_t *ScrtKeyB);
435
436/**
437 *\ingroup grp_fri_smart_card_formatting
438 *
439 * \brief Smart card Formatting \b Completion \b Routine or \b Process function
440 *
441 * \copydoc page_ovr Completion Routine: This function is called by the lower layer (OVR HAL)
442 *                  when an I/O operation has finished. The internal state machine decides
443 *                  whether to call into the lower device again or to complete the process
444 *                  by calling into the upper layer's completion routine, stored within this
445 *                  component's context (\ref phFriNfc_sNdefSmtCrdFmt_t).
446 *
447 * The function call scheme is according to \ref grp_interact. No State reset is performed during
448 * operation.
449 *
450 * \param[in] Context The context of the current (not the lower/upper) instance, as set by the lower,
451 *            calling layer, upon its completion.
452 * \param[in] Status  The completion status of the lower layer (to be handled by the implementation of
453 *                    the state machine of this function like a regular return value of an internally
454 *                    called function).
455 *
456 * \note For general information about the completion routine interface please see \ref pphFriNfc_Cr_t . * The Different Status Values are as follows
457 *
458 */
459void phFriNfc_MfStd_Process(void            *Context,
460                            NFCSTATUS       Status);
461#endif /* PHFRINFC_MIFSTDFMT_H */
462