/*
* 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 */