| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- /******************************************************************************
- * \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; /*!< Compliance 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 */
- bool activate_after_sak; // Set device to Active mode after SAK response
- } 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 active
- *
- * \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,
- uint32_t tx_flag);
- ReturnCode rfalNfcDataExchangeCustomStart(
- uint8_t* txData,
- uint16_t txDataLen,
- uint8_t** rxData,
- uint16_t** rvdLen,
- uint32_t fwt,
- uint32_t flags);
- /*!
- *****************************************************************************
- * \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 */
- /**
- * @}
- *
- * @}
- *
- * @}
- */
|