/*
 * 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  phLibNfc_1.1.h
*\brief Contains FRI1.1 API details.
*Project:   NFC-FRI 1.1
* $Workfile:: phLibNfc_1.1.h  $
* $Modtime::          $
* $Author: ing07385 $
* $Revision: 1.80 $
* $Aliases: NFC_FRI1.1_WK1014_SDK,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1024_SDK $
*\defgroup grp_lib_nfc LIBNFC Component
*/
/* \page LibNfc_release_label FRI1.1 API Release Label
* $Aliases: NFC_FRI1.1_WK1014_SDK,NFC_FRI1.1_WK1017_PREP1,NFC_FRI1.1_WK1017_R34_1,NFC_FRI1.1_WK1017_R34_2,NFC_FRI1.1_WK1019_SDK,NFC_FRI1.1_WK1024_SDK $
*\note This is the TAG (label, alias) of the FRI1.1.
*If the string is empty, the current documentation
* has not been generated for official release.
*/
#ifndef PHLIBNFC_H
#define PHLIBNFC_H
#include <phNfcTypes.h>
#include <phLibNfcStatus.h>
#include <phFriNfc_NdefRecord.h>
#include <phNfcLlcpTypes.h>
#include <phNfcConfig.h>
#ifdef ANDROID
#include <string.h>
#endif

/*!
*\def PHLIBNFC_MAXNO_OF_SE
*Defines maximum no of secured elements supported by PN544.
*/
#define LIBNFC_READONLY_NDEF
#define PHLIBNFC_MAXNO_OF_SE        (0x02)

typedef uint32_t    phLibNfc_Handle;

extern const unsigned char *nxp_nfc_full_version;


/**
*\ingroup grp_lib_nfc
*   
*\brief Defines Testmode Init configuration values 
*/

typedef enum
{
    phLibNfc_TstMode_Off = 0x00,      /**< Test mode is off  */
    phLibNfc_TstMode_On               /**< Testmode is on */

} phLibNfc_Cfg_Testmode_t;


/**
*\ingroup grp_lib_nfc
*   
*\brief Defines Secure Element configurable states 
*/

typedef enum
{
    phLibNfc_SE_Active = 0x00,      /**< state of the SE is active  */
    phLibNfc_SE_Inactive= 0x01      /**< state of the SE is In active*/

} phLibNfc_SE_State_t;

/**
*\ingroup grp_lib_nfc
*
*\brief Defines Secure Element types.
*/
typedef enum
{
    phLibNfc_SE_Type_Invalid=0x00,/**< Indicates SE type is Invalid */
    phLibNfc_SE_Type_SmartMX=0x01,/**< Indicates SE type is SmartMX */
    phLibNfc_SE_Type_UICC   =0x02,/**<Indicates SE type is   UICC */
    phLibNfc_SE_Type_Unknown=0x03/**< Indicates SE type is Unknown */
}phLibNfc_SE_Type_t;

/**
*\ingroup grp_lib_nfc
*
*\brief Defines  Ndef Card Offset.
*/
typedef enum 
{
    phLibNfc_Ndef_EBegin = 0x01,      /**<  Start from Beginning position */
    phLibNfc_Ndef_ECurrent            /**<  Start from Current position */

} phLibNfc_Ndef_EOffset_t;

/**
* \ingroup grp_lib_nfc
*
*\brief This function allows to activate specific Secure element.

*\b VirtualMode: Virtual mode is used to communicated with secure elements from external reader.
*                This mode is also called as card emulation mode.when secure element mode is set
*                to this mode,external reader can communicate with this SE.
*
*\b WiredMode:   Wired mode is used to communicate with the Secure Element internally.  
*                No RF field is generated. In this mode, PN544 acts as reader and discovers 
*                SmartMX as MIFARE tag.External reader cannot access any of the SE's in this mode.
*                This mode is applicable to only SmartMX secure element.
*
*/
typedef enum
{
    phLibNfc_SE_ActModeWired=0x00,      /**< Enables Wired Mode communication.This mode shall
                                        be applied to */
    phLibNfc_SE_ActModeDefault = 0x01,    /**< Enables Virtual Mode communication.
                                        This can be applied to UICC as well as SmartMX*/
    phLibNfc_SE_ActModeVirtual=0x02,    /**< Enables Virtual Mode communication.
                                        This can be applied to UICC as well as SmartMX*/
    phLibNfc_SE_ActModeOff  =0x03       /**< Inactivate SE.This means,put SE in in-active state */

}phLibNfc_eSE_ActivationMode;

/**
* \ingroup grp_lib_nfc
*
*\brief Defines SE low power mode types.
*/
typedef enum
{
    phLibNfc_SE_LowPowerMode_Off= 0x01, /**< Indicates no SE to be selected in low power mode */
    phLibNfc_SE_LowPowerMode_On = 0x02  /**< Indicates requested SE to be  selected in low power mode */ 

} phLibNfc_SE_LowPowerMode_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Defines Secure element event info .
*/
typedef union phLibNfc_uSeEvtInfo
{
   phNfc_sUiccInfo_t UiccEvtInfo;	/**< Indicates UICC event info for Evt_Transaction event */
}phLibNfc_uSeEvtInfo_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Types of SE transaction events sent to SE notification handler .
*/
typedef enum
{
    phLibNfc_eSE_EvtStartTransaction=0x00,   /**< Indicates  transaction started on 
                                            secure element */
    phLibNfc_eSE_EvtEndTransaction=0x01,      /**<Indicates  transaction ended on    secure
                                             element*/
    phLibNfc_eSE_EvtTypeTransaction=0x02,   /**<Indicates external reader trying to access secure element */ 
                                                                                       
    phLibNfc_eSE_EvtConnectivity,           /**<This event notifies the terminal host that it shall
                                           send a connectivity event from UICC as defined in 
                                           ETSI TS 102 622 V7.4.0 */
    phLibNfc_eSE_EvtFieldOn,  // consider using phLibNfc_eSE_EvtConnectivity
    phLibNfc_eSE_EvtFieldOff,
} phLibNfc_eSE_EvtType_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Defines possible registration details for notifications.
*/
typedef phNfc_sSupProtocol_t    phLibNfc_Registry_Info_t;

/**
* \ingroup grp_lib_nfc
*
*\brief  Generic Data buffer definition.
*/
typedef phNfc_sData_t phLibNfc_Data_t;
/**
* \ingroup grp_lib_nfc
*
* Application Identifier (phLibNfc_AID)
*
* The application identifier defines a specific application on a SE.
*
*/
typedef phNfc_sData_t   phLibNfc_AID;
/**
* \ingroup grp_lib_nfc
*
*\brief Remote Device Info definition  .
*/
typedef phNfc_sRemoteDevInformation_t   phLibNfc_sRemoteDevInformation_t; 
/**
* \ingroup grp_lib_nfc
*/
typedef phNfc_eDiscoveryConfigMode_t    phLibNfc_eDiscoveryConfigMode_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Transceive info definition.
*/
typedef phNfc_sTransceiveInfo_t         phLibNfc_sTransceiveInfo_t;
/**
* \ingroup grp_lib_nfc
*
*\brief Automatic Device Discovery Definition. 
*/
typedef phNfc_sADD_Cfg_t            phLibNfc_sADD_Cfg_t;
/**
*\ingroup grp_lib_nfc
*
*\brief Release mode definition. 
*/
typedef phNfc_eReleaseType_t        phLibNfc_eReleaseType_t;

/**
*\ingroup grp_lib_nfc
*
*\brief device capabilities details.
*/
typedef phNfc_sDeviceCapabilities_t phLibNfc_sDeviceCapabilities_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Defines supported tag types for NDEF mapping and formatting feature.
*/
typedef struct SupportedTagInfo
{
    unsigned MifareUL:1;  /**<TRUE indicates  specified feature (mapping or formatting)for MIFARE UL tag supported else  not supported.*/
    unsigned MifareStd:1;  /**<TRUE indicates  specified feature (mapping or formatting)for Mifare Std tag supported else  not supported.*/
    unsigned MifareULC:1;  /**<TRUE indicates  specified feature (mapping or formatting)for MIFARE UL2 tag supported else  not supported.*/
    unsigned ISO14443_4A:1;  /**<TRUE indicates  specified feature (mapping or formatting)for ISO14443_4A tag supported else  not supported.*/
    unsigned ISO14443_4B:1;  /**<TRUE indicates  specified feature (mapping or formatting)for ISO14443_4B tag supported else  not supported.*/
    unsigned ISO15693:1;  /**<TRUE indicates  specified feature (mapping or formatting)for ISO15693 tag supported else  not supported.*/
    unsigned FeliCa:1;  /**<TRUE indicates  specified feature (mapping or formatting)for FeliCa tag  supported else  not supported.*/
    unsigned Jewel:1;  /**<TRUE indicates  specified feature (mapping or formatting)for JEWEL tag supported else  not supported.*/
    unsigned Desfire:1;  /**<TRUE indicates  specified feature (mapping or formatting)for desfire tag supported else  not supported.*/

}phLibNfc_sSupportedTagInfo_t;


/**
* \ingroup grp_lib_nfc
*
*\brief Defines supported tag types for NDEF mapping feature.
*/
typedef phLibNfc_sSupportedTagInfo_t  phLibNfc_sNDEFMappingInfo_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Defines supported tag types for NDEF formatting feature.
*/

typedef phLibNfc_sSupportedTagInfo_t  phLibNfc_sTagFormattingInfo_t; 

/**
* \ingroup grp_lib_nfc
*
*\brief Stack capabilities details contains device capabilities and supported tags for NDEF mapping and formatting feature.
*/

typedef struct StackCapabilities
{ 
    phLibNfc_sDeviceCapabilities_t      psDevCapabilities;
    phLibNfc_sNDEFMappingInfo_t         psMappingCapabilities;
    phLibNfc_sTagFormattingInfo_t       psFormatCapabilities;
}phLibNfc_StackCapabilities_t;


/**
* \ingroup grp_lib_nfc
*
*\brief Defines Secure Element list type.
*/
typedef struct phLibNfc_SecureElementInfo
{
    phLibNfc_Handle         hSecureElement; /**< handle to Secure Element */
    phLibNfc_SE_Type_t      eSE_Type;       /**< type of Secure Element(SE)*/
    phLibNfc_SE_State_t     eSE_CurrentState;/**< state of the secure element indicates activated or not*/
} phLibNfc_SE_List_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Defines target specific info obtained during device discovery.
*/
typedef struct phLibNfc_RemoteDev
{
    phLibNfc_Handle                   hTargetDev;       /**< discovered Target handle */
    phLibNfc_sRemoteDevInformation_t* psRemoteDevInfo;  /**< discovered Target details */

}phLibNfc_RemoteDevList_t;

typedef  phNfc_sNfcIPCfg_t      phLibNfc_sNfcIPCfg_t;

/**
*\ingroup grp_lib_nfc 
*\brief  NDEF registration structure definition.
*/
typedef struct phLibNfc_Ndef_SrchType
{
    uint8_t Tnf;        /**<  Type Name Format of this NDEF record */
    uint8_t *Type;      /**<  Type field of this NDEF record */
    uint8_t TypeLength; /**<  Length of the Type field of this NDEF record */
} phLibNfc_Ndef_SrchType_t;

/**
*\ingroup grp_lib_nfc 
* \brief NDEF information structure definition. \n 
*/
typedef struct phLibNfc_Ndef_Info
{
    uint32_t                NdefMessageLengthActual;   /**<  Actual length of the NDEF message  */
    uint32_t                NdefMessageLengthMaximum;  /**<  Maximum length of the NDEF message */
    uint8_t                 *pNdefMessage;             /**<  Pointer to raw NDEF Data buffer    */
    uint32_t                NdefRecordCount;           /**<  Number of NDEF records pointed by pNdefRecord */
    phFriNfc_NdefRecord_t   *pNdefRecord;              /**<  Pointer to the NDEF Records contained within the NDEF message */
    
} phLibNfc_Ndef_Info_t;

/* As per NFC forum specification, the card can be in either of the below mentioned states 
    INVALID - means card is NOT NFC forum specified tag. NDEF FORMAT can only be performed for 
                the factory cards, other cards may or may not be formatted for NDEF FORMAT function.
    INITIALISED - means card is NFC forum specified tag. But, in this state 
                the user has to first call NDEF WRITE, because in INITIALISED state, there 
                wont be any data i.e.,ACTUAL NDEF FILE SIZE is 0. After the first 
                NDEF WRITE, NDEF READ and WRITE functions can be called any number of times.
    READ WRITE - means card is NFC forum specified tag. User can use both 
                NDEF READ and WRITE functions
    READ ONLY - means card is NFC forum specified tag. User can only use 
                NDEF READ. NDEF WRITE function will not work.    
    */
#define PHLIBNFC_NDEF_CARD_INVALID                      0x00U
#define PHLIBNFC_NDEF_CARD_INITIALISED                  0x01U
#define PHLIBNFC_NDEF_CARD_READ_WRITE                   0x02U
#define PHLIBNFC_NDEF_CARD_READ_ONLY                    0x03U

/**
* \ingroup grp_lib_nfc
*
*\brief Ndef Information Structure.
*/
typedef struct phLibNfc_ChkNdef_Info
{
    uint8_t   NdefCardState;                    /**< Card state information */
    uint32_t  ActualNdefMsgLength;              /**< Indicates Actual length of NDEF Message in Tag */
    uint32_t  MaxNdefMsgLength;                 /**< Indicates Maximum Ndef Message length that Tag can hold*/ 
} phLibNfc_ChkNdef_Info_t;

/**
*\ingroup grp_lib_nfc
*
*\brief LLCP link status. Refer to \ref phFriNfc_LlcpMac_eLinkStatus_t
*
*/
typedef phFriNfc_LlcpMac_eLinkStatus_t phLibNfc_Llcp_eLinkStatus_t;

typedef  phFriNfc_Llcp_sLinkParameters_t  phLibNfc_Llcp_sLinkParameters_t;

typedef phFriNfc_LlcpTransport_eSocketType_t phLibNfc_Llcp_eSocketType_t;

typedef phFriNfc_LlcpTransport_sSocketOptions_t phLibNfc_Llcp_sSocketOptions_t;

