NFC: application + rfal + driver.
This commit is contained in:
415
lib/ST25RFAL002/include/rfal_nfc.h
Executable file
415
lib/ST25RFAL002/include/rfal_nfc.h
Executable file
@@ -0,0 +1,415 @@
|
||||
|
||||
/******************************************************************************
|
||||
* \attention
|
||||
*
|
||||
* <h2><center>© COPYRIGHT 2020 STMicroelectronics</center></h2>
|
||||
*
|
||||
* Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
|
||||
* You may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at:
|
||||
*
|
||||
* www.st.com/myliberty
|
||||
*
|
||||
* 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,
|
||||
* AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
||||
* FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*
|
||||
******************************************************************************/
|
||||
|
||||
|
||||
/*
|
||||
* PROJECT: ST25R391x firmware
|
||||
* Revision:
|
||||
* LANGUAGE: ISO C99
|
||||
*/
|
||||
|
||||
/*! \file rfal_nfc.h
|
||||
*
|
||||
* \brief RFAL NFC device
|
||||
*
|
||||
* This module provides the required features to behave as an NFC Poller
|
||||
* or Listener device. It grants an easy to use interface for the following
|
||||
* activities: Technology Detection, Collision Resolution, Activation,
|
||||
* Data Exchange, and Deactivation
|
||||
*
|
||||
* This layer is influenced by (but not fully aligned with) the NFC Forum
|
||||
* specifications, in particular: Activity 2.0 and NCI 2.0
|
||||
*
|
||||
*
|
||||
*
|
||||
* \addtogroup RFAL
|
||||
* @{
|
||||
*
|
||||
* \addtogroup RFAL-HL
|
||||
* \brief RFAL Higher Layer
|
||||
* @{
|
||||
*
|
||||
* \addtogroup NFC
|
||||
* \brief RFAL NFC Device
|
||||
* @{
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFC_H
|
||||
#define RFAL_NFC_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "platform.h"
|
||||
#include "st_errno.h"
|
||||
#include "rfal_rf.h"
|
||||
#include "rfal_nfca.h"
|
||||
#include "rfal_nfcb.h"
|
||||
#include "rfal_nfcf.h"
|
||||
#include "rfal_nfcv.h"
|
||||
#include "rfal_st25tb.h"
|
||||
#include "rfal_nfcDep.h"
|
||||
#include "rfal_isoDep.h"
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_NFC_TECH_NONE 0x0000U /*!< No technology */
|
||||
#define RFAL_NFC_POLL_TECH_A 0x0001U /*!< NFC-A technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_B 0x0002U /*!< NFC-B technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_F 0x0004U /*!< NFC-F technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_V 0x0008U /*!< NFC-V technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_AP2P 0x0010U /*!< AP2P technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_ST25TB 0x0020U /*!< ST25TB technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_A 0x1000U /*!< NFC-V technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_B 0x2000U /*!< NFC-V technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_F 0x4000U /*!< NFC-V technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_AP2P 0x8000U /*!< NFC-V technology Flag */
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Checks if a device is currently activated */
|
||||
#define rfalNfcIsDevActivated( st ) ( ((st)>= RFAL_NFC_STATE_ACTIVATED) && ((st)<RFAL_NFC_STATE_DEACTIVATION) )
|
||||
|
||||
/*! Checks if a device is in discovery */
|
||||
#define rfalNfcIsInDiscovery( st ) ( ((st)>= RFAL_NFC_STATE_START_DISCOVERY) && ((st)<RFAL_NFC_STATE_ACTIVATED) )
|
||||
|
||||
/*! Checks if remote device is in Poll mode */
|
||||
#define rfalNfcIsRemDevPoller( tp ) ( ((tp)>= RFAL_NFC_POLL_TYPE_NFCA) && ((tp)<=RFAL_NFC_POLL_TYPE_AP2P ) )
|
||||
|
||||
/*! Checks if remote device is in Listen mode */
|
||||
#define rfalNfcIsRemDevListener( tp ) ( ((int16_t)(tp)>= (int16_t)RFAL_NFC_LISTEN_TYPE_NFCA) && ((tp)<=RFAL_NFC_LISTEN_TYPE_AP2P) )
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL ENUMS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Main state */
|
||||
typedef enum{
|
||||
RFAL_NFC_STATE_NOTINIT = 0, /*!< Not Initialized state */
|
||||
RFAL_NFC_STATE_IDLE = 1, /*!< Initialize state */
|
||||
RFAL_NFC_STATE_START_DISCOVERY = 2, /*!< Start Discovery loop state */
|
||||
RFAL_NFC_STATE_WAKEUP_MODE = 3, /*!< Wake-Up state */
|
||||
RFAL_NFC_STATE_POLL_TECHDETECT = 10, /*!< Technology Detection state */
|
||||
RFAL_NFC_STATE_POLL_COLAVOIDANCE = 11, /*!< Collision Avoidance state */
|
||||
RFAL_NFC_STATE_POLL_SELECT = 12, /*!< Wait for Selection state */
|
||||
RFAL_NFC_STATE_POLL_ACTIVATION = 13, /*!< Activation state */
|
||||
RFAL_NFC_STATE_LISTEN_TECHDETECT = 20, /*!< Listen Tech Detect */
|
||||
RFAL_NFC_STATE_LISTEN_COLAVOIDANCE = 21, /*!< Listen Collision Avoidance */
|
||||
RFAL_NFC_STATE_LISTEN_ACTIVATION = 22, /*!< Listen Activation state */
|
||||
RFAL_NFC_STATE_LISTEN_SLEEP = 23, /*!< Listen Sleep state */
|
||||
RFAL_NFC_STATE_ACTIVATED = 30, /*!< Activated state */
|
||||
RFAL_NFC_STATE_DATAEXCHANGE = 31, /*!< Data Exchange Start state */
|
||||
RFAL_NFC_STATE_DATAEXCHANGE_DONE = 33, /*!< Data Exchange terminated */
|
||||
RFAL_NFC_STATE_DEACTIVATION = 34 /*!< Deactivation state */
|
||||
}rfalNfcState;
|
||||
|
||||
|
||||
/*! Device type */
|
||||
typedef enum{
|
||||
RFAL_NFC_LISTEN_TYPE_NFCA = 0, /*!< NFC-A Listener device type */
|
||||
RFAL_NFC_LISTEN_TYPE_NFCB = 1, /*!< NFC-B Listener device type */
|
||||
RFAL_NFC_LISTEN_TYPE_NFCF = 2, /*!< NFC-F Listener device type */
|
||||
RFAL_NFC_LISTEN_TYPE_NFCV = 3, /*!< NFC-V Listener device type */
|
||||
RFAL_NFC_LISTEN_TYPE_ST25TB = 4, /*!< ST25TB Listener device type */
|
||||
RFAL_NFC_LISTEN_TYPE_AP2P = 5, /*!< AP2P Listener device type */
|
||||
RFAL_NFC_POLL_TYPE_NFCA = 10, /*!< NFC-A Poller device type */
|
||||
RFAL_NFC_POLL_TYPE_NFCB = 11, /*!< NFC-B Poller device type */
|
||||
RFAL_NFC_POLL_TYPE_NFCF = 12, /*!< NFC-F Poller device type */
|
||||
RFAL_NFC_POLL_TYPE_NFCV = 13, /*!< NFC-V Poller device type */
|
||||
RFAL_NFC_POLL_TYPE_AP2P = 15 /*!< AP2P Poller device type */
|
||||
}rfalNfcDevType;
|
||||
|
||||
|
||||
/*! Device interface */
|
||||
typedef enum{
|
||||
RFAL_NFC_INTERFACE_RF = 0, /*!< RF Frame interface */
|
||||
RFAL_NFC_INTERFACE_ISODEP = 1, /*!< ISO-DEP interface */
|
||||
RFAL_NFC_INTERFACE_NFCDEP = 2 /*!< NFC-DEP interface */
|
||||
}rfalNfcRfInterface;
|
||||
|
||||
|
||||
/*! Device struct containing all its details */
|
||||
typedef struct{
|
||||
rfalNfcDevType type; /*!< Device's type */
|
||||
union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one technology at a time */
|
||||
rfalNfcaListenDevice nfca; /*!< NFC-A Listen Device instance */
|
||||
rfalNfcbListenDevice nfcb; /*!< NFC-B Listen Device instance */
|
||||
rfalNfcfListenDevice nfcf; /*!< NFC-F Listen Device instance */
|
||||
rfalNfcvListenDevice nfcv; /*!< NFC-V Listen Device instance */
|
||||
rfalSt25tbListenDevice st25tb; /*!< ST25TB Listen Device instance*/
|
||||
}dev; /*!< Device's instance */
|
||||
|
||||
uint8_t *nfcid; /*!< Device's NFCID */
|
||||
uint8_t nfcidLen; /*!< Device's NFCID length */
|
||||
rfalNfcRfInterface rfInterface; /*!< Device's interface */
|
||||
|
||||
union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one protocol at a time */
|
||||
rfalIsoDepDevice isoDep; /*!< ISO-DEP instance */
|
||||
rfalNfcDepDevice nfcDep; /*!< NFC-DEP instance */
|
||||
}proto; /*!< Device's protocol */
|
||||
}rfalNfcDevice;
|
||||
|
||||
|
||||
/*! Discovery parameters */
|
||||
typedef struct{
|
||||
rfalComplianceMode compMode; /*!< Compliancy mode to be used */
|
||||
uint16_t techs2Find; /*!< Technologies to search for */
|
||||
uint16_t totalDuration; /*!< Duration of a whole Poll + Listen cycle */
|
||||
uint8_t devLimit; /*!< Max number of devices */
|
||||
rfalBitRate maxBR; /*!< Max Bit rate to be used for communications */
|
||||
|
||||
rfalBitRate nfcfBR; /*!< Bit rate to poll for NFC-F */
|
||||
uint8_t nfcid3[RFAL_NFCDEP_NFCID3_LEN]; /*!< NFCID3 to be used on the ATR_REQ/ATR_RES */
|
||||
uint8_t GB[RFAL_NFCDEP_GB_MAX_LEN]; /*!< General bytes to be used on the ATR-REQ */
|
||||
uint8_t GBLen; /*!< Length of the General Bytes */
|
||||
rfalBitRate ap2pBR; /*!< Bit rate to poll for AP2P */
|
||||
|
||||
|
||||
rfalLmConfPA lmConfigPA; /*!< Configuration for Passive Listen mode NFC-A */
|
||||
rfalLmConfPF lmConfigPF; /*!< Configuration for Passive Listen mode NFC-A */
|
||||
|
||||
void (*notifyCb)( rfalNfcState st ); /*!< Callback to Notify upper layer */
|
||||
|
||||
bool wakeupEnabled; /*!< Enable Wake-Up mode before polling */
|
||||
bool wakeupConfigDefault; /*!< Wake-Up mode default configuration */
|
||||
rfalWakeUpConfig wakeupConfig; /*!< Wake-Up mode configuration */
|
||||
}rfalNfcDiscoverParam;
|
||||
|
||||
|
||||
/*! Buffer union, only one interface is used at a time */
|
||||
typedef union{ /* PRQA S 0750 # MISRA 19.2 - Members of the union will not be used concurrently, only one interface at a time */
|
||||
uint8_t rfBuf[RFAL_FEATURE_NFC_RF_BUF_LEN]; /*!< RF buffer */
|
||||
rfalIsoDepApduBufFormat isoDepBuf; /*!< ISO-DEP buffer format (with header/prologue) */
|
||||
rfalNfcDepPduBufFormat nfcDepBuf; /*!< NFC-DEP buffer format (with header/prologue) */
|
||||
}rfalNfcBuffer;
|
||||
|
||||
/*******************************************************************************/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Worker
|
||||
*
|
||||
* It runs the internal state machine and runs the RFAL RF worker.
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalNfcWorker( void );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Initialize
|
||||
*
|
||||
* It initializes this module and its dependencies
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return ERR_IO : Generic internal error
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcInitialize( void );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Discovery
|
||||
*
|
||||
* It set the device in Discovery state.
|
||||
* In discovery it will Poll and/or Listen for the technologies configured,
|
||||
* and perform Wake-up mode if configured to do so.
|
||||
*
|
||||
* The device list passed on disParams must not be empty.
|
||||
* The number of devices on the list is indicated by the devLimit and shall
|
||||
* be at >= 1.
|
||||
*
|
||||
* \param[in] disParams : discovery configuration parameters
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return ERR_PARAM : Invalid parameters
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDiscover( const rfalNfcDiscoverParam *disParams );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Get State
|
||||
*
|
||||
* It returns the current state
|
||||
*
|
||||
* \return rfalNfcState : the current state
|
||||
*****************************************************************************
|
||||
*/
|
||||
rfalNfcState rfalNfcGetState( void );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Get Devices Found
|
||||
*
|
||||
* It returns the location of the device list and the number of
|
||||
* devices found.
|
||||
*
|
||||
* \param[out] devList : device list location
|
||||
* \param[out] devCnt : number of devices found
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* Discovery still ongoing
|
||||
* \return ERR_PARAM : Invalid parameters
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcGetDevicesFound( rfalNfcDevice **devList, uint8_t *devCnt );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Get Active Device
|
||||
*
|
||||
* It returns the location of the device current Active device
|
||||
*
|
||||
* \param[out] dev : device info location
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* No device activated
|
||||
* \return ERR_PARAM : Invalid parameters
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcGetActiveDevice( rfalNfcDevice **dev );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Select Device
|
||||
*
|
||||
* It selects the device to be activated.
|
||||
* It shall be called when more than one device has been identified to
|
||||
* indiacte which device shall be actived
|
||||
*
|
||||
* \param[in] devIdx : device index to be activated
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* Not in select state
|
||||
* \return ERR_PARAM : Invalid parameters
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcSelect( uint8_t devIdx );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Start Data Exchange
|
||||
*
|
||||
* After a device has been activated, it starts a data exchange.
|
||||
* It handles automatically which interface/protocol to be used and acts accordingly.
|
||||
*
|
||||
* In Listen mode the first frame/data shall be sent by the Reader/Initiator
|
||||
* therefore this method must be called first with txDataLen set to zero
|
||||
* to retrieve the rxData and rcvLen locations.
|
||||
*
|
||||
*
|
||||
* \param[in] txData : data to be transmitted
|
||||
* \param[in] txDataLen : size of the data to be transmitted
|
||||
* \param[out] rxData : location of the received data after operation is completed
|
||||
* \param[out] rvdLen : location of thelength of the received data
|
||||
* \param[in] fwt : FWT to be used in case of RF interface.
|
||||
* If ISO-DEP or NFC-DEP interface is used, this will be ignored
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return ERR_PARAM : Invalid parameters
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDataExchangeStart( uint8_t *txData, uint16_t txDataLen, uint8_t **rxData, uint16_t **rvdLen, uint32_t fwt );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Get Data Exchange Status
|
||||
*
|
||||
* Gets current Data Exchange status
|
||||
*
|
||||
* \return ERR_NONE : Transceive done with no error
|
||||
* \return ERR_BUSY : Transceive ongoing
|
||||
* \return ERR_AGAIN : received one chaining block, copy received data
|
||||
* and continue to call this method to retrieve the
|
||||
* remaining blocks
|
||||
* \return ERR_XXXX : Error occurred
|
||||
* \return ERR_TIMEOUT : No response
|
||||
* \return ERR_FRAMING : Framing error detected
|
||||
* \return ERR_PAR : Parity error detected
|
||||
* \return ERR_CRC : CRC error detected
|
||||
* \return ERR_LINK_LOSS : Link Loss - External Field is Off
|
||||
* \return ERR_RF_COLLISION : Collision detected
|
||||
* \return ERR_IO : Internal error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDataExchangeGetStatus( void );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Deactivate
|
||||
*
|
||||
* It triggers the deactivation procedure to terminate communications with
|
||||
* remote device. At the end the field will be turned off.
|
||||
*
|
||||
* \param[in] discovery : TRUE if after deactivation go back into discovery
|
||||
* : FALSE if after deactivation remain in idle
|
||||
*
|
||||
* \return ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDeactivate( bool discovery );
|
||||
|
||||
#endif /* RFAL_NFC_H */
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
Reference in New Issue
Block a user