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