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_SmtCrdFmt.h
19 * \brief NFC-FRI Smart Card Formatting.
20 *
21 * Project: NFC-FRI
22 *
23 * $Date: Mon Dec 13 14:14:11 2010 $
24 * $Author: ing02260 $
25 * $Revision: 1.5 $
26 * $Aliases:  $
27 *
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/*@{*/
40#define PHFRINFC_SMTCRDFMT_FILEREVISION "$Revision: 1.5 $"
41#define PHFRINFC_SMTCRDFMT_FILEALIASES  "$Aliases:  $"
42/*@}*/
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
64#define DESFIRE_FMT_EV1
65
66
67#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];
145#ifdef FRINFC_READONLY_NDEF
146   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
161#endif /* #ifdef FRINFC_READONLY_NDEF */
162   /* 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 */
176
177typedef 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
191} 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
249
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
270/**
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;
288   phFriNfc_ISO15693_AddInfo_t      s_iso15693_info;
289
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
444#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
468/**
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
502