/*
 * 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  phHciNfc_SWP .h                                                          *
* \brief HCI wired interface gate Management Routines.                        *
*                                                                             *
*                                                                             *
* Project: NFC-FRI-1.1                                                        *
*                                                                             *
* $Date: Fri Aug 14 17:01:28 2009 $                                                                   *
* $Author: ing04880 $                                                                 *
* $Revision: 1.15 $                                                               *
* $Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $                                                                *
*                                                                             *
* =========================================================================== *
*/
#ifndef PHHCINFC_SWP_H
#define PHHCINFC_SWP_H
/*@}*/
/**
 *  \name HCI
 *
 * File: \ref phHciNfc_SWP.h
 *
 */
/*@{*/
#define PHHCINFC_SWPRED_FILEREVISION "$Revision: 1.15 $" /**< \ingroup grp_file_attributes */
#define PHHCINFC_SWPREDINTERFACE_FILEALIASES  "$Aliases: NFC_FRI1.1_WK934_R31_1,NFC_FRI1.1_WK941_PREP1,NFC_FRI1.1_WK941_PREP2,NFC_FRI1.1_WK941_1,NFC_FRI1.1_WK943_R32_1,NFC_FRI1.1_WK949_PREP1,NFC_FRI1.1_WK943_R32_10,NFC_FRI1.1_WK943_R32_13,NFC_FRI1.1_WK943_R32_14,NFC_FRI1.1_WK1007_R33_1,NFC_FRI1.1_WK1007_R33_4,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1023_R35_1 $"   /**< \ingroup grp_file_attributes */
/*@}*/

/****************************** Header File Inclusion *****************************/
#include <phHciNfc_Generic.h>

/******************************* Macro Definitions ********************************/

/* Kb/sec */
#define UICC_REF_BITRATE            (106U) 
#define UICC_MAX_CONNECT_RETRY      (0x02U)

/* SWP switch mode event parameters */
#define UICC_SWITCH_MODE_OFF        (0x00U)
#define UICC_SWITCH_MODE_DEFAULT    (0x01U)
#define UICC_SWITCH_MODE_ON         (0x02U)

/******************** Enumeration and Structure Definition ***********************/

typedef enum phHciNfc_SWP_Seq{
    SWP_INVALID_SEQUENCE = 0x00U, 
    SWP_MODE_SEQ, 
    SWP_STATUS_SEQ, 
    SWP_END_SEQ
}phHciNfc_SWP_Seq_t;

typedef enum phHciNfc_SWP_Status{
    UICC_NOT_CONNECTED          =   0x00U,
    UICC_CONNECTION_ONGOING,
    UICC_CONNECTED,
    UICC_CONNECTION_LOST,
    UICC_DISCONNECTION_ONGOING,
    UICC_CONNECTION_FAILED
}phHciNfc_SWP_Status_t;


/* Information structure for  SWP  Gate */
typedef struct phHciNfc_SWP_Info{

    /* Pointer to SWP gate pipe information */
    phHciNfc_Pipe_Info_t            *p_pipe_info;
    /* SWP gate pipe Identified             */
    uint8_t                         pipe_id;
    /*Current internal Sequence type        */
    phHciNfc_SWP_Seq_t              current_seq;
    /*Current next Sequence ID          */
    phHciNfc_SWP_Seq_t              next_seq;

    phHciNfc_SWP_Status_t           uicc_status;

    uint8_t                         uicc_bitrate;

} phHciNfc_SWP_Info_t;

/************************ Function Prototype Declaration *************************/
/*!
 * \brief Allocates the resources required for  SWP gate management.
 *
 * This function Allocates necessary resources as requiered by SWP gate management
 *
 * \param[in]  psHciContext            psHciContext is the pointer to HCI Layer
 *
 * \retval NFCSTATUS_SUCCESS           Function execution is successful
 *
 * \retval NFCSTATUS_INVALID_PARAMETER One or more of the given inputs are not valid
 */
extern
NFCSTATUS
phHciNfc_SWP_Init_Resources(phHciNfc_sContext_t  *psHciContext);

/**
* \ingroup grp_hci_nfc
*
* \brief Allocates the resources required for  SWP gate management.
*
* This function Allocates necessary resources as requiered by SWP gate management
*
* \param[in]  psHciContext            psHciContext is the pointer to HCI Layer
*
* \retval NFCSTATUS_SUCCESS           Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the given inputs are not valid
*/

extern
NFCSTATUS   
phHciNfc_SWPMgmt_Initialise(
                                phHciNfc_sContext_t     *psHciContext,
                                void                    *pHwRef
                         );

