/*
 * 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.h                                                           *
* \brief HCI Header for the Generic HCI Management.                           *
*                                                                             *
*                                                                             *
* Project: NFC-FRI-1.1                                                        *
*                                                                             *
* $Date: Mon Apr  5 14:37:06 2010 $                                           *
* $Author: ing04880 $                                                         *
* $Revision: 1.39 $                                                           *
* $Aliases: 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_H
#define PHHCINFC_H

/*@}*/
/**
 *  \name HCI
 *
 * File: \ref phHciNfc.h
 *
 */
/*@{*/
#define PH_HCINFC_FILEREVISION "$Revision: 1.39 $" /**< \ingroup grp_file_attributes */
#define PH_HCINFC_FILEALIASES  "$Aliases: 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 <phNfcStatus.h>
#include <phNfcInterface.h>
#ifdef ANDROID
#include <string.h>
#endif

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


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

typedef enum phHciNfc_Init
{
  HCI_SESSION = 0x00,
  HCI_NFC_DEVICE_TEST,
  HCI_CUSTOM_INIT,
  HCI_SELF_TEST
}phHciNfc_Init_t;

/** \ingroup  grp_hal_hci
 *
 * \if hal
 *  \brief HCI Tag Exchange Information
 * \else
 *  \brief HCI-Specific
 * \endif
 *
 *  The <em> Tag Exchange Info Structure </em> holds the exchange information to
 *  the connected tag .
 *
 *  \note All members of this structure are in parameters [in].
 *
 */

typedef struct phHciNfc_Tag_XchgInfo
{
    /** \internal RF Reader Command Type */
    uint8_t                     cmd_type;
    /** \internal Address Field required for only Mifare
     *  Family Proprietary Cards.
     *  The Address Size is Valid only upto 255 Blocks limit
     *  i:e for Mifare 4K
     */
    uint8_t                     addr;
}phHciNfc_Tag_XchgInfo_t;

/** \ingroup  grp_hal_hci
 *
 * \if hal
 *  \brief HCI NFC-IP Exchange Information
 * \else
 *  \brief HCI-Specific
 * \endif
 *
 *  The <em> NFC-IP Exchange Info Structure </em> holds the exchange information to
 *  the connected NFC-IP target .
 *
 *  \note All members of this structure are in parameters [in].
 *
 */

typedef struct phHciNfc_NfcIP_XchgInfo
{
    /** \internal NFC-IP DEP Meta Chining Information */
    uint8_t                     more_info;

}phHciNfc_NfcIP_XchgInfo_t;

/** \ingroup  grp_hal_hci
 *
 * \if hal
 *  \brief HCI Target Exchange Information
 * \else
 *  \brief HCI-Specific
 * \endif
 *
 *  The <em> Target Exchange Info Structure </em> holds all the exchange information to
 *  the connected target .
 *
 *  \note All members of this structure are in parameters [in].
 *
 */


typedef struct phHciNfc_XchgInfo
{
    /** \internal Exchange Data/NFC-IP DEP
     *   Exchange Buffer */
    uint8_t                     *tx_buffer;
    /** \internal Exchange Data/NFC-IP DEP
     *   Exchange Buffer Length*/
    uint16_t                     tx_length;

    union
    {
        phHciNfc_Tag_XchgInfo_t   tag_info;
        phHciNfc_NfcIP_XchgInfo_t nfc_info;
    }params;

}phHciNfc_XchgInfo_t;



/*
################################################################################
*********************** Function Prototype Declaration *************************
################################################################################
*/

/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Initialise function initialises the HCI context and all other
 *  resources used in the HCI Layer for the corresponding interface link.
 *
 *  \param[in,out]  psHciHandle         psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  init_mode               init_mode specifies the kind of the
 *                                      Initialisation for the HCI layer .
 *  \param[in]  pHwConfig               pHwConfig is the Information required
 *                                      to configure the parameters of the
 *                                      NFC Device .
 *  \param[in]  pHalNotify              Upper layer Notification function
 *                                      pointer.
 *  \param[in]  psContext               psContext is the context of
 *                                      the Upper Layer.
 *  \param[in]  psHciLayerCfg           Pointer to the  HCI Layer configuration
 *                                      Structure.
 *
 *  \retval NFCSTATUS_PENDING           Initialisation of HCI Layer is in Progress.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Initialise (
                        void                            *psHciHandle,
                        void                            *pHwRef,
                        phHciNfc_Init_t                 init_mode,
                        phHal_sHwConfig_t               *pHwConfig,
                        pphNfcIF_Notification_CB_t       pHalNotify,
                        void                            *psContext,
                        phNfcLayer_sCfg_t               *psHciLayerCfg
                     );