/**
* \ingroup grp_lib_nfc
*
*\brief Response callback for connect request.
*
* Callback type used to indicate a Connect request Successful or Failure indication to 
* LibNfc client.
*
* \param[in] pContext           Context passed in the connect request before.
* \param[in] hRemoteDev         Handle to remote device on which connect was requested. 
* \param[in] psRemoteDevInfo    contains updated remote device details.For few tags
*                               like ISO-14443A  details like historical bytes gets updated 
*                               only after connecting to target.Once connect is successful
*                               \b psRemoteDevInfo gets updated.
*
* \param[in] status             Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS          Connect operation successful.
*                  \param NFCSTATUS_TARGET_LOST Connect operation failed because target is lost.
*                  \param NFCSTATUS_SHUTDOWN    Shutdown in progress.
*
*/

typedef void (*pphLibNfc_ConnectCallback_t) (void*		pContext,
                                phLibNfc_Handle			hRemoteDev,
                                phLibNfc_sRemoteDevInformation_t* psRemoteDevInfo,
                                NFCSTATUS				Status
                                );

/**
* \ingroup grp_lib_nfc
*
*\brief Response callback for disconnect request.
*
* Callback type used to provide a disconnect Success or Failure indication to 
* LibNfc client.
*
* \param[in] pContext       Context passed in the disconnect request before.
* \param[in] hRemoteDev     Handle to remote device on which disconnect is requested.   
* \param[in] status         Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS          Disconnect operation successful.
*                  \param NFCSTATUS_SHUTDOWN    Shutdown in progress.
*
*/
typedef void (*pphLibNfc_DisconnectCallback_t)(void*                pContext,
                                               phLibNfc_Handle      hRemoteDev,
                                               NFCSTATUS            Status
                                              );
/**
* \ingroup grp_lib_nfc
*
*\brief Response callback for IOCTL request.
*
* Callback type to inform success or failure of the Ioctl request 
* made by LibNfc client. It may optionally contain response data
* depending on the Ioctl command type issued.

*
* \param[in] pContext           Context passed in the connect request before.
* \param[in] status             Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS          Ioctl operation successful.
*                  \param NFCSTATUS_TARGET_LOST Ioctl operation failed because target is lost.
*                  \param NFCSTATUS_SHUTDOWN    Ioctl operation failed because Shutdown in progress.
*
*\param[in,out]     pOutParam       contains Ioctl command specific response buffer and size 
*                                   of the buffer.This buffer address will be same as 
*                                   pOutParam sent in \ref phLibNfc_Mgt_IoCtl.
*
*/


typedef void (*pphLibNfc_IoctlCallback_t)   (void*          pContext,                                        
                                             phNfc_sData_t* pOutParam,
                                             NFCSTATUS      Status
                                             );



/**
* \ingroup grp_lib_nfc
*
*\brief Response callback for Transceive request.
*
* This callback type is used to provide received data and it's size to the 
* LibNfc client in \ref phNfc_sData_t format ,when  LibNfc client has performed 
* a Transceive operation on a tag or when the device acts as an Initiator during a 
* P2P transactions.
*
* \param[in] pContext       LibNfc client context   passed in the corresponding request before.
* \param[in] hRemoteDev     Handle to remote device on transceive is performed.     
* \param[in] pResBuffer     Response buffer of type \ref phNfc_sData_t.
* \param[in] status         Status of the response  callback.
*
*           \param NFCSTATUS_SUCCESS                 Transceive operation  successful.
*           \param NFCSTATUS_TARGET_LOST        Transceive operation failed because target is lost.
*           \param NFCSTATUS_SHUTDOWN           Transceive operation failed because Shutdown in progress.
*           \param NFCSTATUS_ABORTED            Aborted due to disconnect request in between.
*
*/
typedef void (*pphLibNfc_TransceiveCallback_t)( void*               pContext,
                                                phLibNfc_Handle     hRemoteDev,
                                                phNfc_sData_t*      pResBuffer,
                                                NFCSTATUS			Status
                                              );

/**
* \ingroup grp_lib_nfc
*
* \brief  Generic Response Callback definition.
*
* Generic callback definition used as callback type in few APIs below.
*
* \note : Status and error codes for this type of callback are documented in respective APIs 
* wherever it is used.
*
* \param[in] pContext       LibNfc client context   passed in the corresponding request
*                           before.
* \param[in] status         Status of the response  callback.
*/
typedef void(*pphLibNfc_RspCb_t) (void* pContext,NFCSTATUS  Status);
/**
* \ingroup grp_lib_nfc
*
* \brief  Check NDEF Callback definition.
*
* This call back is used by check ndef api.
*
* \note : Status and error codes for this type of callback are documented in API 
*
* \param[in] pContext       LibNfc client context   passed in the corresponding request
*                           before.
* \param[in] Ndef_Info      Ndef message length and the container size.
* \param[in] status         Status of the response  callback.
*/
typedef void(*pphLibNfc_ChkNdefRspCb_t)(void*           pContext,
                                phLibNfc_ChkNdef_Info_t Ndef_Info,
                                NFCSTATUS               Status);


/**
* \ingroup grp_lib_nfc
* \brief  Notification handler callback definition.
*
*This callback type is used to provide information on discovered targets to LibNfcClient.
*Discovered targets will be notified in \ref phLibNfc_RemoteDevList_t format.
*In case multiple targets discovered ,remote device list contains these targets one after another.
*
*\note List will be exported as memory block,based on \b uNofRemoteDev
*      parameter application has to access remote devices accordingly.
*
*\b Ex: Multiple targets discovered  can be referred as phLibNfc_RemoteDevList_t[0]
*and phLibNfc_RemoteDevList_t[1].
*
*Subsequent operations on discovered target shall be performed using  target specific handle
*\b hTargetDev.
*
* \param[in] pContext       Client context passed in the corresponding 
*                           request before.The context is handled by client 
*                           only.
*
* \param[in] psRemoteDevList Remote Device list contains discovered target details.
*                            Refer to \ref phLibNfc_RemoteDevList_t .
*                            List size depends on no of remote devices discovered.
*
* \param[in] uNofRemoteDev   Indicates no of remote devices discovered .
*                            In case more than one target discovered,\b psRemoteDevList contains 
*                            multiple target details.   
*
* \param[in] Status Status  of the response callback.
*
*                   \param NFCSTATUS_SUCCESS                 Discovered single target successfully.
*                   \param NFCSTATUS_MULTIPLE_TARGETS   multiple targets found.
*                   \param NFCSTATUS_MULTI_PROTOCOLS    Target found supports multiple protocols.
*                   \param NFCSTATUS_SHUTDOWN           Registration  failed because shutdown in progress.
*                   \param NFCSTATUS_DESELECTED         initiator issued disconnect or intiator 
*                                                       physically removed from the RF field.
*
*\note: multiple tag detection is possible only within same technology but not across 
*       different technologies. 
*/
typedef void (*phLibNfc_NtfRegister_RspCb_t)(
    void*                           pContext,
    phLibNfc_RemoteDevList_t*       psRemoteDevList,
    uint8_t                         uNofRemoteDev,
    NFCSTATUS                       Status
    );
  
/**
* \ingroup grp_lib_nfc
* \brief Response Callback for secure element mode settings.
*
* This callback type is used to provide information on requested secure element is
* activated or not to LibNfcClient. 
*
* \param[in] pContext LibNfc client context     passed in the activation request.
*
* \param[in] hSecureElement     Handle to secure element.
*
* \param[in] Status             Indicates API status.
*           \param NFCSTATUS_SUCCESS    Secure element  activated successfully.
*           \param NFCSTATUS_SHUTDOWN   Activation failed because shutdown in progress.
*           \param NFCSTATUS_FAILED     Activation failed.
*
*/
typedef void(*pphLibNfc_SE_SetModeRspCb_t)(
                                            void*            pContext,
                                            phLibNfc_Handle  hSecureElement,
                                            NFCSTATUS        Status                                          
                                           );
/**
* \ingroup grp_lib_nfc 
* \brief Notification callback for \ref phLibNfc_SE_NtfRegister().
*
* A function of this type is called when external reader tries to access SE.
*
*\param[in] pContext        LibNfc client context passed in the SE notification register request.
*                           The context is Handled by client only.
* \param[in] EventType          Event type of secure element transaction
* \param[in] hSecureElement     handle to Secures Element.
*
*\param[in] pAppID              Application identifier to be accessed on SE .
*                               Sent when available from SE otherwise empty.
*
*\param[in] Status      Indicates API status.
*       \param NFCSTATUS_SUCCESS         Notification handler registered sucessfully.
*       \param NFCSTATUS_SHUTDOWN   Shutdown in progress.
*       \param NFCSTATUS_FAILED     set mode operation failed.
*
*
*/
typedef void (*pphLibNfc_SE_NotificationCb_t) (void*                        pContext,
                                               phLibNfc_eSE_EvtType_t       EventType,
                                               phLibNfc_Handle              hSecureElement,
                                               phLibNfc_uSeEvtInfo_t*       pSeEvtInfo,
                                               NFCSTATUS                    Status
                                               );


/**
*\ingroup grp_lib_nfc
*\brief Receive callback definition.
*
* This callback type is used to provide received data and it's size to the 
* LibNfc client in \ref phNfc_sData_t format ,when  LibNfc client has performed 
* when the device acts as a Target during P2P communication 
*
* \param[in] pContext                   LibNfc client context   passed in the corresponding 
*                                       request before.
* \param[in] pRecvBufferInfo            Response buffer of type \ref phNfc_sData_t.
* \param[in] status                     Status of the response  callback.
*
*           \param NFCSTATUS_SUCCESS         Receive operation  successful.
*           \param NFCSTATUS_SHUTDOWN   Receive operation failed because
*                                       Shutdown in progress.
*           \param NFCSTATUS_ABORTED    Aborted due to initiator issued disconnect request.
*                                       This status code reported,to indicate P2P session
*                                       closed and send and receive requests not allowed any more
*                                       unless new session is started.
*/
typedef void (*pphLibNfc_Receive_RspCb_t)(void*              pContext,                                    
                                          phNfc_sData_t*     pRecvBufferInfo,
                                          NFCSTATUS          status
                                          );
/**
*\ingroup grp_lib_nfc
*
* \brief NDEF Response callback definition
*
*  A function of this type is notified when registered NDEF type detected.
*
* \b Note :Once this type callback is notified,discovery wheel is stopped.
*In order to restart discovery process again it is important to disconnect
*from current tag.LibNfc client shall disconnect explicitly using 
*\ref phLibNfc_RemoteDev_Disconnect() interface.
*
*\param[in] pContext                    Pointer to context previously provided by the user
*\param[in] psNdefInfo                  All Ndef specific details of the remote device discovered.
*\param[in] hRemoteDevice               handle to remote device on which NDEF detection is done.
*
*\param[in] Status                      Indicates callback status.
*
*           \param NFCSTATUS_SUCCESS         Indicates registered tnf  type detected.            .
*           \param NFCSTATUS_SHUTDOWN   Indicates shutdown in progress.
*           \param NFCSTATUS_FAILED     status failed.
*           \param NFCSTATUS_ABORTED    Aborted due to disconnect operation in between.


*/
typedef void (*pphLibNfc_Ndef_Search_RspCb_t)   ( void*                  pContext, 
                                                phLibNfc_Ndef_Info_t*    psNdefInfo,
                                                phLibNfc_Handle          hRemoteDevice,
                                                NFCSTATUS                Status
                                                );   


/**
*\ingroup grp_lib_nfc
*
* \brief LLCP check response callback definition
*/
typedef void (*pphLibNfc_ChkLlcpRspCb_t) ( void*      pContext,
                                           NFCSTATUS  status
                                           );


/**
*\ingroup grp_lib_nfc
*
* \brief LLCP check response callback definition
*/
typedef void (*pphLibNfc_LlcpLinkStatusCb_t) ( void*                         pContext,
                                               phLibNfc_Llcp_eLinkStatus_t   eLinkStatus
                                               );


/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket error notification callback definition
*/
typedef void (*pphLibNfc_LlcpSocketErrCb_t) ( void*      pContext,
                                              uint8_t    nErrCode
                                              );

/**
*\ingroup grp_lib_nfc
*
* \brief Incoming connection on a listening LLCP socket callback definition
*/
typedef void (*pphLibNfc_LlcpSocketListenCb_t) ( void*            pContext,
                                                 phLibNfc_Handle  hIncomingSocket
                                                 );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket connect callback definition
*/
typedef void (*pphLibNfc_LlcpSocketConnectCb_t) ( void*        pContext,
                                                  uint8_t      nErrCode,
                                                  NFCSTATUS    status
                                                  );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket disconnect callback definition
*/
typedef void (*pphLibNfc_LlcpSocketDisconnectCb_t) ( void*        pContext,
                                                     NFCSTATUS    status
                                                     );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket Accept callback definition
*/
typedef void (*pphLibNfc_LlcpSocketAcceptCb_t) ( void*        pContext,
                                                 NFCSTATUS    status
                                                 );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket Reject callback definition
*/
typedef void (*pphLibNfc_LlcpSocketRejectCb_t) ( void*        pContext,
                                                 NFCSTATUS    status
                                                 );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket reception callback definition
*/
typedef void (*pphLibNfc_LlcpSocketRecvCb_t) ( void*     pContext,
                                               NFCSTATUS status
                                               );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket reception with SSAP callback definition
*/
typedef void (*pphLibNfc_LlcpSocketRecvFromCb_t) ( void*       pContext,
                                                   uint8_t     ssap,
                                                   NFCSTATUS   status
                                                   );

/**
*\ingroup grp_lib_nfc
*
* \brief LLCP socket emission callback definition
*/
typedef void (*pphLibNfc_LlcpSocketSendCb_t) ( void*        pContext,
                                               NFCSTATUS    status
                                               );


/*  FUNCTION PROTOTYPES  */
/**
 * \ingroup grp_lib_nfc
 *
 * \brief Driver configuration function
 * This synchronous function configures the given driver Interface and
 * sends the HANDLE to the caller.
 *
 * \param[in]       psConfig   Driver configuration details as provided
 *                             by the upper layer. 
 * \param[in,out]   ppDriverHandle     pointer to which valid Handle to driver
 *                             interface is assigned.
 *
 * \retval NFCSTATUS_SUCCESS                    Configuration happened successfully.
 * \retval NFCSTATUS_INVALID_PARAMETER          At least one parameter of the function
 *                                              is invalid.
 * \retval NFCSTATUS_FAILED                     Configuration failed(example.unable to
 *                                              open HW Interface).
 * \retval NFCSTATUS_INVALID_DEVICE             The device has not been opened or
 *                                              has been disconnected meanwhile
 * \retval NFCSTATUS_BOARD_COMMUNICATION_ERROR  A board communication error occurred
                                                (e.g. configuration went wrong).
 *\msc
*LibNfcClient,LibNfc;
*--- [label="Before initializing Nfc LIB,Configure Driver layer"];
*LibNfcClient=>LibNfc[label="phLibNfc_Mgt_ConfigureDriver()",URL="\ref   phLibNfc_Mgt_ConfigureDriver"];
*LibNfcClient<<LibNfc[label="NFCSTATUS_SUCCESS"];
 *\endmsc
 */