/**
* \ingroup grp_hci_nfc
*
* \brief updates SWP gate specific pipe information .
*
* This function  intialises gate specific informations like pipe id,
* event handler and response handler etc.
*
* \param[in]  psHciContext          psHciContext is the pointer to HCI Layer
* \param[in]  pipeID                pipeID of the SWP management Gate
* \param[in]  pPipeInfo             Update the pipe Information of the SWP
*                                   Management Gate.
*
* \retval NFCSTATUS_SUCCESS           Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the given inputs are not valid
*/
extern
NFCSTATUS
phHciNfc_SWP_Update_PipeInfo(
                                  phHciNfc_sContext_t     *psHciContext,
                                  uint8_t                 pipeID,
                                  phHciNfc_Pipe_Info_t    *pPipeInfo
                                  );
/**
* \ingroup grp_hci_nfc
*
* \brief updates SWP gate specific pipe information .
*
* This function  intialises gate specific informations like pipe id,
* event handler and response handler etc.
*
* \param[in]  psHciContext            psHciContext is the pointer to HCI Layer
*
* \retval NFCSTATUS_SUCCESS           Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER One or more of the given inputs are not valid
*/

extern
NFCSTATUS
phHciNfc_SWP_Get_PipeID(
                       phHciNfc_sContext_t        *psHciContext,
                       uint8_t                    *ppipe_id
                       );

/**
* \ingroup grp_hci_nfc
*
* \brief Enables /disables SWP mode .
*
* This function  enables/disables SWP link associated with UICC.
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
*
* \param[in]  pHwRef                    pHwRef is underlying Hardware context.
*
* \param[in]  enable_type               0 means disable ,1 means enable SWP link.
* \retval NFCSTATUS_SUCCESS             Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern
NFCSTATUS
phHciNfc_SWP_Configure_Default(
                            void        *psHciHandle,
                            void        *pHwRef,
                            uint8_t     enable_type
                        );

/**
* \ingroup grp_hci_nfc
*
* \brief Enables /disables SWP mode .
*
* This function  enables/disables SWP link associated with UICC.
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
*
* \param[in]  pHwRef                    pHwRef is underlying Hardware context.
*
* \param[in]  mode                      TRUE Enable Protection.
* \retval NFCSTATUS_SUCCESS             Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern
NFCSTATUS
phHciNfc_SWP_Protection(
                            void        *psHciHandle,
                            void        *pHwRef,
                            uint8_t     mode
                        );


/**
* \ingroup grp_hci_nfc
*
* \brief To send the switch mode event
*
* This function send an event to change the switch mode.
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
*
* \param[in]  pHwRef                    pHwRef is underlying Hardware context.
*
* \param[in]  uicc_mode                 UICC_SWITCH_MODE_OFF
*                                       UICC_SWITCH_MODE_DEFAULT
*                                       UICC_SWITCH_MODE_ON
* \retval NFCSTATUS_SUCCESS             Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern 
NFCSTATUS 
phHciNfc_SWP_Configure_Mode(
                              void              *psHciHandle,
                              void              *pHwRef,
                              uint8_t           uicc_mode
                          );

/**
* \ingroup grp_hci_nfc
*
* \brief To get the status of the UICC
*
* This function reads the status of the UICC. The status value can be any 
* of the values present in the \ref phHciNfc_SWP_Status_t
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
*
* \param[in]  pHwRef                    pHwRef is underlying Hardware context.
* \retval NFCSTATUS_SUCCESS             Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern
NFCSTATUS
phHciNfc_SWP_Get_Status(
                            void        *psHciHandle,
                            void        *pHwRef
                        );

/**
* \ingroup grp_hci_nfc
*
* \brief To get the bitrate
*
* This function reads the bitrate
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
*
* \param[in]  pHwRef                    pHwRef is underlying Hardware context.
* \retval NFCSTATUS_SUCCESS             Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern
NFCSTATUS
phHciNfc_SWP_Get_Bitrate(
                            void        *psHciHandle,
                            void        *pHwRef
                        );

/**
* \ingroup grp_hci_nfc
*
* \brief To update the sequence
*
* This function reads the bitrate
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
*
* \param[in]  SWP_seq                   SWP sequence.
*
* \retval NFCSTATUS_SUCCESS             Function execution is successful
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern 
NFCSTATUS
phHciNfc_SWP_Update_Sequence(
                                phHciNfc_sContext_t     *psHciContext,
                                phHciNfc_eSeqType_t     SWP_seq
                             );

/**
* \ingroup grp_hci_nfc
*
* \brief To configure default mode and the default status.
*
* This function configures default status and default mode.
* 
*
* \param[in]  psHciContext              psHciContext is pointer to HCI Layer
* \param[in]  pHwRef                    pHwRef is underlying Hardware context.
* \param[in]  ps_emulation_cfg          emulation configuration info.
*
*
* \retval NFCSTATUS_SUCCESS             Function execution is successful
*
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the given inputs are not valid
*/
extern 
NFCSTATUS
phHciNfc_SWP_Config_Sequence(
                            phHciNfc_sContext_t     *psHciContext, 
                            void                    *pHwRef, 
                            phHal_sEmulationCfg_t   *ps_emulation_cfg
                        );
                             

#endif /* #ifndef PHHCINFC_SWP_H */