/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Release function releases all the resources used in the HCI
 *  Layer for the corresponding interface link, described by the HCI handle.
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  pHalReleaseCB           Upper layer release callback function
 *                                      pointer .
 *  \param[in]  psContext               psContext is the context of
 *                                      the Upper Layer.
 *
 *  \retval NFCSTATUS_PENDING           Releasing of HCI Resources are in Progress.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Release (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    pphNfcIF_Notification_CB_t      pHalReleaseCB,
                    void                            *psContext
                  );


extern
NFCSTATUS
phHciNfc_Config_Discovery (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    phHal_sADD_Cfg_t                *pPollConfig
                    );


/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Restart_Discovery function restarts the Polling Wheel.
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  discovery_type                 If True: Start re-polling of the target
 *                                      after the Target Device is de-activated
 *                                      or else - continue discovery with next
 *                                      technology.
 *  \retval NFCSTATUS_PENDING           The Discovery Wheel retarted.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Restart_Discovery (
                        void                            *psHciHandle,
                        void                            *pHwRef,
                        uint8_t                         discovery_type
                     );


 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Start_Discovery function Starts the Polling Wheel.
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \retval NFCSTATUS_PENDING           The Discovery Wheel Started.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Start_Discovery (
                        void                            *psHciHandle,
                        void                            *pHwRef
                     );


 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Stop_Discovery function Stops the Polling Wheel.
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \retval NFCSTATUS_PENDING           The Discovery Wheel Stopped.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Stop_Discovery (
                        void                            *psHciHandle,
                        void                            *pHwRef
                     );


 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Configure function Configures Configures the Polling Wheel to
 *  select the kind of Tags to be polled. This also allows to enable/disable
 *  the Tag Emulation. This also configures the Secure elements the UICC, WI and
 *  Target to Emulate the Tag or Target.
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  config_type             config_type specifies the type of the
 *                                      Parameter configuration.
 *  \param[in]  pConfig                 pConfig is the Information for
 *                                      Configuring the Device.
 *  \retval NFCSTATUS_PENDING           The Emulation configuration pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Configure (
                        void                            *psHciHandle,
                        void                            *pHwRef,
                        phHal_eConfigType_t             config_type,
                        phHal_uConfig_t                 *pConfig
                     );

 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Switch_SmxMode function Switches the WI(S2C) interface
 *  from Wired/Virtual to vice versa.
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  smx_mode                smx_mode specifies the type of the switch
 *                                      configuration.
 *  \param[in]  pPollConfig             pPollConfig is the Information for
 *                                      polling the SmartMX Device.
 *  \retval NFCSTATUS_PENDING           The SmartMX Mode Switch pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 NFCSTATUS
 phHciNfc_Switch_SmxMode (
                        void                            *psHciHandle,
                        void                            *pHwRef,
                        phHal_eSmartMX_Mode_t           smx_mode,
                        phHal_sADD_Cfg_t                *pPollConfig
                     );


 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Switch_SwpMode function Switches the SWP Link
 *  from On/Off to vice versa. 
 *  
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  swp_mode                swp_mode specifies to switch on/off the
 *                                      SWP Link.
 *  \retval NFCSTATUS_PENDING           The SWP Mode Switch pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 NFCSTATUS
 phHciNfc_Switch_SwpMode (
                        void                            *psHciHandle,
                        void                            *pHwRef,
                        phHal_eSWP_Mode_t               swp_mode /* ,
                        void                            *pSwpCfg */
                     );



/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Connect function selects the discovered target to
 *  perform the transactions on it.
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  p_remote_dev_info       p_remote_dev_info is the information
 *                                      of the Target Device to be connected .
 *  \retval NFCSTATUS_PENDING           To select the remote target pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Connect (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    phHal_sRemoteDevInformation_t   *p_remote_dev_info
                 );


/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Reactiavte function reactivates the discovered target to
 *  and selects that target perform the transactions on it.
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  p_remote_dev_info       p_remote_dev_info is the information
 *                                      of the Target Device to be reactivated .
 *  \retval NFCSTATUS_PENDING           To reactivate the remote target pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */


 extern
 NFCSTATUS
 phHciNfc_Reactivate (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    phHal_sRemoteDevInformation_t   *p_target_info
                 );


/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Disconnect function de-selects the selected target and
 *  any ongoing transactions .
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  discovery_type          If NFC_RF_DISCOVERY_REPOLL: Start re-polling of
 *                                      the target after the Target Device is
 *                                      de-activatedor if NFC_RF_DISCOVERY_CONTINUE -
 *                                      continue discovery with next technology or
 *                                      stop the discovery wheel.
 *
 *  \retval NFCSTATUS_PENDING           To De-select the remote target pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Disconnect (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    uint8_t                         discovery_type
                 );


/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Presence_Check function checks for the presence of the target
 *  selected in the vicinity of the Reader's RF Field .
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \retval NFCSTATUS_PENDING           Presence Check of the remote target
 *                                      pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