NFCSTATUS phLibNfc_Mgt_ConfigureDriver (pphLibNfc_sConfig_t     psConfig,
                                        void **                 ppDriverHandle
                                        );
 /**
 * \ingroup grp_lib_nfc
 *
 * \brief Release configuration for the given driver Interface.
 *
 * \copydoc page_reg Release all that has been 
 *      initialised in \b phLibNfc_Mgt_ConfigureDriver function (Synchronous function).
 *
 * \param[in] pDriverHandle            Link information of the hardware
 *
 * \retval NFCSTATUS_SUCCESS            Driver Configuration Released successfully.
 * \retval NFCSTATUS_FAILED             Configuration release failed(example: Unable to close Com port).
 *
 *\msc
 *LibNfcClient,LibNfc;
 *LibNfcClient=>LibNfc [label="phLibNfc_Mgt_ConfigureDriver()",URL="\ref phLibNfc_Mgt_ConfigureDriver"];
 *LibNfcClient<<LibNfc [label="NFCSTATUS_SUCCESS"];
 *LibNfcClient=>LibNfc [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
 *LibNfcClient<<LibNfc [label="NFCSTATUS_PENDING"];
 *LibNfcClient<-LibNfc [label="pInitCb"]; 
 *--- [label="Perform feature operations "];
 *LibNfcClient=>LibNfc [label="phLibNfc_Mgt_DeInitialize()",URL="\ref   phLibNfc_Mgt_DeInitialize"];
 *LibNfcClient<<LibNfc [label="NFCSTATUS_PENDING"];
 *LibNfcClient<-LibNfc [label="pDeInitCb"]; 
 *LibNfcClient=>LibNfc [label="phLibNfc_Mgt_UnConfigureDriver()",URL="\ref phLibNfc_Mgt_UnConfigureDriver"];
 *LibNfcClient<<LibNfc [label="NFCSTATUS_SUCCESS"]; 
 *\endmsc
 */
NFCSTATUS phLibNfc_Mgt_UnConfigureDriver (void *                 pDriverHandle
                                          );

NFCSTATUS phLibNfc_HW_Reset ();

NFCSTATUS phLibNfc_Download_Mode ();

// timeout is 8 bits
// bits [0..3] => timeout value, (256*16/13.56*10^6) * 2^value
//                  [0] -> 0.0003s
//                  ..
//                  [14] -> 4.9s
//                  [15] -> not allowed
// bit [4]     => timeout enable
// bit [5..7]  => unused
NFCSTATUS phLibNfc_SetIsoXchgTimeout(uint8_t timeout);
NFCSTATUS phLibNfc_SetHciTimeout(uint32_t timeout_in_ms);

/**
* \ingroup grp_lib_nfc
*
* \brief Initializes the NFC library .
*
*
*\brief This function initializes NFC library and its underlying layers.
* As part of this interface underlying modules gets initialized.
* A session with NFC hardware will be established.
* Once initialization is successful ,NFC library ready for use.
*\note It is must to initialize prior usage of the stack .
*
* \param[in] pDriverHandle      Driver Handle currently application is using.
* \param[in] pInitCb            The init callback is called by the LibNfc when  init is
*                               completed or there is an error in initialization.
*
* \param[in] pContext           Client context which will   be included in
*                               callback when the request is completed.
*
* \retval NFCSTATUS_ALREADY_INITIALISED     Stack is already initialized.
* \retval NFCSTATUS_PENDING                 Init sequence   has been successfully
*                                           started and result will be  conveyed via 
*                                           callback notification.
* \retval NFCSTATUS_INVALID_PARAMETER       The parameter could not be  properly
*                                           interpreted.
*\retval NFCSTATUS_INSUFFICIENT_RESOURCES   Insufficient resource.(Ex: insufficient memory)
*
*\msc
*LibNfcClient,LibNfc;
*--- [label="Before initializing Nfc LIB,Configure Driver layer"];
*LibNfcClient=>LibNfc[label="phLibNfc_Mgt_ConfigureDriver()",URL="\ref   phLibNfc_Mgt_ConfigureDriver"];
*LibNfcClient<<LibNfc[label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pInitCb"];
*\endmsc
*/
NFCSTATUS phLibNfc_Mgt_Initialize (void *                 pDriverHandle,
                                  pphLibNfc_RspCb_t       pInitCb,
                                  void*                   pContext
                                  );
/**
* \ingroup grp_lib_nfc
*
* \brief De-Initializes NFC library.
*
*
* This function de-initializes and closes the current session with  PN544 NFC hardware.
* All configurations and setups done until now are invalidated to restart
* communication. Resources currently used by stack gets released during De-initialization.
*\ref phLibNfc_Mgt_Initialize needs to be    called once stack is
* De-initialized before using the stack again.
*
* \param[in]    pHwHandle       Hardware context currently application is using.
*
* \param[in]    pDeInitCb       De-initialization callback  is called by the LibNfc when init
*                               completed or there is an error in initialization.
* \param[in]    pContext        Client context which will   be included in
*                               callback when the request is completed.
*
* \retval NFCSTATUS_SUCCESS     Device stack is already De-Initialized.
* \retval NFCSTATUS_PENDING     De-Initialization sequence has been successfully
*                               started and result is conveyed via callback 
*                               notification.
*
* \retval NFCSTATUS_INVALID_PARAMETER   The parameter could not be  properly 
*                                       interpreted.
* \retval  NFCSTATUS_NOT_INITIALISED    Indicates stack is not yet initialized.
* \retval  NFCSTATUS_BUSY               Previous request in progress can not accept new request.
* \retval  NFCSTATUS_FAILED             Request failed.

*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pInitCb"]; 
*--- [label="Perform feature operations "];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_DeInitialize()",URL="\ref   phLibNfc_Mgt_DeInitialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pDeInitCb"]; 
*\endmsc
*/
NFCSTATUS phLibNfc_Mgt_DeInitialize(void *                      pDriverHandle,
                                   pphLibNfc_RspCb_t            pDeInitCb,
                                   void*                        pContext
                                   );

/**
* \ingroup grp_lib_nfc
* \brief Get list of available Secure Elements.
*
* This  function retrieves list of secure elements locally connected.
* during LibNfc initialization these SEs enumerated from lower stack and maintained 
* in LibNfc library.Once libNfc client queries using this interface,
* same details exposed to LibNfc client. 
* LibNfc client  shall pass empty list of size \ref PHLIBNFC_MAXNO_OF_SE .
* Once SE list is available, libNfc client can perform operation on specific SE 
* using SE handle.
* The handle given in the \ref phLibNfc_SE_List_t structure stays valid until
* shutdown is called.  
*
*\note In case no SE's found, API still returns \ref NFCSTATUS_SUCCESS with \b uSE_count 
set to zero.Value zero indicates none of the SE's connected to PN544 hardware.

* \param[in,out] pSE_List       contains list of SEs with SE details in \ref phLibNfc_SE_List_t format.
* \param[in,out] uSE_count      contains no of SEs in the list.
*
*\note LibNfc client has to interpret no of secure elements in \b pSE_List   based on this
*count.
*
*\retval    NFCSTATUS_SUCCESS                  Indicates operation is sucessfull.
*\retval    NFCSTATUS_SHUTDOWN                 Operation failed because shutdown in progress.
*\retval    NFCSTATUS_NOT_INITIALISED          Operation failed because stack is not yet initialized.
* \retval   NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                              could not be properly interpreted.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pInitCb"]; 
*--- [label="Now SE list can be retrieved"];
*\endmsc
*/

NFCSTATUS phLibNfc_SE_GetSecureElementList(phLibNfc_SE_List_t*  pSE_List,
                                           uint8_t*             uSE_count
                                           );


/**
* \ingroup grp_lib_nfc
*
*\brief Sets secure element mode.
*
* This  function configures SE to specific mode based on activation mode type.
* Effect of different modes on SE is as below.
*
*\b a)If mode is \ref phLibNfc_SE_ActModeVirtual then external reader can communicate
* with this SE.
*\note This mode is applicable to both UICC and SmartMX.
*
\b b)If mode is \ref phLibNfc_SE_ActModeWired then internal reader can communicate with
* this SE.In this mode PN544 can act as reader and communicate with SE as normal Tag.
*In this mode mode external reader ca not communicate with any of the SEs since RF filed is off.
*
*\note 1.Wired Mode is applicable to only SmartMX not to UICC.
* 2.When SmartMX SE configured in Wired Mode ,LibNfc client shall restart discovery process.
*   SmartMX gets detected as MIFARE tag.
* 3.To exit wired mode ,LibNfc client has to disconnect with release type as "NFC_SMARTMX_RELEASE".
*    
*
*\b c)If mode is \ref phLibNfc_SE_ActModeOff
*This means SE is off mode .It can not be accessed any more in wired or virtual mode. 
*internal reader any more.communicate with internal reader and only
*PN544 can communicate in reader mode and external reader can not 
*communicate with it.This mode is applicable  both SE types ( UICC and SmartMX)
*
* \param[in]  hSE_Handle            Secure  Element Handle .
* \param[in]  eActivation_mode      Indicates SE mode to be configured.
*                                    
*
*
* \param[in]  pphLibNfc_SE_setModeRspCb_t   pointer to response callback.
*
* \param[in]  pContext              Client context which will   be included in
*                                   callback when the request is completed.
*
*
* \retval   NFCSTATUS_PENDING               Activation transaction started.
* \retval   NFSCSTATUS_SHUTDOWN             Shutdown in progress.
* \retval   NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval   NFCSTATUS_INVALID_HANDLE        Invalid Handle.
* \retval   NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                           could not be properly interpreted.
* \retval   NFCSTATUS_REJECTED              Invalid request.(Ex: If wired mode settings called using 
*                                           UICC SE handle ,this error code seen).
* \retval   NFCSTATUS_FAILED                Request failed.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pInitCb"];
*--- [label="Now query for available SE's"];
*LibNfcClient=>LibNfc   [label="phLibNfc_SE_GetSecureElementList()",URL="\ref phLibNfc_SE_GetSecureElementList"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*--- [label="Now configure specific SE"];
*LibNfcClient=>LibNfc   [label="phLibNfc_SE_SetMode(hSE_Handle,)",URL="\ref phLibNfc_SE_SetMode"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pSE_SetMode_Rsp_cb"];
*\endmsc 
*/
NFCSTATUS phLibNfc_SE_SetMode ( phLibNfc_Handle             hSE_Handle, 
                               phLibNfc_eSE_ActivationMode  eActivation_mode,
                               pphLibNfc_SE_SetModeRspCb_t  pSE_SetMode_Rsp_cb,
                               void *                       pContext
                               );

/**
* \ingroup grp_lib_nfc
* \brief Registers notification handler to handle secure element specific events.
*
*  This function registers handler to report SE specific transaction events.
*  Possible different types of events are as defined in \ref phLibNfc_eSE_EvtType_t.

* \param[in]  pSE_NotificationCb    pointer to notification callback.
* \param[in]  pContext              Client context which will   be included in
*                                   callback when the request is completed.
*
*\retval  NFCSTATUS_SUCCESS                 Registration Sucessful.
*\retval  NFSCSTATUS_SHUTDOWN               Shutdown in progress.
*\retval  NFCSTATUS_NOT_INITIALISED         Indicates stack is not yet initialized.
*\retval  NFCSTATUS_INVALID_PARAMETER       One or more of the supplied parameters
*                                           could not be properly interpreted.
*\retval  NFCSTATUS_FAILED                  Request failed.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pInitCb"]; 
*--- [label="Perform feature operations "];
*
*LibNfcClient=>LibNfc   [label="phLibNfc_SE_NtfRegister()",URL="\ref    phLibNfc_SE_NtfRegister"];
LibNfcClient<<LibNfc    [label="NFCSTATUS_SUCCESS"];
*--- [label="Registration sucessfull"];
*
*--- [label="In case external reader performs transactions,callback is notified as shown below"];
*LibNfcClient<-LibNfc   [label="pSE_NotificationCb"]; 
*\endmsc
*/

NFCSTATUS phLibNfc_SE_NtfRegister   (pphLibNfc_SE_NotificationCb_t  pSE_NotificationCb,
                                     void   *                       pContext
                                     );
/**
* \ingroup grp_lib_nfc
*\brief This function unregister the registered listener for SE event.
* This function unregisters the listener which  has been registered with \ref 
* phLibNfc_SE_NtfRegister.
*
*\retval  NFCSTATUS_SUCCESS                 Unregistration successful.
*\retval  NFSCSTATUS_SHUTDOWN               Shutdown in progress.
*\retval  NFCSTATUS_NOT_INITIALISED         Indicates stack is not yet initialized.
*\retval  NFCSTATUS_FAILED                  Request failed.
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pInitCb"]; 
*--- [label="Perform feature operations "];
*LibNfcClient=>LibNfc   [label="phLibNfc_SE_NtfRegister()",URL="\ref    phLibNfc_SE_NtfRegister"];
LibNfcClient<<LibNfc    [label="NFCSTATUS_SUCCESS"];
*--- [label="Registration sucessfull"];
*
*--- [label="In case external reader performs transactions,callback is notified as shown below"];
*
*LibNfcClient<-LibNfc   [label="pSE_NotificationCb"]; 
*--- [label="Unregister SE notification handler in case required "];
*LibNfcClient=>LibNfc   [label="phLibNfc_SE_NtfUnregister()",URL="\ref  phLibNfc_SE_NtfUnregister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];

*\endmsc
*/
NFCSTATUS phLibNfc_SE_NtfUnregister(void);

