389ff92cc1
* Makefile, Scripts: new linter * About: remove ID from IC * Firmware: remove double define for DIVC/DIVR * Scripts: check folder names too. Docker: replace syntax check with make lint. * Reformat Sources and Migrate to new file naming convention * Docker: symlink clang-format-12 to clang-format * Add coding style guide
404 lines
16 KiB
C
404 lines
16 KiB
C
|
|
/******************************************************************************
|
|
* \attention
|
|
*
|
|
* <h2><center>© COPYRIGHT 2020 STMicroelectronics</center></h2>
|
|
*
|
|
* Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
|
|
* You may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at:
|
|
*
|
|
* www.st.com/myliberty
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
|
|
* AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*
|
|
******************************************************************************/
|
|
|
|
/*
|
|
* PROJECT: ST25R391x firmware
|
|
* Revision:
|
|
* LANGUAGE: ISO C99
|
|
*/
|
|
|
|
/*! \file rfal_nfcf.h
|
|
*
|
|
* \author Gustavo Patricio
|
|
*
|
|
* \brief 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)
|
|
*
|
|
*
|
|
* \addtogroup RFAL
|
|
* @{
|
|
*
|
|
* \addtogroup RFAL-AL
|
|
* \brief RFAL Abstraction Layer
|
|
* @{
|
|
*
|
|
* \addtogroup NFC-F
|
|
* \brief RFAL NFC-F Module
|
|
* @{
|
|
*
|
|
*/
|
|
|
|
#ifndef RFAL_NFCF_H
|
|
#define RFAL_NFCF_H
|
|
|
|
/*
|
|
******************************************************************************
|
|
* INCLUDES
|
|
******************************************************************************
|
|
*/
|
|
#include "platform.h"
|
|
#include "st_errno.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 2U /*!< 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_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 1.0 6.6.1.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_LEN \
|
|
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 */
|
|
|
|
/*! 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 ERR_WRONG_STATE : RFAL not initialized or mode not set
|
|
* \return ERR_PARAM : Incorrect bitrate
|
|
* \return 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 ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
|
* \return ERR_PARAM : Invalid parameters
|
|
* \return ERR_IO : Generic internal error
|
|
* \return ERR_CRC : CRC error detected
|
|
* \return ERR_FRAMING : Framing error detected
|
|
* \return ERR_PROTO : Protocol error detected
|
|
* \return ERR_TIMEOUT : Timeout error, no listener device detected
|
|
* \return ERR_NONE : No error and some NFC-F device was detected
|
|
*
|
|
*****************************************************************************
|
|
*/
|
|
ReturnCode rfalNfcfPollerCheckPresence(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 ERR_WRONG_STATE : RFAL not initialized or incorrect mode
|
|
* \return ERR_PARAM : Invalid parameters
|
|
* \return ERR_IO : Generic internal error
|
|
* \return ERR_CRC : CRC error detected
|
|
* \return ERR_FRAMING : Framing error detected
|
|
* \return ERR_PROTO : Protocol error detected
|
|
* \return ERR_TIMEOUT : Timeout error, no listener device detected
|
|
* \return 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
|
|
*
|
|
* \return ERR_WRONG_STATE : RFAL not initialized or mode not set
|
|
* \return ERR_PARAM : Invalid parameters
|
|
* \return ERR_IO : Generic internal error
|
|
* \return ERR_NONE : No error
|
|
*****************************************************************************
|
|
*/
|
|
ReturnCode rfalNfcfPollerCollisionResolution(
|
|
rfalComplianceMode compMode,
|
|
uint8_t devLimit,
|
|
rfalNfcfListenDevice* nfcfDevList,
|
|
uint8_t* devCnt);
|
|
|
|
/*!
|
|
*****************************************************************************
|
|
* \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 ERR_WRONG_STATE : RFAL not initialized or mode not set
|
|
* \return ERR_PARAM : Invalid parameters
|
|
* \return ERR_IO : Generic internal error
|
|
* \return ERR_REQUEST : The request was executed with error
|
|
* \return 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 ERR_WRONG_STATE : RFAL not initialized or mode not set
|
|
* \return ERR_PARAM : Invalid parameters
|
|
* \return ERR_IO : Generic internal error
|
|
* \return ERR_REQUEST : The request was executed with error
|
|
* \return 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 */
|
|
|
|
/**
|
|
* @}
|
|
*
|
|
* @}
|
|
*
|
|
* @}
|
|
*/
|