 389ff92cc1
			
		
	
	
		389ff92cc1
		
			
		
	
	
	
	
		
			
			* Makefile, Scripts: new linter * About: remove ID from IC * Firmware: remove double define for DIVC/DIVR * Scripts: check folder names too. Docker: replace syntax check with make lint. * Reformat Sources and Migrate to new file naming convention * Docker: symlink clang-format-12 to clang-format * Add coding style guide
		
			
				
	
	
		
			520 lines
		
	
	
		
			18 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			520 lines
		
	
	
		
			18 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_nfcb.c
 | |
|  *
 | |
|  *  \author Gustavo Patricio
 | |
|  *
 | |
|  *  \brief Implementation of NFC-B (ISO14443B) helpers 
 | |
|  *
 | |
|  */
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * INCLUDES
 | |
|  ******************************************************************************
 | |
|  */
 | |
| #include "rfal_nfcb.h"
 | |
| #include "utils.h"
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * ENABLE SWITCH
 | |
|  ******************************************************************************
 | |
|  */
 | |
| 
 | |
| #ifndef RFAL_FEATURE_NFCB
 | |
| #define RFAL_FEATURE_NFCB false /* NFC-B module configuration missing. Disabled by default */
 | |
| #endif
 | |
| 
 | |
| #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        */
 | |
| };
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * 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     */
 | |
| } rfalNfcb;
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * LOCAL FUNCTION PROTOTYPES
 | |
| ******************************************************************************
 | |
| */
 | |
| static ReturnCode rfalNfcbCheckSensbRes(const rfalNfcbSensbRes* sensbRes, uint8_t sensbResLen);
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * 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 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 ERR_PROTO;
 | |
|     }
 | |
|     return ERR_NONE;
 | |
| }
 | |
| 
 | |
