NXP_PN512_NFCReaderLibrary/intfs/phpalI18092mT.h

387 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 ISO18092 target mode 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 27. October 2014
*/
#ifndef PHPALI18092MT_H
#define PHPALI18092MT_H
#include <ph_Status.h>
#include <phhalHw.h>
#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */
#ifdef NXPBUILD__PHPAL_I18092MT_SW
/** \defgroup phpalI18092mT_Sw Component : Software
* @{
*/
#define PHPAL_I18092MT_SW_ID 0x01U /**< ID for software I18092 MT component */
#define PHPAL_I18092MT_NFCID3_LENGTH 0x0AU /**< Length of NFCID3. */
/**< Event posted by response time extension timer ISR. Reader library thread listens to this event and sends the RTOx packet. */
#ifndef E_PH_OSAL_EVT_RTO_TIMEOUT
# define E_PH_OSAL_EVT_RTO_TIMEOUT (1 << 3)
#endif
/** Typedef for the RTOX call back function */
typedef void(*pRtoxTimerCallback)(uint8_t bTimerId);
/**
* \brief ISO18092 mode passive target parameter structure
*/
typedef struct
{
uint16_t wId; /**< Layer ID for this component, NEVER MODIFY */
void * pHalDataParams; /**< Pointer to the parameter structure of underlying hardware component */
void * pPlatform; /**< Pointer to OSAL layer. */
void * ovrTask; /**< Task context. */
void * pTimerHandle; /**< Timer Handle (For RTOX). */
pRtoxTimerCallback pRtoxCallback; /**< Holds RTOX Callback function address */
uint16_t wLastTxLen; /**< Last successful DEP send length. */
uint8_t aNfcid3i[PHPAL_I18092MT_NFCID3_LENGTH]; /**< Array holding 10 bytes long NFCID3. */
uint8_t aNfcid3t[PHPAL_I18092MT_NFCID3_LENGTH]; /**< Array holding 10 bytes long NFCID3 of the PCD. */
uint8_t bStateNow; /**< Current Exchange-State. */
uint8_t bDid; /**< Device Identifier; '0' to disable usage else 1-14. */
uint8_t bNadEnabled; /**< Indicates presence of Node Address. 1 = present. */
uint8_t bNadVal; /**< Node Address; Ignored if bNadEnabled is equal '0'. */
uint8_t bFsl; /**< Frame Length Byte; 0-3. */
uint8_t bPni; /**< Current Packet Number (Packet number information); 0-3. */
uint8_t bDst; /**< Divisor Send Integer; 0-2. */
uint8_t bDrt; /**< Divisor Receive Integer; 0-2. */
uint8_t bBsi; /**< Send bit-rate supported by the PCD. */
uint8_t bBri; /**< Receive bit-rate supported by the PCD. */
uint8_t bLri; /**< Length reduction value is stored here. */
uint8_t bBst; /**< Send bit-rate supported by the PCD. */
uint8_t bBrt; /**< Receive bit-rate supported by the PCD. */
uint8_t bLrt; /**< Length reduction value is stored here. */
uint8_t bTo; /**< Hold the time out value. */
uint8_t bRtoxDisabled; /**< RTOX Disabler (i.e. '0' if RTOX enabled). */
uint8_t bRtoxExtnVal; /**< Response timeout extension value. */
uint8_t bCmdtype; /**< Holds the type of Command send by target. */
phOsal_EventObj_t Pal18092mTEventObj; /**< Handle for Event. */
}phpalI18092mT_Sw_DataParams_t;
/**
* \brief Initialize this layer.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_DATA_PARAMS Wrong pointer to this layer's parameter structure is sent.
*/
phStatus_t phpalI18092mT_Sw_Init(
phpalI18092mT_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 * pHalDataParams, /**< [In] Pointer to the parameter structure of the underlying HAL. */
pRtoxTimerCallback pRtoxCallback /**< [In] Callback to be executed by the RTOX timer. Implementation provided by user. */
);
/** @} */
#endif /* NXPBUILD__PHPAL_I18092MT_SW */
#ifdef NXPBUILD__PHPAL_I18092MT
/** \defgroup phpalI18092mT ISO/IEC 18092 Mode Target
* \brief This Component implements the ISO/IEC ISO18092 Target mode contact-less protocol.
* Using this component it is possible to communicate with an active/passive Initiator.
* @{
*/
#define PHPAL_I18092MT_DID_MAX 0x0EU /**< The last valid DID. */
#define PHPAL_I18092MT_WT_MAX 0x0EU /**< The maximum allowed WT value, NFCForum-TS-DigitalProtocol-1.0 section 14.11. */
#define PHPAL_I18092MT_FSL_MAX 0x03U /**< The maximum allowed FSL value. */
#define PHPAL_I18092MT_NAD_MAX 0x0FU /**< The maximum allowed NAD value. */
#define PHPAL_I18092MT_MASK_NAD_ENABLE 0xFF00U /**< Mask used for NAD Enabled/Disabled. */
#define PHPAL_I18092MT_MASK_NAD_VALUE 0x00FFU /**< Mask used for NAD value. */
/**
* \name ISO18092 Target Mode Configuration Parameters
*/
/*@{*/
/**
* \brief Enable / Disable RTOX feature.
*/
#define PHPAL_I18092MT_CONFIG_RTOX 0x0000U
/**
* \brief RTOX value.
*/
#define PHPAL_I18092MT_CONFIG_RTOX_VALUE 0x0001U
/**
* \brief Set / Get Node Address.
*
* \c wValue is parsed as follows:
* \verbatim
* NadEnabled = (wValue & 0xFF00) ? 1 : 0;
* Nad = (wValue & 0x000F);
* \endverbatim
*/
#define PHPAL_I18092MT_CONFIG_NAD 0x0002U
/**
* \brief Get DID value. Indicates if DID is used by the PAL.
*/
#define PHPAL_I18092MT_CONFIG_DID 0x0003U
/**
* \brief Get FSL value.
* Indicates either Lrt or Lri value whichever is lesser in case PSL is not exchanged.
* If PSL is exchanged then the agreed FSL value is returned.
*/
#define PHPAL_I18092MT_CONFIG_FSL 0x0004U
/**
* \brief Get Time Out (TO) value used by the Target to communicate FWT.
*/
#define PHPAL_I18092MT_CONFIG_TO 0x0005U
/*@}*/
/**
* \name ISO18092 Target Mode Parameters
*/
/*@{*/
/** Mask Bit Rates Supported by Initiator. */
#define PHPAL_I18092MT_BIT_RATE_MASK 0xF0U
/** RTOX max value */
#define PHPAL_I18092MT_SW_MAX_RTOX_VALUE 0x3BU
/** RTOX min value */
#define PHPAL_I18092MT_SW_MIN_RTOX_VALUE 0x01U
/*@}*/
/**
* \name DRI/DSI (BRI/BSI) Values
*/
/*@{*/
#define PHPAL_I18092MT_DATARATE_106 0x0000U /**< DRT(I)/DST(I) value for 106 kBit/s. */
#define PHPAL_I18092MT_DATARATE_212 0x0001U /**< DRT(T)/DST(T) value for 212 kBit/s. */
#define PHPAL_I18092MT_DATARATE_424 0x0002U /**< DRI(T)/DSI(T) value for 424 kBit/s. */
/*@}*/
/**
* \name FSL/LRI Values
*/
/*@{*/
#define PHPAL_I18092MT_FRAMESIZE_64 0x00U /**< FSL value for max. frame size of 64 Bytes. */
#define PHPAL_I18092MT_FRAMESIZE_128 0x01U /**< FSL value for max. frame size of 128 Bytes. */
#define PHPAL_I18092MT_FRAMESIZE_192 0x02U /**< FSL value for max. frame size of 192 Bytes. */
#define PHPAL_I18092MT_FRAMESIZE_254 0x03U /**< FSL value for max. frame size of 254 Bytes. */
/*@}*/
/**
* \name Maximum Values
*/
/*@{*/
#define PHPAL_I18092MT_MAX_GI_LENGTH 0x30U /**< Maximum length of Gi data. */
/*@}*/
#ifdef NXPRDLIB_REM_GEN_INTFS
#include "../comps/phpalI18092mT/src/Sw/phpalI18092mT_Sw.h"
#define phpalI18092mT_ResetProtocol( pDataParams)\
phpalI18092mT_Sw_ResetProtocol( (phpalI18092mT_Sw_DataParams_t *) pDataParams)
#define phpalI18092mT_Activate( pDataParams, pAtrReq, wAtrReqLength, pAtrRes, wAtrResLength, pGeneralDataBytes,wGeneralDataBytesLength) \
phpalI18092mT_Sw_Activate( (phpalI18092mT_Sw_DataParams_t *) pDataParams, pAtrReq, wAtrReqLength, pAtrRes, wAtrResLength, pGeneralDataBytes,wGeneralDataBytesLength)
#define phpalI18092mT_Transmit( pDataParams, wOption, pTransportDataBytes, wTransportDataBytesLength) \
phpalI18092mT_Sw_Transmit(( phpalI18092mT_Sw_DataParams_t *) pDataParams,wOption, pTransportDataBytes,wTransportDataBytesLength)
#define phpalI18092mT_Receive(pDataParams, wOption, ppTransportDataBytes, pTransportDataBytesLength) \
phpalI18092mT_Sw_Receive(( phpalI18092mT_Sw_DataParams_t *) pDataParams, wOption, ppTransportDataBytes, pTransportDataBytesLength )
#define phpalI18092mT_Rtox( pDataParams) \
phpalI18092mT_Sw_Rtox((phpalI18092mT_Sw_DataParams_t *) pDataParams)
#define phpalI18092mT_SetConfig( pDataParams, wConfig, wValue) \
phpalI18092mT_Sw_SetConfig((phpalI18092mT_Sw_DataParams_t *) pDataParams, wConfig, wValue)
#define phpalI18092mT_GetConfig( pDataParams, wConfig, pValue) \
phpalI18092mT_Sw_GetConfig((phpalI18092mT_Sw_DataParams_t *) pDataParams, wConfig, pValue)
#else
/**
* \brief Reset the ISO18092 protocol parameters.
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
*/
phStatus_t phpalI18092mT_ResetProtocol(
void * pDataParams /**< [In] Pointer to this layer's parameter structure. */
);
/**
* \brief Handles ISO/IEC 18092 compliant activation sequence.
*
* This function takes the data returned by \ref phhalHw_Autocoll as a parameter, along with the ATR_RES.\n
* Validates the received ATR_REQ and sends the ATR_RES to PCD.
* If the ATR_REQ was received with error, then stays mute and waits for the valid ATR_REQ and then responds with ATR_RES.\n
* If General information bytes are present in the ATR_REQ then it will be returned back to the caller.\n
* ATR_RES format : byte 1-10:nfcid, byte 11:BSt, byte 12:BRt, byte13:TO, byte14:PPt, byte:15..n[Gt1..n].\n
*
* \retval #PH_ERR_SUCCESS Operation successful, target activated.
* \retval #PH_ERR_PROTOCOL_ERROR Received response is not ISO/IEC 18092 compliant.
* \retval #PH_ERR_EXT_RF_ERROR RF Turned OFF in passive communication mode
* \retval #PH_ERR_INVALID_PARAMETER Invalid parameter supplied.
* \retval Others from the underlying layer.
*/
phStatus_t phpalI18092mT_Activate(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint8_t * pAtrReq, /**< [In] Data received from Autocoll. Pointer to ATR_REQ. */
uint16_t wAtrReqLength, /**< [In] Length of ATR_REQ. Including GT byte.*/
uint8_t * pAtrRes, /**< [In] Pointer to ATR_RES. Refer function description for the format.*/
uint16_t wAtrResLength, /**< [In] Length of ATR_RES. */
uint8_t ** pGeneralDataBytes, /**< [Out] Pointer to the general data bytes of ATR_REQ. */
uint16_t *wGeneralDataBytesLength /**< [Out] Number of received general data bytes of ATR_REQ. */
);
/**
* \brief Receives ISO/IEC 18092 frame from Initiator.
*
* This will be the next call in sequence after the \ref phpalI18092mT_Activate.\n
* If the next frame is PSL_REQ it will be validated and handled in this function and this will send the PSL_RES else it will come
* out after validating the DEP_REQ received as the next frame.\n
* If it is a chained frame and more data is expected and RxBuffer is sufficiently large to hold the next chained frame, sends an
* ACK to receive the next chained frame i.e., it will keep on getting the next chunk of data after sending ACKs to the PCD and adding
* the chunks to the RxBuffer making it a contiguous set of data.\n
* If there is more data to be received but the RxBuffer cannot handle the next chained frame, returns to the caller with status
* PH_ERR_SUCCESS_CHAINING. In this case, the application or the higher layer has to copy the received buffer and call the phpalI18092_Receive
* again with wOption = PH_RECEIVE_CHAINING. In this case this function will send an ACK to the Initiator to start receiving the rest of the data.
* If the data received is DSL_REQ, then sends the DSL_RES and set the state to MIFARE Halted state in case of Type A in passive communication
* mode or else will remain in receive mode till a WUP_REQ is received in active communication mode.\n
*
* This function will also handles the RLS_REQ and sends a RLS_RES
* In case of Active communication mode this function waits for WUP_REQ after DSL_REQ is received.
* If ISO 18092 RAW is activated, the RTOx timer will be started in this function before the data is handled over to the caller.
*
* \c wOption can be one of:\n
* \li #PH_RECEIVE_DEFAULT
* \li #PH_RECEIVE_CHAINING
* \li #PH_RECEIVE_CHAINING_BUFSIZE
*
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_SUCCESS_CHAINING Rx chaining not complete.
* \retval #PH_ERR_SUCCESS_ACK Received ACK for a previous Transmit and no valid data received in the OUT parameters.
* \retval #PH_ERR_SUCCESS_DESELECTED PCD has sent DSL_REQ.
* \retval #PH_ERR_SUCCESS_RELEASED PCD has sent RLS_REQ.
* \retval #PH_ERR_EXT_RF_ERROR External RF turned OFF in passive communication mode.
* \retval #PH_ERR_BUFFER_OVERFLOW Attempt to write beyond buffer size.
* \retval Others from the underlying layer.
*/
phStatus_t phpalI18092mT_Receive(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wOption, /**< [In] Option parameter. */
uint8_t ** ppTransportDataBytes, /**< [Out] Pointer to the received transport data bytes. */
uint16_t * pTransportDataBytesLength /**< [Out] Number of received transport data bytes. */
);
/**
* \brief Sends a DEP_RES I-PDU to an ISO/IEC 18092 compliant Initiator.
*
* This is to be called by the application or the reader library thread to transmit a response to the PCD.\n
* This will internally call the HAL transmit API.\n
* If the pTxData length is bigger than the ISO 18092 Tx buffer (HAL Tx buffer), then this function will fragment and send this data to the PCD.\n
* In addition PH_TRANSMIT_TXCHAINING may be used to enable providing the TxData in chunks i.e., the application itself may have received
* the first chunk only from an external Host and it could receive more data from the Host in the next iteration. In such cases, this will be useful.
*
* \c wOption can be one of:\n
* \li #PH_TRANSMIT_DEFAULT
* \li #PH_TRANSMIT_TXCHAINING
*
* Additionally, the following options are also available:\n
* \li #PH_TRANSMIT_BUFFER_FIRST
* \li #PH_TRANSMIT_BUFFER_CONT
* \li #PH_TRANSMIT_BUFFER_LAST
*
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_EXT_RF_ERROR External RF turned OFF in passive communication mode.
* \retval Others from the underlying layer.
*/
phStatus_t phpalI18092mT_Transmit(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wOption, /**< [In] Option parameter. */
uint8_t * pTransportDataBytes, /**< [In] Transport Data Bytes to be transmitted as part of an DEP_REQ I-PDU. */
uint16_t wTransportDataBytesLength /**< [In] Number of transport data bytes. */
);
/**
* \brief Transmits an RTOX PDU to extend waiting time and receives RTOX response from Initiator.
*
* This is the API that is called by the application on expire of the RTO timer.\n
* This sends RTOx packet to the PCD and then waits for a valid response.\n
* If the received data is a NACK, then the RTOx packet is re-transmitted.\n
*
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_EXT_RF_ERROR RF Turned OFF in passive communication mode
* \retval Others from the underlying layer.
*/
phStatus_t phpalI18092mT_Rtox(
void * pDataParams /**< [In] Pointer to this layer's parameter structure. */
);
/**
* \brief Set configuration parameter.
*
* \c wOption can be one of:\n
* \li #PHPAL_I18092MT_CONFIG_RTOX
* \li #PHPAL_I18092MT_CONFIG_RTOX_VALUE
* \li #PHPAL_I18092MT_CONFIG_NAD
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_INVALID_PARAMETER Invalid parameter supplied.
* \retval #PH_ERR_UNSUPPORTED_PARAMETER wrong wOption parameter supplied.
*/
phStatus_t phpalI18092mT_SetConfig(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wConfig, /**< [In] Configuration Identifier. */
uint16_t wValue /**< [In] Configuration Value. */
);
/**
* \brief Get configuration parameter.
*
* \c wOption can be :\n
* \li #PHPAL_I18092MT_CONFIG_RTOX
* \li #PHPAL_I18092MT_CONFIG_NAD
*
* \return Status code
* \retval #PH_ERR_SUCCESS Operation successful.
* \retval #PH_ERR_UNSUPPORTED_PARAMETER wrong wOption parameter supplied.
*/
phStatus_t phpalI18092mT_GetConfig(
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
uint16_t wConfig, /**< [In] Configuration Identifier. */
uint16_t * pValue /**< [Out] Configuration Value. */
);
/** @} */
#endif /* NXPRDLIB_REM_GEN_INTFS */
#endif /* NXPBUILD__PHPAL_I18092MT */
#ifdef __cplusplus
} /* Extern C */
#endif
#endif /* PHPALI18092MT_H */