extern
NFCSTATUS
phHciNfc_Presence_Check (
                    void                            *psHciHandle,
                    void                            *pHwRef
                    );


/**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Select_Next_Target function selects and activates the
 *  next target present in the the Reader's RF Field .
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the
 *                                      context of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \retval NFCSTATUS_PENDING           selection and activation of the next
 *                                      remote target pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

extern
NFCSTATUS
phHciNfc_Select_Next_Target (
                    void                            *psHciHandle,
                    void                            *pHwRef
                    );


 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Exchange_Data function exchanges the data 
 *  to/from the selected remote target device.
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  p_remote_dev_info       p_remote_dev_info is the information of the
 *                                      selected target to which data 
 *                                      should be sent.
 *  \param[in]  p_xchg_info             The exchange info contains the command type,
 *                                      addr and data to be sent to the connected
 *                                      remote target device.
 *  \retval NFCSTATUS_PENDING           Data to remote target pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Exchange_Data (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    phHal_sRemoteDevInformation_t   *p_remote_dev_info,
                    phHciNfc_XchgInfo_t             *p_xchg_info
                );

 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_Send_Data function Sends the data provided
 *  to the appropriate remote target device.
 *
 *
 *  \param[in]  psHciHandle             psHciHandle is the handle or the context
 *                                      of the HCI Layer.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  p_remote_dev_info       p_remote_dev_info is the information 
 *                                      of the selected target to which data 
 *                                      should be sent.
 *  \param[in]  p_send_param            The send param contains the  
 *                                      data to be sent to the
 *                                      remote device.
 *  \retval NFCSTATUS_PENDING           Data to remote device pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

 extern
 NFCSTATUS
 phHciNfc_Send_Data (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    phHal_sRemoteDevInformation_t   *p_remote_dev_info,
                    phHciNfc_XchgInfo_t             *p_send_param
                 );

 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_System_Test function performs the System Management Tests 
 * provided by the NFC Peripheral device.
 *
 *  \param[in]  psContext               psContext is the pointer to HCI Layer
 *                                      context Structure.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  test_type               test_type is the type of the Self Test
 *                                      that needs to be performed on the device.
 *  \param[in]  test_param              test_param is the parameter for the Self Test
 *                                      that needs to be performed on the device.
 *
 *
 *  \retval NFCSTATUS_PENDING           System Test on the System Management 
 *                                      is pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */

extern
NFCSTATUS
phHciNfc_System_Test(
                    void                            *psContext,
                    void                            *pHwRef,
                    uint32_t                        test_type,
                    phNfc_sData_t                   *test_param
                 );

 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_System_Configure function performs the System Management 
 * Configuration with the value provided.
 *
 *  \param[in]  psContext               psContext is the pointer to HCI Layer
 *                                      context Structure.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  config_type             config_type is the type of the configuration
 *                                      that needs to be performed on the device.
 *  \param[in]  config_value            config_value is the value for the configuring
 *                                      that needs to be performed on the device.
 *
 *
 *  \retval NFCSTATUS_PENDING           Configuration of the provided information to
 *                                      the is pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */
extern
NFCSTATUS
phHciNfc_System_Configure (
                void                            *psHciHandle,
                void                            *pHwRef,
                uint32_t                        config_type,
                uint8_t                         config_value
                );

 /**
 * \ingroup grp_hci_nfc
 *
 *  The phHciNfc_System_Get_Info function obtains the System Management 
 * information from the address provided.
 *
 *  \param[in]  psContext               psContext is the pointer to HCI Layer
 *                                      context Structure.
 *  \param[in]  pHwRef                  pHwRef is the Information of
 *                                      the Device Interface Link .
 *  \param[in]  info_type               info_type is the type of the Information
 *                                      that needs to be obtained from the device.
 *  \param[in,out]  p_val               p_val is the pointer to which the 
 *                                      information need to be updated.
 *
 *
 *  \retval NFCSTATUS_PENDING           Get information from the NFC Device
 *                                      is pending.
 *  \retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
 *                                      could not be interpreted properly.
 *  \retval Other errors                Errors related to the other layers
 *
 */
extern
NFCSTATUS
phHciNfc_System_Get_Info(
                void                            *psHciHandle,
                void                            *pHwRef,
                uint32_t                        info_type,
                uint8_t                         *p_val
                );

extern
NFCSTATUS
phHciNfc_PRBS_Test (
                void                            *psHciHandle,
                void                            *pHwRef,
                uint32_t                        test_type,
                phNfc_sData_t                   *test_param
                );

#if 0
 extern
 NFCSTATUS
 phHciNfc_Receive_Data (
                    void                            *psHciHandle,
                    void                            *pHwRef,
                    uint8_t                         *p_data,
                    uint8_t                         length
                 );

#endif


#endif