/**
*\ingroup   grp_lib_nfc
* \brief IOCTL interface. 
*
* The I/O Control function allows   the caller to configure specific 
* functionality provided by the lower layer.Each feature is accessible via a    
* specific IOCTL Code.
*
* \param[in]        pDriverHandle      Interface handle.This parameter is valid only for firmware download feature.
*                                   for other IOCTL features this parameter is  not relevent.
*
* \param[in]        IoctlCode       Control code for the operation. 
*                                   This value identifies the specific 
*                                   operation to be performed.For more details on supported
*                                   IOCTL codes refer to \ref grp_lib_ioctl.
*\param[in,out]     pInParam        Pointer to any input data structure 
*                                   containing data which is interpreted 
*                                   based on IoCtl code and the length of 
*                                   the data.
*
*\param[in,out]     pOutParam       Pointer to output buffer details to hold 
*                                   Ioctl specific response buffer and size of
*                                   the buffer.This buffer will be updated and
*                                   sent back as part of of callback details.
*                                   
*\param[in]         pIoCtl_Rsp_cb   Response callback registered by the caller. 
*                                                                   
* \param[in]    pContext            Client context which will   be included in
*                                   callback when the request is completed.
*
*
*\retval    NFCSTATUS_PENDING           Update in pending state. RspCB will be
*                                       called later. 
*\retval    NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
*                                       could not be properly interpreted. 
*
\retval     NFCSTATUS_BUFFER_TOO_SMALL  The buffer supplied by the caller is to 
*\retval    NFSCSTATUS_SHUTDOWN         Shutdown in progress.
*\retval    NFCSTATUS_NOT_INITIALISED   Indicates stack is not yet initialized.
*\retval    NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters
*                                       could not be properly interpreted.
*
*\msc
*LibNfcClient,LibNfc;
*--- [label="Firmware download Scenario"];

*--- [label="Intialise Driver"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_IoCtl(pDriverHandle,)",URL="\ref phLibNfc_Mgt_IoCtl"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pIoCtl_Rsp_cb()",URL="\ref pphLibNfc_IoctlCallback_t"];
**--- [label="requested IoCtl processed sucessfully "];
*
*\endmsc
*/
NFCSTATUS phLibNfc_Mgt_IoCtl    (void*                      pDriverHandle,
                                 uint16_t                   IoctlCode,
                                 phNfc_sData_t*             pInParam, 
                                 phNfc_sData_t*             pOutParam,
                                 pphLibNfc_IoctlCallback_t  pIoCtl_Rsp_cb,
                                 void*                      pContext    
                                 );

/**
* \ingroup  grp_lib_nfc
* \brief    This interface registers notification handler for target discovery.
*
* This  function allows  libNfc client to register for notifications based technology 
* type it is interested to discover. In case application is interested in multiples technology
* discovery,it can enable respective bits in \b pRegistryInfo . when Registered type target
* is discovered in RF field ,LibNfc notifies registered notification callback.
*
* \note In case this API is called multiple times ,most recent request registry details will be used 
*for registration.
* 
*\param[in] pRegistryInfo           structure contains bitwise registry information.
*                                   Specific technology type discovery can be registered if 
*                                   corresponding bit is enabled.In case bit is disabled
*                                   it indicates specific technology type unregistered.
*
*\param[in] pNotificationHandler    Notification callback.This callback will
*                                   be notified once registered target is discovered.
* \param[in]    pContext            Client context which will   be included in
*                                   callback when the request is completed.
*
* \retval NFCSTATUS_SUCCESS             Indicates registration successful.
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the supplied parameters could
*                                       not be properly interpreted.
* \retval  NFCSTATUS_NOT_INITIALISED    Indicates stack is not yet initialized.
* \retval NFSCSTATUS_SHUTDOWN           Shutdown in progress.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*--- [label="Register for technology type.Ex: MIFARE UL"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*
*\endmsc
*/

NFCSTATUS   phLibNfc_RemoteDev_NtfRegister( 
                                        phLibNfc_Registry_Info_t*       pRegistryInfo,
                                        phLibNfc_NtfRegister_RspCb_t    pNotificationHandler,
                                        void*                           pContext
                                        );


/**
* \ingroup  grp_lib_nfc
* \brief Configure Discovery Modes.
*
*This function is used to configure ,start and stop the discovery wheel. 
*Configuration includes 
*<br><br>a)Enabling/disabling of Reader phases for A,B and F technologies.
*<br>b)Configuring NFC-IP1 Initiator Speed and duration of the Emulation phase .
*
*Discovery wheel configuration based on discovery mode selected is as below.
*<br><br>1.If discovery Mode is set as \ref NFC_DISCOVERY_CONFIG then  previous configurations 
* over written by new configurations passed in \ref phLibNfc_sADD_Cfg_t and Discovery wheel
*restarts with new configurations.
*<br><br>2.If discovery Mode is set as \ref NFC_DISCOVERY_START or \ref NFC_DISCOVERY_STOP then 
* discovery parameters passed in \ref phLibNfc_sADD_Cfg_t will not be considered and previous 
*configurations still holds good.
*<br><br>3.If discovery Mode is set as \ref NFC_DISCOVERY_RESUME discovery mode starts the discovery
*wheel from where it is stopped previously.
*
*\b Note: Config types \b NFC_DISCOVERY_START, \b NFC_DISCOVERY_STOP and \b NFC_DISCOVERY_RESUME
* are not supported currently. It is for future use.
*
* \param[in]    DiscoveryMode           Discovery Mode allows to choose between: 
*                                       discovery configuration and start, stop
*                                       discovery and start discovery (with last
*                                       set configuration).For  mode details refer  to 
\ref phNfc_eDiscoveryConfigMode_t. 
* \param[in]    sADDSetup               Includes Enable/Disable discovery for 
*                                       each protocol   A,B and F.
*                                       Details refer to \ref phNfc_sADD_Cfg_t.
* \param[in]    pConfigDiscovery_RspCb  is called once the discovery wheel 
*                                       configuration is    complete. 
* \param[in]    pContext                Client context which will   be included in
*                                       callback when the request is completed.
*             
*
*\retval NFCSTATUS_PENDING                  Discovery request is in progress and result 
*                                           will be notified via callback later.
*\retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters 
*                                           could not be properly interpreted.
*\retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not initialized.
*\retval NFCSTATUS_INSUFFICIENT_RESOURCES   Insufficient resource.(Ex: insufficient memory)
*\retval NFCSTATUS_BUSY                     already discovery in progress
*                                           or it is already discovered Target  and 
*                                           connected.
*\retval NFSCSTATUS_SHUTDOWN                Shutdown in progress.
*\retval NFCSTATUS_FAILED                   Request failed.

*
*   \note :     During Reader/Initiator mode it is mandatory
*               to call \ref phLibNfc_RemoteDev_Connect before any transaction can be performed
*               with the discovered target. Even if the LibNfc client is not
*               interested in using any of the discovered targets \ref phLibNfc_RemoteDev_Connect
*               and \ref phLibNfc_RemoteDev_Disconnect should be called to restart the Discovery 
*               wheel.
*   \sa \ref phLibNfc_RemoteDev_Connect, phLibNfc_RemoteDev_Disconnect.

*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref 
phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now discovery wheel configured as requested"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*               \param NFCSTATUS_SUCCESS Discovery   Configuration  successful.
*               \param NFCSTATUS_SHUTDOWN       Shutdown in progress.
*               \param NFCSTATUS_FAILED         Request failed.
*/

NFCSTATUS phLibNfc_Mgt_ConfigureDiscovery (phLibNfc_eDiscoveryConfigMode_t  DiscoveryMode,   
                                           phLibNfc_sADD_Cfg_t              sADDSetup,
                                           pphLibNfc_RspCb_t                pConfigDiscovery_RspCb,
                                           void*                            pContext
                                           );


/**
* \ingroup  grp_lib_nfc
* \brief This function is used to to connect to a single Remote Device.
*
* This function is called to connect to discovered target.
* Once notification handler notified sucessfully discovered targets will be available in
* \ref phLibNfc_RemoteDevList_t .Remote device list contains valid handles for discovered 
* targets .Using this interface LibNfc client can connect to one out of 'n' discovered targets.
* A new session is started after  connect operation is successful.The session ends with a
* successful disconnect operation.Connect operation on an already connected tag Reactivates 
* the Tag.This Feature is not Valid for Jewel/Topaz Tags ,and hence a second connect if issued
* without disconnecting a Jewel/Topaz tag always Fails.
*
* \note :In case multiple targets discovered LibNfc client can connect to only one target.
*
* \param[in]     hRemoteDevice       Handle of the target device obtained during discovery process.
*
* \param[in]    pNotifyConnect_RspCb Client response callback to be to be 
*                                    notified to indicate status of the request.
*
* \param[in]    pContext             Client context which will  be included in
*                                    callback when the request is completed.
*
*\retval NFCSTATUS_PENDING           Request initiated, result will be informed via
*                                    callback.
*\retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 
*                                    could not be properly interpreted.
*\retval NFCSTATUS_TARGET_LOST       Indicates target is lost.
*\retval NFSCSTATUS_SHUTDOWN         shutdown in progress.
*\retval NFCSTATUS_NOT_INITIALISED   Indicates stack is not yet initialized.
*\retval NFCSTATUS_INVALID_HANDLE    Target handle is invalid.
*
*\retval NFCSTATUS_FAILED            Request failed.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present Tag to be  discovered"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*
*\endmsc
*/

NFCSTATUS phLibNfc_RemoteDev_Connect(phLibNfc_Handle                hRemoteDevice,
                                     pphLibNfc_ConnectCallback_t    pNotifyConnect_RspCb,
                                     void*                          pContext
                                     );

#ifdef RECONNECT_SUPPORT

/**
* \ingroup  grp_lib_nfc
* \brief This function is used to to connect to NEXT Remote Device.
*
* This function is called only if there are more than one remote device is detected.
* Once notification handler notified sucessfully discovered targets will be available in
* \ref phLibNfc_RemoteDevList_t .Remote device list contains valid handles for discovered 
* targets .Using this interface LibNfc client can connect to one out of 'n' discovered targets.
* A new session is started after  connect operation is successful.
* Similarly, if the user wants to connect to another handle. Libnfc client can select the handle and 
* the previously connected device is replaced by present handle. The session ends with a
* successful disconnect operation. 
* Re-Connect operation on an already connected tag Reactivates the Tag. This Feature is not 
* Valid for Jewel/Topaz Tags ,and hence a second re-connect if issued
* without disconnecting a Jewel/Topaz tag always Fails.
*
* \note :In case multiple targets discovered LibNfc client can re-connect to only one target.
*
* \param[in]     hRemoteDevice       Handle of the target device obtained during discovery process.
*
* \param[in]    pNotifyReConnect_RspCb Client response callback to be to be 
*                                    notified to indicate status of the request.
*
* \param[in]    pContext             Client context which will  be included in
*                                    callback when the request is completed.
*
*\retval NFCSTATUS_PENDING           Request initiated, result will be informed via
*                                    callback.
*\retval NFCSTATUS_INVALID_PARAMETER One or more of the supplied parameters 
*                                    could not be properly interpreted.
*\retval NFCSTATUS_TARGET_LOST       Indicates target is lost.
*\retval NFSCSTATUS_SHUTDOWN         shutdown in progress.
*\retval NFCSTATUS_NOT_INITIALISED   Indicates stack is not yet initialized.
*\retval NFCSTATUS_INVALID_HANDLE    Target handle is invalid.
*
*\retval NFCSTATUS_FAILED            Request failed.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present multiple protocol Tag to be  discovered"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*--- [label="TWO remote device information is received, So connect with one handle"];
*LibNfcClient=>LibNfc [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*--- [label="Connect is successful, so transact using this handle. Now if user wants to switch to another handle then call Reconnect "];
*LibNfcClient=>LibNfc [label="phLibNfc_RemoteDev_ReConnect()",URL="\ref phLibNfc_RemoteDev_ReConnect"];
*LibNfcClient<-LibNfc [label="pNotifyReConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*
*\endmsc
*/
NFCSTATUS 
phLibNfc_RemoteDev_ReConnect (
    phLibNfc_Handle                 hRemoteDevice,
    pphLibNfc_ConnectCallback_t     pNotifyReConnect_RspCb,
    void                            *pContext);

#endif /* #ifdef RECONNECT_SUPPORT */

/**
* \ingroup  grp_lib_nfc
* \brief This interface allows to perform Read/write operation on remote device.
*
* This function allows to send data to and receive data 
* from the target selected by libNfc client.It is also used by the 
* NFCIP1 Initiator while performing a transaction with the NFCIP1 target.
* The LibNfc client  has to provide the handle of the target and the 
* command in order to communicate with the selected remote device.
*
*
*\param[in] hRemoteDevice       handle of the remote device.This handle to be 
*                               same as as handle obtained for specific remote device 
*                               during device discovery.
* \param[in] psTransceiveInfo   Information required by transceive  is concealed in 
*                               this structure.It   contains send,receive buffers 
*                               and command specific details.
*
*
* \param[in] pTransceive_RspCb   Callback function for returning the received response 
*                                or error.
* \param[in]    pContext         Client context which will  be included in
*                                callback when the request is completed.
*
* \retval NFCSTATUS_PENDING      Request    initiated, result will be informed through 
*                                the callback.
*   \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters could
*                                           not be properly interpreted or  invalid.
*   \retval NFCSTATUS_COMMAND_NOT_SUPPORTED The command is not supported.
*   \retval NFSCSTATUS_SHUTDOWN             shutdown in progress.
*   \retval NFCSTATUS_TARGET_LOST           Indicates target is lost.
*   \retval NFCSTATUS_TARGET_NOT_CONNECTED            The Remote Device is not connected.
*   \retval NFCSTATUS_INVALID_HANDLE        Target  handle is invalid
*   \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
*   \retval NFCSTATUS_REJECTED              Indicates invalid request.
*   \retval NFCSTATUS_FAILED                Request failed.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present Tag to be  discovered"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*--- [label="Now perform transceive operation"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Transceive()",URL="\ref  phLibNfc_RemoteDev_Transceive "];
*LibNfcClient<-LibNfc   [label="pTransceive_RspCb",URL="\ref pphLibNfc_TransceiveCallback_t"];
*
*\endmsc
*/

NFCSTATUS phLibNfc_RemoteDev_Transceive(phLibNfc_Handle                 hRemoteDevice,
                                        phLibNfc_sTransceiveInfo_t*     psTransceiveInfo,
                                        pphLibNfc_TransceiveCallback_t  pTransceive_RspCb,
                                        void*                           pContext
                                        );

