NXP_PN512_NFCReaderLibrary/intfs/phnpSnep.h

367 lines
19 KiB
C

/*
* Copyright (c), NXP Semiconductors Bangalore / India
*
* (C)NXP Semiconductors
* All rights are reserved. Reproduction in whole or in part is
* prohibited without the written consent of the copyright owner.
* NXP reserves the right to make changes without notice at any time.
* NXP makes no warranty, expressed, implied or statutory, including but
* not limited to any implied warranty of merchantability or fitness for any
* particular purpose, or that the use will not infringe any third party patent,
* copyright or trademark. NXP must not be liable for any loss or damage
* arising from its use.
*/
/** \file
* Generic Simple NDEF Exchange Protocol( SNEP) Component of Reader Library Framework.
* $Author: Purnank G (ing05193) $
* $Revision: 5076 $ (v4.040.05.011646)
* $Date: 2016-06-13 17:29:09 +0530 (Mon, 13 Jun 2016) $
*
* History:
* KK: Generated 05. Mar 2014
*
*/
#ifndef PHNPSNEP_H
#define PHNPSNEP_H
#include <ph_Status.h>
#include <phlnLlcp.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef NXPBUILD__PHNP_SNEP_SW
/** \defgroup phnpSnep_Sw Component : Software
* \brief Implementation of NFC Forum Simple NDEF Exchange Protocol (SNEP) 1.0
* @{
*/
#define PHNP_SNEP_SW_ID 0x01 /**< ID for SNEP SW component. */
/**
* \brief Defines SNEP Server Type
*/
typedef enum phnpSnep_Server_type
{
phnpSnep_Default_Server = 0x01, /**< Default NFC Forum SNEP server. */
phnpSnep_NonDefault_Server /**< Proprietary SNEP server. */
} phnpSnep_Server_type_t;
/**
*\brief SNEP parameter structure
*/
typedef struct phnpSnep_Sw_DataParams
{
uint16_t wId; /**< Layer ID for this component, NEVER MODIFY!. */
void * plnLlcpDataParams; /**< LLCP Data Parameters structure pointer. */
void * psSocket; /**< LLCP transport Socket structure pointer. */
uint8_t bSnepVersion; /**< SNEP protocol version supported by Implementation. */
phnpSnep_Server_type_t eServerType; /**< Initialized Server Type.*/
} phnpSnep_Sw_DataParams_t;
/**
* \brief Initialize the SNEP component.
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Parameter structure size is invalid.
*/
phStatus_t phnpSnep_Sw_Init(
phnpSnep_Sw_DataParams_t * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wSizeOfDataParams, /**< [In] Specifies the size of the data parameter structure. */
void * plnLlcpDataparams, /**< [In] Pointer to LLCP parameters. */
void * psSocket /**< [In] Pointer to LLCP transport Socket. */
);
/** @} */
#endif /* NXPBUILD__PHNP_SNEP_SW */
#ifdef NXPBUILD__PHNP_SNEP
/** \defgroup phnpSnep NFCForum-SNEP
* \brief This component implements the NFC Forum Simple NDEF Exchange Protocol (SNEP) version 1.0.
*
* <strong>Design Limitation:</strong> SNEP implementation will only allow to initialize maximum of one default SNEP server
* and one non-default SNEP server using \ref phnpSnep_ServerInit API.
*
* This layer follows a multi-threaded RTOS based design using one \ref phlnLlcp_Activate
* "reader library task" and one SNEP Server/Client application task.
* Reader Library Task calls LLCP API's to establish Link Connection on which SNEP Server/Client Task can send SNEP packets.
*
* A pictorial representation of reader library task and SNEP Server application task
* used for SNEP Exchange is shown below.
*
* \image html SNEP_Server_Sequence.png
*
* A pictorial representation of reader library task and SNEP Client application task
* used for SNEP Exchange is shown below.
*
* \image html SNEP_Client_Sequence.png
* @{
*/
/**
* \name SNEP specific error codes.
* \note Do not change the macro values.
*/
/*@{*/
/**
* Status indicating that Received Invalid Request to Server and LLCP Disconnection is done and further communication is not possible over this Link.
* If this error is returned then a new LLC Session needs to be created by Server for further communication.
*/
#define PH_ERR_SNEP_FAILED 0x81
/**
* Status indicating that Client GET Request Failed as Response sent by Server is other than SUCCESS Response.
*/
#define PH_ERR_SNEP_GET_FAILED 0x82
/**
* Status indicating that received Client Request contains Invalid Version number.
*/
#define PH_ERR_INVALID_VERSION 0x83
/*@}*/
/**
* SNEP frame header size.
*/
#define PHNP_SNEP_HEADER_SIZE 0x06
/**
* \brief SNEP Request Codes
* The \ref phnpSnep_ServerListen API returns with one of the following request codes. These are passed to \ref phnpSnep_ServerSendResponse API
* received from Client to Server.
*/
typedef enum phnpSnep_Request_Codes {
PHNP_SNEP_REQ_CONT = 0x00, /**< Continue sending remaining fragments. */
PHNP_SNEP_REQ_GET = 0x01, /**< Return an NDEF message. */
PHNP_SNEP_REQ_PUT = 0x02, /**< Accept an NDEF message. */
PHNP_SNEP_REQ_REJECT = 0x7F /**< Client indicates not to send remaining fragments using this request. */
} phnpSnep_Request_Codes_t;
/* Removal of generic interfaces */
#ifdef NXPRDLIB_REM_GEN_INTFS
#include "../comps/phnpSnep/src/Sw/phnpSnep_Sw.h"
#define phnpSnep_ClientInit( pDataParams, eServerType,pNonDefaultUri, pbSnepRxBuffer, dwSnepRxBufferSize) \
phnpSnep_Sw_ClientInit((phnpSnep_Sw_DataParams_t *) pDataParams, eServerType,pNonDefaultUri, pbSnepRxBuffer, dwSnepRxBufferSize)
#define phnpSnep_ServerInit(pDataParams, eServerType,pNonDefaultUri, pbSnepRxBuffer, dwSnepRxBufferSize) \
phnpSnep_Sw_ServerInit((phnpSnep_Sw_DataParams_t *) pDataParams, eServerType,pNonDefaultUri, pbSnepRxBuffer, dwSnepRxBufferSize)
#define phnpSnep_Put( pDataParams, pTxBuffer, dwTxBufferSize) \
phnpSnep_Sw_Put((phnpSnep_Sw_DataParams_t *) pDataParams, pTxBuffer, dwTxBufferSize)
#define phnpSnep_Get( pDataParams, pNdefMsg, dwNdefMsgLen,pRxBuffer, pdwRxLen, dwAppBufSize) \
phnpSnep_Sw_Get((phnpSnep_Sw_DataParams_t *) pDataParams, pNdefMsg, dwNdefMsgLen,pRxBuffer, pdwRxLen, dwAppBufSize)
#define phnpSnep_ServerListen( pDataParams, dwGetReqBuffSize,pGetReqData, dwGetReqLength, pClientReq) \
phnpSnep_Sw_ServerListen((phnpSnep_Sw_DataParams_t *) pDataParams, dwGetReqBuffSize,pGetReqData, dwGetReqLength, pClientReq)
#define phnpSnep_ServerSendResponse( pDataParams, bClientReq,pRespDataForGet, dwRespDataLen, dwPutBuffSize, pPutData, pdwPutDataLen) \
phnpSnep_Sw_ServerSendResponse((phnpSnep_Sw_DataParams_t *) pDataParams, bClientReq,pRespDataForGet, dwRespDataLen, dwPutBuffSize, pPutData, pdwPutDataLen)
#define phnpSnep_ClientDeInit( pDataParams) \
phnpSnep_Sw_ClientDeInit((phnpSnep_Sw_DataParams_t *) pDataParams)
#define phnpSnep_ServerDeInit( pDataParams) \
phnpSnep_Sw_ServerDeInit((phnpSnep_Sw_DataParams_t *) pDataParams)
#else
/**
* \brief Interface to create and configure SNEP Client.
* This function creates and configures a SNEP Client over LLCP.
* This has to be called first in a client session/Task after \ref phlnLlcp_WaitForActivation.
* If the Server Type is Default Server than pNonDefaultUri parameter is Ignored.
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phnpSnep_ClientInit(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
phnpSnep_Server_type_t eServerType, /**< [In] Type of the SNEP Server to which Client has to connect. */
uint8_t *pNonDefaultUri, /**< [In] Pointer of Uniform Resource Identifier (URI) of Non-Default Server.
NULL terminated URI string should be provided. */
uint8_t *pbSnepRxBuffer, /**< [In] Pointer to Client Receive Buffer. */
uint32_t dwSnepRxBufferSize /**< [In] Size of Client Receive Buffer. */
);
/**
* \brief Interface to create and configure SNEP Server.
* This function creates and configures a SNEP Server using eServerType parameter over LLCP.
* If the Server Type is Default Server than pNonDefaultUri parameter is Ignored.
*
* This API will be called first in a server session/task after \ref phlnLlcp_WaitForActivation.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phnpSnep_ServerInit(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
phnpSnep_Server_type_t eServerType, /**< [In] Type of the SNEP Server. */
uint8_t *pNonDefaultUri, /**< [In] Pointer of Uniform Resource Identifier (URI) of Non-Default Server.
NULL terminated URI string should be provided. */
uint8_t *pbSnepRxBuffer, /**< [In] Pointer to Server Receive Buffer. */
uint32_t dwSnepRxBufferSize /**< [In] Size of Server Receive Buffer. */
);
/**
* \brief Performs the SNEP PUT Request operation.
*
* This function has to be called after the \ref phnpSnep_ClientInit is done.
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval #PH_ERR_INVALID_PARAMETER Invalid input parameters.
* \retval #PH_ERR_PROTOCOL_ERROR Did not receive valid response from Server.
* \retval Other Depending on underlying component.
*/
phStatus_t phnpSnep_Put(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t * pTxBuffer, /**< [In] Pointer of Buffer to be transmitted. */
uint32_t dwTxBufferSize /**< [In] Length of Buffer to be transmitted. */
);
/**
* \brief Performs the SNEP GET Request operation.
* This API should not be called if initialized in phnpSnep_NonDefault_Server. Also this API returns #PH_ERR_SNEP_GET_FAILED\n
* if the remote SNEP Server is Default Server.\n
* This function has to be called only after the \ref phnpSnep_ClientInit is done.
*
* NOTE: Sending Client GET Request in fragments is not supported by this API due to which length of NDEF Message (dwNdefMsgLen) in
* GET Request cannot be more than Remote MIU. If length of NDEF Message is more than remote MIU then #PH_ERR_INVALID_PARAMETER
* error will be returned by this API.
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval #PH_ERR_INVALID_PARAMETER Invalid input parameters.
* \retval #PH_ERR_PROTOCOL_ERROR Did not receive valid Response from Server.
* \retval #PH_ERR_BUFFER_OVERFLOW If Server Response length is more than the specified dwAppBufSize length.
* \retval #PH_ERR_SNEP_GET_FAILED Received Error response from Remote Server. Client should De-Init and start new session.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phnpSnep_Get(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t *pNdefMsg, /**< [In] Pointer to the NDEF message in the Get Request to be sent to Server. */
uint32_t dwNdefMsgLen, /**< [In] Length of the NDEF message in the Get Request to be sent to Server. */
uint8_t *pRxBuffer, /**< [Out] Pointer to the Application Rx Buffer to receive data. */
uint32_t *pdwRxLen, /**< [Out] Number of bytes received from the Server. */
uint32_t dwAppBufSize /**< [In] Maximum acceptable data from Server, normally size of pRxBuffer.*/
);
/**
* \brief Used to receive SENP Request from the Remote Client.
* This function Listens for SNEP Client Request and parses the Request type and returns to Application in pbClientReq parameter.
*
* Parameter Usage:\n
* If the Initialized Server Type is Default Server then 'dwGetReqBuffSize', 'pGetReqData', 'dwGetReqLength' parameters are ignored.
*
* This function is immediately called after \ref phnpSnep_ServerInit.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval #PH_ERR_INVALID_PARAMETER Invalid input parameters.
* \retval #PH_ERR_INVALID_VERSION Received Client Request with Invalid Version.
* \retval #PH_ERR_UNSUPPORTED_COMMAND Received unsupported Request from Client.
* \retval #PH_ERR_BUFFER_OVERFLOW Message in GET cannot fit in Application Buffer.
* \retval #PH_ERR_SNEP_FAILED Received Invalid Request, Server session will be closed and new session needs to be created.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phnpSnep_ServerListen(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint32_t dwGetReqBuffSize, /**< [In] Size of Buffer to store received NDEF Message in Get Request. */
uint8_t * pGetReqData, /**< [Out] Pointer to the application Buffer to store received Message in Get Request. */
uint32_t * dwGetReqLength, /**< [Out] Received data length in Message in GET Request from Client. */
uint8_t * pClientReq /**< [Out] Pointer to the Type of received Client Request \ref phnpSnep_Request_Codes. */
);
/**
* \brief Used to send Response to the SNEP Request delivered by \ref phnpSnep_ServerListen.
* This function will receive in chunks if more data to be received in case of PUT Request\n
* and copies it to 'dwPutBuffSize' Buffer and performs the required SNEP Server Response.\n
* This function will send SNEP Success Response for GET Request in chunks based on Remote MIU.\n
*
* Parameter Usage:\n
* 1. If bClientReq is PUT request, then 'pPutData', 'dwPutBuffSize' and 'pdwPutDataLen' have to be provided by the caller where PUT data will be copied to.\n
* 2. If the SNEP PUT header indicates that the client is putting more data than the dwBufferSize, then Excess Data response is sent to the client.\n
* 3. If bClientReq is GET request, then Message pointed by pRespDataForGet of dwRespDataLen length will be sent as Response to the client.\n
* If no Data needs to be sent in response for GET Request then dwRespDataLen should be zero. \n
*
* <em>Sequence of functions that needs to be called prior to this API are as below:</em>\n
* 1. \ref phnpSnep_ServerInit()\n
* 2. \ref phnpSnep_ServerListen()\n
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval #PH_ERR_INVALID_PARAMETER Invalid input parameters.
* \retval #PH_ERR_BUFFER_OVERFLOW Message in PUT cannot be fitted in Application Buffer.
* \retval #PH_ERR_PROTOCOL_ERROR Received wrong SNEP Request from Client.
*/
phStatus_t phnpSnep_ServerSendResponse(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t bClientReq, /**< [In] Type of received Client Request. Should only be PHNP_SNEP_REQ_GET or PHNP_SNEP_REQ_PUT. */
uint8_t *pRespDataForGet, /**< [In] Pointer to application provided data to handle GET Request from Client. */
uint32_t dwRespDataLen, /**< [In] Data length to be transmitted to Client for GET Request. */
uint32_t dwPutBuffSize, /**< [In] Size of the Data buffer given by the application to hold the received PUT Request Data. */
uint8_t *pPutData, /**< [Out] Pointer to Data Buffer given by the application to hold the received PUT Request Data from client. */
uint32_t *pdwPutDataLen /**< [Out] Actual length of PUT Request Data received from the Client. */
);
/**
* \brief SNEP Client De-Initialization.
* This function De-Initializes the SNEP Client session.
*
* <em>Sequence of functions that needs to be called prior to this API are as below:</em>\n
* 1. \ref phnpSnep_ClientInit()\n
* 2. \ref phnpSnep_Put() or \ref phnpSnep_Get()\n
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phnpSnep_ClientDeInit(
void * pDataParams /**< [In] Pointer to this layer's parameter structure. */
);
/**
* \brief SNEP Server De-Initialization.
* This function De-Initializes the SNEP Server session.
*
* <em>Sequence of functions that needs to be called prior to this API are as below:</em>\n
* 1. \ref phnpSnep_ServerInit()\n
* 2. \ref phnpSnep_ServerListen()\n
* 3. \ref phnpSnep_ServerSendResponse()\n
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Invalid Component ID.
* \retval Other Depending on implementation and underlying component.
*/
phStatus_t phnpSnep_ServerDeInit(
void * pDataParams /**< [In] Pointer to this layer's parameter structure. */
);
/** @} */
#endif /* NXPRDLIB_REM_GEN_INTFS */
#endif /* NXPBUILD__PHNP_SNEP */
#ifdef __cplusplus
} /* Extern C */
#endif
#endif /* PHNPSNEP_H */