Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
rfal_nfcb.cpp
00001 00002 /****************************************************************************** 00003 * @attention 00004 * 00005 * <h2><center>© COPYRIGHT 2016 STMicroelectronics</center></h2> 00006 * 00007 * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License"); 00008 * You may not use this file except in compliance with the License. 00009 * You may obtain a copy of the License at: 00010 * 00011 * http://www.st.com/myliberty 00012 * 00013 * Unless required by applicable law or agreed to in writing, software 00014 * distributed under the License is distributed on an "AS IS" BASIS, 00015 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, 00016 * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY, 00017 * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT. 00018 * See the License for the specific language governing permissions and 00019 * limitations under the License. 00020 * 00021 ******************************************************************************/ 00022 00023 /* 00024 * PROJECT: ST25R391x firmware 00025 * $Revision: $ 00026 * LANGUAGE: ISO C99 00027 */ 00028 00029 /*! \file rfal_nfcb.c 00030 * 00031 * \author Gustavo Patricio 00032 * 00033 * \brief Implementation of NFC-B (ISO14443B) helpers 00034 * 00035 */ 00036 00037 /* 00038 ****************************************************************************** 00039 * INCLUDES 00040 ****************************************************************************** 00041 */ 00042 #include <platform1.h> 00043 #include "rfal_nfcb.h" 00044 #include "utils.h" 00045 00046 00047 /* 00048 ****************************************************************************** 00049 * ENABLE SWITCH 00050 ****************************************************************************** 00051 */ 00052 00053 #ifndef RFAL_FEATURE_NFCB 00054 #error " RFAL: Module configuration missing. Please enable/disable NFC-B module by setting: RFAL_FEATURE_NFCB " 00055 #endif 00056 00057 #if RFAL_FEATURE_NFCB 00058 00059 /* 00060 ****************************************************************************** 00061 * GLOBAL DEFINES 00062 ****************************************************************************** 00063 */ 00064 00065 #define RFAL_NFCB_SENSB_REQ_EXT_SENSB_RES_SUPPORTED 0x10 /*!< Bit mask for Extended SensB Response support in SENSB_REQ */ 00066 #define RFAL_NFCB_SENSB_RES_PROT_TYPE_RFU 0x08 /*!< Bit mask for Protocol Type RFU in SENSB_RES */ 00067 #define RFAL_NFCB_SLOT_MARKER_SC_SHIFT 4 /*!< Slot Code position on SLOT_MARKER APn */ 00068 00069 #define RFAL_NFCB_SLOTMARKER_SLOTCODE_MIN 1 /*!< SLOT_MARKER Slot Code minimum Digital 1.1 Table 37 */ 00070 #define RFAL_NFCB_SLOTMARKER_SLOTCODE_MAX 16 /*!< SLOT_MARKER Slot Code maximum Digital 1.1 Table 37 */ 00071 00072 #define RFAL_NFCB_ACTIVATION_FWT (RFAL_NFCB_FWTSENSB + RFAL_NFCB_DFWT_10) /*!< FWT(SENSB) + dFWT Digital 1.1 7.9.1.5 */ 00073 00074 /*! Advanced and Extended bit mask in Parameter of SENSB_REQ */ 00075 #define RFAL_NFCB_SENSB_REQ_PARAM (RFAL_NFCB_SENSB_REQ_ADV_FEATURE | RFAL_NFCB_SENSB_REQ_EXT_SENSB_RES_SUPPORTED) 00076 00077 00078 /*! NFC-B commands definition */ 00079 static enum 00080 { 00081 RFAL_NFCB_CMD_SENSB_REQ = 0x05, /*!< SENSB_REQ (REQB) & SLOT_MARKER Digital 1.1 Table 24 */ 00082 RFAL_NFCB_CMD_SENSB_RES = 0x50, /*!< SENSB_RES (ATQB) & SLOT_MARKER Digital 1.1 Table 27 */ 00083 RFAL_NFCB_CMD_SLPB_REQ = 0x50, /*!< SLPB_REQ (HLTB command) Digital 1.1 Table 38 */ 00084 RFAL_NFCB_CMD_SLPB_RES = 0x00 /*!< SLPB_RES (HLTB Answer) Digital 1.1 Table 39 */ 00085 }rfalCmd; 00086 00087 /* 00088 ****************************************************************************** 00089 * GLOBAL MACROS 00090 ****************************************************************************** 00091 */ 00092 00093 #define rfalNfcbNI2NumberOfSlots( ni ) (1 << ni) /*!< Converts the Number of slots Identifier to slot number*/ 00094 00095 /* 00096 ****************************************************************************** 00097 * GLOBAL TYPES 00098 ****************************************************************************** 00099 */ 00100 00101 /*! ALLB_REQ (WUPB) and SENSB_REQ (REQB) Command Format Digital 1.1 7.6.1 */ 00102 typedef struct 00103 { 00104 uint8_t cmd; /*!< xxxxB_REQ: 05h */ 00105 uint8_t AFI; /*!< NFC Identifier */ 00106 uint8_t PARAM; /*!< Application Data */ 00107 } rfalNfcbSensbReq; 00108 00109 /*! SLOT_MARKER Command format Digital 1.1 7.7.1 */ 00110 typedef struct 00111 { 00112 uint8_t APn; /*!< Slot number 2..16 | 0101b */ 00113 } rfalNfcbSlotMarker; 00114 00115 /*! SLPB_REQ (HLTB) Command Format Digital 1.1 7.8.1 */ 00116 typedef struct 00117 { 00118 uint8_t cmd; /*!< SLPB_REQ: 50h */ 00119 uint8_t nfcid0[RFAL_NFCB_NFCID0_LEN]; /*!< NFC Identifier (PUPI)*/ 00120 } rfalNfcbSlpbReq; 00121 00122 00123 /*! SLPB_RES (HLTB) Response Format Digital 1.1 7.8.2 */ 00124 typedef struct 00125 { 00126 uint8_t cmd; /*!< SLPB_RES: 00h */ 00127 } rfalNfcbSlpbRes; 00128 00129 00130 /*! RFAL NFC-B instance */ 00131 typedef struct 00132 { 00133 uint8_t AFI; /*!< AFI to be used */ 00134 uint8_t PARAM; /*!< PARAM to be used */ 00135 } rfalNfcb; 00136 00137 /* 00138 ****************************************************************************** 00139 * LOCAL FUNCTION PROTOTYPES 00140 ****************************************************************************** 00141 */ 00142 static ReturnCode rfalNfcbCheckSensbRes( rfalNfcbSensbRes *sensbRes, uint8_t sensbResLen ); 00143 00144 00145 /* 00146 ****************************************************************************** 00147 * LOCAL VARIABLES 00148 ****************************************************************************** 00149 */ 00150 /*! TR2 Table according to Digital 1.1 Table 33 */ 00151 static const uint16_t rfalNfcbTr2Table[] = { 1792, 3328, 5376, 9472 }; 00152 00153 rfalNfcb gRfalNfcb; /*!< RFAL NFC-B Instance */ 00154 00155 00156 /* 00157 ****************************************************************************** 00158 * LOCAL FUNCTIONS 00159 ****************************************************************************** 00160 */ 00161 00162 /*******************************************************************************/ 00163 static ReturnCode rfalNfcbCheckSensbRes( rfalNfcbSensbRes *sensbRes, uint8_t sensbResLen ) 00164 { 00165 /* Check response length */ 00166 if( ( (sensbResLen != RFAL_NFCB_SENSB_RES_LEN) && (sensbResLen != RFAL_NFCB_SENSB_RES_EXT_LEN) ) ) 00167 { 00168 return ERR_PROTO; 00169 } 00170 00171 /* Check SENSB_RES and Protocol Type Digital 1.1 7.6.2.19 */ 00172 if( (sensbRes->protInfo .FsciProType & RFAL_NFCB_SENSB_RES_PROT_TYPE_RFU) || (sensbRes->cmd != RFAL_NFCB_CMD_SENSB_RES) ) 00173 { 00174 return ERR_PROTO; 00175 } 00176 return ERR_NONE; 00177 } 00178 00179 /* 00180 ****************************************************************************** 00181 * GLOBAL FUNCTIONS 00182 ****************************************************************************** 00183 */ 00184 00185 /*******************************************************************************/ 00186 ReturnCode rfalNfcbPollerInitialize( SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00187 { 00188 ReturnCode ret; 00189 00190 EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCB , RFAL_BR_106 , RFAL_BR_106 , mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ); 00191 rfalSetErrorHandling( RFAL_ERRORHANDLING_NFC ); 00192 00193 rfalSetGT( RFAL_GT_NFCB ); 00194 rfalSetFDTListen( RFAL_FDT_LISTEN_NFCB_POLLER ); 00195 rfalSetFDTPoll( RFAL_FDT_POLL_NFCB_POLLER ); 00196 00197 gRfalNfcb.AFI = RFAL_NFCB_AFI; 00198 gRfalNfcb.PARAM = RFAL_NFCB_PARAM; 00199 00200 return ERR_NONE; 00201 } 00202 00203 /*******************************************************************************/ 00204 ReturnCode rfalNfcbPollerInitializeWithParams( uint8_t AFI, uint8_t PARAM, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00205 { 00206 ReturnCode ret; 00207 00208 EXIT_ON_ERR( ret, rfalNfcbPollerInitialize( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ); 00209 00210 gRfalNfcb.AFI = AFI; 00211 gRfalNfcb.PARAM = (PARAM & RFAL_NFCB_SENSB_REQ_PARAM); 00212 00213 return ERR_NONE; 00214 } 00215 00216 00217 /*******************************************************************************/ 00218 ReturnCode rfalNfcbPollerCheckPresence( rfalNfcbSensCmd cmd, rfalNfcbSlots slots, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00219 { 00220 uint16_t rxLen; 00221 ReturnCode ret; 00222 rfalNfcbSensbReq sensbReq; 00223 00224 00225 /* Check if the command requested and given the slot number are valid */ 00226 if( ((RFAL_NFCB_SENS_CMD_SENSB_REQ != cmd) && (RFAL_NFCB_SENS_CMD_ALLB_REQ != cmd)) || 00227 (slots > RFAL_NFCB_SLOT_NUM_16 ) || (sensbRes == NULL) || (sensbResLen == NULL) ) 00228 { 00229 return ERR_PARAM; 00230 } 00231 00232 *sensbResLen = 0; 00233 ST_MEMSET(sensbRes, 0x00, sizeof(rfalNfcbSensbRes ) ); 00234 00235 /* Compute SENSB_REQ */ 00236 sensbReq.cmd = RFAL_NFCB_CMD_SENSB_REQ; 00237 sensbReq.AFI = gRfalNfcb.AFI; 00238 sensbReq.PARAM = ((gRfalNfcb.PARAM & RFAL_NFCB_SENSB_REQ_PARAM) | cmd | slots); 00239 00240 /* Send SENSB_REQ and disable AGC to detect collisions */ 00241 ret = rfalTransceiveBlockingTxRx( (uint8_t*)&sensbReq, sizeof(rfalNfcbSensbReq), (uint8_t*)sensbRes, sizeof(rfalNfcbSensbRes ), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCB_FWTSENSB, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00242 *sensbResLen = rxLen; 00243 00244 /* Check if a transmission error was detected */ 00245 if( (ret == ERR_CRC) || (ret == ERR_FRAMING) ) 00246 { 00247 /* Invalidate received frame as an error was detected (CollisionResolution checks if valid) */ 00248 *sensbResLen = 0; 00249 return ERR_NONE; 00250 } 00251 00252 if( ret == ERR_NONE ) 00253 { 00254 return rfalNfcbCheckSensbRes( sensbRes, *sensbResLen ); 00255 } 00256 00257 return ret; 00258 } 00259 00260 00261 /*******************************************************************************/ 00262 ReturnCode rfalNfcbPollerSleep( uint8_t* nfcid0, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00263 { 00264 uint16_t rxLen; 00265 ReturnCode ret; 00266 rfalNfcbSlpbReq slpbReq; 00267 rfalNfcbSlpbRes slpbRes; 00268 00269 if( nfcid0 == NULL ) 00270 { 00271 return ERR_PARAM; 00272 } 00273 00274 /* Compute SLPB_REQ */ 00275 slpbReq.cmd = RFAL_NFCB_CMD_SLPB_REQ; 00276 ST_MEMCPY( slpbReq.nfcid0, nfcid0, RFAL_NFCB_NFCID0_LEN ); 00277 00278 EXIT_ON_ERR( ret, rfalTransceiveBlockingTxRx( (uint8_t*)&slpbReq, sizeof(rfalNfcbSlpbReq), (uint8_t*)&slpbRes, sizeof(rfalNfcbSlpbRes), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCB_ACTIVATION_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ); 00279 00280 /* Check SLPB_RES */ 00281 if( (rxLen != sizeof(rfalNfcbSlpbRes)) || (slpbRes.cmd != RFAL_NFCB_CMD_SLPB_RES) ) 00282 { 00283 return ERR_PROTO; 00284 } 00285 return ERR_NONE; 00286 } 00287 00288 00289 /*******************************************************************************/ 00290 ReturnCode rfalNfcbPollerSlotMarker( uint8_t slotCode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00291 { 00292 ReturnCode ret; 00293 rfalNfcbSlotMarker slotMarker; 00294 uint16_t rxLen; 00295 00296 /* Check parameters */ 00297 if( (sensbRes == NULL) || (sensbResLen == NULL) || 00298 (slotCode < RFAL_NFCB_SLOTMARKER_SLOTCODE_MIN) || 00299 (slotCode > RFAL_NFCB_SLOTMARKER_SLOTCODE_MAX) ) 00300 { 00301 return ERR_PARAM; 00302 } 00303 /* Compose and send SLOT_MARKER with disabled AGC to detect collisions */ 00304 slotMarker.APn = ((slotCode << RFAL_NFCB_SLOT_MARKER_SC_SHIFT) | RFAL_NFCB_CMD_SENSB_REQ); 00305 00306 ret = rfalTransceiveBlockingTxRx( (uint8_t*)&slotMarker, sizeof(rfalNfcbSlotMarker), (uint8_t*)sensbRes, sizeof(rfalNfcbSensbRes ), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCB_ACTIVATION_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00307 *sensbResLen = rxLen; 00308 00309 /* Check if a transmission error was detected */ 00310 if( (ret == ERR_CRC) || (ret == ERR_FRAMING) ) 00311 { 00312 return ERR_RF_COLLISION; 00313 } 00314 00315 if( ret == ERR_NONE ) 00316 { 00317 return rfalNfcbCheckSensbRes( sensbRes, *sensbResLen ); 00318 } 00319 00320 return ret; 00321 } 00322 00323 00324 ReturnCode rfalNfcbPollerTechnologyDetection( rfalComplianceMode compMode, rfalNfcbSensbRes *sensbRes, uint8_t *sensbResLen, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00325 { 00326 NO_WARNING(compMode); 00327 00328 return rfalNfcbPollerCheckPresence( RFAL_NFCB_SENS_CMD_SENSB_REQ , RFAL_NFCB_SLOT_NUM_1 , sensbRes, sensbResLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00329 } 00330 00331 00332 /*******************************************************************************/ 00333 ReturnCode rfalNfcbPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00334 { 00335 bool colPending; /* dummy */ 00336 return rfalNfcbPollerCollisionResolutionSlotted( compMode, devLimit, RFAL_NFCB_SLOT_NUM_1 , RFAL_NFCB_SLOT_NUM_16 , nfcbDevList, devCnt, &colPending, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00337 } 00338 00339 00340 /*******************************************************************************/ 00341 ReturnCode rfalNfcbPollerCollisionResolutionSlotted( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcbSlots initSlots, rfalNfcbSlots endSlots, rfalNfcbListenDevice *nfcbDevList, uint8_t *devCnt, bool *colPending, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 ) 00342 { 00343 ReturnCode ret; 00344 rfalNfcbSlots slotsNum; 00345 uint8_t slotCode; 00346 uint8_t curDevCnt; 00347 00348 00349 /* Check parameters. In ISO | Activity 1.0 mode the initial slots must be 1 as continuation of Technology Detection */ 00350 if( (nfcbDevList == NULL) || (devCnt == NULL) || (colPending == NULL) || (initSlots > RFAL_NFCB_SLOT_NUM_16 ) || 00351 (endSlots > RFAL_NFCB_SLOT_NUM_16 ) || ((compMode == RFAL_COMPLIANCE_MODE_ISO ) && (initSlots != RFAL_NFCB_SLOT_NUM_1 )) ) 00352 { 00353 return ERR_PARAM; 00354 } 00355 00356 /* Initialise as no error in case Activity 1.0 where the previous SENSB_RES from technology detection should be used */ 00357 ret = ERR_NONE; 00358 *devCnt = 0; 00359 curDevCnt = 0; 00360 *colPending = false; 00361 00362 00363 /* Send ALLB_REQ Activity 1.1 9.3.5.2 and 9.3.5.3 (Symbol 1 and 2) */ 00364 if( compMode != RFAL_COMPLIANCE_MODE_ISO ) 00365 { 00366 ret = rfalNfcbPollerCheckPresence( RFAL_NFCB_SENS_CMD_ALLB_REQ , initSlots, &nfcbDevList->sensbRes , &nfcbDevList->sensbResLen , mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00367 if( (ret != ERR_NONE) && (initSlots == RFAL_NFCB_SLOT_NUM_1 ) ) 00368 { 00369 return ret; 00370 } 00371 } 00372 00373 00374 /* Check if there was a transmission error on WUPB EMVCo 2.6 9.3.3.1 */ 00375 if( (compMode == RFAL_COMPLIANCE_MODE_EMV ) && (nfcbDevList->sensbResLen == 0) ) 00376 { 00377 return ERR_FRAMING; 00378 } 00379 //(int)slotsNum = (int)initSlots; (int)slotsNum <= (int)endSlots; ((int)slotsNum)++ ) 00380 00381 for( int i = 0; i < RFAL_NFCB_SLOT_NUM_16 ; i++) 00382 { 00383 rfalNfcbSlots slotsNum = (rfalNfcbSlots ) i; 00384 /* Activity 1.1 9.3.5.23 - Symbol 22 */ 00385 if( (compMode == RFAL_COMPLIANCE_MODE_NFC ) && (curDevCnt != 0) ) 00386 { 00387 rfalNfcbPollerSleep( nfcbDevList[(*devCnt-1)].sensbRes.nfcid0 , mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00388 nfcbDevList[(*devCnt-1)].isSleep = true; 00389 } 00390 00391 /* Send SENSB_REQ with number of slots if not the first Activity 1.1 9.3.5.24 - Symbol 23 */ 00392 if( (slotsNum != initSlots) || *colPending ) 00393 { 00394 ret = rfalNfcbPollerCheckPresence( RFAL_NFCB_SENS_CMD_SENSB_REQ , slotsNum, &nfcbDevList[*devCnt].sensbRes, &nfcbDevList[*devCnt].sensbResLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00395 } 00396 00397 /* Activity 1.1 9.3.5.6 - Symbol 5 */ 00398 slotCode = 0; 00399 curDevCnt = 0; 00400 *colPending = false; 00401 00402 do{ 00403 /* Activity 1.1 9.3.5.26 - Symbol 25 */ 00404 if( slotCode != 0 ) 00405 { 00406 ret = rfalNfcbPollerSlotMarker( slotCode, &nfcbDevList[*devCnt].sensbRes, &nfcbDevList[*devCnt].sensbResLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00407 } 00408 00409 /* Activity 1.1 9.3.5.7 and 9.3.5.8 - Symbol 6 */ 00410 if( ret != ERR_TIMEOUT ) 00411 { 00412 /* Activity 1.1 9.3.5.8 - Symbol 7 */ 00413 if( (ret == ERR_NONE) && (rfalNfcbCheckSensbRes( &nfcbDevList[*devCnt].sensbRes, nfcbDevList[*devCnt].sensbResLen) == ERR_NONE) ) 00414 { 00415 nfcbDevList[*devCnt].isSleep = false; 00416 00417 if( compMode == RFAL_COMPLIANCE_MODE_EMV ) 00418 { 00419 (*devCnt)++; 00420 return ret; 00421 } 00422 else if( compMode == RFAL_COMPLIANCE_MODE_ISO ) 00423 { 00424 /* Activity 1.0 9.3.5.8 - Symbol 7 */ 00425 (*devCnt)++; 00426 curDevCnt++; 00427 00428 /* Activity 1.0 9.3.5.10 - Symbol 9 */ 00429 if( (*devCnt >= devLimit) || (slotsNum == RFAL_NFCB_SLOT_NUM_1 ) ) 00430 { 00431 return ret; 00432 } 00433 00434 /* Activity 1.0 9.3.5.11 - Symbol 10 */ 00435 rfalNfcbPollerSleep( nfcbDevList[*devCnt-1].sensbRes.nfcid0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00436 nfcbDevList[*devCnt-1].isSleep = true; 00437 } 00438 else if( compMode == RFAL_COMPLIANCE_MODE_NFC ) 00439 { 00440 /* Activity 1.1 9.3.5.10 and 9.3.5.11 - Symbol 9 and Symbol 11*/ 00441 if(curDevCnt != 0) 00442 { 00443 rfalNfcbPollerSleep( nfcbDevList[*devCnt-1].sensbRes.nfcid0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; 00444 nfcbDevList[*devCnt-1].isSleep = true; 00445 } 00446 00447 /* Activity 1.1 9.3.5.12 - Symbol 11 */ 00448 (*devCnt)++; 00449 curDevCnt++; 00450 00451 /* Activity 1.1 9.3.5.6 - Symbol 13 */ 00452 if( (*devCnt >= devLimit) || (slotsNum == RFAL_NFCB_SLOT_NUM_1 ) ) 00453 { 00454 return ret; 00455 } 00456 } 00457 } 00458 else 00459 { 00460 /* 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 */ 00461 if( (devLimit == 0) && (slotsNum == RFAL_NFCB_SLOT_NUM_1 ) ) 00462 { 00463 return ERR_RF_COLLISION; 00464 } 00465 00466 /* Activity 1.1 9.3.5.9 - Symbol 8 */ 00467 *colPending = true; 00468 } 00469 } 00470 00471 /* Activity 1.1 9.3.5.15 - Symbol 14 */ 00472 (int)slotCode++; 00473 } 00474 while( slotCode < rfalNfcbNI2NumberOfSlots(slotsNum) ); 00475 00476 /* Activity 1.1 9.3.5.17 - Symbol 16 */ 00477 if( !(*colPending) ) 00478 { 00479 return ERR_NONE; 00480 } 00481 00482 /* Activity 1.1 9.3.5.18 - Symbol 17 */ 00483 if( curDevCnt != 0 ) 00484 { 00485 /* If a collision is detected and card(s) were found on this loop keep the same number of available slots */ 00486 //((int)slotsNum)--; 00487 i--; 00488 } 00489 00490 } 00491 00492 return ERR_NONE; 00493 } 00494 00495 00496 /*******************************************************************************/ 00497 uint32_t rfalNfcbTR2ToFDT( uint8_t tr2Code ) 00498 { 00499 return rfalNfcbTr2Table[ (tr2Code & RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK) ]; 00500 } 00501 00502 #endif /* RFAL_FEATURE_NFCB */
Generated on Sat Jul 16 2022 13:00:53 by
