324 lines
14 KiB
C
324 lines
14 KiB
C
/*
|
|
* Copyright (c), NXP Semiconductors Gratkorn / Austria
|
|
*
|
|
* (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 ISO 14443p4mC component of Reader Library Framework.
|
|
* $Author: Sundaresan Swaminathan (nxp36013) $
|
|
* $Revision: 5441 $ (v4.040.05.011646)
|
|
* $Date: 2016-07-05 16:39:00 +0530 (Tue, 05 Jul 2016) $
|
|
*
|
|
* History:
|
|
* KK: Generated 19. March 2014
|
|
*/
|
|
|
|
#ifndef PHPALI14443P4MC_H
|
|
#define PHPALI14443P4MC_H
|
|
|
|
#include <ph_Status.h>
|
|
#include <phhalHw.h>
|
|
|
|
#ifdef __cplusplus
|
|
extern "C" {
|
|
#endif /* __cplusplus */
|
|
|
|
#ifdef NXPBUILD__PHPAL_I14443P4MC_SW
|
|
|
|
/** \defgroup phpalI14443p4mC_Sw Component : Software
|
|
* @{
|
|
*/
|
|
|
|
#define PHPAL_I14443P4MC_SW_ID 0x01U /**< ID for software I18092 MT component */
|
|
|
|
/**< 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
|
|
|
|
/**
|
|
* \brief WTX timer call-back function type.
|
|
*/
|
|
typedef void(*pWtxTimerCallback)(uint8_t bTimerId);
|
|
|
|
/**
|
|
* \brief ISO14443-4 card mode PAL parameter structure
|
|
*/
|
|
typedef struct
|
|
{
|
|
uint16_t wId; /**< Layer ID for this component, NEVER MODIFY. */
|
|
uint16_t wLastTxLen; /**< Length of last I block send. */
|
|
void * pHalDataParams; /**< Pointer to the parameter structure of underlying hardware component. */
|
|
void * pPlatform; /**< Pointer to Platform layer. */
|
|
void * pTimerHandle; /**< Timer Handle (For WTX). */
|
|
phOsal_EventObj_t mcEventObj;
|
|
uint8_t bDisableWtx; /**< WTX Disabler (i.e. '0' if WTX enabled). */
|
|
uint8_t bWtx; /**< Frame Waiting Time Extension. */
|
|
uint8_t bFsdi; /**< FSDI parameter. */
|
|
uint8_t bFsci; /**< ATS FSCI parameter. */
|
|
uint8_t bDr; /**< ATS DR parameter. */
|
|
uint8_t bDs; /**< ATS DS parameter. */
|
|
uint8_t bUnequalDrDs; /**< DR and DS are different. */
|
|
uint8_t bFwi; /**< ATS FWI parameter. */
|
|
uint8_t bSfgi; /**< ATS SFGI parameter. */
|
|
uint8_t bCidEnable; /**< CID, Enabled = 1 or Disabled. */
|
|
uint8_t bCidPresence; /**< Flag to indicate CID presence in current command-response pair. */
|
|
uint8_t bCid; /**< CID parameter. */
|
|
uint8_t bNadEnable; /**< NAD, Enabled = 1 or Disabled. */
|
|
uint8_t bNadPresence; /**< Flag to indicate NAD presence in current command-response pair. */
|
|
uint8_t bNad; /**< NAD parameter. */
|
|
uint8_t bStateNow; /**< Current state. */
|
|
uint8_t bBlockNr; /**< Current block number. */
|
|
uint8_t bChainingRx; /**< We are chaining Rx. */
|
|
uint8_t bChainingTx; /**< We are chaining Tx. */
|
|
uint8_t bOpMode; /**< Operating mode - ISO or NFC. */
|
|
uint16_t wWtDelta; /**< Holds the configured delta time to be subtracted from the time in WTX timer. */
|
|
uint8_t bWtPercentage; /**< Percentage of actual wait time to be used in WTX timer. */
|
|
pWtxTimerCallback pWtxTimerCallback; /**< Holds WTX timer call-back function address. */
|
|
}phpalI14443p4mC_Sw_DataParams_t;
|
|
|
|
/**
|
|
* \brief Initializes this layer.
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_Sw_Init(
|
|
phpalI14443p4mC_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 layer.*/
|
|
pWtxTimerCallback pWtxCallback /**< [In] Pointer to WTX timer call-back function */
|
|
);
|
|
|
|
/** @} */
|
|
#endif /* NXPBUILD__PHPAL_I14443P4MC_SW */
|
|
|
|
#ifdef NXPBUILD__PHPAL_I14443P4MC
|
|
|
|
/** \defgroup phpalI14443p4mC ISO/IEC 14443-4mC
|
|
* \brief This component implements the PICC side of ISO/IEC 14443-4 Protocol.
|
|
* @{
|
|
*/
|
|
|
|
/**
|
|
* \name ISO14443-4 card mode data rates
|
|
*/
|
|
/*@{*/
|
|
#define PHPAL_I14443P4MC_106 0x00 /**< Set communication speed to 106 kbs. */
|
|
#define PHPAL_I14443P4MC_212 0x01 /**< Set communication speed to 212 kbs. */
|
|
#define PHPAL_I14443P4MC_424 0x02 /**< Set communication speed to 424 kbs. */
|
|
#define PHPAL_I14443P4MC_848 0x04 /**< Set communication speed to 848 kbs. */
|
|
/** @} */
|
|
|
|
/**
|
|
* \name ISO14443-4 card mode states
|
|
*/
|
|
/*@{*/
|
|
#define PHPAL_I14443P4MC_STATE_NONE 0x00U /**< Initialized State. */
|
|
#define PHPAL_I14443P4MC_STATE_ATS 0x01U /**< State once we send successful ATS for RATS. */
|
|
#define PHPAL_I14443P4MC_STATE_PPS 0x02U /**< State once we receive PPS Request. */
|
|
#define PHPAL_I14443P4MC_STATE_RX 0x03U /**< Internal State once we are in Receive State. */
|
|
#define PHPAL_I14443P4MC_STATE_TX_I 0x04U /**< State once we have received successful I (Information) Block. */
|
|
#define PHPAL_I14443P4MC_STATE_TX_R 0x05U /**< State once we have received R Block. */
|
|
#define PHPAL_I14443P4MC_STATE_WTX 0x07U /**< State once we have received S Block (WTX). */
|
|
#define PHPAL_I14443P4MC_STATE_DESELECT 0x08U /**< State once we have received S Block (DESELECT). */
|
|
#define PHPAL_I14443P4MC_STATE_PARAMETERS 0x09U /**< State once we have received S Block (PARAMETERS). */
|
|
#define PHPAL_I14443P4MC_STATE_RESEND 0x0AU /**< State to handle errors, like in case of NAK. */
|
|
#define PHPAL_I14443P4MC_STATE_RXCHAINING 0x0BU /**< State to handle RX Data Chaining. */
|
|
#define PHPAL_I14443P4MC_STATE_TXCHAINING 0x0CU /**< State to handle TX Data Chaining. */
|
|
/** @} */
|
|
|
|
/**
|
|
* \name ISO14443-4 card mode configuration parameters
|
|
*/
|
|
/*@{*/
|
|
#define PHPAL_I14443P4MC_CONFIG_WTX 0x0000U /**< Enable/Disable WTX feature. */
|
|
#define PHPAL_I14443P4MC_CONFIG_WTX_VALUE 0x0001U /**< Set the WTX value. */
|
|
#define PHPAL_I14443P4MC_CONFIG_BLOCKNO 0x0002U /**< Get the value of current ISO14443-4 protocol block number. */
|
|
#define PHPAL_I14443P4MC_CONFIG_FSDI 0x0003U /**< Get the FSDI value. */
|
|
#define PHPAL_I14443P4MC_CONFIG_MODE 0x0004U /**< Set/Get the operation mode (#RD_LIB_MODE_NFC or #RD_LIB_MODE_ISO). */
|
|
#define PHPAL_I14443P4MC_CONFIG_FSD 0x0005U /**< Get the current frame size (FSD) value. */
|
|
#define PHPAL_I14443P4MC_CONFIG_WT_PERCENTAGE 0x0006U /**< Set/Get the percentage of actual time to be used in WTX timer. */
|
|
#define PHPAL_I14443P4MC_CONFIG_WT_DELTA 0x0007U /**< Set/Get the delta time to be subtracted from the time in WTX timer. */
|
|
#define PHPAL_I14443P4MC_CONFIG_CID_PRESENCE 0x0008U /**< Check if CID is present in current received block. 1 - Present; 0 - Not present. */
|
|
#define PHPAL_I14443P4MC_CONFIG_NAD_PRESENCE 0x0009U /**< Check if NAD is present in current received I-block. 1 - Present; 0 - Not present. */
|
|
/** @} */
|
|
|
|
#ifdef NXPRDLIB_REM_GEN_INTFS
|
|
#include "../comps/phpalI14443p4mC/src/Sw/phpalI14443p4mC_Sw.h"
|
|
|
|
#define phpalI14443p4mC_ResetProtocol( pDataParams) \
|
|
phpalI14443p4mC_Sw_ResetProtocol((phpalI14443p4mC_Sw_DataParams_t *)pDataParams)
|
|
|
|
#define phpalI14443p4mC_Activate( pDataParams, pRats, wRatsLength, pAts, wAtsLength) \
|
|
phpalI14443p4mC_Sw_Activate((phpalI14443p4mC_Sw_DataParams_t *)pDataParams, pRats, wRatsLength, pAts, wAtsLength)
|
|
|
|
#define phpalI14443p4mC_SetConfig( pDataParams, wConfig, wValue) \
|
|
phpalI14443p4mC_Sw_SetConfig((phpalI14443p4mC_Sw_DataParams_t *)pDataParams, wConfig, wValue)
|
|
|
|
#define phpalI14443p4mC_GetConfig( pDataParams, wConfig,pValue) \
|
|
phpalI14443p4mC_Sw_GetConfig((phpalI14443p4mC_Sw_DataParams_t *)pDataParams, wConfig, pValue)
|
|
|
|
#define phpalI14443p4mC_Receive( pDataParams, wOption, ppRxBuffer, pRxLength) \
|
|
phpalI14443p4mC_Sw_Receive(( phpalI14443p4mC_Sw_DataParams_t *)pDataParams, wOption, ppRxBuffer, pRxLength)
|
|
|
|
#define phpalI14443p4mC_Transmit( pDataParams, wOption, pTxBuffer, wTxLength) \
|
|
phpalI14443p4mC_Sw_Transmit((phpalI14443p4mC_Sw_DataParams_t *)pDataParams, wOption, pTxBuffer, wTxLength)
|
|
|
|
#define phpalI14443p4mC_Wtx( pDataParams ) \
|
|
phpalI14443p4mC_Sw_Wtx((phpalI14443p4mC_Sw_DataParams_t *) pDataParams)
|
|
|
|
#else
|
|
|
|
/**
|
|
* \brief Reset protocol parameters.
|
|
*
|
|
* Removes any state information stored in previous runs.
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_ResetProtocol(
|
|
void * pDataParams /**< [In] Pointer to this layer's parameter structure. */
|
|
);
|
|
|
|
/**
|
|
* \brief Validates received RATS request and send ATS response.
|
|
*
|
|
* The user has to call \ref phpalI14443p4mC_Receive() once this function has
|
|
* returned with success status.
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
* \retval #PH_ERR_EXT_RF_ERROR External field turned OFF.
|
|
* \retval #PH_ERR_PROTOCOL_ERROR Protocol Error, RATS is invalid.
|
|
* \retval #PH_ERR_INVALID_PARAMETER Invalid input parameter, ATS is invalid.
|
|
* \retval Other depending on implementation and underlying components.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_Activate(
|
|
void * pDataParams, /**< [In] Pointer to this layer's parameter structure */
|
|
uint8_t * pRats, /**< [In] Pointer to received RATS request */
|
|
uint8_t bRatsLength, /**< [In] RATS Length*/
|
|
uint8_t * pAts, /**< [In] ATS to be sent */
|
|
uint16_t wAtsLength /**< [In] ATS length */
|
|
);
|
|
|
|
/**
|
|
* \brief Perform receive operation and validate received block.
|
|
*
|
|
* Used to receive the next command from PCD after the Activate() is successful.
|
|
* Responses to S-block and R-Block are sent internally. Response to I-Block can
|
|
* be sent using \ref phpalI14443p4mC_Transmit.
|
|
* This function also handles PPS request sent from the reader by sending
|
|
* a PPS response. An I-Frame received from the reader is returned back to the
|
|
* user.
|
|
* Handles DESELECT by sending DESELECT response
|
|
* Starts WTx timer before returning with the valid received packet to the caller
|
|
*
|
|
*
|
|
* \c wOption can be one of:\n
|
|
* \li #PH_RECEIVE_DEFAULT
|
|
* \li #PH_RECEIVE_CHAINING
|
|
* \li #PH_RECEIVE_CHAINING_BUFSIZE
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
* \retval #PH_ERR_SUCCESS_CHAINING RX chaining incomplete.
|
|
* \retval #PH_ERR_SUCCESS_DESELECTED Card got DESELECTED.
|
|
* \retval #PH_ERR_EXT_RF_ERROR External field turned OFF.
|
|
* \retval #PH_ERR_BUFFER_OVERFLOW Buffer overflow.
|
|
* \retval Other depending on implementation and underlying components.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_Receive(
|
|
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
|
|
uint16_t wOption, /**< [In] Option parameter. */
|
|
uint8_t ** ppRxBuffer, /**< [Out] Pointer to received data. */
|
|
uint16_t * pRxLength /**< [Out] Number of received data bytes. */
|
|
);
|
|
|
|
/**
|
|
* \brief Transmit I-Block block
|
|
*
|
|
* This function transmits an information block.
|
|
* Stops the WTx timer if it is running.
|
|
*
|
|
*
|
|
* \c wOption can be one of:\n
|
|
* \li #PH_TRANSMIT_DEFAULT
|
|
* \li #PH_TRANSMIT_BUFFER_FIRST
|
|
* \li #PH_TRANSMIT_BUFFER_CONT
|
|
* \li #PH_TRANSMIT_BUFFER_LAST
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
* \retval #PH_ERR_EXT_RF_ERROR External field turned OFF.
|
|
* \retval #PH_ERR_BUFFER_OVERFLOW buffer overflow.
|
|
* \retval Other depending on implementation and underlying components.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_Transmit(
|
|
void * pDataParams, /**< [In] Pointer to this layer's parameter structure. */
|
|
uint16_t wOption, /**< [In] Option parameter. */
|
|
uint8_t * pTxBuffer, /**< [In] I-Block data to transmit. */
|
|
uint16_t wTxLength /**< [In] Length of data to transmit. */
|
|
);
|
|
|
|
/**
|
|
* \brief Sends WTX request and receive WTX response.
|
|
*
|
|
* Wait time extension request is sent by this function and this will block
|
|
* till it receives a response from the external reader.
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
* \retval #PH_ERR_PROTOCOL_ERROR Protocol Error.
|
|
* \retval Other Depending on implementation and underlying component.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_Wtx(
|
|
void * pDataParams /**< [In] Pointer to this layer's parameter structure */
|
|
);
|
|
|
|
/**
|
|
* \brief Set configuration parameter.
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
* \retval #PH_ERR_INVALID_PARAMETER Parameter value is invalid.
|
|
* \retval Other Depending on implementation and underlying component.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_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.
|
|
*
|
|
* \return Status code
|
|
* \retval #PH_ERR_SUCCESS Operation successful.
|
|
* \retval #PH_ERR_INVALID_PARAMETER Parameter value is invalid.
|
|
*/
|
|
phStatus_t phpalI14443p4mC_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_I14443P4MC */
|
|
|
|
#ifdef __cplusplus
|
|
} /* Extern C */
|
|
#endif
|
|
|
|
#endif /* PHPALI14443P4MC_H */
|