 389ff92cc1
			
		
	
	
		389ff92cc1
		
			
		
	
	
	
	
		
			
			* Makefile, Scripts: new linter * About: remove ID from IC * Firmware: remove double define for DIVC/DIVR * Scripts: check folder names too. Docker: replace syntax check with make lint. * Reformat Sources and Migrate to new file naming convention * Docker: symlink clang-format-12 to clang-format * Add coding style guide
		
			
				
	
	
		
			819 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			819 lines
		
	
	
		
			24 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /******************************************************************************
 | |
|   * \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_st25xv.c
 | |
|  *
 | |
|  *  \author Gustavo Patricio
 | |
|  *
 | |
|  *  \brief NFC-V ST25 NFC-V Tag specific features
 | |
|  *
 | |
|  *  This module provides support for ST's specific features available on
 | |
|  *  NFC-V (ISO15693) tag families: ST25D, ST25TV, M24LR
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * INCLUDES
 | |
|  ******************************************************************************
 | |
|  */
 | |
| #include "rfal_st25xv.h"
 | |
| #include "rfal_nfcv.h"
 | |
| #include "utils.h"
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * ENABLE SWITCH
 | |
|  ******************************************************************************
 | |
|  */
 | |
| 
 | |
| #ifndef RFAL_FEATURE_ST25xV
 | |
| #define RFAL_FEATURE_ST25xV false /* ST25xV module configuration missing. Disabled by default */
 | |
| #endif
 | |
| 
 | |
| #if RFAL_FEATURE_ST25xV
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * GLOBAL DEFINES
 | |
|  ******************************************************************************
 | |
|  */
 | |
| 
 | |
| #define RFAL_ST25xV_READ_CONFIG_LEN \
 | |
|     2U /*!< READ CONFIGURATION length                                         */
 | |
| #define RFAL_ST25xV_READ_MSG_LEN_LEN \
 | |
|     2U /*!< READ MESSAGE LENGTH length                                        */
 | |
| #define RFAL_ST25xV_CONF_POINTER_LEN \
 | |
|     1U /*!< READ/WRITE CONFIGURATION Pointer length                           */
 | |
| #define RFAL_ST25xV_CONF_REGISTER_LEN \
 | |
|     1U /*!< READ/WRITE CONFIGURATION Register length                          */
 | |
| #define RFAL_ST25xV_PWDNUM_LEN \
 | |
|     1U /*!< Password Number length                                            */
 | |
| #define RFAL_ST25xV_PWD_LEN \
 | |
|     8U /*!< Password length                                                   */
 | |
| #define RFAL_ST25xV_MBPOINTER_LEN \
 | |
|     1U /*!< Read Message MBPointer length                                     */
 | |
| #define RFAL_ST25xV_NUMBYTES_LEN \
 | |
|     1U /*!< Read Message Number of Bytes length                               */
 | |
| 
 | |
| #define RFAL_ST25TV02K_TBOOT_RF \
 | |
|     1U /*!< RF Boot time (Minimum time from carrier generation to first data) */
 | |
| #define RFAL_ST25TV02K_TRF_OFF \
 | |
|     2U /*!< RF OFF time                                                       */
 | |
| 
 | |
| #define RFAL_ST25xV_FDT_POLL_MAX \
 | |
|     rfalConvMsTo1fc(20) /*!< Maximum Wait time FDTV,EOF 20 ms    Digital 2.1  B.5 */
 | |
| #define RFAL_NFCV_FLAG_POS \
 | |
|     0U /*!< Flag byte position                                                */
 | |
| #define RFAL_NFCV_FLAG_LEN \
 | |
|     1U /*!< Flag byte length                                                  */
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * LOCAL FUNCTION PROTOTYPES
 | |
| ******************************************************************************
 | |
| */
 | |
| 
 | |
| static ReturnCode rfalST25xVPollerGenericReadConfiguration(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t* regValue);
 | |
| static ReturnCode rfalST25xVPollerGenericWriteConfiguration(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t regValue);
 | |
| static ReturnCode rfalST25xVPollerGenericReadMessageLength(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t* msgLen);
 | |
| static ReturnCode rfalST25xVPollerGenericReadMessage(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t mbPointer,
 | |
|     uint8_t numBytes,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen);
 | |
| static ReturnCode rfalST25xVPollerGenericWriteMessage(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t msgLen,
 | |
|     const uint8_t* msgData,
 | |
|     uint8_t* txBuf,
 | |
|     uint16_t txBufLen);
 | |
| /*
 | |
| ******************************************************************************
 | |
| * LOCAL FUNCTIONS
 | |
| ******************************************************************************
 | |
| */
 | |
