ST Expansion SW Team / RFAL

Dependents:   mbed-os-nfc05a1

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers rfal_nfcb.cpp Source File

rfal_nfcb.cpp

00001 
00002 /******************************************************************************
00003   * @attention
00004   *
00005   * <h2><center>&copy; 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 */