/**
*\ingroup   grp_lib_nfc
*\brief Allows to disconnect from already connected target.
*
*  The function allows to disconnect from from already connected target. This 
*  function closes the session opened during connect operation.The status of discovery 
*  wheel after disconnection is determined by the \ref phLibNfc_eReleaseType_t parameter. 
*  it is also used to switch from wired to virtual mode in case the discovered
*  device is SmartMX in wired mode. 
*
*\param[in]  hRemoteDevice              handle of the target device.This handle to be 
*                                       same as as handle obtained for specific remote device 
*                                       during device discovery.
* \param[in] ReleaseType                Release mode to be  used while 
*                                       disconnecting from target.Refer \ref phLibNfc_eReleaseType_t
*                                       for possible release types.
*\param[in] pDscntCallback              Client response callback to be  to be notified 
to indicate status of the request.
* \param[in]    pContext                Client context which will   be included in
*                                       callback when the request is completed.

*\retval    NFCSTATUS_PENDING                Request initiated,  result will be informed through 
the callback.
*\retval    NFCSTATUS_INVALID_PARAMETER      One or  more of the supplied parameters could not be
*                                            properly interpreted.
*\retval    NFCSTATUS_TARGET_NOT_CONNECTED   The Remote Device is not connected.
*\retval    NFCSTATUS_NOT_INITIALISED        Indicates stack is not yet initialized.
* \retval   NFCSTATUS_INVALID_HANDLE         Target  handle is invalid.
*\retval    NFSCSTATUS_SHUTDOWN              Shutdown in progress.
*\retval    NFCSTATUS_REJECTED               Indicates previous disconnect in progress.
* \retval   NFCSTATUS_BUSY                   Indicates can not disconnect due to outstanding transaction in progress.
* \retval   NFCSTATUS_FAILED                 Request failed.

*
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present Tag to be  discovered"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Transceive()",URL="\ref  phLibNfc_RemoteDev_Transceive"];
*LibNfcClient<-LibNfc   [label="pTransceive_RspCb",URL="\ref pphLibNfc_TransceiveCallback_t"];
*--- [label="Once transceive is completed Now disconnect"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Disconnect()",URL="\ref  phLibNfc_RemoteDev_Disconnect"];
*LibNfcClient<-LibNfc   [label="pDscntCallback",URL="\ref pphLibNfc_RspCb_t"];
*
*\endmsc
*/
NFCSTATUS phLibNfc_RemoteDev_Disconnect( phLibNfc_Handle                 hRemoteDevice,
                                        phLibNfc_eReleaseType_t          ReleaseType,
                                        pphLibNfc_DisconnectCallback_t   pDscntCallback,
                                        void*                            pContext
										);



/**
* \ingroup  grp_lib_nfc
*\brief This interface unregisters notification handler for target discovery.
*
* This  function unregisters the listener which has been registered with
* phLibNfc_RemoteDev_NtfUnregister() before. After  this call the callback
* function  won't be called anymore. If nothing is  registered the 
* function  still succeeds
* \retval NFCSTATUS_SUCCESS          callback unregistered.
* \retval NFCSTATUS_SHUTDOWN         Shutdown in progress.
*\retval  NFCSTATUS_NOT_INITIALISED Indicates stack is not yet initialized.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*--- [label="Perform operations"];
*--- [label="In case required unregister now"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfUnregister()",URL="\ref phLibNfc_RemoteDev_NtfUnregister"];
*
*\endmsc
*/

NFCSTATUS phLibNfc_RemoteDev_NtfUnregister(void);

/**
* \ingroup  grp_lib_nfc
* \brief Check  for target presence.
* This  function checks ,given target is present in RF filed or not.
* Client can make  use of this API to check  periodically discovered
* tag is present in RF field or not.
*
*
*\param[in]  hRemoteDevice          handle of the target device.This handle to be 
*                                   same as as handle obtained for specific remote device 
*                                   during device discovery.
* \param[in] pPresenceChk_RspCb     callback function called on completion  of the
*                                   presence check or in case an error has occurred.
* \param[in]    pContext            Client context which will   be included in
*                                   callback when the request is completed.
*
* \retval  NFCSTATUS_PENDING        presence check  started. Status will be notified
*                                   via callback.
*
* \retval  NFCSTATUS_NOT_INITIALISED        Indicates stack is not initialized.
* \retval  NFCSTATUS_INVALID_PARAMETER      One or more of the supplied parameters could
*                                           not be properly interpreted.
* \retval  NFCSTATUS_TARGET_NOT_CONNECTED   The Remote Device is not connected.
* \retval  NFCSTATUS_INVALID_HANDLE         Target  handle is invalid
* \retval  NFCSTATUS_SHUTDOWN               Shutdown in progress.
* \retval  NFCSTATUS_FAILED                 Request failed.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present Tag to be  discovered"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_CheckPresence()",URL="\ref phLibNfc_RemoteDev_CheckPresence"];
*LibNfcClient<-LibNfc   [label="pPresenceChk_RspCb",URL="\ref   pphLibNfc_RspCb_t"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS          Successful,indicates tag is present in RF field.
*                  \param NFCSTATUS_TARGET_LOST Indicates target is lost.
*                  \param NFCSTATUS_SHUTDOWN    Shutdown in progress.
*                  \param NFCSTATUS_FAILED      Request failed.
*
*/
NFCSTATUS phLibNfc_RemoteDev_CheckPresence( phLibNfc_Handle     hRemoteDevice,
                                           pphLibNfc_RspCb_t    pPresenceChk_RspCb,
                                           void*                pContext
                                           );

/**
* \ingroup  grp_lib_nfc
*\brief Allows  to check connected tag is NDEF compliant or not.
* This function allows  to validate connected tag is NDEF compliant or  not.
*
*\param[in] hRemoteDevice       handle of the remote device.This handle to be 
*                               same as as handle obtained for specific remote device 
*                               during device discovery.
*\param[in] pCheckNdef_RspCb    Response callback defined by the caller.    
*\param[in] pContext            Client context which will   be included in
*                               callback when the request is completed.
*
* \retval NFCSTATUS_PENDING            The action has been successfully triggered.
* \retval NFCSTATUS_INVALID_PARAMETER  At least one parameter of the function 
*                                      is invalid.
* \retval NFCSTATUS_TARGET_LOST        Indicates target is lost
* \retval NFCSTATUS_TARGET_NOT_CONNECTED         The Remote Device is not connected.
* \retval NFCSTATUS_INVALID_HANDLE     Target   handle is invalid
* \retval NFCSTATUS_SHUTDOWN           Shutdown in progress.
* \retval  NFCSTATUS_FAILED            Request failed.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present NDEF complaint Tag Type"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_CheckNdef()",URL="\ref phLibNfc_Ndef_CheckNdef "];
*LibNfcClient<-LibNfc   [label="pCheckNdef_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS             Successful and tag is NDEF compliant .
*                  \param NFCSTATUS_TARGET_LOST         NDEF check operation is failed because of target is	**														lost.
*                  \param NFCSTATUS_SHUTDOWN            Shutdown in progress.
*                  \param NFCSTATUS_ABORTED             Aborted due to disconnect operation in between.
*                  \param NFCSTATUS_FAILED              Request failed.
*/

NFCSTATUS phLibNfc_Ndef_CheckNdef(phLibNfc_Handle              hRemoteDevice,
                                  pphLibNfc_ChkNdefRspCb_t     pCheckNdef_RspCb,
                                  void*                        pContext);

/**
* \ingroup  grp_lib_nfc
* \brief Read NDEF  message from a Tag.
* This  function reads an NDEF message from already connected tag. 
* the NDEF  message is read starting after the position of the last read operation 
* of the same tag during current session.
* If it's FALSE the NDEF message is read from starting  of the NDEF message.
* If the call returns with NFCSTATUS_PENDING , a response callback pNdefRead_RspCb is 
* called ,when the read operation is complete.
*
*\note Before issuing NDEF read operation LibNfc client should perform NDEF check operation
* using \ref phLibNfc_Ndef_CheckNdef interface.
* If the call back error code is NFCSTATUS_FAILED then the LIBNFC client has to do the 
* phLibNfc_RemoteDev_CheckPresence to find , its communication error or target lost.
*
*\param[in]  hRemoteDevice          handle of the remote device.This handle to be 
*                                   same as as handle obtained for specific remote device 
*                                   during device discovery.
*   \param[in]  psRd                Pointer to  the  read buffer info.
*   \param[in]  Offset              Reading Offset  : phLibNfc_Ndef_EBegin means from the 
*                                   beginning, phLibNfc_Ndef_ECurrent means from the 
*                                   current offset.     
*   \param[in]  pNdefRead_RspCb     Response callback defined by the caller. 
*   \param[in]  pContext            Client context which will   be included in
*                                   callback when the request is completed.
*
* \retval NFCSTATUS_SUCCESS             NDEF read operation successful.
* \retval NFCSTATUS_PENDING             Request accepted and started
* \retval NFCSTATUS_SHUTDOWN            Shutdown in progress
* \retval NFCSTATUS_INVALID_HANDLE      Target  handle is invalid
* \retval NFCSTATUS_NOT_INITIALISED     Indicates stack is not yet initialized.
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the supplied parameters could not 
*                                       be properly interpreted.
* \retval NFCSTATUS_TARGET_NOT_CONNECTED          The Remote Device is not connected. 
* \retval NFCSTATUS_FAILED              Read operation failed since tag does not contain NDEF data.
* \retval NFCSTATUS_NON_NDEF_COMPLIANT  Tag is not Ndef Compliant.
* \param NFCSTATUS_REJECTED             Rejected due to NDEF read issued on non 
*                                       ,or Ndef check has not been performed 
*                                       before the readNDEF tag.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present NDEF complaint Tag Type"];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_CheckNdef()",URL="\ref phLibNfc_Ndef_CheckNdef "];
*LibNfcClient<-LibNfc   [label="pCheckNdef_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_Read()",URL="\ref phLibNfc_Ndef_Read "];
*LibNfcClient<-LibNfc   [label="pNdefRead_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS             NDEF read operation successful.
*                  \param NFCSTATUS_SHUTDOWN            Shutdown in progress.
*                  \param NFCSTATUS_ABORTED             Aborted due to disconnect operation in between.
*                  \param NFCSTATUS_FAILED              Request failed.
*/
NFCSTATUS phLibNfc_Ndef_Read(phLibNfc_Handle                   hRemoteDevice,
                            phNfc_sData_t*                     psRd,
                            phLibNfc_Ndef_EOffset_t            Offset,
                            pphLibNfc_RspCb_t                  pNdefRead_RspCb,
                            void*                              pContext
                            );
/**
**  \ingroup grp_lib_nfc
*
* \brief Write  NDEF data to  NFC tag.
*
* This function allows the client to write a NDEF data to already connected NFC tag.
* Function writes a complete NDEF   message to a tag. If a NDEF message already 
* exists in the tag, it will be overwritten. When the transaction is complete,
* a notification callback is notified.
*   
*\note Before issuing NDEF write operation LibNfc client should perform NDEF check operation
* using \ref phLibNfc_Ndef_CheckNdef interface.
*
*\param[in] hRemoteDevice           handle of the remote device.This handle to be 
*                                   same as as handle obtained for specific remote device 
*                                   during device discovery.
*\param[in] psWr                    Ndef    Buffer to write. If NdefMessageLen is set to 0 
*                                   and pNdefMessage    = NULL, the NFC library will erase
*                                   tag internally.
*\param[in] pNdefWrite_RspCb        Response callback defined by the caller. 
*\param[in] pContext                Client context which will   be included in
*                                   callback when the request is completed.
*
*\note If \ref phNfc_sData_t.NdefMessageLen is 0 bytes,  this function will erase all
*current NDEF data present in the tag. Any non-zero length buffer size
*will attempt to write  NEDF data onto the tag.
* If the call back error code is NFCSTATUS_FAILED then the LIBNFC client has to do the 
* phLibNfc_RemoteDev_CheckPresence to find , its communication error or target lost.
*
*
* \retval NFCSTATUS_PENDING             Request accepted and started.
* \retval NFCSTATUS_SHUTDOWN            Shutdown in progress.
* \retval NFCSTATUS_INVALID_HANDLE      Target  handle is invalid.
* \retval NFCSTATUS_NOT_INITIALISED     Indicates stack is not yet initialized.
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the supplied parameters could not 
*                                       be  properly interpreted.
* \retval NFCSTATUS_NON_NDEF_COMPLIANT  Tag is not Ndef Compliant.
* \retval NFCSTATUS_TARGET_NOT_CONNECTED            The Remote Device is not connected.                
* \retval NFCSTATUS_REJECTED            Rejected due to NDEF write issued without 
*                                       performing a CheckNdef().
* \retval NFCSTATUS_FAILED              operation failed.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present NDEF Tag "];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_CheckNdef()",URL="\ref phLibNfc_Ndef_CheckNdef "];
*LibNfcClient<-LibNfc   [label="pCheckNdef_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_Write()",URL="\ref phLibNfc_Ndef_Write "];
*LibNfcClient<-LibNfc   [label="pNdefWrite_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS                  NDEF write operation is successful.
*                  \param NFCSTATUS_SHUTDOWN            Shutdown in progress.
*                  \param NFCSTATUS_ABORTED,            Aborted due to disconnect operation in between.
*                  \param NFCSTATUS_NOT_ENOUGH_MEMORY   Requested no of bytes to be writen exceeds size of the memory available on the tag.
*                  \param NFCSTATUS_FAILED              Request failed.
*/

NFCSTATUS phLibNfc_Ndef_Write (phLibNfc_Handle          hRemoteDevice,
                               phNfc_sData_t*           psWr,
                               pphLibNfc_RspCb_t        pNdefWrite_RspCb,
                               void*                    pContext
                               );



