| /* |
| * Copyright (C) 2010 NXP Semiconductors |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| /*! |
| * \file phFriNfc_SmtCrdFmt.h |
| * \brief NFC-FRI Smart Card Formatting. |
| * |
| * Project: NFC-FRI |
| * |
| * $Date: Mon Dec 13 14:14:11 2010 $ |
| * $Author: ing02260 $ |
| * $Revision: 1.5 $ |
| * $Aliases: $ |
| * |
| */ |
| |
| #ifndef PHFRINFC_SMTCRDFMT_H |
| #define PHFRINFC_SMTCRDFMT_H |
| |
| /** |
| * \name Smart Card Formatting |
| * |
| * File: \ref phFri_CardFormatFunctions.h |
| * |
| */ |
| /*@{*/ |
| #define PHFRINFC_SMTCRDFMT_FILEREVISION "$Revision: 1.5 $" |
| #define PHFRINFC_SMTCRDFMT_FILEALIASES "$Aliases: $" |
| /*@}*/ |
| |
| /*! \defgroup grp_fri_smart_card_formatting NFC FRI Smart Card Formatting |
| * |
| * Smart Card Formatting functionality enables automatic formatting of any type of smart cards. |
| * This initializes the smart cards and makes them NDEF Compliant. |
| * Single API is provided to handle format/recovery management of different types cards. |
| * Following are different Types of cards supported by this module, currently. |
| * - Type1 ( Topaz) |
| * - Type2 ( Mifare UL) |
| * - Type4 ( Desfire) |
| * - Mifare Std. |
| */ |
| /*@{*/ |
| /** |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief Macro definitions. |
| * \note |
| On requirement basis, new constants will be defined |
| during the implementation phase. |
| */ |
| |
| #define DESFIRE_FMT_EV1 |
| |
| |
| #define PH_FRI_NFC_SMTCRDFMT_NFCSTATUS_FORMAT_ERROR 9 |
| #define PH_FRINFC_SMTCRDFMT_MSTD_DEFAULT_KEYA_OR_KEYB {0xFF, 0xFF,0xFF,0xFF,0xFF,0xFF} |
| #define PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_KEYA {0xA0, 0xA1,0xA2,0xA3,0xA4,0xA5} |
| #define PH_FRINFC_SMTCRDFMT_NFCFORUMSECT_KEYA {0xD3, 0xF7,0xD3,0xF7,0xD3,0xF7} |
| #define PH_FRINFC_SMTCRDFMT_MSTD_MADSECT_ACCESSBITS {0x78,0x77,0x88} |
| #define PH_FRINFC_SMTCRDFMT_MSTD_NFCFORUM_ACCESSBITS {0x7F,0x07,0x88} |
| #define PH_FRINFC_SMTCRDFMT_MAX_TLV_TYPE_SUPPORTED 1 |
| |
| #define PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE 252 |
| |
| #define PH_FRINFC_SMTCRDFMT_STATE_RESET_INIT 1 |
| |
| enum |
| { |
| PH_FRINFC_SMTCRDFMT_MIFARE_UL_CARD, |
| PH_FRINFC_SMTCRDFMT_ISO14443_4A_CARD, |
| PH_FRINFC_SMTCRDFMT_MFSTD_1K_CRD, |
| PH_FRINFC_SMTCRDFMT_MFSTD_4K_CRD, |
| PH_FRINFC_SMTCRDFMT_TOPAZ_CARD |
| }; |
| |
| /** |
| * \name Completion Routine Indices |
| * |
| * These are the indices of the completion routine pointers within the component context. |
| * Completion routines belong to upper components. |
| * |
| */ |
| /*@{*/ |
| /** \ingroup grp_fri_nfc_ndef_map |
| * Completion Routine Index for \ref phFriNfc_SmtCrd_Format */ |
| #define PH_FRINFC_SMTCRDFMT_CR_FORMAT 0 /* */ |
| /** \ingroup grp_fri_nfc_ndef_map Completion |
| * Routine Index for Unknown States/Operations */ |
| #define PH_FRINFC_SMTCRDFMT_CR_INVALID_OPE 1 /* */ |
| /** \ingroup grp_fri_nfc_ndef_map |
| * Number of completion routines that have to be initialised */ |
| #define PH_FRINFC_SMTCRDFMT_CR 2 |
| /*@}*/ |
| |
| |
| /*@}*/ |
| |
| /* |
| * \ingroup grp_fri_smart_card_formatting |
| * |
| * \brief NFC Smart Card Formatting Component Type1 Additional Information Structure |
| * |
| * This structure is used to specify additional information required to format the Type1 card. |
| * \note |
| * On requirement basis,structure will be filled/modified with other parameters |
| * during the implementation phase. |
| * |
| */ |
| typedef struct phFriNfc_Type1_AddInfo |
| { |
| /* Stores the CC byte values. For Ex: 0xE1, 0x10 , 0x0C, 0x00*/ |
| uint8_t CCBytes[5]; |
| uint8_t UID[4]; |
| uint8_t CCByteIndex; |
| |
| } phFriNfc_Type1_AddInfo_t; |
| |
| /* |
| * |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief NFC Smart Card Formatting Component Type2 Additional Information Structure |
| * |
| * This structure is used to specify additional information required to format the Type2 card. |
| * \note |
| * On requirement basis,structure will be filled/modified with other parametes |
| * during the implementation phase. |
| * |
| */ |
| typedef struct phFriNfc_Type2_AddInfo |
| { |
| /* Stores the CC byte values. For Ex: 0xE1, 0x10 , 0x10, 0x00*/ |
| uint8_t OTPBytes[4]; |
| #ifdef FRINFC_READONLY_NDEF |
| uint8_t LockBytes[4]; |
| |
| #ifdef PH_NDEF_MIFARE_ULC |
| uint8_t ReadData[16]; |
| uint8_t ReadDataIndex; |
| uint8_t DynLockBytes[4]; |
| uint8_t BytesLockedPerLockBit; |
| uint8_t LockBytesPerPage; |
| uint8_t LockByteNumber; |
| uint8_t LockBlockNumber; |
| uint8_t NoOfLockBits; |
| uint8_t DefaultLockBytesFlag; |
| uint8_t LockBitsWritten; |
| #endif /* #ifdef PH_NDEF_MIFARE_ULC */ |
| |
| #endif /* #ifdef FRINFC_READONLY_NDEF */ |
| /* Current Block Address*/ |
| uint8_t CurrentBlock; |
| } phFriNfc_Type2_AddInfo_t; |
| |
| /* |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief NFC Smart Card Formatting Component Type4 Additional Information Structure |
| * |
| * This structure is used to specify additional information required to format the type4 card. |
| * \note |
| * On requirement basis,structure will be filled/modified with other parametes |
| * during the implementation phase. |
| * |
| */ |
| |
| typedef struct phFriNfc_Type4_AddInfo |
| { |
| /* Specifies Keys related to PICC/NFCForum Master Key settings*/ |
| /* Stores the PICC Master Key/NFC Forum MasterKey*/ |
| uint8_t PICCMasterKey[16]; |
| uint8_t NFCForumMasterkey[16]; |
| |
| /* To create the files follwoiing attributes are required*/ |
| uint8_t PrevState; |
| uint16_t FileAccessRights; |
| uint32_t CardSize; |
| uint16_t MajorVersion; |
| uint16_t MinorVersion; |
| |
| } phFriNfc_Type4_AddInfo_t; |
| |
| /* |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief NFC Smart Card Formatting Component Mifare Std Additional Information Structure |
| * |
| * This structure is used to specify additional information required to format the Mifare Std card. |
| * \note |
| * On requirement basis,structure will be filled/modified with other parametes |
| * during the implementation phase. |
| * |
| */ |
| typedef struct phFriNfc_MfStd_AddInfo |
| { |
| /** Device input parameter for poll and connect after failed authentication */ |
| phHal_sDevInputParam_t *DevInputParam; |
| |
| /* Stores the Default KeyA and KeyB values*/ |
| uint8_t Default_KeyA_OR_B[6]; |
| |
| /* Key A of MAD sector*/ |
| uint8_t MADSect_KeyA[6]; |
| |
| /* Key A of NFC Forum Sector sector*/ |
| uint8_t NFCForumSect_KeyA[6]; |
| |
| /* Access Bits of MAD sector*/ |
| uint8_t MADSect_AccessBits[3]; |
| |
| /* Access Bits of NFC Forum sector*/ |
| uint8_t NFCForumSect_AccessBits[3]; |
| |
| /* Secret key B to given by the application */ |
| uint8_t ScrtKeyB[6]; |
| |
| /* Specifies the status of the different authentication handled in |
| formatting procedure*/ |
| uint8_t AuthState; |
| |
| /* Stores the current block */ |
| uint16_t CurrentBlock; |
| |
| /* Stores the current block */ |
| uint8_t NoOfDevices; |
| |
| /* Store the compliant sectors */ |
| uint8_t SectCompl[40]; |
| |
| /* Flag to know that MAD sector */ |
| uint8_t WrMADBlkFlag; |
| |
| /* Fill the MAD sector blocks */ |
| uint8_t MADSectBlk[80]; |
| |
| /* Fill the MAD sector blocks */ |
| uint8_t UpdMADBlk; |
| } phFriNfc_MfStd_AddInfo_t; |
| |
| |
| /* |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief NFC Smart Card Formatting Component ISO-15693 Additional Information Structure |
| * |
| * This structure is used to specify additional information required to format the ISO-15693 card. |
| * \note |
| * On requirement basis,structure will be filled/modified with other parametes |
| * during the implementation phase. |
| * |
| */ |
| typedef struct phFriNfc_ISO15693_AddInfo |
| { |
| /* Stores the current block executed */ |
| uint16_t current_block; |
| /* Sequence executed */ |
| uint8_t format_seq; |
| /* Maximum data size in the card */ |
| uint16_t max_data_size; |
| }phFriNfc_ISO15693_AddInfo_t; |
| |
| /** |
| * \ingroup grp_fri_smart_card_formatting |
| * |
| * \brief NFC Smart Card Formatting Component Additional Information Structure |
| * |
| * This structure is composed to have additional information of different type of tags |
| * Ex: Type1/Type2/Type4/Mifare 1k/4k |
| * |
| * \note |
| * On requirement basis, structure will be filled/modified with other parameters |
| * during the implementation phase. |
| */ |
| typedef struct phFriNfc_sNdefSmtCrdFmt_AddInfo |
| { |
| phFriNfc_Type1_AddInfo_t Type1Info; |
| phFriNfc_Type2_AddInfo_t Type2Info; |
| phFriNfc_Type4_AddInfo_t Type4Info; |
| phFriNfc_MfStd_AddInfo_t MfStdInfo; |
| phFriNfc_ISO15693_AddInfo_t s_iso15693_info; |
| |
| }phFriNfc_sNdefSmtCrdFmt_AddInfo_t; |
| |
| /** |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief NFC Smart Card Formatting Component Context Structure |
| * |
| * This structure is used to store the current context information of the instance. |
| * |
| * \note On requirement basis,structure will be filled/modified with other parameters |
| * during the implementation phase |
| * |
| */ |
| typedef struct phFriNfc_sNdefSmtCrdFmt |
| { |
| /** Pointer to the lower (HAL) instance.*/ |
| void *LowerDevice; |
| |
| /** Holds the device additional informations*/ |
| phHal_sDepAdditionalInfo_t psDepAdditionalInfo; |
| |
| /** Pointer to the Remote Device Information */ |
| phHal_sRemoteDevInformation_t *psRemoteDevInfo; |
| |
| /** Stores the type of the smart card. */ |
| uint8_t CardType; |
| |
| /** Stores operating mode type of the MifareStd. */ |
| /* phHal_eOpModes_t OpModeType[2]; */ |
| |
| /**< \internal The state of the operation. */ |
| uint8_t State; |
| |
| /**< \internal Stores the card state Ex: Blank/Formatted etc. */ |
| uint8_t CardState; |
| |
| /**< \internal Completion Routine Context. */ |
| phFriNfc_CplRt_t CompletionRoutine[PH_FRINFC_SMTCRDFMT_CR]; |
| |
| /**<\internal Holds the completion routine informations of the Smart Card Formatting Layer*/ |
| phFriNfc_CplRt_t SmtCrdFmtCompletionInfo; |
| |
| /**<\internal Holds the Command Type(read/write)*/ |
| phHal_uCmdList_t Cmd; |
| |
| /**< \internal Holds the length of the received data. */ |
| uint16_t *SendRecvLength; |
| |
| /**<\internal Holds the ack of some intial commands*/ |
| uint8_t *SendRecvBuf; |
| |
| /**< \internal Holds the length of the data to be sent. */ |
| uint16_t SendLength; |
| |
| /**< \internal Stores the output/result of the format procedure. Ex: Formatted Successfully, |
| Format Error etc */ |
| NFCSTATUS FmtProcStatus; |
| |
| /** Stores Additional Information needed to format the different types of tags*/ |
| phFriNfc_sNdefSmtCrdFmt_AddInfo_t AddInfo; |
| |
| /* Stores NDEF message TLV*/ |
| /* This stores the different TLV messages for the different card types*/ |
| uint8_t TLVMsg[PH_FRINFC_SMTCRDFMT_MAX_TLV_TYPE_SUPPORTED][8]; |
| |
| |
| } phFriNfc_sNdefSmtCrdFmt_t; |
| |
| /** |
| * \ingroup grp_fri_smart_card_formatting |
| * \brief Smart Card Formatting \b Reset function |
| * |
| * \copydoc page_reg Resets the component instance to the initial state and initializes the |
| * internal variables. |
| * |
| * \param[in] NdefSmtCrdFmt is a Pointer to a valid and initialized or uninitialised instance |
| * of \ref phFriNfc_sNdefSmtCrdFmt_t . |
| * \param[in] LowerDevice Overlapped HAL reference, pointing at a valid instance of this |
| * underlying component. |
| * \param[in] psRemoteDevInfo Points to the Remote Device Information structure encapsulating |
| * the information about the device (Smart card, NFC device) to access. |
| * \param[in] psDevInputParam The Device input parameter, as used for the HAL POLL function. |
| * This parameter is needed by the component in special cases, when an internal call |
| * to POLL is required again, such as for FeliCa. The storage of the structure behind |
| * the pointer must be retained by the calling software. The component itself only |
| * keeps the reference. No change is applied to the structure's content. |
| * \param[in] ReceiveBuffer Pointer to a buffer that the component uses internally use to |
| * store the data received from the lower component. |
| * The size shall be at least \ref PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE . |
| * \param[in] ReceiveLength The size of ReceiveBuffer. This specifies the actual length |
| * of the data received from the lower component. |
| * The size shall be at least \ref PH_FRINFC_SMTCRDFMT_MAX_SEND_RECV_BUF_SIZE . |
| * |
| * \retval NFCSTATUS_SUCCESS Operation successful. |
| * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| * |
| * \note This function has to be called at the beginning, after creating an instance of |
| * \ref phFriNfc_sNdefSmtCrdFmt_t . Use this function to reset the instance and/or to switch |
| * to a different underlying card types. |
| */ |
| NFCSTATUS phFriNfc_NdefSmtCrd_Reset(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, |
| void *LowerDevice, |
| phHal_sRemoteDevInformation_t *psRemoteDevInfo, |
| phHal_sDevInputParam_t *psDevInputParam, |
| uint8_t *SendRecvBuffer, |
| uint16_t *SendRecvBuffLen); |
| |
| |
| |
| /*! |
| * \ingroup grp_fri_smart_card_formatting |
| * |
| * \brief Setting of the Completion Routine. |
| * |
| * \copydoc page_ovr This function allows the caller to set a Completion Routine (notifier). |
| * |
| * \param[in] NdefSmtCrdFmt Pointer to a valid instance of the \ref phFriNfc_sNdefSmtCrdFmt_t structure describing |
| * the component context. |
| * |
| * \param CompletionRoutine Pointer to a valid completion routine being called when the non-blocking |
| * operation has finished. |
| * |
| * \param CompletionRoutineParam Pointer to a location with user-defined information that is submitted |
| * to the Completion Routine once it is called. |
| |
| * \retval NFCSTATUS_SUCCESS Operation successful. |
| * \retval NFCSTATUS_INVALID_PARAMETER At least one parameter of the function is invalid. |
| * |
| */ |
| NFCSTATUS phFriNfc_NdefSmtCrd_SetCR(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, |
| uint8_t FunctionID, |
| pphFriNfc_Cr_t CompletionRoutine, |
| void *CompletionRoutineContext); |
| |
| |
| /*! |
| * \ingroup grp_fri_smart_card_formatting |
| * |
| * \brief Initiates the card formatting procedure for Remote Smart Card Type. |
| * |
| * \copydoc page_ovr The function initiates and formats the Smart Card.After this formation, remote |
| * card would be properly initialized and Ndef Compliant. |
| * Depending upon the different card type, this function handles formatting procedure. |
| * This function also handles the different recovery procedures for different types of the cards. For both |
| * Format and Recovery Management same API is used. |
| * |
| * \param[in] phFriNfc_sNdefSmtCrdFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t |
| * structure describing the component context. |
| * \retval NFCSTATUS_PENDING The action has been successfully triggered. |
| * \retval Other values An error has occurred. |
| * |
| */ |
| NFCSTATUS phFriNfc_NdefSmtCrd_Format(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, const uint8_t *ScrtKeyB); |
| |
| |
| #ifdef FRINFC_READONLY_NDEF |
| /*! |
| * \ingroup grp_fri_smart_card_formatting |
| * |
| * \brief Initiates the conversion of the already NDEF formatted tag to READ ONLY. |
| * |
| * \copydoc page_ovr The function initiates the conversion of the already NDEF formatted |
| * tag to READ ONLY.After this formation, remote card would be properly Ndef Compliant and READ ONLY. |
| * Depending upon the different card type, this function handles formatting procedure. |
| * This function supports only for the DESFIRE, MIFARE UL and TOPAZ tags. |
| * |
| * \param[in] phFriNfc_sNdefSmtCrdFmt_t Pointer to a valid instance of the \ref phFriNfc_sNdefSmartCardFmt_t |
| * structure describing the component context. |
| * \retval NFCSTATUS_PENDING The action has been successfully triggered. |
| * \retval Other values An error has occurred. |
| * |
| */ |
| NFCSTATUS |
| phFriNfc_NdefSmtCrd_ConvertToReadOnly ( |
| phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt); |
| |
| #endif /* #ifdef FRINFC_READONLY_NDEF */ |
| |
| |
| /** |
| *\ingroup grp_fri_smart_card_formatting |
| * |
| * \brief Smart card Formatting \b Completion \b Routine or \b Process function |
| * |
| * \copydoc page_ovr Completion Routine: This function is called by the lower layer (OVR HAL) |
| * when an I/O operation has finished. The internal state machine decides |
| * whether to call into the lower device again or to complete the process |
| * by calling into the upper layer's completion routine, stored within this |
| * component's context (\ref phFriNfc_sNdefSmtCrdFmt_t). |
| * |
| * The function call scheme is according to \ref grp_interact. No State reset is performed during |
| * operation. |
| * |
| * \param[in] Context The context of the current (not the lower/upper) instance, as set by the lower, |
| * calling layer, upon its completion. |
| * \param[in] Status The completion status of the lower layer (to be handled by the implementation of |
| * the state machine of this function like a regular return value of an internally |
| * called function). |
| * |
| * \note For general information about the completion routine interface please see \ref pphFriNfc_Cr_t . * The Different Status Values are as follows |
| * |
| */ |
| void phFriNfc_NdefSmtCrd_Process(void *Context, |
| NFCSTATUS Status); |
| |
| void phFriNfc_SmtCrdFmt_HCrHandler(phFriNfc_sNdefSmtCrdFmt_t *NdefSmtCrdFmt, |
| NFCSTATUS Status); |
| |
| /*@}*/ |
| |
| #endif /* PHFRINFC_SMTCRDFMT_H */ |
| |
| |