/****************************************************************************** * \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_nfcv.h * * \author Gustavo Patricio * * \brief Implementation of NFC-V Poller (ISO15693) device * * The definitions and helpers methods provided by this module * are aligned with NFC-V Digital 2.1 * * * \addtogroup RFAL * @{ * * \addtogroup RFAL-AL * \brief RFAL Abstraction Layer * @{ * * \addtogroup NFC-V * \brief RFAL NFC-V Module * @{ * */ #ifndef RFAL_NFCV_H #define RFAL_NFCV_H /* ****************************************************************************** * INCLUDES ****************************************************************************** */ #include "platform.h" #include "st_errno.h" #include "rfal_rf.h" /* ****************************************************************************** * GLOBAL DEFINES ****************************************************************************** */ #define RFAL_NFCV_UID_LEN 8U /*!< NFC-V UID length */ #define RFAL_NFCV_MAX_BLOCK_LEN \ 32U /*!< Max Block size: can be of up to 256 bits ISO 15693 2000 5 */ #define RFAL_NFCV_BNO_LEN 1U /*!< NFC-V Block Number length */ #define RFAL_NFCV_CRC_LEN 2U /*!< NFC-V CRC length */ #define RFAL_NFCV_MAX_GEN_DATA_LEN \ (RFAL_NFCV_MAX_BLOCK_LEN + RFAL_NFCV_BNO_LEN + RFAL_NFCV_UID_LEN) /*!<Max data */ #define RFAL_NFCV_BLOCKNUM_LEN \ 1U /*!< Block Number length on normal commands: 8 bits */ #define RFAL_NFCV_BLOCKNUM_EXTENDED_LEN \ 2U /*!< Block Number length on extended commands: 16 bits */ #define RFAL_NFCV_PARAM_SKIP \ 0U /*!< Skip proprietary Param Request */ /*! NFC-V RequestFlags ISO15693 2000 7.3.1 */ enum { RFAL_NFCV_REQ_FLAG_DEFAULT = 0x02U, /*!< Default Request Flags */ RFAL_NFCV_REQ_FLAG_SUB_CARRIER = 0x01U, /*!< Sub Carrier flag */ RFAL_NFCV_REQ_FLAG_DATA_RATE = 0x02U, /*!< Data Rate flag */ RFAL_NFCV_REQ_FLAG_INVENTORY = 0x04U, /*!< Inventory flag */ RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT = 0x08U, /*!< Protocol Extension flag */ RFAL_NFCV_REQ_FLAG_SELECT = 0x10U, /*!< Select flag */ RFAL_NFCV_REQ_FLAG_ADDRESS = 0x20U, /*!< Address flag */ RFAL_NFCV_REQ_FLAG_OPTION = 0x40U, /*!< Option flag */ RFAL_NFCV_REQ_FLAG_RFU = 0x80U, /*!< RFU flag */ RFAL_NFCV_REQ_FLAG_AFI = 0x10U, /*!< AFI flag */ RFAL_NFCV_REQ_FLAG_NB_SLOTS = 0x20U, /*!< Number of Slots flag */ }; /*! NFC-V Response Flags ISO15693 2000 7.4.1 */ enum { RFAL_NFCV_RES_FLAG_ERROR = 0x01U, /*!< Error flag */ RFAL_NFCV_RES_FLAG_RFU1 = 0x02U, /*!< RFU flag */ RFAL_NFCV_RES_FLAG_RFU2 = 0x04U, /*!< RFU flag */ RFAL_NFCV_RES_FLAG_EXTENSION = 0x08U, /*!< Extension flag */ RFAL_NFCV_RES_FLAG_RFU3 = 0x10U, /*!< RFU flag */ RFAL_NFCV_RES_FLAG_RFU4 = 0x20U, /*!< RFU flag */ RFAL_NFCV_RES_FLAG_RFU5 = 0x40U, /*!< RFU flag */ RFAL_NFCV_RES_FLAG_RFU6 = 0x80U /*!< RFU flag */ }; /*! NFC-V Error code ISO15693 2000 7.4.2 */ enum { RFAL_NFCV_ERROR_CMD_NOT_SUPPORTED = 0x01U, /*!< The command is not supported, code is not recognised */ RFAL_NFCV_ERROR_CMD_NOT_RECOGNIZED = 0x02U, /*!< The command is not recognised, format error occurred */ RFAL_NFCV_ERROR_OPTION_NOT_SUPPORTED = 0x03U, /*!< The option is not supported */ RFAL_NFCV_ERROR_UNKNOWN = 0x0FU, /*!< Unknown error */ RFAL_NFCV_ERROR_BLOCK_NOT_AVALIABLE = 0x10U, /*!< The specified block is not available */ RFAL_NFCV_ERROR_BLOCK_ALREDY_LOCKED = 0x11U, /*!< The specified block is already locked */ RFAL_NFCV_ERROR_BLOCK_LOCKED = 0x12U, /*!< The specified block is locked */ RFAL_NFCV_ERROR_WRITE_FAILED = 0x13U, /*!< The specified block was not successfully programmed */ RFAL_NFCV_ERROR_BLOCK_FAILED = 0x14U /*!< The specified block was not successfully locked */ }; /*! NFC-V command set ISO15693 2000 9.1 */ enum { RFAL_NFCV_CMD_INVENTORY = 0x01U, /*!< INVENTORY_REQ (Inventory) command */ RFAL_NFCV_CMD_SLPV = 0x02U, /*!< SLPV_REQ (Stay quiet) command */ RFAL_NFCV_CMD_READ_SINGLE_BLOCK = 0x20U, /*!< Read single block command */ RFAL_NFCV_CMD_WRITE_SINGLE_BLOCK = 0x21U, /*!< Write single block command */ RFAL_NFCV_CMD_LOCK_BLOCK = 0x22U, /*!< Lock block command */ RFAL_NFCV_CMD_READ_MULTIPLE_BLOCKS = 0x23U, /*!< Read multiple blocks command */ RFAL_NFCV_CMD_WRITE_MULTIPLE_BLOCKS = 0x24U, /*!< Write multiple blocks command */ RFAL_NFCV_CMD_SELECT = 0x25U, /*!< Select command */ RFAL_NFCV_CMD_RESET_TO_READY = 0x26U, /*!< Reset To Ready command */ RFAL_NFCV_CMD_GET_SYS_INFO = 0x2BU, /*!< Get System Information command */ RFAL_NFCV_CMD_EXTENDED_READ_SINGLE_BLOCK = 0x30U, /*!< Extended read single block command */ RFAL_NFCV_CMD_EXTENDED_WRITE_SINGLE_BLOCK = 0x31U, /*!< Extended write single block command */ RFAL_NFCV_CMD_EXTENDED_LOCK_SINGLE_BLOCK = 0x32U, /*!< Extended lock single block command */ RFAL_NFCV_CMD_EXTENDED_READ_MULTIPLE_BLOCK = 0x33U, /*!< Extended read multiple block command */ RFAL_NFCV_CMD_EXTENDED_WRITE_MULTIPLE_BLOCK = 0x34U, /*!< Extended read multiple block command */ RFAL_NFCV_CMD_EXTENDED_GET_SYS_INFO = 0x3BU /*!< Extended Get System Information command */ }; /*! ST25TV/ST25DV command set */ enum { RFAL_NFCV_CMD_READ_CONFIGURATION = 0xA0U, /*!< Read configuration command */ RFAL_NFCV_CMD_WRITE_CONFIGURATION = 0xA1U, /*!< Write configuration command */ RFAL_NFCV_CMD_SET_EAS = 0xA2U, /*!< Set EAS command */ RFAL_NFCV_CMD_RESET_EAS = 0xA3U, /*!< Reset EAS command */ RFAL_NFCV_CMD_LOCK_EAS = 0xA4U, /*!< Lock EAS command */ RFAL_NFCV_CMD_ENABLE_EAS = 0xA5U, /*!< Enable EAS command */ RFAL_NFCV_CMD_KILL = 0xA6U, /*!< Kill command */ RFAL_NFCV_CMD_WRITE_EAS_ID = 0xA7U, /*!< Write EAS ID command */ RFAL_NFCV_CMD_WRITE_EAS_CONFIG = 0xA8U, /*!< Write EAS CONFIG command */ RFAL_NFCV_CMD_MANAGE_GPO = 0xA9U, /*!< Manage GPO command */ RFAL_NFCV_CMD_WRITE_MESSAGE = 0xAAU, /*!< Write Message command */ RFAL_NFCV_CMD_READ_MESSAGE_LENGTH = 0xABU, /*!< Read Message Length command */ RFAL_NFCV_CMD_READ_MESSAGE = 0xACU, /*!< Read Message command */ RFAL_NFCV_CMD_READ_DYN_CONFIGURATION = 0xADU, /*!< Read Dynamic Configuration command */ RFAL_NFCV_CMD_WRITE_DYN_CONFIGURATION = 0xAEU, /*!< Write Dynamic Configuration command */ RFAL_NFCV_CMD_WRITE_PASSWORD = 0xB1U, /*!< Write Kill Password / Write Password command */ RFAL_NFCV_CMD_LOCK_KILL = 0xB2U, /*!< Lock Kill command */ RFAL_NFCV_CMD_PRESENT_PASSWORD = 0xB3U, /*!< Present Password command */ RFAL_NFCV_CMD_GET_RANDOM_NUMBER = 0xB4U, /*!< Get Random Number command */ RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK = 0xC0U, /*!< Fast Read single block command */ RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS = 0xC3U, /*!< Fast Read multiple blocks command */ RFAL_NFCV_CMD_FAST_EXTENDED_READ_SINGLE_BLOCK = 0xC4U, /*!< Fast Extended Read single block command */ RFAL_NFCV_CMD_FAST_EXTENDED_READ_MULTIPLE_BLOCKS = 0xC5U, /*!< Fast Extended Read multiple blocks command */ RFAL_NFCV_CMD_FAST_WRITE_MESSAGE = 0xCAU, /*!< Fast Write Message */ RFAL_NFCV_CMD_FAST_READ_MESSAGE_LENGTH = 0xCBU, /*!< Fast Read Message Length */ RFAL_NFCV_CMD_FAST_READ_MESSAGE = 0xCCU, /*!< Fast Read Message */ RFAL_NFCV_CMD_FAST_READ_DYN_CONFIGURATION = 0xCDU, /*!< Fast Read Dynamic configuration */ RFAL_NFCV_CMD_FAST_WRITE_DYN_CONFIGURATION = 0xCEU /*!< Fast Write Dynamic Configuration */ }; /*! ISO 15693 Get System info parameter request field ISO15693 2018 Table 94 */ enum { RFAL_NFCV_SYSINFO_DFSID = 0x01U, /*!< Get System info DFSID flag */ RFAL_NFCV_SYSINFO_AFI = 0x02U, /*!< Get System info AFI flag */ RFAL_NFCV_SYSINFO_MEMSIZE = 0x04U, /*!< Get System info MEMSIZE flag */ RFAL_NFCV_SYSINFO_ICREF = 0x08U, /*!< Get System info ICREF flag */ RFAL_NFCV_SYSINFO_MOI = 0x10U, /*!< Get System info MOI flag */ RFAL_NFCV_SYSINFO_CMDLIST = 0x20U, /*!< Get System info CMDLIST flag */ RFAL_NFCV_SYSINFO_CSI = 0x40U, /*!< Get System info CSI flag */ RFAL_NFCV_SYSINFO_REQ_ALL = 0x7FU /*!< Get System info request of all parameters */ }; /* ****************************************************************************** * GLOBAL MACROS ****************************************************************************** */ /* ****************************************************************************** * GLOBAL TYPES ****************************************************************************** */ /*! NFC-V Number of slots Digital 2.0 9.6.1 */ typedef enum { RFAL_NFCV_NUM_SLOTS_1 = 0x20, /*!< Number of slots: 1 */ RFAL_NFCV_NUM_SLOTS_16 = 0x00, /*!< Number of slots: 16 */ } rfalNfcvNumSlots; /*! NFC-V INVENTORY_RES format Digital 2.0 9.6.2 */ typedef struct { uint8_t RES_FLAG; /*!< Response Flags */ uint8_t DSFID; /*!< Data Storage Format Identifier */ uint8_t UID[RFAL_NFCV_UID_LEN]; /*!< NFC-V device UID */ uint8_t crc[RFAL_CRC_LEN]; /*!< CRC */ } rfalNfcvInventoryRes; /*! NFC-V Generic Req format */ typedef struct { uint8_t REQ_FLAG; /*!< Request Flags */ uint8_t CMD; /*!< Command code */ union { /* PRQA S 0750 # MISRA 19.2 - Both members are of the same type, just different names. Thus no problem can occur. */ uint8_t UID[RFAL_NFCV_UID_LEN]; /*!< Mask Value */ uint8_t data[RFAL_NFCV_MAX_GEN_DATA_LEN]; /*!< Data */ } payload; /*!< Payload */ } rfalNfcvGenericReq; /*! NFC-V Generic Response format */ typedef struct { uint8_t RES_FLAG; /*!< Response Flags */ uint8_t data[RFAL_NFCV_MAX_GEN_DATA_LEN]; /*!< Data */ } rfalNfcvGenericRes; /*! NFC-V listener device (VICC) struct */ typedef struct { rfalNfcvInventoryRes InvRes; /*!< INVENTORY_RES */ bool isSleep; /*!< Device sleeping flag */ } rfalNfcvListenDevice; /* ****************************************************************************** * GLOBAL FUNCTION PROTOTYPES ****************************************************************************** */ /*! ***************************************************************************** * \brief Initialize NFC-V Poller mode * * This methods configures RFAL RF layer to perform as a * NFC-F Poller/RW (ISO15693) including all default timings * * \return ERR_WRONG_STATE : RFAL not initialized or mode not set * \return ERR_PARAM : Incorrect bitrate * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerInitialize(void); /*! ***************************************************************************** * \brief NFC-V Poller Check Presence * * This method checks if a NFC-V Listen device (VICC) is present on the field * by sending an Inventory (INVENTORY_REQ) * * \param[out] invRes : If received, the INVENTORY_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, no listener device detectedd * \return ERR_NONE : No error, one or more device in the field ***************************************************************************** */ ReturnCode rfalNfcvPollerCheckPresence(rfalNfcvInventoryRes* invRes); /*! ***************************************************************************** * \brief NFC-F Poller Poll * * This function sends to all VICCs in field the INVENTORY command with the * given number of slots * * If more than one slot is used the following EOF need to be handled * by the caller using rfalISO15693TransceiveEOFAnticollision() * * \param[in] nSlots : Number of Slots to be sent (1 or 16) * \param[in] maskLen : Number bits on the Mask value * \param[in] maskVal : location of the Mask value * \param[out] invRes : location to place the INVENTORY_RES * \param[out] rcvdLen : number of bits received (without collision) * * \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 * \return ERR_CRC : CRC error detected * \return ERR_PROTO : Protocol error detected * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerInventory( rfalNfcvNumSlots nSlots, uint8_t maskLen, const uint8_t* maskVal, rfalNfcvInventoryRes* invRes, uint16_t* rcvdLen); /*! ***************************************************************************** * \brief NFC-V Poller Full Collision Resolution * * Performs a full Collision resolution as defined in Activity 2.0 9.3.7 * Once done, the devCnt will indicate how many (if any) devices have * been identified and their details are contained on nfcvDevList * * \param[in] compMode : compliance mode to be performed * \param[in] devLimit : device limit value, and size nfcaDevList * \param[out] nfcvDevList : NFC-v listener devices list * \param[out] devCnt : Devices found counter * * When compMode is set to ISO the function immediately goes to 16 slots improving * chances to detect more than only one strong card. * * \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 rfalNfcvPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcvListenDevice* nfcvDevList, uint8_t* devCnt); /*! ***************************************************************************** * \brief NFC-V Poller Full Collision Resolution With Sleep * * Performs a full Collision resolution which is different from Activity 2.0 9.3.7. * The implementation uses SLPV (StayQuiet) command to make sure all cards are found. * Once done, the devCnt will indicate how many (if any) devices have * been identified and their details are contained on nfcvDevList * * \param[in] devLimit : device limit value, and size nfcaDevList * \param[out] nfcvDevList : NFC-v listener devices list * \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 rfalNfcvPollerSleepCollisionResolution( uint8_t devLimit, rfalNfcvListenDevice* nfcvDevList, uint8_t* devCnt); /*! ***************************************************************************** * \brief NFC-V Poller Sleep * * This function is used to send the SLPV_REQ (Stay Quiet) command to put the VICC * with the given UID to state QUIET so that they do not reply to more Inventory * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to Sleep * * \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 rfalNfcvPollerSleep(uint8_t flags, const uint8_t* uid); /*! ***************************************************************************** * \brief NFC-V Poller Select * * Selects a device (VICC) by its UID * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be Selected * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerSelect(uint8_t flags, const uint8_t* uid); /*! ***************************************************************************** * \brief NFC-V Poller Read Single Block * * Reads a Single Block from a device (VICC) * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] blockNum : Number of the block to read * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerReadSingleBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); /*! ***************************************************************************** * \brief NFC-V Poller Write Single Block * * Writes a Single Block from a device (VICC) * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be written * if UID is provided Addressed mode will be used * \param[in] blockNum : Number of the block to write * \param[in] wrData : data to be written on the given block * \param[in] blockLen : number of bytes of a block * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerWriteSingleBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum, const uint8_t* wrData, uint8_t blockLen); /*! ***************************************************************************** * \brief NFC-V Poller Read Multiple Blocks * * Reads Multiple Blocks from a device (VICC) * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] firstBlockNum : first block to be read * \param[in] numOfBlocks : number of block to read * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint8_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); /*! ***************************************************************************** * \brief NFC-V Poller Write Multiple Blocks * * Reads Multiple Blocks from a device (VICC) * In order to not limit the length of the Write multiple command, a buffer * must be provided where the request will be composed and then sent. * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] firstBlockNum : first block to be write * \param[in] numOfBlocks : number of consecutive blocks to write * \param[in] txBuf : buffer where the request will be composed * \param[in] txBufLen : length of txBuf * \param[in] blockLen : number of bytes of a block * \param[in] wrData : data to be written * \param[in] wrDataLen : length of the data do be written. Must be * aligned with number of blocks to write and * the size of a block * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerWriteMultipleBlocks( uint8_t flags, const uint8_t* uid, uint8_t firstBlockNum, uint8_t numOfBlocks, uint8_t* txBuf, uint16_t txBufLen, uint8_t blockLen, const uint8_t* wrData, uint16_t wrDataLen); /*! ***************************************************************************** * \brief NFC-V Poller Extended Lock Single Block * * Blocks a Single Block from a device (VICC) supporting extended commands * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device * if UID is provided Addressed mode will be used * \param[in] blockNum : Number of the block to be locked * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerLockBlock(uint8_t flags, const uint8_t* uid, uint8_t blockNum); /*! ***************************************************************************** * \brief NFC-V Poller Extended Lock Single Block * * Blocks a Single Block from a device (VICC) supporting extended commands * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device * if UID is provided Addressed mode will be used * \param[in] blockNum : Number of the block to be locked (16 bits) * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerExtendedLockSingleBlock(uint8_t flags, const uint8_t* uid, uint16_t blockNum); /*! ***************************************************************************** * \brief NFC-V Poller Extended Read Single Block * * Reads a Single Block from a device (VICC) supporting extended commands * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] blockNum : Number of the block to read (16 bits) * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerExtendedReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); /*! ***************************************************************************** * \brief NFC-V Poller Extended Write Single Block * * Writes a Single Block from a device (VICC) supporting extended commands * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device * if UID is provided Addressed mode will be used * \param[in] blockNum : Number of the block to write (16 bits) * \param[in] wrData : data to be written on the given block * \param[in] blockLen : number of bytes of a block * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerExtendedWriteSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, const uint8_t* wrData, uint8_t blockLen); /*! ***************************************************************************** * \brief NFC-V Poller Extended Read Multiple Blocks * * Reads Multiple Blocks from a device (VICC) supporting extended commands * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] firstBlockNum : first block to be read (16 bits) * \param[in] numOfBlocks : number of consecutive blocks to read (16 bits) * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerExtendedReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint16_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); /*! ***************************************************************************** * \brief NFC-V Poller Extended Write Multiple Blocks * * Writes Multiple Blocks from a device (VICC) supporting extended commands * In order to not limit the length of the Write multiple command, a buffer * must be provided where the request will be composed and then sent. * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] firstBlockNum : first block to be write (16 bits) * \param[in] numOfBlocks : number of consecutive blocks to write (16 bits) * \param[in] txBuf : buffer where the request will be composed * \param[in] txBufLen : length of txBuf * \param[in] blockLen : number of bytes of a block * \param[in] wrData : data to be written * \param[in] wrDataLen : length of the data do be written. Must be * aligned with number of blocks to write and * the size of a block * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerExtendedWriteMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint16_t numOfBlocks, uint8_t* txBuf, uint16_t txBufLen, uint8_t blockLen, const uint8_t* wrData, uint16_t wrDataLen); /*! ***************************************************************************** * \brief NFC-V Get System Information * * Sends Get System Information command * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerGetSystemInformation( uint8_t flags, const uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); /*! ***************************************************************************** * \brief NFC-V Extended Get System Information * * Sends Extended Get System Information command * * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] requestField : Get System info parameter request field * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerExtendedGetSystemInformation( uint8_t flags, const uint8_t* uid, uint8_t requestField, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); /*! ***************************************************************************** * \brief NFC-V Transceive Request * * Performs a generic transceive with an ISO15693 tag * * \param[in] cmd : NFC-V command * \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option * for NFC-Forum use: RFAL_NFCV_REQ_FLAG_DEFAULT * \param[in] param : Prepend parameter on certain proprietary requests * For default commands skip: RFAL_NFCV_PARAM_SKIP * \param[in] uid : UID of the device to be put to be read * if UID is provided Addressed mode will be used * \param[in] data : command parameters append after UID * \param[in] dataLen : command parameters Len * \param[out] rxBuf : buffer to store response (also with RES_FLAGS) * \param[in] rxBufLen : length of rxBuf * \param[out] rcvLen : number of bytes received * * \return ERR_WRONG_STATE : RFAL not initialized or incorrect mode * \return ERR_PARAM : Invalid parameters * \return ERR_IO : Generic internal error * \return ERR_CRC : CRC error detected * \return ERR_FRAMING : Framing error detected * \return ERR_PROTO : Protocol error detected * \return ERR_TIMEOUT : Timeout error * \return ERR_NONE : No error ***************************************************************************** */ ReturnCode rfalNfcvPollerTransceiveReq( uint8_t cmd, uint8_t flags, uint8_t param, const uint8_t* uid, const uint8_t* data, uint16_t dataLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* rcvLen); #endif /* RFAL_NFCV_H */ /** * @} * * @} * * @} */