/**
* \ingroup grp_lib_nfc
*
* \brief Format target.
*
* This function allows the LibNfc client to perform  NDEF formating operation on discovered target.
This function formats given target 
*
*\note 
* <br>1. Prior to formating it is recommended to perform NDEF check using \ref phLibNfc_Ndef_CheckNdef interface.
* <br>2. formatting feature supported only for MIFARE Std,MIFARE UL and Desfire tag types.
* If the call back error code is NFCSTATUS_FAILED then the LIBNFC client has to do the 
* phLibNfc_RemoteDev_CheckPresence to find , its communication error or target lost.
*
*\param[in]  hRemoteDevice          handle of the remote device.This handle to be 
*                                   same as as handle obtained for specific remote device 
*                                   during device discovery.
*\param[in] pScrtKey                info containing the secret key data
*                                   and  Secret key buffer length. 
*
*\param[in] pNdefformat_RspCb       Response    callback defined by the caller. 
*\param[in] pContext                Client context which will   be included in
*                                   callback when the request is completed.
*
*
* \retval NFCSTATUS_PENDING                 Request accepted and started.
* \retval NFCSTATUS_SHUTDOWN                Shutdown in progress.
* \retval NFCSTATUS_INVALID_HANDLE          Target  handle is invalid.
* \retval NFCSTATUS_NOT_INITIALISED         Indicates stack is not yet initialized.
* \retval NFCSTATUS_INVALID_PARAMETER       One or more of the supplied parameters could not 
*                                           be  properly interpreted.
* \retval NFCSTATUS_TARGET_NOT_CONNECTED    The Remote Device is not connected. 
* \retval NFCSTATUS_FAILED                  operation failed.
* \retval NFCSTATUS_REJECTED                Tag is already  formatted one.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present non NDEF Tag "];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_CheckNdef()",URL="\ref phLibNfc_Ndef_CheckNdef "];
*LibNfcClient<-LibNfc   [label="pCheckNdef_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Tag found to be non NDEF compliant ,now format it"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_FormatNdef()",URL="\ref  phLibNfc_RemoteDev_FormatNdef   "];
*LibNfcClient<-LibNfc   [label="pNdefformat_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS                  NDEF formatting operation is successful.
*                  \param NFCSTATUS_SHUTDOWN            Shutdown in progress.
*                  \param NFCSTATUS_ABORTED,            Aborted due to disconnect operation in between.
*                  \param NFCSTATUS_FAILED              Request failed.
*/

NFCSTATUS phLibNfc_RemoteDev_FormatNdef(phLibNfc_Handle         hRemoteDevice,
                                        phNfc_sData_t*          pScrtKey,  
                                        pphLibNfc_RspCb_t       pNdefformat_RspCb,
                                        void*                   pContext
                                        );

#ifdef LIBNFC_READONLY_NDEF
/**
* \ingroup grp_lib_nfc
*
* \brief To convert a already formatted NDEF READ WRITE tag to READ ONLY.
*
* This function allows the LibNfc client to convert a already formatted NDEF READ WRITE
* tag to READ ONLY on discovered target.
*
*\note
* <br>1. Prior to formating it is recommended to perform NDEF check using \ref phLibNfc_Ndef_CheckNdef interface.
* <br>2. READ ONLY feature supported only for MIFARE UL and Desfire tag types.
* If the call back error code is NFCSTATUS_FAILED then the LIBNFC client has to do the
* phLibNfc_RemoteDev_CheckPresence to find, its communication error or target lost.
*
*\param[in] hRemoteDevice           handle of the remote device.This handle to be
*                                   same as as handle obtained for specific remote device
*                                   during device discovery.
*\param[in] pNdefReadOnly_RspCb     Response callback defined by the caller.
*\param[in] pContext                Client context which will be included in
*                                   callback when the request is completed.
*
*
* \retval NFCSTATUS_PENDING                 Request accepted and started.
* \retval NFCSTATUS_SHUTDOWN                Shutdown in progress.
* \retval NFCSTATUS_INVALID_HANDLE          Target  handle is invalid.
* \retval NFCSTATUS_NOT_INITIALISED         Indicates stack is not yet initialized.
* \retval NFCSTATUS_INVALID_PARAMETER       One or more of the supplied parameters could not
*                                           be  properly interpreted.
* \retval NFCSTATUS_TARGET_NOT_CONNECTED    The Remote Device is not connected.
* \retval NFCSTATUS_FAILED                  operation failed.
* \retval NFCSTATUS_REJECTED                Tag is already  formatted one.
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present NDEF Tag "];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_CheckNdef()",URL="\ref phLibNfc_Ndef_CheckNdef "];
*LibNfcClient<-LibNfc   [label="pCheckNdef_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Tag found to be NDEF compliant ,now convert the tag to read only"];
*LibNfcClient=>LibNfc   [label="phLibNfc_ConvertToReadOnlyNdef()",URL="\ref  phLibNfc_ConvertToReadOnlyNdef   "];
*LibNfcClient<-LibNfc   [label="pNdefReadOnly_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS             Converting the tag to READ ONLY NDEF is successful.
*                  \param NFCSTATUS_SHUTDOWN            Shutdown in progress.
*                  \param NFCSTATUS_ABORTED,            Aborted due to disconnect operation in between.
*                  \param NFCSTATUS_FAILED              Request failed.
*/

NFCSTATUS phLibNfc_ConvertToReadOnlyNdef (phLibNfc_Handle       hRemoteDevice,
                                        pphLibNfc_RspCb_t       pNdefReadOnly_RspCb,
                                        void*                   pContext
                                        );
#endif /* #ifdef LIBNFC_READONLY_NDEF */

/**
* \ingroup grp_lib_nfc
* \brief <b>Search for NDEF Record type</b>.
*  
*  This function allows  LibNfc client to search NDEF content based on TNF value and type \n
*
*This API allows to find NDEF records based on  RTD (Record Type Descriptor) info.
*LibNfc internally parses NDEF content based registration type registered.
*In case there is match LibNfc notifies LibNfc client with NDEF information details.
*LibNfc client can search a new NDEF registration type once the previous call is handled.
*
*\param[in]     hRemoteDevice       Handle of the remote device.This handle to be 
*                                   same as as handle obtained for specific remote device 
*                                   during device discovery.
*\param[in]     psSrchTypeList      List of NDEF records to be looked in based on TNF value and type.
*                                   For NDEF search type refer to \ref phLibNfc_Ndef_SrchType.
*                                   If this set to NULL then it means that libNfc client interested in
*                                   all possible NDEF records.
*
*\param[in]     uNoSrchRecords      Indicates no of NDEF records in requested list as mentioned 
*                                   in psSrchTypeList.
*\param[in]     pNdefNtfRspCb       Response callback defined by the caller.    
*\param[in]     pContext            Client context which will   be included in
*                                   callback when callback is notified.
*
*
* \retval NFCSTATUS_SUCCESS             Indicates NDEF notification registration successful.
* \retval NFCSTATUS_SHUTDOWN            Shutdown in progress.
* \retval  NFCSTATUS_NOT_INITIALISED    Indicates stack is not yet initialized.
* \retval NFCSTATUS_INVALID_HANDLE      Target  handle is invalid.
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the supplied parameters could not 
*                                       be  properly interpreted.
* \retval NFCSTATUS_TARGET_NOT_CONNECTED          The Remote Device is not connected. 
* \retval NFCSTATUS_FAILED              operation failed.
* \retval NFCSTATUS_BUSY                Previous request in progress can not accept new request.   
*
* \retval NFCSTATUS_ABORTED             Aborted due to disconnect request in between.
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_configureDiscovery()",URL="\ref phLibNfc_Mgt_ConfigureDiscovery"];
*LibNfcClient<-LibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Now Present NDEF Tag "];
*LibNfcClient<-LibNfc [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*LibNfcClient<-LibNfc   [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_CheckNdef()",URL="\ref phLibNfc_Ndef_CheckNdef "];
*LibNfcClient<-LibNfc   [label="pCheckNdef_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Ndef_SearchNdefContent()",URL="\ref phLibNfc_Ndef_SearchNdefContent"];
*LibNfcClient<-LibNfc   [label="pNdefNtfRspCb",URL="\ref pphLibNfc_Ndef_Search_RspCb_t()"];
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*/
NFCSTATUS phLibNfc_Ndef_SearchNdefContent(  
                                phLibNfc_Handle                 hRemoteDevice,
                                phLibNfc_Ndef_SrchType_t*       psSrchTypeList,  
                                uint8_t                         uNoSrchRecords,
                                pphLibNfc_Ndef_Search_RspCb_t   pNdefNtfRspCb,  
                                void *                          pContext   
                                );




/**
* \ingroup grp_lib_nfc
* \brief <b> Interface used to receive data from initiator at target side during P2P communication</b>.
*
*This function  Allows the NFC-IP1 target to retrieve data/commands coming from the 
*Initiator.Once this function is called by LibNfc client on target side it waits for 
*receiving data from initiator.It is used by libNfc client which acts as target during P2P
*communication.
*
*\note : Once this API is called,its mandatory to wait for receive 
*\ref pphLibNfc_Receive_RspCb_t callback notification,before calling any other 
*API.Only function allowed is \ref phLibNfc_Mgt_DeInitialize.
*
*  \param[in]     hRemoteDevice         Peer handle obtained during device discovery process.
*                                       
*  \param[in]     pReceiveRspCb         Callback function called after receiving 
*                                       the data or in case an error has 
*                                       has occurred.
*
*  \param[in]     pContext              Upper layer context to be returned 
*                                       in the callback.
*
*  \retval NFCSTATUS_PENDING            Receive operation is in progress.
*  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
*                                       could not be properly interpreted.
* \retval  NFCSTATUS_NOT_INITIALISED    Indicates stack is not yet initialized.
* \retval  NFCSTATUS_SHUTDOWN           Shutdown in progress.
* \retval  NFCSTATUS_INVALID_DEVICE     The device has been disconnected meanwhile.
* \retval  NFCSTATUS_DESELECTED         Receive operation is not possible due to
*                                       initiator issued disconnect or intiator 
*                                       physically removed from the RF field.
*
*\retval   NFCSTATUS_REJECTED           Indicates invalid request.
*\retval   NFCSTATUS_FAILED             Request failed.
*
*\msc 
*P2PInitiatorClient,InitiatorLibNfc,P2PTargetLibNfc,P2PTargetClient;
*--- [label="stack is intialised and P2P notification handler registered alredy"];
*P2PTargetClient=>P2PTargetLibNfc   [label="phLibNfc_Mgt_SetP2P_ConfigParams()",URL="\ref    phLibNfc_Mgt_SetP2P_ConfigParams"];
*P2PTargetClient<<P2PTargetLibNfc   [label="NFCSTATUS_PENDING"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pConfigRspCb()",URL="\ref pphLibNfc_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_Mgt_SetP2P_ConfigParams()",URL="\ref    phLibNfc_Mgt_SetP2P_ConfigParams"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pConfigRspCb()",URL="\ref pphLibNfc_RspCb_t"];
*P2PTargetClient=>P2PTargetLibNfc [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref  phLibNfc_Mgt_ConfigureDiscovery"];
*P2PTargetClient<<P2PTargetLibNfc   [label="NFCSTATUS_PENDING"]; 
*P2PTargetClient<-P2PTargetLibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref    phLibNfc_Mgt_ConfigureDiscovery"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Place Initiator and target closely"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*--- [label="On connect target must be immediately ready to receive data from initiator"];
*P2PTargetClient=>P2PTargetLibNfc   [label="phLibNfc_RemoteDev_Receive()",URL="\ref phLibNfc_RemoteDev_Receive"];
*--- [label="Now target waits to receive data from intiator"];
*--- [label="Send data from initiator now"]; 
*P2PInitiatorClient=>InitiatorLibNfc   [label="phLibNfc_RemoteDev_Transceive()",URL="\ref  phLibNfc_RemoteDev_Transceive "];
*P2PInitiatorClient<-InitiatorLibNfc   [label="pTransceive_RspCb",URL="\ref pphLibNfc_TransceiveCallback_t"];
*--- [label="Now data arrived at target side"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pReceiveRspCb",URL="\ref    pphLibNfc_Receive_RspCb_t"];
\endmsc
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*           \param NFCSTATUS_SUCCESS             Receive operation  successful.
*           \param NFCSTATUS_SHUTDOWN       Receive operation failed because Shutdown in progress.
*           \param NFCSTATUS_ABORTED        Aborted due to initiator issued disconnect request.
*                                           or intiator removed physically from the RF field.
*                                           This status code reported,to indicate P2P session
*                                           closed and send and receive requests not allowed 
*                                           any more unless new session is started.
*           \param  NFCSTATUS_DESELECTED    Receive operation is not possible due to
*                                           initiator issued disconnect or intiator 
*                                           physically removed from the RF field.
*/
extern 
NFCSTATUS 
phLibNfc_RemoteDev_Receive( phLibNfc_Handle            hRemoteDevice,
                           pphLibNfc_Receive_RspCb_t   pReceiveRspCb,
                           void*                       pContext
                           );





