blob: 4800c41c21b5b154ceb1f51a9b5ddc7b08a9d359 [file] [log] [blame]
Nick Pelly5d9927b2010-09-23 12:47:58 -07001/*
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_SmtCrdFmt.h
19 * \brief NFC-FRI Smart Card Formatting.
20 *
21 * Project: NFC-FRI
22 *
Martijn Coenenc0bdf302010-12-18 12:09:06 +010023 * $Date: Mon Dec 13 14:14:11 2010 $
24 * $Author: ing02260 $
25 * $Revision: 1.5 $
26 * $Aliases: $
Nick Pelly5d9927b2010-09-23 12:47:58 -070027 *
28 */
29
30#ifndef PHFRINFC_SMTCRDFMT_H
31#define PHFRINFC_SMTCRDFMT_H
32
33/**
34 * \name Smart Card Formatting
35 *
36 * File: \ref phFri_CardFormatFunctions.h
37 *
38 */
39/*@{*/
Martijn Coenenc0bdf302010-12-18 12:09:06 +010040#define PHFRINFC_SMTCRDFMT_FILEREVISION "$Revision: 1.5 $"
41#define PHFRINFC_SMTCRDFMT_FILEALIASES "$Aliases: $"
Nick Pelly5d9927b2010-09-23 12:47:58 -070042/*@}*/
43
44/*! \defgroup grp_fri_smart_card_formatting NFC FRI Smart Card Formatting
45 *
46 * Smart Card Formatting functionality enables automatic formatting of any type of smart cards.
47 * This initializes the smart cards and makes them NDEF Compliant.
48 * Single API is provided to handle format/recovery management of different types cards.
49 * Following are different Types of cards supported by this module, currently.
50 * - Type1 ( Topaz)
51 * - Type2 ( Mifare UL)
52 * - Type4 ( Desfire)
53 * - Mifare Std.
54 */
55/*@{*/
56/**
57 * \ingroup grp_fri_smart_card_formatting
58 * \brief Macro definitions.
59 * \note
60 On requirement basis, new constants will be defined
61 during the implementation phase.
62*/
63
Martijn Coenen80ee29b2010-12-16 23:24:55 +010064#define DESFIRE_FMT_EV1
65
66
Nick Pelly5d9927b2010-09-23 12:47:58 -070067#define PH_FRI_NFC_SMTCRDFMT_NFCSTATUS_FORMAT_ERROR 9
68#define PH_FRINFC_SMTCRDFMT_MSTD_DEFAULT_KEYA_OR_KEYB {0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF}
69#define PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_KEYA {0xA0, 0xA1,0xA2,0xA3,0xA4,0xA5}
70#define PH_FRINFC_SMTCRDFMT_NFCFORUMSECT_KEYA {0xD3, 0xF7,0xD3,0xF7,0xD3,0xF7}
71#define PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_ACCESSBITS {0x78,0x77,0x88}
72#define PH_FRINFC_SMTCRDFMT_MSTD_NFCFORUM_ACCESSBITS {0x7F,0x07,0x88}
73#define PH_FRINFC_SMTCRDFMT_MAX_TLV_TYPE_SUPPORTED 1
74
75#define PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE 252
76
77#define PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT 1
78
79enum
80{
81 PH_FRINFC_SMTCRDFMT_MIFARE_UL_CARD,
82 PH_FRINFC_SMTCRDFMT_ISO14443_4A_CARD,
83 PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD,
84 PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD,
85 PH_FRINFC_SMTCRDFMT_TOPAZ_CARD
86};
87
88/**
89 * \name Completion Routine Indices
90 *
91 * These are the indices of the completion routine pointers within the component context.
92 * Completion routines belong to upper components.
93 *
94 */
95/*@{*/
96/** \ingroup grp_fri_nfc_ndef_map
97* Completion Routine Index for \ref phFriNfc_SmtCrd_Format */
98#define PH_FRINFC_SMTCRDFMT_CR_FORMAT 0 /* */
99/** \ingroup grp_fri_nfc_ndef_map Completion
100 * Routine Index for Unknown States/Operations */
101#define PH_FRINFC_SMTCRDFMT_CR_INVALID_OPE 1 /* */
102/** \ingroup grp_fri_nfc_ndef_map
103 * Number of completion routines that have to be initialised */
104#define PH_FRINFC_SMTCRDFMT_CR 2
105/*@}*/
106
107
108/*@}*/
109
110/*
111 * \ingroup grp_fri_smart_card_formatting
112 *
113 * \brief NFC Smart Card Formatting Component Type1 Additional Information Structure
114 *
115 * This structure is used to specify additional information required to format the Type1 card.
116 * \note
117 * On requirement basis,structure will be filled/modified with other parameters
118 * during the implementation phase.
119 *
120 */
121typedef struct phFriNfc_Type1_AddInfo
122{
123 /* Stores the CC byte values. For Ex: 0xE1, 0x10 , 0x0C, 0x00*/
124 uint8_t CCBytes[5];
125 uint8_t UID[4];
126 uint8_t CCByteIndex;
127
128} phFriNfc_Type1_AddInfo_t;
129
130/*
131 *
132 * \ingroup grp_fri_smart_card_formatting
133 * \brief NFC Smart Card Formatting Component Type2 Additional Information Structure
134 *
135 * This structure is used to specify additional information required to format the Type2 card.
136 * \note
137 * On requirement basis,structure will be filled/modified with other parametes
138 * during the implementation phase.
139 *
140 */
141typedef struct phFriNfc_Type2_AddInfo
142{
143 /* Stores the CC byte values. For Ex: 0xE1, 0x10 , 0x10, 0x00*/
144 uint8_t OTPBytes[4];
Martijn Coenenc0bdf302010-12-18 12:09:06 +0100145#ifdef FRINFC_READONLY_NDEF
Martijn Coenena6243752011-01-13 10:49:03 +0100146 uint8_t LockBytes[4];
147
148#ifdef PH_NDEF_MIFARE_ULC
149 uint8_t ReadData[16];
150 uint8_t ReadDataIndex;
151 uint8_t DynLockBytes[4];
152 uint8_t BytesLockedPerLockBit;
153 uint8_t LockBytesPerPage;
154 uint8_t LockByteNumber;
155 uint8_t LockBlockNumber;
156 uint8_t NoOfLockBits;
157 uint8_t DefaultLockBytesFlag;
158 uint8_t LockBitsWritten;
159#endif /* #ifdef PH_NDEF_MIFARE_ULC */
160
Martijn Coenenc0bdf302010-12-18 12:09:06 +0100161#endif /* #ifdef FRINFC_READONLY_NDEF */
Nick Pelly5d9927b2010-09-23 12:47:58 -0700162 /* Current Block Address*/
163 uint8_t CurrentBlock;
164} phFriNfc_Type2_AddInfo_t;
165
166/*
167 * \ingroup grp_fri_smart_card_formatting
168 * \brief NFC Smart Card Formatting Component Type4 Additional Information Structure
169 *
170 * This structure is used to specify additional information required to format the type4 card.
171 * \note
172 * On requirement basis,structure will be filled/modified with other parametes
173 * during the implementation phase.
174 *
175 */
Martijn Coenenc0bdf302010-12-18 12:09:06 +0100176
Nick Pelly5d9927b2010-09-23 12:47:58 -0700177typedef struct phFriNfc_Type4_AddInfo
178{
179 /* Specifies Keys related to PICC/NFCForum Master Key settings*/
180 /* Stores the PICC Master Key/NFC Forum MasterKey*/
181 uint8_t PICCMasterKey[16];
182 uint8_t NFCForumMasterkey[16];
183
184 /* To create the files follwoiing attributes are required*/
185 uint8_t PrevState;
186 uint16_t FileAccessRights;
187 uint32_t CardSize;
188 uint16_t MajorVersion;
189 uint16_t MinorVersion;
190
Nick Pelly5d9927b2010-09-23 12:47:58 -0700191} phFriNfc_Type4_AddInfo_t;
192
193/*
194 * \ingroup grp_fri_smart_card_formatting
195 * \brief NFC Smart Card Formatting Component Mifare Std Additional Information Structure
196 *
197 * This structure is used to specify additional information required to format the Mifare Std card.
198 * \note
199 * On requirement basis,structure will be filled/modified with other parametes
200 * during the implementation phase.
201 *
202 */
203 typedef struct phFriNfc_MfStd_AddInfo
204{
205 /** Device input parameter for poll and connect after failed authentication */
206 phHal_sDevInputParam_t *DevInputParam;
207
208 /* Stores the Default KeyA and KeyB values*/
209 uint8_t Default_KeyA_OR_B[6];
210
211 /* Key A of MAD sector*/
212 uint8_t MADSect_KeyA[6];
213
214 /* Key A of NFC Forum Sector sector*/
215 uint8_t NFCForumSect_KeyA[6];
216
217 /* Access Bits of MAD sector*/
218 uint8_t MADSect_AccessBits[3];
219
220 /* Access Bits of NFC Forum sector*/
221 uint8_t NFCForumSect_AccessBits[3];
222
223 /* Secret key B to given by the application */
224 uint8_t ScrtKeyB[6];
225
226 /* Specifies the status of the different authentication handled in
227 formatting procedure*/
228 uint8_t AuthState;
229
230 /* Stores the current block */
231 uint16_t CurrentBlock;
232
233 /* Stores the current block */
234 uint8_t NoOfDevices;
235
236 /* Store the compliant sectors */
237 uint8_t SectCompl[40];
238
239 /* Flag to know that MAD sector */
240 uint8_t WrMADBlkFlag;
241
242 /* Fill the MAD sector blocks */
243 uint8_t MADSectBlk[80];
244
245 /* Fill the MAD sector blocks */
246 uint8_t UpdMADBlk;
247} phFriNfc_MfStd_AddInfo_t;
248
Martijn Coenen4f3ef022011-01-20 01:27:17 +0100249
250 /*
251 * \ingroup grp_fri_smart_card_formatting
252 * \brief NFC Smart Card Formatting Component ISO-15693 Additional Information Structure
253 *
254 * This structure is used to specify additional information required to format the ISO-15693 card.
255 * \note
256 * On requirement basis,structure will be filled/modified with other parametes
257 * during the implementation phase.
258 *
259 */
260 typedef struct phFriNfc_ISO15693_AddInfo
261 {
262 /* Stores the current block executed */
263 uint16_t current_block;
264 /* Sequence executed */
265 uint8_t format_seq;
266 /* Maximum data size in the card */
267 uint16_t max_data_size;
268 }phFriNfc_ISO15693_AddInfo_t;
269
Nick Pelly5d9927b2010-09-23 12:47:58 -0700270/**
271 * \ingroup grp_fri_smart_card_formatting
272 *
273 * \brief NFC Smart Card Formatting Component Additional Information Structure
274 *
275 * This structure is composed to have additional information of different type of tags
276 * Ex: Type1/Type2/Type4/Mifare 1k/4k
277 *
278 * \note
279 * On requirement basis, structure will be filled/modified with other parameters
280 * during the implementation phase.
281 */
282typedef struct phFriNfc_sNdefSmtCrdFmt_AddInfo
283{
284 phFriNfc_Type1_AddInfo_t Type1Info;
285 phFriNfc_Type2_AddInfo_t Type2Info;
286 phFriNfc_Type4_AddInfo_t Type4Info;
287 phFriNfc_MfStd_AddInfo_t MfStdInfo;
Martijn Coenen4f3ef022011-01-20 01:27:17 +0100288 phFriNfc_ISO15693_AddInfo_t s_iso15693_info;
Nick Pelly5d9927b2010-09-23 12:47:58 -0700289
290}phFriNfc_sNdefSmtCrdFmt_AddInfo_t;
291
292/**
293 * \ingroup grp_fri_smart_card_formatting
294 * \brief NFC Smart Card Formatting Component Context Structure
295 *
296 * This structure is used to store the current context information of the instance.
297 *
298 * \note On requirement basis,structure will be filled/modified with other parameters
299 * during the implementation phase
300 *
301 */
302typedef struct phFriNfc_sNdefSmtCrdFmt
303{
304 /** Pointer to the lower (HAL) instance.*/
305 void *LowerDevice;
306
307 /** Holds the device additional informations*/
308 phHal_sDepAdditionalInfo_t psDepAdditionalInfo;
309
310 /** Pointer to the Remote Device Information */
311 phHal_sRemoteDevInformation_t *psRemoteDevInfo;
312
313 /** Stores the type of the smart card. */
314 uint8_t CardType;
315
316 /** Stores operating mode type of the MifareStd. */
317 /* phHal_eOpModes_t OpModeType[2]; */
318
319 /**< \internal The state of the operation. */
320 uint8_t State;
321
322 /**< \internal Stores the card state Ex: Blank/Formatted etc. */
323 uint8_t CardState;
324
325 /**< \internal Completion Routine Context. */
326 phFriNfc_CplRt_t CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR];
327
328 /**<\internal Holds the completion routine informations of the Smart Card Formatting Layer*/
329 phFriNfc_CplRt_t SmtCrdFmtCompletionInfo;
330
331 /**<\internal Holds the Command Type(read/write)*/
332 phHal_uCmdList_t Cmd;
333
334 /**< \internal Holds the length of the received data. */
335 uint16_t *SendRecvLength;
336
337 /**<\internal Holds the ack of some intial commands*/
338 uint8_t *SendRecvBuf;
339
340 /**< \internal Holds the length of the data to be sent. */
341 uint16_t SendLength;
342
343 /**< \internal Stores the output/result of the format procedure. Ex: Formatted Successfully,
344 Format Error etc */
345 NFCSTATUS FmtProcStatus;
346
347 /** Stores Additional Information needed to format the different types of tags*/
348 phFriNfc_sNdefSmtCrdFmt_AddInfo_t AddInfo;
349
350 /* Stores NDEF message TLV*/
351 /* This stores the different TLV messages for the different card types*/
352 uint8_t TLVMsg[PH_FRINFC_SMTCRDFMT_MAX_TLV_TYPE_SUPPORTED][8];
353
354
355} phFriNfc_sNdefSmtCrdFmt_t;
356
357/**
358 * \ingroup grp_fri_smart_card_formatting
359 * \brief Smart Card Formatting \b Reset function
360 *
361 * \copydoc page_reg Resets the component instance to the initial state and initializes the
362 * internal variables.
363 *
364 * \param[in] NdefSmtCrdFmt is a Pointer to a valid and initialized or uninitialised instance
365 * of \ref phFriNfc_sNdefSmtCrdFmt_t .
366 * \param[in] LowerDevice Overlapped HAL reference, pointing at a valid instance of this
367 * underlying component.
368 * \param[in] psRemoteDevInfo Points to the Remote Device Information structure encapsulating
369 * the information about the device (Smart card, NFC device) to access.
370 * \param[in] psDevInputParam The Device input parameter, as used for the HAL POLL function.
371 * This parameter is needed by the component in special cases, when an internal call
372 * to POLL is required again, such as for FeliCa. The storage of the structure behind
373 * the pointer must be retained by the calling software. The component itself only
374 * keeps the reference. No change is applied to the structure's content.
375 * \param[in] ReceiveBuffer Pointer to a buffer that the component uses internally use to
376 * store the data received from the lower component.
377 * The size shall be at least \ref PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE .
378 * \param[in] ReceiveLength The size of ReceiveBuffer. This specifies the actual length
379 * of the data received from the lower component.
380 * The size shall be at least \ref PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE .
381 *
382 * \retval NFCSTATUS_SUCCESS Operation successful.
383 * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid.
384 *
385 * \note This function has to be called at the beginning, after creating an instance of
386 * \ref phFriNfc_sNdefSmtCrdFmt_t . Use this function to reset the instance and/or to switch
387 * to a different underlying card types.
388 */
389NFCSTATUS phFriNfc_NdefSmtCrd_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,
390 void *LowerDevice,
391 phHal_sRemoteDevInformation_t *psRemoteDevInfo,
392 phHal_sDevInputParam_t *psDevInputParam,
393 uint8_t *SendRecvBuffer,
394 uint16_t *SendRecvBuffLen);
395
396
397
398/*!
399 * \ingroup grp_fri_smart_card_formatting
400 *
401 * \brief Setting of the Completion Routine.
402 *
403 * \copydoc page_ovr This function allows the caller to set a Completion Routine (notifier).
404 *
405 * \param[in] NdefSmtCrdFmt Pointer to a valid instance of the \ref phFriNfc_sNdefSmtCrdFmt_t structure describing
406 * the component context.
407 *
408 * \param CompletionRoutine Pointer to a valid completion routine being called when the non-blocking
409 * operation has finished.
410 *
411 * \param CompletionRoutineParam Pointer to a location with user-defined information that is submitted
412 * to the Completion Routine once it is called.
413
414 * \retval NFCSTATUS_SUCCESS Operation successful.
415 * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid.
416 *
417 */
418NFCSTATUS phFriNfc_NdefSmtCrd_SetCR(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,
419 uint8_t FunctionID,
420 pphFriNfc_Cr_t CompletionRoutine,
421 void *CompletionRoutineContext);
422
423
424/*!
425 * \ingroup grp_fri_smart_card_formatting
426 *
427 * \brief Initiates the card formatting procedure for Remote Smart Card Type.
428 *
429 * \copydoc page_ovr The function initiates and formats the Smart Card.After this formation, remote
430 * card would be properly initialized and Ndef Compliant.
431 * Depending upon the different card type, this function handles formatting procedure.
432 * This function also handles the different recovery procedures for different types of the cards. For both
433 * Format and Recovery Management same API is used.
434 *
435 * \param[in] phFriNfc_sNdefSmtCrdFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
436 * structure describing the component context.
437 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
438 * \retval Other values An error has occurred.
439 *
440 */
441NFCSTATUS phFriNfc_NdefSmtCrd_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, const uint8_t *ScrtKeyB);
442
443
Martijn Coenen80ee29b2010-12-16 23:24:55 +0100444#ifdef FRINFC_READONLY_NDEF
445/*!
446 * \ingroup grp_fri_smart_card_formatting
447 *
448 * \brief Initiates the conversion of the already NDEF formatted tag to READ ONLY.
449 *
450 * \copydoc page_ovr The function initiates the conversion of the already NDEF formatted
451 * tag to READ ONLY.After this formation, remote card would be properly Ndef Compliant and READ ONLY.
452 * Depending upon the different card type, this function handles formatting procedure.
453 * This function supports only for the DESFIRE, MIFARE UL and TOPAZ tags.
454 *
455 * \param[in] phFriNfc_sNdefSmtCrdFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t
456 * structure describing the component context.
457 * \retval NFCSTATUS_PENDING The action has been successfully triggered.
458 * \retval Other values An error has occurred.
459 *
460 */
461NFCSTATUS
462phFriNfc_NdefSmtCrd_ConvertToReadOnly (
463 phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt);
464
465#endif /* #ifdef FRINFC_READONLY_NDEF */
466
467
Nick Pelly5d9927b2010-09-23 12:47:58 -0700468/**
469 *\ingroup grp_fri_smart_card_formatting
470 *
471 * \brief Smart card Formatting \b Completion \b Routine or \b Process function
472 *
473 * \copydoc page_ovr Completion Routine: This function is called by the lower layer (OVR HAL)
474 * when an I/O operation has finished. The internal state machine decides
475 * whether to call into the lower device again or to complete the process
476 * by calling into the upper layer's completion routine, stored within this
477 * component's context (\ref phFriNfc_sNdefSmtCrdFmt_t).
478 *
479 * The function call scheme is according to \ref grp_interact. No State reset is performed during
480 * operation.
481 *
482 * \param[in] Context The context of the current (not the lower/upper) instance, as set by the lower,
483 * calling layer, upon its completion.
484 * \param[in] Status The completion status of the lower layer (to be handled by the implementation of
485 * the state machine of this function like a regular return value of an internally
486 * called function).
487 *
488 * \note For general information about the completion routine interface please see \ref pphFriNfc_Cr_t . * The Different Status Values are as follows
489 *
490 */
491void phFriNfc_NdefSmtCrd_Process(void *Context,
492 NFCSTATUS Status);
493
494void phFriNfc_SmtCrdFmt_HCrHandler(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt,
495 NFCSTATUS Status);
496
497/*@}*/
498
499#endif /* PHFRINFC_SMTCRDFMT_H */
500
501