| /*
 | |
| ******************************************************************************
 | |
| * GLOBAL FUNCTIONS
 | |
| ******************************************************************************
 | |
| */
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalNfcbPollerInitialize(void) {
 | |
|     ReturnCode ret;
 | |
| 
 | |
|     EXIT_ON_ERR(ret, rfalSetMode(RFAL_MODE_POLL_NFCB, RFAL_BR_106, RFAL_BR_106));
 | |
|     rfalSetErrorHandling(RFAL_ERRORHANDLING_NFC);
 | |
| 
 | |
|     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 ERR_NONE;
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalNfcbPollerInitializeWithParams(uint8_t AFI, uint8_t PARAM) {
 | |
|     ReturnCode ret;
 | |
| 
 | |
|     EXIT_ON_ERR(ret, rfalNfcbPollerInitialize());
 | |
| 
 | |
|     gRfalNfcb.AFI = AFI;
 | |
|     gRfalNfcb.PARAM = (PARAM & RFAL_NFCB_SENSB_REQ_PARAM);
 | |
| 
 | |
|     return ERR_NONE;
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalNfcbPollerCheckPresence(
 | |
|     rfalNfcbSensCmd cmd,
 | |
|     rfalNfcbSlots slots,
 | |
|     rfalNfcbSensbRes* sensbRes,
 | |
|     uint8_t* sensbResLen) {
 | |
|     uint16_t rxLen;
 | |
|     ReturnCode ret;
 | |
|     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 ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     *sensbResLen = 0;
 | |
|     ST_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);
 | |
| 
 | |
|     /* Send SENSB_REQ and disable AGC to detect collisions */
 | |
|     ret = rfalTransceiveBlockingTxRx(
 | |
|         (uint8_t*)&sensbReq,
 | |
|         sizeof(rfalNfcbSensbReq),
 | |
|         (uint8_t*)sensbRes,
 | |
|         sizeof(rfalNfcbSensbRes),
 | |
|         &rxLen,
 | |
|         RFAL_TXRX_FLAGS_DEFAULT,
 | |
|         RFAL_NFCB_FWTSENSB);
 | |
| 
 | |
|     *sensbResLen = (uint8_t)rxLen;
 | |
| 
 | |
|     /*  Check if a transmission error was detected */
 | |
|     if((ret == ERR_CRC) || (ret == ERR_FRAMING)) {
 | |
|         /* Invalidate received frame as an error was detected (CollisionResolution checks if valid) */
 | |
|         *sensbResLen = 0;
 | |
|         return ERR_NONE;
 | |
|     }
 | |
| 
 | |
|     if(ret == ERR_NONE) {
 | |
|         return rfalNfcbCheckSensbRes(sensbRes, *sensbResLen);
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalNfcbPollerSleep(const uint8_t* nfcid0) {
 | |
|     uint16_t rxLen;
 | |
|     ReturnCode ret;
 | |
|     rfalNfcbSlpbReq slpbReq;
 | |
|     rfalNfcbSlpbRes slpbRes;
 | |
| 
 | |
|     if(nfcid0 == NULL) {
 | |
|         return ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     /* Compute SLPB_REQ */
 | |
|     slpbReq.cmd = RFAL_NFCB_CMD_SLPB_REQ;
 | |
|     ST_MEMCPY(slpbReq.nfcid0, nfcid0, RFAL_NFCB_NFCID0_LEN);
 | |
| 
 | |
|     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 ERR_PROTO;
 | |
|     }
 | |
|     return ERR_NONE;
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode
 | |
|     rfalNfcbPollerSlotMarker(uint8_t slotCode, rfalNfcbSensbRes* sensbRes, uint8_t* sensbResLen) {
 | |
|     ReturnCode ret;
 | |
|     rfalNfcbSlotMarker slotMarker;
 | |
|     uint16_t rxLen;
 | |
| 
 | |
|     /* Check parameters */
 | |
|     if((sensbRes == NULL) || (sensbResLen == NULL) ||
 | |
|        (slotCode < RFAL_NFCB_SLOTMARKER_SLOTCODE_MIN) ||
 | |
|        (slotCode > RFAL_NFCB_SLOTMARKER_SLOTCODE_MAX)) {
 | |
|         return 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);
 | |
| 
 | |
|     ret = rfalTransceiveBlockingTxRx(
 | |
|         (uint8_t*)&slotMarker,
 | |
|         sizeof(rfalNfcbSlotMarker),
 | |
|         (uint8_t*)sensbRes,
 | |
|         sizeof(rfalNfcbSensbRes),
 | |
|         &rxLen,
 | |
|         RFAL_TXRX_FLAGS_DEFAULT,
 | |
|         RFAL_NFCB_ACTIVATION_FWT);
 | |
| 
 | |
|     *sensbResLen = (uint8_t)rxLen;
 | |
| 
 | |
|     /* Check if a transmission error was detected */
 | |
|     if((ret == ERR_CRC) || (ret == ERR_FRAMING)) {
 | |
|         return ERR_RF_COLLISION;
 | |
|     }
 | |
| 
 | |
|     if(ret == ERR_NONE) {
 | |
|         return rfalNfcbCheckSensbRes(sensbRes, *sensbResLen);
 | |
|     }
 | |
| 
 | |
|     return ret;
 | |
| }
 | |
| 
 | |
| ReturnCode rfalNfcbPollerTechnologyDetection(
 | |
|     rfalComplianceMode compMode,
 | |
|     rfalNfcbSensbRes* sensbRes,
 | |
|     uint8_t* sensbResLen) {
 | |
|     NO_WARNING(compMode);
 | |
| 
 | |
|     return rfalNfcbPollerCheckPresence(
 | |
|         RFAL_NFCB_SENS_CMD_SENSB_REQ, RFAL_NFCB_SLOT_NUM_1, sensbRes, sensbResLen);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalNfcbPollerCollisionResolution(
 | |
|     rfalComplianceMode compMode,
 | |
|     uint8_t devLimit,
 | |
|     rfalNfcbListenDevice* nfcbDevList,
 | |
|     uint8_t* devCnt) {
 | |
|     bool colPending; /* dummy */
 | |
|     return rfalNfcbPollerSlottedCollisionResolution(
 | |
|         compMode,
 | |
|         devLimit,
 | |
|         RFAL_NFCB_SLOT_NUM_1,
 | |
|         RFAL_NFCB_SLOT_NUM_16,
 | |
|         nfcbDevList,
 | |
|         devCnt,
 | |
|         &colPending);
 | |
| }
 | |
| 
 | |
| /*******************************************************************************/
 | |
| ReturnCode rfalNfcbPollerSlottedCollisionResolution(
 | |
|     rfalComplianceMode compMode,
 | |
|     uint8_t devLimit,
 | |
|     rfalNfcbSlots initSlots,
 | |
|     rfalNfcbSlots endSlots,
 | |
|     rfalNfcbListenDevice* nfcbDevList,
 | |
|     uint8_t* devCnt,
 | |
|     bool* colPending) {
 | |
|     ReturnCode ret;
 | |
|     uint8_t slotsNum;
 | |
|     uint8_t slotCode;
 | |
|     uint8_t curDevCnt;
 | |
| 
 | |
|     /* 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 ERR_PARAM;
 | |
|     }
 | |
| 
 | |
|     /* Initialise as no error in case Activity 1.0 where the previous SENSB_RES from technology detection should be used */
 | |
|     ret = ERR_NONE;
 | |
|     *devCnt = 0;
 | |
|     curDevCnt = 0;
 | |
|     *colPending = false;
 | |
| 
 | |
|     /* Send ALLB_REQ   Activity 1.1   9.3.5.2 and 9.3.5.3  (Symbol 1 and 2) */
 | |
|     if(compMode != RFAL_COMPLIANCE_MODE_ISO) {
 | |
|         ret = rfalNfcbPollerCheckPresence(
 | |
|             RFAL_NFCB_SENS_CMD_ALLB_REQ,
 | |
|             initSlots,
 | |
|             &nfcbDevList->sensbRes,
 | |
|             &nfcbDevList->sensbResLen);
 | |
|         if((ret != ERR_NONE) && (initSlots == RFAL_NFCB_SLOT_NUM_1)) {
 | |
|             return ret;
 | |
|         }
 | |
|     }
 | |
| 
 | |
|     /* Check if there was a transmission error on WUPB  EMVCo 2.6  9.3.3.1 */
 | |
|     if((compMode == RFAL_COMPLIANCE_MODE_EMV) && (nfcbDevList->sensbResLen == 0U)) {
 | |
|         return ERR_FRAMING;
 | |
|     }
 | |
| 
 | |
|     for(slotsNum = (uint8_t)initSlots; slotsNum <= (uint8_t)endSlots; slotsNum++) {
 | |
|         do {
 | |
|             /* Activity 1.1  9.3.5.23  -  Symbol 22 */
 | |
|             if((compMode == RFAL_COMPLIANCE_MODE_NFC) && (curDevCnt != 0U)) {
 | |
|                 rfalNfcbPollerSleep(nfcbDevList[((*devCnt) - (uint8_t)1U)].sensbRes.nfcid0);
 | |
|                 nfcbDevList[((*devCnt) - (uint8_t)1U)].isSleep = true;
 | |
|             }
 | |
| 
 | |
|             /* Send SENSB_REQ with number of slots if not the first Activity 1.1  9.3.5.24  -  Symbol 23 */
 | |
|             if((slotsNum != (uint8_t)initSlots) || *colPending) {
 | |
|                 /* PRQA S 4342 1 # MISRA 10.5 - Layout of rfalNfcbSlots and above loop guarantee that no invalid enum values are created. */
 | |
|                 ret = rfalNfcbPollerCheckPresence(
 | |
|                     RFAL_NFCB_SENS_CMD_SENSB_REQ,
 | |
|                     (rfalNfcbSlots)slotsNum,
 | |
|                     &nfcbDevList[*devCnt].sensbRes,
 | |
|                     &nfcbDevList[*devCnt].sensbResLen);
 | |
|             }
 | |
| 
 | |
|             /* Activity 1.1  9.3.5.6  -  Symbol 5 */
 | |
|             slotCode = 0;
 | |
|             curDevCnt = 0;
 | |
|             *colPending = false;
 | |
| 
 | |
|             do {
 | |
|                 /* Activity 1.1  9.3.5.26  -  Symbol 25 */
 | |
|                 if(slotCode != 0U) {
 | |
|                     ret = rfalNfcbPollerSlotMarker(
 | |
|                         slotCode,
 | |
|                         &nfcbDevList[*devCnt].sensbRes,
 | |
|                         &nfcbDevList[*devCnt].sensbResLen);
 | |
|                 }
 | |
| 
 | |
|                 /* Activity 1.1  9.3.5.7 and 9.3.5.8  -  Symbol 6 */
 | |
|                 if(ret != ERR_TIMEOUT) {
 | |
|                     /* Activity 1.1  9.3.5.8  -  Symbol 7 */
 | |
|                     if((rfalNfcbCheckSensbRes(
 | |
|                             &nfcbDevList[*devCnt].sensbRes, nfcbDevList[*devCnt].sensbResLen) ==
 | |
|                         ERR_NONE) &&
 | |
|                        (ret == ERR_NONE)) {
 | |
|                         nfcbDevList[*devCnt].isSleep = false;
 | |
| 
 | |
|                         if(compMode == RFAL_COMPLIANCE_MODE_EMV) {
 | |
|                             (*devCnt)++;
 | |
|                             return ret;
 | |
|                         } else if(compMode == RFAL_COMPLIANCE_MODE_ISO) {
 | |
|                             /* Activity 1.0  9.3.5.8  -  Symbol 7 */
 | |
|                             (*devCnt)++;
 | |
|                             curDevCnt++;
 | |
| 
 | |
|                             /* Activity 1.0  9.3.5.10  -  Symbol 9 */
 | |
|                             if((*devCnt >= devLimit) ||
 | |
|                                (slotsNum == (uint8_t)RFAL_NFCB_SLOT_NUM_1)) {
 | |
|                                 return ret;
 | |
|                             }
 | |
| 
 | |
|                             /* Activity 1.0  9.3.5.11  -  Symbol 10 */
 | |
|                             rfalNfcbPollerSleep(nfcbDevList[*devCnt - 1U].sensbRes.nfcid0);
 | |
|                             nfcbDevList[*devCnt - 1U].isSleep = true;
 | |
|                         } else if(compMode == RFAL_COMPLIANCE_MODE_NFC) {
 | |
|                             /* Activity 1.1  9.3.5.10 and 9.3.5.11  -  Symbol 9 and Symbol 11*/
 | |
|                             if(curDevCnt != 0U) {
 | |
|                                 rfalNfcbPollerSleep(
 | |
|                                     nfcbDevList[(*devCnt) - (uint8_t)1U].sensbRes.nfcid0);
 | |
|                                 nfcbDevList[(*devCnt) - (uint8_t)1U].isSleep = true;
 | |
|                             }
 | |
| 
 | |
|                             /* Activity 1.1  9.3.5.12  -  Symbol 11 */
 | |
|                             (*devCnt)++;
 | |
|                             curDevCnt++;
 | |
| 
 | |
|                             /* Activity 1.1  9.3.5.6  -  Symbol 13 */
 | |
|                             if((*devCnt >= devLimit) ||
 | |
|                                (slotsNum == (uint8_t)RFAL_NFCB_SLOT_NUM_1)) {
 | |
|                                 return ret;
 | |
|                             }
 | |
|                         } 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((devLimit == 0U) && (slotsNum == (uint8_t)RFAL_NFCB_SLOT_NUM_1)) {
 | |
|                             return ERR_RF_COLLISION;
 | |
|                         }
 | |
| 
 | |
|                         /* Activity 1.1  9.3.5.9  -  Symbol 8 */
 | |
|                         *colPending = true;
 | |
|                     }
 | |
|                 }
 | |
| 
 | |
|                 /* Activity 1.1  9.3.5.15  -  Symbol 14 */
 | |
|                 slotCode++;
 | |
|             } while(slotCode < rfalNfcbNI2NumberOfSlots(slotsNum));
 | |
| 
 | |
|             /* Activity 1.1  9.3.5.17  -  Symbol 16 */
 | |
|             if(!(*colPending)) {
 | |
|                 return ERR_NONE;
 | |
|             }
 | |
| 
 | |
|             /* Activity 1.1  9.3.5.18  -  Symbol 17 */
 | |
|         } while(
 | |
|             curDevCnt !=
 | |
|             0U); /* If a collision is detected and card(s) were found on this loop keep the same number of available slots */
 | |
|     }
 | |
| 
 | |
|     return 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[] = {1792, 3328, 5376, 9472};
 | |
|     /*******************************************************************************/
 | |
| 
 | |
|     return rfalNfcbTr2Table[(tr2Code & RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK)];
 | |
| }
 | |
| 
 | |
| #endif /* RFAL_FEATURE_NFCB */
 |