/**
* \ingroup grp_lib_nfc
* \brief <b>Interface used to send data from target to initiator during P2P communication</b>.
*
*This function  Allows the NFC-IP1 target to send data to Initiator,in response to packet received 
*from initiator during P2P communication.It is must prior to send request target has received 
*data from initiator using \ref phLibNfc_RemoteDev_Receive interface.
*
*
*  \param[in]     hRemoteDevice        Peer handle obtained during device discovery process.
*
*  \param[in]     pTransferData         Data and the length of the data to be 
*                                       transferred.
*  \param[in]     pSendRspCb            Callback function called on completion 
*                                       of the NfcIP sequence or in case an 
*                                       error has occurred.
*
*  \param[in]     pContext              Upper layer context to be returned in 
*                                       the callback.
*
**  \retval NFCSTATUS_PENDING            Send operation is in progress.
*  \retval NFCSTATUS_INVALID_PARAMETER  One or more of the supplied parameters
*                                       could not be properly interpreted.
* \retval  NFCSTATUS_NOT_INITIALISED    Indicates stack is not yet initialized.
* \retval  NFCSTATUS_SHUTDOWN           Shutdown in progress.
*  \retval NFCSTATUS_INVALID_DEVICE     The device has been disconnected meanwhile.
* \retval  NFCSTATUS_BUSY               Previous request in progress can not accept new request.   
* \retval  NFCSTATUS_DESELECTED         Receive operation is not possible due to
*                                       initiator issued disconnect or intiator 
*                                       physically removed from the RF field.
*\retval   NFCSTATUS_REJECTED           Indicates invalid request.
*\retval   NFCSTATUS_FAILED             Request failed.
*
*\msc 
*P2PInitiatorClient,InitiatorLibNfc,P2PTargetLibNfc,P2PTargetClient;
*--- [label="stack is intialised and P2P notification handler registered alredy"];
*P2PTargetClient=>P2PTargetLibNfc   [label="phLibNfc_Mgt_SetP2P_ConfigParams()",URL="\ref    phLibNfc_Mgt_SetP2P_ConfigParams"];
*P2PTargetClient<<P2PTargetLibNfc   [label="NFCSTATUS_PENDING"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pConfigRspCb()",URL="\ref pphLibNfc_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_Mgt_SetP2P_ConfigParams()",URL="\ref    phLibNfc_Mgt_SetP2P_ConfigParams"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pConfigRspCb()",URL="\ref pphLibNfc_RspCb_t"];
*P2PTargetClient=>P2PTargetLibNfc [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref  phLibNfc_Mgt_ConfigureDiscovery"];
*P2PTargetClient<<P2PTargetLibNfc   [label="NFCSTATUS_PENDING"]; 
*P2PTargetClient<-P2PTargetLibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref    phLibNfc_Mgt_ConfigureDiscovery"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Place Initiator and target closely"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*--- [label="On connect target must be immediately ready to receive data from initiator"];
*P2PTargetClient=>P2PTargetLibNfc   [label="phLibNfc_RemoteDev_Receive()",URL="\ref phLibNfc_RemoteDev_Receive"];
*--- [label="Now target waits to receive data from intiator"];
*--- [label="Send data from initiator now"]; 
*P2PInitiatorClient=>InitiatorLibNfc   [label="phLibNfc_RemoteDev_Transceive()",URL="\ref  phLibNfc_RemoteDev_Transceive "];
*--- [label="Now data arrived at target side"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pReceiveRspCb",URL="\ref    pphLibNfc_Receive_RspCb_t"];
*--- [label="Now send data from target"];
*P2PTargetClient=>P2PTargetLibNfc   [label="phLibNfc_RemoteDev_Send()",URL="\ref    phLibNfc_RemoteDev_Send"];
*P2PInitiatorClient<-InitiatorLibNfc   [label="pTransceive_RspCb",URL="\ref pphLibNfc_TransceiveCallback_t"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pSendRspCb",URL="\ref   pphLibNfc_RspCb_t"];
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*           \param NFCSTATUS_SUCCESS             Send operation  successful.
*           \param NFCSTATUS_SHUTDOWN       Send operation failed because Shutdown in progress.
*           \param NFCSTATUS_ABORTED        Aborted due to initiator issued disconnect request.
*                                           or intiator removed physically from the RF field.
*                                           This status code reported,to indicate P2P session
*                                           closed and send and receive requests not allowed 
*                                           any more unless new session is started.
*           \param  NFCSTATUS_DESELECTED    Receive operation is not possible due to
*                                           initiator issued disconnect or intiator 
*                                           physically removed from the RF field.
*
*
*/
extern 
NFCSTATUS 
phLibNfc_RemoteDev_Send(phLibNfc_Handle             hRemoteDevice,
                        phNfc_sData_t*              pTransferData,
                        pphLibNfc_RspCb_t           pSendRspCb,
                        void*                       pContext
                        );

/**
* \ingroup grp_lib_nfc
* \brief <b>Interface to configure P2P and intiator mode configurations</b>.
*  The  setting will be typically take effect for the next cycle of the relevant 
*  phase of discovery. For optional configuration internal defaults will be
*  used in case the configuration is not set.
*
*\note Currently general bytes configuration supported.
*
*  \param[in] pConfigInfo           Union containing P2P configuration details as
*                                   in \ref phLibNfc_sNfcIPCfg_t.
*
*  \param[in] pConfigRspCb          This callback has to be called once LibNfc 
*                                   completes the Configuration.
*
*  \param[in] pContext              Upper layer context to be returned in 
*                                   the callback.
*
*
* \retval NFCSTATUS_PENDING             Config operation is in progress.
* \retval NFCSTATUS_INVALID_PARAMETER   One or more of the supplied parameters
*                                       could not be properly interpreted.
* \retval  NFCSTATUS_NOT_INITIALISED    Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN            Shutdown in progress.
* \retval NFCSTATUS_BUSY                Previous request in progress can not accept new request.   
*
*\msc 
*P2PInitiatorClient,InitiatorLibNfc,P2PTargetLibNfc,P2PTargetClient;
*--- [label="stack is intialised and P2P notification handler registered alredy"];
*P2PTargetClient=>P2PTargetLibNfc   [label="phLibNfc_Mgt_SetP2P_ConfigParams()",URL="\ref    phLibNfc_Mgt_SetP2P_ConfigParams"];
*P2PTargetClient<<P2PTargetLibNfc   [label="NFCSTATUS_PENDING"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pConfigRspCb()",URL="\ref pphLibNfc_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_Mgt_SetP2P_ConfigParams()",URL="\ref    phLibNfc_Mgt_SetP2P_ConfigParams"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PTargetClient=>P2PTargetLibNfc [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref  phLibNfc_Mgt_ConfigureDiscovery"];
*P2PTargetClient<<P2PTargetLibNfc   [label="NFCSTATUS_PENDING"]; 
*P2PTargetClient<-P2PTargetLibNfc   [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_Mgt_ConfigureDiscovery()",URL="\ref    phLibNfc_Mgt_ConfigureDiscovery"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pConfigDiscovery_RspCb",URL="\ref pphLibNfc_RspCb_t"];
*--- [label="Place Initiator and target closely"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*P2PInitiatorClient=>InitiatorLibNfc    [label="phLibNfc_RemoteDev_Connect()",URL="\ref phLibNfc_RemoteDev_Connect"];
*P2PInitiatorClient<<InitiatorLibNfc    [label="NFCSTATUS_PENDING"];
*P2PInitiatorClient<-InitiatorLibNfc    [label="pNotifyConnect_RspCb",URL="\ref pphLibNfc_ConnectCallback_t"];
*P2PTargetClient<-P2PTargetLibNfc   [label="pNotificationHandler",URL="\ref phLibNfc_NtfRegister_RspCb_t"];
*--- [label="Now configured params ( Ex : general bytes can been seen in remote device info"];
*\endmsc
*
*\note Response callback parameters details for this interface are as listed below.
*
* \param[in] pContext   LibNfc client context   passed in the corresponding request before.
* \param[in] status     Status of the response  callback.
*
*                  \param NFCSTATUS_SUCCESS                  configuration operation is successful.
*                  \param NFCSTATUS_SHUTDOWN            Shutdown in progress.
*                  \param NFCSTATUS_FAILED              Request failed.
*
*/
extern NFCSTATUS phLibNfc_Mgt_SetP2P_ConfigParams(   phLibNfc_sNfcIPCfg_t*   pConfigInfo,
                                                    pphLibNfc_RspCb_t       pConfigRspCb,
                                                    void*                   pContext
                                                );

/**
* \ingroup grp_lib_nfc
* \brief <b>Interface to stack capabilities</b>.
*
*  LibNfc client can query to retrieve stack capabilities.Stack capabilities contains
*  <br><br>a).Device capabilities which contains details like protocols supported, 
*  Hardware,Firmware  and model-id version details .For details refer to \ref phNfc_sDeviceCapabilities_t.
* <br><br>b).NDEF mapping related info. This info helps in identifying supported tags for NDEF mapping feature.
* <br><br>c).NDEF formatting related info. This info helps in identifying supported tags for NDEF formatting feature.
*
*  \param[in] phLibNfc_StackCapabilities   Contains device capabilities and NDEF mapping and formatting feature
                                           support for different tag types.
*
*  \param[in] pContext                     Upper layer context to be returned in 
*                                          the callback.
*
*
* \retval NFCSTATUS_SUCCESS               Indicates Get stack Capabilities operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*
*
*\msc
*LibNfcClient,LibNfc;
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_Initialize()",URL="\ref phLibNfc_Mgt_Initialize"];
*LibNfcClient<-LibNfc   [label="pInitCb()",URL="\ref pphLibNfc_RspCb_t()"];
*LibNfcClient=>LibNfc   [label="phLibNfc_RemoteDev_NtfRegister()",URL="\ref phLibNfc_RemoteDev_NtfRegister"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_GetstackCapabilities()",URL="\ref phLibNfc_Mgt_GetstackCapabilities"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*--- [label="Now stack capabilities available "];
*
*\endmsc*/


extern NFCSTATUS phLibNfc_Mgt_GetstackCapabilities(phLibNfc_StackCapabilities_t* phLibNfc_StackCapabilities,
                                                   void*                         pContext
                                                  );


/**
* \ingroup grp_lib_nfcHW_
* \brief <b>Interface to configure local LLCP peer</b>.
*
* This function configures the parameters of the local LLCP peer. This function must be called
* before any other LLCP-related function from this API.
*
* \param[in] pConfigInfo   Contains local LLCP link parameters to be applied
* \param[in] pConfigRspCb  This callback has to be called once LibNfc
*                          completes the Configuration.
* \param[in] pContext      Upper layer context to be returned in
*                          the callback.
*
*
* \retval NFCSTATUS_SUCCESS               Operation successful.
* \retval NFCSTATUS_PENDING               Configuration operation is in progress,
                                          pConfigRspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                Operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*/
extern NFCSTATUS phLibNfc_Mgt_SetLlcp_ConfigParams( phLibNfc_Llcp_sLinkParameters_t* pConfigInfo,
                                                   pphLibNfc_RspCb_t                pConfigRspCb,
                                                   void*                            pContext
                                                   );


/**
* \ingroup grp_lib_nfc
* \brief <b>Checks if a remote peer is LLCP compliant</b>.
*
* This functions allows to check if a previously detected tag is compliant with the
* LLCP protocol. This step is needed before calling any other LLCP-related function on
* this remote peer, except local LLCP peer configurationn, which is more general. Once
* this checking is done, the caller will be able to receive link status notifications
* until the peer is disconnected.
*
* \param[in] hRemoteDevice       Peer handle obtained during device discovery process.
* \param[in] pCheckLlcp_RspCb    The callback to be called once LibNfc
*                                completes the LLCP compliancy check.
* \param[in] pLink_Cb            The callback to be called each time the
*                                LLCP link status changes.
* \param[in] pContext            Upper layer context to be returned in
*                                the callbacks.
*
*
* \retval NFCSTATUS_SUCCESS               Operation successful.
* \retval NFCSTATUS_PENDING               Check operation is in progress, pCheckLlcp_RspCb will
*                                         be called upon completion.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                Operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*/
extern NFCSTATUS phLibNfc_Llcp_CheckLlcp( phLibNfc_Handle              hRemoteDevice,
                                          pphLibNfc_ChkLlcpRspCb_t     pCheckLlcp_RspCb,
                                          pphLibNfc_LlcpLinkStatusCb_t pLink_Cb,
                                          void*                        pContext
                                          );


/**
* \ingroup grp_lib_nfc
* \brief <b>Activates a LLCP link with a remote device </b>.
*
* This function launches the link activation process on a remote LLCP-compliant peer. The link status
* notification will be sent by the corresponding callback given in the phLibNfc_Llcp_CheckLlcp function.
* If the activation fails, the deactivated status will be notified, even if the link is already in a
* deactivated state. 
*
* \param[in] hRemoteDevice       Peer handle obtained during device discovery process.
*
* \retval NFCSTATUS_SUCCESS               Operation successful.
* \retval NFCSTATUS_PENDING               Activation operation is in progress,
                                          pLink_Cb will be called upon completion.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                Operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*/
extern NFCSTATUS phLibNfc_Llcp_Activate( phLibNfc_Handle hRemoteDevice );


/**
* \ingroup grp_lib_nfc
* \brief <b>Deactivate a previously activated LLCP link with a remote device</b>.
*
* This function launches the link deactivation process on a remote LLCP-compliant peer. The link status
* notification will be sent by the corresponding callback given in the phLibNfc_Llcp_CheckLlcp function.
*
* \param[in] hRemoteDevice       Peer handle obtained during device discovery process.
*
* \retval NFCSTATUS_SUCCESS               Operation successful.
* \retval NFCSTATUS_PENDING               Deactivation operation is in progress,
                                          pLink_Cb will be called upon completion.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                Operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*/
extern NFCSTATUS phLibNfc_Llcp_Deactivate( phLibNfc_Handle  hRemoteDevice );


/**
* \ingroup grp_lib_nfc
* \brief <b>Get information on the local LLCP peer</b>.
*
* This function returns the LLCP link parameters of the local peer that were used
* during the link activation.
*
* \param[in]  hRemoteDevice         Peer handle obtained during device discovery process.
* \param[out] pConfigInfo           Pointer on the variable to be filled with the configuration
                                    parameters used during activation.
*
* \retval NFCSTATUS_SUCCESS               Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                Operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*/
extern NFCSTATUS phLibNfc_Llcp_GetLocalInfo( phLibNfc_Handle                  hRemoteDevice,
                                             phLibNfc_Llcp_sLinkParameters_t* pConfigInfo
                                             );


/**
* \ingroup grp_lib_nfc
* \brief <b>Get information on the remote LLCP peer</b>.
*
* This function returns the LLCP link parameters of the remote peer that were received
* during the link activation.
*
* \param[in]  hRemoteDevice         Peer handle obtained during device discovery process.
* \param[out] pConfigInfo           Pointer on the variable to be filled with the configuration
                                    parameters used during activation.
*
* \retval NFCSTATUS_SUCCESS               Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
* \retval NFCSTATUS_FAILED                Operation failed.
* \retval NFCSTATUS_BUSY                  Previous request in progress can not accept new request.
*/
extern NFCSTATUS phLibNfc_Llcp_GetRemoteInfo( phLibNfc_Handle                    hRemoteDevice,
                                              phLibNfc_Llcp_sLinkParameters_t*   pConfigInfo
                                              );


