2 * Copyright (C) 2010 NXP Semiconductors
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
8 * http://www.apache.org/licenses/LICENSE-2.0
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.
18 * \file phFriNfc_DesfireFormat.h
19 * \brief Type4 Smart card formatting.
23 * $Date: Tue Jul 27 08:59:52 2010 $
30 #ifndef PHFRINFC_DESFIREFORMAT_H
31 #define PHFRINFC_DESFIREFORMAT_H
34 /*! \ingroup grp_file_attributes
35 * \name NDEF Smart Card Foramting
37 * File: \ref phFriNfc_DesfireFormat.h
45 /* Enum to represent the state variables*/
48 PH_FRINFC_DESF_STATE_CREATE_AID = 0,
49 PH_FRINFC_DESF_STATE_SELECT_APP = 1,
50 PH_FRINFC_DESF_STATE_CREATE_CCFILE = 2,
51 PH_FRINFC_DESF_STATE_CREATE_NDEFFILE = 3,
52 PH_FRINFC_DESF_STATE_WRITE_CC_FILE = 4,
53 PH_FRINFC_DESF_STATE_WRITE_NDEF_FILE = 5,
54 PH_FRINFC_DESF_STATE_DISCON = 6,
55 PH_FRINFC_DESF_STATE_CON = 7,
56 PH_FRINFC_DESF_STATE_POLL = 8,
57 PH_FRINFC_DESF_STATE_GET_UID = 9,
58 PH_FRINFC_DESF_STATE_GET_SW_VERSION = 10,
59 PH_FRINFC_DESF_STATE_GET_HW_VERSION = 11,
60 #ifdef FRINFC_READONLY_NDEF
62 #ifdef DESFIRE_FMT_EV1
63 PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1 = 100,
64 #endif /* #ifdef DESFIRE_FMT_EV1 */
66 PH_FRINFC_DESF_STATE_RO_SELECT_APP = 101,
67 PH_FRINFC_DESF_STATE_RO_SELECT_CC_FILE = 102,
68 PH_FRINFC_DESF_STATE_RO_READ_CC_FILE = 103,
69 PH_FRINFC_DESF_STATE_RO_UPDATE_CC_FILE = 104,
71 #endif /* #ifdef FRINFC_READONLY_NDEF */
73 /* following are used in the ISO wrapper commands*/
74 PH_FRINFC_DESF_CREATEAPP_CMD = 0,
75 PH_FRINFC_DESF_SELECTAPP_CMD = 1,
76 PH_FRINFC_DESF_CREATECC_CMD = 2,
77 PH_FRINFC_DESF_CREATENDEF_CMD = 3,
78 PH_FRINFC_DESF_WRITECC_CMD = 4,
79 #ifdef FRINFC_READONLY_NDEF
80 PH_FRINFC_DESF_WRITECC_CMD_READ_ONLY = 20,
81 #endif /* #ifdef FRINFC_READONLY_NDEF */
82 PH_FRINFC_DESF_WRITENDEF_CMD = 5,
83 PH_FRINFC_DESF_GET_HW_VERSION_CMD = 6,
84 PH_FRINFC_DESF_GET_SW_VERSION_CMD = 7,
85 PH_FRINFC_DESF_GET_UID_CMD = 8,
86 PH_FRINFC_DESF_WRITENDEF_CMD_SNLEN = 15,
87 PH_FRINFC_DESF_WRITECC_CMD_SNLEN = 28,
88 PH_FRINFC_DESF_CREATECCNDEF_CMD_SNLEN = 13,
89 PH_FRINFC_DESF_SELECTAPP_CMD_SNLEN = 9,
90 PH_FRINFC_DESF_CREATEAPP_CMD_SNLEN = 11,
91 PH_FRINFC_DESF_NATIVE_OFFSET_P1 = 0x00,
92 PH_FRINFC_DESF_NATIVE_OFFSET_P2 = 0x00,
93 PH_FRINFC_DESF_NATIVE_LE_BYTE = 0x00,
94 PH_FRINFC_DESF_NATIVE_CRAPP_WRDT_LEN = 5,
95 PH_FRINFC_DESF_NATIVE_SLAPP_WRDT_LEN = 3,
96 PH_FRINFC_DESF_NATIVE_CRCCNDEF_WRDT_LEN = 7,
97 PH_FRINFC_DESF_NATIVE_WRCC_WRDT_LEN = 22,
98 PH_FRINFC_DESF_NATIVE_WRNDEF_WRDT_LEN = 9
103 /* CC File contents*/
105 #define PH_FRINFC_DESF_CCFILE_BYTES {0x00,0x0f,0x10,0x00,0x3B,0x00,0x34,0x04,0x06,0xE1,0x04,0x04,0x00,0x00,0x00 }
106 #define PH_FRINFC_DESF_NDEFFILE_BYTES {0x00,0x00}
107 #define PH_FRINFC_DESF_PICC_MASTER_KEY {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
108 #define PH_FRINFC_DESF_NFCFORUM_APP_KEY {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 }
109 #define PH_FRINFC_DESF_COMM_SETTINGS 0x00
110 #define PH_FRINFC_DESF_CREATE_DATA_FILE_CMD 0xCD
111 #define PH_FRINFC_DESF_NATIVE_CLASS_BYTE 0x90
113 /* Constant defined to specify the NFC Forum Application ID : 0xEEEE10*/
114 /* This is defined in order to support to N/W Byte order style : LSB : : MSB*/
115 #define PH_FRINFC_DESF_FIRST_AID_BYTE 0x10
116 #define PH_FRINFC_DESF_SEC_AID_BYTE 0xEE
117 #define PH_FRINFC_DESF_THIRD_AID_BYTE 0xEE
120 /* Create File command constants*/
121 #define PH_FRINFC_DESF_CREATE_AID_CMD 0xCA
123 /* Specifies the NFC Forum App Number of Keys*/
124 #define PH_FRINFC_DESF_NFCFORUM_APP_NO_OF_KEYS 0x01
126 #define PH_FRINFC_DESF_SLECT_APP_CMD 0x5A
128 #define PH_FRINFC_DESF_GET_VER_CMD 0x60
131 #define PH_FRINFC_DESF_NATIVE_RESP_BYTE1 0x91
132 #define PH_FRINFC_DESF_NATIVE_RESP_BYTE2 0x00
134 /* Create CC File Commands*/
135 #define PH_FRINFC_DESF_CC_FILE_ID 0x03
136 #define PH_FRINFC_DESF_CC_FILE_SIZE 0x0F
137 #define PH_FRINFC_DESF_FIRST_BYTE_CC_ACCESS_RIGHTS 0x00
138 #define PH_FRINFC_DESF_SEC_BYTE_CC_ACCESS_RIGHTS 0xE0
141 /* Create NDEF File Commands*/
142 #define PH_FRINFC_DESF_NDEF_FILE_ID 0x04
143 #define PH_FRINFC_DESF_NDEF_FILE_SIZE 0x04
144 #define PH_FRINFC_DESF_FIRST_BYTE_NDEF_ACCESS_RIGHTS 0xE0
145 #define PH_FRINFC_DESF_SEC_BYTE_NDEF_ACCESS_RIGHTS 0xEE
148 /* Write/Read Data commands/constants*/
149 #define PH_FRINFC_DESF_WRITE_CMD 0x3D
151 /* PICC additional frame response*/
152 #define PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP 0xAF
154 /* Response for PICC native DESFire wrapper cmd*/
155 #define PH_FRINFC_DESF_NAT_WRAP_FIRST_RESP_BYTE 0x91
156 #define PH_FRINFC_DESF_NAT_WRAP_SEC_RESP_BYTE 0x00
158 /* DESFire4 Major/Minor versions*/
159 #define PH_FRINFC_DESF4_MAJOR_VERSION 0x00
160 #define PH_FRINFC_DESF4_MINOR_VERSION 0x06
162 /* DESFire4 memory size*/
163 #define PH_FRINFC_DESF4_MEMORY_SIZE 0xEDE
166 PH_SMTCRDFMT_DESF_VAL0 = 0,
167 PH_SMTCRDFMT_DESF_VAL1 = 1,
168 PH_SMTCRDFMT_DESF_VAL2 = 2,
169 PH_SMTCRDFMT_DESF_VAL3 = 3,
170 PH_SMTCRDFMT_DESF_VAL4 = 4,
171 PH_SMTCRDFMT_DESF_VAL14 = 14,
172 PH_SMTCRDFMT_DESF_VAL15 = 15
178 * \brief \copydoc page_reg Resets the component instance to the initial state and lets the component forget about
179 * the list of registered items. Moreover, the lower device is set.
181 * \param[in] NdefSmtCrdFmt Pointer to a valid or uninitialized instance of \ref phFriNfc_sNdefSmtCrdFmt_t.
183 * \note This function has to be called at the beginning, after creating an instance of
184 * \ref phFriNfc_sNdefSmtCrdFmt_t. Use this function to reset the instance of smart card
185 formatting context variables.
187 void phFriNfc_Desfire_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
190 * \ingroup grp_fri_smart_card_formatting
192 * \brief Initiates the card formatting procedure for Remote Smart Card Type.
194 * \copydoc page_ovr The function initiates and formats the DESFire Card.After this
195 * operation,remote card would be properly initialized and
196 * Ndef Compliant.Depending upon the different card type, this
197 * function handles formatting procedure.This function also handles
198 * the different recovery procedures for different types of the cards.
199 * For both Format and Recovery Management same API is used.
201 * \param[in] phFriNfc_sNdefSmartCardFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
202 * structure describing the component context.
204 * \retval NFCSTATUS_SUCCESS Card formatting has been successfully completed.
205 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
206 * \retval NFCSTATUS_FORMAT_ERROR Error occured during the formatting procedure.
207 * \retval NFCSTATUS_INVALID_REMOTE_DEVICE Card Type is unsupported.
208 * \retval NFCSTATUS_INVALID_DEVICE_REQUEST Command or Operation types are mismatching.
211 NFCSTATUS phFriNfc_Desfire_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
214 * \brief \copydoc page_reg Resets the component instance to the initial state and lets the component forget about
215 * the list of registered items. Moreover, the lower device is set.
217 * \param[in] NdefSmtCrdFmt Pointer to a valid or uninitialized instance of \ref phFriNfc_sNdefSmtCrdFmt_t.
219 * \note This function has to be called at the beginning, after creating an instance of
220 * \ref phFriNfc_sNdefSmtCrdFmt_t. Use this function to reset the instance of smart card
221 formatting context variables.
223 void phFriNfc_Desfire_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
225 #ifdef FRINFC_READONLY_NDEF
227 * \ingroup grp_fri_smart_card_formatting
229 * \brief Initiates the conversion of the already NDEF formatted tag to READ ONLY.
231 * \copydoc page_ovr The function initiates the conversion of the already NDEF formatted
232 * tag to READ ONLY. After this formation, remote card would be properly Ndef Compliant and READ ONLY.
233 * Depending upon the different card type, this function handles formatting procedure.
235 * \param[in] phFriNfc_sNdefSmartCardFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
236 * structure describing the component context.
238 * \retval NFCSTATUS_SUCCESS Card formatting has been successfully completed.
239 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
240 * \retval NFCSTATUS_FORMAT_ERROR Error occured during the formatting procedure.
241 * \retval NFCSTATUS_INVALID_REMOTE_DEVICE Card Type is unsupported.
242 * \retval NFCSTATUS_INVALID_DEVICE_REQUEST Command or Operation types are mismatching.
246 phFriNfc_Desfire_ConvertToReadOnly (
247 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
248 #endif /* #ifdef FRINFC_READONLY_NDEF */
251 *\ingroup grp_fri_smart_card_formatting
253 * \brief Smart card Formatting \b Completion \b Routine or \b Process function
255 * \copydoc page_ovr Completion Routine: This function is called by the lower layer (OVR HAL)
256 * when an I/O operation has finished. The internal state machine decides
257 * whether to call into the lower device again or to complete the process
258 * by calling into the upper layer's completion routine, stored within this
259 * component's context (\ref phFriNfc_sNdefSmtCrdFmt_t).
261 * The function call scheme is according to \ref grp_interact. No State reset is performed during
264 * \param[in] Context The context of the current (not the lower/upper) instance, as set by the lower,
265 * calling layer, upon its completion.
266 * \param[in] Status The completion status of the lower layer (to be handled by the implementation of
267 * the state machine of this function like a regular return value of an internally
270 * \note For general information about the completion routine interface please see \ref pphFriNfc_Cr_t . * The Different Status Values are as follows
273 void phFriNfc_Desf_Process(void *Context,