Initial snapshot: Aliro applet, harness, Nucleo NFC10A1 reader port
Three components, all bench-validated to varying depths: - applet/: CSA Aliro v1.0 Java Card applet for J3R180. AUTH0 + AUTH1 expedited-standard flow end-to-end green via PC/SC bench reader (aliro-bench-test). Userland AES-256-GCM and HMAC-SHA-256 layered on top of J3R180's primitives because the card lacks both natively. P-256 curve params seeded explicitly per J3R180's quirk. - harness/: Python orchestrator (aliro-trustgen, aliro-personalize, aliro-bench-test) for trust-bundle generation, card personalization via PersonalizationApplet, and PC/SC AUTH0+AUTH1 transactions. 126 pytest cases passing. - reader/STM32CubeExpansion_ALIRO_V1_0_0/: ST X-CUBE-ALIRO V1.0.0 with our NFC10A1 port (NUCLEO-U545RE-Q + X-NUCLEO-NFC10A1, ST25R200 shared with NFC09A1). nfc10-only/ project, NFC10A1 BSP shim, ALIRO_TRUST_OVERRIDE include into vendor's provisioning.c, and an ALIRO_APDU_TRACE wrapper around demoTransceiveBlocking. Boots, detects the J3R180, completes SELECT + AUTH0; AUTH1 currently fails with RFAL ERR_PROTO (0xB) — under investigation, see docs/plans/2026-04-20-nucleo-nfc10a1-port.md and bench-notes/. Excluded: x-cube-aliro.zip vendor archive, harness/.venv, build dirs, generated aliro_trust.h (contains private reader scalar), all PEMs. Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -0,0 +1,411 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_AnalogConfig.h
|
||||
* @brief : RF Chip Analog Configuration Settings
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_ANALOG_CONFIG_H
|
||||
#define RFAL_ANALOG_CONFIG_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_ANALOG_CONFIG_TBL_SIZE
|
||||
#define RFAL_ANALOG_CONFIG_TBL_SIZE (1024U) /*!< Maximum number of Register-Mask-Value in the Setting List */
|
||||
#endif /* RFAL_ANALOG_CONFIG_TBL_SIZE */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_LUT_SIZE (87U) /*!< Maximum number of Configuration IDs in the Loop Up Table */
|
||||
#define RFAL_ANALOG_CONFIG_LUT_NOT_FOUND (0xFFU) /*!< Index value indicating no Configuration IDs found */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* The Analog Configuration is structured as following
|
||||
* +---------+-----------------------+-----------------------------+
|
||||
* | ModeID | Num RVM configuration | RVM (Register, Value, Mask) |
|
||||
* | (16bit) | (8bit) | (24bit) |
|
||||
* +---------+-----------------------+-----------------------------+
|
||||
*
|
||||
* The Mode ID coding for different use cases is described below
|
||||
*
|
||||
* 1. ModeID coding for NFC technologies (not chip specific)
|
||||
* +----------------------------------------------------------------------+
|
||||
* | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||
* +----------------------------------------------------------------------+
|
||||
* | P/L | TECH != CHIP | BR | DIR |
|
||||
* +----------------------------------------------------------------------+
|
||||
*
|
||||
* 2. ModeID coding for chip specific modes and events
|
||||
* +----------------------------------------------------------------------+
|
||||
* | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||
* +----------------------------------------------------------------------+
|
||||
* | P/L | TECH == CHIP | CHIP_SPECIFIC |
|
||||
* +----------------------------------------------------------------------+
|
||||
*
|
||||
* 3. Special ModeID coding for Direction == DPO
|
||||
* +----------------------------------------------------------------------+
|
||||
* | 15 | 14 | 13 | 12 | 11 | 10 | 9 | 8 | 7 | 6 | 5 | 4 | 3 | 2 | 1 | 0 |
|
||||
* +----------------------------------------------------------------------+
|
||||
* | P/L | DPO_LVL | TECH* | BR | DIR == DPO |
|
||||
* +----------------------------------------------------------------------+
|
||||
* ^
|
||||
* |
|
||||
* +----- reuse of TECH_RFU bits as DPO level indicator
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Mask bit */
|
||||
#define RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK (0x8000U) /*!< Mask bit of Poll Mode in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_MASK (0x7F00U) /*!< Mask bits for Technology in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_MASK (0x00F0U) /*!< Mask bits for Bit rate in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_MASK (0x000FU) /*!< Mask bits for Direction in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_SPECIFIC_MASK (0x00FFU) /*!< Mask bits for Chip Specific Technology */
|
||||
|
||||
/* Shift values */
|
||||
#define RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_SHIFT (15U) /*!< Shift value of Poll Mode in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_SHIFT (8U) /*!< Shift value for Technology in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_SHIFT (4U) /*!< Shift value for Technology in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_SHIFT (0U) /*!< Shift value for Direction in Analog Configuration ID */
|
||||
|
||||
/* P/L: bit 15 */
|
||||
#define RFAL_ANALOG_CONFIG_POLL (0x0000U) /*!< Poll Mode bit setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_LISTEN (0x8000U) /*!< Listen Mode bit setting in Analog Configuration ID */
|
||||
|
||||
/* TECH: bit 14-8 */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_CHIP (0x0000U) /*!< Chip-Specific bit setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_NFCA (0x0100U) /*!< NFC-A Technology bits setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_NFCB (0x0200U) /*!< NFC-B Technology bits setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_NFCF (0x0400U) /*!< NFC-F Technology bits setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_AP2P (0x0800U) /*!< AP2P Technology bits setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_NFCV (0x1000U) /*!< NFC-V Technology bits setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_RFU (0x2000U) /*!< RFU for Technology bits */
|
||||
#define RFAL_ANALOG_CONFIG_TECH_RFU2 (0x4000U) /*!< RFU for Technology bits */
|
||||
|
||||
/* BR: bit 7-4 */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_COMMON (0x0000U) /*!< Common settings for all bit rates in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_106 (0x0010U) /*!< 106kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_212 (0x0020U) /*!< 212kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_424 (0x0030U) /*!< 424kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_848 (0x0040U) /*!< 848kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_1695 (0x0050U) /*!< 1695kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_3390 (0x0060U) /*!< 3390kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_6780 (0x0070U) /*!< 6780kbits/s settings in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_211p88 (0x0090U) /*!< 211.88kbits/s (ISO15693 x8) in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_105p94 (0x00A0U) /*!< 105.94kbits/s (ISO15693 x4) in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_53 (0x00B0U) /*!< 53kbits/s (ISO15693 x2) setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_26 (0x00C0U) /*!< 26kbit/s (1 out of 4) NFC-V setting Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_1p6 (0x00D0U) /*!< 1.6kbit/s (1 out of 256) NFC-V setting Analog Config ID */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_RFU (0x00E0U) /*!< RFU for Bitrate bits */
|
||||
#define RFAL_ANALOG_CONFIG_BITRATE_RFU2 (0x00F0U) /*!< RFU for Bitrate bits */
|
||||
|
||||
/* DIR: bit 3-0 */
|
||||
#define RFAL_ANALOG_CONFIG_NO_DIRECTION (0x0000U) /*!< No direction setting in Analog Conf ID (Chip Specific only) */
|
||||
#define RFAL_ANALOG_CONFIG_TX (0x0001U) /*!< Transmission bit setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_RX (0x0002U) /*!< Reception bit setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_ANTICOL (0x0003U) /*!< Anticollision setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_DPO (0x0004U) /*!< DPO setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_DLMA (0x0005U) /*!< DLMA setting in Analog Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU2 (0x0006U) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU3 (0x0007U) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU4 (0x0008U) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU5 (0x0009U) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU6 (0x000AU) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU7 (0x000BU) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU8 (0x000CU) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU9 (0x000DU) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU10 (0x000EU) /*!< RFU for Direction bits */
|
||||
#define RFAL_ANALOG_CONFIG_DIRECTION_RFU11 (0x000FU) /*!< RFU for Direction bits */
|
||||
|
||||
/* bit 7-0 */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_INIT (0x0000U) /*!< Chip-Specific event: Startup;Reset;Initialize */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_DEINIT (0x0001U) /*!< Chip-Specific event: Deinitialize */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_FIELD_ON (0x0002U) /*!< Chip-Specific event: Field On */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_FIELD_OFF (0x0003U) /*!< Chip-Specific event: Field Off */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_WAKEUP_ON (0x0004U) /*!< Chip-Specific event: Wake-up On */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_WAKEUP_OFF (0x0005U) /*!< Chip-Specific event: Wake-up Off */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_LISTEN_ON (0x0006U) /*!< Chip-Specific event: Listen On */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_LISTEN_OFF (0x0007U) /*!< Chip-Specific event: Listen Off */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POLL_COMMON (0x0008U) /*!< Chip-Specific event: Poll common */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_LISTEN_COMMON (0x0009U) /*!< Chip-Specific event: Listen common */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_LOWPOWER_ON (0x000AU) /*!< Chip-Specific event: Low Power On */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_LOWPOWER_OFF (0x000BU) /*!< Chip-Specific event: Low Power Off */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_00 (0x0010U) /*!< Chip-Specific event: Power Level 00 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_01 (0x0011U) /*!< Chip-Specific event: Power Level 01 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_02 (0x0012U) /*!< Chip-Specific event: Power Level 02 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_03 (0x0013U) /*!< Chip-Specific event: Power Level 03 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_04 (0x0014U) /*!< Chip-Specific event: Power Level 04 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_05 (0x0015U) /*!< Chip-Specific event: Power Level 05 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_06 (0x0016U) /*!< Chip-Specific event: Power Level 06 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_07 (0x0017U) /*!< Chip-Specific event: Power Level 07 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_08 (0x0018U) /*!< Chip-Specific event: Power Level 08 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_09 (0x0019U) /*!< Chip-Specific event: Power Level 09 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_10 (0x001AU) /*!< Chip-Specific event: Power Level 10 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_11 (0x001BU) /*!< Chip-Specific event: Power Level 11 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_12 (0x001CU) /*!< Chip-Specific event: Power Level 12 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_13 (0x001DU) /*!< Chip-Specific event: Power Level 13 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_14 (0x001EU) /*!< Chip-Specific event: Power Level 14 (e.g DPO, WLC) */
|
||||
#define RFAL_ANALOG_CONFIG_CHIP_POWER_LVL_15 (0x001FU) /*!< Chip-Specific event: Power Level 15 (e.g DPO, WLC) */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_UPDATE_LAST (0x00U) /*!< Value indicating Last configuration set during update */
|
||||
#define RFAL_ANALOG_CONFIG_UPDATE_MORE (0x01U) /*!< Value indicating More configuration set coming during update */
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_ID_GET_POLL_LISTEN(id) (RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK & (id)) /*!< Check if id indicates Listen mode */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_ID_GET_TECH(id) (RFAL_ANALOG_CONFIG_TECH_MASK & (id)) /*!< Get the technology of Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_CHIP(id) (RFAL_ANALOG_CONFIG_TECH_MASK & (id)) /*!< Check if ID indicates Chip-specific */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_NFCA(id) (RFAL_ANALOG_CONFIG_TECH_NFCA & (id)) /*!< Check if ID indicates NFC-A */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_NFCB(id) (RFAL_ANALOG_CONFIG_TECH_NFCB & (id)) /*!< Check if ID indicates NFC-B */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_NFCF(id) (RFAL_ANALOG_CONFIG_TECH_NFCF & (id)) /*!< Check if ID indicates NFC-F */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_AP2P(id) (RFAL_ANALOG_CONFIG_TECH_AP2P & (id)) /*!< Check if ID indicates AP2P */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_NFCV(id) (RFAL_ANALOG_CONFIG_TECH_NFCV & (id)) /*!< Check if ID indicates NFC-V */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_ID_GET_BITRATE(id) (RFAL_ANALOG_CONFIG_BITRATE_MASK & (id)) /*!< Get Bitrate of Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_COMMON(id) (RFAL_ANALOG_CONFIG_BITRATE_MASK & (id)) /*!< Check if ID indicates common bitrate */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_106(id) (RFAL_ANALOG_CONFIG_BITRATE_106 & (id)) /*!< Check if ID indicates 106kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_212(id) (RFAL_ANALOG_CONFIG_BITRATE_212 & (id)) /*!< Check if ID indicates 212kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_424(id) (RFAL_ANALOG_CONFIG_BITRATE_424 & (id)) /*!< Check if ID indicates 424kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_848(id) (RFAL_ANALOG_CONFIG_BITRATE_848 & (id)) /*!< Check if ID indicates 848kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_1695(id) (RFAL_ANALOG_CONFIG_BITRATE_1695 & (id)) /*!< Check if ID indicates 1695kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_3390(id) (RFAL_ANALOG_CONFIG_BITRATE_3390 & (id)) /*!< Check if ID indicates 3390kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_6780(id) (RFAL_ANALOG_CONFIG_BITRATE_6780 & (id)) /*!< Check if ID indicates 6780kbits/s */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_26(id) (RFAL_ANALOG_CONFIG_BITRATE_26 & (id)) /*!< Check if ID indicates 1 out of 4 bitrate */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_1p6(id) (RFAL_ANALOG_CONFIG_BITRATE_1p6 & (id)) /*!< Check if ID indicates 1 out of 256 bitrate */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(id) (RFAL_ANALOG_CONFIG_DIRECTION_MASK & (id)) /*!< Get Direction of Configuration ID */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_TX(id) (RFAL_ANALOG_CONFIG_TX & (id)) /*!< Check if id indicates TX */
|
||||
#define RFAL_ANALOG_CONFIG_ID_IS_RX(id) (RFAL_ANALOG_CONFIG_RX & (id)) /*!< Check if id indicates RX */
|
||||
|
||||
#define RFAL_ANALOG_CONFIG_CONFIG_NUM(x) (sizeof(x)/sizeof((x)[0])) /*!< Get Analog Config number */
|
||||
|
||||
/*! Set Analog Config ID value by: Mode, Technology, Bitrate and Direction */
|
||||
#define RFAL_ANALOG_CONFIG_ID_SET(mode, tech, br, direction) \
|
||||
( RFAL_ANALOG_CONFIG_ID_GET_POLL_LISTEN(mode) \
|
||||
| RFAL_ANALOG_CONFIG_ID_GET_TECH(tech) \
|
||||
| RFAL_ANALOG_CONFIG_ID_GET_BITRATE(br) \
|
||||
| RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(direction) \
|
||||
)
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DATA TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
typedef uint8_t rfalAnalogConfigMode; /*!< Polling or Listening Mode of Configuration */
|
||||
typedef uint8_t rfalAnalogConfigTech; /*!< Technology of Configuration */
|
||||
typedef uint8_t rfalAnalogConfigBitrate; /*!< Bitrate of Configuration */
|
||||
typedef uint8_t rfalAnalogConfigDirection; /*!< Transmit/Receive direction of Configuration */
|
||||
|
||||
typedef uint8_t rfalAnalogConfigRegAddr[2]; /*!< Register Address to ST Chip */
|
||||
typedef uint8_t rfalAnalogConfigRegMask; /*!< Register Mask Value */
|
||||
typedef uint8_t rfalAnalogConfigRegVal; /*!< Register Value */
|
||||
|
||||
typedef uint16_t rfalAnalogConfigId; /*!< Analog Configuration ID */
|
||||
typedef uint16_t rfalAnalogConfigOffset; /*!< Analog Configuration offset address in the table */
|
||||
typedef uint8_t rfalAnalogConfigNum; /*!< Number of Analog settings for the respective Configuration ID */
|
||||
|
||||
|
||||
/*! Struct that contain the Register-Mask-Value set. Make sure that the whole structure size is even and unaligned! */
|
||||
typedef struct {
|
||||
rfalAnalogConfigRegAddr addr; /*!< Register Address */
|
||||
rfalAnalogConfigRegMask mask; /*!< Register Mask Value */
|
||||
rfalAnalogConfigRegVal val; /*!< Register Value */
|
||||
} rfalAnalogConfigRegAddrMaskVal;
|
||||
|
||||
|
||||
/*! Struct that represents the Analog Configs */
|
||||
typedef struct {
|
||||
uint8_t id[sizeof(rfalAnalogConfigId)]; /*!< Configuration ID */
|
||||
rfalAnalogConfigNum num; /*!< Number of Config Sets to follow */
|
||||
rfalAnalogConfigRegAddrMaskVal regSet[]; /*!< Register-Mask-Value sets */ /* PRQA S 1060 # MISRA 18.7 - Flexible Array Members are the only meaningful way of denoting a variable length input buffer which follows a fixed header structure. */
|
||||
} rfalAnalogConfig;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize the Analog Configuration
|
||||
*
|
||||
* Reset the Analog Configuration LUT pointer to reference to default settings.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalAnalogConfigInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Indicate if the current Analog Configuration Table is complete and ready to be used.
|
||||
*
|
||||
* \return true if current Analog Configuration Table is complete and ready to be used.
|
||||
* \return false if current Analog Configuration Table is incomplete
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
bool rfalAnalogConfigIsReady( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Write the whole Analog Configuration table in raw format
|
||||
*
|
||||
* Writes the Analog Configuration and Look Up Table with the given raw table
|
||||
*
|
||||
* NOTE: Function does not check the validity of the given Table contents
|
||||
*
|
||||
* \param[in] configTbl : location of config Table to be loaded
|
||||
* \param[in] configTblSize : size of the config Table to be loaded
|
||||
*
|
||||
* \return RFAL_ERR_NONE : if setting is updated
|
||||
* \return RFAL_ERR_PARAM : if configTbl is invalid
|
||||
* \return RFAL_ERR_NOMEM : if the given Table is bigger exceeds the max size
|
||||
* \return RFAL_ERR_REQUEST : if the update Configuration Id is disabled
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalAnalogConfigListWriteRaw( const uint8_t *configTbl, uint16_t configTblSize );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Write the Analog Configuration table with new analog settings.
|
||||
*
|
||||
* Writes the Analog Configuration and Look Up Table with the new list of register-mask-value
|
||||
* and Configuration ID respectively.
|
||||
*
|
||||
* NOTE: Function does not check for the validity of the Register Address.
|
||||
*
|
||||
* \param[in] more : 0x00 indicates it is last Configuration ID settings;
|
||||
* 0x01 indicates more Configuration ID setting(s) are coming.
|
||||
* \param[in] *config : reference to the configuration list of current Configuraiton ID.
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : if Configuration ID or parameter is invalid
|
||||
* \return RFAL_ERR_NOMEM : if LUT is full
|
||||
* \return RFAL_ERR_REQUEST : if the update Configuration Id is disabled
|
||||
* \return RFAL_ERR_NONE : if setting is updated
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalAnalogConfigListWrite( uint8_t more, const rfalAnalogConfig *config );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Read the whole Analog Configuration table in raw format
|
||||
*
|
||||
* Reads the whole Analog Configuration Table in raw format
|
||||
*
|
||||
* \param[out] tblBuf : location to the buffer to place the Config Table
|
||||
* \param[in] tblBufLen : length of the buffer to place the Config Table
|
||||
* \param[out] configTblSize : Config Table size
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : if configTbl or configTblSize is invalid
|
||||
* \return RFAL_ERR_NOMEM : if configTblSize is not enough for the whole table
|
||||
* \return RFAL_ERR_NONE : if read is successful
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalAnalogConfigListReadRaw( uint8_t *tblBuf, uint16_t tblBufLen, uint16_t *configTblSize );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Read the Analog Configuration table.
|
||||
*
|
||||
* Read the Analog Configuration Table
|
||||
*
|
||||
* \param[in] configOffset : offset to the next Configuration ID in the List Table to be read.
|
||||
* \param[out] more : 0x00 indicates it is last Configuration ID settings;
|
||||
* 0x01 indicates more Configuration ID setting(s) are coming.
|
||||
* \param[out] config : configuration id, number of configuration sets and register-mask-value sets
|
||||
* \param[in] numConfig : the remaining configuration settings space available;
|
||||
*
|
||||
* \return RFAL_ERR_NOMEM : if number of Configuration for respective Configuration ID is greater the the remaining configuration setting space available
|
||||
* \return RFAL_ERR_NONE : if read is successful
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalAnalogConfigListRead( rfalAnalogConfigOffset *configOffset, uint8_t *more, rfalAnalogConfig *config, rfalAnalogConfigNum numConfig );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set the Analog settings of indicated Configuration ID.
|
||||
*
|
||||
* Update the chip with indicated analog settings of indicated Configuration ID.
|
||||
*
|
||||
* \param[in] configId : configuration ID
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : if Configuration ID is invalid
|
||||
* \return RFAL_ERR_INTERNAL : if error updating setting to chip
|
||||
* \return RFAL_ERR_NONE : if new settings is applied to chip
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSetAnalogConfig( rfalAnalogConfigId configId );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Generates Analog Config mode ID
|
||||
*
|
||||
* Converts RFAL mode and bitrate into Analog Config Mode ID.
|
||||
*
|
||||
* Update the chip with indicated analog settings of indicated Configuration ID.
|
||||
*
|
||||
* \param[in] md : RFAL mode format
|
||||
* \param[in] br : RFAL bit rate format
|
||||
* \param[in] dir : Analog Config communication direction
|
||||
*
|
||||
* \return Analog Config Mode ID
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
uint16_t rfalAnalogConfigGenModeID( rfalMode md, rfalBitRate br, uint16_t dir );
|
||||
|
||||
|
||||
#endif /* RFAL_ANALOG_CONFIG_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,154 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_cd.h
|
||||
* @brief : Implementation of a Card Detection Algorithm
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_CD_H
|
||||
#define RFAL_CD_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Card Detection NFC technology type */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_CD_TECH_NONE = 0x00, /*!< No NFC Technology */
|
||||
RFAL_CD_TECH_NFCA = 0x01, /*!< NFC Technology NFCB */
|
||||
RFAL_CD_TECH_NFCB = 0x02, /*!< NFC Technology NFCB */
|
||||
RFAL_CD_TECH_NFCF = 0x04, /*!< NFC Technology NFCF */
|
||||
RFAL_CD_TECH_NFCV = 0x08, /*!< NFC Technology NFCV */
|
||||
RFAL_CD_TECH_OTHER = 0x10 /*!< NFC Technology OTHER */
|
||||
}rfalCdTech;
|
||||
|
||||
|
||||
/*! Card Detection result|outcome type */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_CD_NOT_FOUND = 0, /*<! No NFC device found */
|
||||
RFAL_CD_SINGLE_DEV = 1, /*<! An NFC card was found */
|
||||
RFAL_CD_MULTIPLE_DEV = 2, /*<! Multiple NFC devices found */
|
||||
RFAL_CD_MULTIPLE_TECH = 3, /*<! Multiple NFC technologies observed in a single RF carrier */
|
||||
RFAL_CD_CARD_TECH = 4, /*<! A card-exclusive NFC technology found */
|
||||
RFAL_CD_SINGLE_MULTI_TECH = 5, /*<! A single NFC device which supports multiple technologies found */
|
||||
RFAL_CD_SINGLE_P2P = 6, /*<! A single NFC device which supports NFC-DEP|P2P found */
|
||||
RFAL_CD_SINGLE_HB = 7, /*<! A single NFC device where heartbeat was detected */
|
||||
RFAL_CD_UNKOWN = 8 /*<! Unable to complete the Card Detection due to unknow|unexpected event */
|
||||
}
|
||||
rfalCdDetType;
|
||||
|
||||
|
||||
/*! Card Detection result|outcome */
|
||||
typedef struct
|
||||
{
|
||||
bool detected; /*!< Card detected flag */
|
||||
rfalCdDetType detType; /*!< Card detection type */
|
||||
}
|
||||
rfalCdRes;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Detect Card
|
||||
*
|
||||
* This function checks if a passive NFC card is present in the vicinity
|
||||
*
|
||||
* \param[out] result : Pointer to detection result|outcome
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_NONE : Detection excuted with no error
|
||||
* \return RFAL_ERR_RF_COLLISION : RF carrier collision detected
|
||||
* \return RFAL_ERR_XXXX : Error occurred
|
||||
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalCdDetectCard( rfalCdRes *result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Start Card Detection
|
||||
*
|
||||
* This function starts the detection for a passive NFC card is present
|
||||
* in the vicinity
|
||||
*
|
||||
* \param[out] result : Pointer to detection result|outcome
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_NONE : Detection will be executed
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalCdStartDetectCard( rfalCdRes *result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get Card Detection Status
|
||||
*
|
||||
* This function gets the status of the card detection
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_NONE : Detection excuted with no error
|
||||
* \return RFAL_ERR_RF_COLLISION : RF carrier collision detected
|
||||
* \return RFAL_ERR_XXXX : Error occurred
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalCdGetDetectCardStatus( void );
|
||||
|
||||
|
||||
#endif /* RFAL_CD_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,413 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_chip.h
|
||||
* @brief : RF Chip specific Layer
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_CHIP_H
|
||||
#define RFAL_CHIP_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
|
||||
/*****************************************************************************
|
||||
* RF Chip *
|
||||
*****************************************************************************/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Writes a register on the RF Chip
|
||||
*
|
||||
* Checks if the given register is valid and if so, writes the value(s)
|
||||
* on the RF Chip register
|
||||
*
|
||||
* \param[in] reg : register address to be written, or the first if len > 1
|
||||
* \param[in] values : pointer with content to be written on the register(s)
|
||||
* \param[in] len : number of consecutive registers to be written
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid register or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : Write done with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipWriteReg( uint16_t reg, const uint8_t* values, uint8_t len );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Reads a register on the RF Chip
|
||||
*
|
||||
* Checks if the given register is valid and if so, reads the value(s)
|
||||
* of the RF Chip register(s)
|
||||
*
|
||||
* \param[in] reg : register address to be read, or the first if len > 1
|
||||
* \param[out] values : pointer where the register(s) read content will be placed
|
||||
* \param[in] len : number of consecutive registers to be read
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid register or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : Read done with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipReadReg( uint16_t reg, uint8_t* values, uint8_t len );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Change a register on the RF Chip
|
||||
*
|
||||
* Change the value of the register bits on the RF Chip Test set in the valueMask.
|
||||
*
|
||||
* \param[in] reg : register address to be modified
|
||||
* \param[in] valueMask : mask value of the register bits to be changed
|
||||
* \param[in] value : register value to be set
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid register or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_OK : Change done with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipChangeRegBits( uint16_t reg, uint8_t valueMask, uint8_t value );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Writes a Test register on the RF Chip
|
||||
*
|
||||
* Writes the value on the RF Chip Test register
|
||||
*
|
||||
* \param[in] reg : register address to be written
|
||||
* \param[in] value : value to be written on the register
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid register or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : Write done with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipWriteTestReg( uint16_t reg, uint8_t value );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Reads a Test register on the RF Chip
|
||||
*
|
||||
* Reads the value of the RF Chip Test register
|
||||
*
|
||||
* \param[in] reg : register address to be read
|
||||
* \param[out] value : pointer where the register content will be placed
|
||||
*
|
||||
* \return RFAL_ERR_PARAM :Invalid register or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : Read done with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipReadTestReg( uint16_t reg, uint8_t* value );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Change a Test register on the RF Chip
|
||||
*
|
||||
* Change the value of the register bits on the RF Chip Test set in the valueMask.
|
||||
*
|
||||
* \param[in] reg : test register address to be modified
|
||||
* \param[in] valueMask : mask value of the register bits to be changed
|
||||
* \param[in] value : register value to be set
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid register or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_OK : Change done with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipChangeTestRegBits( uint16_t reg, uint8_t valueMask, uint8_t value );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Execute command on the RF Chip
|
||||
*
|
||||
* Checks if the given command is valid and if so, executes it on
|
||||
* the RF Chip
|
||||
*
|
||||
* \param[in] cmd : direct command to be executed
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid command or bad request
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : Direct command executed with no error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipExecCmd( uint16_t cmd );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set RFO
|
||||
*
|
||||
* Sets the RFO driver resistance value used when the
|
||||
* field is on (unmodulated/active)
|
||||
*
|
||||
* \param[in] rfo : the RFO value to be used
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipSetRFO( uint8_t rfo );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get RFO
|
||||
*
|
||||
* Gets the RFO driver resistance value used when the
|
||||
* field is on (unmodulated/active)
|
||||
*
|
||||
* \param[out] result : the current RFO value
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipGetRFO( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get LM Field Indicator
|
||||
*
|
||||
* Gets an indicator of the signal on RFI while in Passive Listen Mode
|
||||
*
|
||||
* \param[out] result : the current RFI value
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipGetLmFieldInd( uint8_t* result );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set Listen Mode Modulation
|
||||
*
|
||||
* Sets the modulation (modulated and unmodulated state) when Passive Listen
|
||||
* Mode is used
|
||||
*
|
||||
* \param[in] mod : modulation to be used in modulated state
|
||||
* \param[in] unmod : modulation to be used in unmodulated state
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipSetLMMod( uint8_t mod, uint8_t unmod );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get Listen Mode Modulation
|
||||
*
|
||||
* Gets the modulation (modulated and unmodulated state) when Passive Listen
|
||||
* Mode is used
|
||||
*
|
||||
* \param[out] mod : modulation set in modulated state
|
||||
* \param[out] unmod : modulation set in unmodulated state
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipGetLMMod( uint8_t* mod, uint8_t* unmod );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure Amplitude
|
||||
*
|
||||
* Measures the RF Amplitude
|
||||
*
|
||||
* \param[out] result : result of RF measurement
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureAmplitude( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure Phase
|
||||
*
|
||||
* Measures the Phase
|
||||
*
|
||||
* \param[out] result : result of Phase measurement
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasurePhase( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure Capacitance
|
||||
*
|
||||
* Measures the Capacitance
|
||||
*
|
||||
* \param[out] result : result of Capacitance measurement
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureCapacitance( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure Power Supply
|
||||
*
|
||||
* Measures the Power Supply
|
||||
*
|
||||
* \param[in] param : measurement parameter (chip specific)
|
||||
* \param[out] result : result of the measurement
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasurePowerSupply( uint8_t param, uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure I and Q
|
||||
*
|
||||
* Measures I and Q channels
|
||||
*
|
||||
* \param[out] resI : 8 bit long result of the I channel (signed)
|
||||
* \param[out] resQ : 8 bit long result of the Q channel (signed)
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureIQ( int8_t* resI, int8_t* resQ );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure combined I and Q
|
||||
*
|
||||
* Measures I and Q channels and combines them
|
||||
*
|
||||
* \param[out] result : I and Q combined
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureCombinedIQ( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure I channel
|
||||
*
|
||||
* Measures I channel
|
||||
*
|
||||
* \param[out] result : I channel
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureI( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure Q channel
|
||||
*
|
||||
* Measures Q channel
|
||||
*
|
||||
* \param[out] result : Q channel
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureQ( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Measure Current
|
||||
*
|
||||
* Measures the electrical current
|
||||
*
|
||||
* \param[out] result : current
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipMeasureCurrent( uint8_t* result );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set Antenna mode
|
||||
*
|
||||
* Sets the antenna mode.
|
||||
* Differential or single ended antenna mode (RFO1 or RFO2)
|
||||
*
|
||||
* \param[in] single : FALSE differential ; single ended mode
|
||||
* \param[in] rfiox : FALSE RFI1/RFO1 ; TRUE RFI2/RFO2
|
||||
*
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
* \return RFAL_ERR_NOTSUPP : Feature not supported
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalChipSetAntennaMode( bool single, bool rfiox );
|
||||
|
||||
#endif /* RFAL_CHIP_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,311 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_defConfig.h
|
||||
* @brief : RF Abstraction Layer (RFAL) default Config file
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_CONFIG_H
|
||||
#define RFAL_CONFIG_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_features.h"
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* RFAL FEATURES DEFAULT CONFIGURATION
|
||||
******************************************************************************
|
||||
*/
|
||||
#ifndef RFAL_FEATURE_LISTEN_MODE
|
||||
#if RFAL_SUPPORT_CE || RFAL_SUPPORT_MODE_LISTEN_ACTIVE_P2P
|
||||
#define RFAL_FEATURE_LISTEN_MODE true /*!< Enable RFAL support for Listen Mode */
|
||||
#endif /* SUPPORT LISTEN_MODE */
|
||||
#endif /* RFAL_FEATURE_LISTEN_MODE */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_WAKEUP_MODE
|
||||
#define RFAL_FEATURE_WAKEUP_MODE true /*!< Enable RFAL support for the Wake-Up mode */
|
||||
#endif /* RFAL_FEATURE_WAKEUP_MODE */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_LOWPOWER_MODE
|
||||
#define RFAL_FEATURE_LOWPOWER_MODE false /*!< RFAL support for the Low Power mode, Disabled by default */
|
||||
#endif /* RFAL_FEATURE_LOWPOWER_MODE */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFCA
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA
|
||||
#define RFAL_FEATURE_NFCA true /*!< Enable RFAL support for NFC-A (ISO14443A) */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCA */
|
||||
#endif /* RFAL_FEATURE_NFCA */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_T1T
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA
|
||||
#define RFAL_FEATURE_T1T true /*!< Enable RFAL support for T1T (Topaz) */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCA */
|
||||
#endif /* RFAL_FEATURE_T1T */
|
||||
|
||||
#ifndef RFAL_FEATURE_T2T
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA
|
||||
#define RFAL_FEATURE_T2T true /*!< Enable RFAL support for T2T */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCA */
|
||||
#endif /* RFAL_FEATURE_T2T */
|
||||
|
||||
#ifndef RFAL_FEATURE_T4T
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA
|
||||
#define RFAL_FEATURE_T4T true /*!< Enable RFAL support for T4T */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCA */
|
||||
#endif /* RFAL_FEATURE_T2T */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFCB
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCB
|
||||
#define RFAL_FEATURE_NFCB true /*!< Enable RFAL support for NFC-B (ISO14443B) */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCB */
|
||||
#endif /* RFAL_FEATURE_NFCB */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ST25TB
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCB
|
||||
#define RFAL_FEATURE_ST25TB true /*!< Enable RFAL support for ST25TB */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCB */
|
||||
#endif /* RFAL_FEATURE_ST25TB */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFCF
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCF
|
||||
#define RFAL_FEATURE_NFCF true /*!< Enable RFAL support for NFC-F (FeliCa) */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCF */
|
||||
#endif /* RFAL_FEATURE_NFCF */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFCV
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCV
|
||||
#define RFAL_FEATURE_NFCV true /*!< Enable RFAL support for NFC-V (ISO15693) */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCV */
|
||||
#endif /* RFAL_FEATURE_NFCV */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ISO_DEP
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA || RFAL_SUPPORT_MODE_POLL_NFCB || RFAL_SUPPORT_CE
|
||||
#define RFAL_FEATURE_ISO_DEP true /*!< Enable RFAL support for ISO-DEP (ISO14443-4) */
|
||||
#endif /* RFAL_SUPPORT_MODE_ */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ISO_DEP_POLL
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA || RFAL_SUPPORT_MODE_POLL_NFCB
|
||||
#define RFAL_FEATURE_ISO_DEP_POLL true /*!< Enable RFAL support for Poller mode (PCD) ISO-DEP (ISO14443-4) */
|
||||
#endif /* RFAL_SUPPORT_MODE_ */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ISO_DEP_LISTEN
|
||||
#if RFAL_SUPPORT_CE
|
||||
#define RFAL_FEATURE_ISO_DEP_LISTEN true /*!< Enable RFAL support for Listen mode (PICC) ISO-DEP (ISO14443-4) */
|
||||
#endif /* RFAL_SUPPORT_MODE_ */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN
|
||||
#if RFAL_FEATURE_ISO_DEP
|
||||
#define RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN 256U /*!< ISO-DEP I-Block max length. Please use values as defined by rfalIsoDepFSx */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN
|
||||
#if RFAL_FEATURE_ISO_DEP
|
||||
#define RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN 512U /*!< ISO-DEP APDU max length. */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP */
|
||||
#endif /* RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFC_DEP
|
||||
#if RFAL_SUPPORT_MODE_POLL_NFCA && RFAL_SUPPORT_MODE_POLL_NFCF
|
||||
#define RFAL_FEATURE_NFC_DEP true /*!< Enable RFAL support for NFC-DEP (NFCIP1/P2P) */
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCA/F */
|
||||
#endif /* RFAL_FEATURE_NFC_DEP */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFC_DEP_BLOCK_MAX_LEN
|
||||
#if RFAL_FEATURE_NFC_DEP
|
||||
#define RFAL_FEATURE_NFC_DEP_BLOCK_MAX_LEN 254U /*!< NFC-DEP Block/Payload length. Allowed values: 64, 128, 192, 254 */
|
||||
#endif /* RFAL_FEATURE_NFC_DEP */
|
||||
#endif /* RFAL_FEATURE_NFC_DEP_BLOCK_MAX_LEN */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFC_DEP_PDU_MAX_LEN
|
||||
#if RFAL_FEATURE_NFC_DEP
|
||||
#define RFAL_FEATURE_NFC_DEP_PDU_MAX_LEN 512U /*!< NFC-DEP PDU max length. */
|
||||
#endif /* RFAL_FEATURE_NFC_DEP */
|
||||
#endif /* RFAL_FEATURE_NFC_DEP_PDU_MAX_LEN */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_NFC_RF_BUF_LEN
|
||||
#define RFAL_FEATURE_NFC_RF_BUF_LEN 258U /*!< RF buffer length used by RFAL NFC layer */
|
||||
#endif /* RFAL_FEATURE_NFC_RF_BUF_LEN */
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_ST25xV
|
||||
#define RFAL_FEATURE_ST25xV false /*!< ST25xV Module configuration missing. Disabled by default */
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
|
||||
#define RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG false /*!< Dynamic Analog Configs configuration missing. Disabled by default */
|
||||
#endif
|
||||
|
||||
|
||||
#ifndef RFAL_FEATURE_DPO
|
||||
#define RFAL_FEATURE_DPO false /*!< Dynamic Power Module configuration missing. Disabled by default */
|
||||
#endif
|
||||
|
||||
#ifndef RFAL_FEATURE_DLMA
|
||||
#define RFAL_FEATURE_DLMA false /*!< Dynamic LMA Module configuration missing. Disabled by default */
|
||||
#endif
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* RFAL OPTIONAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef platformProtectST25RIrqStatus
|
||||
#define platformProtectST25RIrqStatus() /*!< Protect unique access to IRQ status var - IRQ disable on single thread environment (MCU) ; Mutex lock on a multi thread environment */
|
||||
#endif /* platformProtectST25RIrqStatus */
|
||||
|
||||
#ifndef platformUnprotectST25RIrqStatus
|
||||
#define platformUnprotectST25RIrqStatus() /*!< Unprotect the IRQ status var - IRQ enable on a single thread environment (MCU) ; Mutex unlock on a multi thread environment */
|
||||
#endif /* platformUnprotectST25RIrqStatus */
|
||||
|
||||
#ifndef platformProtectWorker
|
||||
#define platformProtectWorker() /*!< Protect RFAL Worker/Task/Process from concurrent execution on multi thread platforms */
|
||||
#endif /* platformProtectWorker */
|
||||
|
||||
#ifndef platformUnprotectWorker
|
||||
#define platformUnprotectWorker() /*!< Unprotect RFAL Worker/Task/Process from concurrent execution on multi thread platforms */
|
||||
#endif /* platformUnprotectWorker */
|
||||
|
||||
#ifndef platformIrqST25RPinInitialize
|
||||
#define platformIrqST25RPinInitialize() /*!< Initializes ST25R IRQ pin */
|
||||
#endif /* platformIrqST25RPinInitialize */
|
||||
|
||||
#ifndef platformIrqST25RSetCallback
|
||||
#define platformIrqST25RSetCallback( cb ) /*!< Sets ST25R ISR callback */
|
||||
#endif /* platformIrqST25RSetCallback */
|
||||
|
||||
#ifndef platformLedsInitialize
|
||||
#define platformLedsInitialize() /*!< Initializes the pins used as LEDs to outputs */
|
||||
#endif /* platformLedsInitialize */
|
||||
|
||||
#ifndef platformLedOff
|
||||
#define platformLedOff( port, pin ) /*!< Turns the given LED Off */
|
||||
#endif /* platformLedOff */
|
||||
|
||||
#ifndef platformLedOn
|
||||
#define platformLedOn( port, pin ) /*!< Turns the given LED On */
|
||||
#endif /* platformLedOn */
|
||||
|
||||
#ifndef platformLedToggle
|
||||
#define platformLedToggle( port, pin ) /*!< Toggles the given LED */
|
||||
#endif /* platformLedToggle */
|
||||
|
||||
#ifndef platformGetSysTick
|
||||
#define platformGetSysTick() /*!< Get System Tick ( 1 tick = 1 ms) */
|
||||
#endif /* platformGetSysTick */
|
||||
|
||||
#ifndef platformTimerGetRemaining
|
||||
#define platformTimerGetRemaining( timer ) (0U) /*!< Gets the remaining time until expiration */
|
||||
#endif /* platformTimerGetRemaining */
|
||||
|
||||
#ifndef platformTimerDestroy
|
||||
#define platformTimerDestroy( timer ) /*!< Stops and released the given timer */
|
||||
#endif /* platformTimerDestroy */
|
||||
|
||||
#ifndef platformLog
|
||||
#define platformLog(...) /*!< Log method */
|
||||
#endif /* platformLog */
|
||||
|
||||
#ifndef platformAssert
|
||||
#define platformAssert( exp ) /*!< Asserts whether the given expression is true */
|
||||
#endif /* platformAssert */
|
||||
|
||||
#ifndef platformErrorHandle
|
||||
#define platformErrorHandle() /*!< Global error handler or trap */
|
||||
#endif /* platformErrorHandle */
|
||||
|
||||
|
||||
#ifdef RFAL_USE_I2C
|
||||
|
||||
#ifndef platformSpiTxRx
|
||||
#define platformSpiTxRx( txBuf, rxBuf, len ) /*!< SPI transceive */
|
||||
#endif /* platformSpiTxRx */
|
||||
|
||||
#else /* RFAL_USE_I2C */
|
||||
|
||||
#ifndef platformI2CTx
|
||||
#define platformI2CTx( txBuf, len, last, txOnly ) /*!< I2C Transmit */
|
||||
#endif /* platformI2CTx */
|
||||
|
||||
#ifndef platformI2CRx
|
||||
#define platformI2CRx( txBuf, len ) /*!< I2C Receive */
|
||||
#endif /* platformI2CRx */
|
||||
|
||||
#ifndef platformI2CStart
|
||||
#define platformI2CStart() /*!< I2C Start condition */
|
||||
#endif /* platformI2CStart */
|
||||
|
||||
#ifndef platformI2CStop
|
||||
#define platformI2CStop() /*!< I2C Stop condition */
|
||||
#endif /* platformI2CStop */
|
||||
|
||||
#ifndef platformI2CRepeatStart
|
||||
#define platformI2CRepeatStart() /*!< I2C Repeat Start */
|
||||
#endif /* platformI2CRepeatStart */
|
||||
|
||||
#ifndef platformI2CSlaveAddrWR
|
||||
#define platformI2CSlaveAddrWR(add) /*!< I2C Slave address for Write operation */
|
||||
#endif /* platformI2CSlaveAddrWR */
|
||||
|
||||
#ifndef platformI2CSlaveAddrRD
|
||||
#define platformI2CSlaveAddrRD(add) /*!< I2C Slave address for Read operation */
|
||||
#endif /* platformI2CSlaveAddrRD */
|
||||
|
||||
#endif /* RFAL_USE_I2C */
|
||||
|
||||
#endif /* RFAL_CONFIG_H */
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,220 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_dlma.h
|
||||
* @brief : Dynamic load modulation adjustment
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_DLMA_H
|
||||
#define RFAL_DLMA_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_DLMA_TABLE_MAX_ENTRIES 4U /*!< Max DLMA entries */
|
||||
#define RFAL_DLMA_TABLE_PARAM_LEN sizeof(rfalDlmaEntry) /*!< DLMA Parameter length */
|
||||
#define RFAL_DLMA_TABLE_SIZE_MAX (RFAL_DLMA_TABLE_MAX_ENTRIES * RFAL_DLMA_TABLE_PARAM_LEN) /*!< Max DLMA table size */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Function pointer to methode doing the reference measurement */
|
||||
typedef ReturnCode (*rfalDlmaMeasureFunc)(uint8_t* res);
|
||||
|
||||
/*! Function pointer to the Adjustment method */
|
||||
typedef ReturnCode (*rfalDlmaAdjustFunc)(uint8_t mod, uint8_t unmod);
|
||||
|
||||
|
||||
/*! DLMA table entry struct */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t unmodRes; /*!< RFO resistance in Passive Listen Mode: Unmodulated state */
|
||||
uint8_t modRes; /*!< RFO resistance in Passive Listen Mode: Modulated state */
|
||||
uint8_t inc; /*!< Threshold for incrementing */
|
||||
uint8_t dec; /*!< Threshold for decrementing */
|
||||
}rfalDlmaEntry;
|
||||
|
||||
|
||||
/*! DLMA information struct */
|
||||
typedef struct
|
||||
{
|
||||
bool enabled; /*!< Enabled state */
|
||||
uint8_t tableEntry; /*!< Current entry used */
|
||||
uint8_t tableEntries; /*!< Number of entries used */
|
||||
uint8_t refMeasurement; /*!< Last measurement used to adjust */
|
||||
rfalDlmaAdjustFunc adjustCallback; /*!< Pointer to the adjust callback */
|
||||
rfalDlmaMeasureFunc measureCallback; /*!< Pointer to the measure callback */
|
||||
} rfalDlmaInfo;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize dynamic power table
|
||||
*
|
||||
* This function sets the internal dynamic power table to the default
|
||||
* values stored in rfal_DlmaTbl.h
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDlmaInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set the measurement methode
|
||||
*
|
||||
* This function sets the measurement method used for reference measurement.
|
||||
* Based on the measurement the power will then be adjusted
|
||||
*
|
||||
* \param[in] pFunc: callback of measurement function
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDlmaSetMeasureCallback( rfalDlmaMeasureFunc pFunc );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set the measurement methode
|
||||
*
|
||||
* This function sets the adjust method.
|
||||
*
|
||||
* \param[in] pFunc: callback of adjust function
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDlmaSetAdjustCallback( rfalDlmaAdjustFunc pFunc );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic LMA table write
|
||||
*
|
||||
* Load the dynamic power table
|
||||
*
|
||||
* \param[in] powerTbl : location of power Table to be loaded
|
||||
* \param[in] powerTblEntries : number of entries of the power Table to be loaded
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_PARAM : If configTbl is invalid
|
||||
* \return RFAL_ERR_NOMEM : If the given Table is bigger exceeds the max size
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDlmaTableWrite( const rfalDlmaEntry* powerTbl, uint8_t powerTblEntries );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic LMA table Read
|
||||
*
|
||||
* Read the dynamic power table
|
||||
*
|
||||
* \param[out] tblBuf : location to the rfalDlmaEntry[] to place the Table
|
||||
* \param[in] tblBufEntries : number of entries available in tblBuf to place the power Table
|
||||
* \param[out] tableEntries : returned number of entries actually written into tblBuf
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_WRONG_STATE : If configTbl is invalid
|
||||
* \return RFAL_ERR_PARAM : If parameters are invalid
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDlmaTableRead( rfalDlmaEntry* tblBuf, uint8_t tblBufEntries, uint8_t* tableEntries );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic LMA adjust
|
||||
*
|
||||
* It measures the current output and adjusts the power accordingly to
|
||||
* the dynamic power table
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_PARAM : If configTbl is invalid or parameters are invalid
|
||||
* \return RFAL_ERR_WRONG_STATE : If the current state is valid for DLMA Adjustment
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDlmaAdjust( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic LMA set enabled state
|
||||
*
|
||||
* \param[in] enable : new active state
|
||||
*
|
||||
* Set state to enable or disable the Dynamic LMA adjustment
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDlmaSetEnabled( bool enable );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get the Dynamic LMA enabled state
|
||||
*
|
||||
* Get state of the Dynamic power adjustment
|
||||
*
|
||||
* \return true : DLMA is enabled
|
||||
* \return false : DLMA is disabled
|
||||
*****************************************************************************
|
||||
*/
|
||||
bool rfalDlmaIsEnabled( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get DLMA information
|
||||
*
|
||||
* Get the DLMA information|status
|
||||
*
|
||||
* \param[out] info : DLMA information
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_NONE : No Error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDlmaGetInfo( rfalDlmaInfo* info );
|
||||
|
||||
|
||||
#endif /* RFAL_DLMA_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,231 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_dpo.h
|
||||
* @brief : Dynamic Power Output
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef RFAL_DPO_H
|
||||
#define RFAL_DPO_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_DPO_TABLE_MAX_ENTRIES 4U /*!< Max DPO table entries */
|
||||
#define RFAL_DPO_TABLE_PARAM_LEN sizeof(rfalDpoEntry) /*!< DPO Parameter length */
|
||||
#define RFAL_DPO_TABLE_SIZE_MAX (RFAL_DPO_TABLE_MAX_ENTRIES * RFAL_DPO_TABLE_PARAM_LEN) /*!< Max DPO table size */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Function pointer to the reference Measurement method */
|
||||
typedef ReturnCode (*rfalDpoMeasureFunc)(uint8_t* res);
|
||||
|
||||
/*! Function pointer to the Adjustment method */
|
||||
typedef ReturnCode (*rfalDpoAdjustFunc)(uint8_t res);
|
||||
|
||||
|
||||
/*! DPO table entry struct */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t rfoRes; /*!< Setting for the resistance level of the RFO */
|
||||
uint8_t inc; /*!< Threshold for incrementing the output power */
|
||||
uint8_t dec; /*!< Threshold for decrementing the output power */
|
||||
}rfalDpoEntry;
|
||||
|
||||
|
||||
/*! DPO information struct */
|
||||
typedef struct
|
||||
{
|
||||
bool enabled; /*!< Enabled state */
|
||||
uint8_t tableEntries; /*!< Number of entries used */
|
||||
uint8_t tableEntry; /*!< Current entry used */
|
||||
uint8_t refMeasurement; /*!< Last measurement used to adjust */
|
||||
rfalDpoAdjustFunc adjustCallback; /*!< Pointer to the adjust callback */
|
||||
rfalDpoMeasureFunc measureCallback; /*!< Pointer to the measure callback */
|
||||
} rfalDpoInfo;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize dynamic power table
|
||||
*
|
||||
* This function sets the internal dynamic power table to the default
|
||||
* values stored in rfal_DpoTbl.h
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDpoInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set the Measurement method
|
||||
*
|
||||
* This function sets the measurement method used for reference measurement.
|
||||
* Based on the measurement the power will then be adjusted
|
||||
*
|
||||
* \param[in] pFunc: callback of measurement function
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDpoSetMeasureCallback( rfalDpoMeasureFunc pFunc );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set the Adjust method
|
||||
*
|
||||
* This function sets the Adjust method used during DPO adjust
|
||||
*
|
||||
* \param[in] pFunc: callback of adjust function
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDpoSetAdjustCallback( rfalDpoAdjustFunc pFunc );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Write dynamic power table
|
||||
*
|
||||
* Load the dynamic power table
|
||||
*
|
||||
* \param[in] powerTbl : location of power Table to be loaded
|
||||
* \param[in] powerTblEntries : number of entries of the power Table to be loaded
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_PARAM : if configTbl is invalid
|
||||
* \return RFAL_ERR_NOMEM : if the given Table is bigger exceeds the max size
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDpoTableWrite( const rfalDpoEntry* powerTbl, uint8_t powerTblEntries );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic power table Read
|
||||
*
|
||||
* Read the dynamic power table
|
||||
*
|
||||
* \param[out] tblBuf : location to the rfalDpoEntry[] to place the Table
|
||||
* \param[in] tblBufEntries : number of entries available in tblBuf to place the power Table
|
||||
* \param[out] tableEntries : returned number of entries actually written into tblBuf
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_PARAM : if configTbl is invalid or parameters are invalid
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDpoTableRead( rfalDpoEntry* tblBuf, uint8_t tblBufEntries, uint8_t* tableEntries );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic power adjust
|
||||
*
|
||||
* It measures the current output and adjusts the power accordingly to
|
||||
* the dynamic power table.
|
||||
* This method | The adjustment shall be performed when the device
|
||||
* is already emiting RF field
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_PARAM : if configTbl is invalid or parameters are invalid
|
||||
* \return RFAL_ERR_WRONG_STATE : if the current state is valid for DPO Adjustment
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDpoAdjust( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Dynamic power set enabled state
|
||||
*
|
||||
* \param[in] enable : new active state
|
||||
*
|
||||
* Set state to enable or disable the Dynamic power adjustment
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDpoSetEnabled( bool enable );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get the Dynamic power enabled state
|
||||
*
|
||||
* Get state of the Dynamic power adjustment
|
||||
*
|
||||
* \return true : DPO is enabled
|
||||
* \return false : DPO is disabled
|
||||
*****************************************************************************
|
||||
*/
|
||||
bool rfalDpoIsEnabled( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Request DPO adjust
|
||||
*
|
||||
* Flags the DPO module to perform the adjustment on the next round, even
|
||||
* if no change has been perceived from previous measurement|state
|
||||
|
||||
*****************************************************************************
|
||||
*/
|
||||
void rfalDpoReqAdj( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get DPO information
|
||||
*
|
||||
* Get the DPO information|status
|
||||
*
|
||||
* \param[out] info : pointer where DPO info is to be stored
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_NONE : No Error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalDpoGetInfo( rfalDpoInfo* info );
|
||||
|
||||
#endif /* RFAL_DPO_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,449 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_nfc.h
|
||||
* @brief : RFAL NFC device
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFC_H
|
||||
#define RFAL_NFC_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.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 /*!< Poll NFC-A technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_B 0x0002U /*!< Poll NFC-B technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_F 0x0004U /*!< Poll NFC-F technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_V 0x0008U /*!< Poll NFC-V technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_AP2P 0x0010U /*!< Poll AP2P technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_ST25TB 0x0020U /*!< Poll ST25TB technology Flag */
|
||||
#define RFAL_NFC_POLL_TECH_PROP 0x0040U /*!< Poll Proprietary technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_A 0x1000U /*!< Listen NFC-A technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_B 0x2000U /*!< Listen NFC-B technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_F 0x4000U /*!< Listen NFC-F technology Flag */
|
||||
#define RFAL_NFC_LISTEN_TECH_AP2P 0x8000U /*!< Listen AP2P 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) )
|
||||
|
||||
/*! Sets the discover parameters to its default values */
|
||||
#define rfalNfcDefaultDiscParams( dp ) if( (dp) != NULL) { \
|
||||
RFAL_MEMSET( (dp), 0x00, sizeof(rfalNfcDiscoverParam) ); \
|
||||
((dp))->compMode = RFAL_COMPLIANCE_MODE_NFC; \
|
||||
((dp))->devLimit = 1U; \
|
||||
((dp))->nfcfBR = RFAL_BR_212; \
|
||||
((dp))->ap2pBR = RFAL_BR_424; \
|
||||
((dp))->maxBR = RFAL_BR_KEEP; \
|
||||
((dp))->isoDepFS = RFAL_ISODEP_FSXI_256; \
|
||||
((dp))->nfcDepLR = RFAL_NFCDEP_LR_254; \
|
||||
((dp))->GBLen = 0U; \
|
||||
((dp))->p2pNfcaPrio = false; \
|
||||
((dp))->wakeupEnabled = false; \
|
||||
((dp))->wakeupConfigDefault = true; \
|
||||
((dp))->wakeupPollBefore = false; \
|
||||
((dp))->wakeupNPolls = 1U; \
|
||||
((dp))->totalDuration = 1000U; \
|
||||
((dp))->techs2Find = RFAL_NFC_TECH_NONE; \
|
||||
((dp))->techs2Bail = RFAL_NFC_TECH_NONE; \
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* 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_LISTEN_TYPE_PROP = 6, /*!< Proprietary Listen dev 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;
|
||||
|
||||
|
||||
/*! Deactivation type */
|
||||
typedef enum{
|
||||
RFAL_NFC_DEACTIVATE_IDLE = 0, /*!< Deactivate and go to IDLE */
|
||||
RFAL_NFC_DEACTIVATE_SLEEP = 1, /*!< Deactivate and go to SELECT */
|
||||
RFAL_NFC_DEACTIVATE_DISCOVERY = 2 /*!< Deactivate and restart DISCOVERY */
|
||||
}rfalNfcDeactivateType;
|
||||
|
||||
|
||||
/*! 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;
|
||||
|
||||
|
||||
/*! Callbacks for Proprietary|Other Technology Activity 2.1 & EMVCo 3.0 9.2 */
|
||||
typedef ReturnCode (* rfalNfcPropCallback)(void);
|
||||
|
||||
|
||||
/*! Struct that holds the Proprietary NFC callbacks */
|
||||
typedef struct{
|
||||
rfalNfcPropCallback rfalNfcpPollerInitialize; /*!< Prorietary NFC Initialization callback */
|
||||
rfalNfcPropCallback rfalNfcpPollerTechnologyDetection; /*!< Prorietary NFC Technoly Detection callback */
|
||||
rfalNfcPropCallback rfalNfcpPollerStartCollisionResolution; /*!< Prorietary NFC Start Collision Resolution callback */
|
||||
rfalNfcPropCallback rfalNfcpPollerGetCollisionResolutionStatus; /*!< Prorietary NFC Get Collision Resolution status callback */
|
||||
rfalNfcPropCallback rfalNfcpStartActivation; /*!< Prorietary NFC Start Activation callback */
|
||||
rfalNfcPropCallback rfalNfcpGetActivationStatus; /*!< Prorietary NFC Get Activation status callback */
|
||||
} rfalNfcPropCallbacks;
|
||||
|
||||
|
||||
/*! Discovery parameters */
|
||||
typedef struct{
|
||||
rfalComplianceMode compMode; /*!< Compliancy mode to be used */
|
||||
uint16_t techs2Find; /*!< Technologies to search for */
|
||||
uint16_t techs2Bail; /*!< Bail-out after certain NFC technologies */
|
||||
uint16_t totalDuration; /*!< Duration of a whole Poll + Listen cycle NCI 2.1 Table 46 */
|
||||
uint8_t devLimit; /*!< Max number of devices Activity 2.1 Table 11 */
|
||||
rfalBitRate maxBR; /*!< Max Bit rate to be used NCI 2.1 Table 28 */
|
||||
|
||||
rfalBitRate nfcfBR; /*!< Bit rate to poll for NFC-F NCI 2.1 Table 27 */
|
||||
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 NCI 2.1 Table 29 */
|
||||
uint8_t GBLen; /*!< Length of the General Bytes NCI 2.1 Table 29 */
|
||||
rfalBitRate ap2pBR; /*!< Bit rate to poll for AP2P NCI 2.1 Table 31 */
|
||||
bool p2pNfcaPrio; /*!< NFC-A P2P (true) or ISO14443-4/T4T (false) priority */
|
||||
rfalNfcPropCallbacks propNfc; /*!< Proprietary Technlogy callbacks */
|
||||
|
||||
|
||||
rfalIsoDepFSxI isoDepFS; /*!< ISO-DEP Poller announced maximum frame size Digital 2.2 Table 60 */
|
||||
uint8_t nfcDepLR; /*!< NFC-DEP Poller & Listener maximum frame size Digital 2.2 Table 90 */
|
||||
|
||||
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 wakeupPollBefore; /*!< Flag to Poll wakeupNPolls times before entering Wake-up */
|
||||
uint16_t wakeupNPolls; /*!< Number of polling cycles before|after entering Wake-up */
|
||||
}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 RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* Discovery still ongoing
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* No device activated
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_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
|
||||
* indicate which device shall be actived
|
||||
*
|
||||
* \param[in] devIdx : device index to be activated
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* Not in select state
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_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 (in bits or bytes - see below)
|
||||
* \param[out] rxData : location of the received data after operation is completed
|
||||
* \param[out] rvdLen : location of the length of the received data (in bits or bytes - see below)
|
||||
* \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
|
||||
*
|
||||
* \warning In order to support a wider range of protocols, when RF interface is used the lengths
|
||||
* are in number of bits (not bytes). Therefore both input txDataLen and output rvdLen refer to
|
||||
* bits. If ISO-DEP or NFC-DEP interface is used those are expressed in number of bytes.
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDataExchangeStart( uint8_t *txData, uint16_t txDataLen, uint8_t **rxData, uint16_t **rvdLen, uint32_t fwt );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Get Data Exchange Status
|
||||
*
|
||||
* Gets current Data Exchange status
|
||||
*
|
||||
* \return RFAL_ERR_NONE : Transceive done with no error
|
||||
* \return RFAL_ERR_BUSY : Transceive ongoing
|
||||
* \return RFAL_ERR_AGAIN : received one chaining block, copy received data
|
||||
* and continue to call this method to retrieve the
|
||||
* remaining blocks
|
||||
* \return RFAL_ERR_XXXX : Error occurred
|
||||
* \return RFAL_ERR_TIMEOUT : No response
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_LINK_LOSS : Link Loss - External Field is Off
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected
|
||||
* \return RFAL_ERR_IO : Internal error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDataExchangeGetStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief RFAL NFC Deactivate
|
||||
*
|
||||
* It triggers the deactivation procedure to terminate communications with
|
||||
* remote device.
|
||||
* In case the deactivation type is RFAL_NFC_DEACTIVATE_SLEEP the field is
|
||||
* kept On and device selection shall follow. Otherwise the field will
|
||||
* be turned Off.
|
||||
*
|
||||
* \warning In case the deactivation type is RFAL_NFC_DEACTIVATE_IDLE the
|
||||
* deactivation procedure is executed immediately and in a blocking manner
|
||||
*
|
||||
* \param[in] deactType : Type of deactivation to be performed
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : Incorrect state for this operation
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDeactivate( rfalNfcDeactivateType deactType );
|
||||
|
||||
#endif /* RFAL_NFC_H */
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,756 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_nfcDep.h
|
||||
* Description : Implementation of NFC-DEP protocol
|
||||
*
|
||||
* NFC-DEP is also known as NFCIP - Near Field Communication
|
||||
* Interface and Protocol
|
||||
*
|
||||
* This implementation was based on the following specs:
|
||||
* - NFC Forum Digital 1.1
|
||||
* - ECMA 340 3rd Edition 2013
|
||||
*
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFCDEP_H_
|
||||
#define RFAL_NFCDEP_H_
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* If module is disabled remove the need for the user to set lengths */
|
||||
#if !RFAL_FEATURE_NFC_DEP
|
||||
/* PRQA S 0841 2 # MISRA 20.5 - #undef used to ease user defined configuration and memory optimization */ /* PRQA S 0847 2 # MISRA 20.5 - #undef used to ease user defined configuration and memory optimization */
|
||||
#undef RFAL_FEATURE_NFC_DEP_BLOCK_MAX_LEN
|
||||
#undef RFAL_FEATURE_NFC_DEP_PDU_MAX_LEN
|
||||
|
||||
#define RFAL_FEATURE_NFC_DEP_BLOCK_MAX_LEN 2U /*!< NFC-DEP Block/Payload length, set to "none" */ /* MISRA: Some compilers treat an array of length one declared as the final member of a struct as a flexible array member.*/
|
||||
#define RFAL_FEATURE_NFC_DEP_PDU_MAX_LEN 2U /*!< NFC-DEP PDU length, set to "none" */ /* MISRA: Some compilers treat an array of length one declared as the final member of a struct as a flexible array member.*/
|
||||
#endif /* !RFAL_FEATURE_NFC_DEP */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_NFCDEP_FRAME_SIZE_MAX_LEN 254U /*!< Maximum Frame Size Digital 2.0 Table 90 */
|
||||
#define RFAL_NFCDEP_DEPREQ_HEADER_LEN 5U /*!< DEP_REQ header length: CMD_TYPE + CMD_CMD + PBF + DID + NAD */
|
||||
|
||||
/*! Length NFCIP DEP REQ or RES header (incl LEN) */
|
||||
#define RFAL_NFCDEP_DEP_HEADER ( RFAL_NFCDEP_LEN_LEN + RFAL_NFCDEP_CMDTYPE_LEN + RFAL_NFCDEP_CMD_LEN + RFAL_NFCDEP_DEP_PFB_LEN )
|
||||
#define RFAL_NFCDEP_HEADER ( RFAL_NFCDEP_CMDTYPE_LEN + RFAL_NFCDEP_CMD_LEN ) /*!< NFCIP header length */
|
||||
#define RFAL_NFCDEP_SB_LEN 1U /*!< SB length on NFCIP fram for NFC-A */
|
||||
#define RFAL_NFCDEP_LEN_LEN 1U /*!< LEN length on NFCIP frame */
|
||||
#define RFAL_NFCDEP_CMDTYPE_LEN 1U /*!< Length of the cmd type (REQ | RES) on NFCIP frame */
|
||||
#define RFAL_NFCDEP_CMD_LEN 1U /*!< Length of the cmd on NFCIP frame */
|
||||
#define RFAL_NFCDEP_DID_LEN 1U /*!< Length of did on NFCIP frame */
|
||||
#define RFAL_NFCDEP_DEP_PFB_LEN 1U /*!< Length of the PFB field on NFCIP frame */
|
||||
|
||||
#define RFAL_NFCDEP_DSL_RLS_LEN_NO_DID (RFAL_NFCDEP_LEN_LEN + RFAL_NFCDEP_CMDTYPE_LEN + RFAL_NFCDEP_CMD_LEN) /*!< Length of DSL_REQ and RLS_REQ with no DID */
|
||||
#define RFAL_NFCDEP_DSL_RLS_LEN_DID (RFAL_NFCDEP_DSL_RLS_LEN_NO_DID + RFAL_NFCDEP_DID_LEN) /*!< Length of DSL_REQ and RLS_REQ with DID */
|
||||
|
||||
#define RFAL_NFCDEP_FS_VAL_MIN 64U /*!< Minimum LR value */
|
||||
#define RFAL_NFCDEP_LR_VAL_MASK 0x03U /*!< Bit mask for a LR value */
|
||||
#define RFAL_NFCDEP_PP_LR_MASK 0x30U /*!< Bit mask for LR value in PP byte on a ATR REQ/RES */
|
||||
#define RFAL_NFCDEP_PP_LR_SHIFT 4U /*!< Position of LR value in PP byte on a ATR REQ/RES */
|
||||
|
||||
#define RFAL_NFCDEP_DID_MAX 14U /*!< Max DID value Digital 14.6.2.3 */
|
||||
#define RFAL_NFCDEP_DID_KEEP 0xFFU /*!< Keep DID value already configured */
|
||||
#define RFAL_NFCDEP_DID_NO 0x00U /*!< No DID shall be used */
|
||||
#define RFAL_NFCDEP_NAD_NO 0x00U /*!< No NAD shall be used */
|
||||
|
||||
#define RFAL_NFCDEP_OPER_RTOX_REQ_DIS 0x01U /*!< Operation config: RTOX REQ disable */
|
||||
#define RFAL_NFCDEP_OPER_RTOX_REQ_EN 0x00U /*!< Operation config: RTOX REQ enable */
|
||||
|
||||
#define RFAL_NFCDEP_OPER_ATN_DIS 0x00U /*!< Operation config: ATN disable */
|
||||
#define RFAL_NFCDEP_OPER_ATN_EN 0x02U /*!< Operation config: ATN enable */
|
||||
|
||||
#define RFAL_NFCDEP_OPER_EMPTY_DEP_DIS 0x04U /*!< Operation config: empty DEPs disable */
|
||||
#define RFAL_NFCDEP_OPER_EMPTY_DEP_EN 0x00U /*!< Operation config: empty DEPs enable */
|
||||
|
||||
#define RFAL_NFCDEP_OPER_FULL_MI_DIS 0x00U /*!< Operation config: full chaining DEPs disable */
|
||||
#define RFAL_NFCDEP_OPER_FULL_MI_EN 0x08U /*!< Operation config: full chaining DEPs enable */
|
||||
|
||||
|
||||
#define RFAL_NFCDEP_BRS_MAINTAIN 0xC0U /*!< Value signalling that BR is to be maintained (no PSL) */
|
||||
#define RFAL_NFCDEP_BRS_Dx_MASK 0x07U /*!< Value signalling that BR is to be maintained (no PSL) */
|
||||
#define RFAL_NFCDEP_BRS_DSI_POS 3U /*!< Value signalling that BR is to be maintained (no PSL) */
|
||||
|
||||
#define RFAL_NFCDEP_WT_DELTA (16U - RFAL_NFCDEP_WT_DELTA_ADJUST) /*!< NFC-DEP dWRT (adjusted) Digital 2.0 B.10 */
|
||||
#define RFAL_NFCDEP_WT_DELTA_ADJUST 4U /*!< dWRT value adjustment */
|
||||
|
||||
|
||||
#define RFAL_NFCDEP_ATR_REQ_NFCID3_POS 2U /*!< NFCID3 offset in ATR_REQ frame */
|
||||
#define RFAL_NFCDEP_NFCID3_LEN 10U /*!< NFCID3 Length */
|
||||
|
||||
#define RFAL_NFCDEP_LEN_MIN 3U /*!< Minimum length byte LEN value */
|
||||
#define RFAL_NFCDEP_LEN_MAX 255U /*!< Maximum length byte LEN value */
|
||||
|
||||
#define RFAL_NFCDEP_ATRRES_HEADER_LEN 2U /*!< ATR RES Header Len: CmdType: 0xD5 + Cod: 0x01 */
|
||||
#define RFAL_NFCDEP_ATRRES_MIN_LEN 17U /*!< Minimum length for an ATR RES */
|
||||
#define RFAL_NFCDEP_ATRRES_MAX_LEN 64U /*!< Maximum length for an ATR RES Digital 1.0 14.6.1 */
|
||||
#define RFAL_NFCDEP_ATRREQ_MIN_LEN 16U /*!< Minimum length for an ATR REQ */
|
||||
#define RFAL_NFCDEP_ATRREQ_MAX_LEN RFAL_NFCDEP_ATRRES_MAX_LEN /*!< Maximum length for an ATR REQ Digital 1.0 14.6.1 */
|
||||
|
||||
#define RFAL_NFCDEP_GB_MAX_LEN (RFAL_NFCDEP_ATRREQ_MAX_LEN - RFAL_NFCDEP_ATRREQ_MIN_LEN) /*!< Maximum length the General Bytes on ATR Digital 1.1 16.6.3 */
|
||||
|
||||
#define RFAL_NFCDEP_WT_INI_DEFAULT RFAL_NFCDEP_WT_INI_MAX /*!< WT Initiator default value Digital 1.0 14.6.3.8 */
|
||||
#define RFAL_NFCDEP_WT_INI_MIN 0U /*!< WT Initiator minimum value Digital 1.0 14.6.3.8 */
|
||||
#define RFAL_NFCDEP_WT_INI_MAX 14U /*!< WT Initiator maximum value Digital 1.0 14.6.3.8 A.10 */
|
||||
#define RFAL_NFCDEP_RWT_INI_MAX rfalNfcDepWT2RWT( RFAL_NFCDEP_WT_INI_MAX ) /*!< RWT Initiator maximum value */
|
||||
|
||||
#define RFAL_NFCDEP_WT_TRG_MAX_D10 8U /*!< WT target max Digital 1.0 14.6.3.8 A.10 */
|
||||
#define RFAL_NFCDEP_WT_TRG_MAX_D11 14U /*!< WT target max Digital 1.1 16.6.3.9 A.9 */
|
||||
#define RFAL_NFCDEP_WT_TRG_MAX_L13 10U /*!< WT target max [LLCP] 1.3 6.2.1 */
|
||||
#define RFAL_NFCDEP_WT_TRG_MAX RFAL_NFCDEP_WT_TRG_MAX_D11 /*!< WT target max Digital x.x | LLCP x.x */
|
||||
#define RFAL_NFCDEP_RWT_TRG_MAX rfalNfcDepWT2RWT( RFAL_NFCDEP_WT_TRG_MAX ) /*!< RWT Initiator maximum value */
|
||||
|
||||
/*! Maximum Frame Waiting Time = ((256 * 16/fc)*2^FWImax) = ((256*16/fc)*2^14) = (1048576 / 64)/fc = (100000h*64)/fc */
|
||||
#define RFAL_NFCDEP_MAX_FWT ((uint32_t)1U<<20)
|
||||
|
||||
#define RFAL_NFCDEP_WT_MASK 0x0FU /*!< Bit mask for the Wait Time value */
|
||||
|
||||
#define RFAL_NFCDEP_BR_MASK_106 0x01U /*!< Enable mask bit rate 106 */
|
||||
#define RFAL_NFCDEP_BR_MASK_212 0x02U /*!< Enable mask bit rate 242 */
|
||||
#define RFAL_NFCDEP_BR_MASK_424 0x04U /*!< Enable mask bit rate 424 */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define rfalNfcDepWT2RWT( wt ) ( (uint32_t)1U << (((uint32_t)(wt) & RFAL_NFCDEP_WT_MASK) + 12U) ) /*!< Converts WT value to RWT (1/fc) */
|
||||
|
||||
/*! Returns the BRS value from the given bit rate */
|
||||
#define rfalNfcDepDx2BRS( br ) ( (((uint8_t)(br) & RFAL_NFCDEP_BRS_Dx_MASK) << RFAL_NFCDEP_BRS_DSI_POS) | ((uint8_t)(br) & RFAL_NFCDEP_BRS_Dx_MASK) )
|
||||
|
||||
#define rfalNfcDepBRS2DRI( brs ) (uint8_t)( (uint8_t)(brs) & RFAL_NFCDEP_BRS_Dx_MASK ) /*!< Returns the DRI value from the given BRS byte */
|
||||
#define rfalNfcDepBRS2DSI( brs ) (uint8_t)( ((uint8_t)(brs) >> RFAL_NFCDEP_BRS_DSI_POS) & RFAL_NFCDEP_BRS_Dx_MASK ) /*!< Returns the DSI value from the given BRS byte */
|
||||
|
||||
#define rfalNfcDepPP2LR( PPx ) ( ((uint8_t)(PPx) & RFAL_NFCDEP_PP_LR_MASK ) >> RFAL_NFCDEP_PP_LR_SHIFT) /*!< Returns the LR value from the given PPx byte */
|
||||
#define rfalNfcDepLR2PP( LRx ) ( ((uint8_t)(LRx) << RFAL_NFCDEP_PP_LR_SHIFT) & RFAL_NFCDEP_PP_LR_MASK) /*!< Returns the PP byte with the given LRx value */
|
||||
|
||||
/*! Returns the Frame size value from the given LRx value */
|
||||
#define rfalNfcDepLR2FS( LRx ) (uint16_t)(RFAL_MIN( (RFAL_NFCDEP_FS_VAL_MIN * ((uint16_t)(LRx) + 1U) ), RFAL_NFCDEP_FRAME_SIZE_MAX_LEN ))
|
||||
|
||||
/*!
|
||||
* Despite DIGITAL 1.0 14.6.2.1 stating that the last two bytes may filled with
|
||||
* any value, some devices (Samsung Google Nexus) only accept when these are 0 */
|
||||
#define rfalNfcDepSetNFCID( dst, src, len ) RFAL_MEMSET( (dst), 0x00, RFAL_NFCDEP_NFCID3_LEN ); \
|
||||
if( (len) > 0U ) {RFAL_MEMCPY( (dst), (src), (len) );}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL ENUMERATIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Enumeration of NFC-DEP bit rate in ATR Digital 1.0 Table 93 and 94 */
|
||||
enum{
|
||||
RFAL_NFCDEP_Bx_NO_HIGH_BR = 0x00, /*!< Peer supports no high bit rates */
|
||||
RFAL_NFCDEP_Bx_08_848 = 0x01, /*!< Peer also supports 848 */
|
||||
RFAL_NFCDEP_Bx_16_1695 = 0x02, /*!< Peer also supports 1695 */
|
||||
RFAL_NFCDEP_Bx_32_3390 = 0x04, /*!< Peer also supports 3390 */
|
||||
RFAL_NFCDEP_Bx_64_6780 = 0x08 /*!< Peer also supports 6780 */
|
||||
};
|
||||
|
||||
/*! Enumeration of NFC-DEP bit rate Dividor in PSL Digital 1.0 Table 100 */
|
||||
enum{
|
||||
RFAL_NFCDEP_Dx_01_106 = RFAL_BR_106, /*!< Divisor D = 1 : bit rate = 106 */
|
||||
RFAL_NFCDEP_Dx_02_212 = RFAL_BR_212, /*!< Divisor D = 2 : bit rate = 212 */
|
||||
RFAL_NFCDEP_Dx_04_424 = RFAL_BR_424, /*!< Divisor D = 4 : bit rate = 424 */
|
||||
RFAL_NFCDEP_Dx_08_848 = RFAL_BR_848, /*!< Divisor D = 8 : bit rate = 848 */
|
||||
RFAL_NFCDEP_Dx_16_1695 = RFAL_BR_1695, /*!< Divisor D = 16 : bit rate = 1695 */
|
||||
RFAL_NFCDEP_Dx_32_3390 = RFAL_BR_3390, /*!< Divisor D = 32 : bit rate = 3390 */
|
||||
RFAL_NFCDEP_Dx_64_6780 = RFAL_BR_6780 /*!< Divisor D = 64 : bit rate = 6780 */
|
||||
};
|
||||
|
||||
/*! Enumeration of NFC-DEP Length Reduction (LR) Digital 1.0 Table 91 */
|
||||
enum{
|
||||
RFAL_NFCDEP_LR_64 = 0x00, /*!< Maximum payload size is 64 bytes */
|
||||
RFAL_NFCDEP_LR_128 = 0x01, /*!< Maximum payload size is 128 bytes */
|
||||
RFAL_NFCDEP_LR_192 = 0x02, /*!< Maximum payload size is 192 bytes */
|
||||
RFAL_NFCDEP_LR_254 = 0x03 /*!< Maximum payload size is 254 bytes */
|
||||
};
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DATA TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! NFC-DEP callback to check if upper layer has deactivation pending */
|
||||
typedef bool (* rfalNfcDepDeactCallback)(void);
|
||||
|
||||
|
||||
/*! Enumeration of the nfcip communication modes */
|
||||
typedef enum{
|
||||
RFAL_NFCDEP_COMM_PASSIVE, /*!< Passive communication mode */
|
||||
RFAL_NFCDEP_COMM_ACTIVE /*!< Active communication mode */
|
||||
} rfalNfcDepCommMode;
|
||||
|
||||
|
||||
/*! Enumeration of the nfcip roles */
|
||||
typedef enum{
|
||||
RFAL_NFCDEP_ROLE_INITIATOR, /*!< Perform as Initiator */
|
||||
RFAL_NFCDEP_ROLE_TARGET /*!< Perform as Target */
|
||||
} rfalNfcDepRole;
|
||||
|
||||
|
||||
/*! Struct that holds all NFCIP configs */
|
||||
typedef struct{
|
||||
|
||||
rfalNfcDepRole role; /*!< Current NFCIP role */
|
||||
rfalNfcDepCommMode commMode; /*!< Current NFCIP communication mode */
|
||||
uint8_t oper; /*!< Operation config similar to NCI 1.0 Table 81 */
|
||||
|
||||
uint8_t did; /*!< Current Device ID (DID) */
|
||||
uint8_t nad; /*!< Current Node Addressing (NAD) */
|
||||
uint8_t bs; /*!< Bit rate in Sending Direction */
|
||||
uint8_t br; /*!< Bit rate in Receiving Direction */
|
||||
uint8_t nfcid[RFAL_NFCDEP_NFCID3_LEN]; /*!< Pointer to the NFCID to be used */
|
||||
uint8_t nfcidLen; /*!< Length of the given NFCID in nfcid */
|
||||
uint8_t gb[RFAL_NFCDEP_GB_MAX_LEN]; /*!< Pointer General Bytes (GB) to be used */
|
||||
uint8_t gbLen; /*!< Length of the given GB in gb */
|
||||
uint8_t lr; /*!< Length Reduction (LR) to be used */
|
||||
uint8_t to; /*!< Timeout (TO) to be used */
|
||||
uint32_t fwt; /*!< Frame Waiting Time (FWT) to be used */
|
||||
uint32_t dFwt; /*!< Delta Frame Waiting Time (dFWT) to be used */
|
||||
} rfalNfcDepConfigs;
|
||||
|
||||
|
||||
/*! ATR_REQ command Digital 1.1 16.6.2 */
|
||||
typedef struct {
|
||||
uint8_t CMD1; /*!< Command format 0xD4 */
|
||||
uint8_t CMD2; /*!< Command Value */
|
||||
uint8_t NFCID3[RFAL_NFCDEP_NFCID3_LEN]; /*!< NFCID3 value */
|
||||
uint8_t DID; /*!< DID */
|
||||
uint8_t BSi; /*!< Sending Bitrate for Initiator */
|
||||
uint8_t BRi; /*!< Receiving Bitrate for Initiator */
|
||||
uint8_t PPi; /*!< Optional Parameters presence indicator */
|
||||
uint8_t GBi[RFAL_NFCDEP_GB_MAX_LEN]; /*!< General Bytes */
|
||||
} rfalNfcDepAtrReq;
|
||||
|
||||
|
||||
/*! ATR_RES response Digital 1.1 16.6.3 */
|
||||
typedef struct {
|
||||
uint8_t CMD1; /*!< Response Byte 0xD5 */
|
||||
uint8_t CMD2; /*!< Command Value */
|
||||
uint8_t NFCID3[RFAL_NFCDEP_NFCID3_LEN]; /*!< NFCID3 value */
|
||||
uint8_t DID; /*!< DID */
|
||||
uint8_t BSt; /*!< Sending Bitrate for Initiator */
|
||||
uint8_t BRt; /*!< Receiving Bitrate for Initiator */
|
||||
uint8_t TO; /*!< Timeout */
|
||||
uint8_t PPt; /*!< Optional Parameters presence indicator */
|
||||
uint8_t GBt[RFAL_NFCDEP_GB_MAX_LEN]; /*!< General Bytes */
|
||||
} rfalNfcDepAtrRes;
|
||||
|
||||
|
||||
/*! Structure of transmit I-PDU Buffer format from caller */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t prologue[RFAL_NFCDEP_DEPREQ_HEADER_LEN]; /*!< Prologue space for NFC-DEP header*/
|
||||
uint8_t inf[RFAL_FEATURE_NFC_DEP_BLOCK_MAX_LEN]; /*!< INF | Data area of the buffer */
|
||||
} rfalNfcDepBufFormat;
|
||||
|
||||
|
||||
/*! Structure of APDU Buffer format from caller */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t prologue[RFAL_NFCDEP_DEPREQ_HEADER_LEN]; /*!< Prologue/SoD buffer */
|
||||
uint8_t pdu[RFAL_FEATURE_NFC_DEP_PDU_MAX_LEN]; /*!< Complete PDU/Payload buffer */
|
||||
} rfalNfcDepPduBufFormat;
|
||||
|
||||
|
||||
/*! Activation info as Initiator and Target */
|
||||
typedef union { /* PRQA S 0750 # MISRA 19.2 - Both members of the union will not be used concurrently , device is only initiatior or target a time. No problem can occur. */
|
||||
struct {
|
||||
rfalNfcDepAtrRes ATR_RES; /*!< ATR RES (Initiator mode) */
|
||||
uint8_t ATR_RESLen; /*!< ATR RES length (Initiator mode) */
|
||||
}Target; /*!< Target */
|
||||
struct {
|
||||
rfalNfcDepAtrReq ATR_REQ; /*!< ATR REQ (Target mode) */
|
||||
uint8_t ATR_REQLen; /*!< ATR REQ length (Target mode) */
|
||||
}Initiator; /*!< Initiator */
|
||||
} rfalNfcDepActivation;
|
||||
|
||||
|
||||
/*! NFC-DEP device Info */
|
||||
typedef struct {
|
||||
uint8_t GBLen; /*!< General Bytes length */
|
||||
uint8_t WT; /*!< WT to be used (ignored in Listen Mode) */
|
||||
uint32_t FWT; /*!< FWT to be used (1/fc)(ignored Listen Mode) */
|
||||
uint32_t dFWT; /*!< Delta FWT to be used (1/fc) */
|
||||
uint8_t LR; /*!< Length Reduction coding the max payload */
|
||||
uint16_t FS; /*!< Frame Size */
|
||||
rfalBitRate DSI; /*!< Bit Rate coding from Initiator to Target */
|
||||
rfalBitRate DRI; /*!< Bit Rate coding from Target to Initiator */
|
||||
uint8_t DID; /*!< Device ID (RFAL_NFCDEP_DID_NO if no DID) */
|
||||
uint8_t NAD; /*!< Node ADdress (RFAL_NFCDEP_NAD_NO if no NAD)*/
|
||||
} rfalNfcDepInfo;
|
||||
|
||||
|
||||
/*! NFC-DEP Device structure */
|
||||
typedef struct {
|
||||
rfalNfcDepActivation activation; /*!< Activation Info */
|
||||
rfalNfcDepInfo info; /*!< NFC-DEP device Info */
|
||||
} rfalNfcDepDevice;
|
||||
|
||||
|
||||
/*! NFCIP Protocol structure for P2P Target
|
||||
*
|
||||
* operParam : derives from NFC-Forum NCI NFC-DEP Operation Parameter
|
||||
* NCI 1.1 Table 86: NFC-DEP Operation Parameter
|
||||
* and it's a bit mask composed as:
|
||||
* [ 0000b
|
||||
* | Chain SHALL use max. Transport Data Byte[1b]
|
||||
* | I-PDU with no Transport Data SHALL NOT be sent [1b]
|
||||
* | NFC-DEP Target SHALL NOT send RTOX request [1b]
|
||||
* ]
|
||||
*
|
||||
*/
|
||||
typedef struct{
|
||||
rfalNfcDepCommMode commMode; /*!< Initiator in Active P2P or Passive P2P*/
|
||||
uint8_t operParam; /*!< NFC-DEP Operation Parameter */
|
||||
uint8_t* nfcid; /*!< Initiator's NFCID2 or NFCID3 */
|
||||
uint8_t nfcidLen; /*!< Initiator's NFCID length (NFCID2/3) */
|
||||
uint8_t DID; /*!< Initiator's Device ID DID */
|
||||
uint8_t NAD; /*!< Initiator's Node ID NAD */
|
||||
uint8_t BS; /*!< Initiator's Bit Rates supported in Tx */
|
||||
uint8_t BR; /*!< Initiator's Bit Rates supported in Rx */
|
||||
uint8_t LR; /*!< Initiator's Length reduction */
|
||||
uint8_t* GB; /*!< Initiator's General Bytes (Gi) */
|
||||
uint8_t GBLen; /*!< Initiator's General Bytes length */
|
||||
} rfalNfcDepAtrParam;
|
||||
|
||||
|
||||
/*! Structure of parameters to be passed in for nfcDepListenStartActivation */
|
||||
typedef struct
|
||||
{
|
||||
rfalNfcDepBufFormat *rxBuf; /*!< Receive Buffer struct reference */
|
||||
uint16_t *rxLen; /*!< Receive INF data length in bytes */
|
||||
bool *isRxChaining; /*!< Received data is not complete */
|
||||
rfalNfcDepDevice *nfcDepDev; /*!< NFC-DEP device info */
|
||||
} rfalNfcDepListenActvParam;
|
||||
|
||||
|
||||
/*! NFCIP Protocol structure for P2P Target
|
||||
*
|
||||
* operParam : derives from NFC-Forum NCI NFC-DEP Operation Parameter
|
||||
* NCI 1.1 Table 86: NFC-DEP Operation Parameter
|
||||
* and it's a bit mask composed as:
|
||||
* [ 0000b
|
||||
* | Chain SHALL use max. Transport Data Byte[1b]
|
||||
* | I-PDU with no Transport Data SHALL NOT be sent [1b]
|
||||
* | NFC-DEP Target SHALL NOT send RTOX request [1b]
|
||||
* ]
|
||||
*
|
||||
*/
|
||||
typedef struct{
|
||||
rfalNfcDepCommMode commMode; /*!< Target in Active P2P or Passive P2P */
|
||||
uint8_t nfcid3[RFAL_NFCDEP_NFCID3_LEN]; /*!< Target's NFCID3 */
|
||||
uint8_t bst; /*!< Target's Bit Rates supported in Tx */
|
||||
uint8_t brt; /*!< Target's Bit Rates supported in Rx */
|
||||
uint8_t to; /*!< Target's timeout (TO) value */
|
||||
uint8_t ppt; /*!< Target's Presence optional Params(PPt)*/
|
||||
uint8_t GBt[RFAL_NFCDEP_GB_MAX_LEN]; /*!< Target's General Bytes (Gt) */
|
||||
uint8_t GBtLen; /*!< Target's General Bytes length */
|
||||
uint8_t operParam; /*!< NFC-DEP Operation Parameter */
|
||||
} rfalNfcDepTargetParam;
|
||||
|
||||
|
||||
/*! Structure of parameters to be passed in for nfcDepStartIpduTransceive */
|
||||
typedef struct
|
||||
{
|
||||
rfalNfcDepBufFormat *txBuf; /*!< Transmit Buffer struct reference */
|
||||
uint16_t txBufLen; /*!< Transmit Buffer INF field length in bytes */
|
||||
bool isTxChaining; /*!< Transmit data is not complete */
|
||||
rfalNfcDepBufFormat *rxBuf; /*!< Receive Buffer struct reference */
|
||||
uint16_t *rxLen; /*!< Receive INF data length */
|
||||
bool *isRxChaining; /*!< Received data is not complete */
|
||||
uint32_t FWT; /*!< FWT to be used (ignored in Listen Mode) */
|
||||
uint32_t dFWT; /*!< Delta FWT to be used */
|
||||
uint16_t FSx; /*!< Other device Frame Size (FSD or FSC) */
|
||||
uint8_t DID; /*!< Device ID (RFAL_ISODEP_NO_DID if no DID) */
|
||||
} rfalNfcDepTxRxParam;
|
||||
|
||||
|
||||
/*! Structure of parameters used on NFC DEP PDU Transceive */
|
||||
typedef struct
|
||||
{
|
||||
rfalNfcDepPduBufFormat *txBuf; /*!< Transmit Buffer struct reference */
|
||||
uint16_t txBufLen; /*!< Transmit Buffer INF field length in Bytes*/
|
||||
rfalNfcDepPduBufFormat *rxBuf; /*!< Receive Buffer struct reference in Bytes */
|
||||
uint16_t *rxLen; /*!< Received INF data length in Bytes */
|
||||
rfalNfcDepBufFormat *tmpBuf; /*!< Temp buffer for single PDUs (internal) */
|
||||
uint32_t FWT; /*!< FWT to be used (ignored in Listen Mode) */
|
||||
uint32_t dFWT; /*!< Delta FWT to be used */
|
||||
uint16_t FSx; /*!< Other device Frame Size (FSD or FSC) */
|
||||
uint8_t DID; /*!< Device ID (RFAL_ISODEP_NO_DID if no DID) */
|
||||
} rfalNfcDepPduTxRxParam;
|
||||
|
||||
|
||||
/*
|
||||
* *****************************************************************************
|
||||
* GLOBAL VARIABLE DECLARATIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief NFCIP Initialize
|
||||
*
|
||||
* This method resets all NFC-DEP inner states, counters and context and sets
|
||||
* default values
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
void rfalNfcDepInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief Set deactivating callback
|
||||
*
|
||||
* Sets the deactivating callback so that nfcip layer can check if upper layer
|
||||
* has a deactivation pending, and not perform error recovery upon specific
|
||||
* errors
|
||||
*
|
||||
* \param[in] pFunc : method pointer to deactivation flag check
|
||||
******************************************************************************
|
||||
*/
|
||||
void rfalNfcDepSetDeactivatingCallback( rfalNfcDepDeactCallback pFunc );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief Calculate Response Waiting Time
|
||||
*
|
||||
* Calculates the Response Waiting Time (RWT) from the given Waiting Time (WT)
|
||||
*
|
||||
* \param[in] wt : the WT value to calculate RWT
|
||||
*
|
||||
* \return RWT value in 1/fc
|
||||
******************************************************************************
|
||||
*/
|
||||
uint32_t rfalNfcDepCalculateRWT( uint8_t wt );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief NFC-DEP Initiator ATR (Attribute Request)
|
||||
*
|
||||
* This method configures the NFC-DEP layer with given parameters and then
|
||||
* sends an ATR to the Target with and checks for a valid response response
|
||||
*
|
||||
* \param[in] param : parameters to initialize and compose the ATR
|
||||
* \param[out] atrRes : location to store the ATR_RES
|
||||
* \param[out] atrResLen : length of the ATR_RES received
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout occurred
|
||||
* \return RFAL_ERR_PROTO : Protocol error occurred
|
||||
******************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepATR( const rfalNfcDepAtrParam* param, rfalNfcDepAtrRes *atrRes, uint8_t* atrResLen );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief NFC-DEP Initiator PSL (Parameter Selection)
|
||||
*
|
||||
* This method sends a PSL to the Target with the given parameters and checks
|
||||
* for a valid response response
|
||||
*
|
||||
* The parameters must be coded according to Digital 1.1 16.7.1
|
||||
*
|
||||
* \param[in] BRS : the selected Bit Rates for Initiator and Target
|
||||
* \param[in] FSL : the maximum length of Commands and Responses
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout occurred
|
||||
* \return RFAL_ERR_PROTO : Protocol error occurred
|
||||
******************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepPSL( uint8_t BRS, uint8_t FSL );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief NFC-DEP Initiator DSL (Deselect)
|
||||
*
|
||||
* This method checks if the NFCIP module is configured as initiator and if
|
||||
* so sends a DSL REQ, waits the target's response and checks it
|
||||
*
|
||||
* In case of performing as target no action is taken
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout occurred
|
||||
* \return RFAL_ERR_MAX_RERUNS : Timeout occurred
|
||||
* \return RFAL_ERR_PROTO : Protocol error occurred
|
||||
******************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepDSL( void );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief NFC-DEP Initiator RLS (Release)
|
||||
*
|
||||
* This method checks if the NFCIP module is configured as initiator and if
|
||||
* so sends a RLS REQ, waits target's response and checks it
|
||||
*
|
||||
* In case of performing as target no action is taken
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout occurred
|
||||
* \return RFAL_ERR_MAX_RERUNS : Timeout occurred
|
||||
* \return RFAL_ERR_PROTO : Protocol error occurred
|
||||
******************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepRLS( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-DEP Initiator Handle Activation
|
||||
*
|
||||
* This performs a Activation into NFC-DEP layer with the given
|
||||
* parameters. It sends ATR_REQ and if the higher bit rates are supported by
|
||||
* both devices it additionally sends PSL
|
||||
* Once Activated all details of the device are provided on nfcDepDev
|
||||
*
|
||||
* \param[in] param : required parameters to initialize and send ATR_REQ
|
||||
* \param[in] desiredBR : Desired bit rate supported by the Poller
|
||||
* \param[out] nfcDepDev : NFC-DEP information of the activated Listen device
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, activation successful
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepInitiatorHandleActivation( rfalNfcDepAtrParam* param, rfalBitRate desiredBR, rfalNfcDepDevice* nfcDepDev );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief Check if buffer contains valid ATR_REQ
|
||||
*
|
||||
* This method checks if the given ATR_REQ is valid
|
||||
*
|
||||
*
|
||||
* \param[in] buf : buffer holding Initiator's received request
|
||||
* \param[in] bufLen : size of the msg contained on the buf in Bytes
|
||||
* \param[out] nfcid3 : pointer to where the NFCID3 may be outputed,
|
||||
* nfcid3 has NFCF_SENSF_NFCID3_LEN as length
|
||||
* Pass NULL if output parameter not desired
|
||||
*
|
||||
* \return true : Valid ATR_REQ received, the ATR_RES has been computed in txBuf
|
||||
* \return false : Invalid protocol request
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
bool rfalNfcDepIsAtrReq( const uint8_t* buf, uint16_t bufLen, uint8_t* nfcid3 );
|
||||
|
||||
|
||||
/*!
|
||||
******************************************************************************
|
||||
* \brief Check is Target has received ATR
|
||||
*
|
||||
* This method checks if the NFCIP module is configured as target and if a
|
||||
* ATR REQ has been received ( whether is in activation or in data exchange)
|
||||
*
|
||||
* \return true : a ATR has already been received
|
||||
* \return false : no ATR has been received
|
||||
******************************************************************************
|
||||
*/
|
||||
bool rfalNfcDepTargetRcvdATR( void );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFCDEP Start Listen Activation Handling
|
||||
*
|
||||
* Start Activation Handling and setup to receive first frame which may
|
||||
* contain complete or partial DEP-REQ after activation is completed
|
||||
*
|
||||
* Pass in ATR_REQ for NFC-DEP to handle ATR_RES. The Activation Handling
|
||||
* handles ATR_RES and PSL_RES if a PSL_REQ is received
|
||||
*
|
||||
* Activation is completed if PSL_RES is sent or if first I-PDU is received
|
||||
*
|
||||
* \ref rfalNfcDepListenGetActivationStatus() provide status of the
|
||||
* ongoing activation
|
||||
*
|
||||
* \warning nfcDepGetTransceiveStatus() shall be called right after activation
|
||||
* is completed (i.e. rfalNfcDepListenGetActivationStatus() return RFAL_ERR_NONE)
|
||||
* to check for first received frame.
|
||||
*
|
||||
* \param[in] param : Target parameters to be used
|
||||
* \param[in] atrReq : reference to buffer containing ATR_REQ
|
||||
* \param[in] atrReqLength: Length of ATR_REQ
|
||||
* \param[out] rxParam : references to buffer, length and chaining indication
|
||||
* for first complete LLCP to be received
|
||||
*
|
||||
* \return RFAL_ERR_NONE : ATR_REQ is valid and activation ongoing
|
||||
* \return RFAL_ERR_PARAM : ATR_REQ or other params are invalid
|
||||
* \return RFAL_ERR_LINK_LOSS : Remote Field is turned off
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepListenStartActivation( const rfalNfcDepTargetParam *param, const uint8_t *atrReq, uint16_t atrReqLength, rfalNfcDepListenActvParam rxParam );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Get the current NFC-DEP Activation Status
|
||||
*
|
||||
* \return RFAL_ERR_NONE : Activation has completed successfully
|
||||
* \return RFAL_ERR_BUSY : Activation is ongoing
|
||||
* \return RFAL_ERR_LINK_LOSS : Remote Field was turned off
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepListenGetActivationStatus( void );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Start Transceive
|
||||
*
|
||||
* Transceives a complete or partial DEP block
|
||||
*
|
||||
* The txBuf contains complete or partial of DEP to be transmitted.
|
||||
* The Prologue field of the I-PDU is handled internally
|
||||
*
|
||||
* If the buffer contains partial LLCP and is not the last block, then
|
||||
* isTxChaining must be set to true
|
||||
*
|
||||
* \param[in] param: reference parameters to be used for the Transceive
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Bad request
|
||||
* \return RFAL_ERR_WRONG_STATE : The module is not in a proper state
|
||||
* \return RFAL_ERR_NONE : The Transceive request has been started
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepStartTransceive( const rfalNfcDepTxRxParam *param );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Return the Transceive status
|
||||
*
|
||||
* Returns the status of the NFC-DEP Transceive
|
||||
*
|
||||
* \warning When the other device is performing chaining once a chained
|
||||
* block is received the error RFAL_ERR_AGAIN is sent. At this point
|
||||
* caller must handle the received data immediately.
|
||||
* When RFAL_ERR_AGAIN is returned an ACK has already been sent to
|
||||
* the other device and the next block might be incoming.
|
||||
* If rfalWorker() is called frequently it will place the next
|
||||
* block on the given buffer
|
||||
*
|
||||
* \return RFAL_ERR_NONE : Transceive has been completed successfully
|
||||
* \return RFAL_ERR_BUSY : Transceive is ongoing
|
||||
* \return RFAL_ERR_PROTO : Protocol error occurred
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error occurred
|
||||
* \return RFAL_ERR_SLEEP_REQ : Deselect has been received and responded
|
||||
* \return RFAL_ERR_NOMEM : The received I-PDU does not fit into the
|
||||
* receive buffer
|
||||
* \return RFAL_ERR_LINK_LOSS : Communication is lost because Reader/Writer
|
||||
* has turned off its field
|
||||
* \return RFAL_ERR_AGAIN : received one chaining block, continue to call
|
||||
* this method to retrieve the remaining blocks
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepGetTransceiveStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Start PDU Transceive
|
||||
*
|
||||
* This method triggers a NFC-DEP Transceive containing a complete PDU
|
||||
* It transmits the given message and handles all protocol retransmitions,
|
||||
* error handling and control messages
|
||||
*
|
||||
* The txBuf contains a complete PDU to be transmitted
|
||||
* The Prologue field will be manipulated by the Transceive
|
||||
*
|
||||
* \warning the txBuf will be modified during the transmission
|
||||
* \warning the maximum RF frame which can be received is limited by param.tmpBuf
|
||||
*
|
||||
* \param[in] param: reference parameters to be used for the Transceive
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Bad request
|
||||
* \return RFAL_ERR_WRONG_STATE : The module is not in a proper state
|
||||
* \return RFAL_ERR_NONE : The Transceive request has been started
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepStartPduTransceive( rfalNfcDepPduTxRxParam param );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Return the PDU Transceive status
|
||||
*
|
||||
* Returns the status of the NFC-DEP PDU Transceive
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_NONE : Transceive has been completed successfully
|
||||
* \return RFAL_ERR_BUSY : Transceive is ongoing
|
||||
* \return RFAL_ERR_PROTO : Protocol error occurred
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error occurred
|
||||
* \return RFAL_ERR_SLEEP_REQ : Deselect has been received and responded
|
||||
* \return RFAL_ERR_NOMEM : The received I-PDU does not fit into the
|
||||
* receive buffer
|
||||
* \return RFAL_ERR_LINK_LOSS : Communication is lost because Reader/Writer
|
||||
* has turned off its field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcDepGetPduTransceiveStatus( void );
|
||||
|
||||
#endif /* RFAL_NFCDEP_H_ */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,538 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_nfca.h
|
||||
* @brief : Provides several NFC-A convenience methods and definitions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFCA_H
|
||||
#define RFAL_NFCA_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected one or more device in the field
|
||||
* \return RFAL_ERR_PAR : Parity error detected, one or more device in the field
|
||||
* \return RFAL_ERR_CRC : CRC error detected, one or more device in the field
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected, one or more device in the field
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected, one or more device in the field
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, SEL_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerSelect( const uint8_t *nfcid1, uint8_t nfcidLen, rfalNfcaSelRes *selRes );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A Poller Start Select
|
||||
*
|
||||
* This method starts the selection of 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, SEL_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerStartSelect( const uint8_t *nfcid1, uint8_t nfcidLen, rfalNfcaSelRes *selRes );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A Poller Get Select Status
|
||||
*
|
||||
* This method gets the selection status
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, SEL_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerGetSelectStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerSleep( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A Poller Start Sleep
|
||||
*
|
||||
* This method sends a SLP_REQ (HLTA)
|
||||
* No response is expected afterwards Digital 1.1 6.9.2.1
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerStartSleep( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A Poller Get Sleep Status
|
||||
*
|
||||
* Returns the Sleep status
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerGetSleepStatus( 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerTechnologyDetection( rfalComplianceMode compMode, rfalNfcaSensRes *sensRes );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A Start Technology Detection
|
||||
*
|
||||
* This method starts 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerStartTechnologyDetection( rfalComplianceMode compMode, rfalNfcaSensRes *sensRes );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A Get Technology Detection Status
|
||||
*
|
||||
* Returns the Technology Detection status
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcaPollerGetTechnologyDetectionStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_PROTO : Card length invalid
|
||||
* \return RFAL_ERR_IGNORE : conDevLimit is 0 and there is a collision
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_BUSY : Operation is ongoing
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_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 */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,566 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_nfcb.h
|
||||
* Description : Implementation of NFC-B (ISO14443B) helpers
|
||||
*
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFCB_H
|
||||
#define RFAL_NFCB_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_NFCB_FWTSENSB 7680U /*!< NFC-B FWT(SENSB) Digital 2.0 B.3 */
|
||||
#define RFAL_NFCB_DFWT 49152U /*!< NFC-B dFWT Delta 2.0 7.9.1.3 & B.3 */
|
||||
#define RFAL_NFCB_DTPOLL_10 rfalConvMsTo1fc(20) /*!< NFC-B Delta Tb Poll Digital 1.0 A.2 */
|
||||
#define RFAL_NFCB_DTPOLL_20 rfalConvMsTo1fc(17) /*!< NFC-B Delta Tb Poll Digital 2.1 B.3 */
|
||||
|
||||
#define RFAL_NFCB_AFI 0x00U /*!< NFC-B default Application Family Digital 1.1 7.6.1.1 */
|
||||
#define RFAL_NFCB_PARAM 0x00U /*!< NFC-B default SENSB_REQ PARAM */
|
||||
#define RFAL_NFCB_CRC_LEN 2U /*!< NFC-B CRC length and CRC_B(AID) Digital 1.1 Table 28 */
|
||||
#define RFAL_NFCB_NFCID0_LEN 4U /*!< Length of NFC-B NFCID0 */
|
||||
#define RFAL_NFCB_CMD_LEN 1U /*!< Length of NFC-B Command */
|
||||
|
||||
#define RFAL_NFCB_SENSB_RES_LEN 12U /*!< Standard length of SENSB_RES without SFGI byte */
|
||||
#define RFAL_NFCB_SENSB_RES_EXT_LEN 13U /*!< Extended length of SENSB_RES with SFGI byte */
|
||||
|
||||
#define RFAL_NFCB_SENSB_REQ_ADV_FEATURE 0x20U /*!< Bit mask for Advance Feature in SENSB_REQ */
|
||||
#define RFAL_NFCB_SENSB_RES_FSCI_MASK 0x0FU /*!< Bit mask for FSCI value in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_FSCI_SHIFT 4U /*!< Shift for FSCI value in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_PROTO_RFU_MASK 0x08U /*!< Bit mask for Protocol Type RFU in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK 0x03U /*!< Bit mask for Protocol Type TR2 in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_PROTO_TR2_SHIFT 1U /*!< Shift for Protocol Type TR2 in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK 0x01U /*!< Bit mask Protocol Type ISO14443 Compliant in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_FWI_MASK 0x0FU /*!< Bit mask for FWI value in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_FWI_SHIFT 4U /*!< Bit mask for FWI value in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_ADC_MASK 0x0CU /*!< Bit mask for ADC value in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_ADC_ADV_FEATURE_MASK 0x08U /*!< Bit mask for ADC.Advanced Proto Features in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_ADC_PROPRIETARY_MASK 0x04U /*!< Bit mask for ADC.Proprietary Application in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_FO_DID_MASK 0x01U /*!< Bit mask for DID in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_FO_NAD_MASK 0x02U /*!< Bit mask for DID in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_FO_MASK 0x03U /*!< Bit mask for FO value in SENSB_RES (NAD and DID) */
|
||||
#define RFAL_NFCB_SENSB_RES_SFGI_MASK 0x0FU /*!< Bit mask for SFGI in SENSB_RES */
|
||||
#define RFAL_NFCB_SENSB_RES_SFGI_SHIFT 4U /*!< Shift for SFGI in SENSB_RES */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Get device's FSCI given its SENSB_RES Digital 1.1 7.6.2 */
|
||||
#define rfalNfcbGetFSCI( sensbRes ) ((((rfalNfcbSensbRes*)(sensbRes))->protInfo.FsciProType >> RFAL_NFCB_SENSB_RES_FSCI_SHIFT) & RFAL_NFCB_SENSB_RES_FSCI_MASK )
|
||||
|
||||
/*! Checks if the given NFC-B device indicates ISO-DEP support */
|
||||
#define rfalNfcbIsIsoDepSupported( dev ) ( (((rfalNfcbListenDevice*)(dev))->sensbRes.protInfo.FsciProType & RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK) != 0U )
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! SENSB_REQ and ALLB_REQ param Digital 1.1 7.6.1 */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_NFCB_SENS_CMD_ALLB_REQ = 0x08, /*!< ALLB_REQ (WUPB) */
|
||||
RFAL_NFCB_SENS_CMD_SENSB_REQ = 0x00 /*!< SENSB_REQ (REQB) */
|
||||
} rfalNfcbSensCmd;
|
||||
|
||||
|
||||
/*! Number of Slots (NI) codes used for NFC-B anti collision Digital 1.1 Table 26 */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_NFCB_SLOT_NUM_1 = 0, /*!< N=0 : 1 slot */
|
||||
RFAL_NFCB_SLOT_NUM_2 = 1, /*!< N=1 : 2 slots */
|
||||
RFAL_NFCB_SLOT_NUM_4 = 2, /*!< N=2 : 4 slots */
|
||||
RFAL_NFCB_SLOT_NUM_8 = 3, /*!< N=3 : 8 slots */
|
||||
RFAL_NFCB_SLOT_NUM_16 = 4 /*!< N=4 : 16 slots */
|
||||
}rfalNfcbSlots;
|
||||
|
||||
|
||||
/*! SENSB_RES (ATQB) Application Data Format Digital 1.1 Table 28 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t AFI; /*!< Application Family Identifier */
|
||||
uint8_t CRC_B[RFAL_NFCB_CRC_LEN]; /*!< CRC_B of AID */
|
||||
uint8_t numApps; /*!< Number of Applications */
|
||||
} rfalNfcbSensbResAppData;
|
||||
|
||||
|
||||
/*! SENSB_RES Protocol Info format Digital 1.1 Table 29 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t BRC; /*!< Bit Rate Capability */
|
||||
uint8_t FsciProType; /*!< Frame Size Card Integer [4b] | Protocol Type[4 bits] */
|
||||
uint8_t FwiAdcFo; /*!< Frame Waiting Integer [4b] | Application Data Coding [2b] | Frame Options [2b] */
|
||||
uint8_t SFGI; /*!< Optional: Start-Up Frame Guard Time Integer[4b] | RFU [4b] */
|
||||
} rfalNfcbSensbResProtocolInfo;
|
||||
|
||||
|
||||
/*! SENSB_RES format Digital 1.1 7.6.2 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< SENSB_RES: 50h */
|
||||
uint8_t nfcid0[RFAL_NFCB_NFCID0_LEN]; /*!< NFC Identifier (PUPI)*/
|
||||
rfalNfcbSensbResAppData appData; /*!< Application Data */
|
||||
rfalNfcbSensbResProtocolInfo protInfo; /*!< Protocol Information */
|
||||
} rfalNfcbSensbRes;
|
||||
|
||||
|
||||
/*! NFC-B listener device (PICC) struct */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t sensbResLen; /*!< SENSB_RES length */
|
||||
rfalNfcbSensbRes sensbRes; /*!< SENSB_RES */
|
||||
bool isSleep; /*!< Device sleeping flag */
|
||||
}rfalNfcbListenDevice;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize NFC-B Poller mode
|
||||
*
|
||||
* This methods configures RFAL RF layer to perform as a
|
||||
* NFC-B Poller/RW (ISO14443B PCD) including all default timings
|
||||
*
|
||||
* It sets NFC-B parameters (AFI, PARAM) to default values
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Set NFC-B Poller parameters
|
||||
*
|
||||
* This methods configures RFAL RF layer to perform as a
|
||||
* NFCA Poller/RW (ISO14443A PCD) including all default timings
|
||||
*
|
||||
* Additionally configures NFC-B specific parameters to be used on the
|
||||
* following communications
|
||||
*
|
||||
* \param[in] AFI : Application Family Identifier to be used
|
||||
* \param[in] PARAM : PARAM to be used, it announces whether Advanced
|
||||
* Features or Extended SENSB_RES is supported
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerInitializeWithParams( uint8_t AFI, uint8_t PARAM );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Check Presence
|
||||
*
|
||||
* This method checks if a NFC-B Listen device (PICC) is present on the field
|
||||
* by sending an ALLB_REQ (WUPB) or SENSB_REQ (REQB)
|
||||
*
|
||||
* \param[in] cmd : Indicate if to send an ALLB_REQ or a SENSB_REQ
|
||||
* \param[in] slots : The number of slots to be announced
|
||||
* \param[out] sensbRes : If received, the SENSB_RES
|
||||
* \param[out] sensbResLen : If received, the SENSB_RES length
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected one or more device in the field
|
||||
* \return RFAL_ERR_PAR : Parity error detected, one or more device in the field
|
||||
* \return RFAL_ERR_CRC : CRC error detected, one or more device in the field
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected, one or more device in the field
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected, invalid SENSB_RES received
|
||||
* \return RFAL_ERR_NONE : No error, SENSB_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerCheckPresence( rfalNfcbSensCmd cmd, rfalNfcbSlots slots, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Start Check Presence
|
||||
*
|
||||
* This method starts check for a NFC-B Listen device (PICC) presence on the field
|
||||
* by sending an ALLB_REQ (WUPB) or SENSB_REQ (REQB)
|
||||
*
|
||||
* \param[in] cmd : Indicate if to send an ALL_REQ or a SENS_REQ
|
||||
* \param[in] slots : The number of slots to be announced
|
||||
* \param[out] sensbRes : If received, the SENSB_RES
|
||||
* \param[out] sensbResLen : If received, the SENSB_RES length
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, SENSB_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerStartCheckPresence( rfalNfcbSensCmd cmd, rfalNfcbSlots slots, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Get Check Presence Status
|
||||
*
|
||||
* This method get the presence check status
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected one or more device in the field
|
||||
* \return RFAL_ERR_PAR : Parity error detected, one or more device in the field
|
||||
* \return RFAL_ERR_CRC : CRC error detected, one or more device in the field
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected, one or more device in the field
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected, invalid SENSB_RES received
|
||||
* \return RFAL_ERR_NONE : No error, SENSB_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerGetCheckPresenceStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Sleep
|
||||
*
|
||||
* This function is used to send the SLPB_REQ (HLTB) command to put the PICC with
|
||||
* the given NFCID0 to state HALT so that they do not reply to further SENSB_REQ
|
||||
* commands (only to ALLB_REQ)
|
||||
*
|
||||
* \param[in] nfcid0 : NFCID of the device to be put to Sleep
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerSleep( const uint8_t* nfcid0 );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Slot Marker
|
||||
*
|
||||
* This method sends a NFC-B Slot marker frame
|
||||
*
|
||||
* \param[in] slotCode : Slot Code [1-15]
|
||||
* \param[out] sensbRes : If received, the SENSB_RES
|
||||
* \param[out] sensbResLen : If received, the SENSB_RES length
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, SEL_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerSlotMarker( uint8_t slotCode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Start Slot Marker
|
||||
*
|
||||
* This method starts a NFC-B Slot marker
|
||||
*
|
||||
* \param[in] slotCode : Slot Code [1-15]
|
||||
* \param[out] sensbRes : If received, the SENSB_RES
|
||||
* \param[out] sensbResLen : If received, the SENSB_RES length
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, SEL_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerStartSlotMarker( uint8_t slotCode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Get Slot Marker Status
|
||||
*
|
||||
* This method gets the status of the NFC-B Slot marker
|
||||
*
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, SEL_RES received
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerGetSlotMarkerStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Technology Detection
|
||||
*
|
||||
* This method performs NFC-B Technology Detection as defined in the spec
|
||||
* given in the compliance mode
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[out] sensbRes : location to store the SENSB_RES, if received
|
||||
* \param[out] sensbResLen : length of the SENSB_RES, if received
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerTechnologyDetection( rfalComplianceMode compMode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Start Technology Detection
|
||||
*
|
||||
* This method starts the NFC-B Technology Detection as defined in the spec
|
||||
* given in the compliance mode
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[out] sensbRes : location to store the SENSB_RES, if received
|
||||
* \param[out] sensbResLen : length of the SENSB_RES, if received
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerStartTechnologyDetection( rfalComplianceMode compMode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Get Technology Detection Status
|
||||
*
|
||||
* This method gets the NFC-B Technology Detection status
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerGetTechnologyDetectionStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Collision Resolution
|
||||
*
|
||||
* NFC-B Collision resolution Listener device/card (PICC) as
|
||||
* defined in Activity 1.1 9.3.5
|
||||
*
|
||||
* This function is used to perform collision resolution for detection in case
|
||||
* of multiple NFC Forum Devices with Technology B detected.
|
||||
* Target with valid SENSB_RES will be stored in nfcbDevList and devCnt incremented.
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[in] devLimit : device limit value, and size nfcbDevList
|
||||
* \param[out] nfcbDevList : NFC-B listener device info
|
||||
* \param[out] devCnt : devices found counter
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Collision Resolution Slotted
|
||||
*
|
||||
* NFC-B Collision resolution Listener device/card (PICC). The sequence can
|
||||
* be configured to be according to NFC Forum Activity 1.1 9.3.5, ISO10373
|
||||
* or EMVCo
|
||||
*
|
||||
* This function is used to perform collision resolution for detection in case
|
||||
* of multiple NFC Forum Devices with Technology B are detected.
|
||||
* Target with valid SENSB_RES will be stored in nfcbDevList and devCnt incremented.
|
||||
*
|
||||
* This method provides the means to perform a collision resolution loop with specific
|
||||
* initial and end number of slots. This allows to user to start the loop already with
|
||||
* greater number of slots, and or limit the end number of slots. At the end a flag
|
||||
* indicating whether there were collisions pending is returned.
|
||||
*
|
||||
* If RFAL_COMPLIANCE_MODE_ISO is used \a initSlots must be set to RFAL_NFCB_SLOT_NUM_1
|
||||
*
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[in] devLimit : device limit value, and size nfcbDevList
|
||||
* \param[in] initSlots : number of slots to open initially
|
||||
* \param[in] endSlots : number of slots when to stop collision resolution
|
||||
* \param[out] nfcbDevList : NFC-B listener device info
|
||||
* \param[out] devCnt : devices found counter
|
||||
* \param[out] colPending : flag indicating whether collision are still pending
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerSlottedCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbSlots initSlots, rfalNfcbSlots endSlots, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt, bool *colPending );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Start Collision Resolution
|
||||
*
|
||||
* It starts the NFC-B Collision resolution Listener device/card (PICC) as
|
||||
* defined in Activity 1.1 9.3.5
|
||||
*
|
||||
* This function is used to trigger the collision resolution for detection in case
|
||||
* of multiple NFC Forum Devices with Technology B detected.
|
||||
* Target with valid SENSB_RES will be stored in nfcbDevList and devCnt incremented.
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[in] devLimit : device limit value, and size nfcbDevList
|
||||
* \param[out] nfcbDevList : NFC-B listener device info
|
||||
* \param[out] devCnt : devices found counter
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerStartCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Poller Start Collision Resolution Slotted
|
||||
*
|
||||
* Starts NFC-B Collision resolution Listener device/card (PICC). The sequence can
|
||||
* be configured to be according to NFC Forum Activity 1.1 9.3.5, ISO10373
|
||||
* or EMVCo
|
||||
*
|
||||
* This function is used to trigger the collision resolution for detection in case
|
||||
* of multiple NFC Forum Devices with Technology B are detected.
|
||||
* Target with valid SENSB_RES will be stored in nfcbDevList and devCnt incremented.
|
||||
*
|
||||
* This method provides the means to perform a collision resolution loop with specific
|
||||
* initial and end number of slots. This allows to user to start the loop already with
|
||||
* greater number of slots, and or limit the end number of slots. At the end a flag
|
||||
* indicating whether there were collisions pending is returned.
|
||||
*
|
||||
* If RFAL_COMPLIANCE_MODE_ISO is used \a initSlots must be set to RFAL_NFCB_SLOT_NUM_1
|
||||
*
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[in] devLimit : device limit value, and size nfcbDevList
|
||||
* \param[in] initSlots : number of slots to open initially
|
||||
* \param[in] endSlots : number of slots when to stop collision resolution
|
||||
* \param[out] nfcbDevList : NFC-B listener device info
|
||||
* \param[out] devCnt : devices found counter
|
||||
* \param[out] colPending : flag indicating whether collision are still pending
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerStartSlottedCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbSlots initSlots, rfalNfcbSlots endSlots, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt, bool *colPending );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B Get Collision Resolution Status
|
||||
*
|
||||
* Returns the Collision Resolution status
|
||||
*
|
||||
* \return RFAL_ERR_BUSY : Operation is ongoing
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_PAR : Parity error detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error, activation successful
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcbPollerGetCollisionResolutionStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-B TR2 code to FDT
|
||||
*
|
||||
* Converts the TR2 code as defined in Digital 1.1 Table 33 Minimum
|
||||
* TR2 Coding to Frame Delay Time (FDT) in 1/Fc
|
||||
*
|
||||
* \param[in] tr2Code : TR2 code as defined in Digital 1.1 Table 33
|
||||
*
|
||||
* \return FDT in 1/Fc
|
||||
*****************************************************************************
|
||||
*/
|
||||
uint32_t rfalNfcbTR2ToFDT( uint8_t tr2Code );
|
||||
|
||||
#endif /* RFAL_NFCB_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,428 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_nfcf.h
|
||||
* Description : Implementation of NFC-F Poller (FeliCa PCD) device
|
||||
* The definitions and helpers methods provided by this module are
|
||||
* aligned with NFC-F (FeliCa - JIS X6319-4)
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFCF_H
|
||||
#define RFAL_NFCF_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_NFCF_NFCID2_LEN 8U /*!< NFCID2 (FeliCa IDm) length */
|
||||
#define RFAL_NFCF_SENSF_RES_LEN_MIN 16U /*!< SENSF_RES minimum length */
|
||||
#define RFAL_NFCF_SENSF_RES_LEN_MAX 18U /*!< SENSF_RES maximum length */
|
||||
#define RFAL_NFCF_SENSF_RES_PAD0_LEN 2U /*!< SENSF_RES PAD0 length */
|
||||
#define RFAL_NFCF_SENSF_RES_PAD1_LEN 3U /*!< SENSF_RES PAD1 length */
|
||||
#define RFAL_NFCF_SENSF_RES_RD_LEN 2U /*!< SENSF_RES Request Data length */
|
||||
#define RFAL_NFCF_SENSF_RES_BYTE1 1U /*!< SENSF_RES first byte value */
|
||||
#define RFAL_NFCF_SENSF_SC_LEN 2U /*!< Felica SENSF_REQ System Code length */
|
||||
#define RFAL_NFCF_SENSF_PARAMS_SC1_POS 0U /*!< System Code byte1 position in the SENSF_REQ */
|
||||
#define RFAL_NFCF_SENSF_PARAMS_SC2_POS 1U /*!< System Code byte2 position in the SENSF_REQ */
|
||||
#define RFAL_NFCF_SENSF_PARAMS_RC_POS 2U /*!< Request Code position in the SENSF_REQ */
|
||||
#define RFAL_NFCF_SENSF_PARAMS_TSN_POS 3U /*!< Time Slot Number position in the SENSF_REQ */
|
||||
#define RFAL_NFCF_POLL_MAXCARDS 16U /*!< Max number slots/cards 16 */
|
||||
|
||||
|
||||
#define RFAL_NFCF_CMD_POS 0U /*!< Command/Responce code length */
|
||||
#define RFAL_NFCF_CMD_LEN 1U /*!< Command/Responce code length */
|
||||
#define RFAL_NFCF_LENGTH_LEN 1U /*!< LEN field length */
|
||||
#define RFAL_NFCF_HEADER_LEN (RFAL_NFCF_LENGTH_LEN + RFAL_NFCF_CMD_LEN) /*!< Header length */
|
||||
|
||||
#define RFAL_NFCF_NOS_LEN 1U /*!< Number of Services length */
|
||||
#define RFAL_NFCF_NOB_LEN 1U /*!< Number of Blocks length */
|
||||
|
||||
|
||||
#define RFAL_NFCF_SENSF_NFCID2_BYTE1_POS 0U /*!< NFCID2 byte1 position */
|
||||
#define RFAL_NFCF_SENSF_NFCID2_BYTE2_POS 1U /*!< NFCID2 byte2 position */
|
||||
|
||||
#define RFAL_NFCF_SENSF_NFCID2_PROT_TYPE_LEN 2U /*!< NFCID2 length for byte 1 and byte 2 indicating NFC-DEP or T3T support */
|
||||
#define RFAL_NFCF_SENSF_NFCID2_BYTE1_NFCDEP 0x01U /*!< NFCID2 byte1 NFC-DEP support Digital 1.0 Table 44 */
|
||||
#define RFAL_NFCF_SENSF_NFCID2_BYTE2_NFCDEP 0xFEU /*!< NFCID2 byte2 NFC-DEP support Digital 1.0 Table 44 */
|
||||
|
||||
#define RFAL_NFCF_SYSTEMCODE 0xFFFFU /*!< SENSF_RES Default System Code Digital 2.3 8.6.1.5 */
|
||||
#define RFAL_NFCF_SYSTEMCODE_LEN 2U /*!< SENSF_RES System Code length Digital 2.3 8.6.1 */
|
||||
|
||||
#define RFAL_NFCF_BLOCK_LEN 16U /*!< NFCF T3T Block size T3T 1.0 4.1 */
|
||||
#define RFAL_NFCF_CHECKUPDATE_RES_ST1_POS 9U /*!< Check|Update Res Status Flag 1 position T3T 1.0 Table 8 */
|
||||
#define RFAL_NFCF_CHECKUPDATE_RES_ST2_POS 10U /*!< Check|Update Res Status Flag 2 position T3T 1.0 Table 8 */
|
||||
#define RFAL_NFCF_CHECKUPDATE_RES_NOB_POS 11U /*!< Check|Update Res Number of Blocks position T3T 1.0 Table 8 */
|
||||
|
||||
#define RFAL_NFCF_STATUS_FLAG_SUCCESS 0x00U /*!< Check response Number of Blocks position T3T 1.0 Table 11 */
|
||||
#define RFAL_NFCF_STATUS_FLAG_ERROR 0xFFU /*!< Check response Number of Blocks position T3T 1.0 Table 11 */
|
||||
|
||||
#define RFAL_NFCF_BLOCKLISTELEM_MAX_LEN 3U /*!< Block List Element max Length (3 bytes) T3T 1.0 5.6.1 */
|
||||
#define RFAL_NFCF_BLOCKLISTELEM_LEN_BIT 0x80U /*!< Block List Element Length bit (2|3 bytes) T3T 1.0 5.6.1 */
|
||||
|
||||
#define RFAL_NFCF_SERVICECODE_RDONLY 0x000BU /*!< NDEF Service Code as Read-Only T3T 1.0 7.2.1 */
|
||||
#define RFAL_NFCF_SERVICECODE_RDWR 0x0009U /*!< NDEF Service Code as Read and Write T3T 1.0 7.2.1 */
|
||||
|
||||
#define RFAL_NFCF_TEST_LB_CMD0 0xD8U /*!< T3T loopback CMD0 ETSI TS 102 695-1 5.6.4.4.2 */
|
||||
#define RFAL_NFCF_TEST_LB_CMD1 0x00U /*!< T3T loopback CMD1 ETSI TS 102 695-1 5.6.4.4.2 */
|
||||
|
||||
|
||||
/*! NFC-F Felica command set JIS X6319-4 9.1 */
|
||||
enum
|
||||
{
|
||||
RFAL_NFCF_CMD_POLLING = 0x00, /*!< SENSF_REQ (Felica Poll/REQC command to identify a card ) */
|
||||
RFAL_NFCF_CMD_POLLING_RES = 0x01, /*!< SENSF_RES (Felica Poll/REQC command response ) */
|
||||
RFAL_NFCF_CMD_REQUEST_SERVICE = 0x02, /*!< verify the existence of Area and Service */
|
||||
RFAL_NFCF_CMD_REQUEST_RESPONSE = 0x04, /*!< verify the existence of a card */
|
||||
RFAL_NFCF_CMD_READ_WITHOUT_ENCRYPTION = 0x06, /*!< read Block Data from a Service that requires no authentication */
|
||||
RFAL_NFCF_CMD_READ_WITHOUT_ENCRYPTION_RES = 0x07, /*!< read Block Data response from a Service with no authentication */
|
||||
RFAL_NFCF_CMD_WRITE_WITHOUT_ENCRYPTION = 0x08, /*!< write Block Data to a Service that requires no authentication */
|
||||
RFAL_NFCF_CMD_WRITE_WITHOUT_ENCRYPTION_RES = 0x09, /*!< write Block Data response to a Service with no authentication */
|
||||
RFAL_NFCF_CMD_REQUEST_SYSTEM_CODE = 0x0c, /*!< acquire the System Code registered to a card */
|
||||
RFAL_NFCF_CMD_AUTHENTICATION1 = 0x10, /*!< authenticate a card */
|
||||
RFAL_NFCF_CMD_AUTHENTICATION2 = 0x12, /*!< allow a card to authenticate a Reader/Writer */
|
||||
RFAL_NFCF_CMD_READ = 0x14, /*!< read Block Data from a Service that requires authentication */
|
||||
RFAL_NFCF_CMD_WRITE = 0x16, /*!< write Block Data to a Service that requires authentication */
|
||||
};
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Checks if the given NFC-F device indicates NFC-DEP support */
|
||||
#define rfalNfcfIsNfcDepSupported( dev ) ( (((rfalNfcfListenDevice*)(dev))->sensfRes.NFCID2[RFAL_NFCF_SENSF_NFCID2_BYTE1_POS] == RFAL_NFCF_SENSF_NFCID2_BYTE1_NFCDEP) && \
|
||||
(((rfalNfcfListenDevice*)(dev))->sensfRes.NFCID2[RFAL_NFCF_SENSF_NFCID2_BYTE2_POS] == RFAL_NFCF_SENSF_NFCID2_BYTE2_NFCDEP) )
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*! NFC-F SENSF_RES format Digital 1.1 8.6.2 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t CMD; /*!< Command Code: 01h */
|
||||
uint8_t NFCID2[RFAL_NFCF_NFCID2_LEN]; /*!< NFCID2 */
|
||||
uint8_t PAD0[RFAL_NFCF_SENSF_RES_PAD0_LEN]; /*!< PAD0 */
|
||||
uint8_t PAD1[RFAL_NFCF_SENSF_RES_PAD1_LEN]; /*!< PAD1 */
|
||||
uint8_t MRTIcheck; /*!< MRTIcheck */
|
||||
uint8_t MRTIupdate; /*!< MRTIupdate */
|
||||
uint8_t PAD2; /*!< PAD2 */
|
||||
uint8_t RD[RFAL_NFCF_SENSF_RES_RD_LEN]; /*!< Request Data */
|
||||
} rfalNfcfSensfRes;
|
||||
|
||||
|
||||
/*! NFC-F poller device (PCD) struct */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t NFCID2[RFAL_NFCF_NFCID2_LEN]; /*!< NFCID2 */
|
||||
} rfalNfcfPollDevice;
|
||||
|
||||
/*! NFC-F listener device (PICC) struct */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t sensfResLen; /*!< SENF_RES length */
|
||||
rfalNfcfSensfRes sensfRes; /*!< SENF_RES */
|
||||
} rfalNfcfListenDevice;
|
||||
|
||||
typedef uint16_t rfalNfcfServ; /*!< NFC-F Service Code */
|
||||
|
||||
/*! NFC-F Block List Element (2 or 3 bytes element) T3T 1.0 5.6.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t conf; /*!< Access Mode | Serv Code List Order */
|
||||
uint16_t blockNum; /*!< Block Number */
|
||||
}rfalNfcfBlockListElem;
|
||||
|
||||
/*! Check Update Service list and Block list parameter */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t numServ; /*!< Number of Services */
|
||||
rfalNfcfServ *servList; /*!< Service Code List */
|
||||
uint8_t numBlock; /*!< Number of Blocks */
|
||||
rfalNfcfBlockListElem *blockList; /*!< Block Number List */
|
||||
}rfalNfcfServBlockListParam;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize NFC-F Poller mode
|
||||
*
|
||||
* This methods configures RFAL RF layer to perform as a
|
||||
* NFC-F Poller/RW (FeliCa PCD) including all default timings
|
||||
*
|
||||
* \param[in] bitRate : NFC-F bitrate to be initialize (212 or 424)
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Incorrect bitrate
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerInitialize( rfalBitRate bitRate );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Check Presence
|
||||
*
|
||||
* This function sends a Poll/SENSF command according to NFC Activity spec
|
||||
* It detects if a NCF-F device is within range
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_NONE : No error and some NFC-F device was detected
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerCheckPresence( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Start Check Presence
|
||||
*
|
||||
* This function triggers a Poll/SENSF command according to NFC Activity spec
|
||||
* It detects if a NCF-F device is within range
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_NONE : No error and some NFC-F device was detected
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerStartCheckPresence( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Get Check Presence Status
|
||||
*
|
||||
* This function gets the status of the Check Presense operation
|
||||
* triggered by rfalNfcfPollerStartCheckPresence()
|
||||
*
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_NONE : No error and some NFC-F device was detected
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerGetCheckPresenceStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Poll
|
||||
*
|
||||
* This function sends to all PICCs in field the POLL command with the given
|
||||
* number of slots.
|
||||
*
|
||||
* \param[in] slots : the number of slots to be performed
|
||||
* \param[in] sysCode : as given in FeliCa poll command
|
||||
* \param[in] reqCode : FeliCa communication parameters
|
||||
* \param[out] cardList : Parameter of type rfalFeliCaPollRes which will hold the cards found
|
||||
* \param[out] devCnt : actual number of cards found
|
||||
* \param[out] collisions : number of collisions encountered
|
||||
*
|
||||
* \warning the list cardList has to be as big as the number of slots for the Poll
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_NONE : No error and some NFC-F device was detected
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerPoll( rfalFeliCaPollSlots slots, uint16_t sysCode, uint8_t reqCode, rfalFeliCaPollRes *cardList, uint8_t *devCnt, uint8_t *collisions );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Full Collision Resolution
|
||||
*
|
||||
* Performs a full Collision resolution as defined in Activity 1.1 9.3.4
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[in] devLimit : device limit value, and size nfcaDevList
|
||||
* \param[out] nfcfDevList : NFC-F listener devices list
|
||||
* \param[out] devCnt : Devices found counter
|
||||
*
|
||||
* NFC-F Collision Resolution uses information collected at Technlology dectection (if
|
||||
* provided on nfcfDevList). Technology Detection shall be performed using 4 slots, therefore
|
||||
* at least 4 slots/devLimit shall be allocated on nfcfDevList.
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcfListenDevice *nfcfDevList, uint8_t *devCnt );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Start Poller Collision Resolution
|
||||
*
|
||||
* Triggers a Collision Resolution as defined in Activity 2.1 9.3.6
|
||||
*
|
||||
* NFC-F Collision Resolution uses information collected at Technlology dectection (if
|
||||
* provided on nfcfDevList). Technology Detection shall be performed using 4 slots, therefore
|
||||
* at least 4 slots/devLimit shall be allocated on nfcfDevList.
|
||||
*
|
||||
* \param[in] compMode : compliance mode to be performed
|
||||
* \param[in] devLimit : device limit value, and size nfcaDevList
|
||||
* \param[out] nfcfDevList : NFC-F listener devices list
|
||||
* \param[out] devCnt : Devices found counter
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerStartCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcfListenDevice *nfcfDevList, uint8_t *devCnt );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Get Collision Resolution Status
|
||||
*
|
||||
* This function gets the status of the Collision Resolution operation
|
||||
* triggered by rfalNfcfPollerStartCollisionResolution()
|
||||
*
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_NONE : No error and some NFC-F device was detected
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerGetCollisionResolutionStatus( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Check/Read
|
||||
*
|
||||
* It computes a Check / Read command accoring to T3T 1.0 and JIS X6319-4 and
|
||||
* sends it to PICC. If sucessfully, the rxBuf will contain the the number of
|
||||
* blocks in the first byte followed by the blocks data.
|
||||
*
|
||||
* \param[in] nfcid2 : nfcid2 of the device
|
||||
* \param[in] servBlock : parameter containing the list of Services and
|
||||
* Blocks to be addressed by this command
|
||||
* \param[out] rxBuf : buffer to place check/read data
|
||||
* \param[in] rxBufLen : size of the rxBuf
|
||||
* \param[out] rcvdLen : length of data placed in rxBuf
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_REQUEST : The request was executed with error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerCheck( const uint8_t* nfcid2, const rfalNfcfServBlockListParam *servBlock, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvdLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Poller Update/Write
|
||||
*
|
||||
* It computes a Update / Write command accoring to T3T 1.0 and JIS X6319-4 and
|
||||
* sends it to PICC.
|
||||
*
|
||||
* \param[in] nfcid2 : nfcid2 of the device
|
||||
* \param[in] servBlock : parameter containing the list of Services and
|
||||
* Blocks to be addressed by this command
|
||||
* \param[in] txBuf : buffer where the request will be composed
|
||||
* \param[in] txBufLen : size of txBuf
|
||||
* \param[in] blockData : data to written on the given block(s)
|
||||
* \param[out] rxBuf : buffer to place check/read data
|
||||
* \param[in] rxBufLen : size of the rxBuf
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_REQUEST : The request was executed with error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcfPollerUpdate( const uint8_t* nfcid2, const rfalNfcfServBlockListParam *servBlock, uint8_t *txBuf, uint16_t txBufLen, const uint8_t *blockData, uint8_t *rxBuf, uint16_t rxBufLen);
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-F Listener is T3T Request
|
||||
*
|
||||
* This method checks if the given data is a valid T3T command (Read or Write)
|
||||
* and in case a valid request has been received it may output the request's NFCID2
|
||||
*
|
||||
* \param[in] buf : buffer holding Initiator's received command
|
||||
* \param[in] bufLen : length of received command in bytes
|
||||
* \param[out] nfcid2 : pointer to where the NFCID2 may be outputed,
|
||||
* nfcid2 has NFCF_SENSF_NFCID2_LEN as length
|
||||
* Pass NULL if output parameter not desired
|
||||
*
|
||||
* \return true : Valid T3T command (Read or Write) received
|
||||
* \return false : Invalid protocol request
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
bool rfalNfcfListenerIsT3TReq( const uint8_t* buf, uint16_t bufLen, uint8_t* nfcid2 );
|
||||
|
||||
|
||||
#endif /* RFAL_NFCF_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,741 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_nfcv.h
|
||||
* Description : Implementation of NFC-V Poller (ISO15693) device
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_NFCV_H
|
||||
#define RFAL_NFCV_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.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 */
|
||||
#define RFAL_NFCV_ST_IC_MFG_CODE 0x02U /*!< ST IC Mfg code (used for custom commands) */
|
||||
|
||||
|
||||
|
||||
/*! 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-V Poller/RW (ISO15693) including all default timings
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Incorrect bitrate
|
||||
* \return RFAL_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. Please note that
|
||||
* received invRes may contain errors and is not
|
||||
* guaranteed to contain valid data.
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detectedd
|
||||
* \return RFAL_ERR_NONE : No error, one or more device in the field
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcvPollerCheckPresence( rfalNfcvInventoryRes *invRes );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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
|
||||
*
|
||||
* Writes 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 written
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 Lock Single Block
|
||||
*
|
||||
* Locks 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalNfcvPollerLockBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Extended Lock Single Block
|
||||
*
|
||||
* Locks 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_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 */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,324 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_st25tb.h
|
||||
* Description : Implementation of ST25TB interface
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_ST25TB_H
|
||||
#define RFAL_ST25TB_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
#include "rfal_nfcb.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_ST25TB_CHIP_ID_LEN 1U /*!< ST25TB chip ID length */
|
||||
#define RFAL_ST25TB_CRC_LEN 2U /*!< ST25TB CRC length */
|
||||
#define RFAL_ST25TB_UID_LEN 8U /*!< ST25TB Unique ID length */
|
||||
#define RFAL_ST25TB_BLOCK_LEN 4U /*!< ST25TB Data Block length */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
typedef uint8_t rfalSt25tbUID[RFAL_ST25TB_UID_LEN]; /*!< ST25TB UID type */
|
||||
typedef uint8_t rfalSt25tbBlock[RFAL_ST25TB_BLOCK_LEN]; /*!< ST25TB Block type */
|
||||
|
||||
|
||||
/*! ST25TB listener device (PICC) struct */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t chipID; /*!< Device's session Chip ID */
|
||||
rfalSt25tbUID UID; /*!< Device's UID */
|
||||
bool isDeselected; /*!< Device deselect flag */
|
||||
}rfalSt25tbListenDevice;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize ST25TB Poller mode
|
||||
*
|
||||
* This methods configures RFAL RF layer to perform as a
|
||||
* ST25TB Poller/RW including all default timings
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Check Presence
|
||||
*
|
||||
* This method checks if a ST25TB Listen device (PICC) is present on the field
|
||||
* by sending an Initiate command
|
||||
*
|
||||
* \param[out] chipId : if successfully retrieved, the device's chip ID
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected one or more device in the field
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerCheckPresence( uint8_t *chipId );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Collision Resolution
|
||||
*
|
||||
* This method performs ST25TB Collision resolution, selects the each device,
|
||||
* retrieves its UID and then deselects.
|
||||
* In case only one device is identified the ST25TB device is left in select
|
||||
* state.
|
||||
*
|
||||
* \param[in] devLimit : device limit value, and size st25tbDevList
|
||||
* \param[out] st25tbDevList : ST35TB listener device info
|
||||
* \param[out] devCnt : Devices found counter
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_RF_COLLISION : Collision detected one or more device in the field
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerCollisionResolution( uint8_t devLimit, rfalSt25tbListenDevice *st25tbDevList, uint8_t *devCnt );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Initiate
|
||||
*
|
||||
* This method sends an Initiate command
|
||||
*
|
||||
* If a single device responds the chip ID will be retrieved
|
||||
*
|
||||
* \param[out] chipId : chip ID of the device
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerInitiate( uint8_t *chipId );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Pcall
|
||||
*
|
||||
* This method sends a Pcall command
|
||||
* If successful the device's chip ID will be retrieved
|
||||
*
|
||||
* \param[out] chipId : Chip ID of the device
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerPcall( uint8_t *chipId );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Slot Marker
|
||||
*
|
||||
* This method sends a Slot Marker
|
||||
*
|
||||
* If a single device responds the chip ID will be retrieved
|
||||
*
|
||||
* \param[in] slotNum : Slot Number
|
||||
* \param[out] chipIdRes : Chip ID of the device
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerSlotMarker( uint8_t slotNum, uint8_t *chipIdRes );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Select
|
||||
*
|
||||
* This method sends a ST25TB Select command with the given chip ID.
|
||||
*
|
||||
* If the device is already in Selected state and receives an incorrect chip
|
||||
* ID, it goes into Deselected state
|
||||
*
|
||||
* \param[in] chipId : chip ID of the device to be selected
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerSelect( uint8_t chipId );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Get UID
|
||||
*
|
||||
* This method sends a Get_UID command
|
||||
*
|
||||
* If a single device responds the chip UID will be retrieved
|
||||
*
|
||||
* \param[out] UID : UID of the found device
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerGetUID( rfalSt25tbUID *UID );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Read Block
|
||||
*
|
||||
* This method reads a block of the ST25TB
|
||||
*
|
||||
* \param[in] blockAddress : address of the block to be read
|
||||
* \param[out] blockData : location to place the data read from block
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerReadBlock( uint8_t blockAddress, rfalSt25tbBlock *blockData );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Write Block
|
||||
*
|
||||
* This method writes a block of the ST25TB
|
||||
*
|
||||
* \param[in] blockAddress : address of the block to be written
|
||||
* \param[in] blockData : data to be written on the block
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerWriteBlock( uint8_t blockAddress, const rfalSt25tbBlock *blockData );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Completion
|
||||
*
|
||||
* This method sends a completion command to the ST25TB. After the
|
||||
* completion the card no longer will reply to any command.
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected, invalid SENSB_RES received
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerCompletion( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Reset to Inventory
|
||||
*
|
||||
* This method sends a Reset to Inventory command to the ST25TB.
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error, no listener device detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected, invalid SENSB_RES received
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalSt25tbPollerResetToInventory( void );
|
||||
|
||||
|
||||
#endif /* RFAL_ST25TB_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,775 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_st25xv.h
|
||||
* Description : NFC-V ST25 NFC-V Tag specific features
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_ST25xV_H
|
||||
#define RFAL_ST25xV_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#define RFAL_NFCV_BLOCKNUM_M24LR_LEN 2U /*!< Block Number length of MR24LR tags: 16 bits */
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Read Single Block (M24LR)
|
||||
*
|
||||
* Reads a Single Block from a M24LR tag which has the number of blocks
|
||||
* bigger than 256 (M24LR16 ; M24LR64)
|
||||
*
|
||||
* \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option
|
||||
* default: RFAL_NFCV_REQ_FLAG_DEFAULT
|
||||
* \param[in] uid : UID of the device to be put to be read
|
||||
* if not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerM24LRReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Single Block (M24LR)
|
||||
*
|
||||
* Reads a Single Block from a M24LR tag which has the number of blocks
|
||||
* bigger than 256 (M24LR16 ; M24LR64) using ST Fast mode
|
||||
*
|
||||
* \param[in] flags : Flags to be used: Sub-carrier; Data_rate; Option
|
||||
* default: RFAL_NFCV_REQ_FLAG_DEFAULT
|
||||
* \param[in] uid : UID of the device to be put to be read
|
||||
* if not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerM24LRFastReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Write Single Block (M24LR)
|
||||
*
|
||||
* Writes a Single Block from a M24LR tag which has the number of blocks
|
||||
* bigger than 256 (M24LR16 ; M24LR64)
|
||||
*
|
||||
* \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 not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerM24LRWriteSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, const uint8_t* wrData, uint8_t blockLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Read Multiple Blocks (M24LR)
|
||||
*
|
||||
* Reads Multiple Blocks from a device from a M24LR tag which has the number of blocks
|
||||
* bigger than 256 (M24LR16 ; M24LR64)
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] firstBlockNum : first block to be read (16 bits)
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerM24LRReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Multiple Blocks (M24LR)
|
||||
*
|
||||
* Reads Multiple Blocks from a device from a M24LR tag which has the number of blocks
|
||||
* bigger than 256 (M24LR16 ; M24LR64) using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] firstBlockNum : first block to be read (16 bits)
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerM24LRFastReadMultipleBlocks( uint8_t flags, const uint8_t* uid, uint16_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Single Block
|
||||
*
|
||||
* Reads a Single Block from a device (VICC) using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastReadSingleBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Multiple Blocks
|
||||
*
|
||||
* Reads Multiple Blocks from a device (VICC) using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastReadMultipleBlocks( 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 Fast Extended Read Single Block
|
||||
*
|
||||
* Reads a Single Block from a device (VICC) supporting extended commands using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastExtendedReadSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Extended Read Multiple Blocks
|
||||
*
|
||||
* Reads Multiple Blocks from a device (VICC) supporting extended commands using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastExtReadMultipleBlocks( 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 Read Configuration
|
||||
*
|
||||
* Reads static configuration registers at the Pointer address
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] pointer : Pointer address
|
||||
* \param[out] regValue : Register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerReadConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Write Configuration
|
||||
*
|
||||
* Writes static configuration registers at the Pointer address
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] pointer : Pointer address
|
||||
* \param[in] regValue : Register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerWriteConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Read Dynamic Configuration
|
||||
*
|
||||
* Reads dynamic registers at the Pointer address
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] pointer : Pointer address
|
||||
* \param[out] regValue : Register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerReadDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Write Dynamic Configuration
|
||||
*
|
||||
* Writes dynamic registers at the Pointer address
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] pointer : Pointer address
|
||||
* \param[in] regValue : Register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerWriteDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Dynamic Configuration
|
||||
*
|
||||
* Reads dynamic registers at the Pointer address using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] pointer : Pointer address
|
||||
* \param[out] regValue : Register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastReadDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t* regValue );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Write Dynamic Configuration
|
||||
*
|
||||
* Writes dynamic registers at the Pointer address using ST Fast mode
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] pointer : Pointer address
|
||||
* \param[in] regValue : Register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastWriteDynamicConfiguration( uint8_t flags, const uint8_t* uid, uint8_t pointer, uint8_t regValue );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Present Password
|
||||
*
|
||||
* Sends the Present Password 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 not provided Select mode will be used
|
||||
* \param[in] pwdNum : Password number
|
||||
* \param[in] pwd : Password
|
||||
* \param[in] pwdLen : Password length
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerPresentPassword( uint8_t flags, const uint8_t* uid, uint8_t pwdNum, const uint8_t* pwd, uint8_t pwdLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Write Password
|
||||
*
|
||||
* Sends the Write Password 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 not provided Select mode will be used
|
||||
* \param[in] pwdNum : Password number
|
||||
* \param[in] pwd : Password
|
||||
* \param[in] pwdLen : Password length
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerWritePassword( uint8_t flags, const uint8_t* uid, uint8_t pwdNum, const uint8_t *pwd, uint8_t pwdLen);
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Get Random Number
|
||||
*
|
||||
* Returns a 16 bit random number
|
||||
*
|
||||
* \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 not provided Select 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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerGetRandomNumber( uint8_t flags, const uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Read Message length
|
||||
*
|
||||
* Sends a Read Message Length message to retrieve the value of MB_LEN_Dyn
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[out] msgLen : Message Length
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerReadMessageLength( uint8_t flags, const uint8_t* uid, uint8_t* msgLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Message length
|
||||
*
|
||||
* Sends a Fast Read Message Length message to retrieve the value of MB_LEN_Dyn using ST Fast mode.
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[out] msgLen : Message Length
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastReadMsgLength( uint8_t flags, const uint8_t* uid, uint8_t* msgLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Read Message
|
||||
*
|
||||
* Reads up to 256 bytes in the Mailbox from the location
|
||||
* specified by MBpointer and sends back their value in the rxBuf response.
|
||||
* First MailBox location is '00'. When Number of bytes is set to 00h
|
||||
* and MBPointer is equals to 00h, the MB_LEN bytes of the full message
|
||||
* are returned. Otherwise, Read Message command returns (Number of Bytes + 1) bytes
|
||||
* (i.e. 01h returns 2 bytes, FFh returns 256 bytes).
|
||||
* An error is reported if (Pointer + Nb of bytes + 1) is greater than the message length.
|
||||
* RF Reading of the last byte of the mailbox message automatically clears b1
|
||||
* of MB_CTRL_Dyn HOST_PUT_MSG, and allows RF to put a new message.
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] mbPointer : MPpointer
|
||||
* \param[in] numBytes : number of bytes
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerReadMessage( uint8_t flags, const uint8_t* uid, uint8_t mbPointer, uint8_t numBytes, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Read Message
|
||||
*
|
||||
* Reads up to 256 bytes in the Mailbox from the location
|
||||
* specified by MBpointer and sends back their value in the rxBuf response using ST Fast mode.
|
||||
* First MailBox location is '00'. When Number of bytes is set to 00h
|
||||
* and MBPointer is equals to 00h, the MB_LEN bytes of the full message
|
||||
* are returned. Otherwise, Read Message command returns (Number of Bytes + 1) bytes
|
||||
* (i.e. 01h returns 2 bytes, FFh returns 256 bytes).
|
||||
* An error is reported if (Pointer + Nb of bytes + 1) is greater than the message length.
|
||||
* RF Reading of the last byte of the mailbox message automatically clears b1
|
||||
* of MB_CTRL_Dyn HOST_PUT_MSG, and allows RF to put a new message.
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] mbPointer : MPpointer
|
||||
* \param[in] numBytes : number of bytes
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastReadMessage( uint8_t flags, const uint8_t* uid, uint8_t mbPointer, uint8_t numBytes, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Write Message
|
||||
*
|
||||
* Sends Write message Command
|
||||
*
|
||||
* On receiving the Write Message command, the ST25DVxxx puts the data contained
|
||||
* in the request into the Mailbox buffer, update the MB_LEN_Dyn register, and
|
||||
* set bit RF_PUT_MSG in MB_CTRL_Dyn register. It then reports if the write operation was successful
|
||||
* in the response. The ST25DVxxx Mailbox contains up to 256 data bytes which are filled from the
|
||||
* first location '00'. 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).
|
||||
* Write Message could be executed only when Mailbox is accessible by RF.
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] msgLen : MSGLen number of Data bytes minus 1
|
||||
* \param[in] msgData : Message Data
|
||||
* \param[out] txBuf : buffer to used to build the Write Message command
|
||||
* \param[in] txBufLen : length of txBuf
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerWriteMessage( uint8_t flags, const uint8_t* uid, uint8_t msgLen, const uint8_t* msgData, uint8_t* txBuf, uint16_t txBufLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Fast Write Message
|
||||
*
|
||||
* Sends Fast Write message Command using ST Fast mode
|
||||
*
|
||||
* On receiving the Write Message command, the ST25DVxxx puts the data contained
|
||||
* in the request into the Mailbox buffer, update the MB_LEN_Dyn register, and
|
||||
* set bit RF_PUT_MSG in MB_CTRL_Dyn register. It then reports if the write operation was successful
|
||||
* in the response. The ST25DVxxx Mailbox contains up to 256 data bytes which are filled from the
|
||||
* first location '00'. 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).
|
||||
* Write Message could be executed only when Mailbox is accessible by RF.
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] msgLen : MSGLen number of Data bytes minus 1
|
||||
* \param[in] msgData : Message Data
|
||||
* \param[out] txBuf : buffer to used to build the Write Message command
|
||||
* \param[in] txBufLen : length of txBuf
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25xVPollerFastWriteMessage( uint8_t flags, const uint8_t* uid, uint8_t msgLen, const uint8_t* msgData, uint8_t* txBuf, uint16_t txBufLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Read Configuration (ST25TV02KC ST25TV512C version)
|
||||
*
|
||||
* Reads static configuration registers at the Pointer address
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] fid : FID
|
||||
* \param[in] pid : PID
|
||||
* \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 RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25TV512CPollerReadConfiguration(uint8_t flags, const uint8_t* uid, uint8_t fid, uint8_t pid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-V Poller Write Configuration (ST25TV02KC ST25TV512C version)
|
||||
*
|
||||
* Writes static configuration registers at the Pointer address
|
||||
*
|
||||
* \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 not provided Select mode will be used
|
||||
* \param[in] fid : FID
|
||||
* \param[in] pid : PID
|
||||
* \param[in] data : Register value
|
||||
* \param[in] dataLen : size of register value
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
||||
* \return RFAL_ERR_PARAM : Invalid parameters
|
||||
* \return RFAL_ERR_IO : Generic internal error
|
||||
* \return RFAL_ERR_CRC : CRC error detected
|
||||
* \return RFAL_ERR_FRAMING : Framing error detected
|
||||
* \return RFAL_ERR_PROTO : Protocol error detected
|
||||
* \return RFAL_ERR_TIMEOUT : Timeout error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalST25TV512CPollerWriteConfiguration(uint8_t flags, const uint8_t* uid, uint8_t fid, uint8_t pid, const uint8_t *data, uint8_t dataLen );
|
||||
|
||||
#endif /* RFAL_ST25xV_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,153 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* File Name : rfal_t1t.h
|
||||
* Description : Provides NFC-A T1T convenience methods and definitions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2024 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_T1T_H
|
||||
#define RFAL_T1T_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_T1T_UID_LEN 4 /*!< T1T UID length of cascade level 1 only tag */
|
||||
#define RFAL_T1T_HR_LENGTH 2 /*!< T1T HR(Header ROM) length */
|
||||
|
||||
#define RFAL_T1T_HR0_NDEF_MASK 0xF0 /*!< T1T HR0 NDEF capability mask T1T 1.2 2.2.2 */
|
||||
#define RFAL_T1T_HR0_NDEF_SUPPORT 0x10 /*!< T1T HR0 NDEF capable value T1T 1.2 2.2.2 */
|
||||
|
||||
|
||||
/*! NFC-A T1T (Topaz) command set */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_T1T_CMD_RID = 0x78, /*!< T1T Read UID */
|
||||
RFAL_T1T_CMD_RALL = 0x00, /*!< T1T Read All */
|
||||
RFAL_T1T_CMD_READ = 0x01, /*!< T1T Read */
|
||||
RFAL_T1T_CMD_WRITE_E = 0x53, /*!< T1T Write with erase (single byte) */
|
||||
RFAL_T1T_CMD_WRITE_NE = 0x1A /*!< T1T Write with no erase (single byte) */
|
||||
} rfalT1Tcmds;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*! NFC-A T1T (Topaz) RID_RES Digital 1.1 10.6.2 & Table 50 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t hr0; /*!< T1T Header ROM: HR0 */
|
||||
uint8_t hr1; /*!< T1T Header ROM: HR1 */
|
||||
uint8_t uid[RFAL_T1T_UID_LEN]; /*!< T1T UID */
|
||||
} rfalT1TRidRes;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize NFC-A T1T Poller mode
|
||||
*
|
||||
* This methods configures RFAL RF layer to perform as a
|
||||
* NFC-A T1T Poller/RW (Topaz) including all default timings
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT1TPollerInitialize( void );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A T1T Poller RID
|
||||
*
|
||||
* This method reads the UID of a NFC-A T1T Listener device
|
||||
*
|
||||
*
|
||||
* \param[out] ridRes : pointer to place the RID_RES
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT1TPollerRid( rfalT1TRidRes *ridRes );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A T1T Poller RALL
|
||||
*
|
||||
* This method send a Read All command to a NFC-A T1T Listener device
|
||||
*
|
||||
*
|
||||
* \param[in] uid : the UID of the device to read data
|
||||
* \param[out] rxBuf : pointer to place the read data
|
||||
* \param[in] rxBufLen : size of rxBuf
|
||||
* \param[out] rxRcvdLen : actual received data
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT1TPollerRall( const uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rxRcvdLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A T1T Poller Write
|
||||
*
|
||||
* This method writes the given data on the address of a NFC-A T1T Listener device
|
||||
*
|
||||
*
|
||||
* \param[in] uid : the UID of the device to read data
|
||||
* \param[in] address : address to write the data
|
||||
* \param[in] data : the data to be written
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT1TPollerWrite( const uint8_t* uid, uint8_t address, uint8_t data );
|
||||
|
||||
#endif /* RFAL_T1T_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,119 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_t2t.h
|
||||
* @brief : Provides NFC-A T2T convenience methods and definitions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_T2T_H
|
||||
#define RFAL_T2T_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_T2T_BLOCK_LEN 4U /*!< T2T block length */
|
||||
#define RFAL_T2T_READ_DATA_LEN (4U * RFAL_T2T_BLOCK_LEN) /*!< T2T READ data length */
|
||||
#define RFAL_T2T_WRITE_DATA_LEN RFAL_T2T_BLOCK_LEN /*!< T2T WRITE data length */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A T2T Poller Read
|
||||
*
|
||||
* This method sends a Read command to a NFC-A T2T Listener device
|
||||
*
|
||||
*
|
||||
* \param[in] blockNum : Number of the block to read
|
||||
* \param[out] rxBuf : pointer to place the read data
|
||||
* \param[in] rxBufLen : size of rxBuf (RFAL_T2T_READ_DATA_LEN)
|
||||
* \param[out] rcvLen : actual received data
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT2TPollerRead( uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A T2T Poller Write
|
||||
*
|
||||
* This method sends a Write command to a NFC-A T2T Listener device
|
||||
*
|
||||
*
|
||||
* \param[in] blockNum : Number of the block to write
|
||||
* \param[in] wrData : data to be written on the given block
|
||||
* size must be of RFAL_T2T_WRITE_DATA_LEN
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT2TPollerWrite( uint8_t blockNum, const uint8_t* wrData );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief NFC-A T2T Poller Sector Select
|
||||
*
|
||||
* This method sends a Sector Select commands to a NFC-A T2T Listener device
|
||||
*
|
||||
* \param[in] sectorNum : Sector Number
|
||||
*
|
||||
* \return RFAL_ERR_WRONG_STATE : RFAL not initialized or mode not set
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT2TPollerSectorSelect( uint8_t sectorNum );
|
||||
|
||||
#endif /* RFAL_T2T_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,328 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_t4t.h
|
||||
* @brief : Provides convenience methods and definitions for T4T (ISO7816-4)
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_T4T_H
|
||||
#define RFAL_T4T_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_rf.h"
|
||||
#include "rfal_isoDep.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_T4T_MAX_CAPDU_PROLOGUE_LEN 4U /*!< Command-APDU prologue length (CLA INS P1 P2) */
|
||||
#define RFAL_T4T_LE_LEN 1U /*!< Le Expected Response Length (short field coding) */
|
||||
#define RFAL_T4T_LC_LEN 1U /*!< Lc Data field length (short field coding) */
|
||||
#define RFAL_T4T_MAX_RAPDU_SW1SW2_LEN 2U /*!< SW1 SW2 length */
|
||||
#define RFAL_T4T_CLA 0x00U /*!< Class byte (contains 00h because secure message are not used) */
|
||||
|
||||
#define RFAL_T4T_ISO7816_P1_SELECT_BY_DF_NAME 0x04U /*!< P1 value for Select by name */
|
||||
#define RFAL_T4T_ISO7816_P1_SELECT_BY_FILEID 0x00U /*!< P1 value for Select by file identifier */
|
||||
#define RFAL_T4T_ISO7816_P2_SELECT_FIRST_OR_ONLY_OCCURENCE 0x00U /*!< b2b1 P2 value for First or only occurence */
|
||||
#define RFAL_T4T_ISO7816_P2_SELECT_RETURN_FCI_TEMPLATE 0x00U /*!< b4b3 P2 value for Return FCI template */
|
||||
#define RFAL_T4T_ISO7816_P2_SELECT_NO_RESPONSE_DATA 0x0CU /*!< b4b3 P2 value for No responce data */
|
||||
|
||||
#define RFAL_T4T_ISO7816_STATUS_COMPLETE 0x9000U /*!< Command completed \ Normal processing - No further qualification*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
/*! NFC-A T4T Command-APDU structure */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t CLA; /*!< Class byte */
|
||||
uint8_t INS; /*!< Instruction byte */
|
||||
uint8_t P1; /*!< Parameter byte 1 */
|
||||
uint8_t P2; /*!< Parameter byte 2 */
|
||||
uint8_t Lc; /*!< Data field length */
|
||||
bool LcFlag; /*!< Lc flag (append Lc when true) */
|
||||
uint8_t Le; /*!< Expected Response Length */
|
||||
bool LeFlag; /*!< Le flag (append Le when true) */
|
||||
|
||||
rfalIsoDepApduBufFormat *cApduBuf; /*!< Command-APDU buffer (Tx) */
|
||||
uint16_t *cApduLen; /*!< Command-APDU Length */
|
||||
}rfalT4tCApduParam;
|
||||
|
||||
/*! NFC-A T4T Response-APDU structure */
|
||||
typedef struct
|
||||
{
|
||||
rfalIsoDepApduBufFormat *rApduBuf; /*!< Response-APDU buffer (Rx) */
|
||||
uint16_t rcvdLen; /*!< Full response length */
|
||||
uint16_t rApduBodyLen; /*!< Response body length */
|
||||
uint16_t statusWord; /*!< R-APDU Status Word SW1|SW2 */
|
||||
}rfalT4tRApduParam;
|
||||
|
||||
|
||||
|
||||
/*! NFC-A T4T command set T4T 1.0 & ISO7816-4 2013 Table 4 */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_T4T_INS_SELECT = 0xA4U, /*!< T4T Select */
|
||||
RFAL_T4T_INS_READBINARY = 0xB0U, /*!< T4T ReadBinary */
|
||||
RFAL_T4T_INS_UPDATEBINARY = 0xD6U, /*!< T4T UpdateBinay */
|
||||
RFAL_T4T_INS_READBINARY_ODO = 0xB1U, /*!< T4T ReadBinary using ODO */
|
||||
RFAL_T4T_INS_UPDATEBINARY_ODO = 0xD7U /*!< T4T UpdateBinay using ODO */
|
||||
} rfalT4tCmds;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose APDU
|
||||
*
|
||||
* This method computes a C-APDU according to NFC Forum T4T and ISO7816-4.
|
||||
*
|
||||
* If C-APDU contains data to be sent, it must be placed inside the buffer
|
||||
* rfalT4tTxRxApduParam.txRx.cApduBuf.apdu and signaled by Lc
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
* \see rfalT4TPollerParseRAPDU()
|
||||
*
|
||||
* \warning The ISO-DEP module is used to perform the tranceive. Usually
|
||||
* activation has been done via ISO-DEP activatiavtion. If not
|
||||
* please call rfalIsoDepInitialize() before.
|
||||
*
|
||||
* \param[in,out] apduParam : APDU parameters
|
||||
* apduParam.cApduLen will contain the APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeCAPDU( const rfalT4tCApduParam *apduParam );
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Parse R-APDU
|
||||
*
|
||||
* This method parses a R-APDU according to NFC Forum T4T and ISO7816-4.
|
||||
* It will extract the data length and check if the Satus word is expected.
|
||||
*
|
||||
* \param[in,out] apduParam : APDU parameters
|
||||
* apduParam.rApduBodyLen will contain the data length
|
||||
* apduParam.statusWord will contain the SW1 and SW2
|
||||
*
|
||||
* \return RFAL_ERR_REQUEST : Status word (SW1 SW2) different from 9000
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerParseRAPDU( rfalT4tRApduParam *apduParam );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Select Application APDU
|
||||
*
|
||||
* This method computes a Select Application APDU according to NFC Forum T4T
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] aid : Application ID to be used
|
||||
* \param[in] aidLen : Application ID length
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeSelectAppl( rfalIsoDepApduBufFormat *cApduBuf, const uint8_t* aid, uint8_t aidLen, uint16_t *cApduLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Select File APDU
|
||||
*
|
||||
* This method computes a Select File APDU according to NFC Forum T4T
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] fid : File ID to be used
|
||||
* \param[in] fidLen : File ID length
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeSelectFile( rfalIsoDepApduBufFormat *cApduBuf, const uint8_t* fid, uint8_t fidLen, uint16_t *cApduLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Select File APDU for Mapping Version 1
|
||||
*
|
||||
* This method computes a Select File APDU according to NFC Forum T4TOP_v1.0
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] fid : File ID to be used
|
||||
* \param[in] fidLen : File ID length
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeSelectFileV1Mapping( rfalIsoDepApduBufFormat *cApduBuf, const uint8_t* fid, uint8_t fidLen, uint16_t *cApduLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Read Data APDU
|
||||
*
|
||||
* This method computes a Read Data APDU according to NFC Forum T4T
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] offset : File offset
|
||||
* \param[in] expLen : Expected length (Le)
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeReadData( rfalIsoDepApduBufFormat *cApduBuf, uint16_t offset, uint8_t expLen, uint16_t *cApduLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Read Data ODO APDU
|
||||
*
|
||||
* This method computes a Read Data ODO APDU according to NFC Forum T4T
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] offset : File offset
|
||||
* \param[in] expLen : Expected length (Le)
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeReadDataODO( rfalIsoDepApduBufFormat *cApduBuf, uint32_t offset, uint8_t expLen, uint16_t *cApduLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Write Data APDU
|
||||
*
|
||||
* This method computes a Write Data APDU according to NFC Forum T4T
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] offset : File offset
|
||||
* \param[in] data : Data to be written
|
||||
* \param[in] dataLen : Data length to be written (Lc)
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeWriteData( rfalIsoDepApduBufFormat *cApduBuf, uint16_t offset, const uint8_t* data, uint8_t dataLen, uint16_t *cApduLen );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief T4T Compose Write Data ODO APDU
|
||||
*
|
||||
* This method computes a Write Data ODO sAPDU according to NFC Forum T4T
|
||||
*
|
||||
* To transceive the formed APDU the ISO-DEP layer shall be used
|
||||
*
|
||||
* \see rfalIsoDepStartApduTransceive()
|
||||
* \see rfalIsoDepGetApduTransceiveStatus()
|
||||
*
|
||||
* \param[out] cApduBuf : buffer where the C-APDU will be placed
|
||||
* \param[in] offset : File offset
|
||||
* \param[in] data : Data to be written
|
||||
* \param[in] dataLen : Data length to be written (Lc)
|
||||
* \param[out] cApduLen : Composed C-APDU length
|
||||
*
|
||||
* \return RFAL_ERR_PARAM : Invalid parameter
|
||||
* \return RFAL_ERR_PROTO : Protocol error
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*****************************************************************************
|
||||
*/
|
||||
ReturnCode rfalT4TPollerComposeWriteDataODO( rfalIsoDepApduBufFormat *cApduBuf, uint32_t offset, const uint8_t* data, uint8_t dataLen, uint16_t *cApduLen );
|
||||
|
||||
#endif /* RFAL_T4T_H */
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*
|
||||
* @}
|
||||
*/
|
||||
@@ -0,0 +1,159 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file : rfal_utils.h
|
||||
* @brief : RF Abstraction Layer (RFAL) Utils
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2025 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_UTILS_H
|
||||
#define RFAL_UTILS_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include <stdint.h>
|
||||
#include <string.h>
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DATA TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
typedef uint16_t ReturnCode; /*!< Standard Return Code type from function. */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
* Error codes to be used within the application.
|
||||
* They are represented by an uint8_t
|
||||
*/
|
||||
|
||||
#define RFAL_ERR_NONE ((ReturnCode)0U) /*!< no error occurred */
|
||||
#define RFAL_ERR_NOMEM ((ReturnCode)1U) /*!< not enough memory to perform the requested operation */
|
||||
#define RFAL_ERR_BUSY ((ReturnCode)2U) /*!< device or resource busy */
|
||||
#define RFAL_ERR_IO ((ReturnCode)3U) /*!< generic IO error */
|
||||
#define RFAL_ERR_TIMEOUT ((ReturnCode)4U) /*!< error due to timeout */
|
||||
#define RFAL_ERR_REQUEST ((ReturnCode)5U) /*!< invalid request or requested function can't be executed at the moment */
|
||||
#define RFAL_ERR_NOMSG ((ReturnCode)6U) /*!< No message of desired type */
|
||||
#define RFAL_ERR_PARAM ((ReturnCode)7U) /*!< Parameter error */
|
||||
#define RFAL_ERR_SYSTEM ((ReturnCode)8U) /*!< System error */
|
||||
#define RFAL_ERR_FRAMING ((ReturnCode)9U) /*!< Framing error */
|
||||
#define RFAL_ERR_OVERRUN ((ReturnCode)10U) /*!< lost one or more received bytes */
|
||||
#define RFAL_ERR_PROTO ((ReturnCode)11U) /*!< protocol error */
|
||||
#define RFAL_ERR_INTERNAL ((ReturnCode)12U) /*!< Internal Error */
|
||||
#define RFAL_ERR_AGAIN ((ReturnCode)13U) /*!< Call again */
|
||||
#define RFAL_ERR_MEM_CORRUPT ((ReturnCode)14U) /*!< memory corruption */
|
||||
#define RFAL_ERR_NOT_IMPLEMENTED ((ReturnCode)15U) /*!< not implemented */
|
||||
#define RFAL_ERR_PC_CORRUPT ((ReturnCode)16U) /*!< Program Counter has been manipulated or spike/noise trigger illegal operation */
|
||||
#define RFAL_ERR_SEND ((ReturnCode)17U) /*!< error sending*/
|
||||
#define RFAL_ERR_IGNORE ((ReturnCode)18U) /*!< indicates error detected but to be ignored */
|
||||
#define RFAL_ERR_SEMANTIC ((ReturnCode)19U) /*!< indicates error in state machine (unexpected cmd) */
|
||||
#define RFAL_ERR_SYNTAX ((ReturnCode)20U) /*!< indicates error in state machine (unknown cmd) */
|
||||
#define RFAL_ERR_CRC ((ReturnCode)21U) /*!< crc error */
|
||||
#define RFAL_ERR_NOTFOUND ((ReturnCode)22U) /*!< transponder not found */
|
||||
#define RFAL_ERR_NOTUNIQUE ((ReturnCode)23U) /*!< transponder not unique - more than one transponder in field */
|
||||
#define RFAL_ERR_NOTSUPP ((ReturnCode)24U) /*!< requested operation not supported */
|
||||
#define RFAL_ERR_WRITE ((ReturnCode)25U) /*!< write error */
|
||||
#define RFAL_ERR_FIFO ((ReturnCode)26U) /*!< fifo over or underflow error */
|
||||
#define RFAL_ERR_PAR ((ReturnCode)27U) /*!< parity error */
|
||||
#define RFAL_ERR_DONE ((ReturnCode)28U) /*!< transfer has already finished */
|
||||
#define RFAL_ERR_RF_COLLISION ((ReturnCode)29U) /*!< collision error (Bit Collision or during RF Collision avoidance ) */
|
||||
#define RFAL_ERR_HW_OVERRUN ((ReturnCode)30U) /*!< lost one or more received bytes */
|
||||
#define RFAL_ERR_RELEASE_REQ ((ReturnCode)31U) /*!< device requested release */
|
||||
#define RFAL_ERR_SLEEP_REQ ((ReturnCode)32U) /*!< device requested sleep */
|
||||
#define RFAL_ERR_WRONG_STATE ((ReturnCode)33U) /*!< incorrent state for requested operation */
|
||||
#define RFAL_ERR_MAX_RERUNS ((ReturnCode)34U) /*!< blocking procedure reached maximum runs */
|
||||
#define RFAL_ERR_DISABLED ((ReturnCode)35U) /*!< operation aborted due to disabled configuration */
|
||||
#define RFAL_ERR_HW_MISMATCH ((ReturnCode)36U) /*!< expected hw do not match */
|
||||
#define RFAL_ERR_LINK_LOSS ((ReturnCode)37U) /*!< Other device's field didn't behave as expected: turned off by Initiator in Passive mode, or AP2P did not turn on field */
|
||||
#define RFAL_ERR_INVALID_HANDLE ((ReturnCode)38U) /*!< invalid or not initialized device handle */
|
||||
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE ((ReturnCode)40U) /*!< Incomplete byte rcvd */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_01 ((ReturnCode)41U) /*!< Incomplete byte rcvd - 1 bit */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_02 ((ReturnCode)42U) /*!< Incomplete byte rcvd - 2 bit */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_03 ((ReturnCode)43U) /*!< Incomplete byte rcvd - 3 bit */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_04 ((ReturnCode)44U) /*!< Incomplete byte rcvd - 4 bit */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_05 ((ReturnCode)45U) /*!< Incomplete byte rcvd - 5 bit */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_06 ((ReturnCode)46U) /*!< Incomplete byte rcvd - 6 bit */
|
||||
#define RFAL_ERR_INCOMPLETE_BYTE_07 ((ReturnCode)47U) /*!< Incomplete byte rcvd - 7 bit */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
/*! Common code to exit a function with the error if function f return error */
|
||||
#define RFAL_EXIT_ON_ERR(r, f) \
|
||||
(r) = (f); \
|
||||
if (RFAL_ERR_NONE != (r)) \
|
||||
{ \
|
||||
return (r); \
|
||||
}
|
||||
|
||||
|
||||
/*! Common code to exit a function if process/function f has not concluded */
|
||||
#define RFAL_EXIT_ON_BUSY(r, f) \
|
||||
(r) = (f); \
|
||||
if (RFAL_ERR_BUSY == (r)) \
|
||||
{ \
|
||||
return (r); \
|
||||
}
|
||||
|
||||
#define RFAL_SIZEOF_ARRAY(a) (sizeof(a) / sizeof((a)[0])) /*!< Compute the size of an array */
|
||||
#define RFAL_MAX(a, b) (((a) > (b)) ? (a) : (b)) /*!< Return the maximum of the 2 values */
|
||||
#define RFAL_MIN(a, b) (((a) < (b)) ? (a) : (b)) /*!< Return the minimum of the 2 values */
|
||||
#define RFAL_GETU16(a) (((uint16_t)(a)[0] << 8) | (uint16_t)(a)[1])/*!< Cast two Big Endian 8-bits byte array to 16-bits unsigned */
|
||||
#define RFAL_GETU32(a) (((uint32_t)(a)[0] << 24) | ((uint32_t)(a)[1] << 16) | ((uint32_t)(a)[2] << 8) | ((uint32_t)(a)[3])) /*!< Cast four Big Endian 8-bit byte array to 32-bit unsigned */
|
||||
|
||||
|
||||
#ifdef __CSMC__
|
||||
/* STM8 COSMIC */
|
||||
#define RFAL_MEMMOVE(s1,s2,n) memmove(s1,s2,n) /* PRQA S 5003 # CERT C 9 - string.h from Cosmic only provides functions with low qualified parameters */ /*!< map memmove to string library code */
|
||||
static inline void * RFAL_MEMCPY(void *s1, const void *s2, uint32_t n) { return memcpy(s1,s2,(uint16_t)n); } /* PRQA S 0431 # MISRA 1.1 - string.h from Cosmic only provides functions with low qualified parameters */
|
||||
#define RFAL_MEMSET(s1,c,n) memset(s1,(char)(c),n) /*!< map memset to string library code */
|
||||
static inline int32_t RFAL_BYTECMP(void *s1, const void *s2, uint32_t n) { return (int32_t)memcmp(s1,s2,(uint16_t)n); } /* PRQA S 0431 # MISRA 1.1 - string.h from Cosmic only provides functions with low qualified parameters */
|
||||
|
||||
#else /* __CSMC__ */
|
||||
|
||||
#define RFAL_MEMMOVE memmove /*!< map memmove to string library code */
|
||||
#define RFAL_MEMCPY memcpy /*!< map memcpy to string library code */
|
||||
#define RFAL_MEMSET memset /*!< map memset to string library code */
|
||||
#define RFAL_BYTECMP memcmp /*!< map bytecmp to string library code */
|
||||
#endif /* __CSMC__ */
|
||||
|
||||
#define RFAL_NO_WARNING(v) ((void) (v)) /*!< Macro to suppress compiler warning */
|
||||
|
||||
|
||||
#ifndef NULL
|
||||
#define NULL (void*)0 /*!< represents a NULL pointer */
|
||||
#endif /* !NULL */
|
||||
|
||||
|
||||
|
||||
#endif /* RFAL_UTILS_H */
|
||||
|
||||
|
||||
/**
|
||||
* @}
|
||||
*
|
||||
*/
|
||||
|
||||
@@ -0,0 +1,64 @@
|
||||
SLA0051 Rev3/May 2020
|
||||
|
||||
## Software license agreement
|
||||
|
||||
### Software license agreement
|
||||
|
||||
BY CLICKING ON THE "I ACCEPT" BUTTON OR BY UNZIPPING, INSTALLING, COPYING, DOWNLOADING, ACCESSING
|
||||
OR OTHERWISE USING THIS SOFTWARE (HEREINAFTER “SOFTWARE” MEANS THE RELATED SOFTWARE,
|
||||
DOCUMENTATION, OTHER MATERIALS, AND ANY PARTS, PERMITTED MODIFICATIONS, AND PERMITTED
|
||||
DERIVATIVES THEREOF) FROM STMICROELECTRONICS INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS
|
||||
AFFILIATED COMPANIES (“STMICROELECTRONICS”), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON
|
||||
BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED (“YOU”) AGREES TO BE
|
||||
BOUND BY THIS AGREEMENT.
|
||||
|
||||
You represent that you have the authority to enter into this Agreement. You will comply with all laws, including export laws.
|
||||
STMicroelectronics’s failure or delay to enforce this Agreement does not waive STMicroelectronics’s rights. Swiss law, except
|
||||
conflict of laws, governs this Agreement, and the parties consent to exclusive jurisdiction of courts in Switzerland for litigation of
|
||||
this Agreement.
|
||||
Subject to the below disclaimer, the redistribution, reproduction and use in source and binary forms of the software or any part
|
||||
thereof, with or without modification, are permitted provided that the following conditions are met:
|
||||
1. Redistribution of source code (modified or not) must retain any copyright notice, this list of conditions and the following
|
||||
disclaimer.
|
||||
|
||||
2. Redistributions in binary form, except as embedded into a microcontroller or microprocessor device or a software update
|
||||
for such device, must reproduce any copyright notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. Neither the name of STMicroelectronics nor the names of other contributors to this software may be used to endorse or
|
||||
promote products using or derived from this software or part thereof without specific written permission.
|
||||
|
||||
4. This software or any part thereof, including modifications and/or derivative works of this software, must be used and
|
||||
execute solely and exclusively in combination with an integrated circuit that is manufactured by or for STMicroelectronics
|
||||
and is an NFC tag, NFC dynamic tag, NFC reader, or UHF reader.
|
||||
|
||||
5. No use, reproduction or redistribution of this software may be done in any manner that would subject this software to any
|
||||
Open Source Terms. “Open Source Terms” shall mean any open source license which requires as part of distribution of
|
||||
software that the source code of such software is distributed therewith or otherwise made available, or open source license
|
||||
that substantially complies with the Open Source definition specified at www.opensource.org and any other comparable
|
||||
open source license such as for example GNU General Public License (GPL), Eclipse Public License (EPL), Apache
|
||||
Software License, BSD license and MIT license.
|
||||
|
||||
6. STMicroelectronics has no obligation to provide any maintenance, support or updates for the software.
|
||||
|
||||
7. The software is and will remain the exclusive property of STMicroelectronics and its licensors. The recipient will not take
|
||||
any action that jeopardizes STMicroelectronics and its licensors' proprietary rights or acquire any rights in the software,
|
||||
except the limited rights specified hereunder.
|
||||
|
||||
8. Redistribution and use of this software partially or any part thereof other than as permitted under this license is void and
|
||||
will automatically terminate your rights under this license.
|
||||
|
||||
DISCLAIMER
|
||||
THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS,
|
||||
IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY
|
||||
INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE.
|
||||
EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER EXPRESS OR
|
||||
IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF
|
||||
STMICROELECTRONICS OR ANY THIRD PARTY.
|
||||
@@ -0,0 +1,60 @@
|
||||
This software component is provided to you as part of a software package and
|
||||
applicable license terms are in the Package_license file. If you received this
|
||||
software component outside of a package or without applicable license terms,
|
||||
the terms of the SLA0051 license shall apply and are fully reproduced below:
|
||||
|
||||
SLA0051 Rev3/May 2020
|
||||
|
||||
Software license agreement
|
||||
|
||||
BY CLICKING ON THE "I ACCEPT" BUTTON OR BY UNZIPPING, INSTALLING, COPYING, DOWNLOADING, ACCESSING
|
||||
OR OTHERWISE USING THIS SOFTWARE (HEREINAFTER “SOFTWARE” MEANS THE RELATED SOFTWARE,
|
||||
DOCUMENTATION, OTHER MATERIALS, AND ANY PARTS, PERMITTED MODIFICATIONS, AND PERMITTED
|
||||
DERIVATIVES THEREOF) FROM STMICROELECTRONICS INTERNATIONAL N.V, SWISS BRANCH AND/OR ITS
|
||||
AFFILIATED COMPANIES (“STMICROELECTRONICS”), THE RECIPIENT, ON BEHALF OF HIMSELF OR HERSELF, OR ON
|
||||
BEHALF OF ANY ENTITY BY WHICH SUCH RECIPIENT IS EMPLOYED AND/OR ENGAGED (“YOU”) AGREES TO BE
|
||||
BOUND BY THIS AGREEMENT.
|
||||
|
||||
You represent that you have the authority to enter into this Agreement. You will comply with all laws, including export laws.
|
||||
STMicroelectronics’s failure or delay to enforce this Agreement does not waive STMicroelectronics’s rights. Swiss law, except
|
||||
conflict of laws, governs this Agreement, and the parties consent to exclusive jurisdiction of courts in Switzerland for litigation of
|
||||
this Agreement.
|
||||
Subject to the below disclaimer, the redistribution, reproduction and use in source and binary forms of the software or any part
|
||||
thereof, with or without modification, are permitted provided that the following conditions are met:
|
||||
1. Redistribution of source code (modified or not) must retain any copyright notice, this list of conditions and the following
|
||||
disclaimer.
|
||||
2. Redistributions in binary form, except as embedded into a microcontroller or microprocessor device or a software update
|
||||
for such device, must reproduce any copyright notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
3. Neither the name of STMicroelectronics nor the names of other contributors to this software may be used to endorse or
|
||||
promote products using or derived from this software or part thereof without specific written permission.
|
||||
4. This software or any part thereof, including modifications and/or derivative works of this software, must be used and
|
||||
execute solely and exclusively in combination with an integrated circuit that is manufactured by or for STMicroelectronics
|
||||
and is an NFC tag, NFC dynamic tag, NFC reader, or UHF reader.
|
||||
5. No use, reproduction or redistribution of this software may be done in any manner that would subject this software to any
|
||||
Open Source Terms. “Open Source Terms” shall mean any open source license which requires as part of distribution of
|
||||
software that the source code of such software is distributed therewith or otherwise made available, or open source license
|
||||
that substantially complies with the Open Source definition specified at www.opensource.org and any other comparable
|
||||
open source license such as for example GNU General Public License (GPL), Eclipse Public License (EPL), Apache
|
||||
Software License, BSD license and MIT license.
|
||||
6. STMicroelectronics has no obligation to provide any maintenance, support or updates for the software.
|
||||
7. The software is and will remain the exclusive property of STMicroelectronics and its licensors. The recipient will not take
|
||||
any action that jeopardizes STMicroelectronics and its licensors' proprietary rights or acquire any rights in the software,
|
||||
except the limited rights specified hereunder.
|
||||
8. Redistribution and use of this software partially or any part thereof other than as permitted under this license is void and
|
||||
will automatically terminate your rights under this license.
|
||||
|
||||
DISCLAIMER
|
||||
THIS SOFTWARE IS PROVIDED BY STMICROELECTRONICS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS,
|
||||
IMPLIED OR STATUTORY WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT OF THIRD PARTY
|
||||
INTELLECTUAL PROPERTY RIGHTS ARE DISCLAIMED TO THE FULLEST EXTENT PERMITTED BY LAW. IN NO EVENT
|
||||
SHALL STMICROELECTRONICS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
|
||||
GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
|
||||
ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY
|
||||
OF SUCH DAMAGE.
|
||||
EXCEPT AS EXPRESSLY PERMITTED HEREUNDER, NO LICENSE OR OTHER RIGHTS, WHETHER EXPRESS OR
|
||||
IMPLIED, ARE GRANTED UNDER ANY PATENT OR OTHER INTELLECTUAL PROPERTY RIGHTS OF
|
||||
STMICROELECTRONICS OR ANY THIRD PARTY.
|
||||
@@ -0,0 +1,426 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="generator" content="pandoc" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
<title>Release Notes for NDEF message software Library</title>
|
||||
<style type="text/css">
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
span.underline{text-decoration: underline;}
|
||||
div.column{display: inline-block; vertical-align: top; width: 50%;}
|
||||
</style>
|
||||
<link rel="stylesheet" href="_htmresc/mini-st.css" />
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
|
||||
<![endif]-->
|
||||
<link rel="icon" type="image/x-icon" href="_htmresc/favicon.png" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-lg-4">
|
||||
<center>
|
||||
<h1 id="release-notes-for-rfal-software-library"><small>Release Notes for</small> <strong>RFAL software Library</strong></h1>
|
||||
<p>Copyright © 2022 STMicroelectronics<br />
|
||||
</p>
|
||||
<a href="https://www.st.com" class="logo"><img src="_htmresc/st_logo.png" alt="ST logo" /></a>
|
||||
</center>
|
||||
<h1 id="purpose">Purpose</h1>
|
||||
<p>The <strong>RFAL Library (RF Abstraction Layer)</strong> provides several functionalities required to perform RF/NFC communications.The RFAL encapsulates the different RF ICs (ST25R3911, ST25R3916, ST25R200, ST25R500, ST25R95 and future ST25R devices) into a common and easy to use interface.</p>
|
||||
<p>The technologies currently supported by RFAL are:</p>
|
||||
<ul>
|
||||
<li> NFC-A \ ISO14443A (T1T, T2T, T4TA) </li>
|
||||
<li> NFC-B \ ISO14443B (T4TB) </li>
|
||||
<li> NFC-F \ FeliCa (T3T) </li>
|
||||
<li> NFC-V \ ISO15693 (T5T) </li>
|
||||
<li> P2P \ ISO18092 (NFCIP1, Passive-Active P2P) </li>
|
||||
<li> ST25TB (ISO14443-2 Type B with Proprietary Protocol) </li>
|
||||
<li> PicoPass \ iClass </li>
|
||||
<li> B' \ Calypso </li>
|
||||
<li> CTS \ CTM </li>
|
||||
</ul>
|
||||
<p>The protocols provided by RFAL are: </p>
|
||||
<ul>
|
||||
<li> ISO-DEP (ISO14443-4) </li>
|
||||
<li> NFC-DEP (ISO18092) </li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-sm-12 col-lg-8">
|
||||
<h1 id="update-history">Update History</h1>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section24" checked aria-hidden="true"> <label for="collapse-section24" aria-hidden="true">V4.0.2 / 02-April-2025</label>
|
||||
<div>
|
||||
<h2 id="main-changes">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed vulnerability during EMD handling on fast systems, introduced at v4.0.0 targeted for high latency systems </li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section23" aria-hidden="true"> <label for="collapse-section23" aria-hidden="true">V4.0.0 / 17-March-2025</label>
|
||||
<div>
|
||||
<h2 id="main-changes-1">Main Changes</h2>
|
||||
<ul>
|
||||
<li>ST25R500/ST25R300 support added</li>
|
||||
<li>ISO-DEP improved. Fixed SFGI usage in Listen mode, ISO-DEP FSD check in Reader mode</li>
|
||||
<li>Improved robustness for EMD handling on high latency systems</li>
|
||||
<li>Improve portability using uintptr_t (C99)</li>
|
||||
<li>Added support for Direct Command chaining</li>
|
||||
<li>Several improvements on Card Detection and Heartbeat</li>
|
||||
<li>DPO module extended. Configurable measurement and adjust methods, interfaces and new adjustment flag added.</li>
|
||||
<li>DPO CR (Current Regulation) added (ST25R500 only)</li>
|
||||
<li>Added Dynamic LMA module. Optional LMA adjustments can be used in Listen/CE mode</li>
|
||||
<li>Several new APIs added in rfalChip section for more measurments and adjustments</li>
|
||||
<li>New RFAL_CMATH switch added to enable the usage of C mathematical operations - previously RFAL_ACCURATE_RSSI</li>
|
||||
<li>Removed obsolete compile switches</li>
|
||||
<li>New timer API to retrieve remaining time</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section22" aria-hidden="true"> <label for="collapse-section22" aria-hidden="true">V3.0.1 / 12-September-2024</label>
|
||||
<div>
|
||||
<h2 id="main-changes-2">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed condition that prevents usage of WU default parameters on ST25R3916 (not ST25R3916B) if AAT enabled</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section21" aria-hidden="true"> <label for="collapse-section21" aria-hidden="true">V3.0.0 / 10-June-2024</label>
|
||||
<div>
|
||||
<h2 id="main-changes-3">Main Changes</h2>
|
||||
<ul>
|
||||
<li>ST25R200/ST25R100 support added</li>
|
||||
<li>Changed rfalDeinitialize procedure to ensure ST25R is set in PD mode</li>
|
||||
<li>Added new interface to check whether Wake-up mode is enabled</li>
|
||||
<li>Extended NFC/HL to allow to configure whether to poll ahead of going to wake-up mode</li>
|
||||
<li>Improved ISO-DEP buffer handling during Listen mode activation</li>
|
||||
<li>Improved RFAL NFC/HL layer handling during discovery, particularly for AP2P</li>
|
||||
<li>DPO extended to allow adjustment without a communication mode previously set</li>
|
||||
<li>Updated ST25R3916 to ensure MOSI state during read operation</li>
|
||||
<li>Extended MISRA C / CERT C coverage to DPO and CD modules</li>
|
||||
<li>Introduced WLC WPT API declarations</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section20" aria-hidden="true"> <label for="collapse-section20" aria-hidden="true">V2.10.0 / 16-February-2024</label>
|
||||
<div>
|
||||
<h2 id="main-changes-4">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Feature switches no longer disabled by omission. User configs at rfal_platform.h or by default by rfal_defConfig.h</li>
|
||||
<li>Ensure ST25R3916B AWS is disabled during regulator adjustment</li>
|
||||
<li>Extended WU mode to allow the reference measurement to be obtained from WU/PD mode (ST25R3911 and ST25R3916)</li>
|
||||
<li>Extended NFC/HL to allow to configure whether to poll ahead of going to wake-up mode</li>
|
||||
<li>Changed NFC/HL to only initialize Analog Configuration if not yet performed</li>
|
||||
<li>Added new interface to check if Wake-up mode is enabled</li>
|
||||
<li>Extended LED support for debug purposes</li>
|
||||
<li>ISO-DEP extended to ensure NFC-B TR2 / FDT Poll</li>
|
||||
<li>Updated DID handling in ISO-DEP</li>
|
||||
<li>Added Listen mode modulation Get and Set interfaces</li>
|
||||
<li>Introduced Listen mode External Field On callback</li>
|
||||
<li>ST25TB UID integrity checked during Pcall16 anticollision</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section19" aria-hidden="true"> <label for="collapse-section19" aria-hidden="true">V2.8.0 / 14-December-2022</label>
|
||||
<div>
|
||||
<h2 id="main-changes-5">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Incorporated RFAL dependecies (utils, errno) into library to make library more self-contained</li>
|
||||
<li>Prepended RFAL prefix into user configuration file platform.h --> rfal_platform.h (breaks compatibility with previous versions, see example in rfal.chm))</li>
|
||||
<li>Introduced default configuration rfal_defConfig.h
|
||||
<li>Improved ISO-DEP Deselect sequence</li>
|
||||
<li>Changed the RFAL NFC/HL layer to make use of non blocking ISO-DEP Deselect procedure</li>
|
||||
<li>Several improvements and fixes on RFAL NFC/HL layer, including deactivation procedure and compliance mode used for ISO-DEP</li>
|
||||
<li>Extended ISO15693 anticollsion APIs to allow larger receptions</li>
|
||||
<li>Improved library error checking and portability</li>
|
||||
<li>New APIs introduced in rfalChip interface</li>
|
||||
<li>Extended rfalLowPowerModeStart to receive a mode to be set</li>
|
||||
<li>Added RFAL Card Detection/Protection module</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section18" aria-hidden="true"> <label for="collapse-section18" aria-hidden="true">V2.6.0 / 19-January-2022</label>
|
||||
<div>
|
||||
<h2 id="main-changes-6">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Introduced support for ST25R3916B</li>
|
||||
<li>Extended NFC technology modules with non-blocking APIs for card activation (Technology detection, Collision Resolution and Activation)</li>
|
||||
<li>Extended NFC/HL module with option to bail out, deactivation types, and usage of new non-blocking APIs</li>
|
||||
<li>Added new transceive flag for CRC check on Rx</li>
|
||||
<li>Better aligned NFC-V special frame timings to NFC Forum Digital</li>
|
||||
<li>Further improved compliance to CERT C</li>
|
||||
<li>Corrected PAD length in SENSF_RES</li>
|
||||
<li>Modified Field Detector to manual setting for RF Collision avoidance / Field On (ST25R3916) due to high temperature limitation</li>
|
||||
<li>Changed default Field On mechanism from RF Collision avoidance to transmitter enable (ST25R3911) due to high temperature limitation</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section17" aria-hidden="true"> <label for="collapse-section17" aria-hidden="true">V2.4.0 / 14-June-2021</label>
|
||||
<div>
|
||||
<h2 id="main-changes-7">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Aligned to NFC Forum CR12</li>
|
||||
<li>EMD error handling simplified/renamed</li>
|
||||
<li>SW license disclaimer updated</li>
|
||||
<li>Added ST25R device selection check</li>
|
||||
<li>Improved SPI initialization sequence</li>
|
||||
<li>Modified certain chip specific features/definitions</li>
|
||||
<li>Added API for retrieving Wake-up status</li>
|
||||
<li>Extended available parameters on NFC/HL module</li>
|
||||
<li>Introduced support for proprietary NFC technology on NFC/HL module</li>
|
||||
<li>Introduced Transceive start synchronization callback</li>
|
||||
<li>Extended support for non-blocking activation</li>
|
||||
<li>Extended ST25R3916 SW Tag Detection with fractional delta option</li>
|
||||
<li>Improved compliance to CERT C</li>
|
||||
<li>Added handling for ST25R3916 PPON2 timer limitation</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section16" aria-hidden="true"> <label for="collapse-section16" aria-hidden="true">V2.2.0 / 22-May-2020</label>
|
||||
<div>
|
||||
<h2 id="main-changes-8">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Better alignment to NFC Forum latest requirements (CR12)</li>
|
||||
<li>Extended NFC-V module with non-addressed mode support and improved aticollision</li>
|
||||
<li>Feature Switches changed to be not mandatory. Modules disabled by default</li>
|
||||
<li>Aligned APIs on platform.h (breaks compatibility with previous versions, see example in rfal.chm)</li>
|
||||
<li>Added API for release/deletion of timers</li>
|
||||
<li>ST25R3916 default analog table modified to X-NUCLEO-NFC12A1 board</li>
|
||||
<li>Improved AP2P operation</li>
|
||||
<li>Fixed issues introduced on previous release linked to SFGT and anticollision retries</li>
|
||||
<li>Introduced Low-Power mode</li>
|
||||
<li>Several driver improvements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section15" aria-hidden="true"> <label for="collapse-section15" aria-hidden="true">V2.1.2 / 27-January-2020</label>
|
||||
<div>
|
||||
<h2 id="main-changes-9">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Extended ISO-DEP and NFC-A module to support non-blocking activation interfaces</li>
|
||||
<li>Extended NFC/HL module to make use of the new APIs further splitting the execution of the worker during the different activities</li>
|
||||
<li>Modified NFC-A anticollision to strictly comply to NFC Forum DP. A separate proprietary method is now available.</li>
|
||||
<li>NFC-V changed to use OOK (100% AM) by default</li>
|
||||
<li>Fixed FWT used by NFC-V Sleep</li>
|
||||
<li>Fixed NFC-F FDT Poll value</li>
|
||||
<li>Fixed incorrect register access on ST25R3911B RFO Get/Set method</li>
|
||||
<li>SPI driver modified to clear Rx buffer prior to operation</li>
|
||||
<li>Added further code size optimizations based on enabled features</li>
|
||||
<li>Updated ST25R3916 driver to DS Rev2</li>
|
||||
<li>Updated SW Tag Detection as describded in AN Rev3</li>
|
||||
<li>Several driver improvements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section14" aria-hidden="true"> <label for="collapse-section14" aria-hidden="true">V2.1.0 / 30-September-2019</label>
|
||||
<div>
|
||||
<h2 id="main-changes-10">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Extended RFAL NFC Higher Layer for increased functionality and configurations</li>
|
||||
<li>Several improvements on the ISO-DEP protocol layer</li>
|
||||
<li>Protocol buffer sizes made fully configurable for increased memory management</li>
|
||||
<li>Introduced option for Collision Avoidance with Automatic Gain Control</li>
|
||||
<li>Several driver improvements</li>
|
||||
<li>ST25R3916 overheat protection disabled</li>
|
||||
<li>RF Transceive modified for transmission errors to precede other errors</li>
|
||||
<li>Analog Configs extended to support different DPO power levels</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section13" aria-hidden="true"> <label for="collapse-section13" aria-hidden="true">V2.0.10 / 25-June-2019</label>
|
||||
<div>
|
||||
<h2 id="main-changes-11">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Various improvements on RFAL NFC Higher layer</li>
|
||||
<li>Added alternative NFC-V anticollision method (non NFC Forum compliant)</li>
|
||||
<li>Several minor improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section12" aria-hidden="true"> <label for="collapse-section12" aria-hidden="true">V2.0.6 / 10-April-2019</label>
|
||||
<div>
|
||||
<h2 id="main-changes-12">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Several NFC-V interoperability improvements</li>
|
||||
<li>Extended support for specific features of ST's ISO15693 Tags. New ST25Dx module added</li>
|
||||
<li>Interrupt handling changed and further protection added</li>
|
||||
<li>RFAL feature switches have been modified and features are now disabled if omitted</li>
|
||||
<li>ST25R3916 AAT (Automatic Antenna Tunning) module added</li>
|
||||
<li>RFAL NFC Higher layer added</li>
|
||||
<li>Several driver improvements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section11" aria-hidden="true"> <label for="collapse-section11" aria-hidden="true">V2.0.4 / 06-February-2019</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3916-disco-v1.0.0-emvco-v1.2.0">Provided with ST25R3916 DISCO v1.0.0 / EMVCo v1.2.0</h2>
|
||||
<h2 id="main-changes-13">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Minor improvements on NFC-F module</li>
|
||||
<li>Several improvements on NFC-V module including support for ST proprietary features</li>
|
||||
<li>Fixed issue with Delta RWT calculation</li>
|
||||
<li>Fixed incorrect usage of NFCB dTbPoll / DdFWT</li>
|
||||
<li>Added compile switch for Listen Mode</li>
|
||||
<li>Low power Listen Mode support added</li>
|
||||
<li>Listen Mode aligned to NFC Forum Digital 2.1</li>
|
||||
<li>Added handling for EMVCo 3.0 static FDTListen</li>
|
||||
<li>Introduced SW Tag Detection</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section10" aria-hidden="true"> <label for="collapse-section10" aria-hidden="true">V2.0.2 / 31-October-2018</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3916-disco-v0.9.4-binary-only">Provided with ST25R3916 DISCO v0.9.4 (binary only)</h2>
|
||||
<h2 id="main-changes-14">Main Changes</h2>
|
||||
<ul>
|
||||
<li>New T4T module added</li>
|
||||
<li>Added support for T3T Check and Update commands</li>
|
||||
<li>Improved NFC-V module and added Write Multiple Blocks support</li>
|
||||
<li>New rfalWorker protection added for improved control in multi-thread environments</li>
|
||||
<li>Added support for user defined Analog Config tables</li>
|
||||
<li>Several driver improvements and protections added</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section9" aria-hidden="true"> <label for="collapse-section9" aria-hidden="true">V2.0.0 / 28-August-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-15">Main Changes</h2>
|
||||
<ul>
|
||||
<li>MISRA C 2012 compliant</li>
|
||||
<li>ST25R3916 support added</li>
|
||||
<li>ST25R95 support added</li>
|
||||
<li>Fix unwanted Field Detector disable when entering Wake-up mode</li>
|
||||
<li>Extended Analog Config to have specific events</li>
|
||||
<li>Fixed NFC-DEP potential issue if DID used</li>
|
||||
<li>Extended NFC-V commands</li>
|
||||
<li>T2T module added</li>
|
||||
<li>Improved initial Listen mode handling</li>
|
||||
<li>Extended Wake-Up mode to support Capacitive measurement</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.3.6 / 08-May-2018</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-disco-v1.2.0">Provided with ST25R3911B DISCO v1.2.0</h2>
|
||||
<h2 id="main-changes-16">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed NFC-V Read operation in addressed mode</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.3.4 / 07-May-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-17">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed NFC-V Read operation in addressed mode</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.3.2 / 31-January-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-18">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Modified Wake-Up mode interface</li>
|
||||
<li>Fixed SFGI calculation in ISO-DEP</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.3.0 / 22-January-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-19">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Introduced a new IRQ status handling to read the registers only once</li>
|
||||
<li>Several changes for supporting Linux platform</li>
|
||||
<li>SPI Select/Deselect moved to platform.h</li>
|
||||
<li>Aditional protection of the IRQ status reading, new macros available: platformProtectST25R391xIrqStatus / platformUnprotectST25R391xIrqStatus</li>
|
||||
<li>Renamed the IRQ Enable/Disable macros to platformProtectST25R391xComm / platformUnprotectST25R391xComm</li>
|
||||
<li>Renamed SPI pins from chip specific to ST25R391X</li>
|
||||
<li>Introduced a new option ST25R391X_COM_SINGLETXRX which executes SPI in one single exchange (additional buffer required)</li>
|
||||
<li>Updated and added errata handlings to latest ST25R3911 Errata version</li>
|
||||
<li>Fixed inconsitency on Analog settings for NFC-V</li>
|
||||
<li>Fixed issue on NFC-V 1of256 decoding</li>
|
||||
<li>Changed the default NFC-A FDT Listen to be more strict</li>
|
||||
<li>Added Wake-Up mode support</li>
|
||||
<li>Added RFAL version definition</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.2.0 / 17-August-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-disco-v1.1.16">Provided with ST25R3911B DISCO v1.1.16</h2>
|
||||
<h2 id="main-changes-20">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Aligned Technology modules to NFC Activity v1.1 and EMVCo v2.6</li>
|
||||
<li>Extended NFC-B Collision Resolution allowing user define Slots</li>
|
||||
<li>Added feature switches to enable/disable individual modules</li>
|
||||
<li>ISO-DEP Interface changes allowing more user configurations and further EMVCo alignment</li>
|
||||
<li>Changed ST25TB detection to always perform Anti Collision loop regardeless of the result of the Poll</li>
|
||||
<li>Fixed FIFO WL handling</li>
|
||||
<li>Modified FDT Poll handling</li>
|
||||
<li>Changed rfalCalibrate() to not overwrite dynamic configs</li>
|
||||
<li>Added adjustment for TR1PUTMIN</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.1.0 / 30-June-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-disco-v1.1.12">Provided with ST25R3911B DISCO v1.1.12</h2>
|
||||
<h2 id="main-changes-21">Main Changes</h2>
|
||||
<ul>
|
||||
<li>EMD supression enabled for ST25R3911B</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.0.0 / 16-May-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-x-nucleo-nfc05a1-v1.0.0">Provided with X-NUCLEO-NFC05A1 v1.0.0</h2>
|
||||
<h2 id="main-changes-22">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Added support for B', CTS and PicoPass/iClass mode</li>
|
||||
<li>Several impromvements for NFC-V mode</li>
|
||||
<li>Improved error detection during NFC-B collision resolution</li>
|
||||
<li>Extended T1T module</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V0.9.0 / 02-March-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-discovery-kit-on-embedded-world-conference-binary-only">Provided with ST25R3911B Discovery Kit on Embedded World Conference (binary only)</h2>
|
||||
<h2 id="main-changes-23">Main Changes</h2>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="sticky">
|
||||
<p>For complete documentation on <strong>STM32</strong> microcontrollers please visit: <a href="https://www.st.com/en/microcontrollers-microprocessors.html">www.st.com</a></p>
|
||||
This release note uses up to date web standards and, for this reason, should not be opened with Internet Explorer but preferably with popular browsers such as Google Chrome, Mozilla Firefox, Opera or Microsoft Edge.
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
@@ -0,0 +1,475 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_analogConfig.c
|
||||
* @author MMY Application Team
|
||||
* @brief Funcitons to manage and set analog settings.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_analogConfig.h"
|
||||
#include "rfal_chip.h"
|
||||
#include "rfal_utils.h"
|
||||
#include "rfal_platform.h"
|
||||
|
||||
|
||||
#define RFAL_TEST_REG 0x0080U /*!< Test Register indicator */
|
||||
|
||||
/* Check whether the Default Analog settings are to be used or custom ones */
|
||||
#ifdef RFAL_ANALOG_CONFIG_CUSTOM
|
||||
extern const uint8_t rfalAnalogConfigCustomSettings[];
|
||||
extern const uint16_t rfalAnalogConfigCustomSettingsLength;
|
||||
#else
|
||||
#include "rfal_analogConfigTbl.h"
|
||||
#endif
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL DATA TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
|
||||
static uint8_t gRfalAnalogConfig[RFAL_ANALOG_CONFIG_TBL_SIZE]; /*!< Analog Configuration Settings List */
|
||||
#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
|
||||
|
||||
|
||||
/*! Struct for Analog Config Look Up Table Update */
|
||||
typedef struct {
|
||||
const uint8_t *currentAnalogConfigTbl; /*!< Reference to start of current Analog Configuration */
|
||||
uint16_t configTblSize; /*!< Total size of Analog Configuration */
|
||||
bool ready; /*!< Indicate if Look Up Table is complete and ready for use */
|
||||
} rfalAnalogConfigMgmt;
|
||||
|
||||
static rfalAnalogConfigMgmt gRfalAnalogConfigMgmt; /*!< Analog Configuration LUT management */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL TABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
static rfalAnalogConfigNum rfalAnalogConfigSearch( rfalAnalogConfigId configId, uint16_t *configOffset );
|
||||
|
||||
#if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
|
||||
static void rfalAnalogConfigPtrUpdate( const uint8_t* analogConfigTbl );
|
||||
#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL VARIABLE DEFINITIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalAnalogConfigInitialize( void )
|
||||
{
|
||||
/* Use default Analog configuration settings in Flash by default. */
|
||||
|
||||
/* Check whether the Default Analog settings are to be used or custom ones */
|
||||
#ifdef RFAL_ANALOG_CONFIG_CUSTOM
|
||||
gRfalAnalogConfigMgmt.currentAnalogConfigTbl = rfalAnalogConfigCustomSettings;
|
||||
gRfalAnalogConfigMgmt.configTblSize = rfalAnalogConfigCustomSettingsLength;
|
||||
#else
|
||||
gRfalAnalogConfigMgmt.currentAnalogConfigTbl = rfalAnalogConfigDefaultSettings;
|
||||
gRfalAnalogConfigMgmt.configTblSize = sizeof(rfalAnalogConfigDefaultSettings);
|
||||
#endif
|
||||
|
||||
gRfalAnalogConfigMgmt.ready = true;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
bool rfalAnalogConfigIsReady( void )
|
||||
{
|
||||
return gRfalAnalogConfigMgmt.ready;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalAnalogConfigListWriteRaw( const uint8_t *configTbl, uint16_t configTblSize )
|
||||
{
|
||||
#if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
|
||||
|
||||
/* Check if the Configuration Table exceed the Table size */
|
||||
if ( configTblSize >= RFAL_ANALOG_CONFIG_TBL_SIZE )
|
||||
{
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
/* Check for invalid parameters */
|
||||
if( (configTbl == NULL) || (configTblSize == 0U) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* NOTE: On this API (rfalAnalogConfigListWriteRaw) the current AC Table is not reset upon error, as on rfalAnalogConfigListWrite. */
|
||||
/* On rfalAnalogConfigListWrite the AC table is written in mutiple chunks of data which may lead to an invalid|incomplte AC */
|
||||
/* table if an error arises, where here the whole AC Table is written all together. */
|
||||
|
||||
/* NOTE: Function does not check for the validity of the Table contents (conf IDs, conf sets, register address) */
|
||||
RFAL_MEMCPY( gRfalAnalogConfig, configTbl, configTblSize );
|
||||
|
||||
/* Update the total size of configuration settings */
|
||||
gRfalAnalogConfigMgmt.configTblSize = configTblSize;
|
||||
|
||||
rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
|
||||
return RFAL_ERR_NONE;
|
||||
|
||||
#else
|
||||
|
||||
/* If Analog Configuration Update is to be disabled */
|
||||
RFAL_NO_WARNING(configTbl);
|
||||
RFAL_NO_WARNING(configTblSize);
|
||||
return RFAL_ERR_REQUEST;
|
||||
|
||||
#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalAnalogConfigListWrite( uint8_t more, const rfalAnalogConfig *config )
|
||||
{
|
||||
#if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
|
||||
|
||||
rfalAnalogConfigId configId;
|
||||
rfalAnalogConfigNum numConfig;
|
||||
uint8_t configSize;
|
||||
|
||||
if( true == gRfalAnalogConfigMgmt.ready )
|
||||
{ /* First Update to the Configuration list */
|
||||
gRfalAnalogConfigMgmt.ready = false; /* Invalidate the config List */
|
||||
gRfalAnalogConfigMgmt.configTblSize = 0; /* Clear the config List */
|
||||
}
|
||||
|
||||
configId = RFAL_GETU16(config->id);
|
||||
|
||||
/* Check validity of the Configuration ID. */
|
||||
/* NOTE: Direction DPO uses 2msb of the Technology field as level indicator */
|
||||
if( ((RFAL_ANALOG_CONFIG_TECH_RFU <= RFAL_ANALOG_CONFIG_ID_GET_TECH(configId)) && ((RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId) != RFAL_ANALOG_CONFIG_DPO) && (RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId) != RFAL_ANALOG_CONFIG_DLMA)) )
|
||||
||((RFAL_ANALOG_CONFIG_BITRATE_6780 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)) && (RFAL_ANALOG_CONFIG_BITRATE_211p88 > RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)))
|
||||
||(RFAL_ANALOG_CONFIG_BITRATE_1p6 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId))
|
||||
)
|
||||
{
|
||||
rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
numConfig = config->num;
|
||||
configSize = (uint8_t)(sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) + (numConfig * sizeof(rfalAnalogConfigRegAddrMaskVal)));
|
||||
|
||||
/* Check if the Configuration Set exceed the Table size. */
|
||||
if( RFAL_ANALOG_CONFIG_TBL_SIZE <= (gRfalAnalogConfigMgmt.configTblSize + configSize) )
|
||||
{
|
||||
rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
/* NOTE: Function does not check for the validity of the Register Address. */
|
||||
RFAL_MEMCPY(&gRfalAnalogConfig[gRfalAnalogConfigMgmt.configTblSize], (const uint8_t*)config, configSize);
|
||||
|
||||
/* Increment the total size of configuration settings. */
|
||||
gRfalAnalogConfigMgmt.configTblSize += configSize;
|
||||
|
||||
/* Check if it is the last Analog Configuration to load. */
|
||||
if( RFAL_ANALOG_CONFIG_UPDATE_LAST == more )
|
||||
{ /* Update the Analog Configuration to the new settings. */
|
||||
rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
|
||||
#else
|
||||
|
||||
/* If Analog Configuration Update is to be disabled */
|
||||
RFAL_NO_WARNING(config);
|
||||
RFAL_NO_WARNING(more);
|
||||
return RFAL_ERR_DISABLED;
|
||||
|
||||
#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalAnalogConfigListReadRaw( uint8_t *tblBuf, uint16_t tblBufLen, uint16_t *configTblSize )
|
||||
{
|
||||
/* Check if the the current table will fit into the given buffer */
|
||||
if( tblBufLen < gRfalAnalogConfigMgmt.configTblSize )
|
||||
{
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
/* Check for invalid parameters */
|
||||
if( (configTblSize == NULL) || (tblBuf == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Copy the whole Table to the given buffer */
|
||||
if( gRfalAnalogConfigMgmt.configTblSize > 0U ) /* MISRA 21.18 */
|
||||
{
|
||||
RFAL_MEMCPY( tblBuf, gRfalAnalogConfigMgmt.currentAnalogConfigTbl, gRfalAnalogConfigMgmt.configTblSize );
|
||||
}
|
||||
*configTblSize = gRfalAnalogConfigMgmt.configTblSize;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalAnalogConfigListRead( rfalAnalogConfigOffset *configOffset, uint8_t *more, rfalAnalogConfig *config, rfalAnalogConfigNum numConfig )
|
||||
{
|
||||
uint16_t configSize;
|
||||
const rfalAnalogConfigOffset offset = *configOffset;
|
||||
rfalAnalogConfigNum numConfigSet;
|
||||
|
||||
/* Check if the number of register-mask-value settings for the respective Configuration ID will fit into the buffer passed in. */
|
||||
if( gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId)] > numConfig )
|
||||
{
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
/* Get the number of Configuration set */
|
||||
numConfigSet = gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId)];
|
||||
|
||||
/* Pass Configuration Register-Mask-Value sets */
|
||||
configSize = (sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) + (uint16_t)(numConfigSet * sizeof(rfalAnalogConfigRegAddrMaskVal)));
|
||||
RFAL_MEMCPY( (uint8_t*) config
|
||||
, &gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset]
|
||||
, configSize
|
||||
);
|
||||
*configOffset = offset + configSize;
|
||||
|
||||
/* Check if it is the last Analog Configuration in the Table.*/
|
||||
*more = (uint8_t)((*configOffset >= gRfalAnalogConfigMgmt.configTblSize) ? RFAL_ANALOG_CONFIG_UPDATE_LAST
|
||||
: RFAL_ANALOG_CONFIG_UPDATE_MORE);
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSetAnalogConfig( rfalAnalogConfigId configId )
|
||||
{
|
||||
rfalAnalogConfigOffset configOffset = 0;
|
||||
rfalAnalogConfigNum numConfigSet;
|
||||
const rfalAnalogConfigRegAddrMaskVal *configTbl;
|
||||
ReturnCode retCode = RFAL_ERR_NONE;
|
||||
rfalAnalogConfigNum i;
|
||||
|
||||
if( true != gRfalAnalogConfigMgmt.ready )
|
||||
{
|
||||
return RFAL_ERR_REQUEST;
|
||||
}
|
||||
|
||||
/* Search LUT for the specific Configuration ID */
|
||||
while( true )
|
||||
{
|
||||
numConfigSet = rfalAnalogConfigSearch(configId, &configOffset);
|
||||
if( RFAL_ANALOG_CONFIG_LUT_NOT_FOUND == numConfigSet )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
configTbl = (rfalAnalogConfigRegAddrMaskVal *)( (uintptr_t)gRfalAnalogConfigMgmt.currentAnalogConfigTbl + (uint32_t)configOffset);
|
||||
/* Increment the offset to the next index to search from */
|
||||
configOffset += (uint16_t)(numConfigSet * sizeof(rfalAnalogConfigRegAddrMaskVal));
|
||||
|
||||
if ((gRfalAnalogConfigMgmt.configTblSize + 1U) < configOffset)
|
||||
{ /* Error check make sure that the we do not access outside the configuration Table Size */
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
for ( i = 0; i < numConfigSet; i++)
|
||||
{
|
||||
if( (RFAL_GETU16(configTbl[i].addr) & RFAL_TEST_REG) != 0U )
|
||||
{
|
||||
RFAL_EXIT_ON_ERR(retCode, rfalChipChangeTestRegBits( (RFAL_GETU16(configTbl[i].addr) & ~RFAL_TEST_REG), configTbl[i].mask, configTbl[i].val) );
|
||||
}
|
||||
else
|
||||
{
|
||||
RFAL_EXIT_ON_ERR(retCode, rfalChipChangeRegBits( RFAL_GETU16(configTbl[i].addr), configTbl[i].mask, configTbl[i].val) );
|
||||
}
|
||||
}
|
||||
|
||||
} /* while(found Analog Config Id) */
|
||||
|
||||
return retCode;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
uint16_t rfalAnalogConfigGenModeID( rfalMode md, rfalBitRate br, uint16_t dir )
|
||||
{
|
||||
uint16_t id;
|
||||
|
||||
/* Assign Poll/Listen Mode */
|
||||
id = ((md >= RFAL_MODE_LISTEN_NFCA) ? RFAL_ANALOG_CONFIG_LISTEN : RFAL_ANALOG_CONFIG_POLL);
|
||||
|
||||
/* Assign Technology */
|
||||
switch( md )
|
||||
{
|
||||
case RFAL_MODE_POLL_NFCA:
|
||||
case RFAL_MODE_POLL_NFCA_T1T:
|
||||
case RFAL_MODE_LISTEN_NFCA:
|
||||
id |= RFAL_ANALOG_CONFIG_TECH_NFCA;
|
||||
break;
|
||||
|
||||
case RFAL_MODE_POLL_NFCB:
|
||||
case RFAL_MODE_POLL_B_PRIME:
|
||||
case RFAL_MODE_POLL_B_CTS:
|
||||
case RFAL_MODE_LISTEN_NFCB:
|
||||
id |= RFAL_ANALOG_CONFIG_TECH_NFCB;
|
||||
break;
|
||||
|
||||
case RFAL_MODE_POLL_NFCF:
|
||||
case RFAL_MODE_LISTEN_NFCF:
|
||||
id |= RFAL_ANALOG_CONFIG_TECH_NFCF;
|
||||
break;
|
||||
|
||||
case RFAL_MODE_POLL_NFCV:
|
||||
case RFAL_MODE_POLL_PICOPASS:
|
||||
id |= RFAL_ANALOG_CONFIG_TECH_NFCV;
|
||||
break;
|
||||
|
||||
case RFAL_MODE_POLL_ACTIVE_P2P:
|
||||
case RFAL_MODE_LISTEN_ACTIVE_P2P:
|
||||
id |= RFAL_ANALOG_CONFIG_TECH_AP2P;
|
||||
break;
|
||||
|
||||
default:
|
||||
id = RFAL_ANALOG_CONFIG_TECH_CHIP;
|
||||
break;
|
||||
}
|
||||
|
||||
/* Assign Bitrate */
|
||||
id |= (((((uint16_t)(br) >= (uint16_t)RFAL_BR_52p97) ? (uint16_t)(br) : ((uint16_t)(br)+1U)) << RFAL_ANALOG_CONFIG_BITRATE_SHIFT) & RFAL_ANALOG_CONFIG_BITRATE_MASK);
|
||||
|
||||
/* Assign Direction */
|
||||
id |= ((dir<<RFAL_ANALOG_CONFIG_DIRECTION_SHIFT) & RFAL_ANALOG_CONFIG_DIRECTION_MASK);
|
||||
|
||||
return id;
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Update the link to Analog Configuration LUT
|
||||
*
|
||||
* Update the link to the Analog Configuration LUT for the subsequent search
|
||||
* of Analog Settings.
|
||||
*
|
||||
* \param[in] analogConfigTbl: reference to the start of the new Analog Configuration Table
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
#if RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG
|
||||
static void rfalAnalogConfigPtrUpdate( const uint8_t* analogConfigTbl )
|
||||
{
|
||||
gRfalAnalogConfigMgmt.currentAnalogConfigTbl = analogConfigTbl;
|
||||
gRfalAnalogConfigMgmt.ready = true;
|
||||
}
|
||||
#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Search the Analog Configuration LUT for a specific Configuration ID.
|
||||
*
|
||||
* Search the Analog Configuration LUT for the Configuration ID.
|
||||
*
|
||||
* \param[in] configId: Configuration ID to search for.
|
||||
* \param[in] configOffset: Configuration Offset in Table
|
||||
*
|
||||
* \return number of Configuration Sets
|
||||
* \return #RFAL_ANALOG_CONFIG_LUT_NOT_FOUND in case Configuration ID is not found.
|
||||
*****************************************************************************
|
||||
*/
|
||||
static rfalAnalogConfigNum rfalAnalogConfigSearch( rfalAnalogConfigId configId, uint16_t *configOffset )
|
||||
{
|
||||
rfalAnalogConfigId foundConfigId;
|
||||
rfalAnalogConfigId configIdMaskVal;
|
||||
const uint8_t *configTbl;
|
||||
const uint8_t *currentConfigTbl;
|
||||
uint16_t i;
|
||||
|
||||
currentConfigTbl = gRfalAnalogConfigMgmt.currentAnalogConfigTbl;
|
||||
configIdMaskVal = ((RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK | RFAL_ANALOG_CONFIG_BITRATE_MASK)
|
||||
|((RFAL_ANALOG_CONFIG_TECH_CHIP == RFAL_ANALOG_CONFIG_ID_GET_TECH(configId)) ? (RFAL_ANALOG_CONFIG_TECH_MASK | RFAL_ANALOG_CONFIG_CHIP_SPECIFIC_MASK) : configId)
|
||||
|((RFAL_ANALOG_CONFIG_NO_DIRECTION == RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId)) ? RFAL_ANALOG_CONFIG_DIRECTION_MASK : configId)
|
||||
);
|
||||
|
||||
|
||||
/* When specific ConfigIDs are to be used, override search mask */
|
||||
if( (RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId) == RFAL_ANALOG_CONFIG_DPO) || (RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId) == RFAL_ANALOG_CONFIG_DLMA) )
|
||||
{
|
||||
configIdMaskVal = (RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK | RFAL_ANALOG_CONFIG_TECH_MASK | RFAL_ANALOG_CONFIG_BITRATE_MASK | RFAL_ANALOG_CONFIG_DIRECTION_MASK);
|
||||
}
|
||||
|
||||
i = (*configOffset);
|
||||
while( i < gRfalAnalogConfigMgmt.configTblSize )
|
||||
{
|
||||
configTbl = ¤tConfigTbl[i];
|
||||
foundConfigId = RFAL_GETU16(configTbl);
|
||||
if (configId == (foundConfigId & configIdMaskVal))
|
||||
{
|
||||
*configOffset = (uint16_t)(i + sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum));
|
||||
return configTbl[sizeof(rfalAnalogConfigId)];
|
||||
}
|
||||
|
||||
/* If Config Id does not match, increment to next Configuration Id */
|
||||
i += (uint16_t)( sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum)
|
||||
+ (configTbl[sizeof(rfalAnalogConfigId)] * sizeof(rfalAnalogConfigRegAddrMaskVal) )
|
||||
);
|
||||
} /* for */
|
||||
|
||||
return RFAL_ANALOG_CONFIG_LUT_NOT_FOUND;
|
||||
}
|
||||
@@ -0,0 +1,735 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_cd.c
|
||||
* @author MMY Application Team
|
||||
* @brief RFAL Card Detection
|
||||
* This module implements the Card Detection Algorithm.
|
||||
* It may be used for applications that require to identify if a card is on
|
||||
* the vicinity of the NFC antenna, for example: to protect cards against
|
||||
* damage by a wireless charger (WPC Qi PTx).
|
||||
*
|
||||
* Algorith details
|
||||
* - The algorithm treats multiple devices as if a card is present
|
||||
* - The algorithm will identify cards by the following distinguishing features
|
||||
* - Only cards support NFC-V or other non standard technologies (ST25TB, ...)
|
||||
* - Compliant cards support only a single technology
|
||||
* - The algorithm will identify phones by the following distinguishing features
|
||||
* - Only phones support P2P (NFC-DEP)
|
||||
* - Only phones are able to communicate on different NFC technologies
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_cd.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"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_CD_NFCF_DEVLIMIT 4U /*!< NFC-F device limit (TechDet aligned) */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Card Detection states */
|
||||
typedef enum{
|
||||
RFAL_CD_ST_IDLE, /*!< CD idle */
|
||||
RFAL_CD_ST_START, /*!< CD starting */
|
||||
RFAL_CD_ST_NFCA_INIT, /*!< NFC-A Initialization */
|
||||
RFAL_CD_ST_NFCA_TECHDET, /*!< NFC-A Technology Detection */
|
||||
RFAL_CD_ST_NFCA_COLRES_START, /*!< NFC-A Collision Resolution starting */
|
||||
RFAL_CD_ST_NFCA_COLRES, /*!< NFC-A Collision Resolution */
|
||||
RFAL_CD_ST_NFCB_INIT, /*!< NFC-B Initialization */
|
||||
RFAL_CD_ST_NFCB_TECHDET, /*!< NFC-B Technology Detection */
|
||||
RFAL_CD_ST_NFCB_COLRES_START, /*!< NFC-B Collision Resolution starting */
|
||||
RFAL_CD_ST_NFCB_COLRES, /*!< NFC-B Collision Resolution */
|
||||
RFAL_CD_ST_NFCF_INIT, /*!< NFC-F Initialization */
|
||||
RFAL_CD_ST_NFCF_TECHDET_START, /*!< NFC-F Technology Detection starting */
|
||||
RFAL_CD_ST_NFCF_TECHDET, /*!< NFC-F Technology Detection */
|
||||
RFAL_CD_ST_NFCF_COLRES_START, /*!< NFC-F Collision Resolution starting */
|
||||
RFAL_CD_ST_NFCF_COLRES, /*!< NFC-F Collision Resolution */
|
||||
RFAL_CD_ST_NFCV_INIT, /*!< NFC-V Initialization */
|
||||
RFAL_CD_ST_NFCV_TECHDET, /*!< NFC-V Technology Detection */
|
||||
RFAL_CD_ST_NFCV_COLRES_START, /*!< NFC-V Collision Resolution starting */
|
||||
RFAL_CD_ST_NFCV_COLRES, /*!< NFC-V Collision Resolution */
|
||||
RFAL_CD_ST_PROPRIETARY, /*!< Proprietary NFC Technologies starting */
|
||||
RFAL_CD_ST_ST25TB_INIT, /*!< ST25TB Initialization */
|
||||
RFAL_CD_ST_ST25TB_TECHDET, /*!< ST25TB Technology Detection */
|
||||
RFAL_CD_ST_CHECK_PROTO, /*!< Evaluate device(s) found and protocols */
|
||||
RFAL_CD_ST_HB_START, /*!< Heartbeat Detection start | Field reset*/
|
||||
RFAL_CD_ST_HB, /*!< Heartbeat Detection */
|
||||
RFAL_CD_ST_DETECTED, /*!< CD completed: card detected */
|
||||
RFAL_CD_ST_NOT_DETECTED, /*!< CD completed: No card detected */
|
||||
RFAL_CD_ST_ERROR /*!< Error during card detection */
|
||||
}rfalCdState;
|
||||
|
||||
|
||||
/*! Card Detection context */
|
||||
typedef struct{
|
||||
rfalCdState st; /*!< CD state */
|
||||
ReturnCode lastErr; /*!< Last occured error */
|
||||
rfalNfcaListenDevice nfcaDev; /*!< NFC-A Device Info */
|
||||
rfalNfcbListenDevice nfcbDev; /*!< NFC-B Device Info */
|
||||
rfalNfcfListenDevice nfcfDev[RFAL_CD_NFCF_DEVLIMIT]; /*!< NFC-F Device Info */
|
||||
uint8_t devCnt; /*!< Tech device counter */
|
||||
uint8_t mulDevCnt; /*!< Multi Tech device counter */
|
||||
rfalCdTech techFound; /*!< First NFC Technology found */
|
||||
bool skipTechFound; /*!< Second round ongoing, skip techFound */
|
||||
rfalCdRes *res; /*!< Card Detection output result location */
|
||||
uint32_t tmr; /*!< Field reset timer */
|
||||
}rfalCdCtx;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
static rfalCdCtx gCd;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
#ifdef RFAL_CD_HB
|
||||
extern bool rfalCdHbDetect( rfalCdTech tech );
|
||||
#endif /* RFAL_CD_HB */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalCdDetectCard( rfalCdRes *result )
|
||||
{
|
||||
ReturnCode err;
|
||||
|
||||
RFAL_EXIT_ON_ERR( err, rfalCdStartDetectCard( result ) );
|
||||
rfalRunBlocking( err, rfalCdGetDetectCardStatus() );
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalCdStartDetectCard( rfalCdRes *result )
|
||||
{
|
||||
if( result == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_START;
|
||||
gCd.res = result;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalCdGetDetectCardStatus( void )
|
||||
{
|
||||
ReturnCode err;
|
||||
rfalNfcaSensRes sensRes;
|
||||
rfalNfcbSensbRes sensbRes;
|
||||
rfalNfcvInventoryRes invRes;
|
||||
|
||||
|
||||
switch( gCd.st )
|
||||
{
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_START:
|
||||
|
||||
gCd.mulDevCnt = 0; /* Initialize Card Detection context */
|
||||
gCd.skipTechFound = false;
|
||||
gCd.techFound = RFAL_CD_TECH_NONE;
|
||||
gCd.tmr = RFAL_TIMING_NONE;
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCA_INIT;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCA_INIT:
|
||||
|
||||
/* Verify if we are performing multi technology check */
|
||||
if( (gCd.skipTechFound) )
|
||||
{
|
||||
/* If staring multi technology check if field has been Off long enough */
|
||||
if( (!platformTimerIsExpired(gCd.tmr)) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if( gCd.techFound == RFAL_CD_TECH_NFCA )
|
||||
{
|
||||
gCd.st = RFAL_CD_ST_NFCB_INIT; /* If single card card found before was NFC-A skip tech now */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
rfalNfcaPollerInitialize(); /* Initialize for NFC-A */
|
||||
err = rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */
|
||||
if( err != RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.lastErr = err;
|
||||
gCd.st = RFAL_CD_ST_ERROR; /* Unable to turn the field On, cannot continue Card Detection */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCA_TECHDET;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCA_TECHDET:
|
||||
|
||||
if( !rfalIsGTExpired() )
|
||||
{
|
||||
break; /* Wait until GT has been fulfilled */
|
||||
}
|
||||
|
||||
err = rfalNfcaPollerTechnologyDetection( RFAL_COMPLIANCE_MODE_ISO, &sensRes );
|
||||
if( err == RFAL_ERR_NONE )
|
||||
{
|
||||
if( gCd.skipTechFound ) /* Verify if we are performing multi technology check */
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_SINGLE_MULTI_TECH;
|
||||
gCd.st = RFAL_CD_ST_NOT_DETECTED;/* Single device was another technology and now NFC-A */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCA_COLRES_START; /* NFC-A detected perform collision resolution */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCB_INIT; /* NFC-A not detected, move to NFC-B */
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCA_COLRES_START:
|
||||
|
||||
err = rfalNfcaPollerStartFullCollisionResolution( RFAL_COMPLIANCE_MODE_ISO, 0, &gCd.nfcaDev, &gCd.devCnt );
|
||||
if( err != RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.lastErr = err;
|
||||
gCd.st = RFAL_CD_ST_ERROR; /* Collision resolution could not be performed */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCA_COLRES;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCA_COLRES:
|
||||
|
||||
err = rfalNfcaPollerGetFullCollisionResolutionStatus();
|
||||
if( err != RFAL_ERR_BUSY )
|
||||
{
|
||||
if( (err == RFAL_ERR_NONE) && (gCd.devCnt == 1U) ) /* Collision resolution OK and a single card was found */
|
||||
{
|
||||
gCd.mulDevCnt++;
|
||||
gCd.techFound = RFAL_CD_TECH_NFCA;
|
||||
}
|
||||
|
||||
/* Check if multiple cards or technologies have already been identified */
|
||||
if( (err != RFAL_ERR_NONE) || (gCd.devCnt > 1U) || (gCd.mulDevCnt > 1U) )
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_DEV; /* Report multiple devices. A T1T will also fail at ColRes */
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCB_INIT; /* Move to NFC-B */
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCB_INIT:
|
||||
|
||||
/* Verify if we are performing multi technology check */
|
||||
if( (gCd.skipTechFound) && (gCd.techFound == RFAL_CD_TECH_NFCB) )
|
||||
{
|
||||
gCd.st = RFAL_CD_ST_NFCF_INIT; /* If single card card found before was NFC-B skip tech now */
|
||||
break;
|
||||
}
|
||||
|
||||
rfalNfcbPollerInitialize(); /* Initialize for NFC-B */
|
||||
rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCB_TECHDET;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCB_TECHDET:
|
||||
|
||||
if( !rfalIsGTExpired() )
|
||||
{
|
||||
break; /* Wait until GT has been fulfilled */
|
||||
}
|
||||
|
||||
err = rfalNfcbPollerTechnologyDetection( RFAL_COMPLIANCE_MODE_NFC, &sensbRes, &gCd.devCnt );
|
||||
if( err == RFAL_ERR_NONE )
|
||||
{
|
||||
/* Verify if we are performing multi technology check OR already found one on the first round */
|
||||
if( gCd.skipTechFound )
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_SINGLE_MULTI_TECH;
|
||||
gCd.st = RFAL_CD_ST_NOT_DETECTED;/* Single device was another technology and now NFC-B */
|
||||
break;
|
||||
}
|
||||
else if( gCd.techFound != RFAL_CD_TECH_NONE ) /* If on the first round check if other Tech was already found */
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_TECH;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* MISRA 15.7 - Empty else */
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCB_COLRES_START; /* NFC-B detected perform collision resolution */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCF_INIT; /* NFC-B not detected, move to NFC-B */
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCB_COLRES_START:
|
||||
|
||||
err = rfalNfcbPollerStartCollisionResolution( RFAL_COMPLIANCE_MODE_NFC, 0, &gCd.nfcbDev, &gCd.devCnt );
|
||||
if( err != RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.lastErr = err;
|
||||
gCd.st = RFAL_CD_ST_ERROR; /* Collision resolution could not be performed */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCB_COLRES;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCB_COLRES:
|
||||
|
||||
err = rfalNfcbPollerGetCollisionResolutionStatus();
|
||||
if( err != RFAL_ERR_BUSY )
|
||||
{
|
||||
if( (err == RFAL_ERR_NONE) && (gCd.devCnt == 1U) ) /* Collision resolution OK and a single card was found */
|
||||
{
|
||||
gCd.mulDevCnt++;
|
||||
gCd.techFound = RFAL_CD_TECH_NFCB;
|
||||
}
|
||||
|
||||
/* Check if multiple cards or technologies have already been identified */
|
||||
if( (err != RFAL_ERR_NONE) || (gCd.devCnt > 1U) || (gCd.mulDevCnt > 1U) )
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_DEV;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = ( (RFAL_SUPPORT_MODE_POLL_NFCF) ? RFAL_CD_ST_NFCF_INIT : RFAL_CD_ST_NFCV_INIT); /* Move to NFC-F or NFC-V */
|
||||
}
|
||||
break;
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCF_INIT:
|
||||
|
||||
#if !RFAL_SUPPORT_MODE_POLL_NFCF
|
||||
gCd.st = RFAL_CD_ST_NFCV_INIT;
|
||||
break;
|
||||
#else
|
||||
/* Verify if we are performing multi technology check */
|
||||
if( (gCd.skipTechFound) && (gCd.techFound == RFAL_CD_TECH_NFCF) )
|
||||
{
|
||||
gCd.st = RFAL_CD_ST_PROPRIETARY; /* If single card card found before was NFC-F skip tech now */
|
||||
break;
|
||||
}
|
||||
|
||||
rfalNfcfPollerInitialize(RFAL_BR_212); /* Initialize for NFC-F */
|
||||
rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCF_TECHDET_START;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCF_TECHDET_START:
|
||||
if( !rfalIsGTExpired() )
|
||||
{
|
||||
break; /* Wait until GT has been fulfilled */
|
||||
}
|
||||
|
||||
err = rfalNfcfPollerStartCheckPresence();
|
||||
gCd.st = RFAL_CD_ST_NFCF_TECHDET;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCF_TECHDET:
|
||||
|
||||
err = rfalNfcfPollerGetCheckPresenceStatus();
|
||||
if( err == RFAL_ERR_BUSY )
|
||||
{
|
||||
break; /* Wait until NFC-F Technlogy Detection is completed */
|
||||
}
|
||||
|
||||
if( gCd.skipTechFound ) /* Verify if we are performing multi technology check */
|
||||
{
|
||||
gCd.st = RFAL_CD_ST_PROPRIETARY;
|
||||
|
||||
/* If single device was another technology and now NFC-F, otherwise conclude*/
|
||||
if(err == RFAL_ERR_NONE)
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_SINGLE_MULTI_TECH;
|
||||
gCd.st = RFAL_CD_ST_NOT_DETECTED;
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
if( err == RFAL_ERR_NONE )
|
||||
{
|
||||
if( gCd.techFound != RFAL_CD_TECH_NONE ) /* If on the first round check if other Tech was already found */
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_TECH;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCF_COLRES_START; /* NFC-F detected, perform collision resolution */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCV_INIT; /* NFC-F not detected, move to NFC-V */
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCF_COLRES_START:
|
||||
|
||||
err = rfalNfcfPollerStartCollisionResolution( RFAL_COMPLIANCE_MODE_NFC, RFAL_CD_NFCF_DEVLIMIT, gCd.nfcfDev, &gCd.devCnt );
|
||||
if( err != RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.lastErr = err;
|
||||
gCd.st = RFAL_CD_ST_ERROR; /* Collision resolution could not be performed */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCF_COLRES;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCF_COLRES:
|
||||
|
||||
err = rfalNfcfPollerGetCollisionResolutionStatus();
|
||||
if( err != RFAL_ERR_BUSY )
|
||||
{
|
||||
if( (err == RFAL_ERR_NONE) && (gCd.devCnt == 1U) ) /* Collision resolution OK and a single card was found */
|
||||
{
|
||||
gCd.mulDevCnt++;
|
||||
gCd.techFound = RFAL_CD_TECH_NFCF;
|
||||
}
|
||||
|
||||
/* Check if multiple cards or technologies have already been identified */
|
||||
if( (err != RFAL_ERR_NONE) || (gCd.devCnt > 1U) || (gCd.mulDevCnt > 1U) )
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_DEV;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCV_INIT; /* Move to NFC-V */
|
||||
}
|
||||
break;
|
||||
#endif /* RFAL_SUPPORT_MODE_POLL_NFCF*/
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCV_INIT:
|
||||
|
||||
rfalNfcvPollerInitialize(); /* Initialize for NFC-V */
|
||||
rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */
|
||||
|
||||
gCd.st = RFAL_CD_ST_NFCV_TECHDET;
|
||||
break;
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_NFCV_TECHDET:
|
||||
|
||||
if( !rfalIsGTExpired() )
|
||||
{
|
||||
break; /* Wait until GT has been fulfilled */
|
||||
}
|
||||
|
||||
err = rfalNfcvPollerCheckPresence( &invRes );
|
||||
if( err == RFAL_ERR_NONE )
|
||||
{
|
||||
if( gCd.techFound != RFAL_CD_TECH_NONE ) /* If other Tech was already found */
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_TECH;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.techFound = RFAL_CD_TECH_NFCV; /* If NFC-V is regarded as card as CE NFC-V is currently not supported by active devices */
|
||||
gCd.res->detType = RFAL_CD_CARD_TECH;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_PROPRIETARY; /* Move to Proprietary NFC Technologies */
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_PROPRIETARY:
|
||||
|
||||
rfalFieldOff();
|
||||
platformTimerDestroy( gCd.tmr );
|
||||
gCd.tmr = platformTimerCreate( (uint8_t)rfalConv1fcToMs(RFAL_GT_NFCA) );
|
||||
|
||||
/* If none of the other NFC technologies was not seen on a second round, regard as card */
|
||||
if( gCd.skipTechFound )
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_SINGLE_DEV;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Only one device found which does not support NFC-DEP and only *
|
||||
* answered in one technology, perform heartbeat detection */
|
||||
|
||||
#ifdef RFAL_CD_HB
|
||||
gCd.st = RFAL_CD_ST_HB_START;
|
||||
#endif /* RFAL_CD_HB */
|
||||
|
||||
/*******************************************************************************/
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_ST25TB_INIT;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_ST25TB_INIT:
|
||||
|
||||
if( (!platformTimerIsExpired( gCd.tmr )) ) /* Check if field has been Off long enough */
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
rfalSt25tbPollerInitialize(); /* Initialize for ST25TB */
|
||||
err = rfalFieldOnAndStartGT(); /* Turns the Field On if not already and start GT timer */
|
||||
|
||||
if( err != RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.lastErr = err;
|
||||
gCd.st = RFAL_CD_ST_ERROR; /* Unable to turn the field On, cannot continue Card Detection */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_ST25TB_TECHDET;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_ST25TB_TECHDET:
|
||||
|
||||
if( (!rfalIsGTExpired()) )
|
||||
{
|
||||
break; /* Wait until GT has been fulfilled */
|
||||
}
|
||||
|
||||
err = rfalSt25tbPollerCheckPresence( NULL );
|
||||
if( err == RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.techFound = RFAL_CD_TECH_OTHER; /* If ST25TB is regarded as card as CE is not supported by active devices */
|
||||
gCd.res->detType = RFAL_CD_CARD_TECH;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_CHECK_PROTO;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_CHECK_PROTO:
|
||||
|
||||
if( gCd.mulDevCnt == 0U ) /* No NFC listener has been detected */
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_NOT_FOUND;
|
||||
gCd.st = RFAL_CD_ST_NOT_DETECTED;
|
||||
break;
|
||||
}
|
||||
|
||||
if( gCd.mulDevCnt == 1U ) /* A single NFC listener has been identified */
|
||||
{
|
||||
/* Check if it supports NFC-DEP protocol */
|
||||
if( ( (gCd.techFound == RFAL_CD_TECH_NFCA) && ((gCd.nfcaDev.type == RFAL_NFCA_NFCDEP) || (gCd.nfcaDev.type == RFAL_NFCA_T4T_NFCDEP)) ) ||
|
||||
( (gCd.techFound == RFAL_CD_TECH_NFCF) && rfalNfcfIsNfcDepSupported( &gCd.nfcfDev[0] ) ) )
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_SINGLE_P2P;
|
||||
gCd.st = RFAL_CD_ST_NOT_DETECTED;/* NFC-DEP supported, regarded as non passive card */
|
||||
break;
|
||||
}
|
||||
|
||||
/* If a single NFC listener has been detected, and did not announce NFC-DEP support, *
|
||||
* check if it supports mutiple NFC technologies (skip the one it was previous seen) */
|
||||
gCd.skipTechFound = true;
|
||||
gCd.st = RFAL_CD_ST_NFCA_INIT;
|
||||
|
||||
/* Reset Field once again to avoid unwanted effect of Proprietary NFC Tech modulation */
|
||||
rfalFieldOff();
|
||||
platformTimerDestroy( gCd.tmr );
|
||||
gCd.tmr = platformTimerCreate( (uint8_t)rfalConv1fcToMs(RFAL_GT_NFCA) );
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.res->detType = RFAL_CD_MULTIPLE_DEV;
|
||||
gCd.st = RFAL_CD_ST_DETECTED;
|
||||
break;
|
||||
|
||||
|
||||
#ifdef RFAL_CD_HB
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_HB_START:
|
||||
|
||||
if( (!platformTimerIsExpired( gCd.tmr )) ) /* Check if field has been Off long enough */
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
switch( gCd.techFound )
|
||||
{
|
||||
case RFAL_CD_TECH_NFCF:
|
||||
rfalNfcfPollerInitialize( RFAL_BR_212 );
|
||||
break;
|
||||
|
||||
case RFAL_CD_TECH_NFCB:
|
||||
rfalNfcbPollerInitialize();
|
||||
break;
|
||||
|
||||
case RFAL_CD_TECH_NFCA:
|
||||
default:
|
||||
rfalNfcaPollerInitialize();
|
||||
break;
|
||||
}
|
||||
|
||||
err = rfalFieldOnAndStartGT();
|
||||
if( err != RFAL_ERR_NONE )
|
||||
{
|
||||
gCd.lastErr = err;
|
||||
gCd.st = RFAL_CD_ST_ERROR; /* Unable to turn the field On, cannot continue Card Detection */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.st = RFAL_CD_ST_HB;
|
||||
break;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_HB:
|
||||
if( !rfalIsGTExpired() ) /* Check if GT has been fulfilled */
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
if( rfalCdHbDetect( gCd.techFound ) ) /* Perform tha heartbeat detection sequence */
|
||||
{
|
||||
gCd.res->detType = RFAL_CD_SINGLE_HB;
|
||||
gCd.st = RFAL_CD_ST_NOT_DETECTED; /* Single device performing ALM, no passive card */
|
||||
break;
|
||||
}
|
||||
|
||||
gCd.res->detType = RFAL_CD_SINGLE_DEV;
|
||||
gCd.st = RFAL_CD_ST_DETECTED; /* ALM not detected on single device, regard as card */
|
||||
break;
|
||||
#endif /* RFAL_CD_HB */
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_DETECTED:
|
||||
case RFAL_CD_ST_NOT_DETECTED:
|
||||
|
||||
/* Card Detection completed, return outcome */
|
||||
gCd.res->detected = ((gCd.st == RFAL_CD_ST_NOT_DETECTED) ? false : true);
|
||||
|
||||
rfalFieldOff();
|
||||
gCd.st = RFAL_CD_ST_IDLE;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_IDLE:
|
||||
return RFAL_ERR_WRONG_STATE;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_CD_ST_ERROR:
|
||||
|
||||
gCd.res->detType = RFAL_CD_UNKOWN;
|
||||
gCd.res->detected = true; /* Error ocurred, mark as card present to avoid damage */
|
||||
|
||||
rfalFieldOff();
|
||||
gCd.st = RFAL_CD_ST_IDLE;
|
||||
|
||||
return gCd.lastErr;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
default:
|
||||
return RFAL_ERR_INTERNAL;
|
||||
}
|
||||
|
||||
return RFAL_ERR_BUSY;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_crc.c
|
||||
* @author MMY Application Team
|
||||
* @brief CRC calculation implementation
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_crc.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
static uint16_t rfalCrcUpdateCcitt(uint16_t crcSeed, uint8_t dataByte);
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
uint16_t rfalCrcCalculateCcitt(uint16_t preloadValue, const uint8_t* buf, uint16_t length)
|
||||
{
|
||||
uint16_t crc = preloadValue;
|
||||
uint16_t index;
|
||||
|
||||
for (index = 0; index < length; index++)
|
||||
{
|
||||
crc = rfalCrcUpdateCcitt(crc, buf[index]);
|
||||
}
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
static uint16_t rfalCrcUpdateCcitt(uint16_t crcSeed, uint8_t dataByte)
|
||||
{
|
||||
uint16_t crc = crcSeed;
|
||||
uint8_t dat = dataByte;
|
||||
|
||||
dat ^= (uint8_t)(crc & 0xFFU);
|
||||
dat ^= (dat << 4);
|
||||
|
||||
crc = (crc >> 8)^(((uint16_t) dat) << 8)^(((uint16_t) dat) << 3)^(((uint16_t) dat) >> 4);
|
||||
|
||||
return crc;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,55 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_crc.h
|
||||
* @author MMY Application Team
|
||||
* @brief CRC calculation module
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_CRC_H_
|
||||
#define RFAL_CRC_H_
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Calculate CRC according to CCITT standard.
|
||||
*
|
||||
* This function takes \a length bytes from \a buf and calculates the CRC
|
||||
* for this data. The result is returned.
|
||||
* \note This implementation calculates the CRC with LSB first, i.e. all
|
||||
* bytes are "read" from right to left.
|
||||
*
|
||||
* \param[in] preloadValue : Initial value of CRC calculation.
|
||||
* \param[in] buf : buffer to calculate the CRC for.
|
||||
* \param[in] length : size of the buffer.
|
||||
*
|
||||
* \return 16 bit long crc value.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
extern uint16_t rfalCrcCalculateCcitt(uint16_t preloadValue, const uint8_t* buf, uint16_t length);
|
||||
|
||||
#endif /* RFAL_CRC_H_ */
|
||||
|
||||
@@ -0,0 +1,319 @@
|
||||
|
||||
/******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* COPYRIGHT 2016 STMicroelectronics, all rights reserved
|
||||
*
|
||||
* 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: ST25R firmware
|
||||
* $Revision: $
|
||||
* LANGUAGE: ISO C99
|
||||
*/
|
||||
|
||||
/*! \file rfal_dlma.c
|
||||
*
|
||||
* \brief Functions to manage dynamically the LMA
|
||||
*
|
||||
*
|
||||
* It provides handling for dynamic LMA for Passive Listen Mode
|
||||
*
|
||||
* \warning DLMA is applicable only when the ST25R driver is used for Passive
|
||||
* Listen Mode, not if driven externally
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_dlma.h"
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_rf.h"
|
||||
#include "rfal_chip.h"
|
||||
#include "rfal_analogConfig.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_DLMA
|
||||
*/
|
||||
|
||||
|
||||
#if RFAL_FEATURE_DLMA
|
||||
|
||||
|
||||
/* Check for valid Configuration */
|
||||
#if !RFAL_SUPPORT_CE
|
||||
#error " RFAL: Invalid configuration. DLMA only applicable for ST25R supporting Passive Listen Mode. "
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* CONDITIONAL INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_dlmaTbl.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_DLMA_ANALOGCONFIG_SHIFT 13U
|
||||
#define RFAL_DLMA_ANALOGCONFIG_MASK 0x6000U
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL DATA TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! RFAL DLMA instance */
|
||||
typedef struct{
|
||||
bool enabled;
|
||||
const rfalDlmaEntry* currentDlma;
|
||||
uint8_t tableEntries;
|
||||
rfalDlmaEntry table[RFAL_DLMA_TABLE_MAX_ENTRIES];
|
||||
uint8_t tableEntry;
|
||||
uint8_t refMeasurement;
|
||||
rfalDlmaMeasureFunc measureCallback;
|
||||
rfalDlmaAdjustFunc adjustCallback;
|
||||
}rfalDlma;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
static rfalDlma gRfalDlma;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
void rfalDlmaInitialize( void )
|
||||
{
|
||||
/* By default DLMA is disabled */
|
||||
rfalDlmaSetEnabled( false );
|
||||
|
||||
/* Set default measurement and adjust methods */
|
||||
gRfalDlma.measureCallback = &rfalChipGetLmFieldInd;
|
||||
gRfalDlma.adjustCallback = &rfalChipSetLMMod;
|
||||
|
||||
|
||||
/* Use the default Dynamic LMA values */
|
||||
gRfalDlma.currentDlma = rfalDlmaDefaultSettings;
|
||||
gRfalDlma.tableEntries = (sizeof(rfalDlmaDefaultSettings) / RFAL_DLMA_TABLE_PARAM_LEN);
|
||||
|
||||
RFAL_MEMCPY( gRfalDlma.table, gRfalDlma.currentDlma, sizeof(rfalDlmaDefaultSettings) );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDlmaSetMeasureCallback( rfalDlmaMeasureFunc pFunc )
|
||||
{
|
||||
gRfalDlma.measureCallback = pFunc;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDlmaSetAdjustCallback( rfalDlmaAdjustFunc pFunc )
|
||||
{
|
||||
gRfalDlma.adjustCallback = pFunc;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDlmaTableWrite( const rfalDlmaEntry* powerTbl, uint8_t powerTblEntries )
|
||||
{
|
||||
uint8_t entry;
|
||||
|
||||
/* Check if the table size parameter is too big */
|
||||
if( powerTblEntries > RFAL_DLMA_TABLE_MAX_ENTRIES)
|
||||
{
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
/* Check if the first increase entry is 0xFF */
|
||||
if( (powerTblEntries == 0U) || (powerTbl == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Check if the entries of the dynamic power table are valid */
|
||||
for( entry = 0; entry < powerTblEntries; entry++ )
|
||||
{
|
||||
if(powerTbl[entry].inc < powerTbl[entry].dec)
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy the data set */
|
||||
RFAL_MEMCPY( gRfalDlma.table, powerTbl, (powerTblEntries * RFAL_DLMA_TABLE_PARAM_LEN) );
|
||||
gRfalDlma.currentDlma = gRfalDlma.table;
|
||||
gRfalDlma.tableEntries = powerTblEntries;
|
||||
|
||||
if( gRfalDlma.tableEntry > powerTblEntries )
|
||||
{
|
||||
/* powerTblEntries is always greater then zero, verified at parameter check */
|
||||
gRfalDlma.tableEntry = (powerTblEntries - 1U);
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDlmaTableRead( rfalDlmaEntry* tblBuf, uint8_t tblBufEntries, uint8_t* tableEntries )
|
||||
{
|
||||
/* Check parameters */
|
||||
if( (tblBuf == NULL) || (tblBufEntries < gRfalDlma.tableEntries) || (tableEntries == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Not properly initialized */
|
||||
if( gRfalDlma.currentDlma == NULL )
|
||||
{
|
||||
return RFAL_ERR_WRONG_STATE;
|
||||
}
|
||||
|
||||
/* Copy the whole Table to the given buffer */
|
||||
RFAL_MEMCPY( tblBuf, gRfalDlma.currentDlma, (tblBufEntries * RFAL_DLMA_TABLE_PARAM_LEN) );
|
||||
*tableEntries = gRfalDlma.tableEntries;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDlmaAdjust( void )
|
||||
{
|
||||
uint8_t refValue;
|
||||
uint16_t modeID;
|
||||
rfalBitRate br;
|
||||
rfalMode mode;
|
||||
uint8_t tableEntry;
|
||||
uint8_t i;
|
||||
const rfalDlmaEntry* dlmaTable;
|
||||
|
||||
/* Initialize local vars */
|
||||
tableEntry = gRfalDlma.tableEntry;
|
||||
dlmaTable = gRfalDlma.currentDlma;
|
||||
refValue = 0;
|
||||
mode = RFAL_MODE_NONE;
|
||||
br = RFAL_BR_KEEP;
|
||||
|
||||
/* Obtain RFAL's current mode and bit rate */
|
||||
mode = rfalGetMode();
|
||||
rfalGetBitRate( &br, NULL );
|
||||
|
||||
|
||||
/* Check if the Power Adjustment is disabled and *
|
||||
* if the callback to the measurement method is properly set */
|
||||
if( (!gRfalDlma.enabled) || (gRfalDlma.measureCallback == NULL) || (gRfalDlma.adjustCallback == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Ensure that the table is initialized*/
|
||||
if( gRfalDlma.currentDlma == NULL )
|
||||
{
|
||||
return RFAL_ERR_WRONG_STATE;
|
||||
}
|
||||
|
||||
/* Ensure a proper measure reference value */
|
||||
if( RFAL_ERR_NONE != gRfalDlma.measureCallback( &refValue ) )
|
||||
{
|
||||
return RFAL_ERR_IO;
|
||||
}
|
||||
|
||||
for( i = 0; i < RFAL_DLMA_TABLE_MAX_ENTRIES; i++ )
|
||||
{
|
||||
/* Search the table to find matching entry */
|
||||
if( (refValue <= dlmaTable[i].inc) && (refValue >= dlmaTable[i].dec) )
|
||||
{
|
||||
tableEntry = i;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* Apply configs and Update local context */
|
||||
gRfalDlma.refMeasurement = refValue;
|
||||
gRfalDlma.tableEntry = tableEntry;
|
||||
|
||||
|
||||
/* Set the new value for LMA (e.g. RFO resistance) form the table and apply it */
|
||||
gRfalDlma.adjustCallback( dlmaTable[gRfalDlma.tableEntry].modRes, dlmaTable[gRfalDlma.tableEntry].unmodRes );
|
||||
|
||||
/* Apply the DLMA Analog Config according to this threshold */
|
||||
/* Technology field is being extended for DLMA: 2msb are used for threshold step (only 4 allowed) */
|
||||
modeID = rfalAnalogConfigGenModeID( mode, br, RFAL_ANALOG_CONFIG_DLMA ); /* Generate Analog Config mode ID */
|
||||
modeID |= (((uint16_t)gRfalDlma.tableEntry << RFAL_DLMA_ANALOGCONFIG_SHIFT) & RFAL_DLMA_ANALOGCONFIG_MASK); /* Add DLMA threshold step|level */
|
||||
rfalSetAnalogConfig( modeID ); /* Apply DLMA Analog Config */
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDlmaSetEnabled( bool enable )
|
||||
{
|
||||
gRfalDlma.enabled = enable;
|
||||
gRfalDlma.tableEntry = 0;
|
||||
gRfalDlma.refMeasurement = 0;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
bool rfalDlmaIsEnabled( void )
|
||||
{
|
||||
return gRfalDlma.enabled;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDlmaGetInfo( rfalDlmaInfo* info )
|
||||
{
|
||||
if( info == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Clear info structure */
|
||||
RFAL_MEMSET( info, 0, sizeof(rfalDlmaInfo) );
|
||||
|
||||
info->enabled = gRfalDlma.enabled;
|
||||
info->refMeasurement = gRfalDlma.refMeasurement;
|
||||
info->tableEntry = gRfalDlma.tableEntry;
|
||||
info->tableEntries = gRfalDlma.tableEntries;
|
||||
info->measureCallback = gRfalDlma.measureCallback;
|
||||
info->adjustCallback = gRfalDlma.adjustCallback;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_DLMA */
|
||||
@@ -0,0 +1,345 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_dpo.c
|
||||
* @author MMY Application Team
|
||||
* @brief Functions to manage and set dynamic power settings.
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_dpoTbl.h"
|
||||
#include "rfal_dpo.h"
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_rf.h"
|
||||
#include "rfal_chip.h"
|
||||
#include "rfal_analogConfig.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_DPO
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_DPO
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_DPO_ANALOGCONFIG_SHIFT 13U
|
||||
#define RFAL_DPO_ANALOGCONFIG_MASK 0x6000U
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL DATA TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! RFAL DPO instance */
|
||||
typedef struct{
|
||||
bool enabled;
|
||||
const rfalDpoEntry* currentDpo;
|
||||
uint8_t tableEntries;
|
||||
rfalDpoEntry table[RFAL_DPO_TABLE_MAX_ENTRIES];
|
||||
uint8_t tableEntry;
|
||||
rfalDpoMeasureFunc measureCallback;
|
||||
rfalDpoAdjustFunc adjustCallback;
|
||||
uint8_t refMeasurement;
|
||||
rfalMode curMode;
|
||||
rfalBitRate curBR;
|
||||
bool forceAdj;
|
||||
}rfalDpo;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
static rfalDpo gRfalDpo;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
void rfalDpoInitialize( void )
|
||||
{
|
||||
/* By default DPO is disabled */
|
||||
rfalDpoSetEnabled( false );
|
||||
|
||||
|
||||
/* Set default measurement */
|
||||
#if defined(ST25R3911) || defined(ST25R3916) || defined(ST25R3916B)
|
||||
gRfalDpo.measureCallback = &rfalChipMeasureAmplitude;
|
||||
#else
|
||||
gRfalDpo.measureCallback = &rfalChipMeasureCombinedIQ;
|
||||
#endif /* ST25R */
|
||||
|
||||
|
||||
/* Set default adjustment */
|
||||
gRfalDpo.adjustCallback = &rfalChipSetRFO;
|
||||
|
||||
|
||||
/* Use the default Dynamic Power values */
|
||||
gRfalDpo.currentDpo = rfalDpoDefaultSettings;
|
||||
gRfalDpo.tableEntries = (sizeof(rfalDpoDefaultSettings) / RFAL_DPO_TABLE_PARAM_LEN);
|
||||
|
||||
RFAL_MEMCPY( gRfalDpo.table, gRfalDpo.currentDpo, sizeof(rfalDpoDefaultSettings) );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDpoSetMeasureCallback( rfalDpoMeasureFunc pFunc )
|
||||
{
|
||||
gRfalDpo.measureCallback = pFunc;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDpoSetAdjustCallback( rfalDpoAdjustFunc pFunc )
|
||||
{
|
||||
gRfalDpo.adjustCallback = pFunc;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDpoTableWrite( const rfalDpoEntry* powerTbl, uint8_t powerTblEntries )
|
||||
{
|
||||
uint8_t entry;
|
||||
|
||||
/* Check if the table size parameter is too big */
|
||||
if( (powerTblEntries * RFAL_DPO_TABLE_PARAM_LEN) > RFAL_DPO_TABLE_SIZE_MAX)
|
||||
{
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
/* Check if the first increase entry is 0xFF */
|
||||
if( (powerTblEntries == 0U) || (powerTbl == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Check if the entries of the dynamic power table are valid */
|
||||
for( entry = 0; entry < powerTblEntries; entry++ )
|
||||
{
|
||||
if(powerTbl[entry].inc < powerTbl[entry].dec)
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
}
|
||||
|
||||
/* Copy the data set */
|
||||
RFAL_MEMCPY( gRfalDpo.table, powerTbl, (powerTblEntries * RFAL_DPO_TABLE_PARAM_LEN) );
|
||||
|
||||
gRfalDpo.currentDpo = gRfalDpo.table;
|
||||
gRfalDpo.tableEntries = powerTblEntries;
|
||||
|
||||
if( gRfalDpo.tableEntry > powerTblEntries )
|
||||
{
|
||||
/* powerTblEntries is always greater then zero, verified at parameter check */
|
||||
gRfalDpo.tableEntry = (powerTblEntries - 1U);
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDpoTableRead( rfalDpoEntry* tblBuf, uint8_t tblBufEntries, uint8_t* tableEntries )
|
||||
{
|
||||
/* Wrong request */
|
||||
if( (tblBuf == NULL) || (tblBufEntries < gRfalDpo.tableEntries) || (tableEntries == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Not properly initialized */
|
||||
if( gRfalDpo.currentDpo == NULL )
|
||||
{
|
||||
return RFAL_ERR_WRONG_STATE;
|
||||
}
|
||||
|
||||
/* Copy the whole Table to the given buffer */
|
||||
RFAL_MEMCPY( tblBuf, gRfalDpo.currentDpo, (tblBufEntries * RFAL_DPO_TABLE_PARAM_LEN) );
|
||||
*tableEntries = gRfalDpo.tableEntries;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDpoAdjust( void )
|
||||
{
|
||||
uint8_t refValue;
|
||||
uint16_t modeID;
|
||||
rfalBitRate br;
|
||||
rfalMode mode;
|
||||
uint8_t tableEntry;
|
||||
const rfalDpoEntry* dpoTable;
|
||||
|
||||
/* Initialize local vars */
|
||||
tableEntry = gRfalDpo.tableEntry;
|
||||
dpoTable = gRfalDpo.currentDpo;
|
||||
refValue = 0;
|
||||
mode = RFAL_MODE_NONE;
|
||||
br = RFAL_BR_KEEP;
|
||||
|
||||
/* Obtain RFAL's current mode and bit rate */
|
||||
mode = rfalGetMode();
|
||||
rfalGetBitRate( &br, NULL );
|
||||
|
||||
|
||||
/* Check if the Power Adjustment is disabled and *
|
||||
* if the callback to the measurement method is properly set */
|
||||
if( (!gRfalDpo.enabled) || (gRfalDpo.measureCallback == NULL) || (gRfalDpo.adjustCallback == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Ensure that the current mode is Passive Poller and table is initialized*/
|
||||
if( (!rfalIsModePassivePoll( mode )) || (gRfalDpo.currentDpo == NULL) )
|
||||
{
|
||||
return RFAL_ERR_WRONG_STATE;
|
||||
}
|
||||
|
||||
/* Ensure a proper measure reference value */
|
||||
if( RFAL_ERR_NONE != gRfalDpo.measureCallback( &refValue ) )
|
||||
{
|
||||
return RFAL_ERR_IO;
|
||||
}
|
||||
|
||||
/* Store last measurement */
|
||||
gRfalDpo.refMeasurement = refValue;
|
||||
|
||||
|
||||
if( refValue >= dpoTable[gRfalDpo.tableEntry].inc )
|
||||
{ /* Increase the output power */
|
||||
/* the top of the table represents the highest amplitude value*/
|
||||
if( gRfalDpo.tableEntry == 0U )
|
||||
{
|
||||
/* Maximum driver value has been reached */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Go up in the table to decrease the driver resistance */
|
||||
tableEntry--;
|
||||
}
|
||||
}
|
||||
else if( refValue <= dpoTable[gRfalDpo.tableEntry].dec )
|
||||
{ /* Decrease the output power */
|
||||
/* The bottom is the highest possible value */
|
||||
if( (gRfalDpo.tableEntry + 1U) >= gRfalDpo.tableEntries )
|
||||
{
|
||||
/* minimum driver value has been reached */
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Go down in the table to increase the driver resistance */
|
||||
tableEntry++;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Fall through to evaluate whether to write dpo and its associated analog configs */
|
||||
}
|
||||
|
||||
/* Apply new configs if there was a change on DPO level or RFAL mode|bitrate */
|
||||
/* Also adjust power in case mode is not yet set and a different table entry|setting is applicbale */
|
||||
if( (mode != gRfalDpo.curMode) || (br != gRfalDpo.curBR) || (tableEntry != gRfalDpo.tableEntry) || ((mode == RFAL_MODE_NONE) && (tableEntry != gRfalDpo.tableEntry)) || (gRfalDpo.forceAdj) )
|
||||
{
|
||||
/* Update local context */
|
||||
gRfalDpo.curMode = mode;
|
||||
gRfalDpo.curBR = br;
|
||||
gRfalDpo.tableEntry = tableEntry;
|
||||
gRfalDpo.forceAdj = false;
|
||||
|
||||
/* Get the new value from the table (e.g. RFO resistance) and apply the new setting */
|
||||
gRfalDpo.adjustCallback( dpoTable[gRfalDpo.tableEntry].rfoRes );
|
||||
|
||||
/* Apply the DPO Analog Config according to this threshold */
|
||||
/* Technology field is being extended for DPO: 2msb are used for threshold step (only 4 allowed) */
|
||||
modeID = rfalAnalogConfigGenModeID( gRfalDpo.curMode, gRfalDpo.curBR, RFAL_ANALOG_CONFIG_DPO ); /* Generate Analog Config mode ID */
|
||||
modeID |= (((uint16_t)gRfalDpo.tableEntry << RFAL_DPO_ANALOGCONFIG_SHIFT) & RFAL_DPO_ANALOGCONFIG_MASK); /* Add DPO threshold step|level */
|
||||
rfalSetAnalogConfig( modeID ); /* Apply DPO Analog Config */
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDpoSetEnabled( bool enable )
|
||||
{
|
||||
gRfalDpo.enabled = enable;
|
||||
gRfalDpo.forceAdj = enable;
|
||||
gRfalDpo.curMode = RFAL_MODE_NONE;
|
||||
gRfalDpo.curBR = RFAL_BR_KEEP;
|
||||
gRfalDpo.tableEntry = 0;
|
||||
gRfalDpo.refMeasurement = 0;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
bool rfalDpoIsEnabled( void )
|
||||
{
|
||||
return gRfalDpo.enabled;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
void rfalDpoReqAdj( void )
|
||||
{
|
||||
gRfalDpo.forceAdj = true;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalDpoGetInfo( rfalDpoInfo* info )
|
||||
{
|
||||
if( info == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Clear info structure */
|
||||
RFAL_MEMSET( info, 0, sizeof(rfalDpoInfo) );
|
||||
|
||||
info->enabled = gRfalDpo.enabled;
|
||||
info->tableEntries = gRfalDpo.tableEntries;
|
||||
info->tableEntry = gRfalDpo.tableEntry;
|
||||
info->adjustCallback = gRfalDpo.adjustCallback;
|
||||
info->measureCallback = gRfalDpo.measureCallback;
|
||||
info->refMeasurement = gRfalDpo.refMeasurement;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
#endif /* RFAL_FEATURE_DPO */
|
||||
@@ -0,0 +1,518 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_iso15693_2.c
|
||||
* @author MMY Application Team
|
||||
* @brief Implementation of ISO-15693-2
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_iso15693_2.h"
|
||||
#include "rfal_crc.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_NFCV
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_NFCV
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define ISO_15693_DEBUG(...) /*!< Macro for the log method */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define ISO15693_DAT_SOF_1_4 0x21 /* LSB constants */
|
||||
#define ISO15693_DAT_EOF_1_4 0x04
|
||||
#define ISO15693_DAT_00_1_4 0x02
|
||||
#define ISO15693_DAT_01_1_4 0x08
|
||||
#define ISO15693_DAT_10_1_4 0x20
|
||||
#define ISO15693_DAT_11_1_4 0x80
|
||||
|
||||
#define ISO15693_DAT_SOF_1_256 0x81
|
||||
#define ISO15693_DAT_EOF_1_256 0x04
|
||||
#define ISO15693_DAT_SLOT0_1_256 0x02
|
||||
#define ISO15693_DAT_SLOT1_1_256 0x08
|
||||
#define ISO15693_DAT_SLOT2_1_256 0x20
|
||||
#define ISO15693_DAT_SLOT3_1_256 0x80
|
||||
|
||||
#define ISO15693_PHY_DAT_MANCHESTER_1 0xaaaa
|
||||
|
||||
#define ISO15693_PHY_BIT_BUFFER_SIZE 1000 /*!< size of the receiving buffer. Might be adjusted if longer datastreams are expected. */
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
static rfalIso15693PhyConfig_t gIso15693PhyConfig; /*!< current phy configuration */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
static ReturnCode rfalIso15693PhyVCDCode1Of4(const uint8_t data, uint8_t* outbuffer, uint16_t maxOutBufLen, uint16_t* outBufLen);
|
||||
static ReturnCode rfalIso15693PhyVCDCode1Of256(const uint8_t data, uint8_t* outbuffer, uint16_t maxOutBufLen, uint16_t* outBufLen);
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
ReturnCode rfalIso15693PhyConfigure(const rfalIso15693PhyConfig_t* config, const struct iso15693StreamConfig ** needed_stream_config )
|
||||
{
|
||||
static struct iso15693StreamConfig auxConfig = { /* MISRA 8.9 */
|
||||
.useBPSK = 0, /* 0: subcarrier, 1:BPSK */
|
||||
.din = 5, /* 2^5*fc = 423750 Hz: divider for the in subcarrier frequency */
|
||||
.dout = 7, /*!< 2^7*fc = 105937 : divider for the in subcarrier frequency */
|
||||
.report_period_length = 3, /*!< 8=2^3 the length of the reporting period */
|
||||
};
|
||||
|
||||
|
||||
/* make a copy of the configuration */
|
||||
RFAL_MEMCPY( (uint8_t*)&gIso15693PhyConfig, (const uint8_t*)config, sizeof(rfalIso15693PhyConfig_t));
|
||||
|
||||
if ( config->speedMode <= 3U)
|
||||
{ /* If valid speed mode adjust report period accordingly */
|
||||
auxConfig.report_period_length = (3U - (uint8_t)config->speedMode);
|
||||
}
|
||||
else
|
||||
{ /* If invalid default to normal (high) speed */
|
||||
auxConfig.report_period_length = 3;
|
||||
}
|
||||
|
||||
*needed_stream_config = &auxConfig;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
ReturnCode rfalIso15693PhyGetConfiguration(rfalIso15693PhyConfig_t* config)
|
||||
{
|
||||
RFAL_MEMCPY(config, &gIso15693PhyConfig, sizeof(rfalIso15693PhyConfig_t));
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
ReturnCode rfalIso15693VCDCode(uint8_t* buffer, uint16_t length, bool sendCrc, bool sendFlags, bool picopassMode,
|
||||
uint16_t *subbit_total_length, uint16_t *offset,
|
||||
uint8_t* outbuf, uint16_t outBufSize, uint16_t* actOutBufSize)
|
||||
{
|
||||
ReturnCode err = RFAL_ERR_NONE;
|
||||
uint8_t eof, sof;
|
||||
uint8_t transbuf[2];
|
||||
uint16_t crc = 0;
|
||||
ReturnCode (*txFunc)(const uint8_t data, uint8_t* outbuffer, uint16_t maxOutBufLen, uint16_t* outBufLen);
|
||||
uint8_t crc_len;
|
||||
uint8_t* outputBuf;
|
||||
uint16_t outputBufSize;
|
||||
|
||||
crc_len = (uint8_t)((sendCrc)?2:0);
|
||||
|
||||
*actOutBufSize = 0;
|
||||
|
||||
if (ISO15693_VCD_CODING_1_4 == gIso15693PhyConfig.coding)
|
||||
{
|
||||
sof = ISO15693_DAT_SOF_1_4;
|
||||
eof = ISO15693_DAT_EOF_1_4;
|
||||
txFunc = &rfalIso15693PhyVCDCode1Of4;
|
||||
*subbit_total_length = (
|
||||
( 1U /* SOF */
|
||||
+ ((length + (uint16_t)crc_len) * 4U)
|
||||
+ 1U) /* EOF */
|
||||
);
|
||||
if (outBufSize < 5U) { /* 5 should be safe: enough for sof + 1byte data in 1of4 */
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
sof = ISO15693_DAT_SOF_1_256;
|
||||
eof = ISO15693_DAT_EOF_1_256;
|
||||
txFunc = &rfalIso15693PhyVCDCode1Of256;
|
||||
*subbit_total_length = (
|
||||
( 1U /* SOF */
|
||||
+ ((length + (uint16_t)crc_len) * 64U)
|
||||
+ 1U) /* EOF */
|
||||
);
|
||||
|
||||
if (*offset != 0U)
|
||||
{
|
||||
if (outBufSize < 64U) { /* 64 should be safe: enough a single byte data in 1of256 */
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
if (outBufSize < 65U) { /* At beginning of a frame we need at least 65 bytes to start: enough for sof + 1byte data in 1of256 */
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (length == 0U)
|
||||
{
|
||||
*subbit_total_length = 1;
|
||||
}
|
||||
|
||||
if ((length != 0U) && (0U == *offset) && sendFlags && (!picopassMode))
|
||||
{
|
||||
/* set high datarate flag */
|
||||
buffer[0] |= (uint8_t)ISO15693_REQ_FLAG_HIGH_DATARATE;
|
||||
/* clear sub-carrier flag - we only support single sub-carrier */
|
||||
buffer[0] = (uint8_t)(buffer[0] & ~ISO15693_REQ_FLAG_TWO_SUBCARRIERS); /* MISRA 10.3 */
|
||||
}
|
||||
|
||||
outputBuf = outbuf; /* MISRA 17.8: Use intermediate variable */
|
||||
outputBufSize = outBufSize; /* MISRA 17.8: Use intermediate variable */
|
||||
|
||||
/* Send SOF if at 0 offset */
|
||||
if ((length != 0U) && (0U == *offset))
|
||||
{
|
||||
*outputBuf = sof;
|
||||
(*actOutBufSize)++;
|
||||
outputBufSize--;
|
||||
outputBuf++;
|
||||
}
|
||||
|
||||
while ((*offset < length) && (err == RFAL_ERR_NONE))
|
||||
{
|
||||
uint16_t filled_size;
|
||||
/* send data */
|
||||
err = txFunc(buffer[*offset], outputBuf, outputBufSize, &filled_size);
|
||||
(*actOutBufSize) += filled_size;
|
||||
outputBuf = &outputBuf[filled_size]; /* MISRA 18.4: Avoid pointer arithmetic */
|
||||
outputBufSize -= filled_size;
|
||||
if (err == RFAL_ERR_NONE) {
|
||||
(*offset)++;
|
||||
}
|
||||
}
|
||||
if (err != RFAL_ERR_NONE) {
|
||||
return RFAL_ERR_AGAIN;
|
||||
}
|
||||
|
||||
while ((err == RFAL_ERR_NONE) && sendCrc && (*offset < (length + 2U)))
|
||||
{
|
||||
uint16_t filled_size;
|
||||
if ((0U==crc) && (length != 0U))
|
||||
{
|
||||
crc = rfalCrcCalculateCcitt( (uint16_t) ((picopassMode) ? 0xE012U : 0xFFFFU), /* In PicoPass Mode a different Preset Value is used */
|
||||
((picopassMode) ? (&buffer[1]) : buffer), /* CMD byte is not taken into account in PicoPass mode */
|
||||
((picopassMode) ? (length - 1U) : length)); /* CMD byte is not taken into account in PicoPass mode */
|
||||
|
||||
crc = (uint16_t)((picopassMode) ? crc : ~crc);
|
||||
}
|
||||
/* send crc */
|
||||
transbuf[0] = (uint8_t)(crc & 0xffU);
|
||||
transbuf[1] = (uint8_t)((crc >> 8) & 0xffU);
|
||||
err = txFunc(transbuf[*offset - length], outputBuf, outputBufSize, &filled_size);
|
||||
(*actOutBufSize) += filled_size;
|
||||
outputBuf = &outputBuf[filled_size]; /* MISRA 18.4: Avoid pointer arithmetic */
|
||||
outputBufSize -= filled_size;
|
||||
if (err == RFAL_ERR_NONE) {
|
||||
(*offset)++;
|
||||
}
|
||||
}
|
||||
if (err != RFAL_ERR_NONE) {
|
||||
return RFAL_ERR_AGAIN;
|
||||
}
|
||||
|
||||
if (((!sendCrc) && (*offset == length))
|
||||
|| (sendCrc && (*offset == (length + 2U))))
|
||||
{
|
||||
*outputBuf = eof;
|
||||
(*actOutBufSize)++;
|
||||
outputBufSize--;
|
||||
outputBuf++;
|
||||
}
|
||||
else
|
||||
{
|
||||
return RFAL_ERR_AGAIN;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
ReturnCode rfalIso15693VICCDecode(const uint8_t *inBuf,
|
||||
uint16_t inBufLen,
|
||||
uint8_t* outBuf,
|
||||
uint16_t outBufLen,
|
||||
uint16_t* outBufPos,
|
||||
uint16_t* bitsBeforeCol,
|
||||
uint16_t ignoreBits,
|
||||
bool picopassMode )
|
||||
{
|
||||
ReturnCode err = RFAL_ERR_NONE;
|
||||
uint16_t crc;
|
||||
uint16_t mp; /* Current bit position in manchester bit inBuf*/
|
||||
uint16_t bp; /* Current bit position in outBuf */
|
||||
|
||||
*bitsBeforeCol = 0;
|
||||
*outBufPos = 0;
|
||||
|
||||
/* first check for valid SOF. Since it starts with 3 unmodulated pulses it is 0x17. */
|
||||
if ((inBuf[0] & 0x1fU) != 0x17U)
|
||||
{
|
||||
ISO_15693_DEBUG("0x%x\n", iso15693PhyBitBuffer[0]);
|
||||
return RFAL_ERR_FRAMING;
|
||||
}
|
||||
ISO_15693_DEBUG("SOF\n");
|
||||
|
||||
if (outBufLen == 0U)
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
mp = 5; /* 5 bits were SOF, now manchester starts: 2 bits per payload bit */
|
||||
bp = 0;
|
||||
|
||||
RFAL_MEMSET(outBuf,0,outBufLen);
|
||||
|
||||
if (inBufLen == 0U)
|
||||
{
|
||||
return RFAL_ERR_CRC;
|
||||
}
|
||||
|
||||
for ( ; mp < ((inBufLen * 8U) - 2U); mp+=2U )
|
||||
{
|
||||
bool isEOF = false;
|
||||
|
||||
uint8_t man;
|
||||
man = (inBuf[mp/8U] >> (mp%8U)) & 0x1U;
|
||||
man |= ((inBuf[(mp+1U)/8U] >> ((mp+1U)%8U)) & 0x1U) << 1;
|
||||
if (1U == man)
|
||||
{
|
||||
bp++;
|
||||
}
|
||||
if (2U == man)
|
||||
{
|
||||
outBuf[bp/8U] = (uint8_t)(outBuf[bp/8U] | (1U <<(bp%8U))); /* MISRA 10.3 */
|
||||
bp++;
|
||||
}
|
||||
if ((bp%8U) == 0U)
|
||||
{ /* Check for EOF */
|
||||
ISO_15693_DEBUG("ceof %hhx %hhx\n", inBuf[mp/8U], inBuf[mp/8+1]);
|
||||
if ( ((inBuf[mp/8U] & 0xe0U) == 0xa0U)
|
||||
&&(inBuf[(mp/8U)+1U] == 0x03U))
|
||||
{ /* Now we know that it was 10111000 = EOF */
|
||||
ISO_15693_DEBUG("EOF\n");
|
||||
isEOF = true;
|
||||
}
|
||||
}
|
||||
if ( ((0U == man) || (3U == man)) && (!isEOF) )
|
||||
{
|
||||
if (bp >= ignoreBits)
|
||||
{
|
||||
err = RFAL_ERR_RF_COLLISION;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* ignored collision: leave as 0 */
|
||||
bp++;
|
||||
}
|
||||
}
|
||||
if ( (bp >= (outBufLen * 8U)) || (err == RFAL_ERR_RF_COLLISION) || isEOF )
|
||||
{ /* Don't write beyond the end */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
*outBufPos = (bp / 8U);
|
||||
*bitsBeforeCol = bp;
|
||||
|
||||
if (err != RFAL_ERR_NONE)
|
||||
{
|
||||
return err;
|
||||
}
|
||||
|
||||
if ((bp%8U) != 0U)
|
||||
{
|
||||
return RFAL_ERR_CRC;
|
||||
}
|
||||
|
||||
if (*outBufPos > 2U)
|
||||
{
|
||||
/* finally, check crc */
|
||||
ISO_15693_DEBUG("Calculate CRC, val: 0x%x, outBufLen: ", *outBuf);
|
||||
ISO_15693_DEBUG("0x%x ", *outBufPos - 2);
|
||||
|
||||
crc = rfalCrcCalculateCcitt(((picopassMode) ? 0xE012U : 0xFFFFU), outBuf, *outBufPos - 2U);
|
||||
crc = (uint16_t)((picopassMode) ? crc : ~crc);
|
||||
|
||||
if (((crc & 0xffU) == outBuf[*outBufPos-2U]) &&
|
||||
(((crc >> 8U) & 0xffU) == outBuf[*outBufPos-1U]))
|
||||
{
|
||||
err = RFAL_ERR_NONE;
|
||||
ISO_15693_DEBUG("OK\n");
|
||||
}
|
||||
else
|
||||
{
|
||||
ISO_15693_DEBUG("error! Expected: 0x%x, got ", crc);
|
||||
ISO_15693_DEBUG("0x%hhx 0x%hhx\n", outBuf[*outBufPos-2], outBuf[*outBufPos-1]);
|
||||
err = RFAL_ERR_CRC;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
err = RFAL_ERR_CRC;
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Perform 1 of 4 coding and send coded data
|
||||
*
|
||||
* This function takes \a length bytes from \a buffer, perform 1 of 4 coding
|
||||
* (see ISO15693-2 specification) and sends the data using stream mode.
|
||||
*
|
||||
* \param[in] sendSof : send SOF prior to data.
|
||||
* \param[in] buffer : data to send.
|
||||
* \param[in] length : number of bytes to send.
|
||||
*
|
||||
* \return RFAL_ERR_IO : Error during communication.
|
||||
* \return RFAL_ERR_NONE : No error.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
static ReturnCode rfalIso15693PhyVCDCode1Of4(const uint8_t data, uint8_t* outbuffer, uint16_t maxOutBufLen, uint16_t* outBufLen)
|
||||
{
|
||||
uint8_t tmp;
|
||||
ReturnCode err = RFAL_ERR_NONE;
|
||||
uint16_t a;
|
||||
uint8_t* outbuf = outbuffer;
|
||||
|
||||
*outBufLen = 0;
|
||||
|
||||
if (maxOutBufLen < 4U) {
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
tmp = data;
|
||||
for (a = 0; a < 4U; a++)
|
||||
{
|
||||
switch (tmp & 0x3U)
|
||||
{
|
||||
case 0:
|
||||
*outbuf = ISO15693_DAT_00_1_4;
|
||||
break;
|
||||
case 1:
|
||||
*outbuf = ISO15693_DAT_01_1_4;
|
||||
break;
|
||||
case 2:
|
||||
*outbuf = ISO15693_DAT_10_1_4;
|
||||
break;
|
||||
case 3:
|
||||
*outbuf = ISO15693_DAT_11_1_4;
|
||||
break;
|
||||
default:
|
||||
/* MISRA 16.4: mandatory default statement */
|
||||
break;
|
||||
}
|
||||
outbuf++;
|
||||
(*outBufLen)++;
|
||||
tmp >>= 2;
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Perform 1 of 256 coding and send coded data
|
||||
*
|
||||
* This function takes \a length bytes from \a buffer, perform 1 of 256 coding
|
||||
* (see ISO15693-2 specification) and sends the data using stream mode.
|
||||
* \note This function sends SOF prior to the data.
|
||||
*
|
||||
* \param[in] sendSof : send SOF prior to data.
|
||||
* \param[in] buffer : data to send.
|
||||
* \param[in] length : number of bytes to send.
|
||||
*
|
||||
* \return RFAL_ERR_IO : Error during communication.
|
||||
* \return RFAL_ERR_NONE : No error.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
static ReturnCode rfalIso15693PhyVCDCode1Of256(const uint8_t data, uint8_t* outbuffer, uint16_t maxOutBufLen, uint16_t* outBufLen)
|
||||
{
|
||||
uint8_t tmp;
|
||||
ReturnCode err = RFAL_ERR_NONE;
|
||||
uint16_t a;
|
||||
uint8_t* outbuf = outbuffer;
|
||||
|
||||
*outBufLen = 0;
|
||||
|
||||
if (maxOutBufLen < 64U) {
|
||||
return RFAL_ERR_NOMEM;
|
||||
}
|
||||
|
||||
tmp = data;
|
||||
for (a = 0; a < 64U; a++)
|
||||
{
|
||||
switch (tmp)
|
||||
{
|
||||
case 0:
|
||||
*outbuf = ISO15693_DAT_SLOT0_1_256;
|
||||
break;
|
||||
case 1:
|
||||
*outbuf = ISO15693_DAT_SLOT1_1_256;
|
||||
break;
|
||||
case 2:
|
||||
*outbuf = ISO15693_DAT_SLOT2_1_256;
|
||||
break;
|
||||
case 3:
|
||||
*outbuf = ISO15693_DAT_SLOT3_1_256;
|
||||
break;
|
||||
default:
|
||||
*outbuf = 0;
|
||||
break;
|
||||
}
|
||||
outbuf++;
|
||||
(*outBufLen)++;
|
||||
tmp -= 4U; /* PRQA S 2911 # CERT INT30 - Intentional underflow, part of the coding */
|
||||
}
|
||||
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_NFCV */
|
||||
@@ -0,0 +1,181 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_iso15693_2.h
|
||||
* @author MMY Application Team
|
||||
* @brief Implementation of ISO-15693-2
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#ifndef RFAL_ISO_15693_2_H
|
||||
#define RFAL_ISO_15693_2_H
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_platform.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DATATYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
/*! Enum holding possible VCD codings */
|
||||
typedef enum
|
||||
{
|
||||
ISO15693_VCD_CODING_1_4,
|
||||
ISO15693_VCD_CODING_1_256
|
||||
}rfalIso15693VcdCoding_t;
|
||||
|
||||
/*! Enum holding possible VICC datarates */
|
||||
|
||||
/*! Configuration parameter used by rfalIso15693PhyConfigure */
|
||||
typedef struct
|
||||
{
|
||||
rfalIso15693VcdCoding_t coding; /*!< desired VCD coding */
|
||||
uint32_t speedMode; /*!< 0: normal mode, 1: 2^1 = x2 Fast mode, 2 : 2^2 = x4 mode, 3 : 2^3 = x8 mode - all rx pulse numbers and times are divided by 1,2,4,8 */
|
||||
}rfalIso15693PhyConfig_t;
|
||||
|
||||
/*! Parameters how the stream mode should work */
|
||||
struct iso15693StreamConfig {
|
||||
uint8_t useBPSK; /*!< 0: subcarrier, 1:BPSK */
|
||||
uint8_t din; /*!< the divider for the in subcarrier frequency: fc/2^din */
|
||||
uint8_t dout; /*!< the divider for the in subcarrier frequency fc/2^dout */
|
||||
uint8_t report_period_length; /*!< the length of the reporting period 2^report_period_length*/
|
||||
};
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL CONSTANTS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define ISO15693_REQ_FLAG_TWO_SUBCARRIERS 0x01U /*!< Flag indication that communication uses two subcarriers */
|
||||
#define ISO15693_REQ_FLAG_HIGH_DATARATE 0x02U /*!< Flag indication that communication uses high bitrate */
|
||||
#define ISO15693_MASK_FDT_LISTEN (65) /*!< t1min = 308,2us = 4192/fc = 65.5 * 64/fc */
|
||||
|
||||
/*! t1max = 323,3us = 4384/fc = 68.5 * 64/fc
|
||||
* 12 = 768/fc unmodulated time of single subcarrior SoF */
|
||||
#define ISO15693_FWT (69 + 12)
|
||||
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Initialize the ISO15693 phy
|
||||
*
|
||||
* \param[in] config : ISO15693 phy related configuration (See rfalIso15693PhyConfig_t)
|
||||
* \param[out] needed_stream_config : return a pointer to the stream config
|
||||
* needed for this iso15693 config. To be used for configure RF chip.
|
||||
*
|
||||
* \return RFAL_ERR_IO : Error during communication.
|
||||
* \return RFAL_ERR_NONE : No error.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
extern ReturnCode rfalIso15693PhyConfigure(const rfalIso15693PhyConfig_t* config, const struct iso15693StreamConfig ** needed_stream_config );
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Return current phy configuration
|
||||
*
|
||||
* This function returns current Phy configuration previously
|
||||
* set by rfalIso15693PhyConfigure
|
||||
*
|
||||
* \param[out] config : ISO15693 phy configuration.
|
||||
*
|
||||
* \return RFAL_ERR_NONE : No error.
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
extern ReturnCode rfalIso15693PhyGetConfiguration(rfalIso15693PhyConfig_t* config);
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Code an ISO15693 compatible frame
|
||||
*
|
||||
* This function takes \a length bytes from \a buffer, perform proper
|
||||
* encoding and sends out the frame to the ST25R391x.
|
||||
*
|
||||
* \param[in] buffer : data to send, modified to adapt flags.
|
||||
* \param[in] length : number of bytes to send.
|
||||
* \param[in] sendCrc : If set to true, CRC is appended to the frame
|
||||
* \param[in] sendFlags : If set to true, flag field is sent according to
|
||||
* ISO15693.
|
||||
* \param[in] picopassMode : If set to true, the coding will be according to Picopass
|
||||
* \param[out] subbit_total_length : Return the complete bytes which need to
|
||||
* be send for the current coding
|
||||
* \param[in,out] offset : Set to 0 for first transfer, function will update it to
|
||||
point to next byte to be coded
|
||||
* \param[out] outbuf : buffer where the function will store the coded subbit stream
|
||||
* \param[out] outBufSize : the size of the output buffer
|
||||
* \param[out] actOutBufSize : the amount of data stored into the buffer at this call
|
||||
*
|
||||
* \return RFAL_ERR_IO : Error during communication.
|
||||
* \return RFAL_ERR_AGAIN : Data was not coded all the way. Call function again with a new/emptied buffer
|
||||
* \return RFAL_ERR_NO_MEM : In case outBuf is not big enough. Needs to have at
|
||||
least 5 bytes for 1of4 coding and 65 bytes for 1of256 coding
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
extern ReturnCode rfalIso15693VCDCode(uint8_t* buffer, uint16_t length, bool sendCrc, bool sendFlags, bool picopassMode,
|
||||
uint16_t *subbit_total_length, uint16_t *offset,
|
||||
uint8_t* outbuf, uint16_t outBufSize, uint16_t* actOutBufSize);
|
||||
|
||||
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief Receive an ISO15693 compatible frame
|
||||
*
|
||||
* This function receives an ISO15693 frame from the ST25R391x, decodes the frame
|
||||
* and writes the raw data to \a buffer.
|
||||
* \note Buffer needs to be big enough to hold CRC also (+2 bytes)
|
||||
*
|
||||
* \param[in] inBuf : buffer with the hamming coded stream to be decoded
|
||||
* \param[in] inBufLen : number of bytes to decode (=length of buffer).
|
||||
* \param[out] outBuf : buffer where received data shall be written to.
|
||||
* \param[in] outBufLen : Length of output buffer, should be approx twice the size of inBuf
|
||||
* \param[out] outBufPos : The number of decoded bytes. Could be used in
|
||||
* extended implementation to allow multiple calls
|
||||
* \param[out] bitsBeforeCol : in case of RFAL_ERR_RF_COLLISION this value holds the
|
||||
* number of bits in the current byte where the collision happened
|
||||
* \param[in] ignoreBits : number of bits in the beginning where collisions will be ignored
|
||||
* \param[in] picopassMode : if set to true, the decoding will be according to Picopass
|
||||
*
|
||||
* \return RFAL_ERR_RF_COLLISION : collision occured, data uncorrect
|
||||
* \return RFAL_ERR_CRC : CRC error, data uncorrect
|
||||
* \return RFAL_ERR_TIMEOUT : timeout waiting for data.
|
||||
* \return RFAL_ERR_NONE : No error
|
||||
*
|
||||
*****************************************************************************
|
||||
*/
|
||||
extern ReturnCode rfalIso15693VICCDecode(const uint8_t *inBuf,
|
||||
uint16_t inBufLen,
|
||||
uint8_t* outBuf,
|
||||
uint16_t outBufLen,
|
||||
uint16_t* outBufPos,
|
||||
uint16_t* bitsBeforeCol,
|
||||
uint16_t ignoreBits,
|
||||
bool picopassMode );
|
||||
|
||||
#endif /* RFAL_ISO_15693_2_H */
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,715 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_nfcb.c
|
||||
* @author MMY Application Team
|
||||
* @brief Implementation of NFC-B (ISO14443B) helpers
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_nfcb.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_NFCB
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_NFCB
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_NFCB_SENSB_REQ_EXT_SENSB_RES_SUPPORTED 0x10U /*!< Bit mask for Extended SensB Response support in SENSB_REQ */
|
||||
#define RFAL_NFCB_SENSB_RES_PROT_TYPE_RFU 0x08U /*!< Bit mask for Protocol Type RFU in SENSB_RES */
|
||||
#define RFAL_NFCB_SLOT_MARKER_SC_SHIFT 4U /*!< Slot Code position on SLOT_MARKER APn */
|
||||
|
||||
#define RFAL_NFCB_SLOTMARKER_SLOTCODE_MIN 1U /*!< SLOT_MARKER Slot Code minimum Digital 1.1 Table 37 */
|
||||
#define RFAL_NFCB_SLOTMARKER_SLOTCODE_MAX 16U /*!< SLOT_MARKER Slot Code maximum Digital 1.1 Table 37 */
|
||||
|
||||
#define RFAL_NFCB_ACTIVATION_FWT (RFAL_NFCB_FWTSENSB + RFAL_NFCB_DTPOLL_20) /*!< FWT(SENSB) + dTbPoll Digital 2.0 7.9.1.3 */
|
||||
|
||||
/*! Advanced and Extended bit mask in Parameter of SENSB_REQ */
|
||||
#define RFAL_NFCB_SENSB_REQ_PARAM (RFAL_NFCB_SENSB_REQ_ADV_FEATURE | RFAL_NFCB_SENSB_REQ_EXT_SENSB_RES_SUPPORTED)
|
||||
|
||||
|
||||
/*! NFC-B commands definition */
|
||||
enum
|
||||
{
|
||||
RFAL_NFCB_CMD_SENSB_REQ = 0x05, /*!< SENSB_REQ (REQB) & SLOT_MARKER Digital 1.1 Table 24*/
|
||||
RFAL_NFCB_CMD_SENSB_RES = 0x50, /*!< SENSB_RES (ATQB) & SLOT_MARKER Digital 1.1 Table 27*/
|
||||
RFAL_NFCB_CMD_SLPB_REQ = 0x50, /*!< SLPB_REQ (HLTB command) Digital 1.1 Table 38 */
|
||||
RFAL_NFCB_CMD_SLPB_RES = 0x00 /*!< SLPB_RES (HLTB Answer) Digital 1.1 Table 39 */
|
||||
};
|
||||
|
||||
|
||||
/*! NFC-B Technology Detection context */
|
||||
typedef struct{
|
||||
rfalNfcbSensbRes *sensbRes; /*!< Location of SENSB_RES */
|
||||
uint8_t *sensbResLen; /*!< Location of SENSB_RES length */
|
||||
uint16_t rxLen; /*!< Reception length (16bits) */
|
||||
}rfalNfcbTechDetParams;
|
||||
|
||||
|
||||
/*! NFC-B Collision Resolution states */
|
||||
typedef enum{
|
||||
RFAL_NFCB_CR_SLOTS_TX, /*!< State where slots are open and slot markers issued */
|
||||
RFAL_NFCB_CR_SLOTS, /*!< State where slots are open and slot markers issued */
|
||||
RFAL_NFCB_CR_SLEEP, /*!< State between slotted loop */
|
||||
RFAL_NFCB_CR_END /*!< State for terminating the collision resolution */
|
||||
}rfalNfcbColResState;
|
||||
|
||||
|
||||
/*! NFC-B Collision Resolution context */
|
||||
typedef struct{
|
||||
rfalComplianceMode compMode; /*!< Compliancy mode to be used */
|
||||
uint8_t devLimit; /*!< Device limit to be used */
|
||||
rfalNfcbListenDevice *nfcbDevList; /*!< Location of the device list */
|
||||
uint8_t *devCnt; /*!< Location of the device counter */
|
||||
bool *colPending; /*!< Location of the Collision pending flag */
|
||||
|
||||
uint8_t curSlots; /*!< Current number of slots */
|
||||
uint8_t curSlotNum; /*!< Current Slot number (whithin slotted loop) */
|
||||
uint8_t endSlots; /*!< Maximum number of slots allowed */
|
||||
uint8_t curDevCnt; /*!< Current device counter (per slotted loop) */
|
||||
bool colPend; /*!< Internal Collision pending flag */
|
||||
uint32_t tmr; /*!< Collision Resolution timer */
|
||||
rfalNfcbColResState state; /*!< Collision Resolution state */
|
||||
}rfalNfcbColResParams;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define rfalNfcbNI2NumberOfSlots( ni ) (uint8_t)(1U << (ni)) /*!< Converts the Number of slots Identifier to slot number */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! ALLB_REQ (WUPB) and SENSB_REQ (REQB) Command Format Digital 1.1 7.6.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< xxxxB_REQ: 05h */
|
||||
uint8_t AFI; /*!< NFC Identifier */
|
||||
uint8_t PARAM; /*!< Application Data */
|
||||
} rfalNfcbSensbReq;
|
||||
|
||||
/*! SLOT_MARKER Command format Digital 1.1 7.7.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t APn; /*!< Slot number 2..16 | 0101b */
|
||||
} rfalNfcbSlotMarker;
|
||||
|
||||
/*! SLPB_REQ (HLTB) Command Format Digital 1.1 7.8.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< SLPB_REQ: 50h */
|
||||
uint8_t nfcid0[RFAL_NFCB_NFCID0_LEN]; /*!< NFC Identifier (PUPI)*/
|
||||
} rfalNfcbSlpbReq;
|
||||
|
||||
|
||||
/*! SLPB_RES (HLTB) Response Format Digital 1.1 7.8.2 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< SLPB_RES: 00h */
|
||||
} rfalNfcbSlpbRes;
|
||||
|
||||
|
||||
/*! RFAL NFC-B instance */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t AFI; /*!< AFI to be used */
|
||||
uint8_t PARAM; /*!< PARAM to be used */
|
||||
rfalNfcbColResParams CR; /*!< Collision Resolution */
|
||||
rfalNfcbTechDetParams DT;
|
||||
} rfalNfcb;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
static ReturnCode rfalNfcbCheckSensbRes( const rfalNfcbSensbRes *sensbRes, uint8_t sensbResLen );
|
||||
static ReturnCode rfalNfcbPollerSleepTx( const uint8_t* nfcid0 );
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
static rfalNfcb gRfalNfcb; /*!< RFAL NFC-B Instance */
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
static ReturnCode rfalNfcbCheckSensbRes( const rfalNfcbSensbRes *sensbRes, uint8_t sensbResLen )
|
||||
{
|
||||
/* Check response length */
|
||||
if( ( (sensbResLen != RFAL_NFCB_SENSB_RES_LEN) && (sensbResLen != RFAL_NFCB_SENSB_RES_EXT_LEN) ) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Check SENSB_RES and Protocol Type Digital 1.1 7.6.2.19 */
|
||||
if( ((sensbRes->protInfo.FsciProType & RFAL_NFCB_SENSB_RES_PROT_TYPE_RFU) != 0U) || (sensbRes->cmd != (uint8_t)RFAL_NFCB_CMD_SENSB_RES) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/* This function is used internally during Collision Resolution. Its *
|
||||
* purpose is to block the state machine for minimmal time. *
|
||||
* Activity 2.1 does not enforce response checking or error handling. */
|
||||
static ReturnCode rfalNfcbPollerSleepTx( const uint8_t* nfcid0 )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalNfcbSlpbReq slpbReq;
|
||||
|
||||
if( nfcid0 == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Compute SLPB_REQ */
|
||||
slpbReq.cmd = RFAL_NFCB_CMD_SLPB_REQ;
|
||||
RFAL_MEMCPY( slpbReq.nfcid0, nfcid0, RFAL_NFCB_NFCID0_LEN );
|
||||
|
||||
/* Send SLPB_REQ and ignore its response and FWT*/
|
||||
RFAL_EXIT_ON_ERR( ret, rfalTransceiveBlockingTx( (uint8_t*)&slpbReq, sizeof(rfalNfcbSlpbReq), NULL, 0, NULL, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_NFCB_POLLER ));
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerInitialize( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCB, RFAL_BR_106, RFAL_BR_106 ) );
|
||||
rfalSetErrorHandling( RFAL_ERRORHANDLING_NONE );
|
||||
|
||||
rfalSetGT( RFAL_GT_NFCB );
|
||||
rfalSetFDTListen( RFAL_FDT_LISTEN_NFCB_POLLER );
|
||||
rfalSetFDTPoll( RFAL_FDT_POLL_NFCB_POLLER );
|
||||
|
||||
gRfalNfcb.AFI = RFAL_NFCB_AFI;
|
||||
gRfalNfcb.PARAM = RFAL_NFCB_PARAM;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerInitializeWithParams( uint8_t AFI, uint8_t PARAM )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcbPollerInitialize() );
|
||||
|
||||
gRfalNfcb.AFI = AFI;
|
||||
gRfalNfcb.PARAM = (PARAM & RFAL_NFCB_SENSB_REQ_PARAM);
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerCheckPresence( rfalNfcbSensCmd cmd, rfalNfcbSlots slots, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcbPollerStartCheckPresence( cmd, slots, sensbRes, sensbResLen ) );
|
||||
rfalRunBlocking( ret, rfalNfcbPollerGetCheckPresenceStatus() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerStartCheckPresence( rfalNfcbSensCmd cmd, rfalNfcbSlots slots, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen )
|
||||
{
|
||||
rfalNfcbSensbReq sensbReq;
|
||||
|
||||
|
||||
/* Check if the command requested and given the slot number are valid */
|
||||
if( ((RFAL_NFCB_SENS_CMD_SENSB_REQ != cmd) && (RFAL_NFCB_SENS_CMD_ALLB_REQ != cmd)) ||
|
||||
(slots > RFAL_NFCB_SLOT_NUM_16) || (sensbRes == NULL) || (sensbResLen == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
*sensbResLen = 0;
|
||||
RFAL_MEMSET(sensbRes, 0x00, sizeof(rfalNfcbSensbRes) );
|
||||
|
||||
/* Compute SENSB_REQ */
|
||||
sensbReq.cmd = RFAL_NFCB_CMD_SENSB_REQ;
|
||||
sensbReq.AFI = gRfalNfcb.AFI;
|
||||
sensbReq.PARAM = (((uint8_t)gRfalNfcb.PARAM & RFAL_NFCB_SENSB_REQ_PARAM) | (uint8_t)cmd | (uint8_t)slots);
|
||||
|
||||
gRfalNfcb.DT.sensbRes = sensbRes;
|
||||
gRfalNfcb.DT.sensbResLen = sensbResLen;
|
||||
|
||||
/* Send SENSB_REQ */
|
||||
return rfalTransceiveBlockingTx( (uint8_t*)&sensbReq, sizeof(rfalNfcbSensbReq), (uint8_t*)sensbRes, sizeof(rfalNfcbSensbRes), &gRfalNfcb.DT.rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCB_FWTSENSB );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerGetCheckPresenceStatus( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_BUSY( ret, rfalGetTransceiveStatus() );
|
||||
|
||||
/* Covert bits to bytes (u8) */
|
||||
(*gRfalNfcb.DT.sensbResLen) = (uint8_t)rfalConvBitsToBytes(gRfalNfcb.DT.rxLen);
|
||||
|
||||
/* Check if a transmission error was detected */
|
||||
if( (ret == RFAL_ERR_CRC) || (ret == RFAL_ERR_FRAMING) )
|
||||
{
|
||||
/* Invalidate received frame as an error was detected (CollisionResolution checks if valid) */
|
||||
(*gRfalNfcb.DT.sensbResLen) = 0;
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
return rfalNfcbCheckSensbRes( gRfalNfcb.DT.sensbRes, *gRfalNfcb.DT.sensbResLen );
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerSleep( const uint8_t* nfcid0 )
|
||||
{
|
||||
uint16_t rxLen;
|
||||
ReturnCode ret;
|
||||
rfalNfcbSlpbReq slpbReq;
|
||||
rfalNfcbSlpbRes slpbRes;
|
||||
|
||||
if( nfcid0 == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Compute SLPB_REQ */
|
||||
slpbReq.cmd = RFAL_NFCB_CMD_SLPB_REQ;
|
||||
RFAL_MEMCPY( slpbReq.nfcid0, nfcid0, RFAL_NFCB_NFCID0_LEN );
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalTransceiveBlockingTxRx( (uint8_t*)&slpbReq, sizeof(rfalNfcbSlpbReq), (uint8_t*)&slpbRes, sizeof(rfalNfcbSlpbRes), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCB_ACTIVATION_FWT ));
|
||||
|
||||
/* Check SLPB_RES */
|
||||
if( (rxLen != sizeof(rfalNfcbSlpbRes)) || (slpbRes.cmd != (uint8_t)RFAL_NFCB_CMD_SLPB_RES) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerSlotMarker( uint8_t slotCode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcbPollerStartSlotMarker( slotCode, sensbRes, sensbResLen ) );
|
||||
rfalRunBlocking( ret, rfalNfcbPollerGetSlotMarkerStatus() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerStartSlotMarker( uint8_t slotCode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen )
|
||||
{
|
||||
rfalNfcbSlotMarker slotMarker;
|
||||
|
||||
/* Check parameters */
|
||||
if( (sensbRes == NULL) || (sensbResLen == NULL) ||
|
||||
(slotCode < RFAL_NFCB_SLOTMARKER_SLOTCODE_MIN) ||
|
||||
(slotCode > RFAL_NFCB_SLOTMARKER_SLOTCODE_MAX) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
/* Compose and send SLOT_MARKER with disabled AGC to detect collisions */
|
||||
slotMarker.APn = ((slotCode << RFAL_NFCB_SLOT_MARKER_SC_SHIFT) | (uint8_t)RFAL_NFCB_CMD_SENSB_REQ);
|
||||
|
||||
gRfalNfcb.DT.sensbRes = sensbRes;
|
||||
gRfalNfcb.DT.sensbResLen = sensbResLen;
|
||||
|
||||
return rfalTransceiveBlockingTx( (uint8_t*)&slotMarker, sizeof(rfalNfcbSlotMarker), (uint8_t*)gRfalNfcb.DT.sensbRes, sizeof(rfalNfcbSensbRes), &gRfalNfcb.DT.rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCB_FWTSENSB );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerGetSlotMarkerStatus( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_BUSY( ret, rfalGetTransceiveStatus() );
|
||||
|
||||
/* Covert bits to bytes (u8) */
|
||||
(*gRfalNfcb.DT.sensbResLen) = (uint8_t)rfalConvBitsToBytes(gRfalNfcb.DT.rxLen);
|
||||
|
||||
/* Check if a transmission error was detected */
|
||||
if( (ret == RFAL_ERR_CRC) || (ret == RFAL_ERR_FRAMING) )
|
||||
{
|
||||
return RFAL_ERR_RF_COLLISION;
|
||||
}
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
return rfalNfcbCheckSensbRes( gRfalNfcb.DT.sensbRes, *gRfalNfcb.DT.sensbResLen );
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerTechnologyDetection( rfalComplianceMode compMode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen )
|
||||
{
|
||||
return rfalNfcbPollerCheckPresence( ((compMode == RFAL_COMPLIANCE_MODE_EMV) ? RFAL_NFCB_SENS_CMD_ALLB_REQ : RFAL_NFCB_SENS_CMD_SENSB_REQ), RFAL_NFCB_SLOT_NUM_1, sensbRes, sensbResLen );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerStartTechnologyDetection( rfalComplianceMode compMode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen )
|
||||
{
|
||||
return rfalNfcbPollerStartCheckPresence( ((compMode == RFAL_COMPLIANCE_MODE_EMV) ? RFAL_NFCB_SENS_CMD_ALLB_REQ : RFAL_NFCB_SENS_CMD_SENSB_REQ), RFAL_NFCB_SLOT_NUM_1, sensbRes, sensbResLen );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerGetTechnologyDetectionStatus( void )
|
||||
{
|
||||
return rfalNfcbPollerGetCheckPresenceStatus();
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcbPollerStartCollisionResolution( compMode, devLimit, nfcbDevList, devCnt) );
|
||||
rfalRunBlocking( ret, rfalNfcbPollerGetCollisionResolutionStatus() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerSlottedCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbSlots initSlots, rfalNfcbSlots endSlots, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt, bool *colPending )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcbPollerStartSlottedCollisionResolution( compMode, devLimit, initSlots, endSlots, nfcbDevList, devCnt, colPending ) );
|
||||
rfalRunBlocking( ret, rfalNfcbPollerGetCollisionResolutionStatus() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerStartCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt )
|
||||
{
|
||||
return rfalNfcbPollerStartSlottedCollisionResolution( compMode, devLimit, RFAL_NFCB_SLOT_NUM_1, RFAL_NFCB_SLOT_NUM_16, nfcbDevList, devCnt, &gRfalNfcb.CR.colPend );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerStartSlottedCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbSlots initSlots, rfalNfcbSlots endSlots, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt, bool *colPending )
|
||||
{
|
||||
/* Check parameters. In ISO | Activity 1.0 mode the initial slots must be 1 as continuation of Technology Detection */
|
||||
if( (nfcbDevList == NULL) || (devCnt == NULL) || (colPending == NULL) || (initSlots > RFAL_NFCB_SLOT_NUM_16) ||
|
||||
(endSlots > RFAL_NFCB_SLOT_NUM_16) || ((compMode == RFAL_COMPLIANCE_MODE_ISO) && (initSlots != RFAL_NFCB_SLOT_NUM_1)) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
(*devCnt) = 0;
|
||||
(*colPending) = false;
|
||||
platformTimerDestroy( gRfalNfcb.CR.tmr );
|
||||
|
||||
/* Store parameters */
|
||||
gRfalNfcb.CR.compMode = compMode;
|
||||
gRfalNfcb.CR.devLimit = devLimit;
|
||||
gRfalNfcb.CR.curSlots = (uint8_t)initSlots;
|
||||
gRfalNfcb.CR.endSlots = (uint8_t)endSlots;
|
||||
gRfalNfcb.CR.nfcbDevList = nfcbDevList;
|
||||
gRfalNfcb.CR.colPending = colPending;
|
||||
gRfalNfcb.CR.devCnt = devCnt;
|
||||
(*gRfalNfcb.CR.devCnt) = 0U;
|
||||
gRfalNfcb.CR.curDevCnt = 0U;
|
||||
gRfalNfcb.CR.curSlotNum = 0U;
|
||||
gRfalNfcb.CR.tmr = RFAL_TIMING_NONE;
|
||||
|
||||
gRfalNfcb.CR.state = RFAL_NFCB_CR_SLOTS_TX;
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcbPollerGetCollisionResolutionStatus( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalNfcbSensCmd cmd;
|
||||
|
||||
/* Check if operation is still not complete */
|
||||
if( gRfalNfcb.CR.tmr != RFAL_TIMING_NONE )
|
||||
{
|
||||
if( (!platformTimerIsExpired(gRfalNfcb.CR.tmr)) )
|
||||
{
|
||||
return RFAL_ERR_BUSY;
|
||||
}
|
||||
}
|
||||
|
||||
switch( gRfalNfcb.CR.state )
|
||||
{
|
||||
/*******************************************************************************/
|
||||
case RFAL_NFCB_CR_SLOTS_TX:
|
||||
|
||||
/* Check if it's the first iteration on ISO | Activity 1.0 mode */
|
||||
if( (gRfalNfcb.CR.compMode == RFAL_COMPLIANCE_MODE_ISO) && (gRfalNfcb.CR.curSlots == (uint8_t)RFAL_NFCB_SLOT_NUM_1) )
|
||||
{
|
||||
/* Do nothing in case Activity 1.0, where the previous SENSB_RES from technology detection should be used */
|
||||
}
|
||||
/* Send SENSB_REQ with number of slots if not the first Activity 2.1 9.3.5.24 - Symbol 23 */
|
||||
else if( gRfalNfcb.CR.curSlotNum == 0U )
|
||||
{
|
||||
/* Send ALLB_REQ Activity 2.1 9.3.5.2 and 9.3.5.3 (Symbol 1 and 2) */
|
||||
cmd = ((gRfalNfcb.CR.curSlots == (uint8_t)RFAL_NFCB_SLOT_NUM_1) ? RFAL_NFCB_SENS_CMD_ALLB_REQ : RFAL_NFCB_SENS_CMD_SENSB_REQ );
|
||||
|
||||
/* PRQA S 4342 1 # MISRA 10.5 - Layout of rfalNfcbSlots and the limited loop guarantee that no invalid enum values are created. */
|
||||
rfalNfcbPollerStartCheckPresence( cmd, (rfalNfcbSlots)gRfalNfcb.CR.curSlots, &gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].sensbRes, &gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].sensbResLen );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Activity 2.1 9.3.5.26 - Symbol 25 */
|
||||
rfalNfcbPollerStartSlotMarker( gRfalNfcb.CR.curSlotNum, &gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].sensbRes, &gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].sensbResLen );
|
||||
}
|
||||
|
||||
gRfalNfcb.CR.state = RFAL_NFCB_CR_SLOTS;
|
||||
return RFAL_ERR_BUSY;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_NFCB_CR_SLOTS:
|
||||
|
||||
RFAL_EXIT_ON_BUSY( ret, rfalNfcbPollerGetSlotMarkerStatus() );
|
||||
|
||||
/*******************************************************************************/
|
||||
if( gRfalNfcb.CR.compMode == RFAL_COMPLIANCE_MODE_EMV )
|
||||
{
|
||||
/* Report (timeout) error immediately EMVCo 3.0 9.6.1.3 */
|
||||
if( ret != RFAL_ERR_NONE )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check if there was a transmission error on WUPB EMVCo 3.0 9.3.3.1 */
|
||||
if( gRfalNfcb.CR.nfcbDevList->sensbResLen == 0U )
|
||||
{
|
||||
return RFAL_ERR_FRAMING;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Activity 2.1 9.3.5.7 and 9.3.5.8 - Symbol 6 */
|
||||
if( ret != RFAL_ERR_TIMEOUT )
|
||||
{
|
||||
/* Activity 2.1 9.3.5.8 - Symbol 7 */
|
||||
if( (rfalNfcbCheckSensbRes( &gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].sensbRes, gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].sensbResLen) == RFAL_ERR_NONE) && (ret == RFAL_ERR_NONE) )
|
||||
{
|
||||
gRfalNfcb.CR.nfcbDevList[*gRfalNfcb.CR.devCnt].isSleep = false;
|
||||
|
||||
if( gRfalNfcb.CR.compMode == RFAL_COMPLIANCE_MODE_EMV )
|
||||
{
|
||||
(*gRfalNfcb.CR.devCnt)++;
|
||||
return ret;
|
||||
}
|
||||
else if( gRfalNfcb.CR.compMode == RFAL_COMPLIANCE_MODE_ISO )
|
||||
{
|
||||
/* Activity 1.0 9.3.5.8 - Symbol 7 */
|
||||
(*gRfalNfcb.CR.devCnt)++;
|
||||
gRfalNfcb.CR.curDevCnt++;
|
||||
|
||||
/* Activity 1.0 9.3.5.10 - Symbol 9 */
|
||||
if( (*gRfalNfcb.CR.devCnt >= gRfalNfcb.CR.devLimit) || (gRfalNfcb.CR.curSlotNum == (uint8_t)RFAL_NFCB_SLOT_NUM_1) )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Activity 2.1 9.3.5.11 - Symbol 10 */
|
||||
rfalNfcbPollerSleep( gRfalNfcb.CR.nfcbDevList[(*gRfalNfcb.CR.devCnt)-1U].sensbRes.nfcid0 );
|
||||
gRfalNfcb.CR.nfcbDevList[(*gRfalNfcb.CR.devCnt)-1U].isSleep = true;
|
||||
}
|
||||
else if( gRfalNfcb.CR.compMode == RFAL_COMPLIANCE_MODE_NFC )
|
||||
{
|
||||
/* Activity 2.1 9.3.5.10 and 9.3.5.11 - Symbol 9 and Symbol 11*/
|
||||
if( gRfalNfcb.CR.curDevCnt != 0U )
|
||||
{
|
||||
rfalNfcbPollerSleepTx( gRfalNfcb.CR.nfcbDevList[(*gRfalNfcb.CR.devCnt) - (uint8_t)1U].sensbRes.nfcid0 );
|
||||
gRfalNfcb.CR.nfcbDevList[(*gRfalNfcb.CR.devCnt) - (uint8_t)1U].isSleep = true;
|
||||
|
||||
gRfalNfcb.CR.tmr = platformTimerCreate( (uint16_t)rfalConv1fcToMs(RFAL_NFCB_ACTIVATION_FWT) );
|
||||
ret = RFAL_ERR_BUSY;
|
||||
}
|
||||
|
||||
/* Activity 2.1 9.3.5.12 - Symbol 11 */
|
||||
(*gRfalNfcb.CR.devCnt)++;
|
||||
gRfalNfcb.CR.curDevCnt++;
|
||||
|
||||
/* Activity 2.1 9.3.5.6 - Symbol 13 */
|
||||
if( (*gRfalNfcb.CR.devCnt >= gRfalNfcb.CR.devLimit) || (gRfalNfcb.CR.curSlots == (uint8_t)RFAL_NFCB_SLOT_NUM_1) )
|
||||
{
|
||||
gRfalNfcb.CR.state = RFAL_NFCB_CR_END;
|
||||
return RFAL_ERR_BUSY;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* MISRA 15.7 - Empty else */
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* If deviceLimit is set to 0 the NFC Forum Device is configured to perform collision detection only Activity 1.0 and 1.1 9.3.5.5 - Symbol 4 */
|
||||
if( (gRfalNfcb.CR.devLimit == 0U) && (gRfalNfcb.CR.curSlotNum == (uint8_t)RFAL_NFCB_SLOT_NUM_1) )
|
||||
{
|
||||
return RFAL_ERR_RF_COLLISION;
|
||||
}
|
||||
|
||||
/* Activity 2.1 9.3.5.9 - Symbol 8 */
|
||||
(*gRfalNfcb.CR.colPending) = true;
|
||||
}
|
||||
}
|
||||
|
||||
/* Activity 2.1 9.3.5.15 - Symbol 14 & 15*/
|
||||
if( (gRfalNfcb.CR.curSlotNum + 1U) < rfalNfcbNI2NumberOfSlots(gRfalNfcb.CR.curSlots) )
|
||||
{
|
||||
gRfalNfcb.CR.curSlotNum++;
|
||||
gRfalNfcb.CR.state = RFAL_NFCB_CR_SLOTS_TX;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Activity 2.1 9.3.5.17 - Symbol 16 */
|
||||
if( !(*gRfalNfcb.CR.colPending) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
/* Activity 1.1 9.3.5.18 - Symbol 17 */
|
||||
if( gRfalNfcb.CR.curDevCnt == 0U )
|
||||
{
|
||||
/* Activity 2.1 9.3.5.19 - Symbol 18 */
|
||||
if( (gRfalNfcb.CR.curSlotNum + 1U) >= rfalNfcbNI2NumberOfSlots(gRfalNfcb.CR.endSlots) )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
/* Activity 2.1 9.3.5.20 - Symbol 19 */
|
||||
gRfalNfcb.CR.curSlots++;
|
||||
}
|
||||
|
||||
gRfalNfcb.CR.state = RFAL_NFCB_CR_SLEEP;
|
||||
}
|
||||
|
||||
return RFAL_ERR_BUSY;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_NFCB_CR_SLEEP:
|
||||
|
||||
/* Activity 2.1 9.3.5.23 - Symbol 22 */
|
||||
if( (gRfalNfcb.CR.compMode == RFAL_COMPLIANCE_MODE_NFC) && (gRfalNfcb.CR.curDevCnt != 0U) )
|
||||
{
|
||||
rfalNfcbPollerSleepTx( gRfalNfcb.CR.nfcbDevList[((*gRfalNfcb.CR.devCnt) - (uint8_t)1U)].sensbRes.nfcid0 );
|
||||
gRfalNfcb.CR.nfcbDevList[((*gRfalNfcb.CR.devCnt) - (uint8_t)1U)].isSleep = true;
|
||||
|
||||
gRfalNfcb.CR.tmr = platformTimerCreate( (uint16_t) rfalConv1fcToMs(RFAL_NFCB_ACTIVATION_FWT) );
|
||||
}
|
||||
|
||||
/* Activity 2.1 9.3.5.6 - Symbol 5 */
|
||||
gRfalNfcb.CR.curSlotNum = 0U;
|
||||
gRfalNfcb.CR.curDevCnt = 0U;
|
||||
(*gRfalNfcb.CR.colPending) = false;
|
||||
|
||||
gRfalNfcb.CR.state = RFAL_NFCB_CR_SLOTS_TX;
|
||||
return RFAL_ERR_BUSY;
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_NFCB_CR_END:
|
||||
default:
|
||||
/* MISRA 16.4: no empty default statement (a comment being enough) */
|
||||
break;
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
uint32_t rfalNfcbTR2ToFDT( uint8_t tr2Code )
|
||||
{
|
||||
/*******************************************************************************/
|
||||
/* MISRA 8.9 An object should be defined at block scope if its identifier only appears in a single function */
|
||||
/*! TR2 Table according to Digital 1.1 Table 33 */
|
||||
const uint16_t rfalNfcbTr2Table[4] = { 1792, 3328, 5376, 9472 };
|
||||
/*******************************************************************************/
|
||||
|
||||
return (uint32_t)rfalNfcbTr2Table[ (tr2Code & RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK) ];
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_NFCB */
|
||||
@@ -0,0 +1,635 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_nfcf.c
|
||||
* @author MMY Application Team
|
||||
* @brief Implementation of NFC-F Poller (FeliCa PCD) device
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_nfcf.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_NFCF
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_NFCF
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_NFCF_SENSF_REQ_LEN_MIN 5U /*!< SENSF_RES minimum length */
|
||||
|
||||
#define RFAL_NFCF_READ_WO_ENCRYPTION_MIN_LEN 15U /*!< Minimum length for a Check Command T3T 5.4.1 */
|
||||
#define RFAL_NFCF_WRITE_WO_ENCRYPTION_MIN_LEN 31U /*!< Minimum length for an Update Command T3T 5.5.1 */
|
||||
|
||||
#define RFAL_NFCF_CHECK_RES_MIN_LEN 11U /*!< CHECK Response minimum length T3T 1.0 Table 8 */
|
||||
#define RFAL_NFCF_UPDATE_RES_MIN_LEN 11U /*!< UPDATE Response minimum length T3T 1.0 Table 8 */
|
||||
|
||||
#define RFAL_NFCF_CHECK_REQ_MAX_LEN 86U /*!< Max length of a Check request T3T 1.0 Table 7 */
|
||||
#define RFAL_NFCF_CHECK_REQ_MAX_SERV 15U /*!< Max Services number on Check request T3T 1.0 5.4.1.5 */
|
||||
#define RFAL_NFCF_CHECK_REQ_MAX_BLOCK 15U /*!< Max Blocks number on Check request T3T 1.0 5.4.1.10 */
|
||||
#define RFAL_NFCF_UPDATE_REQ_MAX_SERV 15U /*!< Max Services number Update request T3T 1.0 5.4.1.5 */
|
||||
#define RFAL_NFCF_UPDATE_REQ_MAX_BLOCK 13U /*!< Max Blocks number on Update request T3T 1.0 5.4.1.10 */
|
||||
|
||||
|
||||
/*! MRT Check | Update = (Tt3t x ((A+1) + n (B+1)) x 4^E) + dRWTt3t T3T 5.8
|
||||
Max values used: A = 7 ; B = 7 ; E = 3 ; n = 15 (NFC Forum n = 15, JIS n = 32)
|
||||
*/
|
||||
#define RFAL_NFCF_MRT_CHECK_UPDATE ((4096U * (8U + (15U * 8U)) * 64U ) + 16U)
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
#define rfalNfcfSlots2CardNum( s ) ((uint8_t)(s)+1U) /*!< Converts Time Slot Number (TSN) into num of slots */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Structure/Buffer to hold the SENSF_RES with LEN byte prepended */
|
||||
typedef struct{
|
||||
uint8_t LEN; /*!< NFC-F LEN byte */
|
||||
rfalNfcfSensfRes SENSF_RES; /*!< SENSF_RES */
|
||||
} rfalNfcfSensfResBuf;
|
||||
|
||||
|
||||
/*! Greedy collection for NFCF GRE_POLL_F Activity 1.0 Table 10 */
|
||||
typedef struct{
|
||||
uint8_t pollFound; /*!< Number of devices found by the Poll */
|
||||
uint8_t pollCollision; /*!< Number of collisions detected */
|
||||
rfalFeliCaPollRes POLL_F[RFAL_NFCF_POLL_MAXCARDS]; /*!< GRE_POLL_F Activity 1.0 Table 10 */
|
||||
} rfalNfcfGreedyF;
|
||||
|
||||
|
||||
/*! NFC-F SENSF_REQ format Digital 1.1 8.6.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t CMD; /*!< Command code: 00h */
|
||||
uint8_t SC[RFAL_NFCF_SENSF_SC_LEN]; /*!< System Code */
|
||||
uint8_t RC; /*!< Request Code */
|
||||
uint8_t TSN; /*!< Time Slot Number */
|
||||
} rfalNfcfSensfReq;
|
||||
|
||||
|
||||
|
||||
/*! Colission Resolution states */
|
||||
typedef enum{
|
||||
RFAL_NFCF_CR_POLL, /*!< Poll Request */
|
||||
RFAL_NFCF_CR_PARSE, /*!< Parse Poll Response */
|
||||
RFAL_NFCF_CR_POLL_SC, /*!< Poll Request with RC=SC */
|
||||
}rfalNfcFColResState;
|
||||
|
||||
|
||||
|
||||
/*! Colission Resolution context */
|
||||
typedef struct{
|
||||
rfalNfcfGreedyF greedyF;
|
||||
uint8_t devLimit; /*!< Device limit to be used */
|
||||
rfalComplianceMode compMode; /*!< Compliancy mode to be used */
|
||||
rfalNfcfListenDevice* nfcfDevList; /*!< Location of the device list */
|
||||
uint8_t* devCnt; /*!< Location of the device counter */
|
||||
bool collPending; /*!< Collision pending flag */
|
||||
bool nfcDepFound;
|
||||
rfalNfcFColResState state; /*!< Single Collision Resolution state (Single CR) */
|
||||
}rfalNfcfColResParams;
|
||||
|
||||
|
||||
/*! RFAL NFC-F instance */
|
||||
typedef struct
|
||||
{
|
||||
rfalNfcfColResParams CR; /*!< Collision Resolution */
|
||||
} rfalNfcf;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
static rfalNfcf gNfcf; /*!< RFAL NFC-F instance */
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
static void rfalNfcfComputeValidSENF( rfalNfcfListenDevice *outDevInfo, uint8_t *curDevIdx, uint8_t devLimit, bool overwrite, bool *nfcDepFound );
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
static void rfalNfcfComputeValidSENF( rfalNfcfListenDevice *outDevInfo, uint8_t *curDevIdx, uint8_t devLimit, bool overwrite, bool *nfcDepFound )
|
||||
{
|
||||
uint8_t tmpIdx;
|
||||
bool duplicate;
|
||||
const rfalNfcfSensfResBuf *sensfBuf;
|
||||
rfalNfcfSensfResBuf sensfCopy;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Go through all responses check if valid and duplicates */
|
||||
/*******************************************************************************/
|
||||
while( (gNfcf.CR.greedyF.pollFound > 0U) && ((*curDevIdx) < devLimit) )
|
||||
{
|
||||
duplicate = false;
|
||||
gNfcf.CR.greedyF.pollFound--;
|
||||
|
||||
/* MISRA 11.3 - Cannot point directly into different object type, use local copy */
|
||||
RFAL_MEMCPY( (uint8_t*)&sensfCopy, (uint8_t*)&gNfcf.CR.greedyF.POLL_F[gNfcf.CR.greedyF.pollFound], sizeof(rfalNfcfSensfResBuf) );
|
||||
|
||||
|
||||
/* Point to received SENSF_RES */
|
||||
sensfBuf = &sensfCopy;
|
||||
|
||||
|
||||
/* Check for devices that are already in device list */
|
||||
for( tmpIdx = 0; tmpIdx < (*curDevIdx); tmpIdx++ )
|
||||
{
|
||||
if( RFAL_BYTECMP( sensfBuf->SENSF_RES.NFCID2, outDevInfo[tmpIdx].sensfRes.NFCID2, RFAL_NFCF_NFCID2_LEN ) == 0 )
|
||||
{
|
||||
duplicate = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/* If is a duplicate skip this (and not to overwrite)*/
|
||||
if(duplicate && (!overwrite))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if response length is OK */
|
||||
if( (( sensfBuf->LEN - RFAL_NFCF_HEADER_LEN) < RFAL_NFCF_SENSF_RES_LEN_MIN) || ((sensfBuf->LEN - RFAL_NFCF_HEADER_LEN) > RFAL_NFCF_SENSF_RES_LEN_MAX) )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if the response is a SENSF_RES / Polling response */
|
||||
if( sensfBuf->SENSF_RES.CMD != (uint8_t)RFAL_NFCF_CMD_POLLING_RES )
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Check if is an overwrite request or new device*/
|
||||
if(duplicate && overwrite)
|
||||
{
|
||||
/* overwrite deviceInfo/GRE_SENSF_RES with SENSF_RES */
|
||||
outDevInfo[tmpIdx].sensfResLen = (sensfBuf->LEN - RFAL_NFCF_LENGTH_LEN);
|
||||
RFAL_MEMCPY( &outDevInfo[tmpIdx].sensfRes, &sensfBuf->SENSF_RES, outDevInfo[tmpIdx].sensfResLen );
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* fill deviceInfo/GRE_SENSF_RES with new SENSF_RES */
|
||||
outDevInfo[(*curDevIdx)].sensfResLen = (sensfBuf->LEN - RFAL_NFCF_LENGTH_LEN);
|
||||
RFAL_MEMCPY( &outDevInfo[(*curDevIdx)].sensfRes, &sensfBuf->SENSF_RES, outDevInfo[(*curDevIdx)].sensfResLen );
|
||||
}
|
||||
|
||||
/* Check if this device supports NFC-DEP and signal it (ACTIVITY 1.1 9.3.6.63) */
|
||||
*nfcDepFound = rfalNfcfIsNfcDepSupported( &outDevInfo[(*curDevIdx)] );
|
||||
|
||||
(*curDevIdx)++;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerInitialize( rfalBitRate bitRate )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
if( (bitRate != RFAL_BR_212) && (bitRate != RFAL_BR_424) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCF, bitRate, bitRate ) );
|
||||
rfalSetErrorHandling( RFAL_ERRORHANDLING_NONE );
|
||||
|
||||
rfalSetGT( RFAL_GT_NFCF );
|
||||
rfalSetFDTListen( RFAL_FDT_LISTEN_NFCF_POLLER );
|
||||
rfalSetFDTPoll( RFAL_FDT_POLL_NFCF_POLLER );
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerPoll( rfalFeliCaPollSlots slots, uint16_t sysCode, uint8_t reqCode, rfalFeliCaPollRes *cardList, uint8_t *devCnt, uint8_t *collisions )
|
||||
{
|
||||
return rfalFeliCaPoll( slots, sysCode, reqCode, cardList, rfalNfcfSlots2CardNum(slots), devCnt, collisions );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerCheckPresence( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcfPollerStartCheckPresence() );
|
||||
rfalRunBlocking( ret, rfalNfcfPollerGetCheckPresenceStatus() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerStartCheckPresence( void )
|
||||
{
|
||||
gNfcf.CR.greedyF.pollFound = 0;
|
||||
gNfcf.CR.greedyF.pollCollision = 0;
|
||||
|
||||
/* ACTIVITY 1.0 & 1.1 - 9.2.3.17 SENSF_REQ must be with number of slots equal to 4
|
||||
* SC must be 0xFFFF
|
||||
* RC must be 0x00 (No system code info required) */
|
||||
return rfalStartFeliCaPoll( RFAL_FELICA_4_SLOTS, RFAL_NFCF_SYSTEMCODE, RFAL_FELICA_POLL_RC_NO_REQUEST, gNfcf.CR.greedyF.POLL_F, rfalNfcfSlots2CardNum(RFAL_FELICA_4_SLOTS), &gNfcf.CR.greedyF.pollFound, &gNfcf.CR.greedyF.pollCollision );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerGetCheckPresenceStatus( void )
|
||||
{
|
||||
return rfalGetFeliCaPollStatus();
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcfListenDevice *nfcfDevList, uint8_t *devCnt )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalNfcfPollerStartCollisionResolution( compMode, devLimit, nfcfDevList, devCnt ) );
|
||||
rfalRunBlocking( ret, rfalNfcfPollerGetCollisionResolutionStatus() );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerStartCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcfListenDevice *nfcfDevList, uint8_t *devCnt )
|
||||
{
|
||||
if( (nfcfDevList == NULL) || (devCnt == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
*devCnt = 0;
|
||||
|
||||
/*******************************************************************************************/
|
||||
/* ACTIVITY 1.0 - 9.3.6.3 Copy valid SENSF_RES in GRE_POLL_F into GRE_SENSF_RES */
|
||||
/* ACTIVITY 1.0 - 9.3.6.6 The NFC Forum Device MUST remove all entries from GRE_SENSF_RES[]*/
|
||||
/* ACTIVITY 2.1 - 9.3.6.2 Populate GRE_SENSF_RES with data from GRE_POLL_F */
|
||||
/* */
|
||||
/* CON_DEVICES_LIMIT = 0 Just check if devices from Tech Detection exceeds -> always true */
|
||||
/* Allow the number of slots open on Technology Detection */
|
||||
/*******************************************************************************************/
|
||||
rfalNfcfComputeValidSENF( nfcfDevList, devCnt, ((devLimit == 0U) ? rfalNfcfSlots2CardNum( RFAL_FELICA_4_SLOTS ) : devLimit), false, &gNfcf.CR.nfcDepFound );
|
||||
|
||||
/* Store context */
|
||||
gNfcf.CR.nfcfDevList = nfcfDevList;
|
||||
gNfcf.CR.compMode = compMode;
|
||||
gNfcf.CR.devLimit = devLimit;
|
||||
gNfcf.CR.devCnt = devCnt;
|
||||
gNfcf.CR.state = RFAL_NFCF_CR_POLL;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerGetCollisionResolutionStatus( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
switch( gNfcf.CR.state )
|
||||
{
|
||||
/*******************************************************************************/
|
||||
case RFAL_NFCF_CR_POLL:
|
||||
case RFAL_NFCF_CR_POLL_SC:
|
||||
|
||||
|
||||
if( gNfcf.CR.state == RFAL_NFCF_CR_POLL )
|
||||
{
|
||||
/*******************************************************************************/
|
||||
/* Activity 2.1 9.3.6.3 - Symbol 2 Check if devices found are lower than the limit */
|
||||
if( *gNfcf.CR.devCnt >= gNfcf.CR.devLimit )
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Activity 1.0 - 9.3.6.5 Copy valid SENSF_RES and then to remove it */
|
||||
/* Activity 1.1 - 9.3.6.65 Copy and filter duplicates */
|
||||
/* For now, due to some devices keep generating different nfcid2, we use 1.0 */
|
||||
/* Phones detected: Samsung Galaxy Nexus,Samsung Galaxy S3,Samsung Nexus S */
|
||||
/*******************************************************************************/
|
||||
*gNfcf.CR.devCnt = 0;
|
||||
}
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalStartFeliCaPoll( RFAL_FELICA_16_SLOTS,
|
||||
RFAL_NFCF_SYSTEMCODE,
|
||||
(uint8_t)((gNfcf.CR.state == RFAL_NFCF_CR_POLL_SC) ? RFAL_FELICA_POLL_RC_SYSTEM_CODE : RFAL_FELICA_POLL_RC_NO_REQUEST),
|
||||
gNfcf.CR.greedyF.POLL_F,
|
||||
rfalNfcfSlots2CardNum((uint8_t)RFAL_FELICA_16_SLOTS),
|
||||
&gNfcf.CR.greedyF.pollFound,
|
||||
&gNfcf.CR.greedyF.pollCollision ) );
|
||||
|
||||
gNfcf.CR.state = RFAL_NFCF_CR_PARSE;
|
||||
return RFAL_ERR_BUSY;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
case RFAL_NFCF_CR_PARSE:
|
||||
|
||||
RFAL_EXIT_ON_BUSY( ret, rfalGetFeliCaPollStatus() );
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
/* Activity 2.1 9.3.6.5 - Symbol 4 Update device list */
|
||||
rfalNfcfComputeValidSENF( gNfcf.CR.nfcfDevList, gNfcf.CR.devCnt, gNfcf.CR.devLimit, false, &gNfcf.CR.nfcDepFound );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Activity 2.1 9.3.6.6 - Symbol 5 Check if any device supports NFC DEP */
|
||||
if( (gNfcf.CR.nfcDepFound) && (gNfcf.CR.compMode == RFAL_COMPLIANCE_MODE_NFC) )
|
||||
{
|
||||
/* Send another poll request with RC = System Code */
|
||||
gNfcf.CR.state = RFAL_NFCF_CR_POLL_SC;
|
||||
|
||||
/* Set compliance mode to invalid (non NFC) to poll for NFC-DEP devices only once */
|
||||
gNfcf.CR.compMode = RFAL_COMPLIANCE_MODE_EMV;
|
||||
return RFAL_ERR_BUSY;
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
/*******************************************************************************/
|
||||
default:
|
||||
/* MISRA 16.4: no empty default statement (a comment being enough) */
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerCheck( const uint8_t* nfcid2, const rfalNfcfServBlockListParam *servBlock, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rcvdLen )
|
||||
{
|
||||
uint8_t txBuf[RFAL_NFCF_CHECK_REQ_MAX_LEN];
|
||||
uint8_t msgIt;
|
||||
uint8_t i;
|
||||
ReturnCode ret;
|
||||
const uint8_t *checkRes;
|
||||
|
||||
/* Check parameters */
|
||||
if( (nfcid2 == NULL) || (rxBuf == NULL) || (servBlock == NULL) ||
|
||||
(servBlock->numBlock == 0U) || (servBlock->numBlock > RFAL_NFCF_CHECK_REQ_MAX_BLOCK) ||
|
||||
(servBlock->numServ == 0U) || (servBlock->numServ > RFAL_NFCF_CHECK_REQ_MAX_SERV) ||
|
||||
(rxBufLen < (RFAL_NFCF_LENGTH_LEN + RFAL_NFCF_CHECK_RES_MIN_LEN)) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
msgIt = 0;
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Compose CHECK command/request */
|
||||
|
||||
txBuf[msgIt++] = RFAL_NFCF_CMD_READ_WITHOUT_ENCRYPTION; /* Command Code */
|
||||
|
||||
RFAL_MEMCPY( &txBuf[msgIt], nfcid2, RFAL_NFCF_NFCID2_LEN ); /* NFCID2 */
|
||||
msgIt += RFAL_NFCF_NFCID2_LEN;
|
||||
|
||||
txBuf[msgIt++] = servBlock->numServ; /* NoS */
|
||||
for( i = 0; i < servBlock->numServ; i++)
|
||||
{
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->servList[i] >> 0U) & 0xFFU); /* Service Code */
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->servList[i] >> 8U) & 0xFFU);
|
||||
}
|
||||
|
||||
txBuf[msgIt++] = servBlock->numBlock; /* NoB */
|
||||
for( i = 0; i < servBlock->numBlock; i++)
|
||||
{
|
||||
txBuf[msgIt++] = servBlock->blockList[i].conf; /* Block list element conf (Flag|Access|Service) */
|
||||
if( (servBlock->blockList[i].conf & RFAL_NFCF_BLOCKLISTELEM_LEN_BIT) != 0U ) /* Check if 2 or 3 byte block list element */
|
||||
{
|
||||
txBuf[msgIt++] = (uint8_t)(servBlock->blockList[i].blockNum & 0xFFU); /* 1byte Block Num */
|
||||
}
|
||||
else
|
||||
{
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->blockList[i].blockNum >> 0U) & 0xFFU); /* 2byte Block Num */
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->blockList[i].blockNum >> 8U) & 0xFFU);
|
||||
}
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Transceive CHECK command/request */
|
||||
ret = rfalTransceiveBlockingTxRx( txBuf, msgIt, rxBuf, rxBufLen, rcvdLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCF_MRT_CHECK_UPDATE );
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
/* Skip LEN byte */
|
||||
checkRes = &rxBuf[RFAL_NFCF_LENGTH_LEN];
|
||||
|
||||
/* Check NFCID and response length T3T v1.0 5.4.2.3 */
|
||||
if( (RFAL_BYTECMP( nfcid2, &checkRes[RFAL_NFCF_CMD_LEN], RFAL_NFCF_NFCID2_LEN ) != 0) ||
|
||||
(*rcvdLen < (RFAL_NFCF_LENGTH_LEN + RFAL_NFCF_CHECKUPDATE_RES_ST2_POS)) )
|
||||
{
|
||||
ret = RFAL_ERR_PROTO;
|
||||
}
|
||||
/* Check for a valid response */
|
||||
else if( (checkRes[RFAL_NFCF_CMD_POS] != (uint8_t)RFAL_NFCF_CMD_READ_WITHOUT_ENCRYPTION_RES) ||
|
||||
(checkRes[RFAL_NFCF_CHECKUPDATE_RES_ST1_POS] != RFAL_NFCF_STATUS_FLAG_SUCCESS) ||
|
||||
(checkRes[RFAL_NFCF_CHECKUPDATE_RES_ST2_POS] != RFAL_NFCF_STATUS_FLAG_SUCCESS) )
|
||||
{
|
||||
ret = RFAL_ERR_REQUEST;
|
||||
}
|
||||
/* CHECK succesfull, remove header */
|
||||
else
|
||||
{
|
||||
(*rcvdLen) -= (RFAL_NFCF_LENGTH_LEN + RFAL_NFCF_CHECKUPDATE_RES_NOB_POS);
|
||||
|
||||
if( *rcvdLen > 0U )
|
||||
{
|
||||
RFAL_MEMMOVE( rxBuf, &checkRes[RFAL_NFCF_CHECKUPDATE_RES_NOB_POS], (*rcvdLen) );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcfPollerUpdate( const uint8_t* nfcid2, const rfalNfcfServBlockListParam *servBlock, uint8_t *txBuf, uint16_t txBufLen, const uint8_t *blockData, uint8_t *rxBuf, uint16_t rxBufLen )
|
||||
{
|
||||
uint8_t i;
|
||||
uint16_t msgIt;
|
||||
uint16_t rcvdLen;
|
||||
uint16_t auxLen;
|
||||
const uint8_t *updateRes;
|
||||
ReturnCode ret;
|
||||
|
||||
/* Check parameters */
|
||||
if( (nfcid2 == NULL) || (rxBuf == NULL) || (servBlock == NULL) || (txBuf == NULL) ||
|
||||
(servBlock->numBlock == 0U) || (servBlock->numBlock > RFAL_NFCF_UPDATE_REQ_MAX_BLOCK) ||
|
||||
(servBlock->numServ == 0U) || (servBlock->numServ > RFAL_NFCF_UPDATE_REQ_MAX_SERV) ||
|
||||
(rxBufLen < (RFAL_NFCF_LENGTH_LEN + RFAL_NFCF_UPDATE_RES_MIN_LEN)) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Calculate required txBuffer lenth T3T 1.0 Table 9 */
|
||||
auxLen = (uint16_t)( RFAL_NFCF_CMD_LEN + RFAL_NFCF_NFCID2_LEN + RFAL_NFCF_NOS_LEN + ( servBlock->numServ * sizeof(rfalNfcfServ) ) +
|
||||
RFAL_NFCF_NOB_LEN + (uint16_t)((uint16_t)servBlock->numBlock * RFAL_NFCF_BLOCKLISTELEM_MAX_LEN) + (uint16_t)((uint16_t)servBlock->numBlock * RFAL_NFCF_BLOCK_LEN) );
|
||||
|
||||
|
||||
/* Check whether the provided buffer is sufficient for this request */
|
||||
if( txBufLen < auxLen )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
msgIt = 0;
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Compose UPDATE command/request */
|
||||
|
||||
txBuf[msgIt++] = RFAL_NFCF_CMD_WRITE_WITHOUT_ENCRYPTION; /* Command Code */
|
||||
|
||||
RFAL_MEMCPY( &txBuf[msgIt], nfcid2, RFAL_NFCF_NFCID2_LEN ); /* NFCID2 */
|
||||
msgIt += RFAL_NFCF_NFCID2_LEN;
|
||||
|
||||
txBuf[msgIt++] = servBlock->numServ; /* NoS */
|
||||
for( i = 0; i < servBlock->numServ; i++)
|
||||
{
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->servList[i] >> 0U) & 0xFFU); /* Service Code */
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->servList[i] >> 8U) & 0xFFU);
|
||||
}
|
||||
|
||||
txBuf[msgIt++] = servBlock->numBlock; /* NoB */
|
||||
for( i = 0; i < servBlock->numBlock; i++)
|
||||
{
|
||||
txBuf[msgIt++] = servBlock->blockList[i].conf; /* Block list element conf (Flag|Access|Service) */
|
||||
if( (servBlock->blockList[i].conf & RFAL_NFCF_BLOCKLISTELEM_LEN_BIT) != 0U ) /* Check if 2 or 3 byte block list element */
|
||||
{
|
||||
txBuf[msgIt++] = (uint8_t)(servBlock->blockList[i].blockNum & 0xFFU); /* 1byte Block Num */
|
||||
}
|
||||
else
|
||||
{
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->blockList[i].blockNum >> 0U) & 0xFFU); /* 2byte Block Num */
|
||||
txBuf[msgIt++] = (uint8_t)((servBlock->blockList[i].blockNum >> 8U) & 0xFFU);
|
||||
}
|
||||
}
|
||||
|
||||
auxLen = ((uint16_t)servBlock->numBlock * RFAL_NFCF_BLOCK_LEN);
|
||||
RFAL_MEMCPY( &txBuf[msgIt], blockData, auxLen ); /* Block Data */
|
||||
msgIt += auxLen;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Transceive UPDATE command/request */
|
||||
ret = rfalTransceiveBlockingTxRx( txBuf, msgIt, rxBuf, rxBufLen, &rcvdLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCF_MRT_CHECK_UPDATE );
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
/* Skip LEN byte */
|
||||
updateRes = &rxBuf[RFAL_NFCF_LENGTH_LEN];
|
||||
|
||||
/* Check NFCID and response length T3T v1.0 5.5.2.3 */
|
||||
if( (RFAL_BYTECMP( nfcid2, &updateRes[RFAL_NFCF_CMD_LEN], RFAL_NFCF_NFCID2_LEN ) != 0) ||
|
||||
(rcvdLen < (RFAL_NFCF_LENGTH_LEN + RFAL_NFCF_CHECKUPDATE_RES_ST2_POS)) )
|
||||
{
|
||||
ret = RFAL_ERR_PROTO;
|
||||
}
|
||||
/* Check for a valid response */
|
||||
else if( (updateRes[RFAL_NFCF_CMD_POS] != (uint8_t)RFAL_NFCF_CMD_WRITE_WITHOUT_ENCRYPTION_RES) ||
|
||||
(updateRes[RFAL_NFCF_CHECKUPDATE_RES_ST1_POS] != RFAL_NFCF_STATUS_FLAG_SUCCESS) ||
|
||||
(updateRes[RFAL_NFCF_CHECKUPDATE_RES_ST2_POS] != RFAL_NFCF_STATUS_FLAG_SUCCESS) )
|
||||
{
|
||||
ret = RFAL_ERR_REQUEST;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* MISRA 15.7 - Empty else */
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
bool rfalNfcfListenerIsT3TReq( const uint8_t* buf, uint16_t bufLen, uint8_t* nfcid2 )
|
||||
{
|
||||
/* Check cmd byte */
|
||||
switch( *buf )
|
||||
{
|
||||
case RFAL_NFCF_CMD_READ_WITHOUT_ENCRYPTION:
|
||||
if( bufLen < RFAL_NFCF_READ_WO_ENCRYPTION_MIN_LEN )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
case RFAL_NFCF_CMD_WRITE_WITHOUT_ENCRYPTION:
|
||||
if( bufLen < RFAL_NFCF_WRITE_WO_ENCRYPTION_MIN_LEN )
|
||||
{
|
||||
return false;
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
/* Output NFID2 if requested */
|
||||
if( nfcid2 != NULL )
|
||||
{
|
||||
RFAL_MEMCPY( nfcid2, &buf[RFAL_NFCF_CMD_LEN], RFAL_NFCF_NFCID2_LEN );
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_NFCF */
|
||||
@@ -0,0 +1,866 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_nfcv.c
|
||||
* @author MMY Application Team
|
||||
* @brief Implementation of NFC-V Poller (ISO15693) device
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_nfcv.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_NFCV
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_NFCV
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_NFCV_INV_REQ_FLAG 0x06U /*!< INVENTORY_REQ INV_FLAG Digital 2.1 9.6.1 */
|
||||
#define RFAL_NFCV_MASKVAL_MAX_LEN 8U /*!< Mask value max length: 64 bits (UID length) */
|
||||
#define RFAL_NFCV_MASKVAL_MAX_1SLOT_LEN 64U /*!< Mask value max length in 1 Slot mode in bits Digital 2.1 9.6.1.6 */
|
||||
#define RFAL_NFCV_MASKVAL_MAX_16SLOT_LEN 60U /*!< Mask value max length in 16 Slot mode in bits Digital 2.1 9.6.1.6 */
|
||||
#define RFAL_NFCV_MAX_SLOTS 16U /*!< NFC-V max number of Slots */
|
||||
#define RFAL_NFCV_INV_REQ_HEADER_LEN 3U /*!< INVENTORY_REQ header length (INV_FLAG, CMD, MASK_LEN) */
|
||||
#define RFAL_NFCV_INV_RES_LEN 10U /*!< INVENTORY_RES length */
|
||||
#define RFAL_NFCV_WR_MUL_REQ_HEADER_LEN 4U /*!< Write Multiple header length (INV_FLAG, CMD, [UID], BNo, Bno) */
|
||||
|
||||
|
||||
#define RFAL_NFCV_CMD_LEN 1U /*!< Commandbyte length */
|
||||
#define RFAL_NFCV_FLAG_POS 0U /*!< Flag byte position */
|
||||
#define RFAL_NFCV_FLAG_LEN 1U /*!< Flag byte length */
|
||||
#define RFAL_NFCV_PARAM_LEN 1U /*!< CMD specific parameter length (e.g. Extended Get System Info) */
|
||||
#define RFAL_NFCV_DATASTART_POS 1U /*!< Position of start of data */
|
||||
#define RFAL_NFCV_DSFI_LEN 1U /*!< DSFID length */
|
||||
#define RFAL_NFCV_SLPREQ_REQ_FLAG 0x22U /*!< SLPV_REQ request flags Digital 2.0 (Candidate) 9.7.1.1 */
|
||||
#define RFAL_NFCV_RES_FLAG_NOERROR 0x00U /*!< RES_FLAG indicating no error (checked during activation) */
|
||||
|
||||
#define RFAL_NFCV_MAX_COLL_SUPPORTED 16U /*!< Maximum number of collisions supported by the Anticollision loop */
|
||||
|
||||
#define RFAL_NFCV_FDT_MAX1 4394U /*!< Read alike command FWT FDTV,LISTEN,MAX1 Digital 2.0 B.5 */
|
||||
|
||||
/*! Maximum Wait time FDTV,EOF and MAX2 FDTV,LISTEN,MAX2 + Tolerance = 270644 + 512 = 271156 (~20ms) Digital 2.3 B.5*/
|
||||
#define RFAL_NFCV_FDT_MAX 271156U
|
||||
|
||||
/*! Time from special frame to EOF
|
||||
* ISO15693 2009 10.4.2 : <20ms
|
||||
* NFC Forum defines Digital 2.3 9.7.4 : FDTV,EOF = [10 ; 20]ms
|
||||
*/
|
||||
#define RFAL_NFCV_FDT_EOF rfalConvMsTo1fc(16)
|
||||
|
||||
|
||||
|
||||
/*! Time between slots - ISO 15693 defines t3min depending on modulation depth and data rate.
|
||||
* With only high-bitrate supported, AM modulation and a length of 12 bytes (96bits) for INV_RES we get:
|
||||
* - ISO t3min = 96/26 ms + 300us = 4 ms
|
||||
* - NFC Forum defines FDTV,INVENT_NORES = (4394 + 2048)/fc. Digital 2.0 B.5*/
|
||||
#define RFAL_NFCV_FDT_V_INVENT_NORES 4U
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Checks if a valid INVENTORY_RES is valid Digital 2.2 9.6.2.1 & 9.6.2.3 */
|
||||
#define rfalNfcvCheckInvRes( f, l ) (((l)==rfalConvBytesToBits(RFAL_NFCV_INV_RES_LEN + RFAL_NFCV_CRC_LEN)) && ((f)==RFAL_NFCV_RES_FLAG_NOERROR))
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! NFC-V INVENTORY_REQ format Digital 2.0 9.6.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t INV_FLAG; /*!< Inventory Flags */
|
||||
uint8_t CMD; /*!< Command code: 01h */
|
||||
uint8_t MASK_LEN; /*!< Mask Value Length */
|
||||
uint8_t MASK_VALUE[RFAL_NFCV_MASKVAL_MAX_LEN]; /*!< Mask Value */
|
||||
} rfalNfcvInventoryReq;
|
||||
|
||||
|
||||
/*! NFC-V SLP_REQ format Digital 2.0 (Candidate) 9.7.1 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t REQ_FLAG; /*!< Request Flags */
|
||||
uint8_t CMD; /*!< Command code: 02h */
|
||||
uint8_t UID[RFAL_NFCV_UID_LEN]; /*!< Mask Value */
|
||||
} rfalNfcvSlpvReq;
|
||||
|
||||
|
||||
/*! Container for a collision found during Anticollision loop */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t maskLen;
|
||||
uint8_t maskVal[RFAL_NFCV_MASKVAL_MAX_LEN];
|
||||
}rfalNfcvCollision;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
static ReturnCode rfalNfcvParseError( uint8_t err );
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
static ReturnCode rfalNfcvParseError( uint8_t err )
|
||||
{
|
||||
switch(err)
|
||||
{
|
||||
case RFAL_NFCV_ERROR_CMD_NOT_SUPPORTED:
|
||||
case RFAL_NFCV_ERROR_OPTION_NOT_SUPPORTED:
|
||||
return RFAL_ERR_NOTSUPP;
|
||||
|
||||
case RFAL_NFCV_ERROR_CMD_NOT_RECOGNIZED:
|
||||
return RFAL_ERR_PROTO;
|
||||
|
||||
case RFAL_NFCV_ERROR_WRITE_FAILED:
|
||||
return RFAL_ERR_WRITE;
|
||||
|
||||
default:
|
||||
return RFAL_ERR_REQUEST;
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerInitialize( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCV, RFAL_BR_26p48, RFAL_BR_26p48 ) );
|
||||
rfalSetErrorHandling( RFAL_ERRORHANDLING_NONE );
|
||||
|
||||
rfalSetGT( RFAL_GT_NFCV );
|
||||
rfalSetFDTListen( RFAL_FDT_LISTEN_NFCV_POLLER );
|
||||
rfalSetFDTPoll( RFAL_FDT_POLL_NFCV_POLLER );
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerCheckPresence( rfalNfcvInventoryRes *invRes )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
/* INVENTORY_REQ with 1 slot and no Mask Activity 2.0 (Candidate) 9.2.3.32 */
|
||||
ret = rfalNfcvPollerInventory( RFAL_NFCV_NUM_SLOTS_1, 0, NULL, invRes, NULL );
|
||||
|
||||
if( (ret == RFAL_ERR_RF_COLLISION) || (ret == RFAL_ERR_CRC) ||
|
||||
(ret == RFAL_ERR_FRAMING) || (ret == RFAL_ERR_PROTO) )
|
||||
{
|
||||
ret = RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerInventory( rfalNfcvNumSlots nSlots, uint8_t maskLen, const uint8_t *maskVal, rfalNfcvInventoryRes *invRes, uint16_t* rcvdLen )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalNfcvInventoryReq invReq;
|
||||
uint16_t rxLen;
|
||||
|
||||
if( ((maskVal == NULL) && (maskLen != 0U)) || (invRes == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
invReq.INV_FLAG = (RFAL_NFCV_INV_REQ_FLAG | (uint8_t)nSlots);
|
||||
invReq.CMD = RFAL_NFCV_CMD_INVENTORY;
|
||||
invReq.MASK_LEN = (uint8_t)RFAL_MIN( maskLen, ((nSlots == RFAL_NFCV_NUM_SLOTS_1) ? RFAL_NFCV_MASKVAL_MAX_1SLOT_LEN : RFAL_NFCV_MASKVAL_MAX_16SLOT_LEN) ); /* Digital 2.0 9.6.1.6 */
|
||||
|
||||
if( (rfalConvBitsToBytes(invReq.MASK_LEN) > 0U) && (maskVal != NULL) ) /* MISRA 21.18 & 1.3 */
|
||||
{
|
||||
RFAL_MEMCPY( invReq.MASK_VALUE, maskVal, rfalConvBitsToBytes(invReq.MASK_LEN) );
|
||||
}
|
||||
|
||||
ret = rfalISO15693TransceiveAnticollisionFrame( (uint8_t*)&invReq, (uint8_t)(RFAL_NFCV_INV_REQ_HEADER_LEN + rfalConvBitsToBytes(invReq.MASK_LEN)), (uint8_t*)invRes, sizeof(rfalNfcvInventoryRes), &rxLen );
|
||||
|
||||
/* Check for optional output parameter */
|
||||
if( rcvdLen != NULL )
|
||||
{
|
||||
*rcvdLen = rxLen;
|
||||
}
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
/* Check for valid INVENTORY_RES Digital 2.2 9.6.2.1 & 9.6.2.3 */
|
||||
if( !rfalNfcvCheckInvRes( invRes->RES_FLAG, rxLen ) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcvListenDevice *nfcvDevList, uint8_t *devCnt )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint8_t slotNum;
|
||||
uint16_t rcvdLen;
|
||||
uint8_t colIt;
|
||||
uint8_t colCnt;
|
||||
uint8_t colPos;
|
||||
bool colPending;
|
||||
rfalNfcvCollision colFound[RFAL_NFCV_MAX_COLL_SUPPORTED];
|
||||
|
||||
|
||||
if( (nfcvDevList == NULL) || (devCnt == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Initialize parameters */
|
||||
*devCnt = 0;
|
||||
colIt = 0;
|
||||
colCnt = 0;
|
||||
colPending = false;
|
||||
RFAL_MEMSET(colFound, 0x00, (sizeof(rfalNfcvCollision)*RFAL_NFCV_MAX_COLL_SUPPORTED) );
|
||||
|
||||
if( devLimit > 0U ) /* MISRA 21.18 */
|
||||
{
|
||||
RFAL_MEMSET(nfcvDevList, 0x00, (sizeof(rfalNfcvListenDevice)*devLimit) );
|
||||
}
|
||||
|
||||
RFAL_NO_WARNING(colPending); /* colPending is not exposed externally, in future it might become exposed/ouput parameter */
|
||||
|
||||
if( compMode == RFAL_COMPLIANCE_MODE_NFC )
|
||||
{
|
||||
/* Send INVENTORY_REQ with one slot Activity 2.1 9.3.7.1 (Symbol 0) */
|
||||
ret = rfalNfcvPollerInventory( RFAL_NFCV_NUM_SLOTS_1, 0, NULL, &nfcvDevList->InvRes, NULL );
|
||||
|
||||
/* Exit if no device found Activity 2.1 9.3.7.2 (Symbol 1) */
|
||||
/* Exit if no correct frame (no Transmission Error) Activity 2.1 9.3.7.3 (Symbol 2) */
|
||||
if( (ret == RFAL_ERR_TIMEOUT) || ((ret == RFAL_ERR_PROTO)) )
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Valid Response found without transmission error/collision Activity 2.1 9.3.7.6 (Symbol 5) */
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
(*devCnt)++;
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/* A Collision has been identified Activity 2.1 9.3.7.4 (Symbol 3) */
|
||||
colPending = true;
|
||||
colCnt = 1;
|
||||
|
||||
/* Check if the Collision Resolution is set to perform only Collision detection Activity 2.1 9.3.7.5 (Symbol 4)*/
|
||||
if( devLimit == 0U )
|
||||
{
|
||||
return RFAL_ERR_RF_COLLISION;
|
||||
}
|
||||
|
||||
platformDelay(RFAL_NFCV_FDT_V_INVENT_NORES);
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Collisions pending, Anticollision loop must be executed */
|
||||
/*******************************************************************************/
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Advance to 16 slots below without mask. Will give a good chance to identify multiple cards */
|
||||
colPending = true;
|
||||
colCnt = 1;
|
||||
}
|
||||
|
||||
|
||||
/* Execute until all collisions are resolved Activity 2.1 9.3.7.18 (Symbol 17) */
|
||||
do
|
||||
{
|
||||
/* Activity 2.1 9.3.7.7 (Symbol 6 / 7) */
|
||||
colPending = false;
|
||||
slotNum = 0;
|
||||
|
||||
do
|
||||
{
|
||||
if( slotNum == 0U )
|
||||
{
|
||||
/* Send INVENTORY_REQ with 16 slots Activity 2.1 9.3.7.9 (Symbol 8) */
|
||||
ret = rfalNfcvPollerInventory( RFAL_NFCV_NUM_SLOTS_16, colFound[colIt].maskLen, colFound[colIt].maskVal, &nfcvDevList[(*devCnt)].InvRes, &rcvdLen );
|
||||
}
|
||||
else
|
||||
{
|
||||
ret = rfalISO15693TransceiveEOFAnticollision( (uint8_t*)&nfcvDevList[(*devCnt)].InvRes, sizeof(rfalNfcvInventoryRes), &rcvdLen );
|
||||
}
|
||||
slotNum++;
|
||||
|
||||
/*******************************************************************************/
|
||||
if( ret != RFAL_ERR_TIMEOUT )
|
||||
{
|
||||
if( rcvdLen < rfalConvBytesToBits(RFAL_NFCV_INV_RES_LEN + RFAL_NFCV_CRC_LEN) )
|
||||
{ /* If only a partial frame was received make sure the FDT_V_INVENT_NORES is fulfilled */
|
||||
platformDelay(RFAL_NFCV_FDT_V_INVENT_NORES);
|
||||
}
|
||||
|
||||
/* Check if response is a correct frame (no TxRx error) Activity 2.1 9.3.7.11 (Symbol 10)*/
|
||||
if( (ret == RFAL_ERR_NONE) || (ret == RFAL_ERR_PROTO) )
|
||||
{
|
||||
/* Check if the device found is already on the list and its response is a valid INVENTORY_RES */
|
||||
if( rfalNfcvCheckInvRes( nfcvDevList[(*devCnt)].InvRes.RES_FLAG, rcvdLen ) )
|
||||
{
|
||||
/* Activity 2.1 9.3.7.12 (Symbol 11) */
|
||||
(*devCnt)++;
|
||||
}
|
||||
}
|
||||
else /* Treat everything else as collision */
|
||||
{
|
||||
/* Activity 2.1 9.3.7.17 (Symbol 16) */
|
||||
colPending = true;
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Ensure that this collision still fits on the container */
|
||||
if( colCnt < RFAL_NFCV_MAX_COLL_SUPPORTED )
|
||||
{
|
||||
/* Store this collision on the container to be resolved later */
|
||||
/* Activity 2.1 9.3.7.17 (Symbol 16): add the collision information
|
||||
* (MASK_VAL + SN) to the list containing the collision information */
|
||||
RFAL_MEMCPY(colFound[colCnt].maskVal, colFound[colIt].maskVal, RFAL_NFCV_UID_LEN);
|
||||
colPos = colFound[colIt].maskLen;
|
||||
colFound[colCnt].maskVal[(colPos/RFAL_BITS_IN_BYTE)] &= (uint8_t)((1U << (colPos % RFAL_BITS_IN_BYTE)) - 1U);
|
||||
colFound[colCnt].maskVal[(colPos/RFAL_BITS_IN_BYTE)] |= (uint8_t)((slotNum-1U) << (colPos % RFAL_BITS_IN_BYTE));
|
||||
colFound[colCnt].maskVal[((colPos/RFAL_BITS_IN_BYTE)+1U)] = (uint8_t)((slotNum-1U) >> (RFAL_BITS_IN_BYTE - (colPos % RFAL_BITS_IN_BYTE)));
|
||||
|
||||
colFound[colCnt].maskLen = (colFound[colIt].maskLen + 4U);
|
||||
|
||||
colCnt++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Timeout */
|
||||
platformDelay(RFAL_NFCV_FDT_V_INVENT_NORES);
|
||||
}
|
||||
|
||||
/* Check if devices found have reached device limit Activity 2.1 9.3.7.13 (Symbol 12) */
|
||||
if( *devCnt >= devLimit )
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
} while( slotNum < RFAL_NFCV_MAX_SLOTS ); /* Slot loop */
|
||||
colIt++;
|
||||
} while( colIt < colCnt ); /* Collisions found loop */
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerSleepCollisionResolution( uint8_t devLimit, rfalNfcvListenDevice *nfcvDevList, uint8_t *devCnt )
|
||||
{
|
||||
uint8_t tmpDevCnt;
|
||||
ReturnCode ret;
|
||||
uint8_t i;
|
||||
|
||||
if( (nfcvDevList == NULL) || (devCnt == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
*devCnt = 0;
|
||||
|
||||
do
|
||||
{
|
||||
tmpDevCnt = 0;
|
||||
ret = rfalNfcvPollerCollisionResolution( RFAL_COMPLIANCE_MODE_ISO, (devLimit - *devCnt), &nfcvDevList[*devCnt], &tmpDevCnt );
|
||||
|
||||
for( i = *devCnt; i < (*devCnt + tmpDevCnt); i++ )
|
||||
{
|
||||
rfalNfcvPollerSleep( 0x00, nfcvDevList[i].InvRes.UID );
|
||||
nfcvDevList[i].isSleep = true;
|
||||
}
|
||||
*devCnt += tmpDevCnt;
|
||||
}
|
||||
while( (ret == RFAL_ERR_NONE) && (tmpDevCnt > 0U) && (*devCnt < devLimit) );
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerSleep( uint8_t flags, const uint8_t* uid )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalNfcvSlpvReq slpReq;
|
||||
uint8_t rxBuf; /* dummy buffer, just to perform Rx */
|
||||
|
||||
if( uid == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Compute SLPV_REQ */
|
||||
slpReq.REQ_FLAG = (flags | (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS); /* Should be with UID according Digital 2.0 (Candidate) 9.7.1.1 */
|
||||
slpReq.CMD = RFAL_NFCV_CMD_SLPV;
|
||||
RFAL_MEMCPY( slpReq.UID, uid, RFAL_NFCV_UID_LEN );
|
||||
|
||||
/* NFC Forum device SHALL wait at least FDTVpp to consider the SLPV acknowledged (FDTVpp = FDTVpoll) Digital 2.0 (Candidate) 9.7 9.8.2 */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&slpReq, sizeof(rfalNfcvSlpvReq), &rxBuf, sizeof(rxBuf), NULL, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCV_FDT_MAX1 );
|
||||
if( ret != RFAL_ERR_TIMEOUT )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerSelect( uint8_t flags, const uint8_t* uid )
|
||||
{
|
||||
uint16_t rcvLen;
|
||||
rfalNfcvGenericRes res;
|
||||
|
||||
if( uid == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_SELECT, flags, RFAL_NFCV_PARAM_SKIP, uid, NULL, 0U, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerReadSingleBlock( 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_READ_SINGLE_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, &bn, sizeof(uint8_t), rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerWriteSingleBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum, const uint8_t* wrData, uint8_t blockLen )
|
||||
{
|
||||
uint8_t data[(RFAL_NFCV_BLOCKNUM_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 RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
dataLen = 0U;
|
||||
|
||||
/* Compute Request Data */
|
||||
data[dataLen++] = blockNum; /* Set Block Number (8 bits) */
|
||||
RFAL_MEMCPY( &data[dataLen], wrData, blockLen ); /* Append Block data to write */
|
||||
dataLen += blockLen;
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_WRITE_SINGLE_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerLockBlock( uint8_t flags, const uint8_t* uid, uint8_t blockNum )
|
||||
{
|
||||
uint16_t rcvLen;
|
||||
rfalNfcvGenericRes res;
|
||||
uint8_t bn;
|
||||
|
||||
bn = blockNum;
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_LOCK_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, &bn, sizeof(uint8_t), (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerReadMultipleBlocks( 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_READ_MULTIPLE_BLOCKS, flags, RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
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 )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rcvLen;
|
||||
uint16_t reqLen;
|
||||
rfalNfcvGenericRes res;
|
||||
uint16_t msgIt;
|
||||
|
||||
/* Calculate required buffer length */
|
||||
reqLen = (uint16_t)((uid != NULL) ? (RFAL_NFCV_WR_MUL_REQ_HEADER_LEN + RFAL_NFCV_UID_LEN + wrDataLen) : (RFAL_NFCV_WR_MUL_REQ_HEADER_LEN + wrDataLen));
|
||||
|
||||
if( (reqLen > txBufLen) || (blockLen > (uint8_t)RFAL_NFCV_MAX_BLOCK_LEN) || ((((uint16_t)numOfBlocks) * (uint16_t)blockLen) != wrDataLen) || (numOfBlocks == 0U) || (wrData == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
msgIt = 0;
|
||||
|
||||
/* Compute Request Command */
|
||||
txBuf[msgIt++] = (uint8_t)(flags & (~((uint32_t)RFAL_NFCV_REQ_FLAG_ADDRESS)));
|
||||
txBuf[msgIt++] = RFAL_NFCV_CMD_WRITE_MULTIPLE_BLOCKS;
|
||||
|
||||
/* Check if Request is to be sent in Addressed mode. Select mode flag shall be set by user */
|
||||
if( uid != NULL )
|
||||
{
|
||||
txBuf[RFAL_NFCV_FLAG_POS] |= (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS;
|
||||
RFAL_MEMCPY( &txBuf[msgIt], uid, RFAL_NFCV_UID_LEN );
|
||||
msgIt += (uint8_t)RFAL_NFCV_UID_LEN;
|
||||
}
|
||||
|
||||
txBuf[msgIt++] = firstBlockNum;
|
||||
txBuf[msgIt++] = (numOfBlocks - 1U);
|
||||
|
||||
if( wrDataLen > 0U ) /* MISRA 21.18 */
|
||||
{
|
||||
RFAL_MEMCPY( &txBuf[msgIt], wrData, wrDataLen );
|
||||
msgIt += wrDataLen;
|
||||
}
|
||||
|
||||
/* Transceive Command */
|
||||
ret = rfalTransceiveBlockingTxRx( txBuf, msgIt, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCV_FDT_MAX );
|
||||
|
||||
if( ret != RFAL_ERR_NONE )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check if the response minimum length has been received */
|
||||
if( rcvLen < (uint8_t)RFAL_NFCV_FLAG_LEN )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Check if an error has been signalled */
|
||||
if( (res.RES_FLAG & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U )
|
||||
{
|
||||
return rfalNfcvParseError( *res.data );
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerExtendedReadSingleBlock( 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_EXTENDED_READ_SINGLE_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerExtendedWriteSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum, const uint8_t* wrData, uint8_t blockLen )
|
||||
{
|
||||
uint8_t data[(RFAL_NFCV_BLOCKNUM_EXTENDED_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) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
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);
|
||||
RFAL_MEMCPY( &data[dataLen], wrData, blockLen ); /* Append Block data to write */
|
||||
dataLen += blockLen;
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_EXTENDED_WRITE_SINGLE_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerExtendedLockSingleBlock( uint8_t flags, const uint8_t* uid, uint16_t blockNum )
|
||||
{
|
||||
uint8_t data[RFAL_NFCV_BLOCKNUM_EXTENDED_LEN];
|
||||
uint8_t dataLen;
|
||||
uint16_t rcvLen;
|
||||
rfalNfcvGenericRes res;
|
||||
|
||||
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_EXTENDED_LOCK_SINGLE_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerExtendedReadMultipleBlocks( 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_EXTENDED_READ_MULTIPLE_BLOCK, flags, RFAL_NFCV_PARAM_SKIP, uid, data, dataLen, rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
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 )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rcvLen;
|
||||
uint16_t reqLen;
|
||||
rfalNfcvGenericRes res;
|
||||
uint16_t msgIt;
|
||||
uint16_t nBlocks;
|
||||
|
||||
/* Calculate required buffer length */
|
||||
reqLen = ((uid != NULL) ? (RFAL_NFCV_WR_MUL_REQ_HEADER_LEN + RFAL_NFCV_UID_LEN + wrDataLen) : (RFAL_NFCV_WR_MUL_REQ_HEADER_LEN + wrDataLen) );
|
||||
|
||||
if( (reqLen > txBufLen) || (blockLen > (uint8_t)RFAL_NFCV_MAX_BLOCK_LEN) || (( (uint16_t)numOfBlocks * (uint16_t)blockLen) != wrDataLen) || (numOfBlocks == 0U) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
msgIt = 0;
|
||||
nBlocks = (numOfBlocks - 1U);
|
||||
|
||||
/* Compute Request Command */
|
||||
txBuf[msgIt++] = (uint8_t)(flags & (~((uint32_t)RFAL_NFCV_REQ_FLAG_ADDRESS)));
|
||||
txBuf[msgIt++] = RFAL_NFCV_CMD_EXTENDED_WRITE_MULTIPLE_BLOCK;
|
||||
|
||||
/* Check if Request is to be sent in Addressed mode. Select mode flag shall be set by user */
|
||||
if( uid != NULL )
|
||||
{
|
||||
txBuf[RFAL_NFCV_FLAG_POS] |= (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS;
|
||||
RFAL_MEMCPY( &txBuf[msgIt], uid, RFAL_NFCV_UID_LEN );
|
||||
msgIt += (uint8_t)RFAL_NFCV_UID_LEN;
|
||||
}
|
||||
|
||||
txBuf[msgIt++] = (uint8_t)((firstBlockNum >> 0) & 0xFFU);
|
||||
txBuf[msgIt++] = (uint8_t)((firstBlockNum >> 8) & 0xFFU);
|
||||
txBuf[msgIt++] = (uint8_t)((nBlocks >> 0) & 0xFFU);
|
||||
txBuf[msgIt++] = (uint8_t)((nBlocks >> 8) & 0xFFU);
|
||||
|
||||
if( wrDataLen > 0U ) /* MISRA 21.18 */
|
||||
{
|
||||
RFAL_MEMCPY( &txBuf[msgIt], wrData, wrDataLen );
|
||||
msgIt += wrDataLen;
|
||||
}
|
||||
|
||||
/* Transceive Command */
|
||||
ret = rfalTransceiveBlockingTxRx( txBuf, msgIt, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCV_FDT_MAX );
|
||||
|
||||
if( ret != RFAL_ERR_NONE )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check if the response minimum length has been received */
|
||||
if( rcvLen < (uint8_t)RFAL_NFCV_FLAG_LEN )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Check if an error has been signalled */
|
||||
if( (res.RES_FLAG & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U )
|
||||
{
|
||||
return rfalNfcvParseError( *res.data );
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerGetSystemInformation( uint8_t flags, const uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
|
||||
{
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_GET_SYS_INFO, flags, RFAL_NFCV_PARAM_SKIP, uid, NULL, 0U, rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalNfcvPollerExtendedGetSystemInformation( uint8_t flags, const uint8_t* uid, uint8_t requestField, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
|
||||
{
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_EXTENDED_GET_SYS_INFO, flags, requestField, uid, NULL, 0U, rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
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 )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalNfcvGenericReq req;
|
||||
uint8_t msgIt;
|
||||
rfalBitRate rxBR;
|
||||
bool fastMode;
|
||||
bool specialFrame;
|
||||
|
||||
msgIt = 0;
|
||||
fastMode = false;
|
||||
specialFrame = false;
|
||||
|
||||
/* Check for valid parameters */
|
||||
if( (rxBuf == NULL) || (rcvLen == NULL) || ((dataLen > 0U) && (data == NULL)) ||
|
||||
(dataLen > ((uid != NULL) ? RFAL_NFCV_MAX_GEN_DATA_LEN : (RFAL_NFCV_MAX_GEN_DATA_LEN - RFAL_NFCV_UID_LEN - RFAL_NFCV_PARAM_LEN))) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
|
||||
/* Check if the command is an ST's Fast command */
|
||||
if( (param == RFAL_NFCV_ST_IC_MFG_CODE) &&
|
||||
((cmd == (uint8_t)RFAL_NFCV_CMD_FAST_READ_SINGLE_BLOCK) || (cmd == (uint8_t)RFAL_NFCV_CMD_FAST_EXTENDED_READ_SINGLE_BLOCK) ||
|
||||
(cmd == (uint8_t)RFAL_NFCV_CMD_FAST_READ_MULTIPLE_BLOCKS) || (cmd == (uint8_t)RFAL_NFCV_CMD_FAST_EXTENDED_READ_MULTIPLE_BLOCKS) ||
|
||||
(cmd == (uint8_t)RFAL_NFCV_CMD_FAST_WRITE_MESSAGE) || (cmd == (uint8_t)RFAL_NFCV_CMD_FAST_READ_MESSAGE_LENGTH) ||
|
||||
(cmd == (uint8_t)RFAL_NFCV_CMD_FAST_READ_MESSAGE) || (cmd == (uint8_t)RFAL_NFCV_CMD_FAST_READ_DYN_CONFIGURATION) ||
|
||||
(cmd == (uint8_t)RFAL_NFCV_CMD_FAST_WRITE_DYN_CONFIGURATION)) )
|
||||
{
|
||||
/* 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 */
|
||||
req.REQ_FLAG = (uint8_t)(flags & (~((uint32_t)RFAL_NFCV_REQ_FLAG_ADDRESS)));
|
||||
req.CMD = cmd;
|
||||
|
||||
/* Prepend parameter on certain proprietary requests: IC Manuf, Parameters */
|
||||
if( param != RFAL_NFCV_PARAM_SKIP )
|
||||
{
|
||||
req.payload.data[msgIt++] = param; /* RFAL_NFCV_PARAM_LEN */
|
||||
}
|
||||
|
||||
/* Check if Request is to be sent in Addressed mode. Select mode flag shall be set by user */
|
||||
if( uid != NULL )
|
||||
{
|
||||
req.REQ_FLAG |= (uint8_t)RFAL_NFCV_REQ_FLAG_ADDRESS;
|
||||
RFAL_MEMCPY( &req.payload.data[msgIt], uid, RFAL_NFCV_UID_LEN );
|
||||
msgIt += RFAL_NFCV_UID_LEN;
|
||||
}
|
||||
|
||||
if( dataLen > 0U )
|
||||
{
|
||||
RFAL_MEMCPY( &req.payload.data[msgIt], data, dataLen );
|
||||
msgIt += (uint8_t)dataLen;
|
||||
}
|
||||
|
||||
|
||||
/* If the Option Flag | Special Frame is set in certain commands an EOF needs to be sent whithin FDTV,EOF to retrieve the VICC response Digital 2.3 9.7.4 ISO15693-3 2009 10.4.2 & 10.4.3 & 10.4.5 */
|
||||
if( ((flags & (uint8_t)RFAL_NFCV_REQ_FLAG_OPTION) != 0U) && ((cmd == (uint8_t)RFAL_NFCV_CMD_WRITE_SINGLE_BLOCK) || (cmd == (uint8_t)RFAL_NFCV_CMD_WRITE_MULTIPLE_BLOCKS) ||
|
||||
(cmd == (uint8_t)RFAL_NFCV_CMD_LOCK_BLOCK) || (cmd == (uint8_t)RFAL_NFCV_CMD_EXTENDED_WRITE_SINGLE_BLOCK) ||
|
||||
(cmd == (uint8_t)RFAL_NFCV_CMD_EXTENDED_LOCK_SINGLE_BLOCK) || (cmd == (uint8_t)RFAL_NFCV_CMD_EXTENDED_WRITE_MULTIPLE_BLOCK)) )
|
||||
{
|
||||
specialFrame = true;
|
||||
}
|
||||
|
||||
|
||||
/* Transceive Command */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, (RFAL_NFCV_CMD_LEN + RFAL_NFCV_FLAG_LEN +(uint16_t)msgIt), rxBuf, rxBufLen, rcvLen, RFAL_TXRX_FLAGS_DEFAULT, (specialFrame ? RFAL_NFCV_FDT_EOF : RFAL_NFCV_FDT_MAX) );
|
||||
|
||||
/* If the Option Flag | Special Frame is set in certain commands an EOF needs to be sent whithin FDTV,EOF to retrieve the VICC response Digital 2.3 9.7.4 ISO15693-3 2009 10.4.2 & 10.4.3 & 10.4.5 */
|
||||
if( specialFrame )
|
||||
{
|
||||
ret = rfalISO15693TransceiveEOF( rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/* Restore Rx BitRate */
|
||||
if( fastMode )
|
||||
{
|
||||
rfalSetBitRate( RFAL_BR_KEEP, rxBR );
|
||||
}
|
||||
|
||||
if( ret != RFAL_ERR_NONE )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check if the response minimum length has been received */
|
||||
if( (*rcvLen) < (uint8_t)RFAL_NFCV_FLAG_LEN )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Check if an error has been signalled */
|
||||
if( (rxBuf[RFAL_NFCV_FLAG_POS] & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U )
|
||||
{
|
||||
return rfalNfcvParseError( rxBuf[RFAL_NFCV_DATASTART_POS] );
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_NFCV */
|
||||
@@ -0,0 +1,547 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_st25tb.c
|
||||
* @author MMY Application Team
|
||||
* @brief Implementation of ST25TB interface
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_st25tb.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_ST25TB
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_ST25TB
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_ST25TB_CMD_LEN 1U /*!< ST25TB length of a command */
|
||||
#define RFAL_ST25TB_SLOTS 16U /*!< ST25TB number of slots */
|
||||
#define RFAL_ST25TB_SLOTNUM_MASK 0x0FU /*!< ST25TB Slot Number bit mask on SlotMarker */
|
||||
#define RFAL_ST25TB_SLOTNUM_SHIFT 4U /*!< ST25TB Slot Number shift on SlotMarker */
|
||||
|
||||
#define RFAL_ST25TB_INITIATE_CMD1 0x06U /*!< ST25TB Initiate command byte1 */
|
||||
#define RFAL_ST25TB_INITIATE_CMD2 0x00U /*!< ST25TB Initiate command byte2 */
|
||||
#define RFAL_ST25TB_PCALL_CMD1 0x06U /*!< ST25TB Pcall16 command byte1 */
|
||||
#define RFAL_ST25TB_PCALL_CMD2 0x04U /*!< ST25TB Pcall16 command byte2 */
|
||||
#define RFAL_ST25TB_SELECT_CMD 0x0EU /*!< ST25TB Select command */
|
||||
#define RFAL_ST25TB_GET_UID_CMD 0x0BU /*!< ST25TB Get UID command */
|
||||
#define RFAL_ST25TB_COMPLETION_CMD 0x0FU /*!< ST25TB Completion command */
|
||||
#define RFAL_ST25TB_RESET_INV_CMD 0x0CU /*!< ST25TB Reset to Inventory command */
|
||||
#define RFAL_ST25TB_READ_BLOCK_CMD 0x08U /*!< ST25TB Read Block command */
|
||||
#define RFAL_ST25TB_WRITE_BLOCK_CMD 0x09U /*!< ST25TB Write Block command */
|
||||
|
||||
|
||||
#define RFAL_ST25TB_T0 2157U /*!< ST25TB t0 159 us ST25TB RF characteristics */
|
||||
#define RFAL_ST25TB_T1 2048U /*!< ST25TB t1 151 us ST25TB RF characteristics */
|
||||
|
||||
#define RFAL_ST25TB_FWT (RFAL_ST25TB_T0 + RFAL_ST25TB_T1) /*!< ST25TB FWT = T0 + T1 */
|
||||
#define RFAL_ST25TB_TW rfalConvMsTo1fc(7U) /*!< ST25TB TW : Programming time for write max 7ms */
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! Initiate Request */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd1; /*!< Initiate Request cmd1: 0x06 */
|
||||
uint8_t cmd2; /*!< Initiate Request cmd2: 0x00 */
|
||||
} rfalSt25tbInitiateReq;
|
||||
|
||||
/*! Pcall16 Request */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd1; /*!< Pcal16 Request cmd1: 0x06 */
|
||||
uint8_t cmd2; /*!< Pcal16 Request cmd2: 0x04 */
|
||||
} rfalSt25tbPcallReq;
|
||||
|
||||
|
||||
/*! Select Request */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< Select Request cmd: 0x0E */
|
||||
uint8_t chipId; /*!< Chip ID */
|
||||
} rfalSt25tbSelectReq;
|
||||
|
||||
/*! Read Block Request */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< Select Request cmd: 0x08 */
|
||||
uint8_t address; /*!< Block address */
|
||||
} rfalSt25tbReadBlockReq;
|
||||
|
||||
/*! Write Block Request */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< Select Request cmd: 0x09 */
|
||||
uint8_t address; /*!< Block address */
|
||||
rfalSt25tbBlock data; /*!< Block Data */
|
||||
} rfalSt25tbWriteBlockReq;
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
/*!
|
||||
*****************************************************************************
|
||||
* \brief ST25TB Poller Do Collision Resolution
|
||||
*
|
||||
* This method performs ST25TB Collision resolution loop for each slot
|
||||
*
|
||||
* \param[in] devLimit : device limit value, and size st25tbDevList
|
||||
* \param[out] st25tbDevList : ST35TB listener device info
|
||||
* \param[out] devCnt : Devices found counter
|
||||
*
|
||||
* \return colPending : true if a collision was detected
|
||||
*****************************************************************************
|
||||
*/
|
||||
static bool rfalSt25tbPollerDoCollisionResolution( uint8_t devLimit, rfalSt25tbListenDevice *st25tbDevList, uint8_t *devCnt );
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
static bool rfalSt25tbPollerDoCollisionResolution( uint8_t devLimit, rfalSt25tbListenDevice *st25tbDevList, uint8_t *devCnt )
|
||||
{
|
||||
uint8_t i;
|
||||
uint8_t chipId;
|
||||
ReturnCode ret;
|
||||
bool col;
|
||||
|
||||
col = false;
|
||||
|
||||
for(i = 0; i < RFAL_ST25TB_SLOTS; i++)
|
||||
{
|
||||
platformDelay(1); /* Wait t2: Answer to new request delay */
|
||||
|
||||
if( i==0U )
|
||||
{
|
||||
/* Step 2: Send Pcall16 */
|
||||
ret = rfalSt25tbPollerPcall( &chipId );
|
||||
}
|
||||
else
|
||||
{
|
||||
/* Step 3-17: Send Pcall16 */
|
||||
ret = rfalSt25tbPollerSlotMarker( i, &chipId );
|
||||
}
|
||||
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
/* Found another device */
|
||||
st25tbDevList[*devCnt].chipID = chipId;
|
||||
st25tbDevList[*devCnt].isDeselected = false;
|
||||
|
||||
/* Select Device, retrieve its UID */
|
||||
ret = rfalSt25tbPollerSelect( chipId );
|
||||
|
||||
/* By Selecting this device, the previous gets Deselected */
|
||||
if( (*devCnt) > 0U )
|
||||
{
|
||||
st25tbDevList[(*devCnt)-1U].isDeselected = true;
|
||||
}
|
||||
|
||||
if( RFAL_ERR_NONE == ret )
|
||||
{
|
||||
ret = rfalSt25tbPollerGetUID( &st25tbDevList[*devCnt].UID );
|
||||
}
|
||||
|
||||
if( RFAL_ERR_NONE == ret )
|
||||
{
|
||||
(*devCnt)++;
|
||||
}
|
||||
}
|
||||
else if( (ret == RFAL_ERR_CRC) || (ret == RFAL_ERR_FRAMING) )
|
||||
{
|
||||
col = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
/* MISRA 15.7 - Empty else */
|
||||
}
|
||||
|
||||
if( *devCnt >= devLimit )
|
||||
{
|
||||
break;
|
||||
}
|
||||
}
|
||||
return col;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerInitialize( void )
|
||||
{
|
||||
return rfalNfcbPollerInitialize();
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerCheckPresence( uint8_t *chipId )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint8_t chipIdRes;
|
||||
|
||||
chipIdRes = 0x00;
|
||||
|
||||
/* Send Initiate Request */
|
||||
ret = rfalSt25tbPollerInitiate( &chipIdRes );
|
||||
|
||||
/* Check if a transmission error was detected */
|
||||
if( (ret == RFAL_ERR_CRC) || (ret == RFAL_ERR_FRAMING) )
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
/* Copy chip ID if requested */
|
||||
if( chipId != NULL )
|
||||
{
|
||||
*chipId = chipIdRes;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerInitiate( uint8_t *chipId )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
rfalSt25tbInitiateReq initiateReq;
|
||||
uint8_t rxBuf[RFAL_ST25TB_CHIP_ID_LEN + RFAL_ST25TB_CRC_LEN]; /* In case we receive less data that CRC, RF layer will not remove the CRC from buffer */
|
||||
|
||||
/* Compute Initiate Request */
|
||||
initiateReq.cmd1 = RFAL_ST25TB_INITIATE_CMD1;
|
||||
initiateReq.cmd2 = RFAL_ST25TB_INITIATE_CMD2;
|
||||
|
||||
/* Send Initiate Request */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&initiateReq, sizeof(rfalSt25tbInitiateReq), (uint8_t*)rxBuf, sizeof(rxBuf), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
|
||||
/* Check for valid Select Response */
|
||||
if( (ret == RFAL_ERR_NONE) && (rxLen != RFAL_ST25TB_CHIP_ID_LEN) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Copy chip ID if requested */
|
||||
if( chipId != NULL )
|
||||
{
|
||||
*chipId = *rxBuf;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerPcall( uint8_t *chipId )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
rfalSt25tbPcallReq pcallReq;
|
||||
|
||||
/* Compute Pcal16 Request */
|
||||
pcallReq.cmd1 = RFAL_ST25TB_PCALL_CMD1;
|
||||
pcallReq.cmd2 = RFAL_ST25TB_PCALL_CMD2;
|
||||
|
||||
/* Send Pcal16 Request */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&pcallReq, sizeof(rfalSt25tbPcallReq), (uint8_t*)chipId, RFAL_ST25TB_CHIP_ID_LEN, &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
|
||||
/* Check for valid Select Response */
|
||||
if( (ret == RFAL_ERR_NONE) && (rxLen != RFAL_ST25TB_CHIP_ID_LEN) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerSlotMarker( uint8_t slotNum, uint8_t *chipIdRes )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
uint8_t slotMarker;
|
||||
|
||||
if( (slotNum == 0U) || (slotNum > 15U) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Compute SlotMarker */
|
||||
slotMarker = ( ((slotNum & RFAL_ST25TB_SLOTNUM_MASK) << RFAL_ST25TB_SLOTNUM_SHIFT) | RFAL_ST25TB_PCALL_CMD1 );
|
||||
|
||||
|
||||
/* Send SlotMarker */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&slotMarker, RFAL_ST25TB_CMD_LEN, (uint8_t*)chipIdRes, RFAL_ST25TB_CHIP_ID_LEN, &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
|
||||
/* Check for valid ChipID Response */
|
||||
if( (ret == RFAL_ERR_NONE) && (rxLen != RFAL_ST25TB_CHIP_ID_LEN) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerSelect( uint8_t chipId )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
rfalSt25tbSelectReq selectReq;
|
||||
uint8_t chipIdRes;
|
||||
|
||||
/* Compute Select Request */
|
||||
selectReq.cmd = RFAL_ST25TB_SELECT_CMD;
|
||||
selectReq.chipId = chipId;
|
||||
|
||||
/* Send Select Request */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&selectReq, sizeof(rfalSt25tbSelectReq), (uint8_t*)&chipIdRes, RFAL_ST25TB_CHIP_ID_LEN, &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
|
||||
/* Check for valid Select Response */
|
||||
if( (ret == RFAL_ERR_NONE) && ((rxLen != RFAL_ST25TB_CHIP_ID_LEN) || (chipIdRes != chipId)) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerGetUID( rfalSt25tbUID *UID )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
uint8_t getUidReq;
|
||||
|
||||
|
||||
/* Compute Get UID Request */
|
||||
getUidReq = RFAL_ST25TB_GET_UID_CMD;
|
||||
|
||||
/* Send Select Request */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&getUidReq, RFAL_ST25TB_CMD_LEN, (uint8_t*)UID, sizeof(rfalSt25tbUID), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
|
||||
/* Check for valid UID Response */
|
||||
if( (ret == RFAL_ERR_NONE) && (rxLen != RFAL_ST25TB_UID_LEN) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerCollisionResolution( uint8_t devLimit, rfalSt25tbListenDevice *st25tbDevList, uint8_t *devCnt )
|
||||
{
|
||||
|
||||
uint8_t chipId;
|
||||
ReturnCode ret;
|
||||
bool detected; /* collision or device was detected */
|
||||
|
||||
if( (st25tbDevList == NULL) || (devCnt == NULL) || (devLimit == 0U) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
*devCnt = 0;
|
||||
|
||||
/* Step 1: Send Initiate */
|
||||
ret = rfalSt25tbPollerInitiate( &chipId );
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
/* If only 1 answer is detected */
|
||||
st25tbDevList[*devCnt].chipID = chipId;
|
||||
st25tbDevList[*devCnt].isDeselected = false;
|
||||
|
||||
/* Retrieve its UID and keep it Selected*/
|
||||
ret = rfalSt25tbPollerSelect( chipId );
|
||||
|
||||
if( RFAL_ERR_NONE == ret )
|
||||
{
|
||||
ret = rfalSt25tbPollerGetUID( &st25tbDevList[*devCnt].UID );
|
||||
}
|
||||
|
||||
if( RFAL_ERR_NONE == ret )
|
||||
{
|
||||
(*devCnt)++;
|
||||
}
|
||||
}
|
||||
/* Always proceed to Pcall16 anticollision as phase differences of tags can lead to no tag recognized, even if there is one */
|
||||
if( *devCnt < devLimit )
|
||||
{
|
||||
/* Multiple device responses */
|
||||
do
|
||||
{
|
||||
detected = rfalSt25tbPollerDoCollisionResolution( devLimit, st25tbDevList, devCnt );
|
||||
}
|
||||
while( (detected == true) && (*devCnt < devLimit) );
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerReadBlock( uint8_t blockAddress, rfalSt25tbBlock *blockData )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
rfalSt25tbReadBlockReq readBlockReq;
|
||||
|
||||
|
||||
/* Compute Read Block Request */
|
||||
readBlockReq.cmd = RFAL_ST25TB_READ_BLOCK_CMD;
|
||||
readBlockReq.address = blockAddress;
|
||||
|
||||
/* Send Read Block Request */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&readBlockReq, sizeof(rfalSt25tbReadBlockReq), (uint8_t*)blockData, sizeof(rfalSt25tbBlock), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
|
||||
/* Check for valid UID Response */
|
||||
if( (ret == RFAL_ERR_NONE) && (rxLen != RFAL_ST25TB_BLOCK_LEN) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerWriteBlock( uint8_t blockAddress, const rfalSt25tbBlock *blockData )
|
||||
{
|
||||
ReturnCode ret;
|
||||
uint16_t rxLen;
|
||||
rfalSt25tbWriteBlockReq writeBlockReq;
|
||||
rfalSt25tbBlock tmpBlockData;
|
||||
|
||||
|
||||
/* Compute Write Block Request */
|
||||
writeBlockReq.cmd = RFAL_ST25TB_WRITE_BLOCK_CMD;
|
||||
writeBlockReq.address = blockAddress;
|
||||
RFAL_MEMCPY( &writeBlockReq.data, blockData, RFAL_ST25TB_BLOCK_LEN );
|
||||
|
||||
/* Send Write Block Request */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&writeBlockReq, sizeof(rfalSt25tbWriteBlockReq), tmpBlockData, RFAL_ST25TB_BLOCK_LEN, &rxLen, RFAL_TXRX_FLAGS_DEFAULT, (RFAL_ST25TB_FWT + RFAL_ST25TB_TW) );
|
||||
|
||||
|
||||
/* Check if there was any error besides timeout */
|
||||
if( ret != RFAL_ERR_TIMEOUT )
|
||||
{
|
||||
/* Check if an unexpected answer was received */
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Check whether a transmission error occurred */
|
||||
if( (ret != RFAL_ERR_CRC) && (ret != RFAL_ERR_FRAMING) && (ret != RFAL_ERR_NOMEM) && (ret != RFAL_ERR_RF_COLLISION) )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* If a transmission error occurred (maybe noise while commiting data) wait maximum programming time and verify data afterwards */
|
||||
rfalSetGT( (RFAL_ST25TB_FWT + RFAL_ST25TB_TW) );
|
||||
rfalFieldOnAndStartGT();
|
||||
}
|
||||
|
||||
ret = rfalSt25tbPollerReadBlock(blockAddress, &tmpBlockData);
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
if( RFAL_BYTECMP( &tmpBlockData, blockData, RFAL_ST25TB_BLOCK_LEN ) == 0 )
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerCompletion( void )
|
||||
{
|
||||
uint8_t completionReq;
|
||||
|
||||
/* Compute Completion Request */
|
||||
completionReq = RFAL_ST25TB_COMPLETION_CMD;
|
||||
|
||||
/* Send Completion Request, no response is expected */
|
||||
return rfalTransceiveBlockingTxRx( (uint8_t*)&completionReq, RFAL_ST25TB_CMD_LEN, NULL, 0, NULL, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalSt25tbPollerResetToInventory( void )
|
||||
{
|
||||
uint8_t resetInvReq;
|
||||
|
||||
/* Compute Completion Request */
|
||||
resetInvReq = RFAL_ST25TB_RESET_INV_CMD;
|
||||
|
||||
/* Send Completion Request, no response is expected */
|
||||
return rfalTransceiveBlockingTxRx( (uint8_t*)&resetInvReq, RFAL_ST25TB_CMD_LEN, NULL, 0, NULL, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ST25TB_FWT );
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_ST25TB */
|
||||
@@ -0,0 +1,585 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_st25xv.c
|
||||
* @author MMY Application Team
|
||||
* @brief NFC-V ST25 NFC-V Tag specific features
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_st25xv.h"
|
||||
#include "rfal_nfcv.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_ST25xV
|
||||
*/
|
||||
|
||||
|
||||
#if RFAL_FEATURE_ST25xV
|
||||
|
||||
#if !RFAL_FEATURE_NFCV
|
||||
#error " RFAL: Invalid Configuration. Please Enable RFAL support for NFC-V."
|
||||
#endif
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* 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_ST25TV512C_FID_LEN 1U /*!< FID length */
|
||||
#define RFAL_ST25TV512C_PID_LEN 1U /*!< PID length */
|
||||
#define RFAL_ST25TV512C_WR_CFG_DATA_LEN 4U /*!< Write Configuration data 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 RFAL_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 == RFAL_ERR_NONE )
|
||||
{
|
||||
if( rcvLen < RFAL_ST25xV_READ_CONFIG_LEN )
|
||||
{
|
||||
ret = RFAL_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 RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
ret = rfalNfcvPollerTransceiveReq( cmd, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, NULL, 0, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
if( ret == RFAL_ERR_NONE )
|
||||
{
|
||||
if( rcvLen < RFAL_ST25xV_READ_MSG_LEN_LEN )
|
||||
{
|
||||
ret = RFAL_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 RFAL_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 )
|
||||
{
|
||||
RFAL_MEMCPY( &txBuf[msgIt], uid, RFAL_NFCV_UID_LEN );
|
||||
msgIt += RFAL_NFCV_UID_LEN;
|
||||
}
|
||||
txBuf[msgIt++] = msgLen;
|
||||
RFAL_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 != RFAL_ERR_NONE )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Check if the response minimum length has been received */
|
||||
if( rcvLen < (uint8_t)RFAL_NFCV_FLAG_LEN )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* Check if an error has been signalled */
|
||||
if( (res.RES_FLAG & (uint8_t)RFAL_NFCV_RES_FLAG_ERROR) != 0U )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return RFAL_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 RFAL_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 */
|
||||
RFAL_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 RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
dataLen = 0U;
|
||||
data[dataLen++] = pwdNum;
|
||||
if( pwdLen > 0U )
|
||||
{
|
||||
RFAL_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 rfalST25xVPollerWritePassword( 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 RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
dataLen = 0U;
|
||||
data[dataLen++] = pwdNum;
|
||||
if( pwdLen > 0U )
|
||||
{
|
||||
RFAL_MEMCPY(&data[dataLen], pwd, pwdLen);
|
||||
}
|
||||
dataLen += pwdLen;
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_WRITE_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 );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalST25TV512CPollerReadConfiguration(uint8_t flags, const uint8_t* uid, uint8_t fid, uint8_t pid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
|
||||
{
|
||||
uint8_t param[RFAL_ST25TV512C_FID_LEN + RFAL_ST25TV512C_PID_LEN];
|
||||
uint8_t paramLen;
|
||||
|
||||
paramLen = 0;
|
||||
|
||||
/* Compute Request Data */
|
||||
param[paramLen++] = fid;
|
||||
param[paramLen++] = pid;
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_READ_CONFIGURATION, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, param, paramLen, rxBuf, rxBufLen, rcvLen );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalST25TV512CPollerWriteConfiguration(uint8_t flags, const uint8_t* uid, uint8_t fid, uint8_t pid, const uint8_t *data, uint8_t dataLen )
|
||||
{
|
||||
uint8_t param[RFAL_ST25TV512C_FID_LEN + RFAL_ST25TV512C_PID_LEN + RFAL_ST25TV512C_WR_CFG_DATA_LEN];
|
||||
uint8_t paramLen;
|
||||
uint16_t rcvLen;
|
||||
rfalNfcvGenericRes res;
|
||||
|
||||
if( (dataLen > RFAL_ST25TV512C_WR_CFG_DATA_LEN) || (data == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
paramLen = 0U;
|
||||
|
||||
param[paramLen++] = fid;
|
||||
param[paramLen++] = pid;
|
||||
|
||||
if( dataLen > 0U )
|
||||
{
|
||||
RFAL_MEMCPY(¶m[paramLen], data, dataLen);
|
||||
}
|
||||
paramLen += dataLen;
|
||||
|
||||
return rfalNfcvPollerTransceiveReq( RFAL_NFCV_CMD_WRITE_CONFIGURATION, flags, RFAL_NFCV_ST_IC_MFG_CODE, uid, param, paramLen, (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen );
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_ST25xV */
|
||||
@@ -0,0 +1,202 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_t1t.c
|
||||
* @author MMY Application Team
|
||||
* @brief Provides NFC-A T1T convenience methods and definitions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_t1t.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_T1T
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_T1T
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
#define RFAL_T1T_DRD_READ (1236U*2U) /*!< DRD for Reads with n=9 => 1236/fc ~= 91 us T1T 1.2 4.4.2 */
|
||||
#define RFAL_T1T_DRD_WRITE 36052U /*!< DRD for Write with n=281 => 36052/fc ~= 2659 us T1T 1.2 4.4.2 */
|
||||
#define RFAL_T1T_DRD_WRITE_E 70996U /*!< DRD for Write/Erase with n=554 => 70996/fc ~= 5236 us T1T 1.2 4.4.2 */
|
||||
|
||||
#define RFAL_T1T_RID_RES_HR0_VAL 0x10U /*!< HR0 indicating NDEF support Digital 2.0 (Candidate) 11.6.2.1 */
|
||||
#define RFAL_T1T_RID_RES_HR0_MASK 0xF0U /*!< HR0 most significant nibble mask */
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! NFC-A T1T (Topaz) RID_REQ Digital 1.1 10.6.1 & Table 49 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< T1T cmd: RID */
|
||||
uint8_t add; /*!< ADD: undefined value */
|
||||
uint8_t data; /*!< DATA: undefined value */
|
||||
uint8_t uid[RFAL_T1T_UID_LEN]; /*!< UID-echo: undefined value */
|
||||
} rfalT1TRidReq;
|
||||
|
||||
|
||||
/*! NFC-A T1T (Topaz) RALL_REQ T1T 1.2 Table 4 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< T1T cmd: RALL */
|
||||
uint8_t add1; /*!< ADD: 0x00 */
|
||||
uint8_t add0; /*!< ADD: 0x00 */
|
||||
uint8_t uid[RFAL_T1T_UID_LEN]; /*!< UID */
|
||||
} rfalT1TRallReq;
|
||||
|
||||
|
||||
/*! NFC-A T1T (Topaz) WRITE_REQ T1T 1.2 Table 4 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t cmd; /*!< T1T cmd: RALL */
|
||||
uint8_t add; /*!< ADD */
|
||||
uint8_t data; /*!< DAT */
|
||||
uint8_t uid[RFAL_T1T_UID_LEN]; /*!< UID */
|
||||
} rfalT1TWriteReq;
|
||||
|
||||
|
||||
/*! NFC-A T1T (Topaz) WRITE_RES T1T 1.2 Table 4 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t add; /*!< ADD */
|
||||
uint8_t data; /*!< DAT */
|
||||
} rfalT1TWriteRes;
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL FUNCTION PROTOTYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
ReturnCode rfalT1TPollerInitialize( void )
|
||||
{
|
||||
ReturnCode ret;
|
||||
|
||||
RFAL_EXIT_ON_ERR(ret, rfalSetMode( RFAL_MODE_POLL_NFCA_T1T, RFAL_BR_106, RFAL_BR_106 ) );
|
||||
rfalSetErrorHandling( RFAL_ERRORHANDLING_NONE );
|
||||
|
||||
rfalSetGT( RFAL_GT_NONE ); /* T1T should only be initialized after NFC-A mode, therefore the GT has been fulfilled */
|
||||
rfalSetFDTListen( RFAL_FDT_LISTEN_NFCA_POLLER ); /* T1T uses NFC-A FDT Listen with n=9 Digital 1.1 10.7.2 */
|
||||
rfalSetFDTPoll( RFAL_FDT_POLL_NFCA_T1T_POLLER );
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT1TPollerRid( rfalT1TRidRes *ridRes )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalT1TRidReq ridReq;
|
||||
uint16_t rcvdLen;
|
||||
|
||||
if( ridRes == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Compute RID command and set Undefined Values to 0x00 Digital 1.1 10.6.1 */
|
||||
RFAL_MEMSET( &ridReq, 0x00, sizeof(rfalT1TRidReq) );
|
||||
ridReq.cmd = (uint8_t)RFAL_T1T_CMD_RID;
|
||||
|
||||
RFAL_EXIT_ON_ERR( ret, rfalTransceiveBlockingTxRx( (uint8_t*)&ridReq, sizeof(rfalT1TRidReq), (uint8_t*)ridRes, sizeof(rfalT1TRidRes), &rcvdLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_T1T_DRD_READ ) );
|
||||
|
||||
/* Check expected RID response length and the HR0 Digital 2.0 (Candidate) 11.6.2.1 */
|
||||
if( (rcvdLen != sizeof(rfalT1TRidRes)) || ((ridRes->hr0 & RFAL_T1T_RID_RES_HR0_MASK) != RFAL_T1T_RID_RES_HR0_VAL) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT1TPollerRall( const uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rxRcvdLen )
|
||||
{
|
||||
rfalT1TRallReq rallReq;
|
||||
|
||||
if( (rxBuf == NULL) || (uid == NULL) || (rxRcvdLen == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Compute RALL command and set Add to 0x00 */
|
||||
RFAL_MEMSET( &rallReq, 0x00, sizeof(rfalT1TRallReq) );
|
||||
rallReq.cmd = (uint8_t)RFAL_T1T_CMD_RALL;
|
||||
RFAL_MEMCPY(rallReq.uid, uid, RFAL_T1T_UID_LEN);
|
||||
|
||||
return rfalTransceiveBlockingTxRx( (uint8_t*)&rallReq, sizeof(rfalT1TRallReq), (uint8_t*)rxBuf, rxBufLen, rxRcvdLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_T1T_DRD_READ );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT1TPollerWrite( const uint8_t* uid, uint8_t address, uint8_t data )
|
||||
{
|
||||
rfalT1TWriteReq writeReq;
|
||||
rfalT1TWriteRes writeRes;
|
||||
uint16_t rxRcvdLen;
|
||||
ReturnCode err;
|
||||
|
||||
if( uid == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
writeReq.cmd = (uint8_t)RFAL_T1T_CMD_WRITE_E;
|
||||
writeReq.add = address;
|
||||
writeReq.data = data;
|
||||
RFAL_MEMCPY(writeReq.uid, uid, RFAL_T1T_UID_LEN);
|
||||
|
||||
err = rfalTransceiveBlockingTxRx( (uint8_t*)&writeReq, sizeof(rfalT1TWriteReq), (uint8_t*)&writeRes, sizeof(rfalT1TWriteRes), &rxRcvdLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_T1T_DRD_WRITE_E );
|
||||
|
||||
if( err == RFAL_ERR_NONE )
|
||||
{
|
||||
if( (writeReq.add != writeRes.add) || (writeReq.data != writeRes.data) || (rxRcvdLen != sizeof(rfalT1TWriteRes)) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
}
|
||||
return err;
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_T1T */
|
||||
@@ -0,0 +1,224 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_t2t.c
|
||||
* @author MMY Application Team
|
||||
* @brief Provides NFC-A T2T convenience methods and definitions
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_t2t.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_T2T
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_T2T
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_FDT_POLL_READ_MAX rfalConvMsTo1fc(5U) /*!< Maximum Wait time for Read command as defined in TS T2T 1.0 table 18 */
|
||||
#define RFAL_FDT_POLL_WRITE_MAX rfalConvMsTo1fc(10U) /*!< Maximum Wait time for Write command as defined in TS T2T 1.0 table 18 */
|
||||
#define RFAL_FDT_POLL_SL_MAX rfalConvMsTo1fc(1U) /*!< Maximum Wait time for Sector Select as defined in TS T2T 1.0 table 18 */
|
||||
#define RFAL_T2T_ACK_NACK_LEN 1U /*!< Len of NACK in bytes (4 bits) */
|
||||
#define RFAL_T2T_ACK 0x0AU /*!< ACK value */
|
||||
#define RFAL_T2T_ACK_MASK 0x0FU /*!< ACK value */
|
||||
|
||||
|
||||
#define RFAL_T2T_SECTOR_SELECT_P1_BYTE2 0xFFU /*!< Sector Select Packet 1 byte 2 */
|
||||
#define RFAL_T2T_SECTOR_SELECT_P2_RFU_LEN 3U /*!< Sector Select RFU length */
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*! NFC-A T2T command set T2T 1.0 5.1 */
|
||||
typedef enum
|
||||
{
|
||||
RFAL_T2T_CMD_READ = 0x30, /*!< T2T Read */
|
||||
RFAL_T2T_CMD_WRITE = 0xA2, /*!< T2T Write */
|
||||
RFAL_T2T_CMD_SECTOR_SELECT = 0xC2 /*!< T2T Sector Select */
|
||||
} rfalT2Tcmds;
|
||||
|
||||
|
||||
/*! NFC-A T2T READ T2T 1.0 5.2 and table 11 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t code; /*!< Command code */
|
||||
uint8_t blNo; /*!< Block number */
|
||||
} rfalT2TReadReq;
|
||||
|
||||
|
||||
/*! NFC-A T2T WRITE T2T 1.0 5.3 and table 12 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t code; /*!< Command code */
|
||||
uint8_t blNo; /*!< Block number */
|
||||
uint8_t data[RFAL_T2T_WRITE_DATA_LEN]; /*!< Data */
|
||||
} rfalT2TWriteReq;
|
||||
|
||||
|
||||
/*! NFC-A T2T SECTOR SELECT Packet 1 T2T 1.0 5.4 and table 13 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t code; /*!< Command code */
|
||||
uint8_t byte2; /*!< Sector Select Packet 1 byte 2 */
|
||||
} rfalT2TSectorSelectP1Req;
|
||||
|
||||
|
||||
/*! NFC-A T2T SECTOR SELECT Packet 2 T2T 1.0 5.4 and table 13 */
|
||||
typedef struct
|
||||
{
|
||||
uint8_t secNo; /*!< Block number */
|
||||
uint8_t rfu[RFAL_T2T_SECTOR_SELECT_P2_RFU_LEN]; /*!< Sector Select Packet RFU */
|
||||
} rfalT2TSectorSelectP2Req;
|
||||
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
ReturnCode rfalT2TPollerRead( uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalT2TReadReq req;
|
||||
|
||||
if( (rxBuf == NULL) || (rcvLen == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
req.code = (uint8_t)RFAL_T2T_CMD_READ;
|
||||
req.blNo = blockNum;
|
||||
|
||||
/* Transceive Command */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, sizeof(rfalT2TReadReq), rxBuf, rxBufLen, rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_READ_MAX );
|
||||
|
||||
/* T2T 1.0 5.2.1.7 The Reader/Writer SHALL treat a NACK in response to a READ Command as a Protocol Error */
|
||||
if( (ret == RFAL_ERR_INCOMPLETE_BYTE) && (*rcvLen == RFAL_T2T_ACK_NACK_LEN) && ((*rxBuf & RFAL_T2T_ACK_MASK) != RFAL_T2T_ACK) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT2TPollerWrite( uint8_t blockNum, const uint8_t* wrData )
|
||||
{
|
||||
ReturnCode ret;
|
||||
rfalT2TWriteReq req;
|
||||
uint8_t res;
|
||||
uint16_t rxLen;
|
||||
|
||||
req.code = (uint8_t)RFAL_T2T_CMD_WRITE;
|
||||
req.blNo = blockNum;
|
||||
RFAL_MEMCPY(req.data, wrData, RFAL_T2T_WRITE_DATA_LEN);
|
||||
|
||||
|
||||
/* Transceive WRITE Command */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, sizeof(rfalT2TWriteReq), &res, sizeof(uint8_t), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_WRITE_MAX );
|
||||
|
||||
/* Check for a valid ACK */
|
||||
if( (ret == RFAL_ERR_INCOMPLETE_BYTE) || (ret == RFAL_ERR_NONE) )
|
||||
{
|
||||
ret = RFAL_ERR_PROTO;
|
||||
|
||||
if( (rxLen == RFAL_T2T_ACK_NACK_LEN) && ((res & RFAL_T2T_ACK_MASK) == RFAL_T2T_ACK) )
|
||||
{
|
||||
ret = RFAL_ERR_NONE;
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT2TPollerSectorSelect( uint8_t sectorNum )
|
||||
{
|
||||
rfalT2TSectorSelectP1Req p1Req;
|
||||
rfalT2TSectorSelectP2Req p2Req;
|
||||
ReturnCode ret;
|
||||
uint8_t res;
|
||||
uint16_t rxLen;
|
||||
|
||||
|
||||
/* Compute SECTOR SELECT Packet 1 */
|
||||
p1Req.code = (uint8_t)RFAL_T2T_CMD_SECTOR_SELECT;
|
||||
p1Req.byte2 = RFAL_T2T_SECTOR_SELECT_P1_BYTE2;
|
||||
|
||||
/* Transceive SECTOR SELECT Packet 1 */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&p1Req, sizeof(rfalT2TSectorSelectP1Req), &res, sizeof(uint8_t), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_SL_MAX );
|
||||
|
||||
/* Check and report any transmission error */
|
||||
if( (ret != RFAL_ERR_INCOMPLETE_BYTE) && (ret != RFAL_ERR_NONE) )
|
||||
{
|
||||
return ret;
|
||||
}
|
||||
|
||||
/* Ensure that an ACK was received */
|
||||
if( (ret != RFAL_ERR_INCOMPLETE_BYTE) || (rxLen != RFAL_T2T_ACK_NACK_LEN) || ((res & RFAL_T2T_ACK_MASK) != RFAL_T2T_ACK) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
|
||||
/* Compute SECTOR SELECT Packet 2 */
|
||||
p2Req.secNo = sectorNum;
|
||||
RFAL_MEMSET( &p2Req.rfu, 0x00, RFAL_T2T_SECTOR_SELECT_P2_RFU_LEN );
|
||||
|
||||
|
||||
/* Transceive SECTOR SELECT Packet 2 */
|
||||
ret = rfalTransceiveBlockingTxRx( (uint8_t*)&p2Req, sizeof(rfalT2TSectorSelectP2Req), &res, sizeof(uint8_t), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_SL_MAX );
|
||||
|
||||
/* T2T 1.0 5.4.1.14 The Reader/Writer SHALL treat any response received before the end of PATT2T,SL,MAX as a Protocol Error */
|
||||
if( (ret == RFAL_ERR_NONE) || (ret == RFAL_ERR_INCOMPLETE_BYTE) )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
/* T2T 1.0 5.4.1.13 The Reader/Writer SHALL treat the transmission of the SECTOR SELECT Command Packet 2 as being successful when it receives no response until PATT2T,SL,MAX. */
|
||||
if( ret == RFAL_ERR_TIMEOUT )
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_T2T */
|
||||
@@ -0,0 +1,406 @@
|
||||
|
||||
/**
|
||||
******************************************************************************
|
||||
* @file rfal_t4t.h
|
||||
* @author MMY Application Team
|
||||
* @brief Provides convenience methods and definitions for T4T (ISO7816-4)
|
||||
******************************************************************************
|
||||
* @attention
|
||||
*
|
||||
* Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.
|
||||
*
|
||||
* This software is licensed under terms that can be found in the LICENSE file
|
||||
* in the root directory of this software component.
|
||||
* If no LICENSE file comes with this software, it is provided AS-IS.
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* INCLUDES
|
||||
******************************************************************************
|
||||
*/
|
||||
#include "rfal_t4t.h"
|
||||
#include "rfal_utils.h"
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* ENABLE SWITCH
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/* Feature switch may be enabled or disabled by user at rfal_platform.h
|
||||
* Default configuration (ST25R dependant) also provided at rfal_defConfig.h
|
||||
*
|
||||
* RFAL_FEATURE_T4T
|
||||
*/
|
||||
|
||||
#if RFAL_FEATURE_T4T
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL DEFINES
|
||||
******************************************************************************
|
||||
*/
|
||||
#define RFAL_T4T_OFFSET_DO 0x54U /*!< Tag value for offset BER-TLV data object */
|
||||
#define RFAL_T4T_LENGTH_DO 0x03U /*!< Len value for offset BER-TLV data object */
|
||||
#define RFAL_T4T_DATA_DO 0x53U /*!< Tag value for data BER-TLV data object */
|
||||
|
||||
#define RFAL_T4T_MAX_LC 255U /*!< Maximum Lc value for short Lc coding */
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL TYPES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL MACROS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* LOCAL VARIABLES
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
/*
|
||||
******************************************************************************
|
||||
* GLOBAL FUNCTIONS
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeCAPDU( const rfalT4tCApduParam *apduParam )
|
||||
{
|
||||
uint8_t hdrLen;
|
||||
uint16_t msgIt;
|
||||
|
||||
if( (apduParam == NULL) || (apduParam->cApduBuf == NULL) || (apduParam->cApduLen == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
msgIt = 0;
|
||||
*(apduParam->cApduLen) = 0;
|
||||
|
||||
/*******************************************************************************/
|
||||
/* Compute Command-APDU according to the format T4T 1.0 5.1.2 & ISO7816-4 2013 Table 1 */
|
||||
|
||||
/* Check if Data is present */
|
||||
if( apduParam->LcFlag )
|
||||
{
|
||||
if( apduParam->Lc == 0U )
|
||||
{
|
||||
/* Extented field coding not supported */
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* Check whether requested Lc fits */
|
||||
if( (uint16_t)apduParam->Lc > (uint16_t)(RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN - RFAL_T4T_LE_LEN) )
|
||||
{
|
||||
return RFAL_ERR_PARAM; /* PRQA S 2880 # MISRA 2.1 - Unreachable code due to configuration option being set/unset */
|
||||
}
|
||||
|
||||
/* Calculate the header length a place the data/body where it should be */
|
||||
hdrLen = RFAL_T4T_MAX_CAPDU_PROLOGUE_LEN + RFAL_T4T_LC_LEN;
|
||||
|
||||
/* make sure not to exceed buffer size */
|
||||
if( ((uint16_t)hdrLen + (uint16_t)apduParam->Lc + (apduParam->LeFlag ? RFAL_T4T_LC_LEN : 0U)) > RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN )
|
||||
{
|
||||
return RFAL_ERR_NOMEM; /* PRQA S 2880 # MISRA 2.1 - Unreachable code due to configuration option being set/unset */
|
||||
}
|
||||
RFAL_MEMMOVE( &apduParam->cApduBuf->apdu[hdrLen], apduParam->cApduBuf->apdu, apduParam->Lc );
|
||||
}
|
||||
|
||||
/* Prepend the ADPDU's header */
|
||||
apduParam->cApduBuf->apdu[msgIt++] = apduParam->CLA;
|
||||
apduParam->cApduBuf->apdu[msgIt++] = apduParam->INS;
|
||||
apduParam->cApduBuf->apdu[msgIt++] = apduParam->P1;
|
||||
apduParam->cApduBuf->apdu[msgIt++] = apduParam->P2;
|
||||
|
||||
|
||||
/* Check if Data field length is to be added */
|
||||
if( apduParam->LcFlag )
|
||||
{
|
||||
apduParam->cApduBuf->apdu[msgIt++] = apduParam->Lc;
|
||||
msgIt += apduParam->Lc;
|
||||
}
|
||||
|
||||
/* Check if Expected Response Length is to be added */
|
||||
if( apduParam->LeFlag )
|
||||
{
|
||||
apduParam->cApduBuf->apdu[msgIt++] = apduParam->Le;
|
||||
}
|
||||
|
||||
*(apduParam->cApduLen) = msgIt;
|
||||
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerParseRAPDU( rfalT4tRApduParam *apduParam )
|
||||
{
|
||||
if( (apduParam == NULL) || (apduParam->rApduBuf == NULL) )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
if( apduParam->rcvdLen < RFAL_T4T_MAX_RAPDU_SW1SW2_LEN )
|
||||
{
|
||||
return RFAL_ERR_PROTO;
|
||||
}
|
||||
|
||||
apduParam->rApduBodyLen = (apduParam->rcvdLen - (uint16_t)RFAL_T4T_MAX_RAPDU_SW1SW2_LEN);
|
||||
apduParam->statusWord = RFAL_GETU16( &apduParam->rApduBuf->apdu[ apduParam->rApduBodyLen ] );
|
||||
|
||||
/* Check SW1 SW2 T4T 1.0 5.1.3 NOTE */
|
||||
if( apduParam->statusWord == RFAL_T4T_ISO7816_STATUS_COMPLETE )
|
||||
{
|
||||
return RFAL_ERR_NONE;
|
||||
}
|
||||
|
||||
return RFAL_ERR_REQUEST;
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeSelectAppl( rfalIsoDepApduBufFormat *cApduBuf, const uint8_t* aid, uint8_t aidLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
|
||||
if( cApduBuf == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h A4h 00h 00h 07h AID 00h */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_SELECT;
|
||||
cAPDU.P1 = RFAL_T4T_ISO7816_P1_SELECT_BY_DF_NAME;
|
||||
cAPDU.P2 = RFAL_T4T_ISO7816_P2_SELECT_FIRST_OR_ONLY_OCCURENCE | RFAL_T4T_ISO7816_P2_SELECT_RETURN_FCI_TEMPLATE;
|
||||
cAPDU.Lc = aidLen;
|
||||
cAPDU.Le = 0x00;
|
||||
cAPDU.LcFlag = true;
|
||||
cAPDU.LeFlag = true;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
if( (aid != NULL) && (aidLen > 0U) )
|
||||
{
|
||||
RFAL_MEMCPY( cAPDU.cApduBuf->apdu, aid, aidLen );
|
||||
}
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeSelectFile( rfalIsoDepApduBufFormat *cApduBuf, const uint8_t* fid, uint8_t fidLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
|
||||
if( cApduBuf == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h A4h 00h 0Ch 02h FID - */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_SELECT;
|
||||
cAPDU.P1 = RFAL_T4T_ISO7816_P1_SELECT_BY_FILEID;
|
||||
cAPDU.P2 = RFAL_T4T_ISO7816_P2_SELECT_FIRST_OR_ONLY_OCCURENCE | RFAL_T4T_ISO7816_P2_SELECT_NO_RESPONSE_DATA;
|
||||
cAPDU.Lc = fidLen;
|
||||
cAPDU.Le = 0x00;
|
||||
cAPDU.LcFlag = true;
|
||||
cAPDU.LeFlag = false;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
if( (fid != NULL) && (fidLen > 0U) )
|
||||
{
|
||||
RFAL_MEMCPY( cAPDU.cApduBuf->apdu, fid, fidLen );
|
||||
}
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeSelectFileV1Mapping( rfalIsoDepApduBufFormat *cApduBuf, const uint8_t* fid, uint8_t fidLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
|
||||
if( cApduBuf == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h A4h 00h 00h 02h FID - */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_SELECT;
|
||||
cAPDU.P1 = RFAL_T4T_ISO7816_P1_SELECT_BY_FILEID;
|
||||
cAPDU.P2 = RFAL_T4T_ISO7816_P2_SELECT_FIRST_OR_ONLY_OCCURENCE | RFAL_T4T_ISO7816_P2_SELECT_RETURN_FCI_TEMPLATE;
|
||||
cAPDU.Lc = fidLen;
|
||||
cAPDU.Le = 0x00;
|
||||
cAPDU.LcFlag = true;
|
||||
cAPDU.LeFlag = false;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
if( (fid != NULL) && (fidLen > 0U) )
|
||||
{
|
||||
RFAL_MEMCPY( cAPDU.cApduBuf->apdu, fid, fidLen );
|
||||
}
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeReadData( rfalIsoDepApduBufFormat *cApduBuf, uint16_t offset, uint8_t expLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
|
||||
RFAL_MEMSET( &cAPDU, 0x00, sizeof(rfalT4tCApduParam) );
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h B0h [Offset] - - len */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_READBINARY;
|
||||
cAPDU.P1 = (uint8_t)((offset >> 8U) & 0xFFU);
|
||||
cAPDU.P2 = (uint8_t)((offset >> 0U) & 0xFFU);
|
||||
cAPDU.Le = expLen;
|
||||
cAPDU.LcFlag = false;
|
||||
cAPDU.LeFlag = true;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeReadDataODO( rfalIsoDepApduBufFormat *cApduBuf, uint32_t offset, uint8_t expLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
uint8_t dataIt;
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h B1h 00h 00h Lc 54 03 xxyyzz len */
|
||||
/* [Offset] */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_READBINARY_ODO;
|
||||
cAPDU.P1 = 0x00U;
|
||||
cAPDU.P2 = 0x00U;
|
||||
cAPDU.Le = expLen;
|
||||
cAPDU.LcFlag = true;
|
||||
cAPDU.LeFlag = true;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
dataIt = 0U;
|
||||
cApduBuf->apdu[dataIt++] = RFAL_T4T_OFFSET_DO;
|
||||
cApduBuf->apdu[dataIt++] = RFAL_T4T_LENGTH_DO;
|
||||
cApduBuf->apdu[dataIt++] = (uint8_t)(offset >> 16U);
|
||||
cApduBuf->apdu[dataIt++] = (uint8_t)(offset >> 8U);
|
||||
cApduBuf->apdu[dataIt++] = (uint8_t)(offset);
|
||||
cAPDU.Lc = dataIt;
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeWriteData( rfalIsoDepApduBufFormat *cApduBuf, uint16_t offset, const uint8_t* data, uint8_t dataLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
|
||||
if( cApduBuf == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
RFAL_MEMSET( &cAPDU, 0x00, sizeof(rfalT4tCApduParam) );
|
||||
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h D6h [Offset] len Data - */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_UPDATEBINARY;
|
||||
cAPDU.P1 = (uint8_t)((offset >> 8U) & 0xFFU);
|
||||
cAPDU.P2 = (uint8_t)((offset >> 0U) & 0xFFU);
|
||||
cAPDU.Lc = dataLen;
|
||||
cAPDU.LcFlag = true;
|
||||
cAPDU.LeFlag = false;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
if( (data != NULL) && (dataLen > 0U) )
|
||||
{
|
||||
RFAL_MEMCPY( cAPDU.cApduBuf->apdu, data, dataLen );
|
||||
}
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
/*******************************************************************************/
|
||||
ReturnCode rfalT4TPollerComposeWriteDataODO( rfalIsoDepApduBufFormat *cApduBuf, uint32_t offset, const uint8_t* data, uint8_t dataLen, uint16_t *cApduLen )
|
||||
{
|
||||
rfalT4tCApduParam cAPDU;
|
||||
uint8_t dataIt;
|
||||
|
||||
if( cApduBuf == NULL )
|
||||
{
|
||||
return RFAL_ERR_PARAM;
|
||||
}
|
||||
|
||||
RFAL_MEMSET( &cAPDU, 0x00, sizeof(rfalT4tCApduParam) );
|
||||
|
||||
/* CLA INS P1 P2 Lc Data Le */
|
||||
/* 00h D7h 00h 00h len 54 03 xxyyzz 53 Ld data - */
|
||||
/* [offset] [data] */
|
||||
cAPDU.CLA = RFAL_T4T_CLA;
|
||||
cAPDU.INS = (uint8_t)RFAL_T4T_INS_UPDATEBINARY_ODO;
|
||||
cAPDU.P1 = 0x00U;
|
||||
cAPDU.P2 = 0x00U;
|
||||
cAPDU.LcFlag = true;
|
||||
cAPDU.LeFlag = false;
|
||||
cAPDU.cApduBuf = cApduBuf;
|
||||
cAPDU.cApduLen = cApduLen;
|
||||
|
||||
dataIt = 0U;
|
||||
cApduBuf->apdu[dataIt++] = RFAL_T4T_OFFSET_DO;
|
||||
cApduBuf->apdu[dataIt++] = RFAL_T4T_LENGTH_DO;
|
||||
cApduBuf->apdu[dataIt++] = (uint8_t)(offset >> 16U);
|
||||
cApduBuf->apdu[dataIt++] = (uint8_t)(offset >> 8U);
|
||||
cApduBuf->apdu[dataIt++] = (uint8_t)(offset);
|
||||
cApduBuf->apdu[dataIt++] = RFAL_T4T_DATA_DO;
|
||||
cApduBuf->apdu[dataIt++] = dataLen;
|
||||
|
||||
if( (((uint32_t)dataLen + (uint32_t)dataIt) >= RFAL_T4T_MAX_LC) || (((uint32_t)dataLen + (uint32_t)dataIt) >= RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN) )
|
||||
{
|
||||
return (RFAL_ERR_NOMEM);
|
||||
}
|
||||
|
||||
if( (data != NULL) && (dataLen > 0U) )
|
||||
{
|
||||
RFAL_MEMCPY( &cAPDU.cApduBuf->apdu[dataIt], data, dataLen );
|
||||
}
|
||||
dataIt += dataLen;
|
||||
cAPDU.Lc = dataIt;
|
||||
|
||||
return rfalT4TPollerComposeCAPDU( &cAPDU );
|
||||
}
|
||||
|
||||
#endif /* RFAL_FEATURE_T4T */
|
||||
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><g fill="#13254a"><path d="M100 .212C44.868.212 0 44.889 0 99.788c0 55.132 44.868 100 100 100s100-44.868 100-100C200 44.889 155.132.212 100 .212zm0 181.164c-44.974 0-81.587-36.614-81.587-81.587 0-44.762 36.614-81.164 81.587-81.164 44.995 0 81.587 36.402 81.587 81.164 0 44.973-36.592 81.587-81.587 81.587z" style="fill: #e6007e;"/><path d="M141.1 88.127h-29.439V58.688c0-6.392-5.185-11.598-11.598-11.598-6.413 0-11.619 5.206-11.619 11.598v29.439H58.476c-6.392 0-11.598 5.185-11.598 11.598 0 6.413 5.206 11.619 11.598 11.619h29.968v29.968c0 6.392 5.206 11.598 11.619 11.598 6.413 0 11.598-5.206 11.598-11.598v-29.968H141.1c6.392 0 11.598-5.206 11.598-11.619 0-6.413-5.206-11.598-11.598-11.598z" style="fill: #e6007e;"/></g></svg>
|
||||
|
After Width: | Height: | Size: 832 B |
@@ -0,0 +1,2 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 200 200"><g fill="#03234b"><path d="M170.934 64.569l-.04-.055-29.049 40.038-.057.079h14.867a59.366 59.366 0 0 1-1.488 15.615c-1.158 5.318-3.807 13.448-9.848 21.977-2.766 4.118-6.375 7.726-9.208 10.408-3.426 2.857-7.461 6.095-12 8.376-8.121 4.568-17.881 7.138-28.225 7.432-10.907.248-20.201-2.61-26.072-5.052-8.283-3.479-14.111-7.807-16.85-10.078-1.254-.956-2.25-1.907-3.057-2.676a28.662 28.662 0 0 0-1.157-1.069 158.874 158.874 0 0 0-1.479-1.362l-4.435-3.956 3.569 4.81.183.243c.2.263.548.722 1.048 1.389.276.334.579.747.93 1.226l.008.01c.689.939 1.546 2.107 2.664 3.322 3 3.536 8.178 8.801 15.808 13.801 5.969 3.866 15.672 8.901 28.001 10.935a79.05 79.05 0 0 0 12.485.998c7.97 0 15.651-1.228 22.828-3.649 6.366-1.877 12.192-4.981 17.053-7.771 6.16-3.936 10.817-7.586 14.654-11.488 8.084-7.899 14.884-17.913 19.15-28.199 3.259-7.594 5.456-15.727 6.529-24.175l.055-.425.083-.641H200l-29.066-40.063zM58.159 99.232l-12.655.563c-.097-.881-.159-1.986-.227-3.474a59.184 59.184 0 0 1 1.446-16.56c1.157-5.316 3.804-13.444 9.848-21.977 2.168-3.228 5.009-6.44 9.208-10.415 3.41-2.849 7.432-6.08 12.005-8.375 8.114-4.568 17.87-7.138 28.213-7.432 10.9-.25 20.196 2.607 26.072 5.045 8.258 3.473 14.105 7.812 16.857 10.091 1.257.951 2.253 1.904 3.057 2.673l.017.016c.43.411.801.766 1.136 1.051.475.438.841.777 1.091 1.01l.138.128.248.229 4.04 3.613-3.165-4.456c-.058-.083-.312-.417-.73-.971l-.507-.67a28.922 28.922 0 0 1-.901-1.192l-.02-.027c-.69-.945-1.548-2.121-2.677-3.346-3.002-3.537-8.182-8.803-15.813-13.801-5.964-3.865-15.662-8.9-27.997-10.935-8.484-1.363-21.496-2.009-35.313 2.651-6.355 1.88-12.186 4.983-17.054 7.772-6.163 3.944-10.82 7.595-14.654 11.488-8.079 7.894-14.882 17.909-19.155 28.2-3.268 7.624-5.463 15.757-6.523 24.173-.436 3.281-.642 5.421-.664 6.926L0 101.831l30.683 38.727.042.053 27.38-41.298.054-.081z" style="fill: #e6007e;"/></g></svg>
|
||||
|
After Width: | Height: | Size: 1.9 KiB |
Binary file not shown.
|
After Width: | Height: | Size: 4.0 KiB |
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 7.3 KiB |
@@ -0,0 +1,426 @@
|
||||
<!DOCTYPE html>
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" lang="en" xml:lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8" />
|
||||
<meta name="generator" content="pandoc" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes" />
|
||||
<title>Release Notes for NDEF message software Library</title>
|
||||
<style type="text/css">
|
||||
code{white-space: pre-wrap;}
|
||||
span.smallcaps{font-variant: small-caps;}
|
||||
span.underline{text-decoration: underline;}
|
||||
div.column{display: inline-block; vertical-align: top; width: 50%;}
|
||||
</style>
|
||||
<link rel="stylesheet" href="_htmresc/mini-st.css" />
|
||||
<!--[if lt IE 9]>
|
||||
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv-printshiv.min.js"></script>
|
||||
<![endif]-->
|
||||
<link rel="icon" type="image/x-icon" href="_htmresc/favicon.png" />
|
||||
</head>
|
||||
<body>
|
||||
<div class="row">
|
||||
<div class="col-sm-12 col-lg-4">
|
||||
<center>
|
||||
<h1 id="release-notes-for-rfal-software-library"><small>Release Notes for</small> <strong>RFAL software Library</strong></h1>
|
||||
<p>Copyright © 2022 STMicroelectronics<br />
|
||||
</p>
|
||||
<a href="https://www.st.com" class="logo"><img src="_htmresc/st_logo.png" alt="ST logo" /></a>
|
||||
</center>
|
||||
<h1 id="purpose">Purpose</h1>
|
||||
<p>The <strong>RFAL Library (RF Abstraction Layer)</strong> provides several functionalities required to perform RF/NFC communications.The RFAL encapsulates the different RF ICs (ST25R3911, ST25R3916, ST25R200, ST25R500, ST25R95 and future ST25R devices) into a common and easy to use interface.</p>
|
||||
<p>The technologies currently supported by RFAL are:</p>
|
||||
<ul>
|
||||
<li> NFC-A \ ISO14443A (T1T, T2T, T4TA) </li>
|
||||
<li> NFC-B \ ISO14443B (T4TB) </li>
|
||||
<li> NFC-F \ FeliCa (T3T) </li>
|
||||
<li> NFC-V \ ISO15693 (T5T) </li>
|
||||
<li> P2P \ ISO18092 (NFCIP1, Passive-Active P2P) </li>
|
||||
<li> ST25TB (ISO14443-2 Type B with Proprietary Protocol) </li>
|
||||
<li> PicoPass \ iClass </li>
|
||||
<li> B' \ Calypso </li>
|
||||
<li> CTS \ CTM </li>
|
||||
</ul>
|
||||
<p>The protocols provided by RFAL are: </p>
|
||||
<ul>
|
||||
<li> ISO-DEP (ISO14443-4) </li>
|
||||
<li> NFC-DEP (ISO18092) </li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="col-sm-12 col-lg-8">
|
||||
<h1 id="update-history">Update History</h1>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section24" checked aria-hidden="true"> <label for="collapse-section24" aria-hidden="true">V4.0.2 / 02-April-2025</label>
|
||||
<div>
|
||||
<h2 id="main-changes">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed vulnerability during EMD handling on fast systems, introduced at v4.0.0 targeted for high latency systems </li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section23" aria-hidden="true"> <label for="collapse-section23" aria-hidden="true">V4.0.0 / 17-March-2025</label>
|
||||
<div>
|
||||
<h2 id="main-changes-1">Main Changes</h2>
|
||||
<ul>
|
||||
<li>ST25R500/ST25R300 support added</li>
|
||||
<li>ISO-DEP improved. Fixed SFGI usage in Listen mode, ISO-DEP FSD check in Reader mode</li>
|
||||
<li>Improved robustness for EMD handling on high latency systems</li>
|
||||
<li>Improve portability using uintptr_t (C99)</li>
|
||||
<li>Added support for Direct Command chaining</li>
|
||||
<li>Several improvements on Card Detection and Heartbeat</li>
|
||||
<li>DPO module extended. Configurable measurement and adjust methods, interfaces and new adjustment flag added.</li>
|
||||
<li>DPO CR (Current Regulation) added (ST25R500 only)</li>
|
||||
<li>Added Dynamic LMA module. Optional LMA adjustments can be used in Listen/CE mode</li>
|
||||
<li>Several new APIs added in rfalChip section for more measurments and adjustments</li>
|
||||
<li>New RFAL_CMATH switch added to enable the usage of C mathematical operations - previously RFAL_ACCURATE_RSSI</li>
|
||||
<li>Removed obsolete compile switches</li>
|
||||
<li>New timer API to retrieve remaining time</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section22" aria-hidden="true"> <label for="collapse-section22" aria-hidden="true">V3.0.1 / 12-September-2024</label>
|
||||
<div>
|
||||
<h2 id="main-changes-2">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed condition that prevents usage of WU default parameters on ST25R3916 (not ST25R3916B) if AAT enabled</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section21" aria-hidden="true"> <label for="collapse-section21" aria-hidden="true">V3.0.0 / 10-June-2024</label>
|
||||
<div>
|
||||
<h2 id="main-changes-3">Main Changes</h2>
|
||||
<ul>
|
||||
<li>ST25R200/ST25R100 support added</li>
|
||||
<li>Changed rfalDeinitialize procedure to ensure ST25R is set in PD mode</li>
|
||||
<li>Added new interface to check whether Wake-up mode is enabled</li>
|
||||
<li>Extended NFC/HL to allow to configure whether to poll ahead of going to wake-up mode</li>
|
||||
<li>Improved ISO-DEP buffer handling during Listen mode activation</li>
|
||||
<li>Improved RFAL NFC/HL layer handling during discovery, particularly for AP2P</li>
|
||||
<li>DPO extended to allow adjustment without a communication mode previously set</li>
|
||||
<li>Updated ST25R3916 to ensure MOSI state during read operation</li>
|
||||
<li>Extended MISRA C / CERT C coverage to DPO and CD modules</li>
|
||||
<li>Introduced WLC WPT API declarations</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section20" aria-hidden="true"> <label for="collapse-section20" aria-hidden="true">V2.10.0 / 16-February-2024</label>
|
||||
<div>
|
||||
<h2 id="main-changes-4">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Feature switches no longer disabled by omission. User configs at rfal_platform.h or by default by rfal_defConfig.h</li>
|
||||
<li>Ensure ST25R3916B AWS is disabled during regulator adjustment</li>
|
||||
<li>Extended WU mode to allow the reference measurement to be obtained from WU/PD mode (ST25R3911 and ST25R3916)</li>
|
||||
<li>Extended NFC/HL to allow to configure whether to poll ahead of going to wake-up mode</li>
|
||||
<li>Changed NFC/HL to only initialize Analog Configuration if not yet performed</li>
|
||||
<li>Added new interface to check if Wake-up mode is enabled</li>
|
||||
<li>Extended LED support for debug purposes</li>
|
||||
<li>ISO-DEP extended to ensure NFC-B TR2 / FDT Poll</li>
|
||||
<li>Updated DID handling in ISO-DEP</li>
|
||||
<li>Added Listen mode modulation Get and Set interfaces</li>
|
||||
<li>Introduced Listen mode External Field On callback</li>
|
||||
<li>ST25TB UID integrity checked during Pcall16 anticollision</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section19" aria-hidden="true"> <label for="collapse-section19" aria-hidden="true">V2.8.0 / 14-December-2022</label>
|
||||
<div>
|
||||
<h2 id="main-changes-5">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Incorporated RFAL dependecies (utils, errno) into library to make library more self-contained</li>
|
||||
<li>Prepended RFAL prefix into user configuration file platform.h --> rfal_platform.h (breaks compatibility with previous versions, see example in rfal.chm))</li>
|
||||
<li>Introduced default configuration rfal_defConfig.h
|
||||
<li>Improved ISO-DEP Deselect sequence</li>
|
||||
<li>Changed the RFAL NFC/HL layer to make use of non blocking ISO-DEP Deselect procedure</li>
|
||||
<li>Several improvements and fixes on RFAL NFC/HL layer, including deactivation procedure and compliance mode used for ISO-DEP</li>
|
||||
<li>Extended ISO15693 anticollsion APIs to allow larger receptions</li>
|
||||
<li>Improved library error checking and portability</li>
|
||||
<li>New APIs introduced in rfalChip interface</li>
|
||||
<li>Extended rfalLowPowerModeStart to receive a mode to be set</li>
|
||||
<li>Added RFAL Card Detection/Protection module</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section18" aria-hidden="true"> <label for="collapse-section18" aria-hidden="true">V2.6.0 / 19-January-2022</label>
|
||||
<div>
|
||||
<h2 id="main-changes-6">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Introduced support for ST25R3916B</li>
|
||||
<li>Extended NFC technology modules with non-blocking APIs for card activation (Technology detection, Collision Resolution and Activation)</li>
|
||||
<li>Extended NFC/HL module with option to bail out, deactivation types, and usage of new non-blocking APIs</li>
|
||||
<li>Added new transceive flag for CRC check on Rx</li>
|
||||
<li>Better aligned NFC-V special frame timings to NFC Forum Digital</li>
|
||||
<li>Further improved compliance to CERT C</li>
|
||||
<li>Corrected PAD length in SENSF_RES</li>
|
||||
<li>Modified Field Detector to manual setting for RF Collision avoidance / Field On (ST25R3916) due to high temperature limitation</li>
|
||||
<li>Changed default Field On mechanism from RF Collision avoidance to transmitter enable (ST25R3911) due to high temperature limitation</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section17" aria-hidden="true"> <label for="collapse-section17" aria-hidden="true">V2.4.0 / 14-June-2021</label>
|
||||
<div>
|
||||
<h2 id="main-changes-7">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Aligned to NFC Forum CR12</li>
|
||||
<li>EMD error handling simplified/renamed</li>
|
||||
<li>SW license disclaimer updated</li>
|
||||
<li>Added ST25R device selection check</li>
|
||||
<li>Improved SPI initialization sequence</li>
|
||||
<li>Modified certain chip specific features/definitions</li>
|
||||
<li>Added API for retrieving Wake-up status</li>
|
||||
<li>Extended available parameters on NFC/HL module</li>
|
||||
<li>Introduced support for proprietary NFC technology on NFC/HL module</li>
|
||||
<li>Introduced Transceive start synchronization callback</li>
|
||||
<li>Extended support for non-blocking activation</li>
|
||||
<li>Extended ST25R3916 SW Tag Detection with fractional delta option</li>
|
||||
<li>Improved compliance to CERT C</li>
|
||||
<li>Added handling for ST25R3916 PPON2 timer limitation</li>
|
||||
<li>Several driver improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section16" aria-hidden="true"> <label for="collapse-section16" aria-hidden="true">V2.2.0 / 22-May-2020</label>
|
||||
<div>
|
||||
<h2 id="main-changes-8">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Better alignment to NFC Forum latest requirements (CR12)</li>
|
||||
<li>Extended NFC-V module with non-addressed mode support and improved aticollision</li>
|
||||
<li>Feature Switches changed to be not mandatory. Modules disabled by default</li>
|
||||
<li>Aligned APIs on platform.h (breaks compatibility with previous versions, see example in rfal.chm)</li>
|
||||
<li>Added API for release/deletion of timers</li>
|
||||
<li>ST25R3916 default analog table modified to X-NUCLEO-NFC12A1 board</li>
|
||||
<li>Improved AP2P operation</li>
|
||||
<li>Fixed issues introduced on previous release linked to SFGT and anticollision retries</li>
|
||||
<li>Introduced Low-Power mode</li>
|
||||
<li>Several driver improvements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section15" aria-hidden="true"> <label for="collapse-section15" aria-hidden="true">V2.1.2 / 27-January-2020</label>
|
||||
<div>
|
||||
<h2 id="main-changes-9">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Extended ISO-DEP and NFC-A module to support non-blocking activation interfaces</li>
|
||||
<li>Extended NFC/HL module to make use of the new APIs further splitting the execution of the worker during the different activities</li>
|
||||
<li>Modified NFC-A anticollision to strictly comply to NFC Forum DP. A separate proprietary method is now available.</li>
|
||||
<li>NFC-V changed to use OOK (100% AM) by default</li>
|
||||
<li>Fixed FWT used by NFC-V Sleep</li>
|
||||
<li>Fixed NFC-F FDT Poll value</li>
|
||||
<li>Fixed incorrect register access on ST25R3911B RFO Get/Set method</li>
|
||||
<li>SPI driver modified to clear Rx buffer prior to operation</li>
|
||||
<li>Added further code size optimizations based on enabled features</li>
|
||||
<li>Updated ST25R3916 driver to DS Rev2</li>
|
||||
<li>Updated SW Tag Detection as describded in AN Rev3</li>
|
||||
<li>Several driver improvements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section14" aria-hidden="true"> <label for="collapse-section14" aria-hidden="true">V2.1.0 / 30-September-2019</label>
|
||||
<div>
|
||||
<h2 id="main-changes-10">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Extended RFAL NFC Higher Layer for increased functionality and configurations</li>
|
||||
<li>Several improvements on the ISO-DEP protocol layer</li>
|
||||
<li>Protocol buffer sizes made fully configurable for increased memory management</li>
|
||||
<li>Introduced option for Collision Avoidance with Automatic Gain Control</li>
|
||||
<li>Several driver improvements</li>
|
||||
<li>ST25R3916 overheat protection disabled</li>
|
||||
<li>RF Transceive modified for transmission errors to precede other errors</li>
|
||||
<li>Analog Configs extended to support different DPO power levels</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section13" aria-hidden="true"> <label for="collapse-section13" aria-hidden="true">V2.0.10 / 25-June-2019</label>
|
||||
<div>
|
||||
<h2 id="main-changes-11">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Various improvements on RFAL NFC Higher layer</li>
|
||||
<li>Added alternative NFC-V anticollision method (non NFC Forum compliant)</li>
|
||||
<li>Several minor improvements and fixes</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section12" aria-hidden="true"> <label for="collapse-section12" aria-hidden="true">V2.0.6 / 10-April-2019</label>
|
||||
<div>
|
||||
<h2 id="main-changes-12">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Several NFC-V interoperability improvements</li>
|
||||
<li>Extended support for specific features of ST's ISO15693 Tags. New ST25Dx module added</li>
|
||||
<li>Interrupt handling changed and further protection added</li>
|
||||
<li>RFAL feature switches have been modified and features are now disabled if omitted</li>
|
||||
<li>ST25R3916 AAT (Automatic Antenna Tunning) module added</li>
|
||||
<li>RFAL NFC Higher layer added</li>
|
||||
<li>Several driver improvements</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section11" aria-hidden="true"> <label for="collapse-section11" aria-hidden="true">V2.0.4 / 06-February-2019</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3916-disco-v1.0.0-emvco-v1.2.0">Provided with ST25R3916 DISCO v1.0.0 / EMVCo v1.2.0</h2>
|
||||
<h2 id="main-changes-13">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Minor improvements on NFC-F module</li>
|
||||
<li>Several improvements on NFC-V module including support for ST proprietary features</li>
|
||||
<li>Fixed issue with Delta RWT calculation</li>
|
||||
<li>Fixed incorrect usage of NFCB dTbPoll / DdFWT</li>
|
||||
<li>Added compile switch for Listen Mode</li>
|
||||
<li>Low power Listen Mode support added</li>
|
||||
<li>Listen Mode aligned to NFC Forum Digital 2.1</li>
|
||||
<li>Added handling for EMVCo 3.0 static FDTListen</li>
|
||||
<li>Introduced SW Tag Detection</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section10" aria-hidden="true"> <label for="collapse-section10" aria-hidden="true">V2.0.2 / 31-October-2018</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3916-disco-v0.9.4-binary-only">Provided with ST25R3916 DISCO v0.9.4 (binary only)</h2>
|
||||
<h2 id="main-changes-14">Main Changes</h2>
|
||||
<ul>
|
||||
<li>New T4T module added</li>
|
||||
<li>Added support for T3T Check and Update commands</li>
|
||||
<li>Improved NFC-V module and added Write Multiple Blocks support</li>
|
||||
<li>New rfalWorker protection added for improved control in multi-thread environments</li>
|
||||
<li>Added support for user defined Analog Config tables</li>
|
||||
<li>Several driver improvements and protections added</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section9" aria-hidden="true"> <label for="collapse-section9" aria-hidden="true">V2.0.0 / 28-August-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-15">Main Changes</h2>
|
||||
<ul>
|
||||
<li>MISRA C 2012 compliant</li>
|
||||
<li>ST25R3916 support added</li>
|
||||
<li>ST25R95 support added</li>
|
||||
<li>Fix unwanted Field Detector disable when entering Wake-up mode</li>
|
||||
<li>Extended Analog Config to have specific events</li>
|
||||
<li>Fixed NFC-DEP potential issue if DID used</li>
|
||||
<li>Extended NFC-V commands</li>
|
||||
<li>T2T module added</li>
|
||||
<li>Improved initial Listen mode handling</li>
|
||||
<li>Extended Wake-Up mode to support Capacitive measurement</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section8" aria-hidden="true"> <label for="collapse-section8" aria-hidden="true">V1.3.6 / 08-May-2018</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-disco-v1.2.0">Provided with ST25R3911B DISCO v1.2.0</h2>
|
||||
<h2 id="main-changes-16">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed NFC-V Read operation in addressed mode</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section7" aria-hidden="true"> <label for="collapse-section7" aria-hidden="true">V1.3.4 / 07-May-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-17">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Fixed NFC-V Read operation in addressed mode</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section6" aria-hidden="true"> <label for="collapse-section6" aria-hidden="true">V1.3.2 / 31-January-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-18">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Modified Wake-Up mode interface</li>
|
||||
<li>Fixed SFGI calculation in ISO-DEP</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section5" aria-hidden="true"> <label for="collapse-section5" aria-hidden="true">V1.3.0 / 22-January-2018</label>
|
||||
<div>
|
||||
<h2 id="main-changes-19">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Introduced a new IRQ status handling to read the registers only once</li>
|
||||
<li>Several changes for supporting Linux platform</li>
|
||||
<li>SPI Select/Deselect moved to platform.h</li>
|
||||
<li>Aditional protection of the IRQ status reading, new macros available: platformProtectST25R391xIrqStatus / platformUnprotectST25R391xIrqStatus</li>
|
||||
<li>Renamed the IRQ Enable/Disable macros to platformProtectST25R391xComm / platformUnprotectST25R391xComm</li>
|
||||
<li>Renamed SPI pins from chip specific to ST25R391X</li>
|
||||
<li>Introduced a new option ST25R391X_COM_SINGLETXRX which executes SPI in one single exchange (additional buffer required)</li>
|
||||
<li>Updated and added errata handlings to latest ST25R3911 Errata version</li>
|
||||
<li>Fixed inconsitency on Analog settings for NFC-V</li>
|
||||
<li>Fixed issue on NFC-V 1of256 decoding</li>
|
||||
<li>Changed the default NFC-A FDT Listen to be more strict</li>
|
||||
<li>Added Wake-Up mode support</li>
|
||||
<li>Added RFAL version definition</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section4" aria-hidden="true"> <label for="collapse-section4" aria-hidden="true">V1.2.0 / 17-August-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-disco-v1.1.16">Provided with ST25R3911B DISCO v1.1.16</h2>
|
||||
<h2 id="main-changes-20">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Aligned Technology modules to NFC Activity v1.1 and EMVCo v2.6</li>
|
||||
<li>Extended NFC-B Collision Resolution allowing user define Slots</li>
|
||||
<li>Added feature switches to enable/disable individual modules</li>
|
||||
<li>ISO-DEP Interface changes allowing more user configurations and further EMVCo alignment</li>
|
||||
<li>Changed ST25TB detection to always perform Anti Collision loop regardeless of the result of the Poll</li>
|
||||
<li>Fixed FIFO WL handling</li>
|
||||
<li>Modified FDT Poll handling</li>
|
||||
<li>Changed rfalCalibrate() to not overwrite dynamic configs</li>
|
||||
<li>Added adjustment for TR1PUTMIN</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section3" aria-hidden="true"> <label for="collapse-section3" aria-hidden="true">V1.1.0 / 30-June-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-disco-v1.1.12">Provided with ST25R3911B DISCO v1.1.12</h2>
|
||||
<h2 id="main-changes-21">Main Changes</h2>
|
||||
<ul>
|
||||
<li>EMD supression enabled for ST25R3911B</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section2" aria-hidden="true"> <label for="collapse-section2" aria-hidden="true">V1.0.0 / 16-May-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-x-nucleo-nfc05a1-v1.0.0">Provided with X-NUCLEO-NFC05A1 v1.0.0</h2>
|
||||
<h2 id="main-changes-22">Main Changes</h2>
|
||||
<ul>
|
||||
<li>Added support for B', CTS and PicoPass/iClass mode</li>
|
||||
<li>Several impromvements for NFC-V mode</li>
|
||||
<li>Improved error detection during NFC-B collision resolution</li>
|
||||
<li>Extended T1T module</li>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
<div class="collapse">
|
||||
<input type="checkbox" id="collapse-section1" aria-hidden="true"> <label for="collapse-section1" aria-hidden="true">V0.9.0 / 02-March-2017</label>
|
||||
<div>
|
||||
<h2 id="provided-with-st25r3911b-discovery-kit-on-embedded-world-conference-binary-only">Provided with ST25R3911B Discovery Kit on Embedded World Conference (binary only)</h2>
|
||||
<h2 id="main-changes-23">Main Changes</h2>
|
||||
</div>
|
||||
</div>
|
||||
<footer class="sticky">
|
||||
<p>For complete documentation on <strong>STM32</strong> microcontrollers please visit: <a href="https://www.st.com/en/microcontrollers-microprocessors.html">www.st.com</a></p>
|
||||
This release note uses up to date web standards and, for this reason, should not be opened with Internet Explorer but preferably with popular browsers such as Google Chrome, Mozilla Firefox, Opera or Microsoft Edge.
|
||||
</footer>
|
||||
</body>
|
||||
</html>
|
||||
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 22 KiB |
Binary file not shown.
Reference in New Issue
Block a user