| 
 | |
| /*******************************************************************************/
 | |
| static ReturnCode rfalST25xVPollerGenericReadConfiguration(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t* regValue) {
 | |
|     ReturnCode ret;
 | |
|     uint8_t p;
 | |
|     uint16_t rcvLen;
 | |
|     rfalNfcvGenericRes res;
 | |
| 
 | |
|     if(regValue == NULL) {
 | |
|         return ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     p = pointer;
 | |
| 
 | |
|     ret = rfalNfcvPollerTransceiveReq(
 | |
|         cmd,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         &p,
 | |
|         sizeof(uint8_t),
 | |
|         (uint8_t*)&res,
 | |
|         sizeof(rfalNfcvGenericRes),
 | |
|         &rcvLen);
 | |
|     if(ret == ERR_NONE) {
 | |
|         if(rcvLen < RFAL_ST25xV_READ_CONFIG_LEN) {
 | |
|             ret = ERR_PROTO;
 | |
|         } else {
 | |
|             *regValue = res.data[0];
 | |
|         }
 | |
|     }
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| static ReturnCode rfalST25xVPollerGenericWriteConfiguration(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t regValue) {
 | |
|     uint8_t data[RFAL_ST25xV_CONF_POINTER_LEN + RFAL_ST25xV_CONF_REGISTER_LEN];
 | |
|     uint8_t dataLen;
 | |
|     uint16_t rcvLen;
 | |
|     rfalNfcvGenericRes res;
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     data[dataLen++] = pointer;
 | |
|     data[dataLen++] = regValue;
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         cmd,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         (uint8_t*)&res,
 | |
|         sizeof(rfalNfcvGenericRes),
 | |
|         &rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| static ReturnCode rfalST25xVPollerGenericReadMessageLength(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t* msgLen) {
 | |
|     ReturnCode ret;
 | |
|     uint16_t rcvLen;
 | |
|     rfalNfcvGenericRes res;
 | |
| 
 | |
|     if(msgLen == NULL) {
 | |
|         return ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     ret = rfalNfcvPollerTransceiveReq(
 | |
|         cmd,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         NULL,
 | |
|         0,
 | |
|         (uint8_t*)&res,
 | |
|         sizeof(rfalNfcvGenericRes),
 | |
|         &rcvLen);
 | |
|     if(ret == ERR_NONE) {
 | |
|         if(rcvLen < RFAL_ST25xV_READ_MSG_LEN_LEN) {
 | |
|             ret = ERR_PROTO;
 | |
|         } else {
 | |
|             *msgLen = res.data[0];
 | |
|         }
 | |
|     }
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| static ReturnCode rfalST25xVPollerGenericReadMessage(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t mbPointer,
 | |
|     uint8_t numBytes,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[RFAL_ST25xV_MBPOINTER_LEN + RFAL_ST25xV_NUMBYTES_LEN];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = mbPointer;
 | |
|     data[dataLen++] = numBytes;
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, data, dataLen, rxBuf, rxBufLen, rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| static ReturnCode rfalST25xVPollerGenericWriteMessage(
 | |
|     uint8_t cmd,
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t msgLen,
 | |
|     const uint8_t* msgData,
 | |
|     uint8_t* txBuf,
 | |
|     uint16_t txBufLen) {
 | |
|     ReturnCode ret;
 | |
|     uint8_t reqFlag;
 | |
|     uint16_t msgIt;
 | |
|     rfalBitRate rxBR;
 | |
|     bool fastMode;
 | |
|     rfalNfcvGenericRes res;
 | |
|     uint16_t rcvLen;
 | |
| 
 | |
|     /* Calculate required Tx buf length:                    Mfg Code               UID                      MSGLen  MSGLen+1 */
 | |
|     msgIt =
 | |
|         (uint16_t)(msgLen + sizeof(flags) + sizeof(cmd) + 1U + ((uid != NULL) ? RFAL_NFCV_UID_LEN : 0U) + 1U + 1U);
 | |
|     /* Note:  MSGlength parameter of the command is the number of Data bytes minus - 1 (00 for 1 byte of data, FFh for 256 bytes of data) */
 | |
| 
 | |
|     /* Check for valid parameters */
 | |
|     if((txBuf == NULL) || (msgData == NULL) || (txBufLen < msgIt)) {
 | |
|         return ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     msgIt = 0;
 | |
|     fastMode = false;
 | |
| 
 | |
|     /* Check if the command is an ST's Fast command */
 | |
|     if(cmd == (uint8_t)RFAL_NFCV_CMD_FAST_WRITE_MESSAGE) {
 | |
|         /* Store current Rx bit rate and move to fast mode */
 | |
|         rfalGetBitRate(NULL, &rxBR);
 | |
|         rfalSetBitRate(RFAL_BR_KEEP, RFAL_BR_52p97);
 | |
| 
 | |
|         fastMode = true;
 | |
|     }
 | |
| 
 | |
|     /* Compute Request Command */
 | |
|     reqFlag =
 | |
|         (uint8_t)(flags & (~((uint32_t)RFAL_NFCV_REQ_FLAG_ADDRESS) & ~((uint32_t)RFAL_NFCV_REQ_FLAG_SELECT)));
 | |
|     reqFlag |=
 | |
|         ((uid != NULL) ? (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS : (uint8_t)RFAL_NFCV_REQ_FLAG_SELECT);
 | |
| 
 | |
|     txBuf[msgIt++] = reqFlag;
 | |
|     txBuf[msgIt++] = cmd;
 | |
|     txBuf[msgIt++] = RFAL_NFCV_ST_IC_MFG_CODE;
 | |
| 
 | |
|     if(uid != NULL) {
 | |
|         ST_MEMCPY(&txBuf[msgIt], uid, RFAL_NFCV_UID_LEN);
 | |
|         msgIt += RFAL_NFCV_UID_LEN;
 | |
|     }
 | |
|     txBuf[msgIt++] = msgLen;
 | |
|     ST_MEMCPY(
 | |
|         &txBuf[msgIt],
 | |
|         msgData,
 | |
|         (uint16_t)(msgLen + (uint16_t)1U)); /* Message Data contains (MSGLength + 1) bytes */
 | |
|     msgIt += (uint16_t)(msgLen + (uint16_t)1U);
 | |
| 
 | |
|     /* Transceive Command */
 | |
|     ret = rfalTransceiveBlockingTxRx(
 | |
|         txBuf,
 | |
|         msgIt,
 | |
|         (uint8_t*)&res,
 | |
|         sizeof(rfalNfcvGenericRes),
 | |
|         &rcvLen,
 | |
|         RFAL_TXRX_FLAGS_DEFAULT,
 | |
|         RFAL_ST25xV_FDT_POLL_MAX);
 | |
| 
 | |
|     /* Restore Rx BitRate */
 | |
|     if(fastMode) {
 | |
|         rfalSetBitRate(RFAL_BR_KEEP, rxBR);
 | |
|     }
 | |
| 
 | |
|     if(ret != ERR_NONE) {
 | |
|         return ret;
 | |
|     }
 | |
| 
 | |
|     /* Check if the response minimum length has been received */
 | |
|     if(rcvLen < (uint8_t)RFAL_NFCV_FLAG_LEN) {
 | |
|         return ERR_PROTO;
 | |
|     }
 | |
| 
 | |
|     /* Check if an error has been signalled */
 | |
|     if((res.RES_FLAG & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U) {
 | |
|         return ERR_PROTO;
 | |
|     }
 | |
| 
 | |
|     return ERR_NONE;
 | |
| }
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * GLOBAL FUNCTIONS
 | |
| ******************************************************************************
 | |
| */
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerM24LRReadSingleBlock(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t blockNum,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[RFAL_NFCV_BLOCKNUM_M24LR_LEN];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
 | |
|     data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_READ_SINGLE_BLOCK,
 | |
|         (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
 | |
|         RFAL_NFCV_PARAM_SKIP,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerM24LRWriteSingleBlock(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t blockNum,
 | |
|     const uint8_t* wrData,
 | |
|     uint8_t blockLen) {
 | |
|     uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_MAX_BLOCK_LEN)];
 | |
|     uint8_t dataLen;
 | |
|     uint16_t rcvLen;
 | |
|     rfalNfcvGenericRes res;
 | |
| 
 | |
|     /* Check for valid parameters */
 | |
|     if((blockLen == 0U) || (blockLen > (uint8_t)RFAL_NFCV_MAX_BLOCK_LEN) || (wrData == NULL)) {
 | |
|         return ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
 | |
|     data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
 | |
|     ST_MEMCPY(&data[dataLen], wrData, blockLen); /* Append Block data to write       */
 | |
|     dataLen += blockLen;
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_WRITE_SINGLE_BLOCK,
 | |
|         (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
 | |
|         RFAL_NFCV_PARAM_SKIP,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         (uint8_t*)&res,
 | |
|         sizeof(rfalNfcvGenericRes),
 | |
|         &rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerM24LRReadMultipleBlocks(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t firstBlockNum,
 | |
|     uint8_t numOfBlocks,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_BLOCKNUM_M24LR_LEN)];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)firstBlockNum; /* Set M24LR Block Number (16 bits) LSB */
 | |
|     data[dataLen++] = (uint8_t)(firstBlockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
 | |
|     data[dataLen++] = numOfBlocks; /* Set number of blocks to read         */
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_READ_MULTIPLE_BLOCKS,
 | |
|         (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
 | |
|         RFAL_NFCV_PARAM_SKIP,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastReadSingleBlock(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t blockNum,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t bn;
 | |
| 
 | |
|     bn = blockNum;
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         &bn,
 | |
|         sizeof(uint8_t),
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerM24LRFastReadSingleBlock(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t blockNum,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[RFAL_NFCV_BLOCKNUM_M24LR_LEN];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)blockNum; /* Set M24LR Block Number (16 bits) LSB */
 | |
|     data[dataLen++] = (uint8_t)(blockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK,
 | |
|         (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerM24LRFastReadMultipleBlocks(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t firstBlockNum,
 | |
|     uint8_t numOfBlocks,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[(RFAL_NFCV_BLOCKNUM_M24LR_LEN + RFAL_NFCV_BLOCKNUM_M24LR_LEN)];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)firstBlockNum; /* Set M24LR Block Number (16 bits) LSB */
 | |
|     data[dataLen++] = (uint8_t)(firstBlockNum >> 8U); /* Set M24LR Block Number (16 bits) MSB */
 | |
|     data[dataLen++] = numOfBlocks; /* Set number of blocks to read         */
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS,
 | |
|         (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT),
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastReadMultipleBlocks(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t firstBlockNum,
 | |
|     uint8_t numOfBlocks,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[(RFAL_NFCV_BLOCKNUM_LEN + RFAL_NFCV_BLOCKNUM_LEN)];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = firstBlockNum; /* Set first Block Number       */
 | |
|     data[dataLen++] = numOfBlocks; /* Set number of blocks to read */
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastExtendedReadSingleBlock(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t blockNum,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[RFAL_NFCV_BLOCKNUM_EXTENDED_LEN];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)
 | |
|         blockNum; /* TS T5T 1.0 BNo is considered as a multi-byte field. TS T5T 1.0 5.1.1.13 multi-byte field follows [DIGITAL]. [DIGITAL] 9.3.1 A multiple byte field is transmitted LSB first. */
 | |
|     data[dataLen++] = (uint8_t)((blockNum >> 8U) & 0xFFU);
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_FAST_EXTENDED_READ_SINGLE_BLOCK,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastExtReadMultipleBlocks(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint16_t firstBlockNum,
 | |
|     uint16_t numOfBlocks,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     uint8_t data[(RFAL_NFCV_BLOCKNUM_EXTENDED_LEN + RFAL_NFCV_BLOCKNUM_EXTENDED_LEN)];
 | |
|     uint8_t dataLen;
 | |
| 
 | |
|     dataLen = 0U;
 | |
| 
 | |
|     /* Compute Request Data */
 | |
|     data[dataLen++] = (uint8_t)((firstBlockNum >> 0U) & 0xFFU);
 | |
|     data[dataLen++] = (uint8_t)((firstBlockNum >> 8U) & 0xFFU);
 | |
|     data[dataLen++] = (uint8_t)((numOfBlocks >> 0U) & 0xFFU);
 | |
|     data[dataLen++] = (uint8_t)((numOfBlocks >> 8U) & 0xFFU);
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_FAST_EXTENDED_READ_MULTIPLE_BLOCKS,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerReadConfiguration(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t* regValue) {
 | |
|     return rfalST25xVPollerGenericReadConfiguration(
 | |
|         RFAL_NFCV_CMD_READ_CONFIGURATION, flags, uid, pointer, regValue);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerWriteConfiguration(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t regValue) {
 | |
|     return rfalST25xVPollerGenericWriteConfiguration(
 | |
|         RFAL_NFCV_CMD_WRITE_CONFIGURATION, flags, uid, pointer, regValue);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerReadDynamicConfiguration(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t* regValue) {
 | |
|     return rfalST25xVPollerGenericReadConfiguration(
 | |
|         RFAL_NFCV_CMD_READ_DYN_CONFIGURATION, flags, uid, pointer, regValue);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerWriteDynamicConfiguration(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t regValue) {
 | |
|     return rfalST25xVPollerGenericWriteConfiguration(
 | |
|         RFAL_NFCV_CMD_WRITE_DYN_CONFIGURATION, flags, uid, pointer, regValue);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastReadDynamicConfiguration(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t* regValue) {
 | |
|     return rfalST25xVPollerGenericReadConfiguration(
 | |
|         RFAL_NFCV_CMD_FAST_READ_DYN_CONFIGURATION, flags, uid, pointer, regValue);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastWriteDynamicConfiguration(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pointer,
 | |
|     uint8_t regValue) {
 | |
|     return rfalST25xVPollerGenericWriteConfiguration(
 | |
|         RFAL_NFCV_CMD_FAST_WRITE_DYN_CONFIGURATION, flags, uid, pointer, regValue);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerPresentPassword(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t pwdNum,
 | |
|     const uint8_t* pwd,
 | |
|     uint8_t pwdLen) {
 | |
|     uint8_t data[RFAL_ST25xV_PWDNUM_LEN + RFAL_ST25xV_PWD_LEN];
 | |
|     uint8_t dataLen;
 | |
|     uint16_t rcvLen;
 | |
|     rfalNfcvGenericRes res;
 | |
| 
 | |
|     if((pwdLen > RFAL_ST25xV_PWD_LEN) || (pwd == NULL)) {
 | |
|         return ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     dataLen = 0U;
 | |
|     data[dataLen++] = pwdNum;
 | |
|     if(pwdLen > 0U) {
 | |
|         ST_MEMCPY(&data[dataLen], pwd, pwdLen);
 | |
|     }
 | |
|     dataLen += pwdLen;
 | |
| 
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_PRESENT_PASSWORD,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         data,
 | |
|         dataLen,
 | |
|         (uint8_t*)&res,
 | |
|         sizeof(rfalNfcvGenericRes),
 | |
|         &rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerGetRandomNumber(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     rfalFieldOff();
 | |
|     platformDelay(RFAL_ST25TV02K_TRF_OFF);
 | |
|     rfalNfcvPollerInitialize();
 | |
|     rfalFieldOnAndStartGT();
 | |
|     platformDelay(RFAL_ST25TV02K_TBOOT_RF);
 | |
|     return rfalNfcvPollerTransceiveReq(
 | |
|         RFAL_NFCV_CMD_GET_RANDOM_NUMBER,
 | |
|         flags,
 | |
|         RFAL_NFCV_ST_IC_MFG_CODE,
 | |
|         uid,
 | |
|         NULL,
 | |
|         0U,
 | |
|         rxBuf,
 | |
|         rxBufLen,
 | |
|         rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerWriteMessage(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t msgLen,
 | |
|     const uint8_t* msgData,
 | |
|     uint8_t* txBuf,
 | |
|     uint16_t txBufLen) {
 | |
|     return rfalST25xVPollerGenericWriteMessage(
 | |
|         RFAL_NFCV_CMD_WRITE_MESSAGE, flags, uid, msgLen, msgData, txBuf, txBufLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastWriteMessage(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t msgLen,
 | |
|     const uint8_t* msgData,
 | |
|     uint8_t* txBuf,
 | |
|     uint16_t txBufLen) {
 | |
|     return rfalST25xVPollerGenericWriteMessage(
 | |
|         RFAL_NFCV_CMD_FAST_WRITE_MESSAGE, flags, uid, msgLen, msgData, txBuf, txBufLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerReadMessageLength(uint8_t flags, const uint8_t* uid, uint8_t* msgLen) {
 | |
|     return rfalST25xVPollerGenericReadMessageLength(
 | |
|         RFAL_NFCV_CMD_READ_MESSAGE_LENGTH, flags, uid, msgLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastReadMsgLength(uint8_t flags, const uint8_t* uid, uint8_t* msgLen) {
 | |
|     return rfalST25xVPollerGenericReadMessageLength(
 | |
|         RFAL_NFCV_CMD_FAST_READ_MESSAGE_LENGTH, flags, uid, msgLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerReadMessage(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t mbPointer,
 | |
|     uint8_t numBytes,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     return rfalST25xVPollerGenericReadMessage(
 | |
|         RFAL_NFCV_CMD_READ_MESSAGE, flags, uid, mbPointer, numBytes, rxBuf, rxBufLen, rcvLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalST25xVPollerFastReadMessage(
 | |
|     uint8_t flags,
 | |
|     const uint8_t* uid,
 | |
|     uint8_t mbPointer,
 | |
|     uint8_t numBytes,
 | |
|     uint8_t* rxBuf,
 | |
|     uint16_t rxBufLen,
 | |
|     uint16_t* rcvLen) {
 | |
|     return rfalST25xVPollerGenericReadMessage(
 | |
|         RFAL_NFCV_CMD_FAST_READ_MESSAGE, flags, uid, mbPointer, numBytes, rxBuf, rxBufLen, rcvLen);
 | |
| }
 | |
| 
 | |
| #endif /* RFAL_FEATURE_ST25xV */
 |