| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497 |
- /******************************************************************************
- * \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_nfca.h
- *
- * \author Gustavo Patricio
- *
- * \brief Provides several NFC-A convenience methods and definitions
- *
- * It provides a Poller (ISO14443A PCD) interface and as well as
- * some NFC-A Listener (ISO14443A PICC) helpers.
- *
- * The definitions and helpers methods provided by this module are only
- * up to ISO14443-3 layer
- *
- *
- * An usage example is provided here: \ref exampleRfalNfca.c
- * \example exampleRfalNfca.c
- *
- *
- * \addtogroup RFAL
- * @{
- *
- * \addtogroup RFAL-AL
- * \brief RFAL Abstraction Layer
- * @{
- *
- * \addtogroup NFC-A
- * \brief RFAL NFC-A Module
- * @{
- *
- */
- #ifndef RFAL_NFCA_H
- #define RFAL_NFCA_H
- /*
- ******************************************************************************
- * INCLUDES
- ******************************************************************************
- */
- #include "platform.h"
- #include "st_errno.h"
- #include "rfal_rf.h"
- #include "rfal_t1t.h"
- /*
- ******************************************************************************
- * GLOBAL DEFINES
- ******************************************************************************
- */
- #define RFAL_NFCA_CASCADE_1_UID_LEN \
- 4U /*!< UID length of cascade level 1 only tag */
- #define RFAL_NFCA_CASCADE_2_UID_LEN \
- 7U /*!< UID length of cascade level 2 only tag */
- #define RFAL_NFCA_CASCADE_3_UID_LEN \
- 10U /*!< UID length of cascade level 3 only tag */
- #define RFAL_NFCA_SENS_RES_PLATFORM_MASK \
- 0x0FU /*!< SENS_RES (ATQA) platform configuration mask Digital 1.1 Table 10 */
- #define RFAL_NFCA_SENS_RES_PLATFORM_T1T \
- 0x0CU /*!< SENS_RES (ATQA) T1T platform configuration Digital 1.1 Table 10 */
- #define RFAL_NFCA_SEL_RES_CONF_MASK \
- 0x60U /*!< SEL_RES (SAK) platform configuration mask Digital 1.1 Table 19 */
- #define RFAL_NFCA_SEL_RES_CONF_T2T \
- 0x00U /*!< SEL_RES (SAK) T2T configuration Digital 1.1 Table 19 */
- #define RFAL_NFCA_SEL_RES_CONF_T4T \
- 0x20U /*!< SEL_RES (SAK) T4T configuration Digital 1.1 Table 19 */
- #define RFAL_NFCA_SEL_RES_CONF_NFCDEP \
- 0x40U /*!< SEL_RES (SAK) NFC-DEP configuration Digital 1.1 Table 19 */
- #define RFAL_NFCA_SEL_RES_CONF_T4T_NFCDEP \
- 0x60U /*!< SEL_RES (SAK) T4T and NFC-DEP configuration Digital 1.1 Table 19 */
- /*! NFC-A minimum FDT(listen) = ((n * 128 + (84)) / fc) with n_min = 9 Digital 1.1 6.10.1
- * = (1236)/fc
- * Relax with 3etu: (3*128)/fc as with multiple NFC-A cards, response may take longer (JCOP cards)
- * = (1236 + 384)/fc = 1620 / fc */
- #define RFAL_NFCA_FDTMIN 1620U
- /*
- ******************************************************************************
- * GLOBAL MACROS
- ******************************************************************************
- */
- /*! Checks if device is a T1T given its SENS_RES */
- #define rfalNfcaIsSensResT1T(sensRes) \
- ((((rfalNfcaSensRes*)(sensRes))->platformInfo & RFAL_NFCA_SENS_RES_PLATFORM_MASK) == \
- RFAL_NFCA_SENS_RES_PLATFORM_T1T)
- /*! Checks if device is a T2T given its SENS_RES */
- #define rfalNfcaIsSelResT2T(selRes) \
- ((((rfalNfcaSelRes*)(selRes))->sak & RFAL_NFCA_SEL_RES_CONF_MASK) == \
- RFAL_NFCA_SEL_RES_CONF_T2T)
- /*! Checks if device is a T4T given its SENS_RES */
- #define rfalNfcaIsSelResT4T(selRes) \
- ((((rfalNfcaSelRes*)(selRes))->sak & RFAL_NFCA_SEL_RES_CONF_MASK) == \
- RFAL_NFCA_SEL_RES_CONF_T4T)
- /*! Checks if device supports NFC-DEP protocol given its SENS_RES */
- #define rfalNfcaIsSelResNFCDEP(selRes) \
- ((((rfalNfcaSelRes*)(selRes))->sak & RFAL_NFCA_SEL_RES_CONF_MASK) == \
- RFAL_NFCA_SEL_RES_CONF_NFCDEP)
- /*! Checks if device supports ISO-DEP and NFC-DEP protocol given its SENS_RES */
- #define rfalNfcaIsSelResT4TNFCDEP(selRes) \
- ((((rfalNfcaSelRes*)(selRes))->sak & RFAL_NFCA_SEL_RES_CONF_MASK) == \
- RFAL_NFCA_SEL_RES_CONF_T4T_NFCDEP)
- /*! Checks if a NFC-A listener device supports multiple protocols (ISO-DEP and NFC-DEP) */
- #define rfalNfcaLisDevIsMultiProto(lisDev) \
- (((rfalNfcaListenDevice*)(lisDev))->type == RFAL_NFCA_T4T_NFCDEP)
- /*
- ******************************************************************************
- * GLOBAL TYPES
- ******************************************************************************
- */
- /*! NFC-A Listen device types */
- typedef enum {
- RFAL_NFCA_T1T =
- 0x01, /* Device configured for T1T Digital 1.1 Table 9 */
- RFAL_NFCA_T2T =
- 0x00, /* Device configured for T2T Digital 1.1 Table 19 */
- RFAL_NFCA_T4T =
- 0x20, /* Device configured for T4T Digital 1.1 Table 19 */
- RFAL_NFCA_NFCDEP =
- 0x40, /* Device configured for NFC-DEP Digital 1.1 Table 19 */
- RFAL_NFCA_T4T_NFCDEP =
- 0x60 /* Device configured for NFC-DEP and T4T Digital 1.1 Table 19 */
- } rfalNfcaListenDeviceType;
- /*! SENS_RES (ATQA) format Digital 1.1 6.6.3 & Table 7 */
- typedef struct {
- uint8_t
- anticollisionInfo; /*!< SENS_RES Anticollision Information */
- uint8_t
- platformInfo; /*!< SENS_RES Platform Information */
- } rfalNfcaSensRes;
- /*! SDD_REQ (Anticollision) format Digital 1.1 6.7.1 & Table 11 */
- typedef struct {
- uint8_t
- selCmd; /*!< SDD_REQ SEL_CMD: cascade Level */
- uint8_t
- selPar; /*!< SDD_REQ SEL_PAR: Byte Count[4b] | Bit Count[4b] (NVB: Number of Valid Bits)*/
- } rfalNfcaSddReq;
- /*! SDD_RES (UID CLn) format Digital 1.1 6.7.2 & Table 15 */
- typedef struct {
- uint8_t nfcid1
- [RFAL_NFCA_CASCADE_1_UID_LEN]; /*!< NFCID1 cascade level NFCID */
- uint8_t bcc; /*!< BCC Exclusive-OR over first 4 bytes of SDD_RES */
- } rfalNfcaSddRes;
- /*! SEL_REQ (Select) format Digital 1.1 6.8.1 & Table 17 */
- typedef struct {
- uint8_t
- selCmd; /*!< SDD_REQ SEL_CMD: cascade Level */
- uint8_t
- selPar; /*!< SDD_REQ SEL_PAR: Byte Count[4b] | Bit Count[4b] (NVB: Number of Valid Bits)*/
- uint8_t nfcid1
- [RFAL_NFCA_CASCADE_1_UID_LEN]; /*!< NFCID1 data */
- uint8_t bcc; /*!< Checksum calculated as exclusive-OR over the 4 bytes of NFCID1 CLn */
- } rfalNfcaSelReq;
- /*! SEL_RES (SAK) format Digital 1.1 6.8.2 & Table 19 */
- typedef struct {
- uint8_t sak; /*!< Select Acknowledge */
- } rfalNfcaSelRes;
- /*! NFC-A listener device (PICC) struct */
- typedef struct {
- rfalNfcaListenDeviceType
- type; /*!< NFC-A Listen device type */
- rfalNfcaSensRes
- sensRes; /*!< SENS_RES (ATQA) */
- rfalNfcaSelRes
- selRes; /*!< SEL_RES (SAK) */
- uint8_t
- nfcId1Len; /*!< NFCID1 Length */
- uint8_t nfcId1
- [RFAL_NFCA_CASCADE_3_UID_LEN]; /*!< NFCID1 (UID) */
- #ifdef RFAL_FEATURE_T1T
- rfalT1TRidRes
- ridRes; /*!< RID_RES */
- #endif /* RFAL_FEATURE_T1T */
- bool isSleep; /*!< Device sleeping flag */
- } rfalNfcaListenDevice;
- /*
- ******************************************************************************
- * GLOBAL FUNCTION PROTOTYPES
- ******************************************************************************
- */
- /*!
- *****************************************************************************
- * \brief Initialize NFC-A Poller mode
- *
- * This methods configures RFAL RF layer to perform as a
- * NFC-A Poller/RW (ISO14443A PCD) including all default timings and bit rate
- * to 106 kbps
-
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or mode not set
- * \return ERR_NONE : No error
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerInitialize(void);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Check Presence
- *
- * This method checks if a NFC-A Listen device (PICC) is present on the field
- * by sending an ALL_REQ (WUPA) or SENS_REQ (REQA)
- *
- * \param[in] cmd : Indicate if to send an ALL_REQ or a SENS_REQ
- * \param[out] sensRes : If received, the SENS_RES
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_RF_COLLISION : Collision detected one or more device in the field
- * \return ERR_PAR : Parity error detected, one or more device in the field
- * \return ERR_CRC : CRC error detected, one or more device in the field
- * \return ERR_FRAMING : Framing error detected, one or more device in the field
- * \return ERR_PROTO : Protocol error detected, one or more device in the field
- * \return ERR_TIMEOUT : Timeout error, no listener device detected
- * \return ERR_NONE : No error, one or more device in the field
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerCheckPresence(rfal14443AShortFrameCmd cmd, rfalNfcaSensRes* sensRes);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Select
- *
- * This method selects a NFC-A Listener device (PICC)
- *
- * \param[in] nfcid1 : Listener device NFCID1 to be selected
- * \param[in] nfcidLen : Length of the NFCID1 to be selected
- * \param[out] selRes : pointer to place the SEL_RES
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_TIMEOUT : Timeout error
- * \return ERR_PAR : Parity error detected
- * \return ERR_CRC : CRC error detected
- * \return ERR_FRAMING : Framing error detected
- * \return ERR_PROTO : Protocol error detected
- * \return ERR_NONE : No error, SEL_RES received
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerSelect(const uint8_t* nfcid1, uint8_t nfcidLen, rfalNfcaSelRes* selRes);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Sleep
- *
- * This method sends a SLP_REQ (HLTA)
- * No response is expected afterwards Digital 1.1 6.9.2.1
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_NONE : No error
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerSleep(void);
- /*!
- *****************************************************************************
- * \brief NFC-A Technology Detection
- *
- * This method performs NFC-A Technology Detection as defined in the spec
- * given in the compliance mode
- *
- * \param[in] compMode : compliance mode to be performed
- * \param[out] sensRes : location to store the SENS_RES, if received
- *
- * When compMode is set to ISO compliance a SLP_REQ (HLTA) is not sent
- * after detection. When set to EMV a ALL_REQ (WUPA) is sent instead of
- * a SENS_REQ (REQA)
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_NONE : No error, one or more device in the field
- *****************************************************************************
- */
- ReturnCode
- rfalNfcaPollerTechnologyDetection(rfalComplianceMode compMode, rfalNfcaSensRes* sensRes);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Collision Resolution
- *
- * Collision resolution for one NFC-A Listener device/card (PICC) as
- * defined in Activity 2.1 9.3.4
- *
- * This method executes anti collision loop and select the device with higher NFCID1
- *
- * When devLimit = 0 it is configured to perform collision detection only. Once a collision
- * is detected the collision resolution is aborted immidiatly. If only one device is found
- * with no collisions, it will properly resolved.
- *
- * \param[in] devLimit : device limit value (CON_DEVICES_LIMIT)
- * \param[out] collPending : pointer to collision pending flag (INT_COLL_PEND)
- * \param[out] selRes : location to store the last Select Response from listener device (PICC)
- * \param[out] nfcId1 : location to store the NFCID1 (UID), ensure RFAL_NFCA_CASCADE_3_UID_LEN
- * \param[out] nfcId1Len : pointer to length of NFCID1 (UID)
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or mode not set
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_PROTO : Card length invalid
- * \return ERR_IGNORE : conDevLimit is 0 and there is a collision
- * \return ERR_NONE : No error
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerSingleCollisionResolution(
- uint8_t devLimit,
- bool* collPending,
- rfalNfcaSelRes* selRes,
- uint8_t* nfcId1,
- uint8_t* nfcId1Len);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Full Collision Resolution
- *
- * Performs a full Collision resolution as defined in Activity 2.1 9.3.4
- *
- * \param[in] compMode : compliance mode to be performed
- * \param[in] devLimit : device limit value, and size nfcaDevList
- * \param[out] nfcaDevList : NFC-A listener device info
- * \param[out] devCnt : Devices found counter
- *
- * When compMode is set to ISO compliance it assumes that the device is
- * not sleeping and therefore no ALL_REQ (WUPA) is sent at the beginning.
- * When compMode is set to NFC compliance an additional ALL_REQ (WUPA) is sent
- * at the beginning.
- *
- *
- * When devLimit = 0 it is configured to perform collision detection only. Once a collision
- * is detected the collision resolution is aborted immidiatly. If only one device is found
- * with no collisions, it will properly resolved.
- *
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or mode not set
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_NONE : No error
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerFullCollisionResolution(
- rfalComplianceMode compMode,
- uint8_t devLimit,
- rfalNfcaListenDevice* nfcaDevList,
- uint8_t* devCnt);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Full Collision Resolution with Sleep
- *
- * Performs a full Collision resolution similar to rfalNfcaPollerFullCollisionResolution
- * but an additional SLP_REQ (HLTA) -> SENS_RES (REQA) is sent regardless if there
- * was a collision.
- * This proprietary behaviour ensures proper activation of certain devices that suffer
- * from influence of Type B commands as foreseen in ISO14443-3 5.2.3 or were somehow
- * not detected by the first round of collision resolution
- *
- * \param[in] devLimit : device limit value, and size nfcaDevList
- * \param[out] nfcaDevList : NFC-A listener device info
- * \param[out] devCnt : Devices found counter
- *
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or mode not set
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_NONE : No error
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerSleepFullCollisionResolution(
- uint8_t devLimit,
- rfalNfcaListenDevice* nfcaDevList,
- uint8_t* devCnt);
- /*!
- *****************************************************************************
- * \brief NFC-A Poller Start Full Collision Resolution
- *
- * This method starts the full Collision resolution as defined
- * in Activity 1.0 or 1.1 9.3.4
- *
- * \param[in] compMode : compliance mode to be performed
- * \param[in] devLimit : device limit value, and size nfcaDevList
- * \param[out] nfcaDevList : NFC-A listener device info
- * \param[out] devCnt : Devices found counter
- *
- * When compMode is set to ISO compliance it assumes that the device is
- * not sleeping and therefore no ALL_REQ (WUPA) is sent at the beginning.
- * When compMode is set to NFC compliance an additional ALL_REQ (WUPA) is sent at
- * the beginning.
- *
- *
- * When devLimit = 0 it is configured to perform collision detection only. Once a collision
- * is detected the collision resolution is aborted immidiatly. If only one device is found
- * with no collisions, it will properly resolved.
- *
- *
- * \return ERR_WRONG_STATE : RFAL not initialized or mode not set
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_NONE : No error
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerStartFullCollisionResolution(
- rfalComplianceMode compMode,
- uint8_t devLimit,
- rfalNfcaListenDevice* nfcaDevList,
- uint8_t* devCnt);
- /*!
- *****************************************************************************
- * \brief NFC-A Get Full Collision Resolution Status
- *
- * Returns the Collision Resolution status
- *
- * \return ERR_BUSY : Operation is ongoing
- * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode
- * \return ERR_PARAM : Invalid parameters
- * \return ERR_IO : Generic internal error
- * \return ERR_TIMEOUT : Timeout error
- * \return ERR_PAR : Parity error detected
- * \return ERR_CRC : CRC error detected
- * \return ERR_FRAMING : Framing error detected
- * \return ERR_PROTO : Protocol error detected
- * \return ERR_NONE : No error, activation successful
- *****************************************************************************
- */
- ReturnCode rfalNfcaPollerGetFullCollisionResolutionStatus(void);
- /*!
- *****************************************************************************
- * \brief NFC-A Listener is SLP_REQ
- *
- * Checks if the given buffer contains valid NFC-A SLP_REQ (HALT)
- *
- * \param[in] buf: buffer containing data
- * \param[in] bufLen: length of the data in buffer to be checked
- *
- * \return true if data in buf contains a SLP_REQ ; false otherwise
- *****************************************************************************
- */
- bool rfalNfcaListenerIsSleepReq(const uint8_t* buf, uint16_t bufLen);
- #endif /* RFAL_NFCA_H */
- /**
- * @}
- *
- * @}
- *
- * @}
- */
|