Home | History | Annotate | Download | only in src
      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 /*@{*/
    140 typedef enum{
    141 PH_FRINFC_MFSTD_FMT_VAL_0,
    142 PH_FRINFC_MFSTD_FMT_VAL_1,
    143 PH_FRINFC_MFSTD_FMT_VAL_2,
    144 PH_FRINFC_MFSTD_FMT_VAL_3,
    145 PH_FRINFC_MFSTD_FMT_VAL_4,
    146 PH_FRINFC_MFSTD_FMT_VAL_5,
    147 PH_FRINFC_MFSTD_FMT_VAL_6,
    148 PH_FRINFC_MFSTD_FMT_VAL_7,
    149 PH_FRINFC_MFSTD_FMT_VAL_8,
    150 PH_FRINFC_MFSTD_FMT_VAL_9,
    151 PH_FRINFC_MFSTD_FMT_VAL_10,
    152 PH_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)\
    192 do \
    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)\
    206 do \
    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)\
    217 do \
    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) \
    227 do \
    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)\
    239 do \
    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)\
    253 do \
    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)\
    264 do \
    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) \
    274 do \
    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() \
    308 do \
    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 \
    353 do \
    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 \
    364 do \
    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() \
    382 do \
    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  */
    415 void 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  */
    434 NFCSTATUS 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  */
    459 void phFriNfc_MfStd_Process(void            *Context,
    460                             NFCSTATUS       Status);
    461 #endif /* PHFRINFC_MIFSTDFMT_H */
    462