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.h
19* \brief Type4 Smart card formatting.
20*
21* Project: NFC-FRI
22*
23* $Date: Tue Jul 27 08:59:52 2010 $
24* $Author: ing02260 $
25* $Revision: 1.3 $
26* $Aliases:  $
27*
28*/
29
30#ifndef PHFRINFC_DESFIREFORMAT_H
31#define PHFRINFC_DESFIREFORMAT_H
32
33
34/*! \ingroup grp_file_attributes
35*  \name NDEF Smart Card Foramting
36*
37* File: \ref phFriNfc_DesfireFormat.h
38*
39*/
40/*@{*/
41
42/*@}*/
43
44
45/* Enum to represent the state variables*/
46enum{
47
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
61
62#ifdef DESFIRE_FMT_EV1
63    PH_FRINFC_DESF_STATE_RO_SELECT_APP_EV1 = 100,
64#endif /* #ifdef DESFIRE_FMT_EV1 */
65
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,
70
71#endif /* #ifdef FRINFC_READONLY_NDEF */
72
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
99
100};
101
102
103/* CC File contents*/
104
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
112
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
118
119
120/* Create File command constants*/
121#define  PH_FRINFC_DESF_CREATE_AID_CMD                  0xCA
122
123/* Specifies the NFC Forum App Number of Keys*/
124#define  PH_FRINFC_DESF_NFCFORUM_APP_NO_OF_KEYS         0x01
125
126#define  PH_FRINFC_DESF_SLECT_APP_CMD                   0x5A
127
128#define  PH_FRINFC_DESF_GET_VER_CMD                     0x60
129
130
131#define  PH_FRINFC_DESF_NATIVE_RESP_BYTE1               0x91
132#define  PH_FRINFC_DESF_NATIVE_RESP_BYTE2               0x00
133
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
139
140
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
146
147
148/* Write/Read Data commands/constants*/
149#define  PH_FRINFC_DESF_WRITE_CMD                       0x3D
150
151/* PICC additional frame response*/
152#define  PH_FRINFC_DESF_PICC_ADDI_FRAME_RESP            0xAF
153
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
157
158/* DESFire4 Major/Minor versions*/
159#define  PH_FRINFC_DESF4_MAJOR_VERSION                  0x00
160#define  PH_FRINFC_DESF4_MINOR_VERSION                  0x06
161
162/* DESFire4 memory size*/
163#define  PH_FRINFC_DESF4_MEMORY_SIZE                    0xEDE
164
165enum{
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
173};
174
175
176
177/*!
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.
180*
181* \param[in] NdefSmtCrdFmt Pointer to a valid or uninitialized instance of \ref phFriNfc_sNdefSmtCrdFmt_t.
182*
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
185formatting context variables.
186*/
187void phFriNfc_Desfire_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
188
189/*!
190* \ingroup grp_fri_smart_card_formatting
191*
192* \brief Initiates the card formatting procedure for Remote Smart Card Type.
193*
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.
200*
201* \param[in] phFriNfc_sNdefSmartCardFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
202*                             structure describing the component context.
203*
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.
209*
210*/
211NFCSTATUS phFriNfc_Desfire_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
212
213/*!
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.
216*
217* \param[in] NdefSmtCrdFmt Pointer to a valid or uninitialized instance of \ref phFriNfc_sNdefSmtCrdFmt_t.
218*
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
221formatting context variables.
222*/
223void phFriNfc_Desfire_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
224
225#ifdef FRINFC_READONLY_NDEF
226/*!
227 * \ingroup grp_fri_smart_card_formatting
228 *
229 * \brief Initiates the conversion of the already NDEF formatted tag to READ ONLY.
230 *
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.
234 *
235 * \param[in] phFriNfc_sNdefSmartCardFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
236 *                             structure describing the component context.
237 *
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.
243 *
244 */
245NFCSTATUS
246phFriNfc_Desfire_ConvertToReadOnly (
247    phFriNfc_sNdefSmtCrdFmt_t   *NdefSmtCrdFmt);
248#endif /* #ifdef FRINFC_READONLY_NDEF */
249
250/**
251*\ingroup grp_fri_smart_card_formatting
252*
253* \brief Smart card Formatting \b Completion \b Routine or \b Process function
254*
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).
260*
261* The function call scheme is according to \ref grp_interact. No State reset is performed during
262* operation.
263*
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
268*                    called function).
269*
270* \note For general information about the completion routine interface please see \ref pphFriNfc_Cr_t . * The Different Status Values are as follows
271*
272*/
273void phFriNfc_Desf_Process(void        *Context,
274                           NFCSTATUS   Status);
275
276
277#endif
278
279