/**
* \ingroup grp_lib_nfc
* \brief <b>Create a socket on a LLCP-connected device</b>.
*
* This function creates a socket for a given LLCP link. Sockets can be of two types : 
* connection-oriented and connectionless. If the socket is connection-oriented, the caller
* must provide a working buffer to the socket in order to handle incoming data. This buffer
* must be large enough to fit the receive window (RW * MIU), the remaining space being
* used as a linear buffer to store incoming data as a stream. Data will be readable later
* using the phLibNfc_Llcp_Recv function.
* The options and working buffer are not required if the socket is used as a listening socket,
* since it cannot be directly used for communication.
*
* \param[in]  eType                 The socket type.
* \param[in]  psOptions             The options to be used with the socket.
* \param[in]  psWorkingBuffer       A working buffer to be used by the library.
* \param[out] phSocket              A pointer on the variable to be filled with the handle
*                                   on the created socket.
* \param[in]  pErr_Cb               The callback to be called each time the socket
*                                   is in error.
* \param[in]  pContext              Upper layer context to be returned in the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_BUFFER_TOO_SMALL         The working buffer is too small for the MIU and RW
*                                            declared in the options.
* \retval NFCSTATUS_INSUFFICIENT_RESOURCES   No more socket handle available.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Socket( phLibNfc_Llcp_eSocketType_t      eType,
                                       phLibNfc_Llcp_sSocketOptions_t*  psOptions,
                                       phNfc_sData_t*                   psWorkingBuffer,
                                       phLibNfc_Handle*                 phSocket,
                                       pphLibNfc_LlcpSocketErrCb_t      pErr_Cb,
                                       void*                            pContext
                                       );


/**
* \ingroup grp_lib_nfc
* \brief <b>Close a socket on a LLCP-connected device</b>.
*
* This function closes a LLCP socket previously created using phLibNfc_Llcp_Socket.
* If the socket was connected, it is first disconnected, and then closed.
*
* \param[in]  hSocket               Socket handle obtained during socket creation.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Close( phLibNfc_Handle hSocket );


/**
* \ingroup grp_lib_nfc
* \brief <b>Get the local options of a socket</b>.
*
* This function returns the local options (maximum packet size and receive window size) used
* for a given connection-oriented socket. This function shall not be used with connectionless
* sockets.
*
* \param[in]  hSocket               Socket handle obtained during socket creation.
* \param[in]  psLocalOptions        A pointer to be filled with the local options of the socket.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_SocketGetLocalOptions( phLibNfc_Handle                  hSocket,
                                                      phLibNfc_Llcp_sSocketOptions_t*  psLocalOptions
                                                      );


/**
* \ingroup grp_lib_nfc
* \brief <b>Get the local options of a socket</b>.
*
* This function returns the remote options (maximum packet size and receive window size) used
* for a given connection-oriented socket. This function shall not be used with connectionless
* sockets.
*
* \param[in]  hSocket               Socket handle obtained during socket creation.
* \param[in]  psRemoteOptions       A pointer to be filled with the remote options of the socket.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_SocketGetRemoteOptions( phLibNfc_Handle                  hRemoteDevice,
                                                       phLibNfc_Handle                  hSocket,
                                                       phLibNfc_Llcp_sSocketOptions_t*  psRemoteOptions
                                                       );


/**
* \ingroup grp_lib_nfc
* \brief <b>Bind a socket to a local SAP</b>.
*
* This function binds the socket to a local Service Access Point.
*
* \param[in]  hSocket               Peer handle obtained during device discovery process.
* \param[out] pConfigInfo           Pointer on the variable to be filled with the configuration
*                                   parameters used during activation.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_ALREADY_REGISTERED       The selected SAP is already bound to another
                                             socket.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Bind( phLibNfc_Handle hSocket,
                                     uint8_t         nSap
                                     );


/**
* \ingroup grp_lib_nfc
* \brief <b>Listen for incoming connection requests on a socket</b>.
*
* This function switches a socket into a listening state and registers a callback on
* incoming connection requests. In this state, the socket is not able to communicate
* directly. The listening state is only available for connection-oriented sockets
* which are still not connected. The socket keeps listening until it is closed, and
* thus can trigger several times the pListen_Cb callback. The caller can adverise the
* service through SDP by providing a service name.
*
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  psServiceName      A buffer containing the name of the service for SDP. No SDP
*                                advertising if set to NULL.
* \param[in]  pListen_Cb         The callback to be called each time the
*                                socket receive a connection request.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state to switch
*                                            to listening state.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Listen( phLibNfc_Handle                  hSocket,
                                       phNfc_sData_t                    *psServiceName,
                                       pphLibNfc_LlcpSocketListenCb_t   pListen_Cb,
                                       void*                            pContext
                                       );


/**
* \ingroup grp_lib_nfc
* \brief <b>Accept an incoming connection request for a socket</b>.
*
* This functions allows the client to accept an incoming connection request.
* It must be used with the socket provided within the listen callback. The socket
* is implicitly switched to the connected state when the function is called.
*
* \param[in]  hSocket               Socket handle obtained in the listening callback.
* \param[in]  psOptions             The options to be used with the socket.
* \param[in]  psWorkingBuffer       A working buffer to be used by the library.
* \param[in]  pErr_Cb               The callback to be called each time the accepted socket
*                                   is in error.
* \param[in]  pAccept_RspCb         The callback to be called when the Accept operation 
*                                   is completed.
* \param[in]  pContext              Upper layer context to be returned in the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_BUFFER_TOO_SMALL         The working buffer is too small for the MIU and RW
*                                            declared in the options.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Accept( phLibNfc_Handle                  hSocket,
                                       phLibNfc_Llcp_sSocketOptions_t*  psOptions,
                                       phNfc_sData_t*                   psWorkingBuffer,
                                       pphLibNfc_LlcpSocketErrCb_t      pErr_Cb,
                                       pphLibNfc_LlcpSocketAcceptCb_t   pAccept_RspCb,
                                       void*                            pContext
                                       );


/**
* \ingroup grp_lib_nfc
* \brief <b>Reject an incoming connection request for a socket</b>.
*
* This functions allows the client to reject an incoming connection request.
* It must be used with the socket provided within the listen callback. The socket
* is implicitly closed when the function is called.
*
* \param[in]  hSocket               Socket handle obtained in the listening callback.
* \param[in]  pReject_RspCb         The callback to be called when the Reject operation 
*                                   is completed.
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Reject( phLibNfc_Handle                  hRemoteDevice,
                                       phLibNfc_Handle                  hSocket,
                                       pphLibNfc_LlcpSocketAcceptCb_t   pReject_RspCb,
                                       void*                            pContext);


/**
* \ingroup grp_lib_nfc
* \brief <b>Try to establish connection with a socket on a remote SAP</b>.
*
* This function tries to connect to a given SAP on the remote peer. If the
* socket is not bound to a local SAP, it is implicitly bound to a free SAP.
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  nSap               The destination SAP to connect to.
* \param[in]  pConnect_RspCb     The callback to be called when the connection
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Connection operation is in progress,
*                                            pConnect_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Connect( phLibNfc_Handle                 hRemoteDevice,
                                        phLibNfc_Handle                 hSocket,
                                        uint8_t                         nSap,
                                        pphLibNfc_LlcpSocketConnectCb_t pConnect_RspCb,
                                        void*                           pContext
                                        );


/**
* \ingroup grp_lib_nfc
* \brief <b>Try to establish connection with a socket on a remote service, given its URI</b>.
*
* This function tries to connect to a SAP designated by an URI. If the
* socket is not bound to a local SAP, it is implicitly bound to a free SAP.
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  psUri              The URI corresponding to the destination SAP to connect to.
* \param[in]  pConnect_RspCb     The callback to be called when the connection
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Connection operation is in progress,
*                                            pConnect_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_ConnectByUri( phLibNfc_Handle                 hRemoteDevice,
                                             phLibNfc_Handle                 hSocket,
                                             phNfc_sData_t*                  psUri,
                                             pphLibNfc_LlcpSocketConnectCb_t pConnect_RspCb,
                                             void*                           pContext
                                             );


/**
* \ingroup grp_lib_nfc
* \brief <b>Disconnect a currently connected socket</b>.
*
* This function initiates the disconnection of a previously connected socket.
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  pDisconnect_RspCb  The callback to be called when the 
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Disconnection operation is in progress,
*                                            pDisconnect_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Disconnect( phLibNfc_Handle                    hRemoteDevice,
                                           phLibNfc_Handle                    hSocket,
                                           pphLibNfc_LlcpSocketDisconnectCb_t pDisconnect_RspCb,
                                           void*                              pContext
                                           );


/**
* \ingroup grp_lib_nfc
* \brief <b>Read data on a socket</b>.
*
* This function is used to read data from a socket. It reads at most the
* size of the reception buffer, but can also return less bytes if less bytes
* are available. If no data is available, the function will be pending until
* more data comes, and the response will be sent by the callback. This function
* can only be called on a connection-oriented socket.
* 
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  psBuffer           The buffer receiving the data.
* \param[in]  pRecv_RspCb        The callback to be called when the 
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Reception operation is in progress,
*                                            pRecv_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Recv( phLibNfc_Handle              hRemoteDevice,
                                     phLibNfc_Handle              hSocket,
                                     phNfc_sData_t*               psBuffer,
                                     pphLibNfc_LlcpSocketRecvCb_t pRecv_RspCb,
                                     void*                        pContext
                                     );


/**
* \ingroup grp_lib_nfc
* \brief <b>Read data on a socket and get the source SAP</b>.
*
* This function is the same as phLibNfc_Llcp_Recv, except that the callback includes
* the source SAP. This functions can only be called on a connectionless socket.
* 
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  psBuffer           The buffer receiving the data.
* \param[in]  pRecv_RspCb        The callback to be called when the 
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Reception operation is in progress,
*                                            pRecv_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_RecvFrom( phLibNfc_Handle                   hRemoteDevice,
                                         phLibNfc_Handle                   hSocket,
                                         phNfc_sData_t*                    psBuffer,
                                         pphLibNfc_LlcpSocketRecvFromCb_t  pRecv_Cb,
                                         void*                             pContext
                                         );


/**
* \ingroup grp_lib_nfc
* \brief <b>Send data on a socket</b>.
*
* This function is used to write data on a socket. This function
* can only be called on a connection-oriented socket which is already
* in a connected state.
* 
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  psBuffer           The buffer containing the data to send.
* \param[in]  pSend_RspCb        The callback to be called when the 
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Reception operation is in progress,
*                                            pSend_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_Send( phLibNfc_Handle              hRemoteDevice,
                                     phLibNfc_Handle              hSocket,
                                     phNfc_sData_t*               psBuffer,
                                     pphLibNfc_LlcpSocketSendCb_t pSend_RspCb,
                                     void*                        pContext
                                     );


/**
* \ingroup grp_lib_nfc
* \brief <b>Send data on a socket to a given destination SAP</b>.
*
* This function is used to write data on a socket to a given destination SAP.
* This function can only be called on a connectionless socket.
* 
*
* \param[in]  hSocket            Socket handle obtained during socket creation.
* \param[in]  nSap               The destination SAP.
* \param[in]  psBuffer           The buffer containing the data to send.
* \param[in]  pSend_RspCb        The callback to be called when the 
*                                operation is completed.
* \param[in]  pContext           Upper layer context to be returned in
*                                the callback.
*
* \retval NFCSTATUS_SUCCESS                  Operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER        One or more of the supplied parameters
*                                            could not be properly interpreted.
* \retval NFCSTATUS_PENDING                  Reception operation is in progress,
*                                            pSend_RspCb will be called upon completion.
* \retval NFCSTATUS_INVALID_STATE            The socket is not in a valid state, or not of 
*                                            a valid type to perform the requsted operation.
* \retval NFCSTATUS_NOT_INITIALISED          Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN                 Shutdown in progress.
* \retval NFCSTATUS_FAILED                   Operation failed.
*/
extern NFCSTATUS phLibNfc_Llcp_SendTo( phLibNfc_Handle               hRemoteDevice,
                                       phLibNfc_Handle               hSocket,
                                       uint8_t                       nSap,
                                       phNfc_sData_t*                psBuffer,
                                       pphLibNfc_LlcpSocketSendCb_t  pSend_RspCb,
                                       void*                         pContext
                                       );


/**
* \ingroup grp_lib_nfc
*
* \brief Initializes \ DeInitialize the NFC library for testmode.
*
*
*\brief This function initializes / DeInitialize NFC library and its underlying layers 
* in test mode. As part of this interface underlying layers gets configured.
* Once phLibNfc_TstMode_On is successful ,NFC library ready in testmode using IOCTL.
* After using test IOCTLs ,Test mode should be DeInit using phLibNfc_TstMode_Off.
*\note This API should be used only for test IOCTL codes. 
*
* \param[in] pDriverHandle         Driver Handle currently application is using.
* \param[in] pTestModeCb        The init callback is called by the LibNfc when 
*                               Configure test mode completed or there is an error
*                               in initialization.
*
* \param[in] pContext           Client context which will   be included in
*                               callback when the request is completed.
*
* \retval NFCSTATUS_ALREADY_INITIALISED     Stack is already initialized.
* \retval NFCSTATUS_PENDING                 Init sequence   has been successfully
*                                           started and result will be  conveyed via 
*                                           callback notification.
* \retval NFCSTATUS_INVALID_PARAMETER       The parameter could not be  properly
*                                           interpreted.
*\retval NFCSTATUS_INSUFFICIENT_RESOURCES   Insufficient resource.(Ex: insufficient memory)
*
*\msc
*LibNfcClient,LibNfc;
*--- [label="Before initializing Nfc LIB,Setup Driver layer"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_ConfigureDriver()",URL="\ref phLibNfc_Mgt_ConfigureDriver"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_SUCCESS"];
*LibNfcClient=>LibNfc   [label="phLibNfc_Mgt_ConfigureTestMode()",URL="\ref phLibNfc_Mgt_ConfigureTestMode"];
*LibNfcClient<<LibNfc   [label="NFCSTATUS_PENDING"];
*LibNfcClient<-LibNfc   [label="pTestModeCb"];
*\endmsc
*/
NFCSTATUS phLibNfc_Mgt_ConfigureTestMode(void              *pDriverHandle,
                                 pphLibNfc_RspCb_t         pTestModeCb,
                                 phLibNfc_Cfg_Testmode_t   eTstmode,
                                 void                      *pContext
                                 );

/**
* \ingroup grp_lib_nfc
* \brief <b>Interface to LibNfc Reset</b>.
*
*  LibNfc client can reset the stack.
*
*  \param[in] pContext                     Upper layer context to be returned in 
*                                          the callback.
*
*
* \retval NFCSTATUS_SUCCESS               Indicates Get stack Capabilities operation successful.
* \retval NFCSTATUS_INVALID_PARAMETER     One or more of the supplied parameters
*                                         could not be properly interpreted.
* \retval NFCSTATUS_NOT_INITIALISED       Indicates stack is not yet initialized.
* \retval NFCSTATUS_SHUTDOWN              Shutdown in progress.
*/

NFCSTATUS phLibNfc_Mgt_Reset(void    *pContext);

#endif  /*  PHLIBNFC_H    */

