Fork of the GitHub

Files at this revision

API Documentation at this revision

Comitter:
DiegoOstuni
Date:
Thu Nov 14 14:34:50 2019 +0000
Commit message:
Add files

Changed in this revision

.gitignore Show annotated file Show diff for this revision Revisions of this file
LICENSE Show annotated file Show diff for this revision Revisions of this file
README.md Show annotated file Show diff for this revision Revisions of this file
platform1.h Show annotated file Show diff for this revision Revisions of this file
rfal_AnalogConfig.h Show annotated file Show diff for this revision Revisions of this file
rfal_analogConfig.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_analogConfigTbl.h Show annotated file Show diff for this revision Revisions of this file
rfal_chip.h Show annotated file Show diff for this revision Revisions of this file
rfal_crc.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_crc.h Show annotated file Show diff for this revision Revisions of this file
rfal_features.h Show annotated file Show diff for this revision Revisions of this file
rfal_iso15693_2.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_iso15693_2.h Show annotated file Show diff for this revision Revisions of this file
rfal_isoDep.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_isoDep.h Show annotated file Show diff for this revision Revisions of this file
rfal_nfcDep.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_nfcDep.h Show annotated file Show diff for this revision Revisions of this file
rfal_nfca.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_nfca.h Show annotated file Show diff for this revision Revisions of this file
rfal_nfcb.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_nfcb.h Show annotated file Show diff for this revision Revisions of this file
rfal_nfcf.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_nfcf.h Show annotated file Show diff for this revision Revisions of this file
rfal_nfcv.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_nfcv.h Show annotated file Show diff for this revision Revisions of this file
rfal_rf.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_rf.h Show annotated file Show diff for this revision Revisions of this file
rfal_st25tb.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_st25tb.h Show annotated file Show diff for this revision Revisions of this file
rfal_t1t.cpp Show annotated file Show diff for this revision Revisions of this file
rfal_t1t.h Show annotated file Show diff for this revision Revisions of this file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/.gitignore	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,32 @@
+# Prerequisites
+*.d
+
+# Compiled Object files
+*.slo
+*.lo
+*.o
+*.obj
+
+# Precompiled Headers
+*.gch
+*.pch
+
+# Compiled Dynamic libraries
+*.so
+*.dylib
+*.dll
+
+# Fortran module files
+*.mod
+*.smod
+
+# Compiled Static libraries
+*.lai
+*.la
+*.a
+*.lib
+
+# Executables
+*.exe
+*.out
+*.app
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/LICENSE	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,201 @@
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   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.
+   See the License for the specific language governing permissions and
+   limitations under the License.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/README.md	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,4 @@
+# RFAL
+Radio-frequency abstraction layer (RFAL) library for the STMicroelectronics X-NUCLEO-NFC05A1. RFAL is  used to simulate the physical layer communication hardware and radio channels.
+# OVERVIEW
+It contains the Analog Configuration Settings and all the NFC protocol (NFCA, NFCB, Felica, NFC-DEP, NFCV), implementation of the interface and of the ISO-15693-2.
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/platform1.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,127 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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.
+  *
+******************************************************************************/
+/*! \file
+ *
+ *  \author
+ *
+ *  \brief Platform header file. Defining platform independent functionality.
+ *
+ */
+
+
+/*
+ *      PROJECT:
+ *      $Revision: $
+ *      LANGUAGE:  ISO C99
+ */
+
+/*! \file platform.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Platform specific definition layer
+ *
+ *  This should contain all platform and hardware specifics such as
+ *  GPIO assignment, system resources, locks, IRQs, etc
+ *
+ *  Each distinct platform/system/board must provide this definitions
+ *  for all SW layers to use
+ *
+ */
+
+#ifndef PLATFORM1_H
+#define PLATFORM1_H
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+/*#if defined(STM32L476xx)
+#include "stm32l4xx_hal.h"
+#elif defined(STM32F401xE)
+*/
+#include "stm32f4xx_hal.h"
+/*#else
+//#include "stm32l0xx_hal.h"
+#endif
+*/
+
+#include "stdint.h"
+#include "stdbool.h"
+#include "limits.h"
+#include "timer1.h"
+#include "main.h"
+#include "logger.h"
+#include "mbed.h"
+
+
+/*
+******************************************************************************
+* GLOBAL DEFINES
+******************************************************************************
+*/
+
+/*
+******************************************************************************
+* GLOBAL MACROS
+******************************************************************************
+*/
+
+
+#define platformIrqST25R3911SetCallback( cb )
+
+
+#define platformIrqST25R3916SetCallback( cb )
+
+#define platformTimerCreate( t )                      timerCalculateTimer(t)                        /*!< Create a timer with the given time (ms)     */
+#define platformTimerIsExpired( timer )               timerIsExpired(timer)                         /*!< Checks if the given timer is expired        */
+#define platformDelay( t )                            HAL_Delay( t )                                /*!< Performs a delay for the given time (ms)    */
+
+#define platformGetSysTick()                          HAL_GetTick()                                 /*!< Get System Tick ( 1 tick = 1 ms)            */
+
+
+
+/*
+******************************************************************************
+* RFAL FEATURES CONFIGURATION
+******************************************************************************
+*/
+
+#define RFAL_FEATURE_NFCA                      true       /*!< Enable/Disable RFAL support for NFC-A (ISO14443A)                         */
+#define RFAL_FEATURE_NFCB                      true       /*!< Enable/Disable RFAL support for NFC-B (ISO14443B)                         */
+#define RFAL_FEATURE_NFCF                      true       /*!< Enable/Disable RFAL support for NFC-F (FeliCa)                            */
+#define RFAL_FEATURE_NFCV                      true       /*!< Enable/Disable RFAL support for NFC-V (ISO15693)                          */
+#define RFAL_FEATURE_T1T                       true       /*!< Enable/Disable RFAL support for T1T (Topaz)                               */
+#define RFAL_FEATURE_ST25TB                    true       /*!< Enable/Disable RFAL support for ST25TB                                    */
+#define RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG     false      /*!< Enable/Disable Analog Configs to be dynamically updated (RAM)             */
+#define RFAL_FEATURE_DYNAMIC_POWER             false      /*!< Enable/Disable RFAL dynamic power support                                 */
+#define RFAL_FEATURE_ISO_DEP                   true       /*!< Enable/Disable RFAL support for ISO-DEP (ISO14443-4)                      */
+#define RFAL_FEATURE_NFC_DEP                   true       /*!< Enable/Disable RFAL support for NFC-DEP (NFCIP1/P2P)                      */
+
+
+#define RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN    256        /*!< ISO-DEP I-Block max length. Please use values as defined by rfalIsoDepFSx */
+#define RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN      1024       /*!< ISO-DEP APDU max length. Please use multiples of I-Block max length       */
+
+#endif /* PLATFORM1_H */
+
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_AnalogConfig.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,321 @@
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_AnalogConfig.h
+ *
+ *  \author bkam
+ *
+ *  \brief RF Chip Analog Configuration Settings
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-HAL
+ * @brief RFAL Hardware Abstraction Layer
+ * @{
+ *
+ * @addtogroup AnalogConfig
+ * @brief RFAL Analog Config Module
+ * @{
+ *
+ */
+
+#ifndef RFAL_ANALOG_CONFIG_H
+#define RFAL_ANALOG_CONFIG_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.h"
+#include "ST25R3911.h"
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_ANALOG_CONFIG_LUT_SIZE                 (87)    /*!< Maximum number of Configuration IDs in the Loop Up Table      */
+#define RFAL_ANALOG_CONFIG_LUT_NOT_FOUND            (0xFF)  /*!< Index value indicating no Configuration IDs found             */
+
+#define RFAL_ANALOG_CONFIG_TBL_SIZE                 (1024)  /*!< Maximum number of Register-Mask-Value in the Setting List     */
+
+
+#define RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_MASK    (0x8000) /*!< Mask bit of Poll Mode in Analog Configuration ID             */
+#define RFAL_ANALOG_CONFIG_TECH_MASK                (0x7F00) /*!< Mask bits for Technology in Analog Configuration ID          */
+#define RFAL_ANALOG_CONFIG_BITRATE_MASK             (0x00F0) /*!< Mask bits for Bit rate in Analog Configuration ID            */
+#define RFAL_ANALOG_CONFIG_DIRECTION_MASK           (0x0003) /*!< Mask bits for Direction in Analog Configuration ID           */
+
+#define RFAL_ANALOG_CONFIG_POLL_LISTEN_MODE_SHIFT   (15)     /*!< Shift value of Poll Mode in Analog Configuration ID          */
+#define RFAL_ANALOG_CONFIG_TECH_SHIFT               (8)      /*!< Shift value for Technology in Analog Configuration ID        */
+#define RFAL_ANALOG_CONFIG_BITRATE_SHIFT            (4)      /*!< Shift value for Technology in Analog Configuration ID        */
+#define RFAL_ANALOG_CONFIG_DIRECTION_SHIFT          (0)      /*!< Shift value for Direction in Analog Configuration ID         */
+
+#define RFAL_ANALOG_CONFIG_POLL                     (0x0000) /*!< Poll Mode bit setting in Analog Configuration ID             */
+#define RFAL_ANALOG_CONFIG_LISTEN                   (0x8000) /*!< Listen Mode bit setting in Analog Configuration ID           */
+
+#define RFAL_ANALOG_CONFIG_TECH_CHIP                (0x0000) /*!< Chip-Specific bit setting in Analog Configuration ID         */
+#define RFAL_ANALOG_CONFIG_TECH_NFCA                (0x0100) /*!< NFC-A Technology bits setting in Analog Configuration ID     */
+#define RFAL_ANALOG_CONFIG_TECH_NFCB                (0x0200) /*!< NFC-B Technology bits setting in Analog Configuration ID     */
+#define RFAL_ANALOG_CONFIG_TECH_NFCF                (0x0400) /*!< NFC-F Technology bits setting in Analog Configuration ID     */
+#define RFAL_ANALOG_CONFIG_TECH_AP2P                (0x0800) /*!< AP2P Technology bits setting in Analog Configuration ID      */
+#define RFAL_ANALOG_CONFIG_TECH_NFCV                (0x1000) /*!< NFC-V Technology bits setting in Analog Configuration ID     */
+#define RFAL_ANALOG_CONFIG_TECH_RFU                 (0x2000) /*!< RFU for Technology bits */
+
+#define RFAL_ANALOG_CONFIG_BITRATE_COMMON           (0x0000) /*!< Common settings for all bit rates in Analog Configuration ID */
+#define RFAL_ANALOG_CONFIG_BITRATE_106              (0x0010) /*!< 106kbits/s settings in Analog Configuration ID               */
+#define RFAL_ANALOG_CONFIG_BITRATE_212              (0x0020) /*!< 212kbits/s settings in Analog Configuration ID               */
+#define RFAL_ANALOG_CONFIG_BITRATE_424              (0x0030) /*!< 424kbits/s settings in Analog Configuration ID               */
+#define RFAL_ANALOG_CONFIG_BITRATE_848              (0x0040) /*!< 848kbits/s settings in Analog Configuration ID               */
+#define RFAL_ANALOG_CONFIG_BITRATE_1695             (0x0050) /*!< 1695kbits/s settings in Analog Configuration ID              */
+#define RFAL_ANALOG_CONFIG_BITRATE_3390             (0x0060) /*!< 3390kbits/s settings in Analog Configuration ID              */
+#define RFAL_ANALOG_CONFIG_BITRATE_6780             (0x0070) /*!< 6780kbits/s settings in Analog Configuration ID              */
+#define RFAL_ANALOG_CONFIG_BITRATE_1OF4             (0x00C0) /*!< 1 out of 4 for NFC-V setting in Analog Configuration ID      */
+#define RFAL_ANALOG_CONFIG_BITRATE_1OF256           (0x00D0) /*!< 1 out of 256 for NFC-V setting in Analog Configuration ID    */
+
+#define RFAL_ANALOG_CONFIG_NO_DIRECTION             (0x0000) /*!< No direction setting in Analog Conf ID (Chip Specific only)  */
+#define RFAL_ANALOG_CONFIG_TX                       (0x0001) /*!< Transmission bit setting in Analog Configuration ID          */
+#define RFAL_ANALOG_CONFIG_RX                       (0x0002) /*!< Reception bit setting in Analog Configuration ID             */
+
+#define RFAL_ANALOG_CONFIG_UPDATE_LAST              (0x00)   /*!< Value indicating Last configuration set during update        */
+#define RFAL_ANALOG_CONFIG_UPDATE_MORE              (0x01)   /*!< 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_1OF4(id)           (RFAL_ANALOG_CONFIG_BITRATE_1OF4 & id)   /*!< Check if ID indicates 1 out of 4 bitrate   */
+#define RFAL_ANALOG_CONFIG_ID_IS_1OF256(id)         (RFAL_ANALOG_CONFIG_BITRATE_1OF256 & 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           */
+} 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 ERR_NONE    : if setting is updated
+ * \return ERR_PARAM   : if configTbl is invalid
+ * \return ERR_NOMEM   : if the given Table is bigger exceeds the max size
+ * \return 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 ERR_PARAM   : if Configuration ID or parameter is invalid
+ * \return ERR_NOMEM   : if LUT is full
+ * \return ERR_REQUEST : if the update Configuration Id is disabled
+ * \return ERR_NONE    : if setting is updated
+ *
+ *****************************************************************************
+ */
+ReturnCode rfalAnalogConfigListWrite( uint8_t more, 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 ERR_PARAM : if configTbl or configTblSize is invalid
+ * \return ERR_NOMEM : if configTblSize is not enough for the whole table
+ * \return 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 ERR_NOMEM : if number of Configuration for respective Configuration ID is greater the the remaining configuration setting space available
+ * \return 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 ERR_PARAM if Configuration ID is invalid
+ * \return ERR_INTERNAL if error updating setting to chip
+ * \return ERR_NONE if new settings is applied to chip
+ *
+ *****************************************************************************
+ */
+ReturnCode rfalSetAnalogConfig( rfalAnalogConfigId configId, 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 );
+
+
+#endif /* RFAL_ANALOG_CONFIG_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_analogConfig.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,390 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_analogConfig.c
+ *
+ *  \author bkam
+ *
+ *  \brief Funcitons to manage and set analog settings.
+ *
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "rfal_analogConfigTbl.h"
+#include "rfal_AnalogConfig.h"
+#include "rfal_chip.h"
+#include "st_errno.h"
+#include "platform1.h"
+#include "utils.h"
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_TEST_REG         0x0080      /*!< Test Register indicator  */    
+
+/*
+ ******************************************************************************
+ * 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 {
+    uint8_t *currentAnalogConfigTbl; /*!< Reference to start of current Analog Configuration      */
+    uint16_t configTblSize;          /*!< Total size of Analog Configuration                      */
+    uint8_t  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( 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. */
+    gRfalAnalogConfigMgmt.currentAnalogConfigTbl = (uint8_t *)rfalAnalogConfigDefaultSettings;
+    gRfalAnalogConfigMgmt.configTblSize = sizeof(rfalAnalogConfigDefaultSettings);
+    gRfalAnalogConfigMgmt.ready = true;
+    
+} /* rfalAnalogConfigInitialize() */
+
+
+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 )
+    {
+        rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
+        return ERR_NOMEM;
+    }
+    
+    /* Check for invalid parameters */
+    if( configTbl == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* NOTE: Function does not check for the validity of the Table contents (conf IDs, conf sets, register address)  */
+    ST_MEMCPY( gRfalAnalogConfig, configTbl, configTblSize );
+    
+    /* Update the total size of configuration settings */
+    gRfalAnalogConfigMgmt.configTblSize = configTblSize;
+        
+    rfalAnalogConfigPtrUpdate(gRfalAnalogConfig);
+    return ERR_NONE;
+    
+#else
+    
+    /* If Analog Configuration Update is to be disabled */
+    NO_WARNING(configTbl);
+    NO_WARNING(configTblSize);
+    return ERR_REQUEST;
+    
+#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
+}
+
+ReturnCode rfalAnalogConfigListWrite( uint8_t more, 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 = GETU16(config->id);
+    
+    /* Check validity of the Configuration ID. */
+    if ( (RFAL_ANALOG_CONFIG_TECH_RFU <= RFAL_ANALOG_CONFIG_ID_GET_TECH(configId))
+       ||((RFAL_ANALOG_CONFIG_BITRATE_6780 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)) && (RFAL_ANALOG_CONFIG_BITRATE_1OF4 > RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId)))
+       ||(RFAL_ANALOG_CONFIG_BITRATE_1OF256 < RFAL_ANALOG_CONFIG_ID_GET_BITRATE(configId))
+       )
+    {
+        rfalAnalogConfigInitialize(); /* Revert to default Analog Configuration */
+        return ERR_PARAM;
+    }
+                    
+    numConfig = config->num;
+    configSize = (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 ERR_NOMEM;
+    }
+    
+    /* NOTE: Function does not check for the validity of the Register Address. */
+    ST_MEMCPY(&gRfalAnalogConfig[gRfalAnalogConfigMgmt.configTblSize], 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 ERR_NONE;
+    
+#else
+    
+    /* If Analog Configuration Update is to be disabled */
+    NO_WARNING(config);
+    NO_WARNING(more);
+    return ERR_DISABLED;
+    
+#endif /* RFAL_FEATURE_DYNAMIC_ANALOG_CONFIG */
+    
+} /* rfalAnalogConfigListUpdate() */
+
+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 ERR_NOMEM;
+    }
+    
+    /* Check for invalid parameters */
+    if( configTblSize == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Copy the whole Table to the given buffer */
+    ST_MEMCPY( tblBuf, gRfalAnalogConfigMgmt.currentAnalogConfigTbl, gRfalAnalogConfigMgmt.configTblSize );
+    *configTblSize = gRfalAnalogConfigMgmt.configTblSize;
+    
+    return ERR_NONE;
+}
+
+ReturnCode rfalAnalogConfigListRead( rfalAnalogConfigOffset *configOffset, uint8_t *more, rfalAnalogConfig *config, rfalAnalogConfigNum numConfig )
+{
+    uint8_t configSize;
+    rfalAnalogConfigOffset offset = *configOffset;
+    
+    /* 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 ERR_NOMEM;
+    }
+
+    /* Get the number of Configuration set */
+    numConfig = gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset + sizeof(rfalAnalogConfigId)];
+    
+    /* Pass Configuration Register-Mask-Value sets */
+    configSize = (sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) + (numConfig * sizeof(rfalAnalogConfigRegAddrMaskVal)));
+    ST_MEMCPY( config
+              , &gRfalAnalogConfigMgmt.currentAnalogConfigTbl[offset]
+              , configSize
+              );
+    *configOffset = offset + configSize;
+                
+    /* Check if it is the last Analog Configuration in the Table.*/
+    *more = (*configOffset >= gRfalAnalogConfigMgmt.configTblSize) ? RFAL_ANALOG_CONFIG_UPDATE_LAST
+                                                                  : RFAL_ANALOG_CONFIG_UPDATE_MORE; 
+
+    return ERR_NONE;
+} /* rfalAnalogConfigListRead() */
+
+
+ReturnCode rfalSetAnalogConfig( rfalAnalogConfigId configId, 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 )
+{
+    rfalAnalogConfigOffset configOffset = 0;
+    rfalAnalogConfigNum numConfigSet;
+    rfalAnalogConfigRegAddrMaskVal *configTbl;
+    ReturnCode retCode = ERR_NONE;
+    rfalAnalogConfigNum i;
+    
+    if (true != gRfalAnalogConfigMgmt.ready)
+    {
+        return ERR_REQUEST;
+    }
+    
+    /* Search LUT for the specific Configuration ID. */
+    while (RFAL_ANALOG_CONFIG_LUT_NOT_FOUND != (numConfigSet = rfalAnalogConfigSearch(configId, &configOffset)))
+    {
+        configTbl = (rfalAnalogConfigRegAddrMaskVal *)( (uint32_t)gRfalAnalogConfigMgmt.currentAnalogConfigTbl + (uint32_t)configOffset); 
+        /* Increment the offset to the next index to search from. */
+        configOffset += (numConfigSet * sizeof(rfalAnalogConfigRegAddrMaskVal)); 
+        
+        if ((gRfalAnalogConfigMgmt.configTblSize + 1) < configOffset)
+        {   /* Error check make sure that the we do not access outside the configuration Table Size */
+            return ERR_NOMEM;
+        }
+        
+        for ( i = 0; i < numConfigSet; i++)
+        {
+            if( GETU16(configTbl[i].addr) & RFAL_TEST_REG )
+            {
+                EXIT_ON_ERR(retCode, rfalChipChangeTestRegBits( (GETU16(configTbl[i].addr) & ~RFAL_TEST_REG), configTbl[i].mask, configTbl[i].val, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            }
+            else
+            {
+                EXIT_ON_ERR(retCode, rfalChipChangeRegBits( GETU16(configTbl[i].addr), configTbl[i].mask, configTbl[i].val, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            }
+        }
+        
+    } /* while(found Analog Config Id) */
+    
+    return retCode;
+    
+} /* rfalSetAnalogConfig() */
+
+/*
+ ******************************************************************************
+ * 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( uint8_t* analogConfigTbl )
+{
+    
+    gRfalAnalogConfigMgmt.currentAnalogConfigTbl = analogConfigTbl;
+    gRfalAnalogConfigMgmt.ready = true;
+    
+} /* rfalAnalogConfigPtrUpdate() */
+#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;
+    uint8_t *configTbl;
+    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 : configId)
+                       |(RFAL_ANALOG_CONFIG_NO_DIRECTION == (RFAL_ANALOG_CONFIG_ID_GET_DIRECTION(configId)) ? RFAL_ANALOG_CONFIG_DIRECTION_MASK : configId)
+                       );
+    
+    for ( i = *configOffset; i < gRfalAnalogConfigMgmt.configTblSize; )
+    {
+        configTbl = &currentConfigTbl[i];
+        foundConfigId = GETU16(configTbl);
+        if (configId == (foundConfigId & configIdMaskVal))
+        {
+            *configOffset = (i + sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum));
+            return configTbl[sizeof(rfalAnalogConfigId)];
+        }
+        
+        /* If Config Id does not match, increment to next Configuration Id */
+        i += ( sizeof(rfalAnalogConfigId) + sizeof(rfalAnalogConfigNum) 
+             + (configTbl[sizeof(rfalAnalogConfigId)] * sizeof(rfalAnalogConfigRegAddrMaskVal) )
+             );
+    } 
+    
+    return RFAL_ANALOG_CONFIG_LUT_NOT_FOUND;
+} /* rfalAnalogConfigSearch() */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_analogConfigTbl.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,416 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_analogConfig.h
+ *
+ *  \author bkam
+ *
+ *  \brief ST25R3911 Analog Configuration Settings
+ *
+ */
+
+#ifndef ST25R3911_ANALOGCONFIG_H
+#define ST25R3911_ANALOGCONFIG_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "rfal_AnalogConfig.h"
+#include "st25r3911_com.h"
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * GLOBAL MACROS
+ ******************************************************************************
+ */
+
+/*! Macro for Configuration Setting with only one register-mask-value set:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1] */
+#define MODE_ENTRY_1_REG(MODE, R0, M0, V0)              \
+    (MODE >> 8), (MODE & 0xFF), 1, (R0 >> 8), (R0 & 0xFF), (M0), (V0)
+
+/*! Macro for Configuration Setting with only two register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1] */
+#define MODE_ENTRY_2_REG(MODE, R0, M0, V0, R1, M1, V1)  \
+    (MODE >> 8), (MODE & 0xFF), 2, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1)
+
+/*! Macro for Configuration Setting with only three register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_3_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2)  \
+    (MODE >> 8), (MODE & 0xFF), 3, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+
+/*! Macro for Configuration Setting with only four register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_4_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3)  \
+    (MODE >> 8), (MODE & 0xFF), 4, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+
+/*! Macro for Configuration Setting with only five register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_5_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4)  \
+    (MODE >> 8), (MODE & 0xFF), 5, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+
+/*! Macro for Configuration Setting with only six register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_6_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5)  \
+    (MODE >> 8), (MODE & 0xFF), 6, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+
+/*! Macro for Configuration Setting with only seven register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_7_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6)  \
+    (MODE >> 8), (MODE & 0xFF), 7, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+
+/*! Macro for Configuration Setting with only eight register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_8_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6, R7, M7, V7)  \
+    (MODE >> 8), (MODE & 0xFF), 8, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+                                 , (R7 >> 8), (R7 & 0xFF), (M7), (V7) \
+
+/*! Macro for Configuration Setting with only nine register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_9_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6, R7, M7, V7, R8, M8, V8)  \
+    (MODE >> 8), (MODE & 0xFF), 9, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+                                 , (R7 >> 8), (R7 & 0xFF), (M7), (V7) \
+                                 , (R8 >> 8), (R8 & 0xFF), (M8), (V8) \
+
+/*! Macro for Configuration Setting with only ten register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_10_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6, R7, M7, V7, R8, M8, V8, R9, M9, V9)  \
+    (MODE >> 8), (MODE & 0xFF),10, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+                                 , (R7 >> 8), (R7 & 0xFF), (M7), (V7) \
+                                 , (R8 >> 8), (R8 & 0xFF), (M8), (V8) \
+                                 , (R9 >> 8), (R9 & 0xFF), (M9), (V9) \
+
+/*! Macro for Configuration Setting with eleven register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_11_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6, R7, M7, V7, R8, M8, V8, R9, M9, V9, R10, M10, V10)  \
+    (MODE >> 8), (MODE & 0xFF),11, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+                                 , (R7 >> 8), (R7 & 0xFF), (M7), (V7) \
+                                 , (R8 >> 8), (R8 & 0xFF), (M8), (V8) \
+                                 , (R9 >> 8), (R9 & 0xFF), (M9), (V9) \
+                                 , (R10 >> 8), (R10 & 0xFF), (M10), (V10) \
+
+/*! Macro for Configuration Setting with twelve register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_12_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6, R7, M7, V7, R8, M8, V8, R9, M9, V9, R10, M10, V10, R11, M11, V11)  \
+    (MODE >> 8), (MODE & 0xFF),12, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+                                 , (R7 >> 8), (R7 & 0xFF), (M7), (V7) \
+                                 , (R8 >> 8), (R8 & 0xFF), (M8), (V8) \
+                                 , (R9 >> 8), (R9 & 0xFF), (M9), (V9) \
+                                 , (R10 >> 8), (R10 & 0xFF), (M10), (V10) \
+                                 , (R11 >> 8), (R11 & 0xFF), (M11), (V11) \
+
+/*! Macro for Configuration Setting with thirteen register-mask-value sets:
+ *  - Configuration ID[2], Number of Register sets to follow[1], Register[2], Mask[1], Value[1], Register[2], Mask[1], Value[1], Register[2]... */
+#define MODE_ENTRY_13_REG(MODE, R0, M0, V0, R1, M1, V1, R2, M2, V2, R3, M3, V3, R4, M4, V4, R5, M5, V5, R6, M6, V6, R7, M7, V7, R8, M8, V8, R9, M9, V9, R10, M10, V10, R11, M11, V11, R12, M12, V12)  \
+    (MODE >> 8), (MODE & 0xFF),13, (R0 >> 8), (R0 & 0xFF), (M0), (V0) \
+                                 , (R1 >> 8), (R1 & 0xFF), (M1), (V1) \
+                                 , (R2 >> 8), (R2 & 0xFF), (M2), (V2) \
+                                 , (R3 >> 8), (R3 & 0xFF), (M3), (V3) \
+                                 , (R4 >> 8), (R4 & 0xFF), (M4), (V4) \
+                                 , (R5 >> 8), (R5 & 0xFF), (M5), (V5) \
+                                 , (R6 >> 8), (R6 & 0xFF), (M6), (V6) \
+                                 , (R7 >> 8), (R7 & 0xFF), (M7), (V7) \
+                                 , (R8 >> 8), (R8 & 0xFF), (M8), (V8) \
+                                 , (R9 >> 8), (R9 & 0xFF), (M9), (V9) \
+                                 , (R10 >> 8), (R10 & 0xFF), (M10), (V10) \
+                                 , (R11 >> 8), (R11 & 0xFF), (M11), (V11) \
+                                 , (R12 >> 8), (R12 & 0xFF), (M12), (V12) \
+/* Setting for approximately 14%: */
+#define AM_MOD_DRIVER_LEVEL_DEFAULT 0xb9
+/*
+ ******************************************************************************
+ * GLOBAL DATA TYPES
+ ******************************************************************************
+ */
+const uint8_t rfalAnalogConfigDefaultSettings[] = {
+      /****** Default Analog Configuration for Chip-Specific. ******/
+      MODE_ENTRY_10_REG( RFAL_ANALOG_CONFIG_TECH_CHIP
+                      , ST25R3911_REG_OP_CONTROL,             0x30, 0x10 /* default to AM */
+                      , ST25R3911_REG_IO_CONF1,               0x06, 0x06 /* MCUCLK: HF clk off */
+                      , ST25R3911_REG_IO_CONF1, ST25R3911_REG_IO_CONF1_lf_clk_off, ST25R3911_REG_IO_CONF1_lf_clk_off /* MCUCLK: LF clk off */
+                      , ST25R3911_REG_IO_CONF2,               0x18, 0x18 /* pull downs */
+                      , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_pm, 0x1<<ST25R3911_REG_RX_CONF4_shift_rg2_pm /* increase digitizer window for PM */
+                      , ST25R3911_REG_ANT_CAL_TARGET,         0xFF, 0x80 /* 90degrees */
+                      , ST25R3911_REG_ANT_CAL_CONTROL,        0xF8, 0x00 /* trim value from calibrate antenna */
+                      , ST25R3911_REG_AM_MOD_DEPTH_CONTROL,   ST25R3911_REG_AM_MOD_DEPTH_CONTROL_am_s, ST25R3911_REG_AM_MOD_DEPTH_CONTROL_am_s /* AM modulated level is defined by RFO AM Modulated Level Def Reg, fixed setting, no automatic adjustment */
+                      , ST25R3911_REG_FIELD_THRESHOLD,        ST25R3911_REG_FIELD_THRESHOLD_mask_trg, ST25R3911_REG_FIELD_THRESHOLD_trg_75mV
+                      , ST25R3911_REG_FIELD_THRESHOLD,        ST25R3911_REG_FIELD_THRESHOLD_mask_rfe, ST25R3911_REG_FIELD_THRESHOLD_rfe_75mV
+                      )
+
+      /****** Default Analog Configuration for Poll NFC-A Tx. ******/
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL, 0xff, 0xf0 /* Used for 848 TX: very high AM to keep wave shapes */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am,        0x00        /* OOK */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am,        0x00        /* OOK */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am,        0x00        /* OOK */
+                      )
+
+    , MODE_ENTRY_2_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_848 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,  ST25R3911_REG_AUX_tr_am,  ST25R3911_REG_AUX_tr_am       /* AM! */
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL, 0xff, 0xf0 /* Used for 848 TX: very high AM to keep wave shapes */
+                      )
+
+      /****** Default Analog Configuration for Poll NFC-A Rx. ******/
+    , MODE_ENTRY_3_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF3, 0xff, 0x18
+                      , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_am, 0x2<<ST25R3911_REG_RX_CONF4_shift_rg2_am /* increase digitizer window for AM */
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_rx_tol, 0x00                                               /* rx_tol Off */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1, 0x7f, 0x00
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1, 0x7f, 0x04
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1, 0x7f, 0x22
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_848 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1, 0x7f, 0x22
+                      )
+
+      /****** Default Analog Configuration for Poll NFC-B Tx. ******/
+    , MODE_ENTRY_2_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, ST25R3911_REG_AUX_tr_am   /* AM */
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL,        0xff, AM_MOD_DRIVER_LEVEL_DEFAULT                  /* Fixed driver for AM level: ~14% */
+                      )
+
+      /****** Default Analog Configuration for Poll NFC-B Rx. ******/
+    , MODE_ENTRY_3_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF3, 0xff, 0x18
+                      , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_am, 0x1<<ST25R3911_REG_RX_CONF4_shift_rg2_am /* increase digitizer window for AM */
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_rx_tol, ST25R3911_REG_AUX_rx_tol                           /* rx_tol On as default */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x04
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x04
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x22
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_848 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x22
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_1695 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x6c
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_3390 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x6c
+                      )
+
+      /****** Default Analog Configuration for Poll NFC-F Tx. ******/
+    , MODE_ENTRY_2_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, ST25R3911_REG_AUX_tr_am /* AM */
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL,        0xff, AM_MOD_DRIVER_LEVEL_DEFAULT /* Fixed driver for AM level: ~14% */
+                      )
+
+      /****** Default Analog Configuration for Poll NFC-F Common bitrate Rx. ******/
+    , MODE_ENTRY_3_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF3, 0xff, 0x18
+                      , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_am, 0x1<<ST25R3911_REG_RX_CONF4_shift_rg2_am /* increase digitizer window for AM */
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_rx_tol, ST25R3911_REG_AUX_rx_tol                           /* rx_tol On as default */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x13   /* dev. from data sheet: lp 300kKz */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x0b   /* dev. from data sheet: lp 600kHz */
+                      )
+
+    /****** Default Analog Configuration for Poll NFC-V Common bitrate Tx ******/
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX, ST25R3911_REG_AUX_tr_am, 0x00
+                      )
+
+    /****** Default Analog Configuration for Poll NFC-V Common bitrate Rx ******/
+    , MODE_ENTRY_4_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1, 0x7f, 0x0c /* use filter settings from table 9: "Recommended for 424/484 kHz sub-carrier" */
+                      , ST25R3911_REG_RX_CONF3, 0xff, 0x18
+                      , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_am, 0x1<<ST25R3911_REG_RX_CONF4_shift_rg2_am /* increase digitizer window for AM */
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_rx_tol, ST25R3911_REG_AUX_rx_tol                           /* rx_tol On as default */
+                      )
+
+      /****** Default Analog Configuration for Poll AP2P Common bitrate Tx. ******/
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL,        0xff, AM_MOD_DRIVER_LEVEL_DEFAULT /* Fixed driver for AM level: ~14% */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, 0x00 /* OOK */
+                      )
+
+    , MODE_ENTRY_2_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, ST25R3911_REG_AUX_tr_am /* AM */
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL,        0xff, AM_MOD_DRIVER_LEVEL_DEFAULT /* Fixed driver for AM level: ~14% */
+                      )
+
+    , MODE_ENTRY_2_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_TX)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, ST25R3911_REG_AUX_tr_am /* AM */
+                      , ST25R3911_REG_RFO_AM_ON_LEVEL,        0xff, AM_MOD_DRIVER_LEVEL_DEFAULT /* Fixed driver for AM level: ~14% */
+                      )
+
+      /****** Default Analog Configuration for Poll AP2P Common bitrate Rx. ******/
+    , MODE_ENTRY_4_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF1,               0x7f, 0x45
+                      , ST25R3911_REG_RX_CONF3,              (ST25R3911_REG_RX_CONF3_lim | ST25R3911_REG_RX_CONF3_rg_nfc), (ST25R3911_REG_RX_CONF3_lim | ST25R3911_REG_RX_CONF3_rg_nfc)
+                      , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_rx_tol, ST25R3911_REG_AUX_rx_tol                           /* rx_tol On as default */
+                      , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_am, 0x1<<ST25R3911_REG_RX_CONF4_shift_rg2_am /* increase digitizer window for AM */
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF3,               ST25R3911_REG_RX_CONF3_mask_rg1_am, 0xc0
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF3,               ST25R3911_REG_RX_CONF3_mask_rg1_am, 0x00
+                      )
+
+    , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_RX)
+                      , ST25R3911_REG_RX_CONF3,               ST25R3911_REG_RX_CONF3_mask_rg1_am, 0x00
+                      )
+
+      /****** Default Analog Configuration for Listen AP2P Common bitrate Tx. ******/
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX)
+                        , ST25R3911_REG_RFO_AM_ON_LEVEL,        0xff, AM_MOD_DRIVER_LEVEL_DEFAULT /* Fixed driver for AM level: ~14% */
+                        )
+
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_TX)
+                        , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, 0x00 /* OOK */
+                        )
+
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_TX)
+                        , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, ST25R3911_REG_AUX_tr_am /* AM */
+                        )
+
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_TX)
+                        , ST25R3911_REG_AUX,                    ST25R3911_REG_AUX_tr_am, ST25R3911_REG_AUX_tr_am /* AM */
+                        )
+
+        /****** Default Analog Configuration for Listen AP2P Common bitrate Rx. ******/
+      , MODE_ENTRY_3_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX)
+                        , ST25R3911_REG_RX_CONF1,               0x7f, 0x45
+                        , ST25R3911_REG_RX_CONF3,              (ST25R3911_REG_RX_CONF3_lim | ST25R3911_REG_RX_CONF3_rg_nfc), (ST25R3911_REG_RX_CONF3_lim | ST25R3911_REG_RX_CONF3_rg_nfc)
+                        , ST25R3911_REG_RX_CONF4,               ST25R3911_REG_RX_CONF4_mask_rg2_am, 0x1<<ST25R3911_REG_RX_CONF4_shift_rg2_am /* increase digitizer window for AM */
+                        )
+
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_106 | RFAL_ANALOG_CONFIG_RX)
+                        , ST25R3911_REG_RX_CONF3,               ST25R3911_REG_RX_CONF3_mask_rg1_am, 0xc0
+                        )
+
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_212 | RFAL_ANALOG_CONFIG_RX)
+                        , ST25R3911_REG_RX_CONF3,               ST25R3911_REG_RX_CONF3_mask_rg1_am, 0x00
+                        )
+
+      , MODE_ENTRY_1_REG( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_424 | RFAL_ANALOG_CONFIG_RX)
+                        , ST25R3911_REG_RX_CONF3,               ST25R3911_REG_RX_CONF3_mask_rg1_am, 0x00
+                        )
+};
+
+#endif /* ST25R3911_ANALOGCONFIG_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_chip.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,194 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_chip.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief RF Chip specific Layer
+ *
+ *  \warning This layer, which provides direct access to RF chip, should
+ *           only be used for debug purposes and/or advanced features
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-HAL
+ * @brief RFAL Hardware Abstraction Layer
+ * @{
+ *
+ * @addtogroup Chip
+ * @brief RFAL RF Chip Module
+ * @{
+ *
+ */
+
+
+#ifndef RFAL_CHIP_H
+#define RFAL_CHIP_H
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "platform1.h"
+#include "st_errno.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 ERR_PARAM Invalid register or bad request
+ * \return ERR_NONE  Write done with no error
+ *****************************************************************************
+ */
+ReturnCode rfalChipWriteReg( uint16_t reg, uint8_t* values, uint8_t len, 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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_PARAM Invalid register or bad request
+ * \return ERR_NONE  Read done with no error
+ *****************************************************************************
+ */
+ReturnCode rfalChipReadReg( uint16_t reg, uint8_t* values, uint8_t len, 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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_PARAM Invalid register or bad request
+ * \return ERR_OK    Change done with no error
+ *****************************************************************************
+ */
+ReturnCode rfalChipChangeRegBits( uint16_t reg, uint8_t valueMask, uint8_t value, 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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_PARAM Invalid register or bad request
+ * \return ERR_NONE  Write done with no error
+ *****************************************************************************
+ */
+ReturnCode rfalChipWriteTestReg( uint16_t reg, uint8_t value, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_PARAM Invalid register or bad request
+ * \return 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 ERR_PARAM Invalid register or bad request
+ * \return ERR_OK    Change done with no error
+ *****************************************************************************
+ */
+ReturnCode rfalChipChangeTestRegBits( uint16_t reg, uint8_t valueMask, uint8_t value, 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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_PARAM Invalid command or bad request
+ * \return ERR_NONE  Direct command executed with no error
+ *****************************************************************************
+ */
+ReturnCode rfalChipExecCmd( uint16_t cmd, 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 );
+
+
+#endif /* RFAL_CHIP_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_crc.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,83 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_crc.c
+ *
+ *  \author Oliver Regenfelder
+ *
+ *  \brief CRC calculation implementation
+ *
+ */
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "rfal_crc.h"
+
+/*
+******************************************************************************
+* LOCAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+static uint16_t rfalCrcUpdateCcitt(uint16_t crc, uint8_t dat);
+
+/*
+******************************************************************************
+* 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 crc, uint8_t dat)
+{
+    dat ^= ((uint8_t)crc) & 0xFF;
+    dat ^= dat << 4;
+
+    crc = (crc >> 8)^(((uint16_t) dat) << 8)^(((uint16_t) dat) << 3)^(((uint16_t) dat) >> 4);
+
+    return crc;
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_crc.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,75 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_crc.h
+ *
+ *  \author Ulrich Herrmann
+ *
+ *  \brief CRC calculation module
+ *
+ */
+/*!
+ * 
+ */
+
+#ifndef RFAL_CRC_H_
+#define RFAL_CRC_H_
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "platform1.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_ */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_features.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,114 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief RFAL Features/Capabilities Definition for ST25R3911
+ */
+
+
+#ifndef RFAL_FEATURES_H
+#define RFAL_FEATURES_H
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "platform1.h"
+
+/*
+******************************************************************************
+* GLOBAL DEFINES
+******************************************************************************
+*/
+
+#define RFAL_SUPPORT_MODE_POLL_NFCA                true          /*!< RFAL Poll NFCA mode support switch    */
+#define RFAL_SUPPORT_MODE_POLL_NFCB                true          /*!< RFAL Poll NFCB mode support switch    */
+#define RFAL_SUPPORT_MODE_POLL_NFCF                true          /*!< RFAL Poll NFCF mode support switch    */
+#define RFAL_SUPPORT_MODE_POLL_NFCV                true          /*!< RFAL Poll NFCV mode support switch    */
+#define RFAL_SUPPORT_MODE_POLL_ACTIVE_P2P          true          /*!< RFAL Poll AP2P mode support switch    */
+#define RFAL_SUPPORT_MODE_LISTEN_NFCA              false         /*!< RFAL Listen NFCA mode support switch  */
+#define RFAL_SUPPORT_MODE_LISTEN_NFCB              false         /*!< RFAL Listen NFCB mode support switch  */
+#define RFAL_SUPPORT_MODE_LISTEN_NFCF              false         /*!< RFAL Listen NFCF mode support switch  */
+#define RFAL_SUPPORT_MODE_LISTEN_ACTIVE_P2P        true          /*!< RFAL Listen AP2P mode support switch  */
+
+/*******************************************************************************/
+/*! RFAL supported Card Emulation (CE)        */
+#define RFAL_SUPPORT_CE                            ( RFAL_SUPPORT_MODE_LISTEN_NFCA || RFAL_SUPPORT_MODE_LISTEN_NFCB || RFAL_SUPPORT_MODE_LISTEN_NFCF )
+
+/*! RFAL supported Reader/Writer (RW)         */
+#define RFAL_SUPPORT_RW                            ( RFAL_SUPPORT_MODE_POLL_NFCA || RFAL_SUPPORT_MODE_POLL_NFCB || RFAL_SUPPORT_MODE_POLL_NFCF || RFAL_SUPPORT_MODE_POLL_NFCV )
+
+/*! RFAL support for Active P2P (AP2P)        */
+#define RFAL_SUPPORT_AP2P                          ( RFAL_SUPPORT_MODE_POLL_ACTIVE_P2P || RFAL_SUPPORT_MODE_POLL_ACTIVE_P2P )
+
+
+/*******************************************************************************/
+#define RFAL_SUPPORT_BR_RW_106                      true         /*!< RFAL RW  106 Bit Rate support switch   */
+#define RFAL_SUPPORT_BR_RW_212                      true         /*!< RFAL RW  212 Bit Rate support switch   */
+#define RFAL_SUPPORT_BR_RW_424                      true         /*!< RFAL RW  424 Bit Rate support switch   */
+#define RFAL_SUPPORT_BR_RW_848                      true         /*!< RFAL RW  848 Bit Rate support switch   */
+#define RFAL_SUPPORT_BR_RW_1695                     true         /*!< RFAL RW 1695 Bit Rate support switch   */
+#define RFAL_SUPPORT_BR_RW_3390                     true         /*!< RFAL RW 3390 Bit Rate support switch   */
+#define RFAL_SUPPORT_BR_RW_6780                     false        /*!< RFAL RW 6780 Bit Rate support switch   */
+
+
+/*******************************************************************************/
+#define RFAL_SUPPORT_BR_AP2P_106                    true         /*!< RFAL AP2P  106 Bit Rate support switch */
+#define RFAL_SUPPORT_BR_AP2P_212                    true         /*!< RFAL AP2P  212 Bit Rate support switch */
+#define RFAL_SUPPORT_BR_AP2P_424                    true         /*!< RFAL AP2P  424 Bit Rate support switch */
+#define RFAL_SUPPORT_BR_AP2P_848                    false        /*!< RFAL AP2P  848 Bit Rate support switch */
+#define RFAL_SUPPORT_BR_AP2P_1695                   false        /*!< RFAL AP2P 1695 Bit Rate support switch */
+#define RFAL_SUPPORT_BR_AP2P_3390                   false        /*!< RFAL AP2P 3390 Bit Rate support switch */
+#define RFAL_SUPPORT_BR_AP2P_6780                   false        /*!< RFAL AP2P 6780 Bit Rate support switch */
+
+
+/*******************************************************************************/
+#define RFAL_SUPPORT_BR_CE_A_106                    false        /*!< RFAL CE A 106 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_A_212                    false        /*!< RFAL CE A 212 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_A_424                    false        /*!< RFAL CE A 424 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_A_848                    false        /*!< RFAL CE A 848 Bit Rate support switch  */
+
+
+/*******************************************************************************/
+#define RFAL_SUPPORT_BR_CE_B_106                    false        /*!< RFAL CE B 106 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_B_212                    false        /*!< RFAL CE B 212 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_B_424                    false        /*!< RFAL CE B 424 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_B_848                    false        /*!< RFAL CE B 848 Bit Rate support switch  */
+
+
+/*******************************************************************************/
+#define RFAL_SUPPORT_BR_CE_F_212                    false        /*!< RFAL CE F 212 Bit Rate support switch  */
+#define RFAL_SUPPORT_BR_CE_F_424                    false        /*!< RFAL CE F 424 Bit Rate support switch  */
+
+
+#endif /* RFAL_FEATURES_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_iso15693_2.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,492 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_iso15693_2.c
+ *
+ *  \author Ulrich Herrmann
+ *
+ *  \brief Implementation of ISO-15693-2
+ *
+ */
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "rfal_iso15693_2.h"
+#include "rfal_crc.h"
+#include "utils.h"
+#include "platform1.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_NFCV
+    #error " RFAL: Module configuration missing. Please enable/disable NFC-V module by setting: RFAL_FEATURE_NFCV "
+#endif
+
+#if RFAL_FEATURE_NFCV
+
+/*
+******************************************************************************
+* LOCAL MACROS
+******************************************************************************
+*/
+
+/* #define ISO_15693_DEBUG dbgLog */
+#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 iso15693PhyConfig_t iso15693PhyConfig; /*!< current phy configuration */
+
+/*
+******************************************************************************
+* LOCAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+static ReturnCode iso15693PhyVCDCode1Of4(const uint8_t data, uint8_t* outbuf, uint16_t maxOutBufLen, uint16_t* outBufLen);
+static ReturnCode iso15693PhyVCDCode1Of256(const uint8_t data, uint8_t* outbuf, uint16_t maxOutBufLen, uint16_t* outBufLen);
+
+static struct iso15693StreamConfig stream_config = {
+    .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 */
+};
+
+/*
+******************************************************************************
+* GLOBAL FUNCTIONS
+******************************************************************************
+*/
+ReturnCode iso15693PhyConfigure(const iso15693PhyConfig_t* config, const struct iso15693StreamConfig ** needed_stream_config  )
+{
+
+    /* make a copy of the configuration */
+    ST_MEMCPY(&iso15693PhyConfig, (uint8_t*)config, sizeof(iso15693PhyConfig_t));
+    
+    /* If in fast mode the report period is half: 4=2^2 */
+    stream_config.report_period_length = ( config->fastMode ? 2 : 3 );
+
+    *needed_stream_config = &stream_config;
+
+    return ERR_NONE;
+}
+
+ReturnCode iso15693PhyGetConfiguration(iso15693PhyConfig_t* config)
+{
+    ST_MEMCPY(config, &iso15693PhyConfig, sizeof(iso15693PhyConfig_t));
+
+    return ERR_NONE;
+}
+
+ReturnCode iso15693VCDCode(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 = ERR_NONE;
+    uint8_t eof, sof;
+    uint8_t transbuf[2];
+    uint16_t crc = 0;
+    ReturnCode (*txFunc)(const uint8_t, uint8_t*, uint16_t, uint16_t*);
+    uint8_t crc_len;
+
+    crc_len = ((sendCrc)?2:0);
+
+    *actOutBufSize = 0;
+
+    if (ISO15693_VCD_CODING_1_4 == iso15693PhyConfig.coding)
+    {
+        sof = ISO15693_DAT_SOF_1_4;
+        eof = ISO15693_DAT_EOF_1_4;
+        txFunc = iso15693PhyVCDCode1Of4;
+        *subbit_total_length = (
+                ( 1  /* SOF */
+                  + (length + crc_len) * 4 
+                  + 1) /* EOF */
+                );
+        if (outBufSize < 5)  /* 5 should be safe: enough for sof + 1byte data in 1of4 */
+            return ERR_NOMEM;
+    }
+    else
+    {
+        sof = ISO15693_DAT_SOF_1_256;
+        eof = ISO15693_DAT_EOF_1_256;
+        txFunc = iso15693PhyVCDCode1Of256;
+        *subbit_total_length = (
+                ( 1  /* SOF */
+                  + (length + crc_len) * 64 
+                  + 1) /* EOF */
+                );
+
+        if (*offset)
+        {
+            if (outBufSize < 64)  /* 64 should be safe: enough a single byte data in 1of256 */
+                return ERR_NOMEM;
+        }
+        else
+        {
+            if (outBufSize < 65)  /* At beginning of a frame we need at least 65 bytes to start: enough for sof + 1byte data in 1of256 */
+                return ERR_NOMEM;
+        }
+    }
+
+    if (length == 0)
+    {
+        *subbit_total_length = 1;
+    }
+
+    if (length && (0 == *offset) && sendFlags && !picopassMode)
+    {
+        /* set high datarate flag */
+        buffer[0] |= ISO15693_REQ_FLAG_HIGH_DATARATE;
+        /* clear sub-carrier flag - we only support single sub-carrier */
+        buffer[0] &= ~ISO15693_REQ_FLAG_TWO_SUBCARRIERS;
+    }
+
+    /* Send SOF if at 0 offset */
+    if (length && 0 == *offset)
+    {
+        *outbuf = sof; 
+        (*actOutBufSize)++;
+        outBufSize--;
+        outbuf++;
+    }
+
+    while (*offset < length && err == ERR_NONE)
+    {
+        uint16_t filled_size;
+        /* send data */
+        err = txFunc(buffer[*offset], outbuf, outBufSize, &filled_size);
+        (*actOutBufSize) += filled_size;
+        outbuf+=filled_size;
+        outBufSize -= filled_size;
+        if (!err) (*offset)++;
+    }
+    if (err) return ERR_AGAIN;
+
+    while (!err && sendCrc && *offset < length + 2)
+    {
+        uint16_t filled_size;
+        if (0==crc)
+        {
+            crc = rfalCrcCalculateCcitt( ((picopassMode) ? 0xE012 : 0xFFFF),         /* 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 - 1) : length));  /* CMD byte is not taken into account in PicoPass mode */
+            
+            crc = ((picopassMode) ? crc : ~crc);
+        }
+        /* send crc */
+        transbuf[0] = crc & 0xff;
+        transbuf[1] = (crc >> 8) & 0xff;
+        err = txFunc(transbuf[*offset - length], outbuf, outBufSize, &filled_size);
+        (*actOutBufSize) += filled_size;
+        outbuf+=filled_size;
+        outBufSize -= filled_size;
+        if(!err) (*offset)++;
+    }
+    if (err) return ERR_AGAIN;
+
+    if ((!sendCrc && (*offset) == length)
+            || (sendCrc && (*offset) == length + 2))
+    {
+        *outbuf = eof; 
+        (*actOutBufSize)++;
+        outBufSize--;
+        outbuf++;
+    }
+    else return ERR_AGAIN;
+
+    return err;
+}
+
+ReturnCode iso15693VICCDecode(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 = ERR_NONE;
+    uint16_t crc;
+    uint16_t mp; /* Current bit position in manchester bit inBuf*/
+    uint16_t bp; /* Current bit postion in outBuf */
+
+    *bitsBeforeCol = 0;
+    *outBufPos = 0;
+
+    /* first check for valid SOF. Since it starts with 3 unmodulated pulses it is 0x17. */
+    if ((inBuf[0] & 0x1f) != 0x17)
+    {
+		ISO_15693_DEBUG("0x%x\n", iso15693PhyBitBuffer[0]);
+		err = ERR_FRAMING;
+		goto out;
+    }
+    ISO_15693_DEBUG("SOF\n");
+
+    if (!outBufLen)
+    {
+        goto out;
+    }
+
+    mp = 5; /* 5 bits were SOF, now manchester starts: 2 bits per payload bit */
+    bp = 0;
+
+    memset(outBuf,0,outBufLen);
+
+    for ( ; mp < inBufLen * 8 - 2; mp+=2 )
+    {
+        uint8_t man;
+        man  = (inBuf[mp/8] >> mp%8) & 0x1;
+        man |= ((inBuf[(mp+1)/8] >> (mp+1)%8) & 0x1) << 1;
+        if (1 == man)
+        {
+            bp++;
+        }
+        if (2 == man)
+        {
+            outBuf[bp/8] |= 1 << (bp%8);
+            bp++;
+        }
+        if (bp%8 == 0)
+        { /* Check for EOF */
+            ISO_15693_DEBUG("ceof %hhx %hhx\n", inBuf[mp/8], inBuf[mp/8+1]);
+            if ( ((inBuf[mp/8]   & 0xe0) == 0xa0)
+               &&(inBuf[mp/8+1] == 0x03))
+            { /* Now we know that it was 10111000 = EOF */
+                ISO_15693_DEBUG("EOF\n");
+                break;
+            }
+        }
+        if (0 == man || 3 == man)
+        {  
+            if (bp >= ignoreBits)
+            {
+                err = ERR_RF_COLLISION;
+                break;
+            }
+            /* ignored collision: leave as 0 */
+            bp++;
+        }
+        if (bp >= outBufLen * 8)
+        { /* Don't write beyond the end */
+            break;
+        }
+    }
+
+    *outBufPos = bp / 8;
+    *bitsBeforeCol = bp;
+
+    if (err) goto out;
+
+    if (bp%8 != 0)
+    {
+        err = ERR_CRC;
+        goto out;
+    }
+
+    if (*outBufPos > 2)
+    {
+        /* finally, check crc */
+        ISO_15693_DEBUG("Calculate CRC, val: 0x%x, outBufLen: ", *outBuf);
+        ISO_15693_DEBUG("0x%x ", *outBufPos - 2);
+        
+        crc = rfalCrcCalculateCcitt( ((picopassMode) ? 0xE012 : 0xFFFF), outBuf, *outBufPos - 2);
+        crc = ((picopassMode) ? crc : ~crc);
+        
+        if (((crc & 0xff) == outBuf[*outBufPos-2]) &&
+                (((crc >> 8) & 0xff) == outBuf[*outBufPos-1]))
+        {
+            err = 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 = ERR_CRC;
+        }
+    }
+    else
+    {
+        err = ERR_CRC;
+    }
+out:
+    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 ERR_IO : Error during communication.
+ *  \return ERR_NONE : No error.
+ *
+ *****************************************************************************
+ */
+static ReturnCode iso15693PhyVCDCode1Of4(const uint8_t data, uint8_t* outbuf, uint16_t maxOutBufLen, uint16_t* outBufLen)
+{
+    uint8_t tmp;
+    ReturnCode err = ERR_NONE;
+    uint16_t a;
+
+    *outBufLen = 0;
+
+    if (maxOutBufLen < 4)
+        return ERR_NOMEM;
+
+    tmp = data;
+    for (a = 0; a < 4; a++)
+    {
+        switch (tmp & 0x3)
+        {
+            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;
+        }
+        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 ERR_IO : Error during communication.
+ *  \return ERR_NONE : No error.
+ *
+ *****************************************************************************
+ */
+static ReturnCode iso15693PhyVCDCode1Of256(const uint8_t data, uint8_t* outbuf, uint16_t maxOutBufLen, uint16_t* outBufLen)
+{
+    uint8_t tmp;
+    ReturnCode err = ERR_NONE;
+    uint16_t a;
+
+    *outBufLen = 0;
+
+    if (maxOutBufLen < 64)
+        return ERR_NOMEM;
+
+    tmp = data;
+    for (a = 0; a < 64; 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;
+        }
+        outbuf++;
+        (*outBufLen)++;
+        tmp -= 4;
+    }
+
+    return err;
+}
+
+#endif /* RFAL_FEATURE_NFCV */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_iso15693_2.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,209 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_iso15693.h
+ *
+ *  \author Ulrich Herrmann
+ *
+ *  \brief Implementation of ISO-15693-2
+ *
+ */
+/*!
+ *
+ */
+
+#ifndef RFAL_ISO_15693_2_H
+#define RFAL_ISO_15693_2_H
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "platform1.h"
+#include "st_errno.h"
+#include <stdbool.h>
+/*
+******************************************************************************
+* GLOBAL DATATYPES
+******************************************************************************
+*/
+/*!
+ * enum holding possible VCD codings
+ */
+typedef enum
+{
+    ISO15693_VCD_CODING_1_4,
+    ISO15693_VCD_CODING_1_256
+}iso15693VcdCoding_t;
+
+/*!
+ * enum holding possible VICC datarates
+ */
+
+/*!
+ * Configuration parameter used by #iso15693PhyConfigure
+ */
+typedef struct
+{
+    iso15693VcdCoding_t coding;      /*!< desired VCD coding                                       */
+    bool                fastMode;    /*!< Fast mode - all pulse numbers and times are divided by 2 */
+}iso15693PhyConfig_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
+******************************************************************************
+*/
+
+/* t1min = 308,2us = 4192/fc = 65.5 * 64/fc */
+#define ISO15693_MASK_RECEIVE_TIME (65)
+
+/* t1max = 323,3us = 4384/fc = 68.5 * 64/fc
+ *         12 = 768/fc unmodulated time of single subcarrior SoF */
+#define ISO15693_NO_RESPONSE_TIME (69 + 12)
+
+
+#define ISO15693_REQ_FLAG_TWO_SUBCARRIERS 0x01
+#define ISO15693_REQ_FLAG_HIGH_DATARATE   0x02
+/*
+******************************************************************************
+* GLOBAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+/*!
+ *****************************************************************************
+ *  \brief  Initialize the ISO15693 phy.
+ *  \note This function needs to be called every time after switching
+ *  from a different mode and before #iso15693Initialize
+ *
+ *  \param[in] config : ISO15693 phy related configuration (See #iso15693PhyConfig_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 ERR_IO : Error during communication.
+ *  \return ERR_NONE : No error.
+ *
+ *****************************************************************************
+ */
+extern ReturnCode iso15693PhyConfigure(const iso15693PhyConfig_t* config,
+                                       const struct iso15693StreamConfig ** needed_stream_config  );
+
+/*!
+ *****************************************************************************
+ *  \brief  Return current phy configuration.
+ *
+ *  This function returns current Phy configuration previously
+ *  set by #iso15693PhyConfigure
+ *
+ *  \param[out] config : ISO15693 phy configuration.
+ *
+ *  \return ERR_NONE : No error.
+ *
+ *****************************************************************************
+ */
+extern ReturnCode iso15693PhyGetConfiguration(iso15693PhyConfig_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 ST25R3911.
+ *
+ *  \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 ERR_IO : Error during communication.
+ *  \return ERR_AGAIN : Data was not coded all the way. Call function again with a new/emptied buffer
+ *  \return 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 ERR_NONE : No error.
+ *
+ *****************************************************************************
+ */
+extern ReturnCode iso15693VCDCode(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 ST25R3911, 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[out] 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 ERR_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 ERR_COLLISION : collision occured, data uncorrect
+ *  \return ERR_CRC : CRC error, data uncorrect
+ *  \return ERR_TIMEOUT : timeout waiting for data.
+ *  \return ERR_NONE : No error.
+ *
+ *****************************************************************************
+ */
+extern ReturnCode iso15693VICCDecode(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 */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_isoDep.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,2273 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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:   NFCC firmware
+ *      LANGUAGE:  ISO C99
+ */
+
+/*! \file rfal_isoDep.c
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of ISO-DEP protocol
+ *  
+ *  This implementation was based on the following specs:
+ *    - ISO/IEC 14443-4  2nd Edition 2008-07-15
+ *    - NFC Forum Digital Protocol  1.1 2014-01-14
+ *
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+
+#include "rfal_isoDep.h"
+#include "rfal_rf.h"
+#include "utils.h"
+#include "platform1.h"
+
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_ISO_DEP
+    #error " RFAL: Module configuration missing. Please enable/disable ISO-DEP module by setting: RFAL_FEATURE_ISO_DEP "
+#endif
+
+#if RFAL_FEATURE_ISO_DEP
+
+/* Check for valid I-Block length [RFAL_ISODEP_FSX_16 ; RFAL_ISODEP_FSX_4096]*/
+#if( (RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN > 4096 ) || (RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN < 16) )
+    #error " RFAL: Invalid ISO-DEP IBlock Max length. Please change RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN. "
+#endif
+
+/* Check for valid APDU length, It must be n*IBlock */
+#if( (RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN < RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN) || (RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN % RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN) )
+    #error " RFAL: Invalid ISO-DEP APDU Max length. Please change RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN. "
+#endif
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+#define ISODEP_CRC_LEN                  RFAL_CRC_LEN   /*!< ISO1443 CRC Length */
+
+
+#define ISODEP_PCB_POS                  (0)         /*!< PCB position on message header*/
+#define ISODEP_SWTX_INF_POS             (1)         /*!< INF position in a S-WTX       */
+
+#define ISODEP_DID_POS                  (1)         /*!< DID position on message header*/
+#define ISODEP_SWTX_PARAM_LEN           (1)         /*!< SWTX parameter length         */
+
+#define ISODEP_DSL_MAX_LEN              ( RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN ) /*!< Deselect Req/Res length */
+
+#define ISODEP_PCB_xBLOCK_MASK          (0xC0)      /*!< Bit mask for Block type       */
+#define ISODEP_PCB_IBLOCK               (0x00)      /*!< Bit mask indicating a I-Block */
+#define ISODEP_PCB_RBLOCK               (0x80)      /*!< Bit mask indicating a R-Block */
+#define ISODEP_PCB_SBLOCK               (0xC0)      /*!< Bit mask indicating a S-Block */
+#define ISODEP_PCB_INVALID              (0x40)      /*!< Bit mask of an Invalid PCB    */
+
+#define ISODEP_HDR_MAX_LEN              (RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN + RFAL_ISODEP_NAD_LEN)          /*!< Max header length (PCB + DID + NAD)      */
+
+#define ISODEP_PCB_IB_VALID_MASK        (ISODEP_PCB_B6_BIT | ISODEP_PCB_B2_BIT)                     /*!< Bit mask for the MUST bits on I-Block    */
+#define ISODEP_PCB_IB_VALID_VAL         (ISODEP_PCB_B2_BIT)                                         /*!< Value for the MUST bits on I-Block       */
+#define ISODEP_PCB_RB_VALID_MASK        (ISODEP_PCB_B6_BIT | ISODEP_PCB_B3_BIT | ISODEP_PCB_B2_BIT) /*!< Bit mask for the MUST bits on R-Block    */
+#define ISODEP_PCB_RB_VALID_VAL         (ISODEP_PCB_B6_BIT | ISODEP_PCB_B2_BIT)                     /*!< Value for the MUST bits on R-Block       */
+#define ISODEP_PCB_SB_VALID_MASK        (ISODEP_PCB_B3_BIT | ISODEP_PCB_B2_BIT | ISODEP_PCB_B1_BIT) /*!< Bit mask for the MUST bits on I-Block    */
+#define ISODEP_PCB_SB_VALID_VAL         (ISODEP_PCB_B2_BIT)                                         /*!< Value for the MUST bits on I-Block       */
+
+
+#define ISODEP_PCB_B1_BIT               (0x01)      /*!< Bit mask for the RFU S Blocks                                        */
+#define ISODEP_PCB_B2_BIT               (0x02)      /*!< Bit mask for the RFU bit2 in I,S,R Blocks                            */
+#define ISODEP_PCB_B3_BIT               (0x04)      /*!< Bit mask for the RFU bit3 in R Blocks                                */
+#define ISODEP_PCB_B6_BIT               (0x20)      /*!< Bit mask for the RFU bit2 in R Blocks                                */
+#define ISODEP_PCB_CHAINING_BIT         (0x10)      /*!< Bit mask for the chaining bit of an ISO DEP I-Block in PCB.          */
+#define ISODEP_PCB_DID_BIT              (0x08)      /*!< Bit mask for the DID presence bit of an ISO DEP I,S,R Blocks PCB.    */
+#define ISODEP_PCB_NAD_BIT              (0x04)      /*!< Bit mask for the NAD presence bit of an ISO DEP I,S,R Blocks in PCB  */
+#define ISODEP_PCB_BN_MASK              (0x01)      /*!< Bit mask for the block number of an ISO DEP I,R Block in PCB         */
+
+#define ISODEP_SWTX_PL_MASK             (0xC0)      /*!< Bit mask for the Power Level bits of the inf byte of an WTX request or response */
+#define ISODEP_SWTX_WTXM_MASK           (0x3F)      /*!< Bit mask for the WTXM bits of the inf byte of an WTX request or response        */
+
+
+#define ISODEP_RBLOCK_INF_LEN           (0)         /*!< INF length of R-Block               Digital 1.1 15.1.3 */
+#define ISODEP_SDSL_INF_LEN             (0)         /*!< INF length of S(DSL)                Digital 1.1 15.1.3 */
+#define ISODEP_SWTX_INF_LEN             (1)         /*!< INF length of S(WTX)                Digital 1.1 15.2.2 */
+
+#define ISODEP_WTXM_MIN                 (1)         /*!< Minimum allowed value for the WTXM, Digital 1.0 13.2.2 */
+#define ISODEP_WTXM_MAX                 (59)        /*!< Maximum allowed value for the WTXM, Digital 1.0 13.2.2 */
+
+#define ISODEP_PCB_Sxx_MASK             (0x30)      /*!< Bit mask for the S-Block type                          */
+#define ISODEP_PCB_DESELECT             (0x00)      /*!< Bit mask for S-Block indicating Deselect               */
+#define ISODEP_PCB_WTX                  (0x30)      /*!< Bit mask for S-Block indicating Waiting Time eXtension */
+
+#define ISODEP_PCB_Rx_MASK              (0x10)      /*!< Bit mask for the R-Block type       */
+#define ISODEP_PCB_ACK                  (0x00)      /*!< Bit mask for R-Block indicating ACK */
+#define ISODEP_PCB_NAK                  (0x10)      /*!< Bit mask for R-Block indicating NAK */
+
+/*! Maximum length of control message (no INF) */
+#define ISODEP_CONTROLMSG_BUF_LEN       (RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN + RFAL_ISODEP_NAD_LEN + ISODEP_SWTX_PARAM_LEN)
+
+#define ISODEP_FWT_DEACTIVATION         (71680)     /*!< FWT to be used after DESELECT, Digital 1.0 A9   */
+#define ISODEP_MAX_RERUNS               (0x0FFFFFFF)/*!< Maximum rerun retrys for a blocking protocol run*/
+
+
+#define ISODEP_PCBSBLOCK                ( 0x00 | ISODEP_PCB_SBLOCK | ISODEP_PCB_B2_BIT )  /*!< PCB Value of a S-Block               */ 
+#define ISODEP_PCB_SDSL                 ( ISODEP_PCBSBLOCK | ISODEP_PCB_DESELECT )        /*!< PCB Value of a S-Block with DESELECT */
+#define ISODEP_PCB_SWTX                 ( ISODEP_PCBSBLOCK | ISODEP_PCB_WTX )             /*!< PCB Value of a S-Block with WTX      */
+
+#define ISODEP_FWI_LIS_MAX_NFC          8                            /*!< FWT Listener Max FWIT4ATmax FWIBmax  Digital 1.1  A6 & A3 */
+#define ISODEP_FWI_LIS_MAX_EMVCO        7                            /*!< FWT Listener Max FWIMAX       EMVCo 2.6 A.5               */
+#define ISODEP_FWI_LIS_MAX              ((gIsoDep.compMode == RFAL_COMPLIANCE_MODE_EMV) ? ISODEP_FWI_LIS_MAX_EMVCO : ISODEP_FWI_LIS_MAX_NFC)  /*!< FWI Listener Max as NFC / EMVCo */
+#define ISODEP_FWT_LIS_MAX              rfalIsoDepFWI2FWT(ISODEP_FWI_LIS_MAX)             /*!< FWT Listener Max                     */
+
+#define ISODEP_FWI_MIN_10               (1)      /*!< Minimum value for FWI Digital 1.0 11.6.2.17 */
+#define ISODEP_FWI_MIN_11               (0)      /*!< Default value for FWI Digital 1.1 13.6.2    */
+#define ISODEP_FWI_MAX                  (14)     /*!< Maximum value for FWI Digital 1.0 11.6.2.17 */
+#define ISODEP_SFGI_MIN                 (0)      /*!< Default value for FWI Digital 1.1 13.6.2.22 */
+#define ISODEP_SFGI_MAX                 (14)     /*!< Maximum value for FWI Digital 1.1 13.6.2.22 */
+
+
+/**********************************************************************************************************************/
+/**********************************************************************************************************************/
+#define RFAL_ISODEP_NO_PARAM                   (0)     /*!< No parameter flag for isoDepHandleControlMsg()     */
+
+#define RFAL_ISODEP_CMD_RATS                   (0xE0)  /*!< RATS command   Digital 1.1  13.6.1                 */
+
+#define RFAL_ISODEP_ATS_MIN_LEN                (1)                                                    /*!< Minimum ATS length   Digital 1.1  13.6.2 */
+#define RFAL_ISODEP_ATS_HDR_LEN                (5)                                                    /*!< ATS headerlength     Digital 1.1  13.6.2 */
+#define RFAL_ISODEP_ATS_MAX_LEN                (RFAL_ISODEP_ATS_HDR_LEN + RFAL_ISODEP_ATS_HB_MAX_LEN) /*!< Maximum ATS length   Digital 1.1  13.6.2 */
+#define RFAL_ISODEP_ATS_T0_FSCI_MASK           (0x0F)                                                 /*!< ATS T0's FSCI mask   Digital 1.1  13.6.2 */
+#define RFAL_ISODEP_ATS_TB_FWI_SHIFT           (4)                                                    /*!< ATS TB's FWI shift   Digital 1.1  13.6.2 */
+#define RFAL_ISODEP_ATS_FWI_MASK               (0x0F)                                                 /*!< ATS TB's FWI shift   Digital 1.1  13.6.2 */
+
+
+#define RFAL_ISODEP_PPS_SB                     (0xD0)  /*!< PPS REQ PPSS's SB value (no CID)   ISO14443-4  5.3 */
+#define RFAL_ISODEP_PPS_MASK                   (0xF0)  /*!< PPS REQ PPSS's SB mask             ISO14443-4  5.3 */
+#define RFAL_ISODEP_PPS_SB_DID_MASK            (0x0F)  /*!< PPS REQ PPSS's DID|CID mask        ISO14443-4  5.3 */
+#define RFAL_ISODEP_PPS_PPS0_PPS1_PRESENT      (0x11)  /*!< PPS REQ PPS0 indicating that PPS1 is present       */
+#define RFAL_ISODEP_PPS_PPS1                   (0x00)  /*!< PPS REQ PPS1 fixed value           ISO14443-4  5.3 */
+#define RFAL_ISODEP_PPS_PPS1_DSI_SHIFT         (2)     /*!< PPS REQ PPS1 fixed value           ISO14443-4  5.3 */
+#define RFAL_ISODEP_PPS_PPS1_DXI_MASK          (0x0F)  /*!< PPS REQ PPS1 fixed value           ISO14443-4  5.3 */
+#define RFAL_ISODEP_PPS_RES_LEN                (1)     /*!< PPS Response length                ISO14443-4  5.4 */
+#define RFAL_ISODEP_PPS_STARTBYTE_POS          (0)     /*!< PPS REQ PPSS's byte position       ISO14443-4  5.4 */
+#define RFAL_ISODEP_PPS_PPS0_POS               (1)     /*!< PPS REQ PPS0's byte position       ISO14443-4  5.4 */
+#define RFAL_ISODEP_PPS_PPS1_POS               (2)     /*!< PPS REQ PPS1's byte position       ISO14443-4  5.4 */
+#define RFAL_ISODEP_PPS0_VALID_MASK            (0xEF)  /*!< PPS REQ PPS0 valid coding mask     ISO14443-4  5.4 */
+
+#define RFAL_ISODEP_CMD_ATTRIB                 (0x1D)  /*!< ATTRIB command                 Digital 1.1  14.6.1 */
+#define RFAL_ISODEP_ATTRIB_PARAM2_DSI_SHIFT    (6)     /*!< ATTRIB PARAM2 DSI shift        Digital 1.1  14.6.1 */
+#define RFAL_ISODEP_ATTRIB_PARAM2_DRI_SHIFT    (4)     /*!< ATTRIB PARAM2 DRI shift        Digital 1.1  14.6.1 */
+#define RFAL_ISODEP_ATTRIB_PARAM2_DXI_MASK     (0xF0)  /*!< ATTRIB PARAM2 DxI mask         Digital 1.1  14.6.1 */
+#define RFAL_ISODEP_ATTRIB_PARAM2_FSDI_MASK    (0x0F)  /*!< ATTRIB PARAM2 FSDI mask        Digital 1.1  14.6.1 */
+#define RFAL_ISODEP_ATTRIB_PARAM4_DID_MASK     (0x0F)  /*!< ATTRIB PARAM4 DID mask         Digital 1.1  14.6.1 */
+#define RFAL_ISODEP_ATTRIB_HDR_LEN             (9)     /*!< ATTRIB REQ header length       Digital 1.1  14.6.1 */
+
+#define RFAL_ISODEP_ATTRIB_RES_HDR_LEN         (1)     /*!< ATTRIB RES header length       Digital 1.1  14.6.2 */
+#define RFAL_ISODEP_ATTRIB_RES_DID_MASK        (0x0F)  /*!< ATTRIB RES DID mask            Digital 1.1  14.6.2 */
+#define RFAL_ISODEP_ATTRIB_RES_MLBI_MASK       (0x0F)  /*!< ATTRIB RES MBLI mask           Digital 1.1  14.6.2 */
+#define RFAL_ISODEP_ATTRIB_RES_MLBI_SHIFT      (4)     /*!< ATTRIB RES MBLI shift          Digital 1.1  14.6.2 */
+
+#define RFAL_ISODEP_DID_MASK                   (0x0F)  /*!< ISODEP's DID mask                                  */
+#define RFAL_ISODEP_DID_00                     (0)     /*!< ISODEP's DID value 0                               */
+
+
+#define RFAL_ISODEP_RATS_PARAM_FSDI_MASK       (0xF0)  /*!< Mask bits for FSDI in RATS                         */
+#define RFAL_ISODEP_RATS_PARAM_FSDI_SHIFT      (4)     /*!< Shift for FSDI in RATS                             */
+#define RFAL_ISODEP_RATS_PARAM_DID_MASK        (0x0F)  /*!< Mask bits for DID in RATS                          */
+
+#define RFAL_ISODEP_ATS_TL_OFFSET              (0x00)  /*!< Offset of TL on ATS                                */
+#define RFAL_ISODEP_ATS_TA_OFFSET              (0x02)  /*!< Offset of TA if it is present on ATS               */
+#define RFAL_ISODEP_ATS_TB_OFFSET              (0x03)  /*!< Offset of TB if both TA and TB is present on ATS   */
+#define RFAL_ISODEP_ATS_TC_OFFSET              (0x04)  /*!< Offset of TC if both TA,TB & TC are present on ATS */
+#define RFAL_ISODEP_ATS_HIST_OFFSET            (0x05)  /*!< Offset of Historical Bytes if TA, TB & TC are present on ATS          */
+#define RFAL_ISODEP_ATS_TC_ADV_FEAT            (0x10)  /*!< Bit mask indicating support for Advanced protocol features: DID & NAD */
+#define RFAL_ISODEP_ATS_TC_DID                 (0x02)  /*!< Bit mask indicating support for DID                 */
+#define RFAL_ISODEP_ATS_TC_NAD                 (0x01)  /*!< Bit mask indicating support for NAD                 */
+
+#define RFAL_ISODEP_PPS0_PPS1_PRESENT          (0x11) /*!< PPS0 byte indicating that PPS1 is present            */
+#define RFAL_ISODEP_PPS0_PPS1_NOT_PRESENT      (0x01) /*!< PPS0 byte indicating that PPS1 is NOT present        */
+#define RFAL_ISODEP_PPS1_DRI_MASK              (0x03) /*!< PPS1 byte DRI mask bits                              */
+#define RFAL_ISODEP_PPS1_DSI_MASK              (0x0C) /*!< PPS1 byte DSI mask bits                              */
+#define RFAL_ISODEP_PPS1_DSI_SHIFT             (2)    /*!< PPS1 byte DSI shift                                  */
+#define RFAL_ISODEP_PPS1_DxI_MASK              (0x03) /*!< PPS1 byte DSI/DRS mask bits                          */
+
+
+/*! Delta Time for polling during Activation (ATS) : 20ms    Digital 1.0 11.7.1.1 & A.7    */
+#define RFAL_ISODEP_T4T_DTIME_POLL_10          rfalConvMsTo1fc(20)
+
+/*! Delta Time for polling during Activation (ATS) : 16.4ms  Digital 1.1 13.8.1.1 & A.6
+ *  Use 16 ms as testcase T4AT_BI_10_03 sends a frame exactly at the border */
+#define RFAL_ISODEP_T4T_DTIME_POLL_11          216960
+
+/*! Activation frame waiting time FWT(act) = 71680/fc (~5286us) Digital 1.1 13.8.1.1 & A.6 */
+#define RFAL_ISODEP_T4T_FWT_ACTIVATION         (71680 + RFAL_ISODEP_T4T_DTIME_POLL_11)
+
+
+/*! Delta frame waiting time = 16/fc  Digital 1.0  11.7.1.3 & A.7*/
+#define RFAL_ISODEP_DFWT_10                      16
+
+/*! Delta frame waiting time = 16/fc  Digital 1.1  13.8.1.3 & A.8*/
+#define RFAL_ISODEP_DFWT_11                      49152
+
+/*
+ ******************************************************************************
+ * MACROS
+ ******************************************************************************
+ */
+
+#define isoDep_PCBisIBlock( pcb )       ( (pcb & (ISODEP_PCB_xBLOCK_MASK | ISODEP_PCB_IB_VALID_MASK)) == (ISODEP_PCB_IBLOCK | ISODEP_PCB_IB_VALID_VAL)) /*!< Checks if pcb is a I-Block */
+#define isoDep_PCBisRBlock( pcb )       ( (pcb & (ISODEP_PCB_xBLOCK_MASK | ISODEP_PCB_RB_VALID_MASK)) == (ISODEP_PCB_RBLOCK | ISODEP_PCB_RB_VALID_VAL)) /*!< Checks if pcb is a R-Block */
+#define isoDep_PCBisSBlock( pcb )       ( (pcb & (ISODEP_PCB_xBLOCK_MASK | ISODEP_PCB_SB_VALID_MASK)) == (ISODEP_PCB_SBLOCK | ISODEP_PCB_SB_VALID_VAL)) /*!< Checks if pcb is a S-Block */
+
+#define isoDep_PCBisChaining( pcb )     ( (pcb & ISODEP_PCB_CHAINING_BIT) == ISODEP_PCB_CHAINING_BIT) /*!< Checks if pcb is indicating chaining */
+
+#define isoDep_PCBisDeselect( pcb )     ( (pcb & ISODEP_PCB_Sxx_MASK) == ISODEP_PCB_DESELECT)         /*!< Checks if pcb is indicating DESELECT */
+#define isoDep_PCBisWTX( pcb )          ( (pcb & ISODEP_PCB_Sxx_MASK) == ISODEP_PCB_WTX)              /*!< Checks if pcb is indicating WTX      */
+
+#define isoDep_PCBisACK( pcb )          ( (pcb & ISODEP_PCB_Rx_MASK) == ISODEP_PCB_ACK)               /*!< Checks if pcb is indicating ACK      */
+#define isoDep_PCBisNAK( pcb )          ( (pcb & ISODEP_PCB_Rx_MASK) == ISODEP_PCB_NAK)               /*!< Checks if pcb is indicating ACK      */
+
+#define isoDep_PCBhasDID( pcb )         ( (pcb & ISODEP_PCB_DID_BIT) == ISODEP_PCB_DID_BIT)           /*!< Checks if pcb is indicating DID      */
+#define isoDep_PCBhasNAD( pcb )         ( (pcb & ISODEP_PCB_NAD_BIT) == ISODEP_PCB_NAD_BIT)           /*!< Checks if pcb is indicating NAD      */
+
+
+#define isoDep_PCBisIChaining( pcb )    ( isoDep_PCBisIBlock(pcb) && isoDep_PCBisChaining(pcb) )      /*!< Checks if pcb is I-Block indicating chaining*/
+
+#define isoDep_PCBisSDeselect( pcb )    ( isoDep_PCBisSBlock(pcb) && isoDep_PCBisDeselect(pcb) )      /*!< Checks if pcb is S-Block indicating DESELECT*/
+#define isoDep_PCBisSWTX( pcb )         ( isoDep_PCBisSBlock(pcb) && isoDep_PCBisWTX(pcb) )           /*!< Checks if pcb is S-Block indicating WTX     */
+
+#define isoDep_PCBisRACK( pcb )         ( isoDep_PCBisRBlock(pcb) && isoDep_PCBisACK(pcb) )           /*!< Checks if pcb is R-Block indicating ACK     */
+#define isoDep_PCBisRNAK( pcb )         ( isoDep_PCBisRBlock(pcb) && isoDep_PCBisNAK(pcb) )           /*!< Checks if pcb is R-Block indicating NAK     */
+
+
+#define isoDep_PCBIBlock( bn )          ( (uint8_t)( 0x00 | ISODEP_PCB_IBLOCK | ISODEP_PCB_B2_BIT | (bn & ISODEP_PCB_BN_MASK) ))  /*!< Returns an I-Block with the given block number (bn)                     */  
+#define isoDep_PCBIBlockChaining( bn )  ( (uint8_t)(isoDep_PCBIBlock(bn) | ISODEP_PCB_CHAINING_BIT))                              /*!< Returns an I-Block with the given block number (bn) indicating chaining */
+
+#define isoDep_PCBRBlock( bn )          ( (uint8_t)( 0x00 | ISODEP_PCB_RBLOCK | ISODEP_PCB_B6_BIT | ISODEP_PCB_B2_BIT | (bn & ISODEP_PCB_BN_MASK) ) ) /*!< Returns an R-Block with the given block number (bn)                */
+#define isoDep_PCBRACK( bn )            ( (uint8_t)( isoDep_PCBRBlock( bn ) | ISODEP_PCB_ACK ) )                                                      /*!< Returns an R-Block with the given block number (bn) indicating ACK */
+#define isoDep_PCBRNAK( bn )            ( (uint8_t)( isoDep_PCBRBlock( bn ) | ISODEP_PCB_NAK ) )                                                      /*!< Returns an R-Block with the given block number (bn) indicating NAK */
+
+
+#define isoDep_GetBN( pcb )             ( (uint8_t) ((pcb) & ISODEP_PCB_BN_MASK   ) )                  /*!< Returns the block number (bn) from the given pcb */
+#define isoDep_GetWTXM( inf )           ( (uint8_t) ((inf) & ISODEP_SWTX_WTXM_MASK) )                  /*!< Returns the WTX value from the given inf byte    */
+#define isoDep_isWTXMValid( wtxm )      (((wtxm) >= ISODEP_WTXM_MIN) && ((wtxm) <= ISODEP_WTXM_MAX))   /*!< Checks if the given wtxm is valid                */
+
+#define isoDep_WTXMListenerMax( fwt )   ( MIN( (uint8_t)(ISODEP_FWT_LIS_MAX / fwt), ISODEP_WTXM_MAX) ) /*!< Calculates the Max WTXM value for the given fwt as a Listener    */
+
+#define isoDepCalcdSGFT( s )            (384  * (uint32_t)(1 << (s)))                                  /*!< Calculates the dSFGT with given SFGI  Digital 1.1  13.8.2.1 & A.6*/
+#define isoDepCalcSGFT( s )             (4096 * (uint32_t)(1 << (s)))                                  /*!< Calculates the SFGT with given SFGI  Digital 1.1  13.8.2         */
+
+#define isoDep_PCBNextBN( bn )          ((uint8_t)((bn^0x01) & ISODEP_PCB_BN_MASK))                    /*!< Returns the value of the next block number based on bn     */
+#define isoDep_PCBPrevBN( bn )          isoDep_PCBNextBN(bn)                                           /*!< Returns the value of the previous block number based on bn */
+#define isoDep_ToggleBN( bn )           (bn = ((bn^0x01) & ISODEP_PCB_BN_MASK) )                       /*!< Toggles the block number value of the given bn             */
+
+#define isoDep_WTXAdjust( v )           (v - (v>>3))                                                   /*!< Adjust WTX timer value to a percentage of the total, current 88% */
+
+
+/*! ISO 14443-4 7.5.6.2 & Digital 1.1 - 15.2.6.2  The CE SHALL NOT attempt error recovery and remains in Rx mode upon Transmission or a Protocol Error */
+#define isoDepReEnableRx( rxB, rxBL, rxL )              rfalTransceiveBlockingTx( NULL, 0, rxB, rxBL, rxL, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FWT_NONE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) 
+
+#define isoDepTimerStart( timer, time_ms ) timer = platformTimerCreate(time_ms)                        /*!< Configures and starts the WTX timer  */
+#define isoDepTimerisExpired( timer )      platformTimerIsExpired( timer )                             /*!< Checks WTX timer has expired         */
+
+/*
+ ******************************************************************************
+ * LOCAL DATA TYPES
+ ******************************************************************************
+ */
+
+/*! Enumeration of the possible control message types */
+typedef enum isoDepControlMsg
+{    
+    ISODEP_R_ACK,                    /*!< R-ACK  Acknowledge            */
+    ISODEP_R_NAK,                    /*!< R-NACK Negative acknowledge   */
+    ISODEP_S_WTX,                    /*!< S-WTX  Waiting Time Extension */
+    ISODEP_S_DSL                     /*!< S-DSL  Deselect               */
+} rfalIsoDepControlMsg;
+
+/*! Enumeration of the IsoDep roles */
+typedef enum{
+    ISODEP_ROLE_PCD,                /*!< Perform as Reader/PCD          */
+    ISODEP_ROLE_PICC                /*!< Perform as Card/PICC           */
+} rfalIsoDepRole;
+
+/*! ISO-DEP layer states */
+typedef enum isoDepState
+{
+    ISODEP_ST_IDLE,                 /*!< Idle State                     */
+    ISODEP_ST_PCD_TX,               /*!< PCD Transmission State         */
+    ISODEP_ST_PCD_RX,               /*!< PCD Reception State            */
+    ISODEP_ST_PCD_WAIT_DSL,         /*!< PCD Wait for DSL response      */
+        
+    ISODEP_ST_PICC_ACT_ATS,         /*!< PICC has replied to RATS (ATS) */
+    ISODEP_ST_PICC_ACT_ATTRIB,      /*!< PICC has replied to ATTRIB     */
+    ISODEP_ST_PICC_RX,              /*!< PICC REception State           */
+    ISODEP_ST_PICC_SWTX,            /*!< PICC Waiting Time eXtension    */
+    ISODEP_ST_PICC_TX,              /*!< PICC Transmission State        */
+} rfalIsoDepState;
+
+
+
+
+/*! Holds all ISO-DEP data(counters, buffers, ID, timeouts, frame size)*/
+typedef struct{
+  rfalIsoDepState state;         /*!< ISO-DEP module state                      */
+  rfalIsoDepRole  role;          /*!< Current ISO-DEP role                      */
+  
+  uint8_t         blockNumber;   /*!< Current block number                      */
+  uint8_t         did;           /*!< Current DID                               */
+  uint8_t         nad;           /*!< Current DID                               */
+  uint8_t         cntIRetrys;    /*!< I-Block retry counter                     */
+  uint8_t         cntRRetrys;    /*!< R-Block retry counter                     */
+  uint8_t         cntSRetrys;    /*!< S-Block retry counter                     */
+  uint32_t        fwt;           /*!< Current FWT (Frame Waiting Time)          */
+  uint32_t        dFwt;          /*!< Current delta FWT                         */
+  uint16_t        fsx;           /*!< Current FSx FSC or FSD (max Frame size)   */
+  bool            isTxChaining;  /*!< Flag for chaining on Tx                   */
+  bool            isRxChaining;  /*!< Flag for chaining on Rx                   */
+  uint8_t*        txBuf;         /*!< Tx buffer pointer                         */
+  uint8_t*        rxBuf;         /*!< Rx buffer pointer                         */
+  uint16_t        txBufLen;      /*!< Tx buffer length                          */
+  uint16_t        rxBufLen;      /*!< Rx buffer length                          */
+  uint8_t         txBufInfPos;   /*!< Start of payload in txBuf                 */
+  uint8_t         rxBufInfPos;   /*!< Start of payload in rxBuf                 */
+  
+  
+  uint16_t        ourFsx;        /*!< Our current FSx FSC or FSD (Frame size)   */
+  uint8_t         lastPCB;       /*!< Last PCB sent                             */
+  uint8_t         lastWTXM;      /*!< Last WTXM sent                            */
+  uint8_t         atsTA;         /*!< TA on ATS                                 */
+  uint8_t         hdrLen;        /*!< Current ISO-DEP length                    */
+  rfalBitRate     txBR;          /*!< Current Tx Bit Rate                       */
+  rfalBitRate     rxBR;          /*!< Current Rx Bit Rate                       */
+  uint16_t        *rxLen;        /*!< Output parameter ptr to Rx length         */
+  bool            *rxChaining;   /*!< Output parameter ptr to Rx chaining flag  */  
+  uint32_t        WTXTimer;      /*!< Timer used for WTX                        */
+  bool            lastDID00;     /*!< Last PCD block had DID flag (for DID = 0) */
+  
+  bool            isTxPending;   /*!< Flag pending Block while waiting WTX Ack  */
+  bool            isWait4WTX;    /*!< Flag for waiting WTX Ack                  */
+  
+  uint32_t        SFGTTimer;     /*!< Timer used for SFGT                       */
+  
+  uint8_t         maxRetriesI;   /*!< Number of retries for a I-Block           */
+  uint8_t         maxRetriesS;   /*!< Number of retries for a S-Block           */
+  uint8_t         maxRetriesR;   /*!< Number of retries for a R-Block           */
+  uint8_t         maxRetriesRATS;/*!< Number of retries for RATS                */
+  
+  rfalComplianceMode compMode;   /*!< Compliance mode                           */
+  
+  rfalIsoDepListenActvParam actvParam;  /*!< Listen Activation context          */
+  
+  rfalIsoDepApduTxRxParam APDUParam;        /*!< APDU TxRx params               */
+  uint16_t                APDUTxPos;        /*!< APDU Tx position               */
+  uint16_t                APDURxPos;        /*!< APDU Rx position               */
+  bool                    isAPDURxChaining; /*!< APDU Transceive chaining flag  */
+  
+}rfalIsoDep;
+
+
+
+/*
+ ******************************************************************************
+ * LOCAL VARIABLES
+ ******************************************************************************
+ */
+
+static rfalIsoDep gIsoDep;    /*!< ISO-DEP Module instance               */
+
+/*
+ ******************************************************************************
+ * LOCAL FUNCTION PROTOTYPES
+ ******************************************************************************
+ */
+static void isoDepClearCounters( void );
+static ReturnCode isoDepTx( uint8_t pcb, uint8_t* txBuf, uint8_t *infBuf, uint16_t infLen, uint32_t fwt, 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 );
+static ReturnCode isoDepDataExchangePICC( 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 );
+static ReturnCode isoDepDataExchangePCD( uint16_t *outActRxLen, bool *outIsChaining, 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 );
+static ReturnCode isoDepHandleControlMsg( rfalIsoDepControlMsg controlMsg, 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 );
+static ReturnCode isoDepReSendControlMsg( 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 );
+static void rfalIsoDepCalcBitRate(rfalBitRate maxAllowedBR, uint8_t piccBRCapability, rfalBitRate *dsi, rfalBitRate *dri);
+static void rfalIsoDepApdu2IBLockParam( rfalIsoDepApduTxRxParam apduParam, rfalIsoDepTxRxParam *iBlockParam, uint16_t txPos, uint16_t rxPos );
+
+
+/*
+ ******************************************************************************
+ * LOCAL FUNCTIONS
+ ******************************************************************************
+ */
+
+/*******************************************************************************/
+static void isoDepClearCounters( void )
+{
+    gIsoDep.cntIRetrys   = 0;
+    gIsoDep.cntRRetrys   = 0;
+    gIsoDep.cntSRetrys   = 0;
+}
+
+/*******************************************************************************/
+static ReturnCode isoDepTx( uint8_t pcb, uint8_t* txBuf, uint8_t *infBuf, uint16_t infLen, uint32_t fwt,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 )
+{
+    uint8_t    *txBlock;
+    uint16_t   txBufLen;
+
+    
+    txBlock         = infBuf;                      /* Point to beginning of the INF, and go backwards     */
+    gIsoDep.lastPCB = pcb;                         /* Store the last PCB sent                             */
+    
+    
+    if( infLen > 0 )
+    {
+        if((infBuf - txBuf) < gIsoDep.hdrLen )         /* Check that we can fit the header in the given space */
+            return ERR_NOMEM;
+    }
+    
+    
+    /*******************************************************************************/
+    /* Compute optional PCB bits */
+    if((gIsoDep.did != RFAL_ISODEP_NO_DID) || ((gIsoDep.did == RFAL_ISODEP_DID_00) && gIsoDep.lastDID00) ) pcb |= ISODEP_PCB_DID_BIT;
+    if(gIsoDep.nad != RFAL_ISODEP_NO_NAD)                                                                  pcb |= ISODEP_PCB_NAD_BIT;
+    if((gIsoDep.isTxChaining) && (isoDep_PCBisIBlock(pcb)) )                                               pcb |= ISODEP_PCB_CHAINING_BIT;        
+
+    
+    /*******************************************************************************/
+    /* Compute Payload on the given txBuf, start by the PCB | DID | NAD | before INF */
+    
+    if(gIsoDep.nad != RFAL_ISODEP_NO_NAD)
+        *(--txBlock) = gIsoDep.nad;                /* NAD is optional */
+    
+    if( (gIsoDep.did != RFAL_ISODEP_NO_DID) || ((gIsoDep.did == RFAL_ISODEP_DID_00) && gIsoDep.lastDID00) )
+        *(--txBlock)  = gIsoDep.did;               /* DID is optional */
+    
+    *(--txBlock)      = pcb;                       /* PCB always present */
+    
+    
+    txBufLen = infLen + (infBuf - txBlock);        /* Calculate overall buffer size */
+    
+    if( txBufLen > (gIsoDep.fsx - ISODEP_CRC_LEN) )/* Check if msg length violates the maximum frame size FSC */
+        return ERR_NOTSUPP;
+        
+    return rfalTransceiveBlockingTx( txBlock, txBufLen, gIsoDep.rxBuf, gIsoDep.rxBufLen, gIsoDep.rxLen, RFAL_TXRX_FLAGS_DEFAULT, ((gIsoDep.role == ISODEP_ROLE_PICC) ? RFAL_FWT_NONE : fwt ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+/*******************************************************************************/
+static ReturnCode isoDepHandleControlMsg( rfalIsoDepControlMsg controlMsg, 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 )
+{
+    uint8_t  pcb;   
+    uint8_t  contolMsg[ISODEP_CONTROLMSG_BUF_LEN];
+    uint8_t  infLen;
+    uint32_t fwtTemp;
+    
+    infLen  = 0;
+    fwtTemp = (gIsoDep.fwt + gIsoDep.dFwt);
+    
+    switch( controlMsg )
+    {
+        /*******************************************************************************/
+        case ISODEP_R_ACK:
+            
+            if( gIsoDep.cntRRetrys++ > gIsoDep.maxRetriesR )
+            {
+                return ERR_PROTO;
+            }
+            
+            pcb = isoDep_PCBRACK( gIsoDep.blockNumber );
+            break;
+            
+        /*******************************************************************************/
+        case ISODEP_R_NAK:
+            if( gIsoDep.cntRRetrys++ > gIsoDep.maxRetriesR )
+            {
+                return ERR_TIMEOUT;
+            }
+            
+            pcb = isoDep_PCBRNAK( gIsoDep.blockNumber );            
+            break;
+            
+        /*******************************************************************************/
+        case ISODEP_S_WTX:
+            if( gIsoDep.cntSRetrys++ > gIsoDep.maxRetriesS )
+            {
+                return ERR_PROTO;
+            }
+            
+            /* Check if WTXM is valid */
+            if( ! isoDep_isWTXMValid(param) )
+            {
+                return ERR_PROTO;
+            }
+            
+            if( gIsoDep.role == ISODEP_ROLE_PCD )
+            {
+                /* Calculate temp Wait Time eXtension */ 
+                fwtTemp = (gIsoDep.fwt * param);
+                fwtTemp = MIN( RFAL_ISODEP_MAX_FWT, fwtTemp );
+                fwtTemp += gIsoDep.dFwt;
+            }
+            
+            pcb = ISODEP_PCB_SWTX;
+            contolMsg[ RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN + infLen++] = param;
+            break;
+            
+        /*******************************************************************************/
+        case ISODEP_S_DSL:
+            if( gIsoDep.cntSRetrys++ > gIsoDep.maxRetriesS )
+            {
+                return ERR_PROTO;
+            }
+            
+            if( gIsoDep.role == ISODEP_ROLE_PCD )
+            {
+                /* Digital 1.0 - 13.2.7.3 Poller must wait fwtDEACTIVATION */
+                fwtTemp = ISODEP_FWT_DEACTIVATION;
+                gIsoDep.state = ISODEP_ST_PCD_WAIT_DSL;
+            }
+            pcb = ISODEP_PCB_SDSL;
+            break;
+        
+        /*******************************************************************************/
+        default:
+            return ERR_INTERNAL;
+    }
+    
+    return isoDepTx( pcb, contolMsg, (contolMsg + RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN), infLen, fwtTemp, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+/*******************************************************************************/
+static ReturnCode isoDepReSendControlMsg(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 )
+{
+    if( isoDep_PCBisRACK( gIsoDep.lastPCB ) )
+    {
+        return isoDepHandleControlMsg( ISODEP_R_ACK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    if( isoDep_PCBisRNAK( gIsoDep.lastPCB ) )
+    {
+        return isoDepHandleControlMsg( ISODEP_R_NAK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    if( isoDep_PCBisSDeselect( gIsoDep.lastPCB ) )
+    {
+        return isoDepHandleControlMsg( ISODEP_S_DSL, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    if( isoDep_PCBisSWTX( gIsoDep.lastPCB ) )
+    {
+        return isoDepHandleControlMsg( ISODEP_S_WTX, gIsoDep.lastWTXM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    return ERR_WRONG_STATE; 
+}
+
+
+/*
+ ******************************************************************************
+ * GLOBAL FUNCTIONS
+ ******************************************************************************
+ */
+
+
+/*******************************************************************************/
+void rfalIsoDepInitialize( void )
+{
+    gIsoDep.state        = ISODEP_ST_IDLE;
+    gIsoDep.role         = ISODEP_ROLE_PCD;
+    gIsoDep.did          = RFAL_ISODEP_NO_DID;
+    gIsoDep.nad          = RFAL_ISODEP_NO_NAD;
+    gIsoDep.blockNumber  = 0;
+    gIsoDep.isTxChaining = false;
+    gIsoDep.isRxChaining = false;
+    gIsoDep.lastDID00    = false;
+    gIsoDep.lastPCB      = ISODEP_PCB_INVALID;
+    gIsoDep.fsx          = RFAL_ISODEP_FSX_16;
+    gIsoDep.ourFsx       = RFAL_ISODEP_FSX_16;
+    gIsoDep.hdrLen       = RFAL_ISODEP_PCB_LEN;
+    
+    gIsoDep.rxLen        = NULL;
+    gIsoDep.rxBuf        = NULL;
+    
+    gIsoDep.isTxPending  = false;
+    gIsoDep.isWait4WTX   = false;
+    
+    gIsoDep.compMode       = RFAL_COMPLIANCE_MODE_NFC;
+    gIsoDep.maxRetriesR    = RFAL_ISODEP_MAX_R_RETRYS;
+    gIsoDep.maxRetriesS    = RFAL_ISODEP_MAX_S_RETRYS;
+    gIsoDep.maxRetriesI    = RFAL_ISODEP_MAX_I_RETRYS;
+    gIsoDep.maxRetriesRATS = RFAL_ISODEP_RATS_RETRIES;
+    
+    isoDepClearCounters();
+}
+
+
+/*******************************************************************************/
+void rfalIsoDepInitializeWithParams( rfalComplianceMode compMode, uint8_t maxRetriesR, uint8_t maxRetriesS, uint8_t maxRetriesI, uint8_t maxRetriesRATS )
+{
+    rfalIsoDepInitialize();
+    
+    gIsoDep.compMode       = compMode;
+    gIsoDep.maxRetriesR    = maxRetriesR;
+    gIsoDep.maxRetriesS    = maxRetriesS;
+    gIsoDep.maxRetriesI    = maxRetriesI;
+    gIsoDep.maxRetriesRATS = maxRetriesRATS;
+}
+
+
+/*******************************************************************************/
+static ReturnCode isoDepDataExchangePCD( uint16_t *outActRxLen, bool *outIsChaining,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 )
+{
+    ReturnCode ret;
+    uint8_t    rxPCB;
+    
+    /* Check out parameters */
+    if( (outActRxLen == NULL) || (outIsChaining == NULL) )
+    {
+        return ERR_PARAM;
+    }    
+    
+    *outIsChaining = false;
+        
+    /* Calculate header required and check if the buffers InfPositions are suitable */    
+    gIsoDep.hdrLen = RFAL_ISODEP_PCB_LEN;
+    if(gIsoDep.did != RFAL_ISODEP_NO_DID)  gIsoDep.hdrLen  += RFAL_ISODEP_DID_LEN;
+    if(gIsoDep.nad != RFAL_ISODEP_NO_NAD)  gIsoDep.hdrLen  += RFAL_ISODEP_NAD_LEN;
+    
+    /* check if there`s enough space before the infPos to append ISO-DEP headers on rx and tx */
+    if( (gIsoDep.rxBufInfPos < gIsoDep.hdrLen) || (gIsoDep.txBufInfPos < gIsoDep.hdrLen) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Wait until SFGT has been fulfilled (as a PCD) */
+    if( (gIsoDep.SFGTTimer != 0) && !isoDepTimerisExpired( gIsoDep.SFGTTimer ) )
+    {
+        return ERR_BUSY;
+    }
+    /* Once done, clear SFGT timer */
+    gIsoDep.SFGTTimer = 0;
+    
+    
+    /*******************************************************************************/
+    switch( gIsoDep.state )
+    {
+        /*******************************************************************************/
+        case ISODEP_ST_IDLE:
+            return ERR_NONE;
+        
+        /*******************************************************************************/
+        case ISODEP_ST_PCD_TX:
+            ret = isoDepTx( isoDep_PCBIBlock( gIsoDep.blockNumber ), gIsoDep.txBuf, (gIsoDep.txBuf + gIsoDep.txBufInfPos), gIsoDep.txBufLen, (gIsoDep.fwt + gIsoDep.dFwt), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            switch( ret )
+            {
+              case ERR_NONE:
+                  gIsoDep.state = ISODEP_ST_PCD_RX;
+                  break;
+              
+              default:
+                  return ret;
+            }
+            /* fall through */
+          
+        /*******************************************************************************/
+        case ISODEP_ST_PCD_WAIT_DSL:
+        case ISODEP_ST_PCD_RX:
+                      
+            ret = rfalGetTransceiveStatus();
+            switch( ret )
+            {
+                /* Data rcvd with error or timeout -> Send R-NAK */
+                case ERR_TIMEOUT:
+                case ERR_CRC:
+                case ERR_PAR:
+                case ERR_FRAMING:          /* added to handle test cases scenario TC_POL_NFCB_T4AT_BI_82_x_y & TC_POL_NFCB_T4BT_BI_82_x_y */
+                case ERR_INCOMPLETE_BYTE:  /* added to handle test cases scenario TC_POL_NFCB_T4AT_BI_82_x_y & TC_POL_NFCB_T4BT_BI_82_x_y  */
+                    
+                    if( gIsoDep.isRxChaining )
+                    {   /* Rule 5 - In PICC chaining when a invalid/timeout occurs -> R-ACK */                        
+                        EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_ACK, RFAL_ISODEP_NO_PARAM ,mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    }
+                    else if( gIsoDep.state == ISODEP_ST_PCD_WAIT_DSL )
+                    {   /* Rule 8 - If s-Deselect response fails MAY retransmit */
+                        EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_S_DSL, RFAL_ISODEP_NO_PARAM,mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    }
+                    else
+                    {   /* Rule 4 - When a invalid block or timeout occurs -> R-NACK */
+                        EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_NAK, RFAL_ISODEP_NO_PARAM,mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    }
+                    return ERR_BUSY;
+                    
+                case ERR_NONE:
+                    break;
+                    
+                case ERR_BUSY:
+                    return ERR_BUSY;  /* Debug purposes */
+                    
+                default:
+                    return ret;
+            }
+            
+            /*******************************************************************************/
+            /* No error, process incoming msg                                              */
+            /*******************************************************************************/
+            
+            (*outActRxLen) = rfalConvBitsToBytes( *outActRxLen );
+            
+            
+            /* Check rcvd msg length, cannot be less then the expected header */
+            if( ((*outActRxLen) < gIsoDep.hdrLen) || ((*outActRxLen) >= gIsoDep.ourFsx) )
+            {
+                return ERR_PROTO;
+            }
+            
+            /* Grab rcvd PCB */
+            rxPCB = gIsoDep.rxBuf[ ISODEP_PCB_POS ];
+            
+            
+            /* EMVCo doesn't allow usage of for CID or NAD   EMVCo 2.6 TAble 10.2 */
+            if( (gIsoDep.compMode == RFAL_COMPLIANCE_MODE_EMV) && ( isoDep_PCBhasDID(rxPCB) || isoDep_PCBhasNAD(rxPCB)) )
+            {
+                return ERR_PROTO;
+            }
+            
+            /* If we are expecting DID, check if PCB signals its presence and if device ID match*/
+            if( (gIsoDep.did != RFAL_ISODEP_NO_DID) && ( !isoDep_PCBhasDID(rxPCB) || (gIsoDep.did != gIsoDep.rxBuf[ ISODEP_DID_POS ])) )
+            {
+                return ERR_PROTO;
+            }
+            
+            
+            /*******************************************************************************/
+            /* Process S-Block                                                             */
+            /*******************************************************************************/
+            if( isoDep_PCBisSBlock(rxPCB) )
+            {
+                /* Check if is a Wait Time eXtension */
+                if( isoDep_PCBisSWTX(rxPCB) )
+                {
+                    /* Rule 3 - respond to S-block: get 1st INF byte S(STW): Power + WTXM */
+                    EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_S_WTX, isoDep_GetWTXM(gIsoDep.rxBuf[gIsoDep.hdrLen]), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    return ERR_BUSY;
+                }
+                
+                /* Check if is a deselect response */
+                if( isoDep_PCBisSDeselect(rxPCB) )
+                {
+                    if( gIsoDep.state == ISODEP_ST_PCD_WAIT_DSL )
+                    {
+                        rfalIsoDepInitialize();         /* Session finished reInit vars */
+                        return ERR_NONE;
+                    }
+                    
+                    /* Deselect response not expected  */
+                    /* fall through to PROTO error */
+                }
+                /* Unexpected S-Block */
+                return ERR_PROTO;
+            }
+            
+            /*******************************************************************************/
+            /* Process R-Block                                                             */
+            /*******************************************************************************/
+            else if( isoDep_PCBisRBlock(rxPCB) )
+            {
+                if( isoDep_PCBisRACK(rxPCB) )                             /* Check if is a R-ACK */
+                {
+                    if( isoDep_GetBN(rxPCB) == gIsoDep.blockNumber )     /* Expected block number  */
+                    {
+                        /* Rule B - ACK with expected bn -> Increment block number */
+                        gIsoDep.blockNumber = isoDep_PCBNextBN( gIsoDep.blockNumber );
+                                                
+                        /* R-ACK only allowed when PCD chaining */
+                        if( !gIsoDep.isTxChaining )
+                        {
+                            return ERR_PROTO;
+                        }
+                        
+                        /* Rule 7 - Chaining transaction done, continue chaining */
+                        isoDepClearCounters();
+                        return ERR_NONE;  /* This block has been transmitted */
+                    }
+                    else
+                    {
+                        /* Rule 6 - R-ACK with wrong block number retransmit */
+                        if( gIsoDep.cntIRetrys++ < gIsoDep.maxRetriesI )
+                        {
+                            gIsoDep.cntRRetrys = 0;            /* Clear R counter only */
+                            gIsoDep.state = ISODEP_ST_PCD_TX;
+                            return ERR_BUSY;
+                        }
+                        return ERR_PROTO;
+                    }
+                }
+                else  /* Unexcpected R-Block */
+                {
+                    return ERR_PROTO;
+                }
+            }
+            
+            /*******************************************************************************/
+            /* Process I-Block                                                             */
+            /*******************************************************************************/
+            else if( isoDep_PCBisIBlock(rxPCB) )
+            {
+                /*******************************************************************************/
+                /* is PICC performing chaining                                                 */
+                if( isoDep_PCBisChaining(rxPCB) )
+                {
+                    gIsoDep.isRxChaining = true;
+                    *outIsChaining       = true;
+                    
+                    if( isoDep_GetBN(rxPCB) == gIsoDep.blockNumber )
+                    {
+                        /* Rule B - ACK with correct block number -> Increase Block number */
+                        isoDep_ToggleBN( gIsoDep.blockNumber );
+                        
+                        isoDepClearCounters();  /* Clear counters in case R counter is already at max */
+                        
+                        /* Rule 2 - Send ACK */
+                        EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_ACK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                        
+                        /* Received I-Block with chaining, send current data to DH */
+                        
+                        /* remove ISO DEP header, check is necessary to move the INF data on the buffer */
+                        *outActRxLen -= gIsoDep.hdrLen;
+                        if( gIsoDep.hdrLen != gIsoDep.rxBufInfPos )
+                        {
+                            ST_MEMMOVE( (gIsoDep.rxBuf + gIsoDep.rxBufInfPos), (gIsoDep.rxBuf + gIsoDep.hdrLen), *outActRxLen );
+                        }
+                        
+                        isoDepClearCounters();
+                        return ERR_AGAIN;       /* Send Again signalling to run again, but some chaining data has arrived */
+                    }
+                    else
+                    {
+                        /* Rule 5 - PICC chaining invalid I-Block -> R-ACK */
+                        EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_ACK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    }
+                    return ERR_BUSY;
+                }
+                
+                gIsoDep.isRxChaining = false; /* clear PICC chaining flag */                
+                
+                if( isoDep_GetBN(rxPCB) == gIsoDep.blockNumber )
+                {
+                    /* Rule B - I-Block with correct block number -> Increase Block number */
+                    isoDep_ToggleBN( gIsoDep.blockNumber );
+                    
+                    /* I-Block transaction done successfully */
+                    
+                    /* remove ISO DEP header, check is necessary to move the INF data on the buffer */
+                    *outActRxLen -= gIsoDep.hdrLen;
+                    if( gIsoDep.hdrLen != gIsoDep.rxBufInfPos )
+                    {
+                        ST_MEMMOVE( (gIsoDep.rxBuf + gIsoDep.rxBufInfPos), (gIsoDep.rxBuf + gIsoDep.hdrLen), *outActRxLen );
+                    }
+                    
+                    gIsoDep.state = ISODEP_ST_IDLE;
+                    isoDepClearCounters();
+                    return ERR_NONE;
+                }
+                else
+                {
+                    if( (gIsoDep.compMode != RFAL_COMPLIANCE_MODE_ISO) )
+                    {
+                        /* Invalid Block (not chaining) -> Raise error   Digital 1.1  15.2.6.4   EMVCo 2.6  10.3.5.4 */
+                        return ERR_PROTO;
+                    }
+
+                    /* Rule 4 - Invalid Block -> R-NAK */
+                    EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_NAK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    return ERR_BUSY;
+                }
+            }
+            else /* not S/R/I - Block */
+            {
+                return ERR_PROTO;
+            }
+            /*break;*/
+          
+        /*******************************************************************************/
+        default:
+            break;
+    }
+    
+    return ERR_INTERNAL;
+}
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepDeselect( 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 )
+{
+    ReturnCode ret;
+    uint32_t   cntRerun;
+    bool       dummyB;
+    uint16_t   tmpRcvdLen;
+    uint8_t    tmpRxBuf[ISODEP_CONTROLMSG_BUF_LEN];
+    
+    /*******************************************************************************/
+    /* Check if  rx parameters have been set before, otherwise use local variables *
+     * To cope with a Deselect after RATS\ATTRIB without any I-Block exchanged     */
+    if( (gIsoDep.rxLen == NULL) || (gIsoDep.rxBuf == NULL) )
+    {
+        gIsoDep.rxLen       = &tmpRcvdLen;
+        gIsoDep.rxBuf       = tmpRxBuf;
+        gIsoDep.rxBufLen    = ISODEP_CONTROLMSG_BUF_LEN;
+        gIsoDep.rxBufInfPos = (RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN);
+        gIsoDep.txBufInfPos = (RFAL_ISODEP_PCB_LEN + RFAL_ISODEP_DID_LEN);
+    }
+    
+    
+    /*******************************************************************************/
+    /* The Deselect process is being done blocking, Digital 1.0 - 13.2.7.1 MUST wait response and retry*/
+    /* Set the maximum reruns while we`ll wait for a response */
+    cntRerun = ISODEP_MAX_RERUNS;
+    
+    /* Send DSL request and run protocol until get a response, error or "timeout" */    
+    EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_S_DSL, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    do{
+        ret = isoDepDataExchangePCD( gIsoDep.rxLen, &dummyB, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        rfalWorker( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    while( (ERR_NO_MASK(ret) == ERR_BUSY) && cntRerun--);
+        
+    rfalIsoDepInitialize();
+    return ((cntRerun == 0) ? ERR_TIMEOUT : ret);
+}
+
+
+/*******************************************************************************/
+uint32_t rfalIsoDepFWI2FWT( uint8_t fwi )
+{
+    uint32_t result;
+    
+    /* RFU values -> take the default value  
+     * Digital 1.0  11.6.2.17  FWI[1,14]
+     * Digital 1.1  7.6.2.22   FWI[0,14]
+     * EMVCo 2.6    Table A.5  FWI[0,14] */
+    if( fwi > ISODEP_FWI_MAX )
+    {
+        fwi = RFAL_ISODEP_FWI_DEFAULT;
+    }
+
+    /* FWT = (256 × 16/fC) × 2^FWI => 2^(FWI+12)  Digital 1.1  13.8.1 & 7.9.1 */
+    
+    result = (1 << (fwi + 12));
+    result = MIN( RFAL_ISODEP_MAX_FWT, result);  /* Maximum Frame Waiting Time must be fulfilled */
+    
+    return result;
+}
+
+
+/*******************************************************************************/
+uint16_t rfalIsoDepFSxI2FSx( uint8_t FSxI )
+{
+    switch( FSxI )
+    {
+        case RFAL_ISODEP_FSXI_16:            return RFAL_ISODEP_FSX_16;
+        case RFAL_ISODEP_FSXI_24:            return RFAL_ISODEP_FSX_24;
+        case RFAL_ISODEP_FSXI_32:            return RFAL_ISODEP_FSX_32;
+        case RFAL_ISODEP_FSXI_40:            return RFAL_ISODEP_FSX_40;
+        case RFAL_ISODEP_FSXI_48:            return RFAL_ISODEP_FSX_48;
+        case RFAL_ISODEP_FSXI_64:            return RFAL_ISODEP_FSX_64;
+        case RFAL_ISODEP_FSXI_96:            return RFAL_ISODEP_FSX_96;
+        case RFAL_ISODEP_FSXI_128:           return RFAL_ISODEP_FSX_128;
+    }        
+    return RFAL_ISODEP_FSX_256;
+}
+
+
+/*******************************************************************************/
+static uint32_t rfalIsoDepSFGI2SFGT( uint8_t sfgi )
+{
+    uint32_t sfgt;
+
+    if (sfgi > ISODEP_SFGI_MAX)
+    {
+        sfgi = ISODEP_SFGI_MIN;
+    }
+        
+    if (sfgi != ISODEP_SFGI_MIN)
+    {
+        /* If sfgi != 0 wait SFGT + dSFGT   Digital 1.1  13.8.2.1 */
+        sfgt  = (isoDepCalcSGFT(sfgi) + isoDepCalcdSGFT(sfgi));
+    }
+    /* Otherwise use FDTPoll min Digital  1.1  13.8.2.3*/
+    else
+    {
+        sfgt = RFAL_FDT_POLL_NFCA_POLLER;
+    }
+
+    /* Convert carrier cycles to milli seconds */
+    return (rfalConv1fcToMs(sfgt) + 1);
+}
+
+
+/*******************************************************************************/
+bool rfalIsoDepIsRats( uint8_t *buf, uint8_t bufLen )
+{
+    if(buf != NULL)
+    {
+        if ((RFAL_ISODEP_CMD_RATS == (uint8_t)*buf) && (sizeof(rfalIsoDepRats) == bufLen))
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
+
+/*******************************************************************************/
+bool rfalIsoDepIsAttrib( uint8_t *buf, uint8_t bufLen )
+{
+    if(buf != NULL)
+    {
+        if (  (RFAL_ISODEP_CMD_ATTRIB == (uint8_t)*buf)                                    && 
+              (RFAL_ISODEP_ATTRIB_REQ_MIN_LEN <= bufLen)                                   &&
+              ((RFAL_ISODEP_ATTRIB_REQ_MIN_LEN + RFAL_ISODEP_ATTRIB_HLINFO_LEN) >= bufLen)   )
+        {
+            return true;
+        }
+    }
+    return false;
+}
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepListenStartActivation( rfalIsoDepAtsParam *atsParam, rfalIsoDepAttribResParam *attribResParam, uint8_t *buf, uint16_t bufLen, rfalIsoDepListenActvParam actParam, 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 )
+{
+    
+    uint8_t *txBuf;
+    uint8_t bufIt;
+    
+    /*******************************************************************************/
+    bufIt        = 0;
+    txBuf        = (uint8_t*)actParam.rxBuf;      /* Use the rxBuf as TxBuf as well, the struct enforces a size enough MAX( NFCA_ATS_MAX_LEN, NFCB_ATTRIB_RES_MAX_LEN ) */
+    gIsoDep.txBR = RFAL_BR_106;
+    gIsoDep.rxBR = RFAL_BR_106;
+        
+    /* Check for a valid buffer pointer */
+    if( buf == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    if( *buf == RFAL_ISODEP_CMD_RATS )
+    {
+        /* Check ATS parameters */
+        if( atsParam == NULL )
+        {
+            return ERR_PARAM;
+        }
+        
+        /* If requested copy RATS to device info */
+        if( actParam.isoDepDev != NULL )
+        {
+            ST_MEMCPY( (uint8_t*)&actParam.isoDepDev->activation.A.Poller.RATS.CMD, buf, sizeof(rfalIsoDepRats) );
+        }
+        
+        
+        /*******************************************************************************/
+        /* Process RATS                                                                */
+        buf++;
+        gIsoDep.fsx = rfalIsoDepFSxI2FSx( (((*buf) & RFAL_ISODEP_RATS_PARAM_FSDI_MASK) >> RFAL_ISODEP_RATS_PARAM_FSDI_SHIFT) );
+        gIsoDep.did = (*buf & RFAL_ISODEP_DID_MASK);
+        
+        
+        /*******************************************************************************/
+        /* Digital 1.1  13.6.1.8 - DID as to between 0 and 14 */
+        if( gIsoDep.did > RFAL_ISODEP_DID_MAX )
+        {
+            return ERR_PROTO;
+        }
+        
+        /* Check if we are configured to support DID */
+        if( (gIsoDep.did != RFAL_ISODEP_DID_00) && (!atsParam->didSupport) )
+        {
+            return ERR_NOTSUPP;
+        }
+
+        
+        /*******************************************************************************/
+        /* Check RFAL supported bit rates  */
+        if( (!(RFAL_SUPPORT_BR_CE_A_212) && ((atsParam->ta & RFAL_ISODEP_ATS_TA_DPL_212) || (atsParam->ta & RFAL_ISODEP_ATS_TA_DLP_212)))  ||
+            (!(RFAL_SUPPORT_BR_CE_A_424) && ((atsParam->ta & RFAL_ISODEP_ATS_TA_DPL_424) || (atsParam->ta & RFAL_ISODEP_ATS_TA_DLP_424)))  ||
+            (!(RFAL_SUPPORT_BR_CE_A_848) && ((atsParam->ta & RFAL_ISODEP_ATS_TA_DPL_848) || (atsParam->ta & RFAL_ISODEP_ATS_TA_DLP_848)))   )            
+        {
+            return ERR_NOTSUPP;
+        }
+        
+        /* Enforce proper FWI configuration */
+        if( atsParam->fwi > ISODEP_FWI_LIS_MAX)
+        {
+            atsParam->fwi = ISODEP_FWI_LIS_MAX;
+        }
+        
+        gIsoDep.atsTA  = atsParam->ta;
+        gIsoDep.fwt    = rfalIsoDepFWI2FWT(atsParam->fwi);
+        gIsoDep.ourFsx = rfalIsoDepFSxI2FSx(atsParam->fsci);
+        
+        
+        /* Ensure proper/maximum Historical Bytes length  */
+        atsParam->hbLen = MIN( RFAL_ISODEP_ATS_HB_MAX_LEN, atsParam->hbLen );
+        
+        /*******************************************************************************/
+        /* Compute ATS                                                                 */
+        
+        txBuf[ bufIt++ ] = (RFAL_ISODEP_ATS_HIST_OFFSET + atsParam->hbLen);                                  /* TL */
+        txBuf[ bufIt++ ] = ( (RFAL_ISODEP_ATS_T0_TA_PRESENCE_MASK | RFAL_ISODEP_ATS_T0_TB_PRESENCE_MASK | 
+                              RFAL_ISODEP_ATS_T0_TC_PRESENCE_MASK)| atsParam->fsci       );                  /* T0 */
+        txBuf[ bufIt++ ] = atsParam->ta;                                                                     /* TA */
+        txBuf[ bufIt++ ] = ( (atsParam->fwi << RFAL_ISODEP_RATS_PARAM_FSDI_SHIFT) | 
+                             (atsParam->sfgi & RFAL_ISODEP_RATS_PARAM_FSDI_MASK) );                          /* TB */
+        txBuf[ bufIt++ ] = ((atsParam->didSupport) ? RFAL_ISODEP_ATS_TC_DID : 0);                            /* TC */
+        
+        ST_MEMCPY( &txBuf[bufIt], atsParam->hb, atsParam->hbLen );                                          /* T1-Tk */
+        bufIt += atsParam->hbLen;
+        
+        gIsoDep.state = ISODEP_ST_PICC_ACT_ATS;
+        
+    }
+    /*******************************************************************************/
+    else if( *buf == RFAL_ISODEP_CMD_ATTRIB )
+    {
+        /* Check ATTRIB parameters */
+        if( attribResParam == NULL )
+        {
+            return ERR_PARAM;
+        }
+        
+        /*  REMARK: ATTRIB handling */
+        NO_WARNING(attribResParam);
+        NO_WARNING(bufLen);
+        return ERR_NOT_IMPLEMENTED;
+    }
+    else
+    {
+        return ERR_PARAM;
+    }
+    
+    gIsoDep.actvParam = actParam;
+    
+    
+    /*******************************************************************************/
+    /* If requested copy to ISO-DEP device info */
+    if( actParam.isoDepDev != NULL )
+    {
+        actParam.isoDepDev->info.DID  = gIsoDep.did;
+        actParam.isoDepDev->info.FSx  = gIsoDep.fsx;
+        actParam.isoDepDev->info.FWT  = gIsoDep.fwt;
+        actParam.isoDepDev->info.dFWT = 0;
+        actParam.isoDepDev->info.DSI  = gIsoDep.txBR;
+        actParam.isoDepDev->info.DRI  = gIsoDep.rxBR;
+    }
+    
+    return rfalTransceiveBlockingTx( txBuf, bufIt, (uint8_t*)actParam.rxBuf, sizeof( rfalIsoDepBufFormat ), actParam.rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FWT_NONE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepListenGetActivationStatus( 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 )
+{
+    ReturnCode  err;
+    uint8_t*    txBuf;
+    uint8_t     bufIt;
+    
+    rfalBitRate dsi;
+    rfalBitRate dri;
+    
+    
+    /* Check if Activation is running */
+    if( gIsoDep.state < ISODEP_ST_PICC_ACT_ATS )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    /* Check if Activation has finished already */
+    if( gIsoDep.state >= ISODEP_ST_PICC_RX )
+    {
+        return ERR_NONE;
+    }
+    
+    
+    /*******************************************************************************/
+    /* Check for incoming msg */
+    err = rfalGetTransceiveStatus();
+    switch( err )
+    {
+        /*******************************************************************************/
+        case ERR_NONE:
+            break;
+            
+        /*******************************************************************************/
+        case ERR_LINK_LOSS:
+        case ERR_BUSY:
+            return err;
+        
+        /*******************************************************************************/
+        case ERR_CRC:
+        case ERR_PAR:
+        case ERR_FRAMING:
+            
+            /* ISO14443 4  5.6.2.2 2  If ATS has been replied upon a invalid block, PICC disables the PPS responses */
+            if( gIsoDep.state == ISODEP_ST_PICC_ACT_ATS )
+            {
+               gIsoDep.state = ISODEP_ST_PICC_RX;
+               break;
+            }
+            /* fall through */
+            
+        /*******************************************************************************/
+        default:
+            /* ReEnable the receiver and wait for another frame */
+            isoDepReEnableRx( (uint8_t*)gIsoDep.actvParam.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.actvParam.rxLen );
+            
+            return ERR_BUSY;
+    }
+    
+    
+    txBuf = (uint8_t*)gIsoDep.actvParam.rxBuf;   /* Use the rxBuf as TxBuf as well, the struct enforces a size enough  MAX(NFCA_PPS_RES_LEN, ISODEP_DSL_MAX_LEN) */    
+    dri   = RFAL_BR_KEEP;                   /* The RFAL_BR_KEEP is used to check if PPS with BR change was requested */
+    bufIt = 0;
+    
+    
+    /*******************************************************************************/
+    gIsoDep.role  = ISODEP_ROLE_PICC;
+    
+    /*******************************************************************************/
+    if( gIsoDep.state == ISODEP_ST_PICC_ACT_ATS )
+    {
+        /* Check for a PPS    ISO 14443-4  5.3 */
+        if( ( ((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_STARTBYTE_POS] & RFAL_ISODEP_PPS_MASK) == RFAL_ISODEP_PPS_SB )
+        {
+            /* ISO 14443-4  5.3.1  Check if the we are the addressed DID/CID */
+            /* ISO 14443-4  5.3.2  Check for a valid PPS0 */
+            if( (( ((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_STARTBYTE_POS] & RFAL_ISODEP_DID_MASK) != gIsoDep.did)                         ||
+                (( ((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_PPS0_POS] & RFAL_ISODEP_PPS0_VALID_MASK) != RFAL_ISODEP_PPS0_PPS1_NOT_PRESENT)   )
+            {
+                /* Invalid DID on PPS request or Invalid PPS0, reEnable the receiver and wait another frame */
+                isoDepReEnableRx( (uint8_t*)gIsoDep.actvParam.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.actvParam.rxLen );
+                
+                return ERR_BUSY;
+            }
+            
+            /*******************************************************************************/
+            /* Check PPS1 presence */
+            if( ((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_PPS0_POS] == RFAL_ISODEP_PPS0_PPS1_PRESENT )
+            {
+                dri = (rfalBitRate) (((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_PPS1_POS] & RFAL_ISODEP_PPS1_DxI_MASK);
+                dsi = (rfalBitRate)((((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_PPS1_POS] >> RFAL_ISODEP_PPS1_DSI_SHIFT) & RFAL_ISODEP_PPS1_DxI_MASK);
+                                
+                if( (!(RFAL_SUPPORT_BR_CE_A_106) && (( dsi == RFAL_BR_106 ) || ( dri == RFAL_BR_106 )))  ||
+                    (!(RFAL_SUPPORT_BR_CE_A_212) && (( dsi == RFAL_BR_212 ) || ( dri == RFAL_BR_212 )))  ||
+                    (!(RFAL_SUPPORT_BR_CE_A_424) && (( dsi == RFAL_BR_424 ) || ( dri == RFAL_BR_424 )))  ||
+                    (!(RFAL_SUPPORT_BR_CE_A_848) && (( dsi == RFAL_BR_848 ) || ( dri == RFAL_BR_848 )))     )
+                {
+                    return ERR_PROTO;
+                }
+            }
+            
+            /*******************************************************************************/
+            /* Compute and send PPS RES / Ack                                              */
+            txBuf[ bufIt++ ] = ((uint8_t*)gIsoDep.actvParam.rxBuf)[RFAL_ISODEP_PPS_STARTBYTE_POS];
+            
+            rfalTransceiveBlockingTx( txBuf, bufIt, (uint8_t*)gIsoDep.actvParam.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.actvParam.rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FWT_NONE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            /*******************************************************************************/
+            /* Exchange the bit rates if requested */
+            if( dri != RFAL_BR_KEEP )
+            {
+                rfalSetBitRate( dsi, dri, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+                gIsoDep.txBR = dsi;  /* DSI codes the divisor from PICC to PCD */
+                gIsoDep.rxBR = dri;  /* DRI codes the divisor from PCD to PICC */
+                
+                
+                if(gIsoDep.actvParam.isoDepDev != NULL)
+                {
+                    gIsoDep.actvParam.isoDepDev->info.DSI =  dsi;
+                    gIsoDep.actvParam.isoDepDev->info.DRI =  dri;
+                }
+            }
+        }
+        /* Check for a S-Deselect is done on Data Exchange Activity                    */
+    }
+     
+     /*******************************************************************************/
+     gIsoDep.hdrLen   = RFAL_ISODEP_PCB_LEN;
+     gIsoDep.hdrLen  += RFAL_ISODEP_DID_LEN;             /* Always assume DID to be aligned with Digital 1.1  15.1.2 and ISO14443  4 5.6.3    #454 */
+     gIsoDep.hdrLen  += ((gIsoDep.nad != RFAL_ISODEP_NO_NAD) ? RFAL_ISODEP_NAD_LEN : 0);
+     
+     /*******************************************************************************/
+     /* Rule C - The PICC block number shall be initialized to 1 at activation */
+     gIsoDep.blockNumber = 1;
+    
+    /* Activation done, keep the rcvd data in, reMap the activation buffer to the global to be retrieved by the DEP method */
+    gIsoDep.rxBuf       = (uint8_t*)gIsoDep.actvParam.rxBuf;
+    gIsoDep.rxBufLen    = sizeof( rfalIsoDepBufFormat );
+    gIsoDep.rxBufInfPos = (gIsoDep.actvParam.rxBuf->inf - gIsoDep.actvParam.rxBuf->prologue);
+    gIsoDep.rxLen       = gIsoDep.actvParam.rxLen;
+    gIsoDep.rxChaining  = gIsoDep.actvParam.isRxChaining;
+    
+    gIsoDep.state = ISODEP_ST_PICC_RX;
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+uint16_t rfalIsoDepGetMaxInfLen( void )
+{
+    /* Check whether all parameters are valid, otherwise return minimum default value */
+    if( (gIsoDep.fsx < RFAL_ISODEP_FSX_16) || (gIsoDep.fsx > RFAL_ISODEP_FSX_1024) || (gIsoDep.hdrLen > ISODEP_HDR_MAX_LEN) )
+    {
+        return (RFAL_ISODEP_FSX_16 - RFAL_ISODEP_PCB_LEN - ISODEP_CRC_LEN);
+    }
+    
+    return (gIsoDep.fsx - gIsoDep.hdrLen - ISODEP_CRC_LEN);
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepStartTransceive( rfalIsoDepTxRxParam param )
+{
+    gIsoDep.txBuf        = param.txBuf->prologue;
+    gIsoDep.txBufInfPos  = (param.txBuf->inf - param.txBuf->prologue);
+    gIsoDep.txBufLen     = param.txBufLen;
+    gIsoDep.isTxChaining = param.isTxChaining;
+    
+    gIsoDep.rxBuf        = param.rxBuf->prologue;
+    gIsoDep.rxBufInfPos  = (param.rxBuf->inf - param.rxBuf->prologue);
+    gIsoDep.rxBufLen     = sizeof(rfalIsoDepBufFormat);
+    
+    gIsoDep.rxLen        = param.rxLen;
+    gIsoDep.rxChaining   = param.isRxChaining;
+    
+    
+    gIsoDep.fwt          = param.FWT;
+    gIsoDep.dFwt         = param.dFWT;
+    gIsoDep.fsx          = param.FSx;
+    gIsoDep.did          = param.DID;
+    
+    /* Only change the FSx from activation if no to Keep */
+    gIsoDep.ourFsx = (( param.ourFSx != RFAL_ISODEP_FSX_KEEP ) ? param.ourFSx : gIsoDep.ourFsx);
+    
+    /* Clear inner control params for next dataExchange */
+    gIsoDep.isRxChaining  = false;
+    isoDepClearCounters();
+    
+    if(gIsoDep.role == ISODEP_ROLE_PICC)
+    {
+       if(gIsoDep.txBufLen > 0)
+       {
+           /* Ensure that an RTOX Ack is not being expected at moment */
+           if( !gIsoDep.isWait4WTX )
+           {
+               gIsoDep.state = ISODEP_ST_PICC_TX;
+               return ERR_NONE;
+           }
+           else
+           {
+               /* If RTOX Ack is expected, signal a pending Tx to be transmitted right after */
+               gIsoDep.isTxPending = true;
+           }
+       }
+       
+       /* Digital 1.1  15.2.5.1 The first block SHALL be sent by the Reader/Writer */
+       gIsoDep.state = ISODEP_ST_PICC_RX;
+       return ERR_NONE;
+    }
+    
+    gIsoDep.state = ISODEP_ST_PCD_TX;
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepGetTransceiveStatus( 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 )
+{
+    if( gIsoDep.role == ISODEP_ROLE_PICC)
+        return isoDepDataExchangePICC( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    else
+        return isoDepDataExchangePCD( gIsoDep.rxLen, gIsoDep.rxChaining, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode isoDepDataExchangePICC( 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 )
+{
+    uint8_t    rxPCB;
+    ReturnCode ret;
+    
+    switch( gIsoDep.state )
+    {
+        /*******************************************************************************/
+        case ISODEP_ST_IDLE:
+            return ERR_NONE;
+        
+
+        /*******************************************************************************/
+        case ISODEP_ST_PICC_TX:
+        
+            ret = isoDepTx( isoDep_PCBIBlock( gIsoDep.blockNumber ), gIsoDep.txBuf, (gIsoDep.txBuf + gIsoDep.txBufInfPos), gIsoDep.txBufLen, RFAL_FWT_NONE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Clear pending Tx flag */
+            gIsoDep.isTxPending = false;
+            
+            switch( ret )
+            {
+             case ERR_NONE:
+                 gIsoDep.state = ISODEP_ST_PICC_RX;
+                 return ERR_BUSY;
+             
+             default:
+                 break;
+            }
+            return ret;
+        
+        
+        /*******************************************************************************/
+        case ISODEP_ST_PICC_RX:
+            
+            ret = rfalGetTransceiveStatus();
+            switch( ret )
+            {
+                /*******************************************************************************/                
+                /* Data rcvd with error or timeout -> mute */
+                case ERR_TIMEOUT:
+                case ERR_CRC:
+                case ERR_PAR:
+                case ERR_FRAMING:
+                    
+                    /* Digital 1.1 - 15.2.6.2  The CE SHALL NOT attempt error recovery and remains in Rx mode upon Transmission or a Protocol Error */                                        
+                    isoDepReEnableRx( (uint8_t*)gIsoDep.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.rxLen );
+                    
+                    return ERR_BUSY;
+                    
+                /*******************************************************************************/
+                case ERR_LINK_LOSS:
+                    return ret;             /* Debug purposes */
+                    
+                case ERR_BUSY:
+                    return ret;             /* Debug purposes */
+                    
+                default:
+                    return ret;
+                    
+                /*******************************************************************************/
+                case ERR_NONE:
+                    *gIsoDep.rxLen = rfalConvBitsToBytes( *gIsoDep.rxLen );
+                    break;
+            }
+            break;
+
+            
+        /*******************************************************************************/
+        case ISODEP_ST_PICC_SWTX:
+            
+            if( !isoDepTimerisExpired( gIsoDep.WTXTimer ) )                 /* Do nothing until WTX timer has expired */
+            {
+               return ERR_BUSY;
+            }
+            
+            /* Set waiting for WTX Ack Flag */
+            gIsoDep.isWait4WTX = true;
+            
+            /* Digital 1.1  15.2.2.9 - Calculate the WTXM such that FWTtemp <= FWTmax */
+            gIsoDep.lastWTXM = isoDep_WTXMListenerMax( gIsoDep.fwt );
+            EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_S_WTX, gIsoDep.lastWTXM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            
+            gIsoDep.state = ISODEP_ST_PICC_RX;                              /* Go back to Rx to process WTX ack        */
+            return ERR_BUSY;
+
+            
+        /*******************************************************************************/
+        default:
+            return ERR_INTERNAL;
+    }
+    
+    /* ISO 14443-4 7.5.6.2 CE SHALL NOT attempt error recovery -> clear counters */
+    isoDepClearCounters();
+    
+    /*******************************************************************************/
+    /* No error, process incoming msg                                              */
+    /*******************************************************************************/
+        
+    /* Grab rcvd PCB */
+    rxPCB = gIsoDep.rxBuf[ ISODEP_PCB_POS ];
+    
+    
+    /*******************************************************************************/
+    /* When DID=0 PCD may or may not use DID, therefore check whether current PCD request 
+     * has DID present to be reflected on max INF length                         #454  */            
+        
+    /* ReCalculate Header Length */
+    gIsoDep.hdrLen   = RFAL_ISODEP_PCB_LEN;
+    gIsoDep.hdrLen  += ( (isoDep_PCBhasDID(rxPCB)) ? RFAL_ISODEP_DID_LEN : 0 );
+    gIsoDep.hdrLen  += ( (isoDep_PCBhasNAD(rxPCB)) ? RFAL_ISODEP_NAD_LEN : 0 );
+        
+    /* Store whether last PCD block had DID. for PICC special handling of DID = 0 */
+    if( gIsoDep.did == RFAL_ISODEP_DID_00 )
+    {
+        gIsoDep.lastDID00 = ( (isoDep_PCBhasDID(rxPCB)) ? true : false );
+    }
+    
+    /*******************************************************************************/
+    /* Check rcvd msg length, cannot be less then the expected header    OR        * 
+     * if the rcvd msg exceeds our announced frame size (FSD)                      */
+    if( ((*gIsoDep.rxLen) < gIsoDep.hdrLen) || ((*gIsoDep.rxLen) > (gIsoDep.ourFsx - ISODEP_CRC_LEN)) )
+    {
+        isoDepReEnableRx( (uint8_t*)gIsoDep.actvParam.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.actvParam.rxLen );
+        return ERR_BUSY;  /* ERR_PROTO Ignore this protocol request */
+    }
+    
+    /* If we are expecting DID, check if PCB signals its presence and if device ID match OR
+     * If our DID=0 and DID is sent but with an incorrect value                              */
+    if( ((gIsoDep.did != RFAL_ISODEP_DID_00) && ( !isoDep_PCBhasDID(rxPCB) || (gIsoDep.did != gIsoDep.rxBuf[ ISODEP_DID_POS ])))   || 
+        ((gIsoDep.did == RFAL_ISODEP_DID_00) &&    isoDep_PCBhasDID(rxPCB) && (RFAL_ISODEP_DID_00 != gIsoDep.rxBuf[ ISODEP_DID_POS ]) )     )
+    {
+        isoDepReEnableRx( (uint8_t*)gIsoDep.actvParam.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.actvParam.rxLen );
+        return ERR_BUSY;  /* Ignore a wrong DID request */
+    }
+    
+    /* If we aren't expecting NAD and it's received */
+    if( (gIsoDep.nad == RFAL_ISODEP_NO_NAD) && isoDep_PCBhasNAD(rxPCB) )
+    {
+        isoDepReEnableRx( (uint8_t*)gIsoDep.actvParam.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.actvParam.rxLen );
+        return ERR_BUSY;  /* Ignore a unexpected NAD request */
+    }
+        
+    /*******************************************************************************/
+    /* Process S-Block                                                             */
+    /*******************************************************************************/
+    if( isoDep_PCBisSBlock(rxPCB) )
+    {
+       /* Check if is a Wait Time eXtension */
+       if( isoDep_PCBisSWTX(rxPCB) )
+       {
+            /* Check if we're expecting a S-WTX */
+            if( isoDep_PCBisWTX( gIsoDep.lastPCB ) )
+            {
+                /* Digital 1.1  15.2.2.11 S(WTX) Ack with different WTXM -> Protocol Error  *
+                 *              Power level indication also should be set to 0              */
+                if( ( gIsoDep.rxBuf[ gIsoDep.hdrLen ] == gIsoDep.lastWTXM) && ((*gIsoDep.rxLen - gIsoDep.hdrLen) == ISODEP_SWTX_INF_LEN) )
+                {
+                    /* Clear waiting for RTOX Ack Flag */
+                    gIsoDep.isWait4WTX = false;
+                    
+                    /* Check if a Tx is already pending */
+                    if( gIsoDep.isTxPending )
+                    {
+                        /* Has a pending Tx, go immediately to TX */ 
+                        gIsoDep.state = ISODEP_ST_PICC_TX;
+                        return ERR_BUSY;
+                    }
+                    
+                    /* Set WTX timer */
+                    isoDepTimerStart( gIsoDep.WTXTimer, isoDep_WTXAdjust( (gIsoDep.lastWTXM * rfalConv1fcToMs( gIsoDep.fwt )) ) );
+                    
+                    gIsoDep.state = ISODEP_ST_PICC_SWTX;
+                    return ERR_BUSY;
+                }
+            }
+            /* Unexpected/Incorrect S-WTX, fall into reRenable */
+       }
+       
+       /* Check if is a deselect request */
+       if( isoDep_PCBisSDeselect(rxPCB) && ((*gIsoDep.rxLen - gIsoDep.hdrLen) == ISODEP_SDSL_INF_LEN) )
+       {
+           EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_S_DSL, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+           
+           rfalIsoDepInitialize();         /* Session finished reInit vars */
+           return ERR_SLEEP_REQ;
+       }
+       
+       /* Unexpected S-Block, fall into reRenable */
+    }
+    
+    /*******************************************************************************/
+    /* Process R-Block                                                             */
+    /*******************************************************************************/
+    else if( isoDep_PCBisRBlock(rxPCB) && ((*gIsoDep.rxLen - gIsoDep.hdrLen) == ISODEP_RBLOCK_INF_LEN))
+    {
+        if( isoDep_PCBisRACK(rxPCB) )                             /* Check if is a R-ACK */
+        {
+            if( isoDep_GetBN(rxPCB) == gIsoDep.blockNumber )      /* Check block number  */
+            {
+                /* Rule 11 - R(ACK) with current bn -> re-transmit */
+                if( !isoDep_PCBisIBlock(gIsoDep.lastPCB) )
+                    isoDepReSendControlMsg( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                else
+                    gIsoDep.state = ISODEP_ST_PICC_TX;
+                
+                return ERR_BUSY;
+            }
+            else
+            {
+                if( !gIsoDep.isTxChaining )
+                {
+                    /* Rule 13 violation R(ACK) without performing chaining */
+                    isoDepReEnableRx( (uint8_t*)gIsoDep.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.rxLen );
+                    return ERR_BUSY;
+                }
+                
+                /* Rule E -  R(ACK) with not current bn -> toogle bn */
+                isoDep_ToggleBN( gIsoDep.blockNumber );
+
+                /* This block has been transmitted and acknowledged, perform WTX until next data is provided  */
+
+                /* Rule 9 - PICC is allowed to send an S(WTX) instead of an I-block or an R(ACK) */
+                isoDepTimerStart( gIsoDep.WTXTimer, isoDep_WTXAdjust( rfalConv1fcToMs( gIsoDep.fwt )) );
+                gIsoDep.state = ISODEP_ST_PICC_SWTX;
+                
+                /* Rule 13 - R(ACK) with not current bn -> continue chaining */
+                return ERR_NONE;                                 /* This block has been transmitted */
+            }
+        }
+        else if( isoDep_PCBisRNAK(rxPCB) )                       /* Check if is a R-NACK */
+        {
+            if( isoDep_GetBN(rxPCB) == gIsoDep.blockNumber )     /* Check block number  */
+            {
+                /* Rule 11 - R(NAK) with current bn -> re-transmit last x-Block */
+                if( !isoDep_PCBisIBlock(gIsoDep.lastPCB) )
+                    isoDepReSendControlMsg( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                else
+                    gIsoDep.state = ISODEP_ST_PICC_TX;
+                
+                return ERR_BUSY;
+            }
+            else
+            {
+                /* Rule 12 - R(NAK) with not current bn -> R(ACK) */
+                EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_ACK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                
+                return ERR_BUSY;
+            }
+        }
+        
+        /* Unexpected R-Block, fall into reRenable */
+    }
+    
+    /*******************************************************************************/
+    /* Process I-Block                                                             */
+    /*******************************************************************************/
+    else if( isoDep_PCBisIBlock(rxPCB) )
+    {
+        /* Rule D - When an I-block is received, the PICC shall toggle its block number before sending a block */
+        isoDep_ToggleBN( gIsoDep.blockNumber );
+        
+        /*******************************************************************************/
+        /* Check if the block number is the one expected                               */
+        /* Check if PCD sent an I-Block instead ACK/NACK when we are chaining          */
+        if( (isoDep_GetBN(rxPCB) != gIsoDep.blockNumber) || (gIsoDep.isTxChaining) )
+        {
+            /* Remain in the same Block Number */
+            isoDep_ToggleBN( gIsoDep.blockNumber );
+            
+            /* ISO 14443-4 7.5.6.2 & Digital 1.1 - 15.2.6.2  The CE SHALL NOT attempt error recovery and remains in Rx mode upon Transmission or a Protocol Error */                                  
+            isoDepReEnableRx( (uint8_t*)gIsoDep.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.rxLen );
+            return ERR_BUSY;
+        }
+        
+        /*******************************************************************************/
+        /* is PCD performing chaining  ?                                               */
+        if( isoDep_PCBisChaining(rxPCB) )
+        {
+            gIsoDep.isRxChaining  = true;
+            *gIsoDep.rxChaining   = true; /* Output Parameter*/            
+                        
+            EXIT_ON_ERR( ret, isoDepHandleControlMsg( ISODEP_R_ACK, RFAL_ISODEP_NO_PARAM, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                            
+            /* Received I-Block with chaining, send current data to DH */
+            
+            /* remove ISO DEP header, check is necessary to move the INF data on the buffer */
+            *gIsoDep.rxLen -= gIsoDep.hdrLen;
+            if( gIsoDep.hdrLen != gIsoDep.rxBufInfPos )
+            {
+                ST_MEMMOVE( (gIsoDep.rxBuf + gIsoDep.rxBufInfPos), (gIsoDep.rxBuf + gIsoDep.hdrLen), *gIsoDep.rxLen );
+            }
+            return ERR_AGAIN;  /* Send Again signalling to run again, but some chaining data has arrived*/            
+        }
+        
+        
+        /*******************************************************************************/
+        /* PCD is not performing chaining                                              */
+        gIsoDep.isRxChaining  = false; /* clear PCD chaining flag */
+        *gIsoDep.rxChaining   = false; /* Output Parameter        */
+        
+        /* remove ISO DEP header, check is necessary to move the INF data on the buffer */
+        *gIsoDep.rxLen -= gIsoDep.hdrLen;
+        if( gIsoDep.hdrLen != gIsoDep.rxBufInfPos )
+        {
+            ST_MEMMOVE( (gIsoDep.rxBuf + gIsoDep.rxBufInfPos), (gIsoDep.rxBuf + gIsoDep.hdrLen), *gIsoDep.rxLen );
+        }
+        
+        
+        /*******************************************************************************/
+        /* Reception done, send data back and start WTX timer                          */
+        isoDepTimerStart( gIsoDep.WTXTimer, isoDep_WTXAdjust( rfalConv1fcToMs( gIsoDep.fwt )) );
+        
+        gIsoDep.state = ISODEP_ST_PICC_SWTX;
+        return ERR_NONE;
+    }
+    
+    /* Unexpected/Unknown Block */
+    /* ISO 14443-4 7.5.6.2 & Digital 1.1 - 15.2.6.2  The CE SHALL NOT attempt error recovery and remains in Rx mode upon Transmission or a Protocol Error */
+    isoDepReEnableRx( (uint8_t*)gIsoDep.rxBuf, sizeof( rfalIsoDepBufFormat ), gIsoDep.rxLen );
+    
+    return ERR_BUSY;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepRATS( rfalIsoDepFSxI FSDI, uint8_t DID, rfalIsoDepAts *ats , uint8_t *atsLen, 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 )
+{
+    uint16_t       rcvLen;
+    ReturnCode     ret;
+    rfalIsoDepRats ratsReq;
+    
+    if( ats == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Compose RATS */
+    ratsReq.CMD   = RFAL_ISODEP_CMD_RATS;
+    ratsReq.PARAM = ((FSDI << RFAL_ISODEP_RATS_PARAM_FSDI_SHIFT) & RFAL_ISODEP_RATS_PARAM_FSDI_MASK) | (DID & RFAL_ISODEP_RATS_PARAM_DID_MASK);
+    
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&ratsReq, sizeof(rfalIsoDepRats), (uint8_t*)ats, sizeof(rfalIsoDepAts), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ISODEP_T4T_FWT_ACTIVATION, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( ret == ERR_NONE )
+    {
+        /* Check for valid ATS length  Digital 1.1  13.6.2.1 & 13.6.2.3 */
+        if( (rcvLen < RFAL_ISODEP_ATS_MIN_LEN) || (rcvLen > RFAL_ISODEP_ATS_MAX_LEN) || (ats->TL != rcvLen) )
+        {
+            return ERR_PROTO;
+        }
+        
+        /* Assign our FSx, in case the a Deselect is send without Transceive */
+        gIsoDep.ourFsx = rfalIsoDepFSxI2FSx( FSDI );
+    }
+    
+    /* Check and assign if ATS length was requested (length also available on TL) */
+    if( atsLen != NULL )
+    {
+        *atsLen = rcvLen;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepPPS( uint8_t DID, rfalBitRate DSI, rfalBitRate DRI, rfalIsoDepPpsRes *ppsRes, 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 )
+{
+    uint16_t         rcvLen;
+    ReturnCode       ret;
+    rfalIsoDepPpsReq ppsReq;
+    
+    if( (ppsRes == NULL) || (DSI > RFAL_BR_848) || (DRI > RFAL_BR_848) || (DID > RFAL_ISODEP_DID_MAX) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Compose PPS Request */
+    ppsReq.PPSS = (RFAL_ISODEP_PPS_SB | (DID & RFAL_ISODEP_PPS_SB_DID_MASK));
+    ppsReq.PPS0 = RFAL_ISODEP_PPS_PPS0_PPS1_PRESENT;
+    ppsReq.PPS1 = (RFAL_ISODEP_PPS_PPS1 | (((DSI<<RFAL_ISODEP_PPS_PPS1_DSI_SHIFT)|DRI) & RFAL_ISODEP_PPS_PPS1_DXI_MASK)); 
+    
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&ppsReq, sizeof(rfalIsoDepPpsReq), (uint8_t*)ppsRes, sizeof(rfalIsoDepPpsRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_ISODEP_T4T_FWT_ACTIVATION, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( ret == ERR_NONE )
+    {
+        /* Check for valid PPS Response   */
+        if( (rcvLen != RFAL_ISODEP_PPS_RES_LEN) || (ppsRes->PPSS != ppsReq.PPSS) )
+        {
+            return ERR_PROTO;
+        }
+    }
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepATTRIB( uint8_t* nfcid0, uint8_t PARAM1, rfalBitRate DSI, rfalBitRate DRI, rfalIsoDepFSxI FSDI, uint8_t PARAM3, uint8_t DID, uint8_t* HLInfo, uint8_t HLInfoLen, uint32_t fwt, rfalIsoDepAttribRes *attribRes, uint8_t *attribResLen, 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 )
+{
+    uint16_t            rcvLen;
+    ReturnCode          ret;
+    rfalIsoDepAttribCmd attribCmd;
+    
+    
+    if( (attribRes == NULL) || (attribResLen == NULL) || (DSI > RFAL_BR_848) || (DRI > RFAL_BR_848) || (DID > RFAL_ISODEP_DID_MAX) )
+    {
+        return ERR_NONE;
+    }
+    
+    /*******************************************************************************/
+    /* Compose ATTRIB command */
+    attribCmd.cmd          = RFAL_ISODEP_CMD_ATTRIB;
+    attribCmd.Param.PARAM1 = PARAM1;
+    attribCmd.Param.PARAM2 = ( (((DSI<<RFAL_ISODEP_ATTRIB_PARAM2_DSI_SHIFT) | (DRI<<RFAL_ISODEP_ATTRIB_PARAM2_DRI_SHIFT)) & RFAL_ISODEP_ATTRIB_PARAM2_DXI_MASK) | (FSDI & RFAL_ISODEP_ATTRIB_PARAM2_FSDI_MASK) );
+    attribCmd.Param.PARAM3 = PARAM3;
+    attribCmd.Param.PARAM4 = (DID & RFAL_ISODEP_ATTRIB_PARAM4_DID_MASK);
+    ST_MEMCPY(attribCmd.nfcid0, nfcid0, RFAL_NFCB_NFCID0_LEN);
+    
+    /* Append the Higher layer Info if provided */
+    if( (HLInfo != NULL) && (HLInfoLen > 0) )
+    {
+        ST_MEMCPY(attribCmd.HLInfo, HLInfo, MIN(HLInfoLen, RFAL_ISODEP_ATTRIB_HLINFO_LEN) );
+    }
+    
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&attribCmd, (RFAL_ISODEP_ATTRIB_HDR_LEN + MIN(HLInfoLen, RFAL_ISODEP_ATTRIB_HLINFO_LEN)), (uint8_t*)attribRes, sizeof(rfalIsoDepAttribRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, fwt, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+       
+    *attribResLen = (uint8_t)rcvLen;
+    
+    if( ret == ERR_NONE )
+    {
+        /* Check a for valid ATTRIB Response   Digital 1.1  15.6.2.1 */
+        if( (rcvLen < RFAL_ISODEP_ATTRIB_RES_HDR_LEN) || ((attribRes->mbliDid & RFAL_ISODEP_ATTRIB_RES_DID_MASK) != DID) )
+        {
+           return ERR_PROTO;
+        }
+    }
+   
+   return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepPollAHandleActivation( rfalIsoDepFSxI FSDI, uint8_t DID, rfalBitRate maxBR, rfalIsoDepDevice *isoDepDev, 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 )
+{
+    uint8_t          RATSretries;
+    uint8_t          msgIt;
+    ReturnCode       ret;
+    rfalIsoDepPpsRes ppsRes;
+    
+    if( isoDepDev == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Enable EMD handling according   Digital 1.1  4.1.1.1 ; EMVCo 2.6  4.9.2 */
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_EMVCO );
+    
+    RATSretries = gIsoDep.maxRetriesRATS;
+    
+    /***************************************************************************/
+    /* Send RATS                                                               */
+    do
+    {
+        /* Digital 1.1 13.7.1.1 and ISO 14443-4 5.6.1.1 - Upon a failed RATS it may be retransmited [0,1] */
+        ret = rfalIsoDepRATS( FSDI, DID, &isoDepDev->activation.A.Listener.ATS, &isoDepDev->activation.A.Listener.ATSLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* EMVCo 2.6  9.6.1.1 & 9.6.1.2  If a timeout error is detected retransmit, on transmission error abort */
+        if( (gIsoDep.compMode == RFAL_COMPLIANCE_MODE_EMV) && (ret != ERR_NONE) && (ret != ERR_TIMEOUT) )
+        {
+            break;
+        }
+        
+        platformDelay(1);
+    }
+    while( (RATSretries--) && (ret != ERR_NONE) );
+    
+    
+    
+    /* Switch between NFC Forum and ISO14443-4 behaviour #595
+     *   ISO14443-4  5.6.1  If RATS fails, a Deactivation sequence should be performed as defined on clause 8  
+     *   Activity 1.1  9.6  Device Deactivation Activity is to be only performed when there's an active device */
+    if( ret != ERR_NONE )
+    {
+        if( gIsoDep.compMode == RFAL_COMPLIANCE_MODE_ISO )
+        {
+            rfalIsoDepDeselect( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        }
+        return ret;
+    }
+    
+    /*******************************************************************************/
+    /* Process ATS Response                                                        */
+    isoDepDev->info.FWI  = RFAL_ISODEP_FWI_DEFAULT; /* Default value   EMVCo 2.6  5.7.2.6  */
+    isoDepDev->info.SFGI = 0;
+    isoDepDev->info.MBL  = 0;
+    isoDepDev->info.DSI  = RFAL_BR_106;
+    isoDepDev->info.DRI  = RFAL_BR_106;
+    isoDepDev->info.FSxI = RFAL_ISODEP_FSXI_32;     /* FSC default value is 32 bytes  ISO14443-A  5.2.3 */
+    
+    
+    /*******************************************************************************/
+    /* Check for ATS optional fields                                               */
+    if( isoDepDev->activation.A.Listener.ATS.TL > RFAL_ISODEP_ATS_MIN_LEN )
+    {
+        msgIt = RFAL_ISODEP_ATS_MIN_LEN;
+        
+        /* Format byte T0 is optional, if present assign FSDI */
+        isoDepDev->info.FSxI = (isoDepDev->activation.A.Listener.ATS.T0 & RFAL_ISODEP_ATS_T0_FSCI_MASK);
+        
+        /* T0 has already been processed, always the same position */
+        msgIt++; 
+        
+        /* Check if TA is present */
+        if( isoDepDev->activation.A.Listener.ATS.T0 & RFAL_ISODEP_ATS_T0_TA_PRESENCE_MASK )
+        {
+            rfalIsoDepCalcBitRate( maxBR, *((uint8_t*)&isoDepDev->activation.A.Listener.ATS + msgIt++), &isoDepDev->info.DSI, &isoDepDev->info.DRI );
+        }
+        
+        /* Check if TB is present */
+        if( isoDepDev->activation.A.Listener.ATS.T0 & RFAL_ISODEP_ATS_T0_TB_PRESENCE_MASK )
+        {
+            isoDepDev->info.SFGI  = *((uint8_t*)&isoDepDev->activation.A.Listener.ATS + msgIt++);
+            isoDepDev->info.FWI   = ((isoDepDev->info.SFGI >> RFAL_ISODEP_ATS_TB_FWI_SHIFT) & RFAL_ISODEP_ATS_FWI_MASK);
+            isoDepDev->info.SFGI &= RFAL_ISODEP_ATS_TB_SFGI_MASK;
+        }
+        
+        /* Check if TC is present */
+        if( isoDepDev->activation.A.Listener.ATS.T0 & RFAL_ISODEP_ATS_T0_TC_PRESENCE_MASK )
+        {
+            /* Check for Protocol features support */
+            /* Advanced protocol features defined on Digital 1.0 Table 69, removed after */
+            isoDepDev->info.supAdFt = ((*((uint8_t*)&isoDepDev->activation.A.Listener.ATS + msgIt)   & RFAL_ISODEP_ATS_TC_ADV_FEAT) ? true : false);
+            isoDepDev->info.supDID  = ((*((uint8_t*)&isoDepDev->activation.A.Listener.ATS + msgIt)   & RFAL_ISODEP_ATS_TC_DID) ? true : false);
+            isoDepDev->info.supNAD  = ((*((uint8_t*)&isoDepDev->activation.A.Listener.ATS + msgIt++) & RFAL_ISODEP_ATS_TC_NAD) ? true : false);
+        }
+    }
+    
+    isoDepDev->info.FSx  = rfalIsoDepFSxI2FSx(isoDepDev->info.FSxI);
+    
+    isoDepDev->info.SFGT = rfalIsoDepSFGI2SFGT( isoDepDev->info.SFGI );
+    isoDepTimerStart( gIsoDep.SFGTTimer, isoDepDev->info.SFGT );
+    
+    isoDepDev->info.FWT  = rfalIsoDepFWI2FWT( isoDepDev->info.FWI );
+    isoDepDev->info.dFWT = RFAL_ISODEP_DFWT_10;
+    
+    isoDepDev->info.DID = ( (isoDepDev->info.supDID) ? DID : RFAL_ISODEP_NO_DID);
+    isoDepDev->info.NAD = RFAL_ISODEP_NO_NAD;
+    
+    
+    /*******************************************************************************/
+    /* If higher bit rates are supported by both devices, send PPS                 */
+    if( (isoDepDev->info.DSI != RFAL_BR_106) || (isoDepDev->info.DRI != RFAL_BR_106) )
+    {
+        /* Wait until SFGT has been fulfilled */
+        while( !isoDepTimerisExpired( gIsoDep.SFGTTimer ) );
+        
+        ret = rfalIsoDepPPS( isoDepDev->info.DID, isoDepDev->info.DSI, isoDepDev->info.DRI, &ppsRes, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        if( ret == ERR_NONE )
+        {
+            /* DSI code the divisor from PICC to PCD */
+            /* DRI code the divisor from PCD to PICC */
+            rfalSetBitRate( isoDepDev->info.DRI, isoDepDev->info.DSI, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        }
+        else
+        {
+            isoDepDev->info.DSI = RFAL_BR_106;
+            isoDepDev->info.DRI = RFAL_BR_106;
+        }
+    }
+    
+    /*******************************************************************************/
+    /* Store already FS info,  rfalIsoDepGetMaxInfLen() may be called before setting TxRx params */
+    gIsoDep.fsx    = isoDepDev->info.FSx;
+    gIsoDep.ourFsx = rfalIsoDepFSxI2FSx( FSDI );
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalIsoDepPollBHandleActivation( rfalIsoDepFSxI FSDI, uint8_t DID, rfalBitRate maxBR, uint8_t PARAM1, rfalNfcbListenDevice *nfcbDev, uint8_t* HLInfo, uint8_t HLInfoLen, rfalIsoDepDevice *isoDepDev, 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 )
+{
+    ReturnCode ret;
+    uint8_t    mlbi;
+    
+    /***************************************************************************/
+    /* Initialize ISO-DEP Device with info from SENSB_RES                      */
+    isoDepDev->info.FWI     = ((nfcbDev->sensbRes.protInfo.FwiAdcFo >> RFAL_NFCB_SENSB_RES_FWI_SHIFT) & RFAL_NFCB_SENSB_RES_FWI_MASK);
+    isoDepDev->info.FWT     = rfalIsoDepFWI2FWT( isoDepDev->info.FWI );
+    isoDepDev->info.dFWT    = RFAL_NFCB_DFWT_10;
+    isoDepDev->info.SFGI    = ((nfcbDev->sensbRes.protInfo.SFGI >> RFAL_NFCB_SENSB_RES_SFGI_SHIFT) & RFAL_NFCB_SENSB_RES_SFGI_MASK);
+    isoDepDev->info.SFGT    = rfalIsoDepSFGI2SFGT( isoDepDev->info.SFGI );
+    isoDepDev->info.FSxI    = ((nfcbDev->sensbRes.protInfo.FsciProType >> RFAL_NFCB_SENSB_RES_FSCI_SHIFT) & RFAL_NFCB_SENSB_RES_FSCI_MASK);
+    isoDepDev->info.FSx     = rfalIsoDepFSxI2FSx(isoDepDev->info.FSxI);
+    isoDepDev->info.DID     = DID;
+    isoDepDev->info.supDID  = (( nfcbDev->sensbRes.protInfo.FwiAdcFo & RFAL_NFCB_SENSB_RES_FO_DID_MASK ) ? true : false);
+    isoDepDev->info.supNAD  = (( nfcbDev->sensbRes.protInfo.FwiAdcFo & RFAL_NFCB_SENSB_RES_FO_NAD_MASK ) ? true : false);
+    
+    
+    /* Check if DID requested is supported by PICC */
+    if( (DID != RFAL_ISODEP_NO_DID) && (!isoDepDev->info.supDID) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Enable EMD handling according   Digital 1.1  4.1.1.1 ; EMVCo 2.6  4.9.2 */
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_EMVCO );
+    
+    /***************************************************************************/
+    /* Apply minimum TR2 from SENSB_RES  */
+    rfalSetFDTPoll( rfalNfcbTR2ToFDT(((nfcbDev->sensbRes.protInfo.FsciProType >>RFAL_NFCB_SENSB_RES_PROTO_TR2_SHIFT) & RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK)) );
+    
+    
+    /* Calculate max Bit Rate */
+    rfalIsoDepCalcBitRate( maxBR, nfcbDev->sensbRes.protInfo.BRC, &isoDepDev->info.DSI, &isoDepDev->info.DRI );
+    
+    /***************************************************************************/
+    /* Send ATTRIB Command                                                     */
+    ret = rfalIsoDepATTRIB( (uint8_t*)&nfcbDev->sensbRes.nfcid0,
+                           ((nfcbDev->sensbRes.protInfo.FwiAdcFo & RFAL_NFCB_SENSB_RES_ADC_ADV_FEATURE_MASK) ? PARAM1 : RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT),
+                           isoDepDev->info.DSI,
+                           isoDepDev->info.DRI,
+                           FSDI,
+                           (gIsoDep.compMode == RFAL_COMPLIANCE_MODE_EMV) ? RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK : (nfcbDev->sensbRes.protInfo.FsciProType & ( (RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK<<RFAL_NFCB_SENSB_RES_PROTO_TR2_SHIFT) | RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK)),  /* EMVCo 2.6 6.4.1.9 */
+                           DID,
+                           HLInfo,
+                           HLInfoLen,
+                           (isoDepDev->info.FWT + isoDepDev->info.dFWT),
+                           &isoDepDev->activation.B.Listener.ATTRIB_RES,
+                           &isoDepDev->activation.B.Listener.ATTRIB_RESLen, mspiChannel, mST25, gpio_cs, IRQ,
+						   fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06
+                         );
+    
+    /***************************************************************************/
+    /* Process ATTRIB Response                                                 */
+    if( ret == ERR_NONE )
+    {
+        /* Digital 1.1 14.6.2.3 - Check if received DID match */
+        if( (isoDepDev->activation.B.Listener.ATTRIB_RES.mbliDid & RFAL_ISODEP_ATTRIB_RES_DID_MASK) != DID )
+        {
+            return ERR_PROTO;
+        }
+                
+        /* Retrieve MBLI and calculate new FDS/MBL (Maximum Buffer Length) */
+        mlbi = ((isoDepDev->activation.B.Listener.ATTRIB_RES.mbliDid >> RFAL_ISODEP_ATTRIB_RES_MLBI_SHIFT) & RFAL_ISODEP_ATTRIB_RES_MLBI_MASK);
+        if( mlbi > 0)
+        {
+            /* Digital 1.1  14.6.2  Calculate Maximum Buffer Length MBL = FSC × 2^(MBLI-1) */
+            isoDepDev->info.MBL = (isoDepDev->info.FSx * (1<<(mlbi-1)));
+        }
+        
+        /* DSI code the divisor from PICC to PCD */
+        /* DRI code the divisor from PCD to PICC */
+        rfalSetBitRate( isoDepDev->info.DRI, isoDepDev->info.DSI, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        
+        if( (nfcbDev->sensbRes.protInfo.FwiAdcFo & RFAL_NFCB_SENSB_RES_ADC_ADV_FEATURE_MASK) )
+        {
+            /* REMARK: SoF EoF TR0 and TR1 are not passed on to RF layer */
+        }
+        
+        /* Start the SFGT timer */
+        isoDepTimerStart( gIsoDep.SFGTTimer, isoDepDev->info.SFGT );
+    }
+    else
+    {
+        isoDepDev->info.DSI = RFAL_BR_106;
+        isoDepDev->info.DRI = RFAL_BR_106;
+    }
+    
+    /*******************************************************************************/    
+    /* Store already FS info,  rfalIsoDepGetMaxInfLen() may be called before setting TxRx params */
+    gIsoDep.fsx    = isoDepDev->info.FSx;
+    gIsoDep.ourFsx = rfalIsoDepFSxI2FSx( FSDI );
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+static void rfalIsoDepCalcBitRate( rfalBitRate maxAllowedBR, uint8_t piccBRCapability, rfalBitRate *dsi, rfalBitRate *dri )
+{
+    uint8_t driMask;
+    uint8_t dsiMask;
+    uint8_t bitrateFound;
+    int8_t  i;
+    
+    do
+    {
+        bitrateFound = true;
+        
+        (*dsi) = RFAL_BR_106;
+        (*dri) = RFAL_BR_106;
+        
+        /* Digital 1.0  5.6.2.5 & 11.6.2.14: A received RFU value of b4 = 1b MUST be interpreted as if b7 to b1 ? 0000000b (only 106 kbits/s in both direction) */
+        if( (RFAL_ISODEP_BITRATE_RFU_MASK & piccBRCapability) )
+        {
+            return;
+        }
+        
+        /***************************************************************************/
+        /* Determine Listen->Poll bit rate */
+        dsiMask = (piccBRCapability & RFAL_ISODEP_BSI_MASK);
+        for( i = 2; i >= 0; i-- )  /* Check supported bit rate from the highest */ 
+        {
+            if ((dsiMask & (0x10 << i)) && (((rfalBitRate)(i+1)) <= maxAllowedBR))
+            {
+                (*dsi) = ((rfalBitRate)(i+1));
+                break;
+            }
+        }
+        
+        /***************************************************************************/
+        /* Determine Poll->Listen bit rate */ 
+        driMask = (piccBRCapability & RFAL_ISODEP_BRI_MASK);
+        for( i = 2; i >= 0; i-- )  /* Check supported bit rate from the highest */ 
+        {
+            if ((driMask & (0x01 << i)) && (((rfalBitRate)(i+1)) <= maxAllowedBR))
+            {
+                (*dri) = ((rfalBitRate)(i+1));
+                break;
+            }
+        }
+        
+        /***************************************************************************/
+        /* Check if different bit rate is supported */
+        
+        /* Digital 1.0 Table 67: if b8=1b, then only the same bit rate divisor for both directions is supported */
+        if( piccBRCapability & RFAL_ISODEP_SAME_BITRATE_MASK )
+        {   
+            (*dsi) = MIN((*dsi), (*dri));
+            (*dri) = (*dsi);
+            /* Check that the baudrate is supported */
+            if(  (RFAL_BR_106 != (*dsi)) && ( !((dsiMask & (0x10 << ((*dsi) - 1))) &&(driMask & (0x01 << ((*dri) - 1)))) )  )
+            {
+                bitrateFound = false;
+                maxAllowedBR = (*dsi); /* set allowed bitrate to be lowest and determine bit rate again */
+            }
+        }
+    } while (!(bitrateFound));
+    
+}
+
+ 
+ /*******************************************************************************/
+ static void rfalIsoDepApdu2IBLockParam( rfalIsoDepApduTxRxParam apduParam, rfalIsoDepTxRxParam *iBlockParam, uint16_t txPos, uint16_t rxPos )
+{
+     NO_WARNING(rxPos); /* Keep this param for future use */
+     
+     iBlockParam->DID    = apduParam.DID;
+     iBlockParam->FSx    = apduParam.FSx;
+     iBlockParam->ourFSx = apduParam.ourFSx;
+     iBlockParam->FWT    = apduParam.FWT;
+     iBlockParam->dFWT   = apduParam.dFWT;
+     
+     if( (apduParam.txBufLen - txPos) > rfalIsoDepGetMaxInfLen() )
+     {
+         iBlockParam->isTxChaining = true;
+         iBlockParam->txBufLen     = rfalIsoDepGetMaxInfLen();
+     }
+     else
+     {
+         iBlockParam->isTxChaining = false;
+         iBlockParam->txBufLen     = (apduParam.txBufLen - txPos);
+     }
+     
+     /* TxBuf is moved to the beginning for every I-Block */
+     iBlockParam->txBuf        = (rfalIsoDepBufFormat*)apduParam.txBuf;
+     iBlockParam->rxBuf        = apduParam.tmpBuf;                        /* Simply using the apdu buffer is not possible because of current ACK handling */
+     iBlockParam->isRxChaining = &gIsoDep.isAPDURxChaining;
+     iBlockParam->rxLen        = apduParam.rxLen;
+}
+ 
+ 
+/*******************************************************************************/
+ReturnCode rfalIsoDepStartApduTransceive( rfalIsoDepApduTxRxParam param )
+{
+    rfalIsoDepTxRxParam txRxParam;
+    
+    /* Initialize and store APDU context */
+    gIsoDep.APDUParam = param;
+    gIsoDep.APDUTxPos = 0;
+    gIsoDep.APDURxPos = 0;
+    
+    /* Assign current FSx to calculate INF length */
+    gIsoDep.ourFsx = param.ourFSx;
+    gIsoDep.fsx    = param.FSx;
+    
+    /* Convert APDU TxRxParams to I-Block TxRxParams */
+    rfalIsoDepApdu2IBLockParam( gIsoDep.APDUParam, &txRxParam, gIsoDep.APDUTxPos, gIsoDep.APDURxPos );
+    
+    return rfalIsoDepStartTransceive( txRxParam );
+}
+ 
+ 
+/*******************************************************************************/
+ReturnCode rfalIsoDepGetApduTransceiveStatus( 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 )
+{
+    ReturnCode          ret;
+    rfalIsoDepTxRxParam txRxParam;
+    
+    ret = rfalIsoDepGetTransceiveStatus( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    switch( ret )
+    {
+        /*******************************************************************************/
+        case ERR_NONE:
+         
+            /* Check if we are still doing chaining on Tx */
+            if( gIsoDep.isTxChaining )
+            {
+                /* Add already Tx bytes */
+                gIsoDep.APDUTxPos += gIsoDep.txBufLen;
+                
+                /* Convert APDU TxRxParams to I-Block TxRxParams */
+                rfalIsoDepApdu2IBLockParam( gIsoDep.APDUParam, &txRxParam, gIsoDep.APDUTxPos, gIsoDep.APDURxPos );
+                
+                /* Move next I-Block to beginning of APDU Tx buffer */
+                ST_MEMCPY( gIsoDep.APDUParam.txBuf->apdu, &gIsoDep.APDUParam.txBuf->apdu[gIsoDep.APDUTxPos], txRxParam.txBufLen );
+                
+                rfalIsoDepStartTransceive( txRxParam );
+                return ERR_BUSY;
+            }
+            
+            /* Copy packet from tmp buffer to APDU buffer */
+            ST_MEMCPY( &gIsoDep.APDUParam.rxBuf->apdu[gIsoDep.APDURxPos], gIsoDep.APDUParam.tmpBuf->inf, *gIsoDep.APDUParam.rxLen );
+            gIsoDep.APDURxPos += *gIsoDep.APDUParam.rxLen;
+             
+            /* APDU TxRx is done */
+            break;
+         
+        /*******************************************************************************/
+        case ERR_AGAIN:
+            /* Copy chained packet from tmp buffer to APDU buffer */
+            ST_MEMCPY( &gIsoDep.APDUParam.rxBuf->apdu[gIsoDep.APDURxPos], gIsoDep.APDUParam.tmpBuf->inf, *gIsoDep.APDUParam.rxLen );
+            gIsoDep.APDURxPos += *gIsoDep.APDUParam.rxLen;
+            
+            /* Wait for next I-Block */
+            return ERR_BUSY;
+        
+        /*******************************************************************************/
+        default:
+            return ret;
+    }
+    
+    *gIsoDep.APDUParam.rxLen = gIsoDep.APDURxPos;
+    
+    return ERR_NONE;
+ }
+
+#endif /* RFAL_FEATURE_ISO_DEP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_isoDep.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,813 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_isoDep.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of ISO-DEP protocol
+ *
+ *  This implementation was based on the following specs:
+ *    - ISO/IEC 14443-4  2nd Edition 2008-07-15
+ *    - NFC Forum Digital Protocol  1.1 2014-01-14
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup ISO-DEP
+ * @brief RFAL ISO-DEP Module
+ * @{
+ *
+ */
+
+#ifndef RFAL_ISODEP_H_
+#define RFAL_ISODEP_H_
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "rfal_nfcb.h"
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_ISODEP_PROLOGUE_SIZE               (3)     /*!< Length of Prologue Field for I-Block Format                       */
+
+#define RFAL_ISODEP_PCB_LEN                     (1)     /*!< PCB length                                                        */
+#define RFAL_ISODEP_DID_LEN                     (1)     /*!< DID length                                                        */
+#define RFAL_ISODEP_NAD_LEN                     (1)     /*!< NAD length                                                        */
+#define RFAL_ISODEP_NO_DID                      (0x00)  /*!< DID value indicating the ISO-DEP layer not to use DID             */
+#define RFAL_ISODEP_NO_NAD                      (0xFF)  /*!< NAD value indicating the ISO-DEP layer not to use NAD             */
+
+#define RFAL_ISODEP_FSDI_DEFAULT                (8)     /*!< Default Frame Size Integer supported by NFCC as Initiator         */
+#define RFAL_ISODEP_FWI_MASK                    (0xF0)  /*!< Mask bits of FWI                                                  */
+#define RFAL_ISODEP_FWI_SHIFT                   (4)     /*!< Shift val of FWI                                                  */
+#define RFAL_ISODEP_FWI_DEFAULT                 (4)     /*!< Default value for FWI Digital 1.0 11.6.2.17                       */
+#define RFAL_ISODEP_ADV_FEATURE                 (0x0F)  /*!< Indicate 256 Bytes FSD and Advanc Proto Feature support:NAD & DID */
+
+#define RFAL_ISODEP_DID_MAX                     (14)    /*!< Maximum DID value                                                 */
+
+#define RFAL_ISODEP_BRI_MASK                    (0x07)  /*!< Mask bits for Poll to Listen Send bitrate                         */
+#define RFAL_ISODEP_BSI_MASK                    (0x70)  /*!< Mask bits for Listen to Poll Send bitrate                         */
+#define RFAL_ISODEP_SAME_BITRATE_MASK           (0x80)  /*!< Mask bit indicate only same bit rate D for both direction support */
+#define RFAL_ISODEP_BITRATE_RFU_MASK            (0x08)  /*!< Mask bit for RFU                                                  */
+
+/*! Maximum Frame Waiting Time = ((256 * 16/fc) * 2^FWImax) = ((256*16/fc)*2^14) = (67108864)/fc = 2^26 (1/fc)                 */
+#define RFAL_ISODEP_MAX_FWT                     (1<<26)
+
+
+
+#define RFAL_ISODEP_FSX_KEEP                    (0xFF)               /*!< Flag to keep FSX from activation                     */
+#define RFAL_ISODEP_DEFAULT_FSCI                RFAL_ISODEP_FSXI_256 /*!< FSCI default value to be used  in Listen Mode        */
+#define RFAL_ISODEP_DEFAULT_FSC                 RFAL_ISODEP_FSX_256  /*!< FSC default value (aligned RFAL_ISODEP_DEFAULT_FSCI) */
+#define RFAL_ISODEP_DEFAULT_SFGI                (0)                  /*!< SFGI Default value to be used  in Listen Mode        */
+
+#define RFAL_ISODEP_APDU_MAX_LEN                RFAL_ISODEP_FSX_1024  /*!< Max APDU length                                     */
+
+#define RFAL_ISODEP_ATTRIB_RES_MBLI_NO_INFO     (0x00)  /*!< MBLI indicating no information on its internal input buffer size  */
+#define RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT   (0x00)  /*!< Default values of Param 1 of ATTRIB_REQ Digital 1.0  12.6.1.3-5   */
+#define RFAL_ISODEP_ATTRIB_HLINFO_LEN           (32)    /*!< Maximum Size of Higher Layer Information                          */
+#define RFAL_ISODEP_ATS_HB_MAX_LEN              (15)    /*!< Maximum length of Historical Bytes  Digital 1.1  13.6.2.23        */
+#define RFAL_ISODEP_ATTRIB_REQ_MIN_LEN          (9)     /*!< Minimum Length of ATTRIB_REQ command                              */
+#define RFAL_ISODEP_ATTRIB_RES_MIN_LEN          (1)     /*!< Minimum Length of ATTRIB_RES response                             */
+
+#define RFAL_ISODEP_ATS_TA_DPL_212              (0x01)  /*!< ATS TA DSI 212 kbps support bit mask                              */
+#define RFAL_ISODEP_ATS_TA_DPL_424              (0x02)  /*!< ATS TA DSI 424 kbps support bit mask                              */
+#define RFAL_ISODEP_ATS_TA_DPL_848              (0x04)  /*!< ATS TA DSI 848 kbps support bit mask                              */
+#define RFAL_ISODEP_ATS_TA_DLP_212              (0x10)  /*!< ATS TA DSI 212 kbps support bit mask                              */
+#define RFAL_ISODEP_ATS_TA_DLP_424              (0x20)  /*!< ATS TA DRI 424 kbps support bit mask                              */
+#define RFAL_ISODEP_ATS_TA_DLP_848              (0x40)  /*!< ATS TA DRI 848 kbps support bit mask                              */
+#define RFAL_ISODEP_ATS_TA_SAME_D               (0x80)  /*!< ATS TA same bit both directions bit mask                          */
+#define RFAL_ISODEP_ATS_TB_FWI_MASK             (0xF0)  /*!< Mask bits for FWI (Frame Waiting Integer) in TB byte              */
+#define RFAL_ISODEP_ATS_TB_SFGI_MASK            (0x0F)  /*!< Mask bits for SFGI (Start-Up Frame Guard Integer) in TB byte      */
+
+#define RFAL_ISODEP_ATS_T0_TA_PRESENCE_MASK     (0x10)  /*!< Mask bit for TA presence                                          */
+#define RFAL_ISODEP_ATS_T0_TB_PRESENCE_MASK     (0x20)  /*!< Mask bit for TB presence                                          */
+#define RFAL_ISODEP_ATS_T0_TC_PRESENCE_MASK     (0x40)  /*!< Mask bit for TC presence                                          */
+#define RFAL_ISODEP_ATS_T0_FSCI_MASK            (0x0F)  /*!< Mask bit for FSCI presence                                        */
+#define RFAL_ISODEP_ATS_T0_OFFSET               (0x01)  /*!< Offset of T0 in ATS Response                                      */
+
+
+#define RFAL_ISODEP_MAX_I_RETRYS                (2)     /*!< Number of retries for a I-Block  Digital 1.1   15.2.5.4                            */
+#define RFAL_ISODEP_MAX_R_RETRYS                (3)     /*!< Number of retries for a R-Block  Digital 1.1 A8 - nRETRY ACK/NAK:  [2,5]           */
+#define RFAL_ISODEP_MAX_S_RETRYS                (3)     /*!< Number of retries for a S-Block  Digital 1.1 A8 - nRETRY DESELECT: [0,5] WTX[2,5]  */
+#define RFAL_ISODEP_RATS_RETRIES                (1)     /*!< RATS retries upon fail           Digital 1.1  A.6 - [0,1]                          */
+
+
+/*! Frame Size for Proximity Card Integer definitions                                                               */
+typedef enum
+{
+      RFAL_ISODEP_FSXI_16   =  0,  /*!< Frame Size for Proximity Card Integer with 16 bytes                         */
+      RFAL_ISODEP_FSXI_24   =  1,  /*!< Frame Size for Proximity Card Integer with 24 bytes                         */
+      RFAL_ISODEP_FSXI_32   =  2,  /*!< Frame Size for Proximity Card Integer with 32 bytes                         */
+      RFAL_ISODEP_FSXI_40   =  3,  /*!< Frame Size for Proximity Card Integer with 40 bytes                         */
+      RFAL_ISODEP_FSXI_48   =  4,  /*!< Frame Size for Proximity Card Integer with 48 bytes                         */
+      RFAL_ISODEP_FSXI_64   =  5,  /*!< Frame Size for Proximity Card Integer with 64 bytes                         */
+      RFAL_ISODEP_FSXI_96   =  6,  /*!< Frame Size for Proximity Card Integer with 96 bytes                         */
+      RFAL_ISODEP_FSXI_128  =  7,  /*!< Frame Size for Proximity Card Integer with 128 bytes                        */
+      RFAL_ISODEP_FSXI_256  =  8,  /*!< Frame Size for Proximity Card Integer with 256 bytes                        */
+      RFAL_ISODEP_FSXI_512  =  9,  /*!< Frame Size for Proximity Card Integer with 512 bytes   ISO14443-3 Amd2 2012 */
+      RFAL_ISODEP_FSXI_1024 = 10,  /*!< Frame Size for Proximity Card Integer with 1024 bytes  ISO14443-3 Amd2 2012 */
+      RFAL_ISODEP_FSXI_2048 = 11,  /*!< Frame Size for Proximity Card Integer with 2048 bytes  ISO14443-3 Amd2 2012 */
+      RFAL_ISODEP_FSXI_4096 = 12   /*!< Frame Size for Proximity Card Integer with 4096 bytes  ISO14443-3 Amd2 2012 */
+} rfalIsoDepFSxI;
+
+/*! Frame Size for Proximity Card  definitions                                                             */
+typedef enum
+{
+    RFAL_ISODEP_FSX_16   = 16,    /*!< Frame Size for Proximity Card with 16 bytes                         */
+    RFAL_ISODEP_FSX_24   = 24,    /*!< Frame Size for Proximity Card with 16 bytes                         */
+    RFAL_ISODEP_FSX_32   = 32,    /*!< Frame Size for Proximity Card with 32 bytes                         */
+    RFAL_ISODEP_FSX_40   = 40,    /*!< Frame Size for Proximity Card with 40 bytes                         */
+    RFAL_ISODEP_FSX_48   = 48,    /*!< Frame Size for Proximity Card with 48 bytes                         */
+    RFAL_ISODEP_FSX_64   = 64,    /*!< Frame Size for Proximity Card with 64 bytes                         */
+    RFAL_ISODEP_FSX_96   = 96,    /*!< Frame Size for Proximity Card with 96 bytes                         */
+    RFAL_ISODEP_FSX_128  = 128,   /*!< Frame Size for Proximity Card with 128 bytes                        */
+    RFAL_ISODEP_FSX_256  = 256,   /*!< Frame Size for Proximity Card with 256 bytes                        */
+    RFAL_ISODEP_FSX_512  = 512,   /*!< Frame Size for Proximity Card with 512 bytes   ISO14443-3 Amd2 2012 */
+    RFAL_ISODEP_FSX_1024 = 1024,  /*!< Frame Size for Proximity Card with 1024 bytes  ISO14443-3 Amd2 2012 */
+    RFAL_ISODEP_FSX_2048 = 2048,  /*!< Frame Size for Proximity Card with 2048 bytes  ISO14443-3 Amd2 2012 */
+    RFAL_ISODEP_FSX_4096 = 4096,  /*!< Frame Size for Proximity Card with 4096 bytes  ISO14443-3 Amd2 2012 */
+} rfalIsoDepFSx;
+
+/*
+ ******************************************************************************
+ * GLOBAL MACROS
+ ******************************************************************************
+ */
+
+/*
+ ******************************************************************************
+ * GLOBAL DATA TYPES
+ ******************************************************************************
+ */
+
+/*! RATS format  Digital 1.1 13.6.1                                                               */
+typedef struct
+{
+    uint8_t      CMD;                               /*!< RATS command byte: 0xE0                  */
+    uint8_t      PARAM;                             /*!< Param indicating FSDI and DID            */
+} rfalIsoDepRats;
+
+
+/*! ATS response format  Digital 1.1 13.6.2                                                       */
+typedef struct
+{
+  uint8_t        TL;                                /*!< Length Byte, including TL byte itself    */
+  uint8_t        T0;                                /*!< Format Byte T0 indicating if TA, TB, TC  */
+  uint8_t        TA;                                /*!< Interface Byte TA(1)                     */
+  uint8_t        TB;                                /*!< Interface Byte TB(1)                     */
+  uint8_t        TC;                                /*!< Interface Byte TC(1)                     */
+  uint8_t        HB[RFAL_ISODEP_ATS_HB_MAX_LEN];    /*!< Historical Bytes                         */
+} rfalIsoDepAts;
+
+
+/*! PPS Request format (Protocol and Parameter Selection) ISO14443-4  5.3                         */
+typedef struct
+{
+    uint8_t      PPSS;                              /*!< Start Byte: [ 1101b | CID[4b] ]          */
+    uint8_t      PPS0;                              /*!< Parameter 0:[ 000b | PPS1[1n] | 0001b ]  */
+    uint8_t      PPS1;                              /*!< Parameter 1:[ 0000b | DSI[2b] | DRI[2b] ]*/
+} rfalIsoDepPpsReq;
+
+
+/*! PPS Response format (Protocol and Parameter Selection) ISO14443-4  5.4                        */
+typedef struct
+{
+    uint8_t      PPSS;                              /*!< Start Byte:  [ 1101b | CID[4b] ]  */
+} rfalIsoDepPpsRes;
+
+
+/*! ATTRIB Command Format  Digital 1.1  15.6.1 */
+typedef struct
+{
+    uint8_t         cmd;                                   /*!< ATTRIB_REQ command byte           */
+    uint8_t         nfcid0[RFAL_NFCB_NFCID0_LEN];          /*!< NFCID0 of the card to be selected */
+    struct{
+            uint8_t PARAM1;                                /*!< PARAM1 of ATTRIB command          */
+            uint8_t PARAM2;                                /*!< PARAM2 of ATTRIB command          */
+            uint8_t PARAM3;                                /*!< PARAM3 of ATTRIB command          */
+            uint8_t PARAM4;                                /*!< PARAM4 of ATTRIB command          */
+    }Param;                                                /*!< Parameter of ATTRIB command       */
+    uint8_t         HLInfo[RFAL_ISODEP_ATTRIB_HLINFO_LEN]; /*!< Higher Layer Information          */
+} rfalIsoDepAttribCmd;
+
+
+/*! ATTRIB Response Format  Digital 1.1  15.6.2 */
+typedef struct
+{
+    uint8_t         mbliDid;                               /*!< Contains MBLI and DID             */
+    uint8_t         HLInfo[RFAL_ISODEP_ATTRIB_HLINFO_LEN]; /*!< Higher Layer Information          */
+} rfalIsoDepAttribRes;
+
+
+/*! Activation info as Poller and Listener for NFC-A and NFC-B                                    */
+typedef union {
+
+    /*! NFC-A information                                                                         */
+    union {
+        struct {
+            rfalIsoDepAts        ATS;               /*!< ATS response            (Poller mode)    */
+            uint8_t              ATSLen;            /*!< ATS response length     (Poller mode)    */
+            }Listener;
+        struct {
+            rfalIsoDepRats      RATS;               /*!< RATS request          (Listener mode)    */
+        }Poller;
+    }A;
+
+    /*! NFC-B information                                                                         */
+    union {
+        struct{
+            rfalIsoDepAttribRes  ATTRIB_RES;        /*!< ATTRIB_RES              (Poller mode)    */
+            uint8_t              ATTRIB_RESLen;     /*!< ATTRIB_RES length       (Poller mode)    */
+        }Listener;
+        struct{
+            rfalIsoDepAttribCmd  ATTRIB;            /*!< ATTRIB request        (Listener mode)    */
+            uint8_t              ATTRIBLen;         /*!< ATTRIB request length (Listener mode)    */
+        }Poller;
+    }B;
+}rfalIsoDepActivation;
+
+
+/*! ISO-DEP device Info */
+typedef struct {
+    uint8_t            FWI;             /*!< Frame Waiting Integer                                */
+    uint32_t           FWT;             /*!< Frame Waiting Time (1/fc)                            */
+    uint32_t           dFWT;            /*!< Delta Frame Waiting Time (1/fc)                      */
+    uint32_t           SFGI;            /*!< Start-up Frame Guard time Integer                    */
+    uint32_t           SFGT;            /*!< Start-up Frame Guard Time (ms)                       */
+    uint8_t            FSxI;            /*!< Frame Size Device/Card Integer (FSDI or FSCI)        */
+    uint16_t           FSx;             /*!< Frame Size Device/Card (FSD or FSC)                  */
+    uint32_t           MBL;             /*!< Maximum Buffer Length (optional for NFC-B)           */
+    rfalBitRate        DSI;             /*!< Bit Rate coding from Listener (PICC) to Poller (PCD) */
+    rfalBitRate        DRI;             /*!< Bit Rate coding from Poller (PCD) to Listener (PICC) */
+    uint8_t            DID;             /*!< Device ID                                            */
+    uint8_t            NAD;             /*!< Node ADdress                                         */
+    bool               supDID;          /*!< DID supported flag                                   */
+    bool               supNAD;          /*!< NAD supported flag                                   */
+    bool               supAdFt;         /*!< Advanced Features supported flag                     */
+} rfalIsoDepInfo;
+
+
+/*! ISO-DEP Device structure */
+typedef struct {
+    rfalIsoDepActivation    activation; /*!< Activation Info                                      */
+    rfalIsoDepInfo          info;       /*!< ISO-DEP (ISO14443-4) device Info                     */
+} rfalIsoDepDevice;
+
+
+/*! ATTRIB Response parameters */
+typedef struct
+{
+    uint8_t  mbli;                                  /*!< MBLI                                     */
+    uint8_t  HLInfo[RFAL_ISODEP_ATTRIB_HLINFO_LEN]; /*!< Hi Layer Information                     */
+    uint8_t  HLInfoLen;                             /*!< Hi Layer Information Length              */
+} rfalIsoDepAttribResParam;
+
+
+/*! ATS Response parameter */
+typedef struct
+{
+    uint8_t     fsci;                               /*!< Frame Size of Proximity Card Integer     */
+    uint8_t     fwi;                                /*!< Frame Waiting Time Integer               */
+    uint8_t     sfgi;                               /*!< Start-Up Frame Guard Time Integer        */
+    bool        didSupport;                         /*!< DID Supported                            */
+    uint8_t     ta;                                 /*!< Max supported bitrate both direction     */
+    uint8_t     *hb;                                /*!< Historical Bytes data                    */
+    uint8_t     hbLen;                              /*!< Historical Bytes Length                  */
+} rfalIsoDepAtsParam;
+
+
+/*! Structure of I-Block Buffer format from caller */
+typedef struct
+{
+    uint8_t  prologue[RFAL_ISODEP_PROLOGUE_SIZE];   /*!< Prologue/SoD buffer                      */
+    uint8_t  inf[RFAL_ISODEP_DEFAULT_FSC];          /*!< INF/Payload buffer                       */
+} rfalIsoDepBufFormat;
+
+
+/*! Structure of APDU Buffer format from caller */
+typedef struct
+{
+    uint8_t  prologue[RFAL_ISODEP_PROLOGUE_SIZE];   /*!< Prologue/SoD buffer                      */
+    uint8_t  apdu[RFAL_ISODEP_APDU_MAX_LEN];        /*!< APDU/Payload buffer                      */
+} rfalIsoDepApduBufFormat;
+
+
+/*! Listen Activation Parameters Structure */
+typedef struct
+{
+    rfalIsoDepBufFormat  *rxBuf;                    /*!< Receive Buffer struct reference          */
+    uint16_t             *rxLen;                    /*!< Received INF data length in Bytes        */
+    bool                 *isRxChaining;             /*!< Received data is not complete            */
+    rfalIsoDepDevice     *isoDepDev;                /*!< ISO-DEP device info                      */
+} rfalIsoDepListenActvParam;
+
+
+/*! Structure of parameters used on ISO DEP Transceive */
+typedef struct
+{
+    rfalIsoDepBufFormat  *txBuf;                    /*!< Transmit Buffer struct reference         */
+    uint16_t             txBufLen;                  /*!< Transmit Buffer INF field length in Bytes*/
+    bool                 isTxChaining;              /*!< Transmit data is not complete            */
+    rfalIsoDepBufFormat  *rxBuf;                    /*!< Receive Buffer struct reference in Bytes */
+    uint16_t             *rxLen;                    /*!< Received INF data length in Bytes         */
+    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             ourFSx;                    /*!< Our device Frame Size (FSD or FSC)       */
+    uint16_t             FSx;                       /*!< Other device Frame Size (FSD or FSC)     */
+    uint8_t              DID;                       /*!< Device ID (RFAL_ISODEP_NO_DID if no DID) */
+} rfalIsoDepTxRxParam;
+
+
+/*! Structure of parameters used on ISO DEP APDU Transceive */
+typedef struct
+{
+    rfalIsoDepApduBufFormat  *txBuf;                /*!< Transmit Buffer struct reference         */
+    uint16_t                 txBufLen;              /*!< Transmit Buffer INF field length in Bytes*/
+    rfalIsoDepApduBufFormat  *rxBuf;                /*!< Receive Buffer struct reference in Bytes */
+    uint16_t                 *rxLen;                /*!< Received INF data length in Bytes        */
+    rfalIsoDepBufFormat      *tmpBuf;               /*!< Temp buffer for Rx I-Blocks (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)     */
+    uint16_t                 ourFSx;                /*!< Our device Frame Size (FSD or FSC)       */
+    uint8_t                  DID;                   /*!< Device ID (RFAL_ISODEP_NO_DID if no DID) */
+} rfalIsoDepApduTxRxParam;
+
+/*
+ ******************************************************************************
+ * GLOBAL FUNCTION PROTOTYPES
+ ******************************************************************************
+ */
+
+
+/*!
+ ******************************************************************************
+ * \brief Initialize the ISO-DEP protocol
+ *
+ * Initialize the ISO-DEP protocol layer with default config
+ ******************************************************************************
+ */
+void rfalIsoDepInitialize( void );
+
+
+/*!
+ ******************************************************************************
+ * \brief Initialize the ISO-DEP protocol
+ *
+ * Initialize the ISO-DEP protocol layer with additional parameters allowing
+ * to customise the protocol layer for specific behaviours
+ *
+ *  \param[in] compMode       : compliance mode to be performed
+ *  \param[in] maxRetriesR    :  Number of retries for a R-Block
+ *  \param[in] maxRetriesS    :  Number of retries for a S-Block
+ *  \param[in] maxRetriesI    :  Number of retries for a I-Block
+ *  \param[in] maxRetriesRATS :  Number of retries for RATS
+ *
+ ******************************************************************************
+ */
+void rfalIsoDepInitializeWithParams( rfalComplianceMode compMode, uint8_t maxRetriesR, uint8_t maxRetriesS, uint8_t maxRetriesI, uint8_t maxRetriesRATS );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  FSxI to FSx
+ *
+ *  Convert Frame Size for proximity coupling Device Integer (FSxI) to
+ *  Frame Size for proximity coupling Device (FSx)
+ *
+ *  FSD - maximum frame size for NFC Forum Device in Poll Mode
+ *  FSC - maximum frame size for NFC Forum Device in Listen Mode
+ *
+ *  FSxI = FSDI or FSCI
+ *  FSx  = FSD or FSC
+ *
+ *  The FSD/FSC value includes the header and CRC
+ *
+ *  \param[in] fsxi :  Frame Size for proximity coupling Device Integer
+ *
+ *  \return fsx : Frame Size for proximity coupling Device (FSD or FSC)
+ *
+ *****************************************************************************
+ */
+uint16_t rfalIsoDepFSxI2FSx( uint8_t fsxi );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  FWI to FWT
+ *
+ *  Convert Frame Waiting time Integer (FWI) to Frame Waiting Time (FWT) in
+ *  1/fc units
+ *
+ *  \param[in] fwi : Frame Waiting time Integer
+ *
+ *  \return fwt : Frame Waiting Time in 1/fc units
+ *
+ *****************************************************************************
+ */
+uint32_t rfalIsoDepFWI2FWT( uint8_t fwi );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  Check if the buffer data contains a valid RATS command
+ *
+ *  Check if it is a  well formed RATS command with 2 bytes
+ *  This function does not check the validity of FSDI and DID
+ *
+ *  \param[in] buf    : reference to buffer containing the data to be checked
+ *  \param[in] bufLen : length of data in the buffer in bytes
+ *
+ *  \return true if the data indicates a RATS command; false otherwise
+ *****************************************************************************
+ */
+bool rfalIsoDepIsRats( uint8_t *buf, uint8_t bufLen );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  Check if the buffer data contains a valid ATTRIB command
+ *
+ *  Check if it is a well formed ATTRIB command, but does not check the
+ *  validity of the information inside
+ *
+ *  \param[in] buf    : reference to buffer containing the data to be checked
+ *  \param[in] bufLen : length of data in the buffer in bytes
+ *
+ *  \return true if the data indicates a ATTRIB command; false otherwise
+ *****************************************************************************
+ */
+bool rfalIsoDepIsAttrib( uint8_t *buf, uint8_t bufLen );
+
+
+/*!
+ *****************************************************************************
+ * \brief Start Listen Activation Handling
+ *
+ * Start Listen Activation Handling and setup to receive first I-block which may
+ * contain complete or partial APDU after activation is completed
+ *
+ *  Pass in RATS for T4AT, or ATTRIB for T4BT, to handle ATS or ATTRIB Response respectively
+ *  The Activation Handling handles ATS and ATTRIB Response; and additionally PPS Response
+ *  if a PPS is received for T4AT.
+ *  The method uses the current RFAL state machine to determine if it is expecting RATS or ATTRIB
+ *
+ *  Activation is completed if PPS Response is sent or if first PDU is received in T4T-A
+ *  Activation is completed if ATTRIB Response is sent in T4T-B
+ *
+ *  \ref rfalIsoDepListenGetActivationStatus provide status if activation is completed.
+ *  \ref rfalIsoDepStartTransceive shall be called right after activation is completed
+ *
+ *  \param[in] atsParam       : reference to ATS parameters
+ *  \param[in] attribResParam : reference to ATTRIB_RES parameters
+ *  \param[in] buf            : reference to buffer containing RATS or ATTRIB
+ *  \param[in] bufLen         : length in bytes of the given bufffer
+ *  \param[in] rxParam        : reference to incoming reception information will be placed
+ *
+ *
+ *  \warning Once the Activation has been completed the method
+ *  rfalIsoDepGetTransceiveStatus() must be called.
+ *  If activation has completed due to reception of a data block (not PPS) the
+ *  buffer owned by the caller and passed on rxParam must still contain this data.
+ *  The first data will be processed (I-Block or S-DSL) by rfalIsoDepGetTransceiveStatus()
+ *  inform the caller and then for the next transaction use rfalIsoDepStartTransceive()
+ *
+ *  \return ERR_NONE    : RATS/ATTRIB is valid and activation has started
+ *  \return ERR_PARAM   : Invalid parameters
+ *  \return ERR_PROTO   : Invalid request
+ *  \return ERR_NOTSUPP : Feature not supported
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepListenStartActivation( rfalIsoDepAtsParam *atsParam, rfalIsoDepAttribResParam *attribResParam, uint8_t *buf, uint16_t bufLen, rfalIsoDepListenActvParam rxParam, 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief Get the current Activation Status
+ *
+ *  \return ERR_NONE if Activation is already completed
+ *  \return ERR_BUSY if Activation is ongoing
+ *  \return ERR_LINK_LOSS if Remote Field is turned off
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepListenGetActivationStatus( 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief Get the ISO-DEP Communication Information
+ *
+ *  Gets the maximum INF length in bytes based on current Frame Size
+ *  for proximity coupling Device (FSD or FSC) excluding the header and CRC
+ *
+ *  \return maximum INF length in bytes
+ *****************************************************************************
+ */
+uint16_t rfalIsoDepGetMaxInfLen( void );
+
+
+/*!
+ *****************************************************************************
+ *  \brief ISO-DEP Start Transceive
+ *
+ *  This method triggers a ISO-DEP Transceive containing a complete or
+ *  partial APDU
+ *  It transmits the given message and handles all protocol retransmitions,
+ *  error handling and control messages
+ *
+ *  The txBuf  contains a complete or partial APDU (INF) to be transmitted
+ *  The Prologue field will be manipulated by the Transceive
+ *
+ *  If the buffer contains a partial APDU 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 ERR_PARAM       : Bad request
+ *  \return ERR_WRONG_STATE : The module is not in a proper state
+ *  \return ERR_NONE        : The Transceive request has been started
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepStartTransceive( rfalIsoDepTxRxParam param );
+
+
+/*!
+ *****************************************************************************
+ *  \brief Get the Transceive status
+ *
+ *  Returns the status of the ISO-DEP Transceive
+ *
+ *  \warning  When the other device is performing chaining once a chained
+ *            block is received the error ERR_AGAIN is sent. At this point
+ *            caller must handle the received data immediately.
+ *            When 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 ERR_NONE      : Transceive has been completed successfully
+ *  \return ERR_BUSY      : Transceive is ongoing
+ *  \return ERR_PROTO     : Protocol error occurred
+ *  \return ERR_TIMEOUT   : Timeout error occurred
+ *  \return ERR_SLEEP_REQ : Deselect has been received and responded
+ *  \return ERR_NOMEM     : The received INF does not fit into the
+ *                            receive buffer
+ *  \return ERR_LINK_LOSS : Communication is lost because Reader/Writer
+ *                            has turned off its field
+ *  \return ERR_AGAIN     : received one chaining block, continue to call
+ *                            this method to retrieve the remaining blocks
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepGetTransceiveStatus( 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief ISO-DEP Start APDU Transceive
+ *
+ *  This method triggers a ISO-DEP Transceive containing a complete APDU
+ *  It transmits the given message and handles all protocol retransmitions,
+ *  error handling and control messages
+ *
+ *  The txBuf  contains a complete APDU 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 ERR_PARAM       : Bad request
+ *  \return ERR_WRONG_STATE : The module is not in a proper state
+ *  \return ERR_NONE        : The Transceive request has been started
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepStartApduTransceive( rfalIsoDepApduTxRxParam param );
+
+
+/*!
+ *****************************************************************************
+ *  \brief Get the APDU Transceive status
+ *
+ *  \return ERR_NONE      : if Transceive has been completed successfully
+ *  \return ERR_BUSY      : if Transceive is ongoing
+ *  \return ERR_PROTO     : if a protocol error occurred
+ *  \return ERR_TIMEOUT   : if a timeout error occurred
+ *  \return ERR_SLEEP_REQ : if Deselect is received and responded
+ *  \return ERR_NOMEM     : if the received INF does not fit into the
+ *                            receive buffer
+ *  \return ERR_LINK_LOSS : if communication is lost because Reader/Writer
+ *                            has turned off its field
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepGetApduTransceiveStatus( 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 );
+
+/*!
+ *****************************************************************************
+ *  \brief  ISO-DEP Send RATS
+ *
+ *  This sends a RATS to make a NFC-A Listen Device to enter
+ *  ISO-DEP layer (ISO14443-4) and checks if the received ATS is valid
+ *
+ *  \param[in]  FSDI   : Frame Size Device Integer to be used
+ *  \param[in]  DID    : Device ID to be used or RFAL_ISODEP_NO_DID for not use DID
+ *  \param[out] ats    : pointer to place the ATS Response
+ *  \param[out] atsLen : pointer to place the ATS length
+ *
+ *  \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ *  \return ERR_PARAM        : Invalid parameters
+ *  \return ERR_IO           : Generic internal error
+ *  \return ERR_TIMEOUT      : Timeout error
+ *  \return ERR_PAR          : Parity error detected
+ *  \return ERR_CRC          : CRC error detected
+ *  \return ERR_FRAMING      : Framing error detected
+ *  \return ERR_PROTO        : Protocol error detected
+ *  \return ERR_NONE         : No error, ATS received
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepRATS( rfalIsoDepFSxI FSDI, uint8_t DID, rfalIsoDepAts *ats , uint8_t *atsLen, 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  ISO-DEP Send PPS
+ *
+ *  This sends a PPS to make a NFC-A Listen Device change the communications
+ *  bit rate from 106kbps to one of the supported bit rates
+ *  Additionally checks if the received PPS response is valid
+ *
+ *  \param[in]  DID    : Device ID
+ *  \param[in]  DSI    : DSI code the divisor from Listener (PICC) to Poller (PCD)
+ *  \param[in]  DRI    : DRI code the divisor from Poller (PCD) to Listener (PICC)
+ *  \param[out] ppsRes : pointer to place the PPS Response
+ *
+ *  \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ *  \return ERR_PARAM        : Invalid parameters
+ *  \return ERR_IO           : Generic internal error
+ *  \return ERR_TIMEOUT      : Timeout error
+ *  \return ERR_PAR          : Parity error detected
+ *  \return ERR_CRC          : CRC error detected
+ *  \return ERR_FRAMING      : Framing error detected
+ *  \return ERR_PROTO        : Protocol error detected
+ *  \return ERR_NONE         : No error, PPS Response received
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepPPS( uint8_t DID, rfalBitRate DSI, rfalBitRate DRI, rfalIsoDepPpsRes *ppsRes, 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  ISO-DEP Send ATTRIB
+ *
+ *  This sends a ATTRIB to make a NFC-B Listen Device to enter
+ *  ISO-DEP layer (ISO14443-4) and checks if the received ATTRIB Response is valid
+ *
+ *  \param[in]  nfcid0    : NFCID0 to be used for the ATTRIB
+ *  \param[in]  PARAM1    : ATTRIB PARAM1 byte (communication parameters)
+ *  \param[in]  DSI       : DSI code the divisor from Listener (PICC) to Poller (PCD)
+ *  \param[in]  DRI       : DRI code the divisor from Poller (PCD) to Listener (PICC)
+ *  \param[in]  FSDI      : PCD's Frame Size to be announced on the ATTRIB
+ *  \param[in]  PARAM3    : ATTRIB PARAM1 byte (protocol type)
+ *  \param[in]  DID       : Device ID to be used or RFAL_ISODEP_NO_DID for not use DID
+ *  \param[in]  HLInfo    : pointer to Higher layer INF (NULL if none)
+ *  \param[in]  HLInfoLen : Length HLInfo
+ *  \param[in]  fwt       : Frame Waiting Time to be used (from SENSB_RES)
+ *  \param[out] attribRes    : pointer to place the ATTRIB Response
+ *  \param[out] attribResLen : pointer to place the ATTRIB Response length
+ *
+ *  \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ *  \return ERR_PARAM        : Invalid parameters
+ *  \return ERR_IO           : Generic internal error
+ *  \return ERR_TIMEOUT      : Timeout error
+ *  \return ERR_CRC          : CRC error detected
+ *  \return ERR_FRAMING      : Framing error detected
+ *  \return ERR_PROTO        : Protocol error detected
+ *  \return ERR_NONE         : No error, ATTRIB Response received
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepATTRIB( uint8_t* nfcid0, uint8_t PARAM1, rfalBitRate DSI, rfalBitRate DRI, rfalIsoDepFSxI FSDI, uint8_t PARAM3, uint8_t DID, uint8_t* HLInfo, uint8_t HLInfoLen, uint32_t fwt, rfalIsoDepAttribRes *attribRes, uint8_t *attribResLen, 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  Deselects PICC
+ *
+ *  This function sends a deselect command to PICC and waits for it`s
+ *  responce in a blocking way
+ *
+ *  \return ERR_NONE   : Deselect successfully sent and acknowledged by PICC
+ *  \return ERR_TIMEOUT: No response rcvd from PICC
+ *
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepDeselect( 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 );
+
+/*!
+ *****************************************************************************
+ *  \brief  ISO-DEP Poller Handle NFC-A Activation
+ *
+ *  This performs a NFC-A Activation into ISO-DEP layer (ISO14443-4) with the given
+ *  parameters. It sends RATS and if the higher bit rates are supported by
+ *  both devices it additionally sends PPS
+ *  Once Activated all details of the device are provided on isoDepDev
+ *
+ *  \param[in]  FSDI      : Frame Size Device Integer to be used
+ *  \param[in]  DID       : Device ID to be used or RFAL_ISODEP_NO_DID for not use DID
+ *  \param[in]  maxBR     : Max bit rate supported by the Poller
+ *  \param[out] isoDepDev : ISO-DEP information of the activated Listen device
+ *
+ *  \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ *  \return ERR_PARAM        : Invalid parameters
+ *  \return ERR_IO           : Generic internal error
+ *  \return ERR_TIMEOUT      : Timeout error
+ *  \return ERR_PAR          : Parity error detected
+ *  \return ERR_CRC          : CRC error detected
+ *  \return ERR_FRAMING      : Framing error detected
+ *  \return ERR_PROTO        : Protocol error detected
+ *  \return ERR_NONE         : No error, activation successful
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepPollAHandleActivation( rfalIsoDepFSxI FSDI, uint8_t DID, rfalBitRate maxBR, rfalIsoDepDevice *isoDepDev, 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \brief  ISO-DEP Poller Handle NFC-B Activation
+ *
+ *  This performs a NFC-B Activation into ISO-DEP layer (ISO14443-4) with the given
+ *  parameters. It sends ATTRIB and calculates supported higher bit rates of both
+ *  devices and performs activation.
+ *  Once Activated all details of the device are provided on isoDepDev
+ *
+ *  \param[in]  FSDI         : Frame Size Device Integer to be used
+ *  \param[in]  DID          : Device ID to be used or RFAL_ISODEP_NO_DID for not use DID
+ *  \param[in]  maxBR        : Max bit rate supported by the Poller
+ *  \param[in]  PARAM1       : ATTRIB PARAM1 byte (communication parameters)
+ *  \param[in]  nfcbDev      : pointer to the NFC-B Device containing the SENSB_RES
+ *  \param[in]  HLInfo       : pointer to Higher layer INF (NULL if none)
+ *  \param[in]  HLInfoLen    : Length HLInfo
+ *  \param[out] isoDepDev    : ISO-DEP information of the activated Listen device
+ *
+ *  \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ *  \return ERR_PARAM        : Invalid parameters
+ *  \return ERR_IO           : Generic internal error
+ *  \return ERR_TIMEOUT      : Timeout error
+ *  \return ERR_PAR          : Parity error detected
+ *  \return ERR_CRC          : CRC error detected
+ *  \return ERR_FRAMING      : Framing error detected
+ *  \return ERR_PROTO        : Protocol error detected
+ *  \return ERR_NONE         : No error, activation successful
+ *****************************************************************************
+ */
+ReturnCode rfalIsoDepPollBHandleActivation( rfalIsoDepFSxI FSDI, uint8_t DID, rfalBitRate maxBR, uint8_t PARAM1, rfalNfcbListenDevice *nfcbDev, uint8_t* HLInfo, uint8_t HLInfoLen, rfalIsoDepDevice *isoDepDev, 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 );
+
+
+#endif /* RFAL_ISODEP_H_ */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcDep.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,2488 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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:   NFCC firmware
+ *      LANGUAGE:  ISO C99
+ */
+
+/*! \file rfal_nfcDep.c
+ *
+ *  \author  Gustavo Patricio
+ *
+ *  \brief 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
+ *
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include <platform1.h>
+#include "rfal_nfcDep.h"
+#include "rfal_nfcf.h"
+#include "utils.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_NFC_DEP
+    #error " RFAL: Module configuration missing. Please enable/disable NFC-DEP module by setting: RFAL_FEATURE_NFC_DEP "
+#endif
+
+#if RFAL_FEATURE_NFC_DEP
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+
+#define NFCIP_LOOP_MAX                  0x0005FFFF                     /*!< Max blocking reRuns                                   */
+#define NFCIP_ATR_RETRY_MAX             2                              /*!< Max consecutive retrys of an ATR REQ with transm error*/
+
+#define NFCIP_PSLPAY_LEN                (2)                            /*!< PSL Payload length (BRS + FSL)                        */
+#define NFCIP_PSLREQ_LEN                (3 + RFAL_NFCDEP_LEN_LEN)      /*!< PSL REQ length (incl LEN)                             */
+#define NFCIP_PSLRES_LEN                (3 + RFAL_NFCDEP_LEN_LEN)      /*!< PSL RES length (incl LEN)                             */
+
+#define NFCIP_ATRREQ_BUF_LEN            (RFAL_NFCDEP_ATRREQ_MAX_LEN + RFAL_NFCDEP_LEN_LEN) /*!< ATR REQ max length (incl LEN)     */
+#define NFCIP_ATRRES_BUF_LEN            (RFAL_NFCDEP_ATRRES_MAX_LEN + RFAL_NFCDEP_LEN_LEN) /*!< ATR RES max length (incl LEN)     */
+
+#define NFCIP_RLSREQ_LEN                (3 + RFAL_NFCDEP_LEN_LEN)      /*!< RLS REQ length (incl LEN)                             */
+#define NFCIP_RLSRES_LEN                (3 + RFAL_NFCDEP_LEN_LEN)      /*!< RSL RES length (incl LEN)                             */
+#define NFCIP_RLSRES_MIN                (2 + RFAL_NFCDEP_LEN_LEN)      /*!< Minimum length for a RLS RES (incl LEN)               */
+
+#define NFCIP_DSLREQ_LEN                (3 + RFAL_NFCDEP_LEN_LEN)      /*!< DSL REQ length (incl LEN)                             */
+#define NFCIP_DSLRES_LEN                (3 + RFAL_NFCDEP_LEN_LEN)      /*!< DSL RES length (incl LEN)                             */
+#define NFCIP_DSLRES_MIN                (2 + RFAL_NFCDEP_LEN_LEN)      /*!< Minimum length for a DSL RES (incl LEN)               */
+
+#define NFCIP_DSLRES_MAX_LEN            (3 + RFAL_NFCDEP_LEN_LEN)      /*!< Maximum length for a DSL RES (incl LEN)               */
+#define NFCIP_RLSRES_MAX_LEN            (3 + RFAL_NFCDEP_LEN_LEN)      /*!< Minimum length for a RLS RES (incl LEN)               */
+#define NFCIP_TARGET_RES_MAX            ( MAX( NFCIP_RLSRES_MAX_LEN, NFCIP_DSLRES_MAX_LEN) ) /*!< Max target control res length   */
+
+
+
+#define NFCIP_NO_FWT                    RFAL_FWT_NONE                  /*!< No FWT value - Target Mode                            */
+#define NFCIP_INIT_MIN_RTOX             1                              /*!< Minimum RTOX value  Digital 1.0  14.8.4.1             */
+#define NFCIP_INIT_MAX_RTOX             59                             /*!< Maximum RTOX value  Digital 1.0  14.8.4.1             */
+
+#define NFCIP_TARG_MIN_RTOX             1                              /*!< Minimum target RTOX value  Digital 1.0  14.8.4.1      */
+#define NFCIP_TARG_MAX_RTOX             59                             /*!< Maximum target RTOX value  Digital 1.0  14.8.4.1      */
+
+#define NFCIP_TRECOV                    (1280 / 64)                    /*!< Digital 1.0  A.10  Trecov                             */
+
+#define NFCIP_TIMEOUT_ADJUSTMENT        8                              /*!< Timeout Adjustment to compensate timing from end of Tx to end of frame: (512/64)/fc */
+#define NFCIP_RWT_ACTIVATION            (0x40001 + NFCIP_TIMEOUT_ADJUSTMENT) /*!< Digital 1.0  A.10  RWT ACTIVATION   2^24/64[64/fc] + RWT Delta + Adjustment   */
+
+#define RFAL_NFCDEP_HEADER_PAD          (RFAL_NFCDEP_DEPREQ_HEADER_LEN - RFAL_NFCDEP_LEN_MIN) /*!< Difference between expected rcvd header len and max foreseen */
+
+
+#define NFCIP_MAX_TX_RETRYS             3               /*!< Number of retransmit retyrs                           */
+#define NFCIP_MAX_TO_RETRYS             3               /*!< Number of retrys for Timeout                          */
+#define NFCIP_MAX_RTOX_RETRYS           3               /*!< Number of retrys for RTOX                             */
+#define NFCIP_MAX_NACK_RETRYS           3               /*!< Number of retrys for NACK                             */
+#define NFCIP_MAX_ATN_RETRYS            3               /*!< Number of retrys for ATN                              */
+
+#define NFCIP_MIN_TXERROR_LEN           4               /*!< Minimum frame length with error to be ignored  Digital 1.0 14.12.5.4 */
+
+#define NFCIP_REQ                       0xD4            /*!<NFCIP REQuest code                                     */
+#define NFCIP_RES                       0xD5            /*!<NFCIP RESponce code                                    */
+
+#define NFCIP_BS_MASK                   0x0F            /*!< Bit mask for BS value on a ATR REQ/RES                */
+#define NFCIP_BR_MASK                   NFCIP_BS_MASK   /*!< Bit mask for BR value on a ATR REQ/RES                */
+
+#define NFCIP_PP_GB_MASK                0x02            /*!< Bit mask for GB value in PP byte on a ATR REQ/RES     */
+#define NFCIP_PP_NAD_MASK               0x01            /*!< Bit mask for NAD value in PP byte on a ATR REQ/RES    */
+
+#define NFCIP_PFB_xPDU_MASK             0xE0            /*!< Bit mask for PDU type                                 */
+#define NFCIP_PFB_IPDU                  0x00            /*!< Bit mask indicating a Information PDU                 */
+#define NFCIP_PFB_RPDU                  0x40            /*!< Bit mask indicating a Response PDU                    */
+#define NFCIP_PFB_SPDU                  0x80            /*!< Bit mask indicating a Supervisory PDU                 */
+
+#define NFCIP_PFB_MI_BIT                0x10            /*!< Bit mask for the chaining bit (MI) of PFB             */
+#define NFCIP_PFB_DID_BIT               0x04            /*!< Bit mask for the DID presence bit of PFB              */
+#define NFCIP_PFB_NAD_BIT               0x08            /*!< Bit mask for the NAD presence bit of PFB              */
+#define NFCIP_PFB_PNI_MASK              0x03            /*!< Bit mask for the Packet Number Information            */
+
+#define NFCIP_PFB_Rx_MASK               0x10            /*!< Bit mask for the R-PDU type                           */
+#define NFCIP_PFB_ACK                   0x00            /*!< Bit mask for R-PDU indicating ACK                     */
+#define NFCIP_PFB_NACK                  0x10            /*!< Bit mask for R-PDU indicating NAK                     */
+
+#define NFCIP_PFB_Sx_MASK               0x10            /*!< Bit mask for the R-PDU type                           */
+#define NFCIP_PFB_ATN                   0x00            /*!< Bit mask for R-PDU indicating ACK                     */
+#define NFCIP_PFB_TO                    0x10            /*!< Bit mask for R-PDU indicating NAK                     */
+
+#define NFCIP_PFB_INVALID               0xFF            /*!< Invalid PFB value                                     */
+
+/*
+ ******************************************************************************
+ * MACROS
+ ******************************************************************************
+ */
+
+#define nfcipIsTransmissionError(e)    ( (ERR_NO_MASK(e) == ERR_CRC) || (ERR_NO_MASK(e) == ERR_FRAMING) || (ERR_NO_MASK(e) == ERR_PAR) ) /*!< Checks if is a Trasmission error */
+
+
+#define nfcipConv1FcToMs( v )          (((v * 64) / 13560) + 1)                                       /*!< Converts value v 1fc into milliseconds (fc=13.56)     */
+
+#define nfcipCmdIsReq( cmd )           ((cmd % 2) == 0)                                               /*!< Checks if the nfcip cmd is a REQ                      */
+
+#define nfcip_PFBhasDID( pfb )         ( (pfb & NFCIP_PFB_DID_BIT) == NFCIP_PFB_DID_BIT)              /*!< Checks if pfb is signalling DID                       */
+#define nfcip_PFBhasNAD( pfb )         ( (pfb & NFCIP_PFB_NAD_BIT) == NFCIP_PFB_NAD_BIT)              /*!< Checks if pfb is signalling NAD                       */
+
+#define nfcip_PFBisIPDU( pfb )         ( (pfb & NFCIP_PFB_xPDU_MASK) == NFCIP_PFB_IPDU)               /*!< Checks if pfb is a Information PDU                    */
+#define nfcip_PFBisRPDU( pfb )         ( (pfb & NFCIP_PFB_xPDU_MASK) == NFCIP_PFB_RPDU)               /*!< Checks if pfb is Response PDU                         */
+#define nfcip_PFBisSPDU( pfb )         ( (pfb & NFCIP_PFB_xPDU_MASK) == NFCIP_PFB_SPDU)               /*!< Checks if pfb is a Supervisory PDU                    */
+
+#define nfcip_PFBisIMI( pfb )          ( nfcip_PFBisIPDU( pfb ) && (pfb & NFCIP_PFB_MI_BIT) == NFCIP_PFB_MI_BIT)  /*!< Checks if pfb is a Information PDU indicating MI chaining */
+
+#define nfcip_PFBisRNACK( pfb )        ( nfcip_PFBisRPDU( pfb ) && ((pfb & NFCIP_PFB_Rx_MASK) == NFCIP_PFB_NACK)) /*!< Checks if pfb is a R-PDU indicating NACK  */
+#define nfcip_PFBisRACK( pfb )         ( nfcip_PFBisRPDU( pfb ) && ((pfb & NFCIP_PFB_Rx_MASK) == NFCIP_PFB_ACK )) /*!< Checks if pfb is a R-PDU indicating ACK   */
+
+#define nfcip_PFBisSATN( pfb )         ( nfcip_PFBisSPDU( pfb ) && ((pfb & NFCIP_PFB_Sx_MASK) == NFCIP_PFB_ATN))  /*!< Checks if pfb is a R-PDU indicating ATN   */
+#define nfcip_PFBisSTO( pfb )          ( nfcip_PFBisSPDU( pfb ) && ((pfb & NFCIP_PFB_Sx_MASK) == NFCIP_PFB_TO) )  /*!< Checks if pfb is a R-PDU indicating TO    */
+
+
+#define nfcip_PFBIPDU( pni )           ( (uint8_t)( 0x00 | NFCIP_PFB_IPDU | (pni & NFCIP_PFB_PNI_MASK) ))/*!< Returns a PFB I-PDU with the given packet number (pni)                   */
+#define nfcip_PFBIPDU_MI( pni )        ( (uint8_t)(isoDep_PCBIBlock(pni) | NFCIP_PFB_MI_BIT))            /*!< Returns a PFB I-PDU with the given packet number (pni) indicating chaing */
+
+#define nfcip_PFBRPDU( pni )           ( (uint8_t)( 0x00 | NFCIP_PFB_RPDU | (pni & NFCIP_PFB_PNI_MASK) ))/*!< Returns a PFB R-PDU with the given packet number (pni)                   */
+#define nfcip_PFBRPDU_NACK( pni )      ( (uint8_t)(nfcip_PFBRPDU(pni) | NFCIP_PFB_NACK))                 /*!< Returns a PFB R-PDU with the given packet number (pni) indicating NACK   */
+#define nfcip_PFBRPDU_ACK( pni )       ( (uint8_t)(nfcip_PFBRPDU(pni) | NFCIP_PFB_ACK))                  /*!< Returns a PFB R-PDU with the given packet number (pni) indicating ACK    */
+
+#define nfcip_PFBSPDU()                ( (uint8_t)( 0x00 | NFCIP_PFB_SPDU ))                          /*!< Returns a PFB S-PDU                               */
+#define nfcip_PFBSPDU_ATN()            ( (uint8_t)(nfcip_PFBSPDU() | NFCIP_PFB_ATN))                  /*!< Returns a PFB S-PDU indicating ATN                */
+#define nfcip_PFBSPDU_TO()             ( (uint8_t)(nfcip_PFBSPDU() | NFCIP_PFB_TO))                   /*!< Returns a PFB S-PDU indicating TO                 */
+
+
+#define nfcip_PNIInc( pni )            ( (uint8_t) ((pni+1) & NFCIP_PFB_PNI_MASK) )                   /*!< Returns a incremented PNI from the given (pni)    */
+#define nfcip_PNIDec( pni )            ( (uint8_t) ((pni-1) & NFCIP_PFB_PNI_MASK) )                   /*!< Returns a decremented PNI from the given (pni)    */
+
+#define nfcip_PBF_PNI( pfb )           ( (uint8_t) (pfb & NFCIP_PFB_PNI_MASK ))                       /*!< Returns the Packet Number Information (pni)       */
+
+#define nfcip_PPwGB( lr )              ( rfalNfcDepLR2PP( lr ) | NFCIP_PP_GB_MASK)                    /*!< Returns a PP byte containing the given PP value indicating GB                  */
+
+#define nfcip_DIDMax( did )            ( MIN( (did), RFAL_NFCDEP_DID_MAX) )                           /*!< Ensures that the given did has proper value  Digital 14.6.2.3 DID [0 14]       */
+#define nfcip_RTOXTargMax( wt )        ( MIN( (RFAL_NFCDEP_RWT_TRG_MAX / rfalNfcDepWT2RWT(wt)), NFCIP_TARG_MAX_RTOX) )/*!< Calculates the Maximum RTOX value for the given wt as a Target */
+
+#define nfcipIsInitiator( st )         ( ((st) >= NFCIP_ST_INIT_IDLE) && ((st) <= NFCIP_ST_INIT_RLS) )/*!< Checks if module is set as Initiator                                           */
+#define nfcipIsTarget( st )            (!nfcipIsInitiator(st))                                        /*!< Checks if module is set as Target                                              */
+
+#define nfcipIsBRAllowed( br, mBR )    (((1<<(br)) & mBR) != 0)                                       /*!< Checks bit rate is allowed by given mask                                       */
+
+#define nfcipIsEmptyDEPEnabled( op )   (!nfcipIsEmptyDEPDisabled(op))                                 /*!< Checks if empty payload is allowed by operation config  NCI 1.0 Table 81       */
+#define nfcipIsEmptyDEPDisabled( op )  ((op & RFAL_NFCDEP_OPER_EMPTY_DEP_DIS) != 0)                   /*!< Checks if empty payload is not allowed by operation config  NCI 1.0 Table 81   */
+
+#define nfcipIsRTOXReqEnabled( op )    (!nfcipIsRTOXReqDisabled(op))                                  /*!< Checks if send a RTOX_REQ is allowed by operation config  NCI 1.0 Table 81     */
+#define nfcipIsRTOXReqDisabled( op )   ((op & RFAL_NFCDEP_OPER_RTOX_REQ_DIS) != 0)                    /*!< Checks if send a RTOX_REQ is not allowed by operation config  NCI 1.0 Table 81 */
+
+
+/*! Checks if isDeactivating callback is set and calls it, otherwise returns false */
+#define nfcipIsDeactivationPending()   ( (gNfcip.isDeactivating == NULL) ? false : gNfcip.isDeactivating() )
+
+
+#define nfcipRTOXAdjust( v )           (v - (v>>3))                                                   /*!< Adjust RTOX timer value to a percentage of the total, current 88% */ 
+
+/*******************************************************************************/
+
+/* timerPollTimeoutValue is necessary after timerCalculateTimeout so that system will wake up upon timer timeout. */
+#define nfcipTimerStart( timer, time_ms ) timer = platformTimerCreate(time_ms)                        /*!< Configures and starts the RTOX timer   */
+#define nfcipTimerisExpired( timer )      platformTimerIsExpired( timer )                             /*!< Checks RTOX timer has expired                   */
+
+#define nfcipLogE(...)                                                                                /*!< Macro for the error log method                  */
+#define nfcipLogW(...)                                                                                /*!< Macro for the warning log method                */
+#define nfcipLogI(...)                                                                                /*!< Macro for the info log method                   */
+#define nfcipLogD(...)                                                                                /*!< Macro for the debug log method                  */
+
+
+/*! Digital 1.1 - 16.12.5.2  The Target SHALL NOT attempt any error recovery and remains in Rx mode upon Transmission or a Protocol Error */
+#define nfcDepReEnableRx( rxB, rxBL, rxL )       rfalTransceiveBlockingTx( NULL, 0, rxB, rxBL, rxL, ( RFAL_TXRX_FLAGS_DEFAULT | RFAL_TXRX_FLAGS_NFCIP1_ON ), RFAL_FWT_NONE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) 
+
+
+uint8_t           txBuf[RFAL_NFCDEP_ATRREQ_MAX_LEN];
+uint8_t		rxBuf[NFCIP_ATRRES_BUF_LEN];
+
+uint8_t    txBufPSL[NFCIP_PSLREQ_LEN];
+uint8_t    pslBufPSL[NFCIP_PSLPAY_LEN];
+uint8_t    rxBufPSL[NFCIP_PSLRES_LEN];
+
+uint8_t  txBufDSL[ RFAL_NFCDEP_HEADER_PAD + NFCIP_DSLREQ_LEN];
+uint8_t  rxBufDSL[NFCIP_DSLRES_LEN];
+
+uint8_t    txBufRLS[RFAL_NFCDEP_HEADER_PAD + NFCIP_RLSREQ_LEN];
+uint8_t    rxBufRLS[NFCIP_RLSRES_LEN];
+
+/*
+ ******************************************************************************
+ * LOCAL DATA TYPES
+ ******************************************************************************
+ */
+
+/*! Struct that holds all DEP parameters/configs for the following communications */
+typedef struct{
+    uint8_t   did;           /*!< Device ID (DID) to be used                      */
+    
+    uint8_t*  txBuf;         /*!< Pointer to the Tx buffer to be sent             */
+    uint16_t  txBufLen;      /*!< Length of the data in the txBuf                 */
+    uint8_t   txBufPaylPos;  /*!< Position inside txBuf where data starts         */
+    uint8_t   txChaining;    /*!< Flag indicating chaining on transmission        */
+    
+    uint8_t*  rxBuf;         /*!< Pointer to the Rx buffer for incoming data      */
+    uint16_t  rxBufLen;      /*!< Length of the data in the rxBuf                 */
+    uint8_t   rxBufPaylPos;  /*!< Position inside rxBuf where data is to be placed*/
+    
+    uint32_t  fwt;           /*!< Frame Waiting Time (FWT) to be used             */
+    uint32_t  dFwt;          /*!< Delta Frame Waiting Time (dFWT) to be used      */
+    uint16_t  fsc;           /*!< Frame Size (FSC) to be used                     */
+    
+} rfalNfcDepDEPParams;
+
+/*! NFCIP module states */
+typedef enum NfcipState
+{
+    NFCIP_ST_IDLE,
+    NFCIP_ST_INIT_IDLE,
+    NFCIP_ST_INIT_ATR,
+    NFCIP_ST_INIT_PSL,
+    NFCIP_ST_INIT_DEP_IDLE,
+    NFCIP_ST_INIT_DEP_TX,
+    NFCIP_ST_INIT_DEP_RX,
+    NFCIP_ST_INIT_DEP_ATN,
+    NFCIP_ST_INIT_DSL,
+    NFCIP_ST_INIT_RLS,
+        
+    NFCIP_ST_TARG_WAIT_ATR,
+    NFCIP_ST_TARG_WAIT_ACTV,
+    NFCIP_ST_TARG_DEP_IDLE,
+    NFCIP_ST_TARG_DEP_RX,
+    NFCIP_ST_TARG_DEP_RTOX,
+    NFCIP_ST_TARG_DEP_TX,
+    NFCIP_ST_TARG_DEP_SLEEP
+} rfalNfcDepState;
+
+/*! NFCIP commands (Request, Response) */
+typedef enum{
+    NFCIP_CMD_ATR_REQ = 0x00,
+    NFCIP_CMD_ATR_RES = 0x01,
+    NFCIP_CMD_WUP_REQ = 0x02,
+    NFCIP_CMD_WUP_RES = 0x03,
+    NFCIP_CMD_PSL_REQ = 0x04,
+    NFCIP_CMD_PSL_RES = 0x05,
+    NFCIP_CMD_DEP_REQ = 0x06,
+    NFCIP_CMD_DEP_RES = 0x07,
+    NFCIP_CMD_DSL_REQ = 0x08,
+    NFCIP_CMD_DSL_RES = 0x09,
+    NFCIP_CMD_RLS_REQ = 0x0A,
+    NFCIP_CMD_RLS_RES = 0x0B
+} rfalNfcDepCmd;
+
+
+/*! Struct that holds all NFCIP data */
+typedef struct{  
+  rfalNfcDepConfigs       cfg;               /*!< Holds the current configuration to be used   */
+  
+  rfalNfcDepState         state;             /*!< Current state of the NFCIP module             */
+  uint8_t                 pni;               /*!< Packet Number Information (PNI) counter       */
+  
+  uint8_t                 lastCmd;           /*!< Last command sent                             */
+  uint8_t                 lastPFB;           /*!< Last PFB sent                                 */
+  uint8_t                 lastPFBnATN;       /*!< Last PFB sent (excluding  ATN)                */
+  uint8_t                 lastRTOX;          /*!< Last RTOX value sent                          */
+  
+  uint8_t                 cntTxRetrys;       /*!< Retransmissions counter                       */
+  uint8_t                 cntTORetrys;       /*!< Timeouts counter                              */
+  uint8_t                 cntRTOXRetrys;     /*!< RTOX counter                                  */
+  uint8_t                 cntNACKRetrys;     /*!< NACK counter                                  */
+  uint8_t                 cntATNRetrys;      /*!< Attention (ATN) counter                       */
+  
+  uint16_t                fsc;               /*!< Current Frame Size (FSC) to be used           */
+  bool                    isTxChaining;      /*!< Flag for chaining on Transmission             */
+  bool                    isRxChaining;      /*!< Flag for chaining on Reception                */
+  uint8_t*                txBuf;             /*!< Pointer to the Tx buffer to be sent           */
+  uint8_t*                rxBuf;             /*!< Pointer to the Rx buffer for incoming data    */
+  uint16_t                txBufLen;          /*!< Length of the data in the txBuf               */
+  uint16_t                rxBufLen;          /*!< Length of rxBuf buffer                        */
+  uint16_t*               rxRcvdLen;         /*!< Length of the data in the rxBuf               */
+  uint8_t                 txBufPaylPos;      /*!< Position in txBuf where data starts           */
+  uint8_t                 rxBufPaylPos;      /*!< Position in rxBuf where data is to be placed  */
+  bool                    *isChaining;       /*!< Flag for chaining on Reception                */
+  
+  rfalNfcDepDevice        *nfcDepDev;        /*!< Pointer to NFC-DEP device info                */
+
+  uint32_t                RTOXTimer;         /*!< Timer used for RTOX                           */  
+  rfalNfcDepDeactCallback isDeactivating;    /*!< Deactivating flag check callback              */
+  
+  bool                    isReqPending;      /*!< Flag pending REQ from Target activation       */
+  bool                    isTxPending;       /*!< Flag pending DEP Block while waiting RTOX Ack */
+  bool                    isWait4RTOX;       /*!< Flag for waiting RTOX Ack                     */
+}rfalNfcDep;
+
+
+/*
+ ******************************************************************************
+ * LOCAL VARIABLES
+ ******************************************************************************
+ */
+
+static rfalNfcDep gNfcip;              /*!< NFCIP module instance                          */
+
+
+/*
+ ******************************************************************************
+ * LOCAL FUNCTION PROTOTYPES
+ ******************************************************************************
+ */
+
+static ReturnCode nfcipTxRx( rfalNfcDepCmd cmd, uint8_t* txBuf, uint32_t fwt, uint8_t* paylBuf, uint8_t paylBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rxActLen, 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 );
+static ReturnCode nfcipTx( rfalNfcDepCmd cmd, uint8_t* txBuf, uint8_t *paylBuf, uint16_t paylLen, uint8_t pfb, uint32_t fwt, 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 );
+static ReturnCode nfcipDEPControlMsg( uint8_t pfb, uint8_t RTOX, 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 );
+static ReturnCode nfcipInitiatorHandleDEP( ReturnCode rxRes, uint16_t rxLen, uint16_t *outActRxLen, bool *outIsChaining, 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 );
+static ReturnCode nfcipTargetHandleRX( ReturnCode rxRes, uint16_t *outActRxLen, bool *outIsChaining, 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 );
+static ReturnCode nfcipTargetHandleActivation( rfalNfcDepDevice *nfcDepDev, uint8_t *outBRS, 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 );
+
+
+/*!
+ ******************************************************************************
+ * \brief NFCIP Congigure
+ * 
+ * Configures the nfcip layer with the given configurations 
+ * 
+ * \param[in] cfg   : nfcip configuration for following communication
+ ******************************************************************************
+ */
+static void nfcipConfig( rfalNfcDepConfigs cfg );
+
+
+/*!
+ ******************************************************************************
+ * \brief Set DEP parameters
+ * 
+ * This method sets the parameters/configs for following Data Exchange
+ * Sets the nfcip module state according to the role it is configured
+ * 
+ * 
+ * \warning To be used only after proper Initiator/Target activation: 
+ *           nfcipTargetHandleActivation() or nfcipInitiatorActivate() has
+ *           returned success
+ *           
+ *  This must be called before  nfcipRun() in case of Target to pass 
+ *  rxBuffer
+ *  
+ *  Everytime some data needs to be transmitted call this to set it and 
+ *  call nfcipRun() until done or error
+ * 
+ * \param[in]  DEPParams  : the parameters to be used during Data Exchange 
+ ******************************************************************************
+ */
+static void nfcipSetDEPParams( rfalNfcDepDEPParams *DEPParams );
+
+
+/*!
+ ******************************************************************************
+ * \brief NFCIP run protocol
+ * 
+ * This method handles all the nfcip protocol during Data Exchange (DEP
+ *  requests and responses).
+ *  
+ *  A data exchange cycle is considered a DEP REQ and a DEP RES.
+ *  
+ *  In case of Tx chaining(MI) must signal it with  nfcipSetDEPParams()
+ *  In case of Rx chaining(MI) outIsChaining will be set to true and the 
+ *  current data returned
+ *  
+ * \param[out] outActRxLen   : data received length
+ * \param[out] outIsChaining : true if other peer is performing chaining(MI)
+ *  
+ * \return ERR_NONE    : Data exchange cycle completed successfully
+ * \return ERR_TIMEOUT : Timeout occurred
+ * \return ERR_PROTO   : Protocol error occurred
+ * \return ERR_AGAIN   : Other peer is doing chaining(MI), current block 
+ *                       was received successfully call again until complete
+ * 
+ ******************************************************************************
+ */
+static ReturnCode nfcipRun( uint16_t *outActRxLen, bool *outIsChaining, 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 );
+
+
+/*!
+ ******************************************************************************
+ * \brief Transmission method
+ * 
+ * This method checks if the current communication is Active or Passive
+ * and performs the necessary procedures for each communication type
+ * 
+ * Transmits the data hold in txBuf 
+ * 
+ * \param[in]  txBuf    : buffer to transmit
+ * \param[in]  txBufLen : txBuffer capacity 
+ * \param[in]  fwt      : fwt for current Tx
+ * 
+ * \return ERR_NONE       : No error
+ ******************************************************************************
+ */
+static ReturnCode nfcipDataTx( uint8_t* txBuf, uint16_t txBufLen, uint32_t fwt, 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 );
+
+
+/*!
+ ******************************************************************************
+ * \brief Reception method
+ * 
+ * This method checks if the current communication is Active or Passive
+ * and calls the appropriate reception method
+ * 
+ * Copies incoming data to rxBuf
+ * 
+ * \param[out] rxBuf       : buffer to hold incomming data 
+ * \param[in]  rxBufLen    : rxBuf capacity 
+ * \param[out] actualRxLen : length of the data received  
+ * 
+ * \return ERR_NONE       : No error
+ ******************************************************************************
+ */
+static ReturnCode nfcipDataRx( void );
+
+
+/*
+ ******************************************************************************
+ * LOCAL FUNCTIONS
+ ******************************************************************************
+ */
+
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+static bool nfcipDxIsSupported( uint8_t Dx, uint8_t BRx, uint8_t BSx )
+{
+	uint8_t Bx;
+	
+	/* Take the min of the possible bit rates, we'll use one for both directions */
+	Bx = MIN(BRx, BSx);
+	
+	/* Lower bit rates must be supported for P2P */
+	if( (Dx <= RFAL_NFCDEP_Dx_04_424) )
+	{
+		return true;
+	}
+	
+	if( (Dx == RFAL_NFCDEP_Dx_08_848) && (Bx >= RFAL_NFCDEP_Bx_08_848) )
+	{
+		return true;
+	}
+
+	return false;
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipTxRx( rfalNfcDepCmd cmd, uint8_t* txBuf, uint32_t fwt, uint8_t* paylBuf,
+		uint8_t paylBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rxActLen,
+		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 )
+{
+    ReturnCode ret;
+    uint32_t   reRun;
+    
+    reRun = NFCIP_LOOP_MAX;                                          /* set maximum loop reRuns */
+    
+    if( (cmd == NFCIP_CMD_DEP_REQ) || (cmd == NFCIP_CMD_DEP_RES) ) /* this method cannot be used for DEPs */
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Assign the global params for this TxRx */
+    gNfcip.rxBuf       = rxBuf;
+    gNfcip.rxBufLen    = rxBufLen;
+    gNfcip.rxRcvdLen   = rxActLen;
+    
+    
+    /*******************************************************************************/
+	/* Transmission                                                                */
+	/*******************************************************************************/
+    if(txBuf != NULL)                                                /* if nothing to Tx, just do Rx */               
+    {
+        EXIT_ON_ERR( ret, nfcipTx( cmd, txBuf, paylBuf, paylBufLen, 0, fwt, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    }
+    
+    /*******************************************************************************/
+	/* Reception                                                                   */
+	/*******************************************************************************/
+    do                                                               /* call Rx() until done or max reRuns reached */
+    {
+        ret = nfcipDataRx();
+        
+
+        rfalWorker( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+             
+        if( !reRun-- )                                               /* if max reRuns reached return error */
+        {
+        	return ERR_MAX_RERUNS;
+        }
+    }
+    while( ret == ERR_NO_MASK(ERR_BUSY) );
+    
+    if( ret != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    /*******************************************************************************/    
+    *rxActLen = *rxBuf;                                      		/* Use LEN byte instead due to with/without CRC modes */
+    return ERR_NONE;                                         		/* Tx and Rx completed successfully                   */
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipDEPControlMsg( uint8_t pfb, uint8_t RTOX, 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 )
+{
+    uint8_t        ctrlMsg[20];
+    rfalNfcDepCmd  depCmd;
+    uint32_t       fwt;
+
+    /*******************************************************************************/
+    /* Calculate Cmd and fwt to be used                                            */
+    /*******************************************************************************/
+    depCmd = ((gNfcip.cfg.role == RFAL_NFCDEP_ROLE_TARGET) ? NFCIP_CMD_DEP_RES : NFCIP_CMD_DEP_REQ);        
+    fwt    = ((gNfcip.cfg.role == RFAL_NFCDEP_ROLE_TARGET) ? NFCIP_NO_FWT : (nfcip_PFBisSTO( pfb ) ? ( (RTOX*gNfcip.cfg.fwt) + gNfcip.cfg.dFwt) : (gNfcip.cfg.fwt + gNfcip.cfg.dFwt) ) );
+    
+    if( nfcip_PFBisSTO( pfb ) )
+    {
+        return nfcipTx( depCmd, ctrlMsg, &RTOX, sizeof(RTOX), pfb, fwt, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    else
+    {
+        return nfcipTx( depCmd, ctrlMsg, 0, 0, pfb, fwt, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+}
+
+/*******************************************************************************/
+static void nfcipClearCounters( void )
+{
+    gNfcip.cntATNRetrys  = 0;
+    gNfcip.cntNACKRetrys = 0;
+    gNfcip.cntTORetrys   = 0;
+    gNfcip.cntTxRetrys   = 0;
+    gNfcip.cntRTOXRetrys = 0;
+}
+
+/*******************************************************************************/
+static ReturnCode nfcipInitiatorHandleDEP( ReturnCode rxRes, uint16_t rxLen, uint16_t *outActRxLen, bool *outIsChaining, 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 )
+{
+    ReturnCode ret;
+    uint8_t    nfcDepLen;
+    uint8_t    rxMsgIt;
+    uint8_t    rxPFB;
+    uint8_t    rxRTOX;
+    uint8_t    optHdrLen;
+    
+    ret        = ERR_INTERNAL;
+    rxMsgIt    = 0;
+    optHdrLen  = 0;
+    
+    *outActRxLen    = 0;
+    *outIsChaining  = false;
+    
+    
+    /*******************************************************************************/
+    /* Handle reception errors                                                     */
+    /*******************************************************************************/
+    switch( rxRes )
+    {
+        /*******************************************************************************/
+        /* Timeout ->  Digital 1.0 14.15.5.6 */
+        case ERR_TIMEOUT:
+            
+            nfcipLogI( " NFCIP(I) TIMEOUT  TORetrys:%d \r\n", gNfcip.cntTORetrys );
+            
+            /* Digital 1.0 14.15.5.6 - If nTO >= Max raise protocol error */
+            if( gNfcip.cntTORetrys++ >= NFCIP_MAX_TO_RETRYS )
+            {
+                return ERR_PROTO;
+            }
+
+            /*******************************************************************************/
+            /* Upon Timeout error, if Deactivation is pending, no more error recovery 
+             * will be done #54. 
+             * This is used to address the issue some devices that havea big TO. 
+             * Normally LLCP layer has timeout already, and NFCIP layer is still
+             * running error handling, retrying ATN/NACKs                                  */
+            /*******************************************************************************/
+            if( nfcipIsDeactivationPending() )
+            {
+                nfcipLogI( " skipping error recovery due deactivation pending \r\n");
+                return ERR_TIMEOUT;
+            }
+            
+            /* Digital 1.0 14.15.5.6 1)  If last PDU was NACK */
+            if( nfcip_PFBisRNACK(gNfcip.lastPFB) )
+            {
+                /* Digital 1.0 14.15.5.6 2)  if NACKs failed raise protocol error  */
+                if( gNfcip.cntNACKRetrys++ >= NFCIP_MAX_NACK_RETRYS )
+                {
+                    return ERR_PROTO;
+                }
+                
+                /* Send NACK */
+                nfcipLogI( " NFCIP(I) Sending NACK retry: %d \r\n", gNfcip.cntNACKRetrys );
+                EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBRPDU_NACK(gNfcip.pni), 0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                return ERR_BUSY;
+            }
+            
+            nfcipLogI( " NFCIP(I) Checking if to send ATN  ATNRetrys: %d \r\n", gNfcip.cntATNRetrys );
+            
+            /* Digital 1.0 14.15.5.6 3)  Otherwise send ATN */                            
+            if( gNfcip.cntATNRetrys++ >= NFCIP_MAX_NACK_RETRYS )
+            {
+                return ERR_PROTO;
+            }
+                            
+            /* Send ATN */
+            nfcipLogI( " NFCIP(I) Sending ATN \r\n" );
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBSPDU_ATN(), 0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            return ERR_BUSY;
+        
+        /*******************************************************************************/
+        /* Data rcvd with error ->  Digital 1.0 14.12.5.4 */
+        case ERR_CRC:
+        case ERR_PAR:
+        case ERR_FRAMING:
+        case ERR_RF_COLLISION:
+            
+            nfcipLogI( " NFCIP(I) rx Error: %d \r\n", rxRes );
+           
+            /* Digital 1.0 14.12.5.4 Tx Error with data, ignore */
+            if( rxLen < NFCIP_MIN_TXERROR_LEN )
+            {
+                nfcipLogI( " NFCIP(I) Transmission error w data  \r\n" );
+#if 0
+                if(gNfcip.cfg.commMode == RFAL_NFCDEP_COMM_PASSIVE)
+                {
+                    nfcipLogI( " NFCIP(I) Transmission error w data -> reEnabling Rx \r\n" );
+                    nfcipReEnableRxTout( NFCIP_TRECOV );
+                    return ERR_BUSY;
+                }
+#endif /* 0 */
+            }
+
+            /* Digital 1.1 16.12.5.4  if NACKs failed raise Transmission error  */
+            if( gNfcip.cntNACKRetrys++ >= NFCIP_MAX_NACK_RETRYS )
+            {
+                return ERR_FRAMING;
+            }
+                            
+            /* Send NACK */
+            nfcipLogI( " NFCIP(I) Sending NACK  \r\n" );
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBRPDU_NACK(gNfcip.pni), 0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            return ERR_BUSY;
+            
+        case ERR_NONE:
+            break;
+            
+        case ERR_BUSY:
+            return ERR_BUSY;  /* Debug purposes */
+            
+        default:
+            nfcipLogW( " NFCIP(I) Error: %d \r\n", rxRes );
+            return rxRes;
+    }    
+        
+    /*******************************************************************************/
+    /* Rx OK check if valid DEP PDU                                                */
+    /*******************************************************************************/
+    
+    /* Due to different modes on ST25R391x (with/without CRC) use NFC-DEP LEN instead of bytes retrieved */
+    nfcDepLen = gNfcip.rxBuf[rxMsgIt++];
+    
+    nfcipLogD( " NFCIP(I) rx OK: %d bytes \r\n", nfcDepLen );
+    
+    /* Digital 1.0 14.15.5.5 Protocol Error  */
+    if( gNfcip.rxBuf[rxMsgIt++] != NFCIP_RES )
+    {
+    	nfcipLogW( " NFCIP(I) error %02X instead of %02X \r\n", gNfcip.rxBuf[--rxMsgIt], NFCIP_RES );
+        return ERR_PROTO;
+    }
+    
+    /* Digital 1.0 14.15.5.5 Protocol Error  */
+    if( gNfcip.rxBuf[rxMsgIt++] != NFCIP_CMD_DEP_RES )
+    {
+    	nfcipLogW( " NFCIP(I) error %02X instead of %02X \r\n", gNfcip.rxBuf[--rxMsgIt], NFCIP_CMD_DEP_RES );
+        return ERR_PROTO;
+    }
+    
+    rxPFB = gNfcip.rxBuf[rxMsgIt++];
+    
+    /*******************************************************************************/
+    /* Check for valid PFB type                                                    */
+    if( !(nfcip_PFBisSPDU( rxPFB ) || nfcip_PFBisRPDU( rxPFB ) || nfcip_PFBisIPDU( rxPFB )) )
+    {
+        return ERR_PROTO;
+    }
+        
+    /*******************************************************************************/
+    /* Digital 1.0 14.8.2.1  check if DID is expected and match -> Protocol Error  */
+    if( gNfcip.cfg.did != RFAL_NFCDEP_DID_NO ) 
+    {
+        if( !nfcip_PFBhasDID( rxPFB ) || gNfcip.rxBuf[rxMsgIt++] != gNfcip.cfg.did )
+        {
+            return ERR_PROTO;
+        }
+        optHdrLen++;                                    /* Inc header optional field cnt*/
+    }
+    else if( nfcip_PFBhasDID( rxPFB ) )                 /* DID not expected but rcv */
+    {
+        return ERR_PROTO;
+    }
+    
+    /*******************************************************************************/
+    /* Digital 1.0 14.6.2.8 & 14.6.3.11 NAD must not be used  */
+    if( gNfcip.cfg.nad != RFAL_NFCDEP_NAD_NO ) 
+    {
+        if( !nfcip_PFBhasNAD( rxPFB ) || gNfcip.rxBuf[rxMsgIt++] != gNfcip.cfg.nad )
+        {
+            return ERR_PROTO;
+        }
+        optHdrLen++;                                    /* Inc header optional field cnt*/
+    }
+    else if( nfcip_PFBhasNAD( rxPFB ) )                 /* NAD not expected but rcv */
+    {
+        return ERR_PROTO;
+    }
+       
+    /*******************************************************************************/
+    /* Process R-PDU                                                               */
+    /*******************************************************************************/
+    if( nfcip_PFBisRPDU( rxPFB ) )
+    {
+        /*******************************************************************************/
+        /* R ACK                                                                       */
+        /*******************************************************************************/
+        if( nfcip_PFBisRACK( rxPFB ) )
+        {            
+            nfcipLogI( " NFCIP(I) Rcvd ACK  \r\n" );
+            if( gNfcip.pni == nfcip_PBF_PNI( rxPFB ) )
+            {
+                /* 14.12.3.3 R-ACK with correct PNI -> Increment */
+                gNfcip.pni = nfcip_PNIInc( gNfcip.pni );
+                                
+                /* R-ACK while not performing chaining -> Protocol error*/
+                if( !gNfcip.isTxChaining )
+                {
+                    return ERR_PROTO;
+                }
+                
+                nfcipClearCounters();
+                gNfcip.state = NFCIP_ST_INIT_DEP_IDLE;
+                return ERR_NONE;                            /* This block has been transmitted */
+            }
+            else  /* Digital 1.0 14.12.4.5 ACK with wrong PNI Initiator may retransmit */
+            {
+                if( gNfcip.cntTxRetrys++ >= NFCIP_MAX_TX_RETRYS )
+                {
+                    return ERR_PROTO;
+                }
+                
+                /* Extended the MAY in Digital 1.0 14.12.4.5 to only reTransmit if the ACK
+                 * is for the previous DEP, otherwise raise Protocol immediately 
+                 * If the PNI difference is more than 1 it`s worthless to reTransmit 3x
+                 * and after raise the error                                              */
+                
+                if( nfcip_PNIDec( gNfcip.pni ) ==  nfcip_PBF_PNI( rxPFB ) )
+                {
+                    /* ReTransmit */
+                    nfcipLogI( " NFCIP(I) Rcvd ACK prev PNI -> reTx \r\n" );
+                    gNfcip.state = NFCIP_ST_INIT_DEP_TX;
+                    return ERR_BUSY;
+                }
+                
+                nfcipLogI( " NFCIP(I) Rcvd ACK unexpected far PNI -> Error \r\n" );
+                return ERR_PROTO;
+            }
+        }
+        else /* Digital 1.0 - 14.12.5.2 Target must never send NACK  */
+        {            
+            return ERR_PROTO;
+        }
+    }
+    
+    /*******************************************************************************/
+    /* Process S-PDU                                                               */
+    /*******************************************************************************/
+    if( nfcip_PFBisSPDU( rxPFB ) )                                
+    {       
+        nfcipLogI( " NFCIP(I) Rcvd S-PDU  \r\n" );
+        /*******************************************************************************/
+        /* S ATN                                                                       */
+        /*******************************************************************************/
+        if( nfcip_PFBisSATN( rxPFB ) )                         /*    If is a S-ATN     */
+        {            
+            nfcipLogI( " NFCIP(I) Rcvd ATN  \r\n" );
+            if( nfcip_PFBisSATN( gNfcip.lastPFB ) )            /* Check if is expected */
+            {                
+                gNfcip.cntATNRetrys = 0;                       /* Clear ATN counter    */
+                
+                /* Although spec is not clear NFC Forum Digital test is expecting to
+                 * retransmit upon receiving ATN_RES */
+                if( nfcip_PFBisSTO( gNfcip.lastPFBnATN ) )
+                {
+                    nfcipLogI( " NFCIP(I) Rcvd ATN  -> reTx RTOX_RES \r\n" );
+                    EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBSPDU_TO(), gNfcip.lastRTOX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                }
+                else
+                {
+                    /* ReTransmit ? */
+                    if( gNfcip.cntTxRetrys++ >= NFCIP_MAX_TX_RETRYS )
+                    {
+                        return ERR_PROTO;
+                    }
+                    
+                    nfcipLogI( " NFCIP(I) Rcvd ATN  -> reTx  PNI: %d \r\n", gNfcip.pni );
+                    gNfcip.state = NFCIP_ST_INIT_DEP_TX;
+                }
+                
+                return ERR_BUSY;
+            }
+            else                                                 /* Digital 1.0  14.12.4.4 & 14.12.4.8 */
+            {
+                return ERR_PROTO;
+            }
+        }
+        /*******************************************************************************/
+        /* S TO                                                                        */
+        /*******************************************************************************/
+        else if( nfcip_PFBisSTO( rxPFB ) )                        /* If is a S-TO (RTOX)  */
+        {
+            nfcipLogI( " NFCIP(I) Rcvd TO  \r\n" );
+            
+            rxRTOX = gNfcip.rxBuf[rxMsgIt++];
+            
+            /* Digital 1.1 16.12.4.3 - Initiator MAY stop accepting subsequent RTOX Req   *
+             *                       - RTOX request to an ATN -> Protocol error           */
+            if( (gNfcip.cntRTOXRetrys++ > NFCIP_MAX_RTOX_RETRYS) || nfcip_PFBisSATN( gNfcip.lastPFB ) )
+            {
+                return ERR_PROTO;
+            }
+            
+            /* Digital 1.1 16.8.4.1 RTOX must be between [1,59] */
+            if( (rxRTOX < NFCIP_INIT_MIN_RTOX) || (rxRTOX > NFCIP_INIT_MAX_RTOX) )
+            {
+                return ERR_PROTO;
+            }
+            
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBSPDU_TO(), rxRTOX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            gNfcip.lastRTOX = rxRTOX;
+            
+            return ERR_BUSY;
+        }
+        
+        /* Unexpected S-PDU */
+        return ERR_PROTO;
+    }
+    
+    /*******************************************************************************/
+    /* Process I-PDU                                                               */
+    /*******************************************************************************/
+    if( nfcip_PFBisIPDU( rxPFB ) )
+    {
+        if( gNfcip.pni != nfcip_PBF_PNI( rxPFB ) )
+        {
+            nfcipLogI( " NFCIP(I) Rcvd IPDU wrong PNI     curPNI: %d rxPNI: %d \r\n", gNfcip.pni  , nfcip_PBF_PNI( rxPFB ) );
+            return ERR_PROTO;
+        }
+        
+        nfcipLogD( " NFCIP(I) Rcvd IPDU OK    PNI: %d \r\n", gNfcip.pni );
+        
+        /* 14.12.3.3 I-PDU with correct PNI -> Increment */
+        gNfcip.pni = nfcip_PNIInc( gNfcip.pni );
+                
+        
+        /* Successful data Exchange */
+        nfcipClearCounters();
+        *outActRxLen  = (nfcDepLen - RFAL_NFCDEP_DEP_HEADER - optHdrLen);
+        
+        if( (gNfcip.rxBuf + gNfcip.rxBufPaylPos) != (gNfcip.rxBuf + RFAL_NFCDEP_DEP_HEADER + optHdrLen) )
+        {
+            ST_MEMMOVE( (gNfcip.rxBuf + gNfcip.rxBufPaylPos), (gNfcip.rxBuf + RFAL_NFCDEP_DEP_HEADER + optHdrLen), *outActRxLen );
+        }
+
+        /*******************************************************************************/
+        /* Check if target is indicating chaining MI                                   */
+        /*******************************************************************************/
+        if( nfcip_PFBisIMI( rxPFB ) )
+        {
+            gNfcip.isRxChaining = true;
+            *outIsChaining      = true;
+            
+            nfcipLogD( " NFCIP(I) Rcvd IPDU OK w MI -> ACK \r\n" );
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBRPDU_ACK( gNfcip.pni ), gNfcip.rxBuf[rxMsgIt++], mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            
+            return ERR_AGAIN;  /* Send Again signalling to run again, but some chaining data has arrived*/
+        }
+        else
+        {
+            gNfcip.isRxChaining = false;
+            gNfcip.state        = NFCIP_ST_INIT_DEP_IDLE;
+            
+            return ERR_NONE;                            /* Data exchange done */
+        }
+    }
+    return ret;
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipTargetHandleRX( ReturnCode rxRes, uint16_t *outActRxLen, bool *outIsChaining, 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 )
+{
+    ReturnCode ret;
+    uint8_t    nfcDepLen;
+    uint8_t    rxMsgIt;
+    uint8_t    rxPFB;
+    uint8_t    optHdrLen;
+    uint8_t    resBuf[NFCIP_TARGET_RES_MAX];
+        
+    
+    ret        = ERR_INTERNAL;
+    rxMsgIt    = 0;
+    optHdrLen  = 0;
+    
+    *outActRxLen    = 0;
+    *outIsChaining  = false;
+    
+    
+    /*******************************************************************************/
+    /* Handle reception errors                                                     */
+    /*******************************************************************************/
+    switch( rxRes )
+    {
+        /*******************************************************************************/        
+        case ERR_NONE:
+            break;
+            
+        case ERR_TIMEOUT:
+        case ERR_CRC:
+        case ERR_PAR:
+        case ERR_FRAMING:
+        case ERR_PROTO:
+        default:
+            /* Digital 1.1  16.12.5.2 The Target MUST NOT attempt any error recovery.      *
+             * The Target MUST always stay in receive mode when a                          *
+             * Transmission Error or a Protocol Error occurs.                              *
+             *                                                                             *
+             * Do not push Transmission/Protocol Errors to upper layer in Listen Mode #766 */
+            
+            nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+            return ERR_BUSY;
+        
+        case ERR_LINK_LOSS:
+            nfcipLogW( " NFCIP(T) Error: %d \r\n", rxRes );
+            return rxRes;
+            
+        case ERR_BUSY:
+            return ERR_BUSY;  /* Debug purposes */
+            
+    }    
+        
+    /*******************************************************************************/
+    /* Rx OK check if valid DEP PDU                                                */
+    /*******************************************************************************/
+    
+    /* Due to different modes on ST25R391x (with/without CRC) use NFC-DEP LEN instead of bytes retrieved */
+    nfcDepLen = gNfcip.rxBuf[rxMsgIt++];
+        
+    nfcipLogD( " NFCIP(T) rx OK: %d bytes \r\n", nfcDepLen );
+    
+    if( gNfcip.rxBuf[rxMsgIt++] != NFCIP_REQ )
+    {
+        nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+        return ERR_BUSY; /* ERR_PROTO - Ignore bad request */
+    }
+    
+    
+    /*******************************************************************************/
+    /* Check whether target rcvd a normal DEP or deactivation request              */
+    /*******************************************************************************/
+    switch( gNfcip.rxBuf[rxMsgIt++] )
+    {               
+        /*******************************************************************************/
+        case NFCIP_CMD_DEP_REQ:
+            break;                                /* Continue to normal DEP processing */
+    
+        /*******************************************************************************/
+        case NFCIP_CMD_DSL_REQ:
+            
+            nfcipLogI( " NFCIP(T) rx DSL \r\n" );
+            
+            /* Digital 1.0  14.9.1.2 If DID is used and incorrect ignore it */
+            /* [Digital 1.0, 16.9.1.2]: If DID == 0, Target SHALL ignore DSL_REQ with DID */
+            if ( ((gNfcip.cfg.did != RFAL_NFCDEP_DID_NO) && ((nfcDepLen != RFAL_NFCDEP_DSL_RLS_LEN_DID) || (gNfcip.rxBuf[rxMsgIt++] != gNfcip.cfg.did)) )
+               ||((gNfcip.cfg.did == RFAL_NFCDEP_DID_NO) && (nfcDepLen != RFAL_NFCDEP_DSL_RLS_LEN_NO_DID))
+               )
+            {                
+                nfcipLogI( " NFCIP(T) DSL wrong DID, ignoring \r\n" );
+                return ERR_BUSY;
+            }
+            
+            nfcipTx( NFCIP_CMD_DSL_RES, resBuf, 0, 0, 0, NFCIP_NO_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            gNfcip.state = NFCIP_ST_TARG_DEP_SLEEP;
+            return ERR_SLEEP_REQ;
+            
+        /*******************************************************************************/
+        case NFCIP_CMD_RLS_REQ:
+            
+            nfcipLogI( " NFCIP(T) rx RLS \r\n" );
+            
+            /* Digital 1.0  14.10.1.2 If DID is used and incorrect ignore it */
+            /* [Digital 1.0, 16.10.2.2]: If DID == 0, Target SHALL ignore DSL_REQ with DID */
+            if ( ( (gNfcip.cfg.did != RFAL_NFCDEP_DID_NO) && ((nfcDepLen != RFAL_NFCDEP_DSL_RLS_LEN_DID) || (gNfcip.rxBuf[rxMsgIt++] != gNfcip.cfg.did)) )
+               ||( (gNfcip.cfg.did == RFAL_NFCDEP_DID_NO) && (nfcDepLen > RFAL_NFCDEP_DSL_RLS_LEN_NO_DID))
+               )
+            {                
+                nfcipLogI( " NFCIP(T) RLS wrong DID, ignoring \r\n" );
+                return ERR_BUSY;
+            }
+                        
+            nfcipTx( NFCIP_CMD_RLS_RES, resBuf, 0, 0, 0, NFCIP_NO_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            gNfcip.state = NFCIP_ST_TARG_DEP_IDLE;
+            return ERR_RELEASE_REQ;
+            
+        /*******************************************************************************/
+        /*case NFCIP_CMD_PSL_REQ:              PSL must be handled in Activation only */
+        /*case NFCIP_CMD_WUP_REQ:              WUP not in NFC Forum Digital 1.0       */
+        default:
+            
+            /* Don't go to NFCIP_ST_TARG_DEP_IDLE state as it needs to ignore this    *
+             * invalid frame, and keep waiting for more frames                        */
+            
+            nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+            return ERR_BUSY; /* ERR_PROTO - Ignore bad frame */
+    }
+    
+    /*******************************************************************************/
+    
+    rxPFB = gNfcip.rxBuf[rxMsgIt++];                    /* Store rcvd PFB  */
+    
+    /*******************************************************************************/
+    /* Check for valid PFB type                                                    */
+    if( !(nfcip_PFBisSPDU( rxPFB ) || nfcip_PFBisRPDU( rxPFB ) || nfcip_PFBisIPDU( rxPFB )) )
+    {
+        nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+        return ERR_BUSY; /* ERR_PROTO - Ignore invalid PFB  */
+    }
+    
+    /*******************************************************************************/   
+    if( gNfcip.cfg.did != RFAL_NFCDEP_DID_NO ) 
+    {
+        if( !nfcip_PFBhasDID( rxPFB ) || gNfcip.rxBuf[rxMsgIt++] != gNfcip.cfg.did )
+        {
+            nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+            return ERR_BUSY; /* ERR_PROTO - Ignore bad/missing DID  */
+        }
+        optHdrLen++;                                    /* Inc header optional field cnt*/
+    }
+    else if( nfcip_PFBhasDID( rxPFB ) )                 /* DID not expected but rcv     */
+    {
+        nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+        return ERR_BUSY; /* ERR_PROTO - Ignore unexpected DID  */
+    }
+                                  
+        
+    /*******************************************************************************/
+    if( gNfcip.cfg.nad != RFAL_NFCDEP_NAD_NO ) 
+    {
+        if( !nfcip_PFBhasNAD( rxPFB ) || gNfcip.rxBuf[rxMsgIt++] != gNfcip.cfg.nad )
+        {
+            nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+            return ERR_BUSY; /* ERR_PROTO - Ignore bad/missing NAD  */
+        }
+        optHdrLen++;                                    /* Inc header optional field cnt*/
+    }
+    else if( nfcip_PFBhasNAD( rxPFB ) )                 /* NAD not expected but rcv */
+    {
+        nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+        return ERR_BUSY; /* ERR_PROTO - Ignore unexpected NAD  */
+    }
+    
+       
+    /*******************************************************************************/
+    /* Process R-PDU                                                               */
+    /*******************************************************************************/
+    if( nfcip_PFBisRPDU( rxPFB ) )
+    {
+        nfcipLogD( " NFCIP(T) Rcvd R-PDU  \r\n" );
+        /*******************************************************************************/
+        /* R ACK                                                                       */
+        /*******************************************************************************/
+        if( nfcip_PFBisRACK( rxPFB ) )
+        {            
+            nfcipLogI( " NFCIP(T) Rcvd ACK  \r\n" );
+            if( gNfcip.pni == nfcip_PBF_PNI( rxPFB ) )
+            {                
+                /* R-ACK while not performing chaining -> Protocol error */
+                if( !gNfcip.isTxChaining )
+                {
+                    nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+                    return ERR_BUSY; /* ERR_PROTO - Ignore unexpected ACK  */
+                }
+                
+                /* This block has been transmitted and acknowledged, perform RTOX until next data is provided  */
+                
+                /* Digital 1.1  16.12.4.7 - If ACK rcvd continue with chaining or an RTOX */
+                nfcipTimerStart( gNfcip.RTOXTimer, nfcipRTOXAdjust( nfcipConv1FcToMs( rfalNfcDepWT2RWT( gNfcip.cfg.to ) )) );
+                gNfcip.state = NFCIP_ST_TARG_DEP_RTOX;
+                
+                return ERR_NONE;                            /* This block has been transmitted */
+            }
+            
+            /* Digital 1.0 14.12.3.4 - If last send was ATN and rx PNI is minus 1 */
+            else if( nfcip_PFBisSATN( gNfcip.lastPFB ) &&  (nfcip_PNIDec(gNfcip.pni) == nfcip_PBF_PNI( rxPFB )) )    
+            {   
+                nfcipLogI( " NFCIP(T) wrong PNI, last was ATN reTx  \r\n" );
+                /* Spec says to leave current PNI as is, but will be Inc after Tx, remaining the same */
+                gNfcip.pni = nfcip_PNIDec( gNfcip.pni );
+                
+                gNfcip.state = NFCIP_ST_TARG_DEP_TX;
+                return ERR_BUSY;
+            }
+        }
+        /*******************************************************************************/
+        /* R NACK                                                                      */
+        /*******************************************************************************/
+        /* ISO 18092 12.6.1.3.3 When rcv NACK if PNI = prev PNI sent ->  reTx          */
+        else if( nfcip_PFBisRNACK( rxPFB ) && (nfcip_PNIDec(gNfcip.pni) == nfcip_PBF_PNI( rxPFB ) ) )
+        {
+            nfcipLogI( " NFCIP(T) Rcvd NACK  \r\n" );
+            
+            gNfcip.pni = nfcip_PNIDec( gNfcip.pni );   /* Dec so that has the prev PNI */
+            
+            gNfcip.state = NFCIP_ST_TARG_DEP_TX;
+            return ERR_BUSY;
+        }
+        
+        nfcipLogI( " NFCIP(T) Unexpected R-PDU \r\n" );
+        
+        nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+        return ERR_BUSY; /* ERR_PROTO - Ignore unexpected R-PDU  */
+    }
+    
+    /*******************************************************************************/
+    /* Process S-PDU                                                               */
+    /*******************************************************************************/
+    if( nfcip_PFBisSPDU( rxPFB ) )
+    {        
+        nfcipLogD( " NFCIP(T) Rcvd S-PDU  \r\n" );
+        
+        /*******************************************************************************/
+        /* S ATN                                                                       */
+        /*******************************************************************************/
+        /* ISO 18092 12.6.3 Attention                                                  */
+        if( nfcip_PFBisSATN( rxPFB ) )                         /*    If is a S-ATN     */
+        {            
+            nfcipLogI( " NFCIP(T) Rcvd ATN  curPNI: %d \r\n", gNfcip.pni );
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBSPDU_ATN(), 0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            return ERR_BUSY;
+        }
+        
+        /*******************************************************************************/
+        /* S TO                                                                        */
+        /*******************************************************************************/
+        else if( nfcip_PFBisSTO( rxPFB ) )                     /* If is a S-TO (RTOX)  */
+        {
+            if( nfcip_PFBisSTO( gNfcip.lastPFBnATN ) )
+            {
+                nfcipLogI( " NFCIP(T) Rcvd TO  \r\n" );
+                
+                /* Digital 1.1  16.8.4.6  RTOX value in RES different that in REQ -> Protocol Error */
+                if( gNfcip.lastRTOX != gNfcip.rxBuf[rxMsgIt++] )
+                {
+                    nfcipLogI( " NFCIP(T) Mismatched RTOX value \r\n" );
+                    
+                    nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+                    return ERR_BUSY; /* ERR_PROTO - Ignore unexpected RTOX value  */
+                }
+                
+                /* Clear waiting for RTOX Ack Flag */
+                gNfcip.isWait4RTOX = false;
+                
+                /* Check if a Tx is already pending */
+                if( gNfcip.isTxPending )
+                {
+                    nfcipLogW( " NFCIP(T) Tx pending, go immediately to TX \r\n" );
+                    
+                    gNfcip.state = NFCIP_ST_TARG_DEP_TX;
+                    return ERR_BUSY;
+                }
+                
+                /* Start RTOX timer and change to check state  */
+                nfcipTimerStart( gNfcip.RTOXTimer, nfcipRTOXAdjust( nfcipConv1FcToMs( gNfcip.lastRTOX * rfalNfcDepWT2RWT(gNfcip.cfg.to ) ) ) );
+                gNfcip.state = NFCIP_ST_TARG_DEP_RTOX;
+                
+                return ERR_BUSY;
+            }
+        }
+        /* Unexpected S-PDU */
+        nfcipLogI( " NFCIP(T) Unexpected S-PDU \r\n" );
+        
+        nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+        return ERR_BUSY; /* ERR_PROTO - Ignore unexpected S-PDU  */
+    }
+    
+    /*******************************************************************************/
+    /* Process I-PDU                                                               */
+    /*******************************************************************************/
+    if( nfcip_PFBisIPDU( rxPFB ) )
+    {
+        if( gNfcip.pni != nfcip_PBF_PNI( rxPFB ) )
+        {
+            nfcipLogI( " NFCIP(T) Rcvd IPDU wrong PNI     curPNI: %d rxPNI: %d \r\n", gNfcip.pni, nfcip_PBF_PNI( rxPFB ) );
+            
+            /* Digital 1.1 16.12.3.4 - If last send was ATN and rx PNI is minus 1 */
+            if( nfcip_PFBisSATN(gNfcip.lastPFB ) &&  (nfcip_PNIDec(gNfcip.pni) == nfcip_PBF_PNI( rxPFB )) ) 
+            {
+                /* Spec says to leave current PNI as is, but will be Inc after Data Tx, remaining the same */
+                gNfcip.pni = nfcip_PNIDec(gNfcip.pni);
+                
+                if( nfcip_PFBisIMI( rxPFB ) )
+                {
+                    nfcipLogI( " NFCIP(T) PNI = prevPNI && ATN before && chaining -> send ACK  \r\n" );
+                    EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBRPDU_ACK( gNfcip.pni ), gNfcip.rxBuf[rxMsgIt++], mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                    
+                    /* Digital 1.1 16.12.3.4 (...) leave the current PNI unchanged afterwards */
+                    gNfcip.pni = nfcip_PNIInc( gNfcip.pni );
+                }
+                else
+                {
+                    nfcipLogI( " NFCIP(T) PNI = prevPNI && ATN before -> reTx last I-PDU  \r\n" );
+                    gNfcip.state = NFCIP_ST_TARG_DEP_TX;
+                }
+                
+                return ERR_BUSY;
+            }
+                        
+            nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+            return ERR_BUSY; /* ERR_PROTO - Ignore bad PNI value  */
+        }
+        
+        nfcipLogD( " NFCIP(T) Rcvd IPDU OK PNI: %d  \r\n", gNfcip.pni );
+        
+        /*******************************************************************************/
+        /* Successful data exchange                                                    */
+        /*******************************************************************************/
+        *outActRxLen  = (nfcDepLen - RFAL_NFCDEP_DEP_HEADER - optHdrLen);
+        
+        nfcipClearCounters();
+
+        if( (gNfcip.rxBuf + gNfcip.rxBufPaylPos) != (gNfcip.rxBuf + RFAL_NFCDEP_DEP_HEADER + optHdrLen) )
+        {
+            ST_MEMMOVE( (gNfcip.rxBuf + gNfcip.rxBufPaylPos), (gNfcip.rxBuf + RFAL_NFCDEP_DEP_HEADER + optHdrLen), *outActRxLen );
+        }
+        
+        
+        /*******************************************************************************/
+        /* Check if Initiator is indicating chaining MI                                */
+        /*******************************************************************************/
+        if( nfcip_PFBisIMI( rxPFB ) )
+        {
+            gNfcip.isRxChaining = true;
+            *outIsChaining      = true;
+            
+            nfcipLogD( " NFCIP(T) Rcvd IPDU OK w MI -> ACK \r\n" );
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBRPDU_ACK( gNfcip.pni ), gNfcip.rxBuf[rxMsgIt++], mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            
+            gNfcip.pni = nfcip_PNIInc( gNfcip.pni );
+            
+            return ERR_AGAIN;  /* Send Again signalling to run again, but some chaining data has arrived*/
+        }
+        else
+        {
+            if(gNfcip.isRxChaining)
+            {
+                nfcipLogI( " NFCIP(T) Rcvd last IPDU chaining finished \r\n" );
+            }
+            
+            /*******************************************************************************/
+            /* Reception done, send to DH and start RTOX timer                             */
+            /*******************************************************************************/
+            nfcipTimerStart( gNfcip.RTOXTimer, nfcipRTOXAdjust( nfcipConv1FcToMs( rfalNfcDepWT2RWT( gNfcip.cfg.to ) )) );
+            gNfcip.state = NFCIP_ST_TARG_DEP_RTOX;
+            
+            gNfcip.isRxChaining = false;
+            return ERR_NONE;                            /* Data exchange done */
+        }
+    }
+    return ret;
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipTx( rfalNfcDepCmd cmd, uint8_t* txBuf, uint8_t *paylBuf, uint16_t paylLen, uint8_t pfb, uint32_t fwt, 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 )
+{
+    uint16_t txBufIt;
+    uint8_t *txBlock;
+    
+    if( txBuf == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    
+    if( (paylLen == 0) || (paylBuf == NULL) )
+    {
+        paylBuf = (txBuf + RFAL_NFCDEP_DEPREQ_HEADER_LEN);  /* If not a DEP (no Data) ensure enough space for header */
+    }
+    
+    
+    txBufIt  = 0;
+    txBlock  = paylBuf;                                  /* Point to beginning of the Data, and go backwards     */    
+        
+    
+    gNfcip.lastCmd     = cmd;                            /* store last cmd sent    */
+    gNfcip.lastPFB     = NFCIP_PFB_INVALID;              /* reset last pfb sent    */
+    
+    /*******************************************************************************/
+    /* Compute outgoing NFCIP message                                              */
+    /*******************************************************************************/
+    switch( cmd )
+    {
+        /*******************************************************************************/
+        case NFCIP_CMD_ATR_RES:
+        case NFCIP_CMD_ATR_REQ:
+            
+            rfalNfcDepSetNFCID( paylBuf, gNfcip.cfg.nfcid, gNfcip.cfg.nfcidLen );        /* NFCID */
+            txBufIt += RFAL_NFCDEP_NFCID3_LEN;
+            
+            *(paylBuf + txBufIt++) = gNfcip.cfg.did;                                     /* DID   */
+            *(paylBuf + txBufIt++) = gNfcip.cfg.bs;                                      /* BS    */
+            *(paylBuf + txBufIt++) = gNfcip.cfg.br;                                      /* BR    */
+            
+            if( cmd == NFCIP_CMD_ATR_RES )
+            {
+                *(paylBuf + txBufIt++) = gNfcip.cfg.to;                                  /* ATR_RES[ TO ] */
+            }
+                                    
+            if( gNfcip.cfg.gbLen > 0)
+            {
+                *(paylBuf + txBufIt++) = nfcip_PPwGB( gNfcip.cfg.lr );                   /* PP signalling GB  */
+                ST_MEMCPY( (paylBuf + txBufIt), gNfcip.cfg.gb, gNfcip.cfg.gbLen );      /* set General Bytes */
+                txBufIt += gNfcip.cfg.gbLen;
+            }
+            else
+            {
+                *(paylBuf + txBufIt++) = rfalNfcDepLR2PP( gNfcip.cfg.lr );               /* PP without GB        */
+            }
+            
+            if( (txBufIt + RFAL_NFCDEP_CMDTYPE_LEN + RFAL_NFCDEP_CMD_LEN) > RFAL_NFCDEP_ATRREQ_MAX_LEN )   /* Check max ATR length (ATR_REQ = ATR_RES)*/
+            {
+                return ERR_PARAM;
+            }
+            
+            break;
+            
+        /*******************************************************************************/
+        case NFCIP_CMD_WUP_REQ:                               /* ISO 18092 - 12.5.2.1 */
+            
+            rfalNfcDepSetNFCID( (paylBuf), gNfcip.cfg.nfcid, gNfcip.cfg.nfcidLen );      /* NFCID */
+            txBufIt += RFAL_NFCDEP_NFCID3_LEN;
+            
+            *(--txBlock) = gNfcip.cfg.did;                                               /* DID   */
+            break;
+                    
+        /*******************************************************************************/
+        case NFCIP_CMD_WUP_RES:                               /* ISO 18092 - 12.5.2.2 */
+        case NFCIP_CMD_PSL_REQ:
+        case NFCIP_CMD_PSL_RES:
+            
+            *(--txBlock) = gNfcip.cfg.did;                                               /* DID   */
+            break;
+            
+        /*******************************************************************************/
+        case NFCIP_CMD_RLS_REQ:
+        case NFCIP_CMD_RLS_RES:
+        case NFCIP_CMD_DSL_REQ:
+        case NFCIP_CMD_DSL_RES:
+            
+            /* Digital 1.0 - 14.8.1.1 & 14.9.1.1 & 14.10.1.1 Only add DID if not 0 */
+            if( gNfcip.cfg.did != RFAL_NFCDEP_DID_NO )
+            {
+                *(--txBlock) = gNfcip.cfg.did;                                           /* DID   */
+            }
+            break;
+            
+        /*******************************************************************************/
+        case NFCIP_CMD_DEP_REQ:
+        case NFCIP_CMD_DEP_RES:
+            
+            /* Compute optional PFB bits */
+            if(gNfcip.cfg.did != RFAL_NFCDEP_DID_NO)                 pfb |= NFCIP_PFB_DID_BIT;
+            if(gNfcip.cfg.nad != RFAL_NFCDEP_NAD_NO)                 pfb |= NFCIP_PFB_NAD_BIT;
+            if((gNfcip.isTxChaining) && (nfcip_PFBisIPDU(pfb)) )     pfb |= NFCIP_PFB_MI_BIT;
+            
+            /* Store PFB for future handling */
+            gNfcip.lastPFB       = pfb;                                                  /* store PFB sent */
+            
+            if( !nfcip_PFBisSATN(pfb) )
+            {
+                gNfcip.lastPFBnATN   = pfb;                                              /* store last PFB different then ATN */
+            }
+            
+            
+            /* Add NAD if it is to be supported */
+            if( gNfcip.cfg.nad != RFAL_NFCDEP_NAD_NO )      
+            {
+                *(--txBlock) = gNfcip.cfg.nad;                                           /* NAD   */
+            }
+            
+            /* Digital 1.0 - 14.8.1.1 & 14.8.1.1 Only add DID if not 0 */
+            if( gNfcip.cfg.did != RFAL_NFCDEP_DID_NO )
+            {
+                *(--txBlock) = gNfcip.cfg.did;                                           /* DID   */
+            }
+            
+            *(--txBlock) = pfb;                                                          /* PFB */
+                        
+            
+            /* NCI 1.0 - Check if Empty frames are allowed */
+            if( (paylLen == 0) && nfcipIsEmptyDEPDisabled(gNfcip.cfg.oper) && nfcip_PFBisIPDU(pfb) )
+            {
+                return ERR_PARAM;
+            }
+            break;
+
+        /*******************************************************************************/
+        default:
+            return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Prepend Header                                                              */
+    /*******************************************************************************/    
+    *(--txBlock) = (uint8_t)cmd;                                                        /* CMD     */
+    *(--txBlock) = ( nfcipCmdIsReq(cmd) ? NFCIP_REQ : NFCIP_RES );                      /* CMDType */
+        
+    
+    txBufIt += paylLen + (paylBuf - txBlock);                                           /* Calculate overall buffer size */
+    
+    
+    if( txBufIt > gNfcip.fsc )                                                          /* Check if msg length violates the maximum payload size FSC */
+    {
+        return ERR_NOTSUPP;
+    }
+        
+    /*******************************************************************************/
+    return nfcipDataTx( txBlock, txBufIt, fwt, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+/*
+ ******************************************************************************
+ * GLOBAL FUNCTIONS
+ ******************************************************************************
+ */
+
+/*******************************************************************************/
+static void nfcipConfig( rfalNfcDepConfigs cfg )
+{    
+    ST_MEMCPY(&gNfcip.cfg, &cfg, sizeof(rfalNfcDepConfigs));      /* Copy given config to local       */
+    
+    gNfcip.cfg.to   = MIN( RFAL_NFCDEP_WT_TRG_MAX, gNfcip.cfg.to); /* Ensure proper WT value           */
+    gNfcip.cfg.did  = nfcip_DIDMax( gNfcip.cfg.did );              /* Ensure proper DID value          */
+    gNfcip.fsc      = rfalNfcDepLR2FS( gNfcip.cfg.lr );            /* Calculate FSC based on given LR  */
+    
+    gNfcip.state = ( ( gNfcip.cfg.role ==  RFAL_NFCDEP_ROLE_TARGET) ? NFCIP_ST_TARG_WAIT_ATR : NFCIP_ST_INIT_IDLE );
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipRun( uint16_t *outActRxLen, bool *outIsChaining, 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 )
+{
+    ReturnCode ret;
+    
+    ret = ERR_SYNTAX;
+    
+    nfcipLogD( " NFCIP Run() state: %d \r\n", gNfcip.state );
+    
+    switch( gNfcip.state )
+    {
+        /*******************************************************************************/
+        case NFCIP_ST_IDLE:
+        case NFCIP_ST_INIT_DEP_IDLE:
+        case NFCIP_ST_TARG_DEP_IDLE:
+        case NFCIP_ST_TARG_DEP_SLEEP:
+            return ERR_NONE;
+            
+        /*******************************************************************************/
+        case NFCIP_ST_INIT_DEP_TX:
+            
+            nfcipLogD( " NFCIP(I) Tx PNI: %d txLen: %d \r\n", gNfcip.pni, gNfcip.txBufLen );
+            ret = nfcipTx( NFCIP_CMD_DEP_REQ, gNfcip.txBuf, (gNfcip.txBuf + gNfcip.txBufPaylPos), gNfcip.txBufLen, nfcip_PFBIPDU( gNfcip.pni ), (gNfcip.cfg.fwt + gNfcip.cfg.dFwt), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                        
+            switch( ERR_NO_MASK(ret) )
+            {
+                case ERR_PARAM:
+                default:
+                  gNfcip.state = NFCIP_ST_INIT_DEP_IDLE;
+                  return ret;
+                  
+                case ERR_NONE:
+                  gNfcip.state = NFCIP_ST_INIT_DEP_RX;
+
+            }
+            /* fall through */
+            
+        /*******************************************************************************/
+        case NFCIP_ST_INIT_DEP_RX:
+
+            ret = nfcipDataRx();
+            
+            if( ret != ERR_NO_MASK(ERR_BUSY) )
+            {
+                ret = nfcipInitiatorHandleDEP( ret, *gNfcip.rxRcvdLen, outActRxLen, outIsChaining, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            
+            break;
+            
+        /*******************************************************************************/    
+        case NFCIP_ST_TARG_DEP_RTOX:
+            
+            if( !nfcipTimerisExpired( gNfcip.RTOXTimer ) )                     /* Do nothing until RTOX timer has expired */
+            {
+                return ERR_BUSY;
+            }
+            
+            /* If we cannot send a RTOX raise a Timeout error so that we do not   
+             * hold the field On forever in AP2P                                  */
+            if( nfcipIsRTOXReqDisabled(gNfcip.cfg.oper) )
+            {
+                /* We should reEnable Rx, and measure time between our field Off to 
+                 * either report link loss or recover               #287          */
+                nfcipLogI( " NFCIP(T) RTOX not sent due to config, NOT reenabling Rx \r\n" );
+                return ERR_TIMEOUT;
+            } 
+
+            if( gNfcip.cntRTOXRetrys++ > NFCIP_MAX_RTOX_RETRYS )                   /* Check maximum consecutive RTOX requests */
+            {
+                return ERR_PROTO;
+            }
+            
+            nfcipLogI( " NFCIP(T) RTOX sent \r\n" );
+            
+            gNfcip.lastRTOX = nfcip_RTOXTargMax(gNfcip.cfg.to);               /* Calculate requested RTOX value, and send it   */                        
+            EXIT_ON_ERR( ret, nfcipDEPControlMsg( nfcip_PFBSPDU_TO(), gNfcip.lastRTOX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            
+            /* Set waiting for RTOX Ack Flag */
+            gNfcip.isWait4RTOX = true;
+            
+            gNfcip.state = NFCIP_ST_TARG_DEP_RX;                              /* Go back to Rx to process RTOX ack        */
+            return ERR_BUSY;
+            
+        /*******************************************************************************/
+        case NFCIP_ST_TARG_DEP_TX:
+            
+            nfcipLogD( " NFCIP(T) Tx PNI: %d txLen: %d \r\n", gNfcip.pni, gNfcip.txBufLen );
+            ret = nfcipTx( NFCIP_CMD_DEP_RES, gNfcip.txBuf, (gNfcip.txBuf + gNfcip.txBufPaylPos), gNfcip.txBufLen, nfcip_PFBIPDU( gNfcip.pni ), NFCIP_NO_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Clear flags */
+            gNfcip.isTxPending = false;
+            gNfcip.isWait4RTOX = false;
+            
+            /* Digital 1.0 14.12.3.4 Increment the current PNI after Tx */
+            gNfcip.pni = nfcip_PNIInc( gNfcip.pni );
+            
+            switch( ERR_NO_MASK(ret) )
+            {
+                case ERR_PARAM:
+                default:
+                  gNfcip.state = NFCIP_ST_TARG_DEP_IDLE;                      /* Upon Tx error, goto IDLE state         */
+                  return ret;
+                  
+              case ERR_NONE:
+                  gNfcip.state = NFCIP_ST_TARG_DEP_RX;                       /* All OK, goto Rx state                   */
+            }
+            /* fall through */
+            
+        /*******************************************************************************/
+        case NFCIP_ST_TARG_DEP_RX:
+            
+            if( gNfcip.isReqPending )    /* if already has Data should be from a DEP from nfcipTargetHandleActivation()  */
+            {
+                nfcipLogD( " NFCIP(T) Skipping Rx Using DEP from Activation \r\n" );
+                
+                gNfcip.isReqPending = false;
+                ret = ERR_NONE;
+            }
+            else
+            {
+                ret = nfcipDataRx();
+            }
+            
+            if( ret != ERR_NO_MASK(ERR_BUSY) )
+            {
+                ret = nfcipTargetHandleRX( ret, outActRxLen, outIsChaining, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            
+            break;
+            
+        /*******************************************************************************/
+        default:
+            break;
+    }
+    return ret;
+}
+
+
+/*******************************************************************************/
+void rfalNfcDepSetDeactivatingCallback( rfalNfcDepDeactCallback pFunc )
+{
+    gNfcip.isDeactivating = pFunc;
+}
+
+
+/*******************************************************************************/
+void rfalNfcDepInitialize( void )
+{
+    nfcipLogD( " NFCIP Ini() \r\n" );
+	
+    gNfcip.state          = NFCIP_ST_IDLE;
+    gNfcip.isDeactivating = NULL;
+    
+    gNfcip.isTxPending    = false;
+    gNfcip.isWait4RTOX    = false;
+    gNfcip.isReqPending   = false;
+    
+            
+    gNfcip.cfg.oper  = (RFAL_NFCDEP_OPER_FULL_MI_DIS | RFAL_NFCDEP_OPER_EMPTY_DEP_EN | RFAL_NFCDEP_OPER_ATN_EN | RFAL_NFCDEP_OPER_RTOX_REQ_EN);
+    
+    gNfcip.cfg.did   = RFAL_NFCDEP_DID_NO;
+    gNfcip.cfg.nad   = RFAL_NFCDEP_NAD_NO;
+    
+    gNfcip.cfg.br    = RFAL_NFCDEP_Bx_NO_HIGH_BR;
+    gNfcip.cfg.bs    = RFAL_NFCDEP_Bx_NO_HIGH_BR;
+    
+    gNfcip.cfg.lr    = RFAL_NFCDEP_LR_254;
+    gNfcip.fsc       = rfalNfcDepLR2FS( gNfcip.cfg.lr );
+    
+    gNfcip.cfg.gbLen = 0;    
+    
+    gNfcip.cfg.fwt   = RFAL_NFCDEP_MAX_FWT;
+    gNfcip.cfg.dFwt  = RFAL_NFCDEP_MAX_FWT;
+    
+    gNfcip.pni       = 0;    
+    gNfcip.RTOXTimer = 0;
+
+    nfcipClearCounters();
+}
+
+
+/*******************************************************************************/
+static void nfcipSetDEPParams( rfalNfcDepDEPParams *DEPParams )
+{
+    nfcipLogD( " NFCIP SetDEP() txLen: %d \r\n", DEPParams->txBufLen );
+	
+    gNfcip.isTxChaining = DEPParams->txChaining;
+    gNfcip.txBuf        = DEPParams->txBuf;
+    gNfcip.rxBuf        = DEPParams->rxBuf;
+    gNfcip.txBufLen     = DEPParams->txBufLen;
+    gNfcip.rxBufLen     = DEPParams->rxBufLen;
+    gNfcip.txBufPaylPos = DEPParams->txBufPaylPos;
+    gNfcip.rxBufPaylPos = DEPParams->rxBufPaylPos;
+    
+    if( DEPParams->did != RFAL_NFCDEP_DID_KEEP )
+    {
+        gNfcip.cfg.did  = nfcip_DIDMax( DEPParams->did );
+    }
+    
+    gNfcip.cfg.fwt      = DEPParams->fwt;
+    gNfcip.cfg.dFwt     = DEPParams->dFwt;
+    gNfcip.fsc          = DEPParams->fsc;
+    
+    
+    
+    if(gNfcip.cfg.role == RFAL_NFCDEP_ROLE_TARGET)
+    {
+        /* If there's any data to be sent go for Tx */
+        if(DEPParams->txBufLen > 0)
+        {
+            /* Ensure that an RTOX Ack is not being expected at moment */
+            if( !gNfcip.isWait4RTOX )
+            {
+                gNfcip.state = NFCIP_ST_TARG_DEP_TX;
+                return;
+            }
+            else
+            {
+                /* If RTOX Ack is expected, signal a pending Tx to be transmitted right after */
+                gNfcip.isTxPending = true;
+                nfcipLogW( " NFCIP(T) Waiting RTOX, queueing outgoing DEP Block \r\n" );                
+            }
+        }    
+    
+        /*Digital 1.0  14.12.4.1 In target mode the first PDU MUST be sent by the Initiator */
+        gNfcip.state = NFCIP_ST_TARG_DEP_RX;
+        return;
+    }
+
+    /* New data TxRx request clear previous error counters for consecutive TxRx without reseting communication/protocol layer*/
+    nfcipClearCounters();
+    
+    gNfcip.state = NFCIP_ST_INIT_DEP_TX;
+}
+
+
+/*******************************************************************************/
+bool rfalNfcDepTargetRcvdATR( void )
+{
+    return ( (gNfcip.cfg.role == RFAL_NFCDEP_ROLE_TARGET) && nfcipIsTarget(gNfcip.state) && (gNfcip.state > NFCIP_ST_TARG_WAIT_ATR) );
+}
+
+
+/*******************************************************************************/
+bool rfalNfcDepIsAtrReq( uint8_t* buf, uint16_t bufLen, uint8_t* nfcid3 )
+{
+    uint8_t msgIt;
+    
+    msgIt = 0;
+    
+    if ( (bufLen < RFAL_NFCDEP_ATRREQ_MIN_LEN) || (bufLen > RFAL_NFCDEP_ATRREQ_MAX_LEN) )
+    {
+        return false;
+    }
+    
+    if ( *(buf + msgIt++) != NFCIP_REQ )
+    {
+        return false;
+    }
+    
+    if( *(buf + msgIt++) != NFCIP_CMD_ATR_REQ )
+    {
+        return false;
+    }
+    
+    /* Output NFID2 if requested */
+    if( nfcid3 != NULL )
+    {
+        ST_MEMCPY( nfcid3, (uint8_t*)(buf + RFAL_NFCDEP_ATR_REQ_NFCID3_POS), RFAL_NFCDEP_NFCID3_LEN );
+    }
+     
+    return true;
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipTargetHandleActivation( rfalNfcDepDevice *nfcDepDev, uint8_t *outBRS, 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 )
+{
+    ReturnCode ret;
+    uint8_t    msgIt;
+    uint8_t    txBuf[RFAL_NFCDEP_HEADER_PAD + NFCIP_PSLRES_LEN];
+    
+    /*******************************************************************************/
+    /*  Check if we are in correct state                                           */
+    /*******************************************************************************/
+    if( gNfcip.state != NFCIP_ST_TARG_WAIT_ACTV )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    
+    /*******************************************************************************/
+    /*  Check required parameters                                                  */
+    /*******************************************************************************/
+    if( outBRS == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /*  Wait and process incoming cmd (PSL / DEP)                                  */
+    /*******************************************************************************/        
+    ret = nfcipDataRx();
+
+    if( ret != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    msgIt   = 0;
+    *outBRS = RFAL_NFCDEP_BRS_MAINTAIN;                   /* set out BRS to be maintained */
+ 
+    msgIt++;                                              /* Skip LEN byte                */
+    
+    if ( *(gNfcip.rxBuf + msgIt++) != NFCIP_REQ )
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(gNfcip.rxBuf + msgIt) == NFCIP_CMD_PSL_REQ )
+    {
+        msgIt++;
+        
+        if( *(gNfcip.rxBuf + msgIt++) != gNfcip.cfg.did ) /* Checking DID                 */
+        {
+            return ERR_PROTO;
+        }
+        
+        nfcipLogI( " NFCIP(T) PSL REQ rcvd \r\n" );
+        
+        *outBRS = *(gNfcip.rxBuf + msgIt++);              /* assign output BRS value      */
+        
+        /* Store FSL(LR) and update current config */
+        gNfcip.cfg.lr = (*(gNfcip.rxBuf + msgIt++) & RFAL_NFCDEP_LR_VAL_MASK);
+        gNfcip.fsc    = rfalNfcDepLR2FS( gNfcip.cfg.lr );
+        
+        /*******************************************************************************/
+        /* Update NFC-DDE Device info */
+        if( nfcDepDev != NULL )
+        {
+            /* Update Bitrate info */
+            nfcDepDev->info.DSI = (rfalBitRate)rfalNfcDepBRS2DSI( *outBRS );   /* DSI codes the bit rate from Initiator to Target */
+            nfcDepDev->info.DRI = (rfalBitRate)rfalNfcDepBRS2DRI( *outBRS );   /* DRI codes the bit rate from Target to Initiator */
+            
+            /* Update Length Reduction and Frame Size */
+            nfcDepDev->info.LR = gNfcip.cfg.lr;
+            nfcDepDev->info.FS = gNfcip.fsc;
+            
+            /* Update PPi byte */
+            nfcDepDev->activation.Initiator.ATR_REQ.PPi &= ~RFAL_NFCDEP_PP_LR_MASK;
+            nfcDepDev->activation.Initiator.ATR_REQ.PPi |= rfalNfcDepLR2PP( gNfcip.cfg.lr );
+        }
+        
+        EXIT_ON_ERR( ret, nfcipTx( NFCIP_CMD_PSL_RES, txBuf, 0, 0, 0, NFCIP_NO_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    }
+    else
+    {
+        if( *(gNfcip.rxBuf + msgIt) == NFCIP_CMD_DEP_REQ )
+        {
+            msgIt++;
+                    
+            /*******************************************************************************/
+            /* Digital 1.0 14.12.3.1 PNI must be initialized to 0 */
+            if( nfcip_PBF_PNI( *(gNfcip.rxBuf + msgIt) ) != 0 )
+            {
+                return ERR_PROTO;
+            }
+            
+            /*******************************************************************************/
+            /* Digital 1.0 14.8.2.1  check if DID is expected and match -> Protocol Error  */
+            if( nfcip_PFBhasDID( *(gNfcip.rxBuf + msgIt) ) ) 
+            {
+                if( *(gNfcip.rxBuf + (++msgIt)) != gNfcip.cfg.did)
+                {
+                    return ERR_PROTO;
+                }
+            }
+            else if( gNfcip.cfg.did != RFAL_NFCDEP_DID_NO )          /* DID expected but not rcv */
+            {
+                return ERR_PROTO;
+            }
+        }
+        
+        /* Signal Request pending to be digested on normal Handling (DEP_REQ, DSL_REQ, RLS_REQ) */
+        gNfcip.isReqPending = true;
+    }
+    
+    gNfcip.state = NFCIP_ST_TARG_DEP_RX;
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepATR( rfalNfcDepAtrParam* param, rfalNfcDepAtrRes *atrRes,
+		uint8_t* atrResLen, 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 )
+{
+    ReturnCode        ret;
+    rfalNfcDepConfigs cfg;
+    uint16_t          rxLen;
+    uint8_t           msgIt;
+
+    
+    
+    if( (param == NULL) || (atrRes == NULL) || (atrResLen == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Configure NFC-DEP layer                                                     */
+    /*******************************************************************************/
+    
+    cfg.did  = param->DID;
+    cfg.nad  = param->NAD;
+    cfg.fwt  = RFAL_NFCDEP_MAX_FWT;
+    cfg.dFwt = RFAL_NFCDEP_MAX_FWT;
+    cfg.br   = param->BR;
+    cfg.bs   = param->BS;
+    cfg.lr   = param->LR;
+    cfg.to   = RFAL_NFCDEP_WT_TRG_MAX;            /* Not used in Initiator mode */
+    
+    
+    cfg.gbLen = param->GBLen;
+    ST_MEMCPY( cfg.gb, param->GB, cfg.gbLen );
+    
+    cfg.nfcidLen = param->nfcidLen;
+    ST_MEMCPY( cfg.nfcid, param->nfcid, param->nfcidLen );
+    
+    cfg.role     = RFAL_NFCDEP_ROLE_INITIATOR;
+    cfg.oper     = param->operParam;
+    cfg.commMode = param->commMode;
+
+    rfalNfcDepInitialize();
+    nfcipConfig( cfg );
+    
+    /*******************************************************************************/
+    /* Send ATR_REQ                                                                */
+    /*******************************************************************************/
+    
+    EXIT_ON_ERR( ret, nfcipTxRx(NFCIP_CMD_ATR_REQ, txBuf, NFCIP_RWT_ACTIVATION, NULL,
+    		0, rxBuf, NFCIP_ATRRES_BUF_LEN, &rxLen, mspiChannel, mST25, gpio_cs,
+			IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    
+    /*******************************************************************************/
+    /* ATR sent, check response                                                    */
+    /*******************************************************************************/
+    msgIt = 0;
+    rxLen = (uint16_t)(*(rxBuf + msgIt++) - RFAL_NFCDEP_LEN_LEN);                /* use LEN byte             */
+    
+    if( (rxLen < RFAL_NFCDEP_ATRRES_MIN_LEN) || (rxLen > RFAL_NFCDEP_ATRRES_MAX_LEN) )  /* Checking length: ATR_RES */
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + msgIt++) != NFCIP_RES )                                   /* Checking if is a response*/
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + msgIt++) != NFCIP_CMD_ATR_RES )                           /* Checking if is a ATR RES */
+    {
+        return ERR_PROTO;
+    }
+    
+    ST_MEMCPY(atrRes, (rxBuf + RFAL_NFCDEP_LEN_LEN), rxLen);
+    *atrResLen = (uint8_t)rxLen;
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepPSL( uint8_t BRS, uint8_t FSL, 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 )
+{
+    ReturnCode ret;
+    uint16_t   rxLen;
+    uint8_t    msgIt;
+
+    
+    msgIt = 0;
+
+
+    //changed here in plsbufPSL
+    pslBufPSL[msgIt++] = BRS;
+    pslBufPSL[msgIt++] = FSL;
+    
+    /*******************************************************************************/
+    /* Send PSL REQ and wait for response                                          */
+    /*******************************************************************************/
+    EXIT_ON_ERR( ret, nfcipTxRx( NFCIP_CMD_PSL_REQ, txBufPSL, NFCIP_RWT_ACTIVATION, pslBufPSL, msgIt, rxBufPSL, NFCIP_PSLRES_LEN, &rxLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    
+    /*******************************************************************************/
+    /* PSL sent, check response                                                    */
+    /*******************************************************************************/
+    msgIt = 0;
+    rxLen = (uint16_t)(*(rxBuf + msgIt++) );               /* use LEN byte                   */
+        
+    if( rxLen < NFCIP_PSLRES_LEN )                    /* Checking length: LEN + RLS_RES */
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + msgIt++) != NFCIP_RES )             /* Checking if is a response      */
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + msgIt++) != NFCIP_CMD_PSL_RES )     /* Checking if is a PSL RES       */
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + msgIt++) != gNfcip.cfg.did )        /* Checking DID                   */
+    {
+        return ERR_PROTO;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepDSL( 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 )
+{   
+    ReturnCode ret;
+
+    uint8_t  rxMsgIt;
+    uint16_t rxLen = 0;
+        
+    if( gNfcip.cfg.role == RFAL_NFCDEP_ROLE_TARGET )
+    {
+        return ERR_NONE;                                  /* Target has no deselect procedure */
+    }
+    
+    /* Repeating a DSL REQ is optional, not doing it */
+    EXIT_ON_ERR( ret, nfcipTxRx( NFCIP_CMD_DSL_REQ, txBufDSL, NFCIP_RWT_ACTIVATION, 0, 0, rxBufDSL, RFAL_NFCDEP_ATRRES_MAX_LEN, &rxLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    /*******************************************************************************/
+    rxMsgIt = 0;
+    
+    if( *(rxBuf + rxMsgIt++) < NFCIP_DSLRES_MIN )     /* Checking length: LEN + DSL_RES */
+    {
+        return ERR_PROTO;
+    }
+        
+    if( *(rxBuf + rxMsgIt++) != NFCIP_RES )           /* Checking if is a response      */
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + rxMsgIt++) != NFCIP_CMD_DSL_RES )  /* Checking if is DSL RES          */
+    {
+        return ERR_PROTO;
+    }
+     
+    if( (gNfcip.cfg.did != RFAL_NFCDEP_DID_NO) && (*(rxBuf + rxMsgIt++) != gNfcip.cfg.did )  )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepRLS( 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 )
+{   
+    ReturnCode ret;
+
+    uint8_t    rxMsgIt;
+    uint16_t   rxLen = 0;
+    
+    if( gNfcip.cfg.role == RFAL_NFCDEP_ROLE_TARGET )
+        return ERR_NONE;                                  /* Target has no release procedure */
+        
+    /* Repeating a RLS REQ is optional, not doing it */
+    EXIT_ON_ERR( ret, nfcipTxRx( NFCIP_CMD_RLS_REQ, txBufRLS, NFCIP_RWT_ACTIVATION, 0, 0, rxBufRLS, RFAL_NFCDEP_ATRRES_MAX_LEN, &rxLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    /*******************************************************************************/
+    rxMsgIt = 0;
+       
+    if( *(rxBuf + rxMsgIt++) < NFCIP_RLSRES_MIN )     /* Checking length: LEN + RLS_RES */
+    {
+        return ERR_PROTO;
+    }
+        
+    if( *(rxBuf + rxMsgIt++) != NFCIP_RES )           /* Checking if is a response      */
+    {
+        return ERR_PROTO;
+    }
+    
+    if( *(rxBuf + rxMsgIt++) != NFCIP_CMD_RLS_RES )  /* Checking if is RLS RES        */
+    {
+        return ERR_PROTO;
+    }
+     
+    if( (gNfcip.cfg.did != RFAL_NFCDEP_DID_NO) && (*(rxBuf + rxMsgIt++) != gNfcip.cfg.did )  )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepInitiatorHandleActivation( rfalNfcDepAtrParam* param, rfalBitRate desiredBR, rfalNfcDepDevice* nfcDepDev, 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 )
+{
+    ReturnCode ret;
+    uint8_t    maxRetyrs;
+    uint8_t    PSL_BRS;
+    uint8_t    PSL_FSL;
+    bool       sendPSL;
+    
+    if( (param == NULL) || (nfcDepDev == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    param->NAD = RFAL_NFCDEP_NAD_NO;          /* Digital 1.1  16.6.2.9  Initiator SHALL NOT use NAD */
+    maxRetyrs  = NFCIP_ATR_RETRY_MAX;
+        
+    /*******************************************************************************/
+    /* Send ATR REQ and wait for response                                          */
+    /*******************************************************************************/
+    do{  /* Upon transmission error ATR REQ should be retried */
+        
+         ret = rfalNfcDepATR( param, &nfcDepDev->activation.Target.ATR_RES, &nfcDepDev->activation.Target.ATR_RESLen,
+        		 mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04,
+				 fieldLED_05, fieldLED_06 ) ;
+         
+         if( nfcipIsTransmissionError(ret) )
+         {
+             continue;
+         }
+         break;
+    }
+    while( (maxRetyrs--) );
+    
+    if( ERR_NO_MASK(ret) != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    /*******************************************************************************/
+    /* Compute NFC-DEP device with ATR_RES                                         */
+    /*******************************************************************************/
+    nfcDepDev->info.GBLen = (nfcDepDev->activation.Target.ATR_RESLen - RFAL_NFCDEP_ATRRES_MIN_LEN);
+    nfcDepDev->info.DID   = nfcDepDev->activation.Target.ATR_RES.DID;
+    nfcDepDev->info.NAD   = RFAL_NFCDEP_NAD_NO;                                      /* Digital 1.1  16.6.3.11 Initiator SHALL ignore b1 of PPt */
+    nfcDepDev->info.LR    = rfalNfcDepPP2LR( nfcDepDev->activation.Target.ATR_RES.PPt );
+    nfcDepDev->info.FS    = rfalNfcDepLR2FS( nfcDepDev->info.LR );
+    nfcDepDev->info.WT    = (nfcDepDev->activation.Target.ATR_RES.TO & RFAL_NFCDEP_WT_MASK);
+    nfcDepDev->info.FWT   = rfalNfcDepCalculateRWT( nfcDepDev->info.WT );
+    nfcDepDev->info.dFWT  = rfalNfcDepCalculateRWT( RFAL_NFCDEP_WT_DELTA );
+    
+    rfalGetBitRate( &nfcDepDev->info.DSI, &nfcDepDev->info.DRI );
+    
+    
+    
+    /*******************************************************************************/
+    /* Check if a PSL needs to be sent                                                */
+    /*******************************************************************************/
+    sendPSL = false;
+    PSL_BRS = rfalNfcDepDx2BRS( nfcDepDev->info.DSI );  /* Set current bit rate divisor on both directions  */
+    PSL_FSL = nfcDepDev->info.LR;                       /* Set current Frame Size                           */
+    
+    
+#if 0
+    /* Activity 1.0 
+    *     9.4.6.3   NFC-F NFC-DEP Activation
+    *     9.4.4.15  NFC-A NFC-DEP Activation
+    *     
+    *  PSL_REQ shall only be sent if desired bit rate is different from current
+    * */
+    
+    /*******************************************************************************/
+    /* Check Frame Size                                                            */
+    /*******************************************************************************/
+    if( gNfcip.cfg.lr < nfcDepDev->info.LR )  /* If our Length reduction is smaller */   
+    {
+        sendPSL = true;
+        
+        nfcDepDev->info.LR   = MIN( nfcDepDev->info.LR, gNfcip.cfg.lr );
+        
+        gNfcip.cfg.lr = nfcDepDev->info.LR                 /* Update nfcip LR  to be used */
+        gNfcip.fsc    = rfalNfcDepLR2FS( gNfcip.cfg.lr );  /* Update nfcip FSC to be used */     
+        
+        PSL_FSL       = gNfcip.cfg.lr;                     /* Set LR to be sent           */
+        
+        nfcipLogI( " NFCIP(I) Frame Size differ, PSL new fsc: %d \r\n", gNfcip.fsc );
+    }
+#endif
+    
+    
+    /*******************************************************************************/
+    /* Check Baud rates                                                            */
+    /*******************************************************************************/
+    if( ((nfcDepDev->info.DSI != desiredBR) && nfcipDxIsSupported( desiredBR, nfcDepDev->activation.Target.ATR_RES.BRt, nfcDepDev->activation.Target.ATR_RES.BSt ))    /* if desired BR is different and supported     */
+       /* || (target->brt != RFAL_NFCDEP_Bx_NO_HIGH_BR) || (target->bst != RFAL_NFCDEP_Bx_NO_HIGH_BR)  */  )  /* if target supports higher BR, must send PSL? */
+    {
+        sendPSL = true;
+        PSL_BRS = rfalNfcDepDx2BRS( desiredBR );
+        
+        nfcipLogI( " NFCIP(I) BR differ, PSL BR: 0x%02X \r\n", PSL_BRS );
+    }
+
+    
+    /*******************************************************************************/
+    if( sendPSL )
+    {
+        /*******************************************************************************/
+        /* Send PSL REQ and wait for response                                          */
+        /*******************************************************************************/
+        EXIT_ON_ERR( ret, rfalNfcDepPSL(PSL_BRS, PSL_FSL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+        
+        /* Check if bit rate has been changed */
+        if( nfcDepDev->info.DSI != desiredBR )
+        {
+            /* Check if device was in Passive NFC-A and went to higher bit rates, use NFC-F */
+            if( (nfcDepDev->info.DSI == RFAL_BR_106) && (gNfcip.cfg.commMode == RFAL_NFCDEP_COMM_PASSIVE) )
+            {
+                
+            #if RFAL_FEATURE_NFCF 
+                /* If Passive initialize NFC-F module */
+                rfalNfcfPollerInitialize( desiredBR, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            #else /* RFAL_FEATURE_NFCF */
+                return ERR_NOTSUPP;
+            #endif /* RFAL_FEATURE_NFCF */
+                
+            }
+            
+            nfcDepDev->info.DRI  = desiredBR;  /* DSI Bit Rate coding from Initiator  to Target  */
+            nfcDepDev->info.DSI  = desiredBR;  /* DRI Bit Rate coding from Target to Initiator   */
+            
+            rfalSetBitRate( nfcDepDev->info.DSI, nfcDepDev->info.DRI, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        }
+        
+        
+        return ERR_NONE;   /* PSL has been sent    */
+    }
+    
+    return ERR_NONE;       /* No PSL has been sent */
+}
+
+
+/*******************************************************************************/
+uint32_t rfalNfcDepCalculateRWT( uint8_t wt )
+{
+    /* Digital 1.0  14.6.3.8  &  Digital 1.1  16.6.3.9     */
+    /* Digital 1.1  16.6.3.9 treat all RFU values as WT=14 */
+    wt = MIN( RFAL_NFCDEP_WT_INI_MAX, wt );
+        
+    return rfalNfcDepWT2RWT(wt);
+}
+
+
+
+/*******************************************************************************/
+static ReturnCode nfcipDataTx( uint8_t* txBuf, uint16_t txBufLen, uint32_t fwt, 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 )
+{
+   return rfalTransceiveBlockingTx( txBuf, txBufLen, gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen, (RFAL_TXRX_FLAGS_DEFAULT | RFAL_TXRX_FLAGS_NFCIP1_ON), ((fwt == NFCIP_NO_FWT) ? RFAL_FWT_NONE : rfalConv64fcTo1fc(fwt)), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+static ReturnCode nfcipDataRx( void )
+{
+    ReturnCode ret;
+    
+    ret = rfalGetTransceiveStatus();
+    
+    if( ret != ERR_BUSY )
+    {
+        (*gNfcip.rxRcvdLen) = rfalConvBitsToBytes( *gNfcip.rxRcvdLen );
+    
+        if( (ret == ERR_NONE) && (gNfcip.rxRcvdLen != NULL) && (gNfcip.rxBuf != NULL) )
+        {
+            /* Digital 1.1  16.4.1.3 - Length byte LEN SHALL have a value between 3 and 255 ->
+             *  otherwise treat as Transmission Error *
+             *                       - Ensure that actual received and frame length do match,
+             *                        otherwise treat as Transmission error  */
+
+            if( (*gNfcip.rxRcvdLen != (uint16_t)*gNfcip.rxBuf) || (*gNfcip.rxRcvdLen < RFAL_NFCDEP_LEN_MIN) || (*gNfcip.rxRcvdLen > RFAL_NFCDEP_LEN_MAX) )
+            {
+                return ERR_FRAMING;
+
+            }
+        }
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepListenStartActivation( rfalNfcDepTargetParam *param, uint8_t *atrReq, uint16_t atrReqLength, rfalNfcDepListenActvParam rxParam, 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 )
+{
+    ReturnCode        ret;
+    rfalNfcDepConfigs cfg;
+    
+    
+    if( (param == NULL) || (atrReq == NULL) || (rxParam.rxLen == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    
+    /*******************************************************************************/
+    /*  Check whether is a valid ATR_REQ Compute NFC-DEP device                    */
+    if( !rfalNfcDepIsAtrReq( atrReq, atrReqLength, NULL ) )
+    {
+        return ERR_PARAM;
+    }
+    
+    rxParam.nfcDepDev->activation.Initiator.ATR_REQLen = atrReqLength;                   /* nfcipIsAtrReq() is already checking Min and Max buffer lengths */ 
+    ST_MEMCPY( (uint8_t*)&rxParam.nfcDepDev->activation.Initiator.ATR_REQ, atrReq, atrReqLength );
+    
+    rxParam.nfcDepDev->info.GBLen = (atrReqLength - RFAL_NFCDEP_ATRREQ_MIN_LEN);
+    rxParam.nfcDepDev->info.DID   = rxParam.nfcDepDev->activation.Initiator.ATR_REQ.DID;
+    rxParam.nfcDepDev->info.NAD   = RFAL_NFCDEP_NAD_NO;                        /* Digital 1.1  16.6.2.9  Initiator SHALL NOT use NAD */
+    rxParam.nfcDepDev->info.LR    = rfalNfcDepPP2LR( rxParam.nfcDepDev->activation.Initiator.ATR_REQ.PPi );
+    rxParam.nfcDepDev->info.FS    = rfalNfcDepLR2FS( rxParam.nfcDepDev->info.LR );
+    rxParam.nfcDepDev->info.WT    = 0;
+    rxParam.nfcDepDev->info.FWT   = NFCIP_NO_FWT;
+    rxParam.nfcDepDev->info.dFWT  = NFCIP_NO_FWT;
+    
+    rfalGetBitRate( &rxParam.nfcDepDev->info.DSI, &rxParam.nfcDepDev->info.DRI );
+    
+    
+    /* Store Device Info location, updated upon a PSL  */
+    gNfcip.nfcDepDev = rxParam.nfcDepDev;
+    
+    
+    /*******************************************************************************/
+    cfg.did = rxParam.nfcDepDev->activation.Initiator.ATR_REQ.DID;
+    cfg.nad = RFAL_NFCDEP_NAD_NO;
+    
+    cfg.fwt   = RFAL_NFCDEP_MAX_FWT;
+    cfg.dFwt  = RFAL_NFCDEP_MAX_FWT;
+
+    cfg.br = param->brt;
+    cfg.bs = param->bst;
+    
+    cfg.lr = rfalNfcDepPP2LR(param->ppt);
+    
+    cfg.gbLen = param->GBtLen;
+    ST_MEMCPY(cfg.gb, param->GBt, cfg.gbLen);
+    
+    cfg.nfcidLen = RFAL_NFCDEP_NFCID3_LEN;
+    ST_MEMCPY(cfg.nfcid, param->nfcid3, RFAL_NFCDEP_NFCID3_LEN);
+
+    cfg.to = param->to;
+    
+    cfg.role     = RFAL_NFCDEP_ROLE_TARGET;
+    cfg.oper     = param->operParam;
+    cfg.commMode = param->commMode;
+
+    rfalNfcDepInitialize();
+    nfcipConfig( cfg );
+        
+    
+    /*******************************************************************************/
+    /*  Reply with ATR RES to Initiator                                            */
+    /*******************************************************************************/
+    gNfcip.rxBuf        = (uint8_t*)rxParam.rxBuf;
+    gNfcip.rxBufLen     = sizeof(rfalNfcDepBufFormat);
+    gNfcip.rxRcvdLen    = rxParam.rxLen;
+    gNfcip.rxBufPaylPos = RFAL_NFCDEP_DEPREQ_HEADER_LEN;
+    gNfcip.isChaining   = rxParam.isRxChaining;
+    gNfcip.txBufPaylPos = RFAL_NFCDEP_DEPREQ_HEADER_LEN;
+   
+    EXIT_ON_ERR( ret, nfcipTx( NFCIP_CMD_ATR_RES, (uint8_t*) gNfcip.rxBuf, NULL, 0, 0, NFCIP_NO_FWT, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    gNfcip.state = NFCIP_ST_TARG_WAIT_ACTV;
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepListenGetActivationStatus( 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 )
+{
+    ReturnCode err;
+    uint8_t    BRS;
+    
+    BRS = RFAL_NFCDEP_BRS_MAINTAIN;
+    
+    err = nfcipTargetHandleActivation( gNfcip.nfcDepDev, &BRS, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    switch (err)
+    {
+        case ERR_NONE:
+            
+            if( BRS != RFAL_NFCDEP_BRS_MAINTAIN )
+            {
+                /* DSI codes the bit rate from Initiator to Target */
+                /* DRI codes the bit rate from Target to Initiator */
+                
+                if( gNfcip.cfg.commMode == RFAL_NFCDEP_COMM_ACTIVE )
+                {
+                    EXIT_ON_ERR( err, rfalSetMode( RFAL_MODE_LISTEN_ACTIVE_P2P, gNfcip.nfcDepDev->info.DRI, gNfcip.nfcDepDev->info.DSI, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) );
+                }
+                else
+                {
+                    EXIT_ON_ERR( err, rfalSetMode( ((RFAL_BR_106 == gNfcip.nfcDepDev->info.DRI) ? RFAL_MODE_LISTEN_NFCA : RFAL_MODE_LISTEN_NFCF), gNfcip.nfcDepDev->info.DRI, gNfcip.nfcDepDev->info.DSI, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+                }
+            }
+            break;
+        
+        case ERR_BUSY:
+            /* do nothing */
+            break;
+            
+        case ERR_PROTO:
+        default:
+            /* re-enable receiving of data */
+            nfcDepReEnableRx( gNfcip.rxBuf, gNfcip.rxBufLen, gNfcip.rxRcvdLen );
+            break;
+    } 
+    
+    return err;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepStartTransceive( rfalNfcDepTxRxParam *param )
+{
+    rfalNfcDepDEPParams nfcDepParams;
+    
+    nfcDepParams.txBuf        = (uint8_t *)param->txBuf;
+    nfcDepParams.txBufLen     = param->txBufLen;
+    nfcDepParams.txChaining   = param->isTxChaining;
+    nfcDepParams.txBufPaylPos = RFAL_NFCDEP_DEPREQ_HEADER_LEN;  /* position in txBuf where actual outgoing data is located */
+    nfcDepParams.did          = RFAL_NFCDEP_DID_KEEP;
+    nfcDepParams.rxBufPaylPos = RFAL_NFCDEP_DEPREQ_HEADER_LEN;
+    nfcDepParams.rxBuf        = (uint8_t *)param->rxBuf;
+    nfcDepParams.rxBufLen     = sizeof(rfalNfcDepBufFormat);
+    nfcDepParams.fsc          = param->FSx;
+    nfcDepParams.fwt          = param->FWT;
+    nfcDepParams.dFwt         = param->dFWT;
+
+    gNfcip.rxRcvdLen          = param->rxLen;
+    gNfcip.isChaining         = param->isRxChaining;
+
+    nfcipSetDEPParams(&nfcDepParams);
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcDepGetTransceiveStatus( 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 )
+{
+    return nfcipRun( gNfcip.rxRcvdLen, gNfcip.isChaining, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+#endif /* RFAL_FEATURE_NFC_DEP */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcDep.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,705 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_nfcDep.h
+ *
+ *  \author  Gustavo Patricio
+ *
+ *  \brief 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
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup NFC-DEP
+ * @brief RFAL NFC-DEP Module
+ * @{
+ */
+
+#ifndef RFAL_NFCDEP_H_
+#define RFAL_NFCDEP_H_
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.h"
+#include "rfal_rf.h"
+
+
+/*
+ ******************************************************************************
+ * DEFINES
+ ******************************************************************************
+ */
+#define RFAL_NFCDEP_FRAME_SIZE_MAX_LEN  254             /*!< NFCIP Maximum Frame Size   Digital 1.0 Table 91                 */
+#define RFAL_NFCDEP_DEPREQ_HEADER_LEN   5               /*!< 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              1               /*!< SB length on NFCIP fram for NFC-A                               */
+#define RFAL_NFCDEP_LEN_LEN             1               /*!< LEN length on NFCIP frame                                       */
+#define RFAL_NFCDEP_CMDTYPE_LEN         1               /*!< Length of the cmd type (REQ | RES) on NFCIP frame               */
+#define RFAL_NFCDEP_CMD_LEN             1               /*!< Length of the cmd on NFCIP frame                                */
+#define RFAL_NFCDEP_DID_LEN             1               /*!< Length of did on NFCIP frame                                    */
+#define RFAL_NFCDEP_DEP_PFB_LEN         1               /*!< 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           64             /*!< Minimum LR value                                                */
+#define RFAL_NFCDEP_LR_VAL_MASK          0x03           /*!< Bit mask for a LR value                                         */
+#define RFAL_NFCDEP_PP_LR_MASK           0x30           /*!< Bit mask for LR value in PP byte on a ATR REQ/RES               */
+#define RFAL_NFCDEP_PP_LR_SHIFT          4              /*!< Position of LR value in PP byte on a ATR REQ/RES                */
+
+#define RFAL_NFCDEP_DID_MAX              14             /*!< Max DID value Digital 14.6.2.3                                  */
+#define RFAL_NFCDEP_DID_KEEP             0xFF           /*!< Keep DID value already configured                               */
+#define RFAL_NFCDEP_DID_NO               0x00           /*!< No DID shall be used                                            */
+#define RFAL_NFCDEP_NAD_NO               0x00           /*!< No NAD shall be used                                            */
+
+#define RFAL_NFCDEP_OPER_RTOX_REQ_DIS    0x01           /*!< Operation config: RTOX REQ disable                              */
+#define RFAL_NFCDEP_OPER_RTOX_REQ_EN     0x00           /*!< Operation config: RTOX REQ enable                               */
+
+#define RFAL_NFCDEP_OPER_ATN_DIS         0x00           /*!< Operation config: ATN disable                                   */
+#define RFAL_NFCDEP_OPER_ATN_EN          0x02           /*!< Operation config: ATN enable                                    */
+
+#define RFAL_NFCDEP_OPER_EMPTY_DEP_DIS   0x04           /*!< Operation config: empty DEPs disable                            */
+#define RFAL_NFCDEP_OPER_EMPTY_DEP_EN    0x00           /*!< Operation config: empty DEPs enable                             */
+
+#define RFAL_NFCDEP_OPER_FULL_MI_DIS     0x00           /*!< Operation config: full chaining DEPs disable                    */
+#define RFAL_NFCDEP_OPER_FULL_MI_EN      0x08           /*!< Operation config: full chaining DEPs enable                     */
+
+
+#define RFAL_NFCDEP_BRS_MAINTAIN         0xC0           /*!< Value signalling that BR is to be maintained (no PSL)           */
+#define RFAL_NFCDEP_BRS_Dx_MASK          0x07           /*!< Value signalling that BR is to be maintained (no PSL)           */
+#define RFAL_NFCDEP_BRS_DSI_POS          3              /*!< Value signalling that BR is to be maintained (no PSL)           */
+
+#define RFAL_NFCDEP_WT_DELTA             (16 - RFAL_NFCDEP_WT_DELTA_ADJUST) /*!< NFC-DEP dWRT (adjusted)  Digital 1.0 A.10   */
+#define RFAL_NFCDEP_WT_DELTA_ADJUST      4              /*!< dWRT value adjustment                                           */
+
+
+#define RFAL_NFCDEP_ATR_REQ_NFCID3_POS   2              /*!< NFCID3 offset in ATR_REQ frame                                  */
+#define RFAL_NFCDEP_NFCID3_LEN           10             /*!< NFCID3 Length                                                   */
+
+#define RFAL_NFCDEP_LEN_MIN              3              /*!< Minimum length byte LEN value                                   */
+#define RFAL_NFCDEP_LEN_MAX              255            /*!< Maximum length byte LEN value                                   */
+
+#define RFAL_NFCDEP_ATRRES_HEADER_LEN    2              /*!< ATR RES Header Len:  CmdType: 0xD5 + Cod: 0x01                  */
+#define RFAL_NFCDEP_ATRRES_MIN_LEN       17             /*!< Minimum length for an ATR RES                                   */
+#define RFAL_NFCDEP_ATRRES_MAX_LEN       64             /*!< Maximum length for an ATR RES  Digital 1.0 14.6.1               */
+#define RFAL_NFCDEP_ATRREQ_MIN_LEN       16             /*!< 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           0                          /*!< WT Initiator minimum value Digital 1.0 14.6.3.8     */
+#define RFAL_NFCDEP_WT_INI_MAX           14                         /*!< 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       8                                      /*!< WT target max Digital 1.0 14.6.3.8 A.10 */
+#define RFAL_NFCDEP_WT_TRG_MAX_D11       14                                     /*!< WT target max Digital 1.1 16.6.3.9 A.9  */
+#define RFAL_NFCDEP_WT_TRG_MAX           RFAL_NFCDEP_WT_TRG_MAX_D10             /*!< WT target max Digital 1.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              (1<<20)
+
+#define RFAL_NFCDEP_WT_MASK              0x0F           /*!< Bit mask for the Wait Time value                                */
+
+#define RFAL_NFCDEP_BR_MASK_106          1              /*!< Enable mask bit rate 106                                        */
+#define RFAL_NFCDEP_BR_MASK_212          2              /*!< Enable mask bit rate 242                                        */
+#define RFAL_NFCDEP_BR_MASK_424          4              /*!< Enable mask bit rate 424                                        */
+
+/*
+ ******************************************************************************
+ * GLOBAL MACROS
+ ******************************************************************************
+ */
+
+#define rfalNfcDepWT2RWT( wt )         (1 << ( (wt & RFAL_NFCDEP_WT_MASK) + 6) )                               /*!< Converts WT value to RWT                      */
+
+/*! 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) | ((br) & RFAL_NFCDEP_BRS_Dx_MASK) ))
+
+#define rfalNfcDepBRS2DRI( brs )       ( (uint8_t) ( brs & RFAL_NFCDEP_BRS_Dx_MASK ) )                              /*!< Returns the DRI value from the given BRS byte */
+#define rfalNfcDepBRS2DSI( brs )       ( (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 )         MIN( ((uint8_t) RFAL_NFCDEP_FS_VAL_MIN * (LRx + 1) ), 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 )   ST_MEMSET( (dst), 0x00, RFAL_NFCDEP_NFCID3_LEN ); \
+                                         ST_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_NFCDEP_FRAME_SIZE_MAX_LEN];      /*!< INF | Data area of the buffer    */
+} rfalNfcDepBufFormat;
+
+
+/*! Activation info as Initiator and Target                                       */
+typedef union {
+    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;         /*!< FWT to be used (ignored in Listen Mode)    */
+    uint32_t          FWT;        /*!< FWT to be used (ignored in Listen Mode)    */
+    uint32_t          dFWT;       /*!< Delta FWT to be used                       */
+    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;
+
+
+/*
+ * *****************************************************************************
+ * 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
+ ******************************************************************************
+ */
+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 ERR_NONE    : No error
+ * \return ERR_TIMEOUT : Timeout occurred
+ * \return ERR_PROTO   : Protocol error occurred
+ ******************************************************************************
+ */
+ReturnCode rfalNfcDepATR( rfalNfcDepAtrParam* param, rfalNfcDepAtrRes *atrRes, uint8_t* atrResLen, 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 );
+
+
+/*!
+ ******************************************************************************
+ * \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 ERR_NONE    : No error
+ * \return ERR_TIMEOUT : Timeout occurred
+ * \return ERR_PROTO   : Protocol error occurred
+ ******************************************************************************
+ */
+ReturnCode rfalNfcDepPSL( uint8_t BRS, uint8_t FSL, 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 );
+
+
+/*!
+ ******************************************************************************
+ * \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 ERR_NONE       : No error
+ * \return ERR_TIMEOUT    : Timeout occurred
+ * \return ERR_MAX_RERUNS : Timeout occurred
+ * \return ERR_PROTO      : Protocol error occurred
+ ******************************************************************************
+ */
+ReturnCode rfalNfcDepDSL( 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 );
+
+
+/*!
+ ******************************************************************************
+ * \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 ERR_NONE       : No error
+ * \return ERR_TIMEOUT    : Timeout occurred
+ * \return ERR_MAX_RERUNS : Timeout occurred
+ * \return ERR_PROTO      : Protocol error occurred
+ ******************************************************************************
+ */
+ReturnCode rfalNfcDepRLS( 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ *  \return ERR_PARAM        : Invalid parameters
+ *  \return ERR_IO           : Generic internal error
+ *  \return ERR_TIMEOUT      : Timeout error
+ *  \return ERR_PAR          : Parity error detected
+ *  \return ERR_CRC          : CRC error detected
+ *  \return ERR_FRAMING      : Framing error detected
+ *  \return ERR_PROTO        : Protocol error detected
+ *  \return ERR_NONE         : No error, activation successful
+ *****************************************************************************
+ */
+ReturnCode rfalNfcDepInitiatorHandleActivation( rfalNfcDepAtrParam* param, rfalBitRate desiredBR, rfalNfcDepDevice* nfcDepDev, 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 );
+
+
+/*!
+ ******************************************************************************
+ * \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( 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 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 ERR_NONE      : ATR_REQ is valid and activation ongoing
+ * \return ERR_PARAM     : ATR_REQ or other params are invalid
+ * \return ERR_LINK_LOSS : Remote Field is turned off
+ *****************************************************************************
+ */
+ReturnCode rfalNfcDepListenStartActivation( rfalNfcDepTargetParam *param, uint8_t *atrReq, uint16_t atrReqLength, rfalNfcDepListenActvParam rxParam, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Get the current NFC-DEP Activation Status
+ *
+ * \return ERR_NONE      : Activation has completed successfully
+ * \return ERR_BUSY      : Activation is ongoing
+ * \return ERR_LINK_LOSS : Remote Field was turned off
+ *****************************************************************************
+ */
+ReturnCode rfalNfcDepListenGetActivationStatus( 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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_PARAM       : Bad request
+ * \return ERR_WRONG_STATE : The module is not in a proper state
+ * \return ERR_NONE        : The Transceive request has been started
+ *****************************************************************************
+ */
+ReturnCode rfalNfcDepStartTransceive( 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 ERR_AGAIN is sent. At this point
+ *            caller must handle the received data immediately.
+ *            When 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 ERR_NONE      : Transceive has been completed successfully
+ * \return ERR_BUSY      : Transceive is ongoing
+ * \return ERR_PROTO     : Protocol error occurred
+ * \return ERR_TIMEOUT   : Timeout error occurred
+ * \return ERR_SLEEP_REQ : Deselect has been received and responded
+ * \return ERR_NOMEM     : The received I-PDU does not fit into the
+ *                            receive buffer
+ * \return ERR_LINK_LOSS : Communication is lost because Reader/Writer
+ *                            has turned off its field
+ * \return ERR_AGAIN     : received one chaining block, continue to call
+ *                            this method to retrieve the remaining blocks
+ *****************************************************************************
+ */
+ReturnCode rfalNfcDepGetTransceiveStatus( 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 );
+
+
+#endif /* RFAL_NFCDEP_H_ */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfca.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,555 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_nfca.c
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Provides several NFC-A convenience methods and definitions
+ *  
+ *  It provides a Poller (ISO14443A PCD) interface and as well as 
+ *  some NFC-A Listener (ISO14443A PICC) helpers.
+ *
+ *  The definitions and helpers methods provided by this module are only
+ *  up to ISO14443-3 layer
+ *  
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include <platform1.h>
+#include "rfal_nfca.h"
+#include "utils.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_NFCA
+    #error " RFAL: Module configuration missing. Please enable/disable NFC-A module by setting: RFAL_FEATURE_NFCA "
+#endif
+
+#if RFAL_FEATURE_NFCA
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_NFCA_SLP_FWT           rfalConvMsTo1fc(1)  /*!< Check 1ms for any modulation  ISO14443-3 6.4.3   */
+#define RFAL_NFCA_SLP_CMD           0x50                /*!< SLP cmd (byte1)    Digital 1.1  6.9.1 & Table 20 */
+#define RFAL_NFCA_SLP_BYTE2         0x00                /*!< SLP byte2          Digital 1.1  6.9.1 & Table 20 */
+#define RFAL_NFCA_SLP_CMD_POS       0                   /*!< SLP cmd position   Digital 1.1  6.9.1 & Table 20 */
+#define RFAL_NFCA_SLP_BYTE2_POS     1                   /*!< SLP byte2 position Digital 1.1  6.9.1 & Table 20 */
+
+#define RFAL_NFCA_SDD_CT            0x88                /*!< Cascade Tag value Digital 1.1 6.7.2              */
+#define RFAL_NFCA_SDD_CT_LEN        1                   /*!< Cascade Tag length                               */
+
+#define RFAL_NFCA_SLP_REQ_LEN       2                   /*!< SLP_REQ length                                   */
+
+#define RFAL_NFCA_SEL_CMD_LEN       1                   /*!< SEL_CMD length                                   */
+#define RFAL_NFCA_SEL_PAR_LEN       1                   /*!< SEL_PAR length                                   */
+#define RFAL_NFCA_SEL_SELPAR        rfalNfcaSelPar(7, 0)/*!< SEL_PAR on Select is always with 4 data/nfcid    */
+#define RFAL_NFCA_BCC_LEN           1                   /*!< BCC length                                       */
+
+#define RFAL_NFCA_SDD_REQ_LEN       (RFAL_NFCA_SEL_CMD_LEN + RFAL_NFCA_SEL_PAR_LEN)   /*!< SDD_REQ length     */
+#define RFAL_NFCA_SDD_RES_LEN       (RFAL_NFCA_CASCADE_1_UID_LEN + RFAL_NFCA_BCC_LEN) /*!< SDD_RES length     */
+
+#define RFAL_NFCA_T_RETRANS         5                   /*!< t RETRANSMISSION [3, 33]ms   EMVCo 2.6  A.5      */
+#define RFAL_NFCA_N_RETRANS         2                   /*!< Number of retries            EMVCo 2.6  9.6.1.3  */
+ 
+
+/*! SDD_REQ (Select) Cascade Levels  */
+enum
+{
+    RFAL_NFCA_SEL_CASCADE_L1 = 0,  /*!< SDD_REQ Cascade Level 1 */
+    RFAL_NFCA_SEL_CASCADE_L2 = 1,  /*!< SDD_REQ Cascade Level 2 */
+    RFAL_NFCA_SEL_CASCADE_L3 = 2   /*!< SDD_REQ Cascade Level 3 */
+};
+
+/*! SDD_REQ (Select) request Cascade Level command   Digital 1.1 Table 15 */
+enum
+{
+    RFAL_NFCA_CMD_SEL_CL1 = 0x93, /*!< SDD_REQ command Cascade Level 1 */
+    RFAL_NFCA_CMD_SEL_CL2 = 0x95, /*!< SDD_REQ command Cascade Level 2 */
+    RFAL_NFCA_CMD_SEL_CL3 = 0x97, /*!< SDD_REQ command Cascade Level 3 */
+};
+
+/*
+******************************************************************************
+* GLOBAL MACROS
+******************************************************************************
+*/
+#define rfalNfcaSelPar( nBy, nbi )         (((nBy<<4) & 0xF0) | (nbi&0x0F) )  /*!< Calculates SEL_PAR with the bytes/bits to be sent */
+#define rfalNfcaCLn2SELCMD( cl )           (RFAL_NFCA_CMD_SEL_CL1 + (2*cl))   /*!< Calculates SEL_CMD with the given cascade level   */
+#define rfalNfcaNfcidLen2CL( l )           (l / 5)                            /*!< Calculates cascade level by the NFCID length      */
+
+/*! Executes the given Tx method (f) and if a Timeout error is detected it retries (rt) times performing a delay of (dl) in between  */
+#define rfalNfcaTxRetry( r, f, rt, dl )   {uint8_t rts=rt; do{ r=f; if((rt!=0)&&(dl!=0)) platformDelay(dl); }while((r==ERR_TIMEOUT) && (rts--)); }
+
+/*
+******************************************************************************
+* GLOBAL TYPES
+******************************************************************************
+*/
+
+/*! SLP_REQ (HLTA) format   Digital 1.1  6.9.1 & Table 20 */
+typedef struct
+{
+    uint8_t      frame[RFAL_NFCA_SLP_REQ_LEN];  /*!< SLP:  0x50 0x00  */
+} rfalNfcaSlpReq;
+
+/*
+******************************************************************************
+* LOCAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+static uint8_t rfalNfcaCalculateBcc( uint8_t* buf, uint8_t bufLen );
+
+
+/*
+ ******************************************************************************
+ * LOCAL FUNCTIONS
+ ******************************************************************************
+ */
+
+static uint8_t rfalNfcaCalculateBcc( uint8_t* buf, uint8_t bufLen )
+{
+    uint8_t i;
+    uint8_t BCC;
+    
+    BCC = 0;
+    
+    /* BCC is XOR over first 4 bytes of the SDD_RES  Digital 1.1 6.7.2 */
+    for(i = 0; i < bufLen; i++)
+    {
+        BCC ^= *(buf + i);
+    }
+    
+    return BCC;
+}
+
+/*
+******************************************************************************
+* GLOBAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerInitialize( 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 )
+{
+    ReturnCode ret;
+    
+    EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCA, RFAL_BR_106, RFAL_BR_106, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_NFC );
+    
+    rfalSetGT( RFAL_GT_NFCA );
+    rfalSetFDTListen( RFAL_FDT_LISTEN_NFCA_POLLER );
+    rfalSetFDTPoll( RFAL_FDT_POLL_NFCA_POLLER );
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerCheckPresence( rfal14443AShortFrameCmd cmd, rfalNfcaSensRes *sensRes, 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 )
+{
+    ReturnCode ret;
+    uint16_t   rcvLen;
+    
+    /* Digital 1.1 6.10.1.3  For Commands ALL_REQ, SENS_REQ, SDD_REQ, and SEL_REQ, the NFC Forum Device      *
+     *              MUST treat receipt of a Listen Frame at a time after FDT(Listen, min) as a Timeour Error */
+    
+    ret = rfalISO14443ATransceiveShortFrame(  cmd, (uint8_t*)sensRes, rfalConvBytesToBits(sizeof(rfalNfcaSensRes)), &rcvLen, RFAL_NFCA_FDTMIN, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( (ERR_NO_MASK(ret) == ERR_RF_COLLISION) || (ERR_NO_MASK(ret) == ERR_CRC)  || (ERR_NO_MASK(ret) == ERR_NOMEM) ||
+        (ERR_NO_MASK(ret) == ERR_FRAMING)      || (ERR_NO_MASK(ret) == ERR_PAR)                                       )
+    {
+       ret = ERR_NONE;
+    }
+
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerTechnologyDetection( rfalComplianceMode compMode, rfalNfcaSensRes *sensRes, 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 )
+{
+    ReturnCode ret;
+    
+    EXIT_ON_ERR( ret, rfalNfcaPollerCheckPresence( ((compMode == RFAL_COMPLIANCE_MODE_EMV) ? RFAL_14443A_SHORTFRAME_CMD_WUPA : RFAL_14443A_SHORTFRAME_CMD_REQA), sensRes , mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) );
+    
+    /* Send SLP_REQ as  Activity 1.1  9.2.3.6 and EMVCo 2.6  9.2.1.3 */
+    if( compMode != RFAL_COMPLIANCE_MODE_ISO)
+    {
+        EXIT_ON_ERR( ret, rfalNfcaPollerSleep( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    }
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerSingleCollisionResolution( uint8_t devLimit, bool *collPending, rfalNfcaSelRes *selRes, uint8_t *nfcId1, uint8_t *nfcId1Len, 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 )
+{
+    uint8_t         i;
+    ReturnCode      ret;
+    rfalNfcaSelReq  selReq;
+    uint16_t        bytesRx;
+    uint8_t         bytesTxRx;
+    uint8_t         bitsTxRx;
+    
+    /* Check parameters */
+    if( (collPending == NULL) || (selRes == NULL) || (nfcId1 == NULL) || (nfcId1Len == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Initialize output parameters */
+    *collPending = false;  /* Activity 1.1  9.3.4.6 */
+    *nfcId1Len   = 0;
+    ST_MEMSET( nfcId1, 0x00, RFAL_NFCA_CASCADE_3_UID_LEN );
+    
+    /*******************************************************************************/
+    /* Go through all Cascade Levels     Activity 1.1  9.3.4 */
+    for( i = RFAL_NFCA_SEL_CASCADE_L1; i <= RFAL_NFCA_SEL_CASCADE_L3; i++)
+    {
+        /* Initialize the SDD_REQ to send for the new cascade level */
+        ST_MEMSET( (uint8_t*)&selReq, 0x00, sizeof(rfalNfcaSelReq) );
+        selReq.selCmd = rfalNfcaCLn2SELCMD(i);
+                
+        bytesTxRx    = RFAL_NFCA_SDD_REQ_LEN;
+        bitsTxRx     = 0;
+        
+        /*******************************************************************************/
+        /* Go through Collision loop */
+        do
+        {
+            /* Calculate SEL_PAR with the bytes/bits to be sent */
+            selReq.selPar = rfalNfcaSelPar(bytesTxRx, bitsTxRx);
+            
+            /* Send SDD_REQ (Anticollision frame) - Retry upon timeout  EMVCo 2.6  9.6.1.3 */
+            rfalNfcaTxRetry( ret, rfalISO14443ATransceiveAnticollisionFrame( (uint8_t*)&selReq, &bytesTxRx, &bitsTxRx, &bytesRx, RFAL_NFCA_FDTMIN, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) , ((devLimit==0)?RFAL_NFCA_N_RETRANS:0), RFAL_NFCA_T_RETRANS);
+            
+            bytesRx = rfalConvBitsToBytes(bytesRx);
+            
+            if( ret == ERR_RF_COLLISION )
+            {
+                /* Check received length */
+                if( (bytesTxRx + (bitsTxRx ? 1 : 0)) > (RFAL_NFCA_CASCADE_1_UID_LEN + RFAL_NFCA_SDD_REQ_LEN) )
+                {
+                    return ERR_PROTO;
+                }
+                
+                if( (devLimit == 0) && !(*collPending) )
+                {   
+                    /* Activity 1.0 & 1.1  9.3.4.12: If CON_DEVICES_LIMIT has a value of 0, then 
+                     * NFC Forum Device is configured to perform collision detection only       */
+                    *collPending = true;
+                    return ERR_IGNORE;
+                }
+                
+                *collPending = true;
+                
+                /* Set and select the collision bit, with the number of bytes/bits successfully TxRx */
+                *((uint8_t*)&selReq + bytesTxRx) |= (1 << bitsTxRx);
+                bitsTxRx++;
+                
+                /* Check if number of bits form a byte */
+                if( bitsTxRx == RFAL_BITS_IN_BYTE )
+                {
+                    bitsTxRx = 0;
+                    bytesTxRx++;
+                }
+            }
+        }while ((ret == ERR_RF_COLLISION) && (RFAL_NFCA_SDD_RES_LEN != bytesRx) ); /* BCC byte should not have collision if NFCID1 data are same */
+        
+        
+        /*******************************************************************************/
+        /* Check if Collision loop has failed */
+        if( ret != ERR_NONE )
+        {
+            return ret;
+        }
+        
+        
+        /* If collisions are to be reported check whether the response is complete */
+        if( (devLimit == 0) && (bytesRx != sizeof(rfalNfcaSddRes)) )
+        {
+            return ERR_PROTO;
+        }
+        
+        /* Check if the received BCC match */
+        if( selReq.bcc != rfalNfcaCalculateBcc( selReq.nfcid1, RFAL_NFCA_CASCADE_1_UID_LEN ) )
+        {
+            return ERR_PROTO;
+        }
+        
+        /*******************************************************************************/
+        /* Anticollision OK, Select this Cascade Level */
+        selReq.selPar = RFAL_NFCA_SEL_SELPAR;
+        
+        /* Send SEL_REQ (Select command) - Retry upon timeout  EMVCo 2.6  9.6.1.3 */
+        rfalNfcaTxRetry( ret, rfalTransceiveBlockingTxRx( (uint8_t*)&selReq, sizeof(rfalNfcaSelReq), (uint8_t*)selRes, sizeof(rfalNfcaSelRes), &bytesRx, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCA_FDTMIN, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) , ((devLimit==0)?RFAL_NFCA_N_RETRANS:0), RFAL_NFCA_T_RETRANS);
+        
+        if( ret != ERR_NONE )
+            return ret;
+        
+        
+        /* Ensure proper response length */
+        if( bytesRx != sizeof(rfalNfcaSelRes) )
+        {
+            return ERR_PROTO;
+        }
+        
+        /*******************************************************************************/
+        /* Check cascade byte, if cascade tag then go next cascade level */
+        if( (ret == ERR_NONE) && (*selReq.nfcid1 == RFAL_NFCA_SDD_CT) )
+        {
+            /* Cascade Tag present, store nfcid1 bytes (excluding cascade tag) and continue for next CL */
+            ST_MEMCPY( (nfcId1 + *nfcId1Len), ((uint8_t*)&selReq.nfcid1 + RFAL_NFCA_SDD_CT_LEN), (RFAL_NFCA_CASCADE_1_UID_LEN - RFAL_NFCA_SDD_CT_LEN) );
+            *nfcId1Len += (RFAL_NFCA_CASCADE_1_UID_LEN - RFAL_NFCA_SDD_CT_LEN);
+        }
+        else
+        {
+            /* UID Selection complete, Stop Cascade Level loop */
+            ST_MEMCPY( (nfcId1 + *nfcId1Len), (uint8_t*)&selReq.nfcid1, RFAL_NFCA_CASCADE_1_UID_LEN );
+            *nfcId1Len += RFAL_NFCA_CASCADE_1_UID_LEN;
+            return ERR_NONE;
+        }
+    }
+    return ERR_INTERNAL;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerFullCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcaListenDevice *nfcaDevList, 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 )
+{
+    ReturnCode      ret;
+    bool            collPending;
+    rfalNfcaSensRes sensRes;
+    uint16_t        rcvLen;
+    
+    if( (nfcaDevList == NULL) || (devCnt == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    *devCnt = 0;
+    ret     = ERR_NONE;
+    
+    /*******************************************************************************/
+    /* Send ALL_REQ before Anticollision if a Sleep was sent before  Activity 1.1  9.3.4.1 and EMVco 2.6  9.3.2.1 */
+    if( compMode != RFAL_COMPLIANCE_MODE_ISO )
+    {
+        ret = rfalISO14443ATransceiveShortFrame( RFAL_14443A_SHORTFRAME_CMD_WUPA, (uint8_t*)&nfcaDevList->sensRes, rfalConvBytesToBits(sizeof(rfalNfcaSensRes)), &rcvLen, RFAL_NFCA_FDTMIN, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        if(ret != ERR_NONE)
+        {
+            if( (compMode == RFAL_COMPLIANCE_MODE_EMV) || ((ret != ERR_RF_COLLISION) && (ret != ERR_CRC) && (ret != ERR_FRAMING) && (ret != ERR_PAR)) )
+            {
+                return ret;
+            }
+        }
+        
+        /* Check proper SENS_RES/ATQA size */
+        if( (ret == ERR_NONE) && (rfalConvBytesToBits(sizeof(rfalNfcaSensRes)) != rcvLen) )
+        {
+            return ERR_PROTO;
+        }
+    }
+    
+
+    #if RFAL_FEATURE_T1T
+    /*******************************************************************************/
+    /* Only check for T1T if previous SENS_RES was received without a transmission  *
+     * error. When collisions occur bits in the SENS_RES may look like a T1T        */
+    /* If T1T Anticollision is not supported  Activity 1.1  9.3.4.3 */
+    if( rfalNfcaIsSensResT1T( &nfcaDevList->sensRes ) && (devLimit != 0) && (ret == ERR_NONE) && (compMode != RFAL_COMPLIANCE_MODE_EMV) )
+    {
+        /* RID_REQ shall be performed with rfalT1TPollerRid()    Activity 1.1  9.3.4.24 */
+        rfalT1TPollerInitialize( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        EXIT_ON_ERR( ret, rfalT1TPollerRid( &nfcaDevList->ridRes, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+        
+        /* T1T doesn't support Anticollision */
+        *devCnt = 1;
+        nfcaDevList->isSleep   = false;
+        nfcaDevList->type      = RFAL_NFCA_T1T;
+        nfcaDevList->nfcId1Len = RFAL_NFCA_CASCADE_1_UID_LEN;
+        ST_MEMCPY( &nfcaDevList->nfcId1, &nfcaDevList->ridRes.uid, RFAL_NFCA_CASCADE_1_UID_LEN );
+        
+        return ERR_NONE;
+    }    
+    #endif /* RFAL_FEATURE_T1T */
+    
+    /*******************************************************************************/
+    /* Store the SENS_RES from Technology Detection or from WUPA */ 
+    sensRes = nfcaDevList->sensRes;
+    
+    ST_MEMSET( nfcaDevList, 0x00, (sizeof(rfalNfcaListenDevice) * devLimit) );
+    
+    /* Restore the prev SENS_RES, assuming that the SENS_RES received is from first device
+     * When only one device is detected it's not woken up then we'll have no SENS_RES (ATQA) */
+    nfcaDevList->sensRes = sensRes;
+    
+    
+    /*******************************************************************************/
+    do
+    {
+        EXIT_ON_ERR( ret, rfalNfcaPollerSingleCollisionResolution( devLimit, &collPending, &nfcaDevList[*devCnt].selRes, (uint8_t*)&nfcaDevList[*devCnt].nfcId1, (uint8_t*)&nfcaDevList[*devCnt].nfcId1Len, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+        
+        /* Assign Listen Device */
+        nfcaDevList[*devCnt].type    = (rfalNfcaListenDeviceType) (nfcaDevList[*devCnt].selRes.sak & RFAL_NFCA_SEL_RES_CONF_MASK);
+        nfcaDevList[*devCnt].isSleep = false;
+        (*devCnt)++;
+
+        
+        /* If a collision was detected and device counter is lower than limit  Activity 1.1  9.3.4.21 */
+        if( (*devCnt < devLimit) && ((collPending) || (compMode != RFAL_COMPLIANCE_MODE_ISO) ) )
+        {
+            /* Put this device to Sleep  Activity 1.1  9.3.4.22 */
+            EXIT_ON_ERR( ret, rfalNfcaPollerSleep( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+            nfcaDevList[(*devCnt - 1)].isSleep = true;
+            
+            
+            /* Send a new SENS_REQ to check for other cards  Activity 1.1  9.3.4.23 */
+            ret = rfalNfcaPollerCheckPresence( RFAL_14443A_SHORTFRAME_CMD_REQA, &nfcaDevList[*devCnt].sensRes, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( ret == ERR_TIMEOUT )
+            {
+                /* No more devices found */
+                return ERR_NONE;
+            }
+            /* Another device found, continue loop */
+            collPending = true;
+        }
+        else
+        {
+            return ERR_NONE;
+        }
+    }while( (*devCnt < devLimit) && (collPending) );
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerSelect( uint8_t *nfcid1, uint8_t nfcidLen, rfalNfcaSelRes *selRes, 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 )
+{
+    uint8_t        i;
+    uint8_t        cl;
+    uint8_t        nfcidOffset;
+    uint16_t       rxLen;
+    ReturnCode     ret;
+    rfalNfcaSelReq selReq;
+    
+    if( (nfcid1 == NULL) || (nfcidLen > RFAL_NFCA_CASCADE_3_UID_LEN) || (selRes == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    
+    /* Calculate Cascate Level */
+    cl          = rfalNfcaNfcidLen2CL( nfcidLen );
+    nfcidOffset = 0;
+    
+    /*******************************************************************************/
+    /* Go through all Cascade Levels     Activity 1.1  9.4.4 */
+    for( i = RFAL_NFCA_SEL_CASCADE_L1; i <= cl; i++ )
+    {
+        /* Assign SEL_CMD according to the CLn and SEL_PAR*/
+        selReq.selCmd = rfalNfcaCLn2SELCMD(i);
+        selReq.selPar = RFAL_NFCA_SEL_SELPAR;
+        
+        /* Compute NFCID/Data on the SEL_REQ command   Digital 1.1  Table 18 */
+        if( cl != i )
+        {
+            *selReq.nfcid1 = RFAL_NFCA_SDD_CT;
+            ST_MEMCPY( (selReq.nfcid1 + RFAL_NFCA_SDD_CT_LEN ), (nfcid1 + nfcidOffset), (RFAL_NFCA_CASCADE_1_UID_LEN - RFAL_NFCA_SDD_CT_LEN) );
+            nfcidOffset += (RFAL_NFCA_CASCADE_1_UID_LEN - RFAL_NFCA_SDD_CT_LEN);
+        }
+        else
+        {
+            ST_MEMCPY( selReq.nfcid1, (nfcid1 + nfcidOffset), RFAL_NFCA_CASCADE_1_UID_LEN );
+        }
+        
+        /* Calculate nfcid's BCC */
+        selReq.bcc = rfalNfcaCalculateBcc( (uint8_t*)&selReq.nfcid1, sizeof(selReq.nfcid1) );
+        
+        /*******************************************************************************/
+        /* Send SEL_REQ  */
+        EXIT_ON_ERR( ret, rfalTransceiveBlockingTxRx( (uint8_t*)&selReq, sizeof(rfalNfcaSelReq), (uint8_t*)selRes, sizeof(rfalNfcaSelRes), &rxLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCA_FDTMIN, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+        
+        /* Ensure proper response length */
+        if( rxLen != sizeof(rfalNfcaSelRes) )
+        {
+            return ERR_PROTO;
+        }
+    }
+    
+    /* REMARK: Could check if NFCID1 is complete */
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcaPollerSleep( 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 )
+{
+    ReturnCode     ret;
+    rfalNfcaSlpReq slpReq;
+    uint8_t        rxBuf;    /* dummy buffer, just to perform Rx */
+    
+    slpReq.frame[RFAL_NFCA_SLP_CMD_POS]   = RFAL_NFCA_SLP_CMD;
+    slpReq.frame[RFAL_NFCA_SLP_BYTE2_POS] = RFAL_NFCA_SLP_BYTE2;
+    
+    /* ISO14443-3 6.4.3  HLTA - If PICC responds with any modulation during 1 ms this response shall be interpreted as not acknowledge */    
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&slpReq, sizeof(rfalNfcaSlpReq), &rxBuf, sizeof(rxBuf), NULL, RFAL_TXRX_FLAGS_DEFAULT, RFAL_NFCA_SLP_FWT,   mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret != ERR_TIMEOUT )
+    {
+        return ret;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+bool rfalNfcaListenerIsSleepReq( uint8_t *buf, uint16_t bufLen )
+{
+    /* Check if length and payload match */
+    if( (bufLen != sizeof(rfalNfcaSlpReq)) || (buf[RFAL_NFCA_SLP_CMD_POS] != RFAL_NFCA_SLP_CMD) || (buf[RFAL_NFCA_SLP_BYTE2_POS] != RFAL_NFCA_SLP_BYTE2) )
+    {
+        return false;
+    }
+    
+    return true;
+}
+
+#endif /* RFAL_FEATURE_NFCA */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfca.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,386 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_nfca.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Provides several NFC-A convenience methods and definitions
+ *
+ *  It provides a Poller (ISO14443A PCD) interface and as well as
+ *  some NFC-A Listener (ISO14443A PICC) helpers.
+ *
+ *  The definitions and helpers methods provided by this module are only
+ *  up to ISO14443-3 layer
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup NFC-A
+ * @brief RFAL NFC-A Module
+ * @{
+ *
+ */
+
+
+#ifndef RFAL_NFCA_H
+#define RFAL_NFCA_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.h"
+#include "rfal_rf.h"
+#include "rfal_t1t.h"
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_NFCA_CASCADE_1_UID_LEN                           4    /*!< UID length of cascade level 1 only tag                            */
+#define RFAL_NFCA_CASCADE_2_UID_LEN                           7    /*!< UID length of cascade level 2 only tag                            */
+#define RFAL_NFCA_CASCADE_3_UID_LEN                           10   /*!< UID length of cascade level 3 only tag                            */
+
+#define RFAL_NFCA_SENS_RES_PLATFORM_MASK                      0x0F /*!< SENS_RES (ATQA) platform configuration mask  Digital 1.1 Table 10 */
+#define RFAL_NFCA_SENS_RES_PLATFORM_T1T                       0x0C /*!< SENS_RES (ATQA) T1T platform configuration  Digital 1.1 Table 10  */
+
+#define RFAL_NFCA_SEL_RES_CONF_MASK                           0x60 /*!< SEL_RES (SAK) platform configuration mask  Digital 1.1 Table 19   */
+#define RFAL_NFCA_SEL_RES_CONF_T2T                            0x00 /*!< SEL_RES (SAK) T2T configuration  Digital 1.1 Table 19             */
+#define RFAL_NFCA_SEL_RES_CONF_T4T                            0x20 /*!< SEL_RES (SAK) T4T configuration  Digital 1.1 Table 19             */
+#define RFAL_NFCA_SEL_RES_CONF_NFCDEP                         0x40 /*!< SEL_RES (SAK) NFC-DEP configuration  Digital 1.1 Table 19         */
+#define RFAL_NFCA_SEL_RES_CONF_T4T_NFCDEP                     0x60 /*!< 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          1620
+/*
+ ******************************************************************************
+ * 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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfcaPollerInitialize( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_RF_COLLISION : Collision detected one or more device in the field
+ * \return ERR_PAR          : Parity error detected, one or more device in the field
+ * \return ERR_CRC          : CRC error detected, one or more device in the field
+ * \return ERR_FRAMING      : Framing error detected, one or more device in the field
+ * \return ERR_PROTO        : Protocol error detected, one or more device in the field
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_NONE         : No error, one or more device in the field
+ *****************************************************************************
+ */
+ReturnCode rfalNfcaPollerCheckPresence( rfal14443AShortFrameCmd cmd, rfalNfcaSensRes *sensRes, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error
+ * \return ERR_PAR          : Parity error detected
+ * \return ERR_CRC          : CRC error detected
+ * \return ERR_FRAMING      : Framing error detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error, SEL_RES received
+ *****************************************************************************
+ */
+ReturnCode rfalNfcaPollerSelect( uint8_t *nfcid1, uint8_t nfcidLen, rfalNfcaSelRes *selRes, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfcaPollerSleep( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_NONE         : No error, one or more device in the field
+ *****************************************************************************
+ */
+ReturnCode rfalNfcaPollerTechnologyDetection( rfalComplianceMode compMode, rfalNfcaSensRes *sensRes, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief  NFC-A Poller Collision Resolution
+ *
+ * Collision resolution for one NFC-A Listener device/card (PICC) as
+ * defined in Activity 1.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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_PROTO        : Card length invalid
+ * \return ERR_IGNORE       : conDevLimit is 0 and there is a collision
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfcaPollerSingleCollisionResolution( uint8_t devLimit, bool *collPending, rfalNfcaSelRes *selRes, uint8_t *nfcId1, uint8_t *nfcId1Len, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief  NFC-A Poller Full Collision Resolution
+ *
+ * Performs a 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 and a proprietary behaviour also takes place. Once a device has been
+ * resolved an additional SLP_REQ (HLTA) is sent regardless if there was a collision
+ * (except if the number of devices found already equals the limit).
+ * 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
+ *
+ *
+ * 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 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 rfalNfcaPollerFullCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcaListenDevice *nfcaDevList, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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( uint8_t *buf, uint16_t bufLen );
+
+#endif /* RFAL_NFCA_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcb.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,502 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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 <platform1.h>
+#include "rfal_nfcb.h"
+#include "utils.h"
+
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_NFCB
+    #error " RFAL: Module configuration missing. Please enable/disable NFC-B module by setting: RFAL_FEATURE_NFCB "
+#endif
+
+#if RFAL_FEATURE_NFCB
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_NFCB_SENSB_REQ_EXT_SENSB_RES_SUPPORTED  0x10 /*!< Bit mask for Extended SensB Response support in SENSB_REQ */
+#define RFAL_NFCB_SENSB_RES_PROT_TYPE_RFU            0x08 /*!< Bit mask for Protocol Type RFU in SENSB_RES */
+#define RFAL_NFCB_SLOT_MARKER_SC_SHIFT               4    /*!< Slot Code position on SLOT_MARKER APn                     */
+
+#define RFAL_NFCB_SLOTMARKER_SLOTCODE_MIN            1    /*!< SLOT_MARKER Slot Code minimum   Digital 1.1  Table 37 */ 
+#define RFAL_NFCB_SLOTMARKER_SLOTCODE_MAX            16   /*!< SLOT_MARKER Slot Code maximum   Digital 1.1  Table 37 */
+
+#define RFAL_NFCB_ACTIVATION_FWT                    (RFAL_NFCB_FWTSENSB + RFAL_NFCB_DFWT_10)  /*!< FWT(SENSB) + dFWT  Digital 1.1  7.9.1.5  */
+
+/*! 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 */
+static 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        */
+}rfalCmd;
+
+/*
+ ******************************************************************************
+ * GLOBAL MACROS
+ ******************************************************************************
+ */
+
+#define rfalNfcbNI2NumberOfSlots( ni )  (1 << 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( rfalNfcbSensbRes *sensbRes, uint8_t sensbResLen );
+
+
+/*
+******************************************************************************
+* LOCAL VARIABLES
+******************************************************************************
+*/
+/*! TR2 Table according to Digital 1.1 Table 33 */
+static const uint16_t rfalNfcbTr2Table[] = { 1792, 3328, 5376, 9472 };
+
+rfalNfcb gRfalNfcb; /*!< RFAL NFC-B Instance */
+
+
+/*
+******************************************************************************
+* LOCAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+static ReturnCode rfalNfcbCheckSensbRes( 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) || (sensbRes->cmd != RFAL_NFCB_CMD_SENSB_RES) )
+    {
+        return ERR_PROTO;
+    }
+    return ERR_NONE;
+}
+
+/*
+******************************************************************************
+* GLOBAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+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 )
+{
+    ReturnCode ret;
+    
+    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 )  );
+    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, 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 )
+{
+    ReturnCode ret;
+        
+    EXIT_ON_ERR( ret, rfalNfcbPollerInitialize( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    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, 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 )
+{
+    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 = ((gRfalNfcb.PARAM & RFAL_NFCB_SENSB_REQ_PARAM) | cmd | 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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    *sensbResLen = 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( 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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) );
+    
+    /* Check SLPB_RES */
+    if( (rxLen != sizeof(rfalNfcbSlpbRes)) || (slpbRes.cmd != RFAL_NFCB_CMD_SLPB_RES) )
+    {
+        return ERR_PROTO;
+    }
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+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 )
+{
+    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) | 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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    *sensbResLen = 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, 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 )
+{
+    NO_WARNING(compMode);
+    
+    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 ) ;
+}
+
+
+/*******************************************************************************/
+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 )
+{
+    bool colPending; /* dummy */
+    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 ) ;
+}
+
+
+/*******************************************************************************/
+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 )
+{
+		ReturnCode    ret;
+        rfalNfcbSlots 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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+           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 == 0) )
+        {
+            return ERR_FRAMING;
+        }
+        //(int)slotsNum = (int)initSlots; (int)slotsNum <= (int)endSlots; ((int)slotsNum)++ )
+
+        for( int i = 0; i < RFAL_NFCB_SLOT_NUM_16; i++)
+        {
+        	rfalNfcbSlots slotsNum = (rfalNfcbSlots) i;
+            /* Activity 1.1  9.3.5.23  -  Symbol 22 */
+            if( (compMode == RFAL_COMPLIANCE_MODE_NFC) && (curDevCnt != 0) )
+            {
+                rfalNfcbPollerSleep( nfcbDevList[(*devCnt-1)].sensbRes.nfcid0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                nfcbDevList[(*devCnt-1)].isSleep = true;
+            }
+            
+            /* Send SENSB_REQ with number of slots if not the first Activity 1.1  9.3.5.24  -  Symbol 23 */
+            if( (slotsNum != initSlots) || *colPending )
+            {
+               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 ) ;
+            }
+            
+            /* 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 != 0 )
+                {
+                    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 ) ;
+                }
+                
+                /* 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( (ret == ERR_NONE) && (rfalNfcbCheckSensbRes( &nfcbDevList[*devCnt].sensbRes, nfcbDevList[*devCnt].sensbResLen) == 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 == RFAL_NFCB_SLOT_NUM_1) )
+                            {
+                                return ret;
+                            }
+
+                            /* Activity 1.0  9.3.5.11  -  Symbol 10 */
+                            rfalNfcbPollerSleep( nfcbDevList[*devCnt-1].sensbRes.nfcid0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                            nfcbDevList[*devCnt-1].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 != 0)
+                            {
+                                rfalNfcbPollerSleep( nfcbDevList[*devCnt-1].sensbRes.nfcid0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                                nfcbDevList[*devCnt-1].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 == RFAL_NFCB_SLOT_NUM_1) )
+                            {
+                                return ret;
+                            }
+                        }
+                    }
+                    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 == 0) && (slotsNum == 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 */
+                (int)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 */
+            if( curDevCnt != 0 )
+            {
+                /* If a collision is detected and card(s) were found on this loop keep the same number of available slots */
+            	//((int)slotsNum)--;
+            	i--;
+            }
+
+        }
+        
+        return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+uint32_t rfalNfcbTR2ToFDT( uint8_t tr2Code )
+{
+    return rfalNfcbTr2Table[ (tr2Code & RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK) ];
+}
+
+#endif /* RFAL_FEATURE_NFCB */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcb.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,395 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of NFC-B (ISO14443B) helpers
+ *
+ *  It provides a NFC-B Poller (ISO14443B PCD) interface and
+ *  also provides some NFC-B Listener (ISO14443B PICC) helpers
+ *
+ *  The definitions and helpers methods provided by this module are only
+ *  up to ISO14443-3 layer (excluding ATTRIB)
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup NFC-B
+ * @brief RFAL NFC-B Module
+ * @{
+ *
+ */
+
+
+#ifndef RFAL_NFCB_H
+#define RFAL_NFCB_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.h"
+#include "rfal_rf.h"
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_NFCB_FWTSENSB                       7680                 /*!< NFC-B FWT(SENSB)  Digital 1.1  A.3       */
+#define RFAL_NFCB_DTPOLL                         49152                /*!< NFC-B Delta Tb Poll Digital 1.1  A.3     */
+#define RFAL_NFCB_DFWT_11                        rfalConvMsTo1fc(17)  /*!< NFC-B dFWT (16.4ms)  Digital 1.1  A.3    */
+#define RFAL_NFCB_DFWT_10                        rfalConvMsTo1fc(20)  /*!< NFC-B dFWT (20ms)  Digital 1.0  A.2      */
+
+#define RFAL_NFCB_AFI                            0x00   /*!< NFC-B default Application Family   Digital 1.1 7.6.1.1 */
+#define RFAL_NFCB_PARAM                          0x00   /*!< NFC-B default SENSB_REQ PARAM                          */
+#define RFAL_NFCB_CRC_LEN                        2      /*!< NFC-B CRC length and CRC_B(AID)   Digital 1.1 Table 28 */
+#define RFAL_NFCB_NFCID0_LEN                     4      /*!< Length of NFC-B NFCID0                                 */
+#define RFAL_NFCB_CMD_LEN                        1      /*!< Length of NFC-B Command                                */
+
+#define RFAL_NFCB_SENSB_RES_LEN                  12     /*!< Standard length of SENSB_RES without SFGI byte         */
+#define RFAL_NFCB_SENSB_RES_EXT_LEN              13     /*!< Extended length of SENSB_RES with SFGI byte            */
+
+#define RFAL_NFCB_SENSB_REQ_ADV_FEATURE          0x20   /*!< Bit mask for Advance Feature in SENSB_REQ              */
+#define RFAL_NFCB_SENSB_RES_FSCI_MASK            0x0F   /*!< Bit mask for FSCI value in SENSB_RES                   */
+#define RFAL_NFCB_SENSB_RES_FSCI_SHIFT           4      /*!< Shift for FSCI value in SENSB_RES                      */
+#define RFAL_NFCB_SENSB_RES_PROTO_RFU_MASK       0x08   /*!< Bit mask for Protocol Type RFU in SENSB_RES            */
+#define RFAL_NFCB_SENSB_RES_PROTO_TR2_MASK       0x03   /*!< Bit mask for Protocol Type TR2 in SENSB_RES            */
+#define RFAL_NFCB_SENSB_RES_PROTO_TR2_SHIFT      1      /*!< Shift for Protocol Type TR2 in SENSB_RES               */
+#define RFAL_NFCB_SENSB_RES_PROTO_ISO_MASK       0x01   /*!< Bit mask Protocol Type ISO14443 Compliant in SENSB_RES */
+#define RFAL_NFCB_SENSB_RES_FWI_MASK             0x0F   /*!< Bit mask for FWI value in SENSB_RES                    */
+#define RFAL_NFCB_SENSB_RES_FWI_SHIFT            4      /*!< Bit mask for FWI value in SENSB_RES                    */
+#define RFAL_NFCB_SENSB_RES_ADC_MASK             0x0C   /*!< Bit mask for ADC value in SENSB_RES                    */
+#define RFAL_NFCB_SENSB_RES_ADC_ADV_FEATURE_MASK 0x08   /*!< Bit mask for ADC.Advanced Proto Features in SENSB_RES  */
+#define RFAL_NFCB_SENSB_RES_ADC_PROPRIETARY_MASK 0x04   /*!< Bit mask for ADC.Proprietary Application in SENSB_RES  */
+#define RFAL_NFCB_SENSB_RES_FO_DID_MASK          0x01   /*!< Bit mask for DID in SENSB_RES                          */
+#define RFAL_NFCB_SENSB_RES_FO_NAD_MASK          0x02   /*!< Bit mask for DID in SENSB_RES                          */
+#define RFAL_NFCB_SENSB_RES_FO_MASK              0x03   /*!< Bit mask for FO value in SENSB_RES (NAD and DID)       */
+#define RFAL_NFCB_SENSB_RES_SFGI_MASK            0x0F   /*!< Bit mask for SFGI in SENSB_RES                         */
+#define RFAL_NFCB_SENSB_RES_SFGI_SHIFT           4      /*!< 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 )
+
+/*
+******************************************************************************
+* 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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_RF_COLLISION : Collision detected one or more device in the field
+ * \return ERR_PAR          : Parity error detected, one or more device in the field
+ * \return ERR_CRC          : CRC error detected, one or more device in the field
+ * \return ERR_FRAMING      : Framing error detected, one or more device in the field
+ * \return ERR_PROTO        : Protocol error detected, invalid SENSB_RES received
+ * \return ERR_NONE         : No error, SENSB_RES received
+ *****************************************************************************
+ */
+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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief  NFC-B Poller Slot Marker
+ *
+ * This method selects 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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error
+ * \return ERR_PAR          : Parity error detected
+ * \return ERR_CRC          : CRC error detected
+ * \return ERR_FRAMING      : Framing error detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error, SEL_RES received
+ *****************************************************************************
+ */
+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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_NONE         : No error, one or more device in the field
+ *****************************************************************************
+ */
+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 );
+
+/*!
+ *****************************************************************************
+ * \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 devInfo and nfcbDevCount 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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+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 );
+
+/*!
+ *****************************************************************************
+ * \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 devInfo and nfcbDevCount 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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcf.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,344 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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.c
+ *
+ *  \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)
+ *
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include <platform1.h>
+#include "rfal_nfcf.h"
+#include "utils.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_NFCF
+    #error " RFAL: Module configuration missing. Please enable/disable NFC-F module by setting: RFAL_FEATURE_NFCF "
+#endif
+
+#if RFAL_FEATURE_NFCF
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+#define RFAL_NFCF_SENSF_REQ_LEN_MIN                5     /*!< SENSF_RES minimum length                   */
+
+#define RFAL_NFCF_READ_WO_ENCRYPTION_MIN_LEN       15    /*!< Minimum length for a Check Command   -  T3T  5.4.1 */
+#define RFAL_NFCF_WRITE_WO_ENCRYPTION_MIN_LEN      31    /*!< Minimum length for an Update Command -  T3T  5.5.1 */
+
+
+/*
+ ******************************************************************************
+ * GLOBAL MACROS
+ ******************************************************************************
+ */
+#define rfalNfcfSlots2CardNum( s )                 (s+1) /*!< 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;
+
+
+/*
+******************************************************************************
+* LOCAL VARIABLES
+******************************************************************************
+*/
+static rfalNfcfGreedyF gRfalNfcfGreedyF;   /*!< Activity's NFCF Greedy collection */
+
+
+/*
+******************************************************************************
+* 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;    
+    rfalNfcfSensfResBuf *sensfBuf;
+    
+    
+    /*******************************************************************************/
+    /* Go through all responses check if valid and duplicates                      */
+    /*******************************************************************************/
+    while( (gRfalNfcfGreedyF.pollFound > 0) && ((*curDevIdx) < devLimit) )
+    {
+        duplicate = false;
+        gRfalNfcfGreedyF.pollFound--;
+        
+        /* Point to received SENSF_RES */
+        sensfBuf = (rfalNfcfSensfResBuf*) &gRfalNfcfGreedyF.POLL_F[gRfalNfcfGreedyF.pollFound];
+        
+        
+        /* Check for devices that are already in device list */
+        for( tmpIdx = 0; tmpIdx < (*curDevIdx); tmpIdx++ )
+        {
+            if( !ST_BYTECMP( sensfBuf->SENSF_RES.NFCID2, outDevInfo[tmpIdx].sensfRes.NFCID2, RFAL_NFCF_NFCID2_LEN ) )
+            {
+                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 != 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);
+            ST_MEMCPY( &outDevInfo[tmpIdx].sensfRes, &sensfBuf->SENSF_RES.CMD, outDevInfo[tmpIdx].sensfResLen );
+            continue;
+        }
+        else
+        {
+            /* fill deviceInfo/GRE_SENSF_RES with new SENSF_RES */
+            outDevInfo[(*curDevIdx)].sensfResLen = (sensfBuf->LEN - RFAL_NFCF_LENGTH_LEN);
+            ST_MEMCPY( &outDevInfo[(*curDevIdx)].sensfRes, &sensfBuf->SENSF_RES.CMD, 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,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 )
+{
+    ReturnCode ret;
+    
+    if( (bitRate != RFAL_BR_212) && (bitRate != RFAL_BR_424) )
+    {
+        return ERR_PARAM;
+    }
+    
+    EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCF, bitRate, bitRate, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_NFC );
+    
+    rfalSetGT( RFAL_GT_NFCF );
+    rfalSetFDTListen( RFAL_FDT_LISTEN_NFCF_POLLER );
+    rfalSetFDTPoll( RFAL_FDT_POLL_NFCF_POLLER );
+    
+    return ERR_NONE;
+}
+
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcfPollerPoll( rfalFeliCaPollSlots slots, uint16_t sysCode, uint8_t reqCode, rfalFeliCaPollRes *cardList, uint8_t *devCnt, uint8_t *collisions, 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 )
+{
+    return rfalFeliCaPoll( slots, sysCode, reqCode, cardList, rfalNfcfSlots2CardNum(slots), devCnt, collisions, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfcfPollerCheckPresence( 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 )
+{
+    gRfalNfcfGreedyF.pollFound     = 0;
+    gRfalNfcfGreedyF.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 rfalFeliCaPoll( RFAL_FELICA_4_SLOTS, RFAL_NFCF_SYSTEMCODE, RFAL_FELICA_POLL_RC_NO_REQUEST, gRfalNfcfGreedyF.POLL_F, rfalNfcfSlots2CardNum(RFAL_FELICA_4_SLOTS), &gRfalNfcfGreedyF.pollFound, &gRfalNfcfGreedyF.pollCollision, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalNfcfPollerCollisionResolution( rfalComplianceMode compMode, uint8_t devLimit, rfalNfcfListenDevice *nfcfDevList, 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 )
+{
+    ReturnCode  ret;
+    bool        nfcDepFound;
+    
+    if( nfcfDevList == NULL || devCnt == NULL )
+    {
+        return ERR_PARAM;
+    }
+            
+    *devCnt      = 0;
+    nfcDepFound  = false;
+    
+    
+    /*******************************************************************************************/
+    /* 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 1.1 - 9.3.63.59 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 == 0 ? rfalNfcfSlots2CardNum( RFAL_FELICA_4_SLOTS ) : devLimit), false, &nfcDepFound );
+
+    
+    /*******************************************************************************/
+    /* ACTIVITY 1.0 - 9.3.6.4                                                      */
+    /* ACTIVITY 1.1 - 9.3.63.60 Check if devices found are lower than the limit    */
+    /* and send a SENSF_REQ if so                                                  */
+    /*******************************************************************************/
+    if( *devCnt < devLimit )
+    {
+        /* 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 */
+        *devCnt = 0;
+        
+        ret = rfalNfcfPollerPoll( RFAL_FELICA_16_SLOTS, RFAL_NFCF_SYSTEMCODE, RFAL_FELICA_POLL_RC_NO_REQUEST, gRfalNfcfGreedyF.POLL_F, &gRfalNfcfGreedyF.pollFound, &gRfalNfcfGreedyF.pollCollision, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        if( ret == ERR_NONE )
+        {
+            rfalNfcfComputeValidSENF( nfcfDevList, devCnt, devLimit, false, &nfcDepFound );
+        }
+      
+      /*******************************************************************************/
+      /* ACTIVITY 1.1 -  9.3.6.63 Check if any device supports NFC DEP               */
+      /*******************************************************************************/
+      if( nfcDepFound && (compMode == RFAL_COMPLIANCE_MODE_NFC) )
+      {
+          ret = rfalNfcfPollerPoll( RFAL_FELICA_16_SLOTS, RFAL_NFCF_SYSTEMCODE, RFAL_FELICA_POLL_RC_SYSTEM_CODE, gRfalNfcfGreedyF.POLL_F, &gRfalNfcfGreedyF.pollFound, &gRfalNfcfGreedyF.pollCollision, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+          if( ret == ERR_NONE )
+          {
+              rfalNfcfComputeValidSENF( nfcfDevList, devCnt, devLimit, true, &nfcDepFound );
+          }
+      }
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+bool rfalNfcfListenerIsT3TReq( 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 )
+    {
+        ST_MEMCPY( nfcid2, (uint8_t*)(buf + RFAL_NFCF_CMD_LEN), RFAL_NFCF_NFCID2_LEN );
+    }
+    
+    return true;
+}
+
+#endif /* RFAL_FEATURE_NFCF */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcf.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,287 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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 "platform1.h"
+#include "st_errno.h"
+#include "rfal_rf.h"
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_NFCF_NFCID2_LEN                    8       /*!< NFCID2 (FeliCa IDm) length                        */
+#define RFAL_NFCF_SENSF_RES_LEN_MIN             16      /*!< SENSF_RES minimum length                          */
+#define RFAL_NFCF_SENSF_RES_LEN_MAX             18      /*!< SENSF_RES maximum length                          */
+#define RFAL_NFCF_SENSF_RES_PAD0_LEN            2       /*!< SENSF_RES PAD0 length                             */
+#define RFAL_NFCF_SENSF_RES_PAD1_LEN            2       /*!< SENSF_RES PAD1 length                             */
+#define RFAL_NFCF_SENSF_RES_RD_LEN              2       /*!< SENSF_RES Request Data length                     */
+#define RFAL_NFCF_SENSF_RES_BYTE1               1       /*!< SENSF_RES first byte value                        */
+#define RFAL_NFCF_SENSF_SC_LEN                  2       /*!< Felica SENSF_REQ System Code length               */
+#define RFAL_NFCF_SENSF_PARAMS_SC1_POS          0       /*!< System Code byte1 position in the SENSF_REQ       */
+#define RFAL_NFCF_SENSF_PARAMS_SC2_POS          1       /*!< System Code byte2 position in the SENSF_REQ       */
+#define RFAL_NFCF_SENSF_PARAMS_RC_POS           2       /*!< Request Code position in the SENSF_REQ            */
+#define RFAL_NFCF_SENSF_PARAMS_TSN_POS          3       /*!< Time Slot Number position in the SENSF_REQ        */
+#define RFAL_NFCF_POLL_MAXCARDS                 16      /*!< Max number slots/cards 16                         */
+
+
+#define RFAL_NFCF_CMD_LEN                        1      /*!< Command/Responce code length                      */
+#define RFAL_NFCF_LENGTH_LEN                     1      /*!< 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         0      /*!< NFCID2 byte1 position                             */
+#define RFAL_NFCF_SENSF_NFCID2_BYTE2_POS         1      /*!< NFCID2 byte2 position                             */
+
+#define RFAL_NFCF_SENSF_NFCID2_PROT_TYPE_LEN     2      /*!< NFCID2 length for byte 1 and byte 2 indicating NFC-DEP or T3T support */
+#define RFAL_NFCF_SENSF_NFCID2_BYTE1_NFCDEP      0x01   /*!< NFCID2 byte1 NFC-DEP support  Digital 1.0 Table 44*/
+#define RFAL_NFCF_SENSF_NFCID2_BYTE2_NFCDEP      0xFE   /*!< NFCID2 byte2 NFC-DEP support  Digital 1.0 Table 44*/
+
+#define RFAL_NFCF_SYSTEMCODE                     0xFFFF /*!< SENSF_RES Default System Code  Digital 1.0 6.6.1.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_WRITE_WITHOUT_ENCRYPTION = 0x08, /*!< write Block Data to a Service that requires 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;
+
+
+/*
+******************************************************************************
+* 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, 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 );
+
+
+/*!
+ *****************************************************************************
+ *  \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( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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( uint8_t* buf, uint16_t bufLen, uint8_t* nfcid2 );
+
+
+#endif /* RFAL_NFCF_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcv.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,625 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_nfcv.c
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of NFC-V Poller (ISO15693) device
+ *
+ *  The definitions and helpers methods provided by this module are 
+ *  aligned with NFC-V (ISO15693)
+ *
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include <platform1.h>
+#include "rfal_nfcv.h"
+#include "utils.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_NFCV
+    #error " RFAL: Module configuration missing. Please enable/disable NFC-V module by setting: RFAL_FEATURE_NFCV "
+#endif
+
+#if RFAL_FEATURE_NFCV
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_NFCV_INV_REQ_FLAG            0x06  /*!< INVENTORY_REQ  INV_FLAG  Digital  2.0  9.6.1                      */
+#define RFAL_NFCV_INV_REQ_FLAG            0x06  /*!< INVENTORY_REQ  INV_FLAG  Digital  2.0  9.6.1                      */
+#define RFAL_NFCV_MASKVAL_MAX_LEN         8     /*!< Mask value max length: 64 bits  (UID length)                      */
+#define RFAL_NFCV_MASKVAL_MAX_1SLOT_LEN   64    /*!< Mask value max length in 1 Slot mode in bits  Digital 2.0 9.6.1.6 */
+#define RFAL_NFCV_MASKVAL_MAX_16SLOT_LEN  60    /*!< Mask value max length in 16 Slot mode in bits Digital 2.0 9.6.1.6 */
+#define RFAL_NFCV_INV_REQ_HEADER_LEN     3     /*!< INVENTORY_REQ header length (INV_FLAG, CMD, MASK_LEN)  */
+#define RFAL_NFCV_INV_RES_LEN            10    /*!< INVENTORY_RES length                                   */
+#define RFAL_NFCV_CRC_LEN                2     /*!< NFC-V CRC length                                       */
+#define RFAL_NFCV_MAX_SLOTS               16    /*!< NFC-V max number of Slots                                         */
+#define RFAL_NFCV_MAX_GEN_DATA_LEN        (RFAL_NFCV_MAX_BLOCK_LEN + RFAL_NFCV_UID_LEN) /*!< Max number of generic data*/
+
+#define RFAL_CMD_LEN                      1     /*!< Commandbyte length                                                */
+#define RFAL_NFCV_FLAG_LEN                1     /*!< Flag byte length                                                  */
+#define RFAL_NFCV_DSFI_LEN                1     /*!< DSFID length                                                      */
+#define RFAL_NFCV_SLPREQ_REQ_FLAG        0x22  /*!< SLPV_REQ request flags Digital 2.0 (Candidate) 9.7.1.1 */
+
+#define RFAL_NFCV_MAX_COLL_SUPPORTED      16    /*!< Maximum number of collisions supported by the Anticollision loop  */
+
+#define RFAL_FDT_POLL_MAX                 rfalConvMsTo1fc(20) /*!< */
+
+
+
+/*! Time between EOFs - ISO 15693 defines t3min depending on modulation depth and data rate
+ *                    - NFC Forum defines FDTV,EOF = [10 ; 20]ms    ISO15693 2000 8.4   Digital 2.0  9.7.4 */ 
+#define RFAL_NFCV_FDT_EOF                 5
+
+
+
+/*
+ ******************************************************************************
+ * GLOBAL MACROS
+ ******************************************************************************
+ */
+
+
+/*
+******************************************************************************
+* 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;
+
+
+/*! NFC-V Generic Req format  */
+typedef struct
+{
+    uint8_t  REQ_FLAG;                              /*!< Request Flags      */
+    uint8_t  CMD;                                   /*!< Command code       */
+    union {
+        uint8_t  UID[RFAL_NFCV_UID_LEN];                /*!< Mask Value         */
+        uint8_t  data[RFAL_NFCV_MAX_GEN_DATA_LEN];      /*!< Data               */
+    }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;
+
+
+/*! Container for a collision found during Anticollsion loop */
+typedef struct
+{
+    uint8_t  maskLen;
+    uint8_t  maskVal[RFAL_NFCV_MASKVAL_MAX_LEN];
+}rfalNfcvCollision;
+
+
+/*
+******************************************************************************
+* LOCAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+static ReturnCode rfalNfvParseError( uint8_t err );
+
+/*
+******************************************************************************
+* LOCAL VARIABLES
+******************************************************************************
+*/
+
+/*
+******************************************************************************
+* LOCAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+static ReturnCode rfalNfvParseError( uint8_t err )
+{
+    switch(err)
+    {
+        case RFAL_NFCV_ERROR_CMD_NOT_SUPPORTED:
+        case RFAL_NFCV_ERROR_OPTION_NOT_SUPPORTED:
+            return ERR_NOTSUPP;
+            
+        case RFAL_NFCV_ERROR_CMD_NOT_RECOGNIZED:
+            return ERR_PROTO;
+            
+        case RFAL_NFCV_ERROR_WRITE_FAILED:
+            return ERR_WRITE;
+            
+        default:
+            return ERR_REQUEST;
+    }
+}
+
+/*
+******************************************************************************
+* GLOBAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+ReturnCode rfalNfcvPollerInitialize( 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 )
+{
+    ReturnCode ret;
+            
+    EXIT_ON_ERR( ret, rfalSetMode( RFAL_MODE_POLL_NFCV, RFAL_BR_26p48, RFAL_BR_26p48, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_NFC );
+    
+    rfalSetGT( RFAL_GT_NFCV_ADJUSTED );
+    rfalSetFDTListen( RFAL_FDT_LISTEN_NFCV_POLLER );
+    rfalSetFDTPoll( RFAL_FDT_POLL_NFCV_POLLER );
+    
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfcvPollerCheckPresence( rfalNfcvInventoryRes *invRes, 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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( (ret == ERR_RF_COLLISION) || (ret == ERR_CRC)  || 
+        (ret == ERR_FRAMING)      || (ret == ERR_PROTO)  )
+    {
+        ret = ERR_NONE;
+    }
+    
+    return ret;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfcvPollerInventory( rfalNfcvNumSlots nSlots, uint8_t maskLen, uint8_t *maskVal, rfalNfcvInventoryRes *invRes, uint16_t* rcvdLen, 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 )
+{
+    ReturnCode           ret;
+    rfalNfcvInventoryReq invReq;
+    uint16_t             rxLen;
+    
+    if( ((maskVal == NULL) && (maskLen != 0)) || (invRes == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    invReq.INV_FLAG = (RFAL_NFCV_INV_REQ_FLAG | nSlots);
+    invReq.CMD      = RFAL_NFCF_CMD_INVENTORY;
+    invReq.MASK_LEN = 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 */
+    ST_MEMCPY( invReq.MASK_VALUE, maskVal, rfalConvBitsToBytes(invReq.MASK_LEN) );
+    
+    ret = rfalISO15693TransceiveAnticollisionFrame( (uint8_t*)&invReq, (RFAL_NFCV_INV_REQ_HEADER_LEN + rfalConvBitsToBytes(invReq.MASK_LEN)), (uint8_t*)invRes, sizeof(rfalNfcvInventoryRes), &rxLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for optional output parameter */
+    if( rcvdLen != NULL )
+    {
+        *rcvdLen = rxLen;
+    }
+    
+    if( ret == ERR_NONE )
+    {
+        if( rxLen != rfalConvBytesToBits(RFAL_NFCV_INV_RES_LEN + RFAL_NFCV_CRC_LEN) )
+        {
+            return ERR_PROTO;
+        }
+    }
+    
+    return ret;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfcvPollerCollisionResolution( uint8_t devLimit, rfalNfcvListenDevice *nfcvDevList, 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 )
+{
+    ReturnCode ret;
+    uint8_t           slotNum;
+    uint16_t          rcvdLen;
+    uint8_t           colIt;
+    uint8_t           colCnt;
+   /* bool              colPending; */
+    rfalNfcvCollision colFound[RFAL_NFCV_MAX_COLL_SUPPORTED];
+    
+   /* NO_WARNING(colPending); */
+    
+    if( (nfcvDevList == NULL) || (devCnt == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Initialize parameters */
+    *devCnt = 0;
+    colIt         = 0;
+    colCnt        = 0;
+   /* colPending    = false; */
+    ST_MEMSET(nfcvDevList, 0x00, (sizeof(rfalNfcvListenDevice)*devLimit) );
+    ST_MEMSET(colFound, 0x00, (sizeof(rfalNfcvCollision)*RFAL_NFCV_MAX_COLL_SUPPORTED) );
+    
+    
+    /* Send INVENTORY_REQ with one slot   Activity 2.0  9.3.7.1  (Symbol 0)  */
+    ret = rfalNfcvPollerInventory( RFAL_NFCV_NUM_SLOTS_1, 0, NULL, &nfcvDevList->InvRes, NULL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( ret == ERR_TIMEOUT )    /* Exit if no device found     Activity 2.0  9.3.7.2 (Symbol 1)  */
+    {
+        return ERR_NONE;
+    }
+    if( ret == ERR_NONE )  /* Device found without transmission error/collision    Activity 2.0  9.3.7.3 (Symbol 2)  */
+    {
+        (*devCnt)++;
+        return ERR_NONE;
+    }
+    
+    /* A Collision has been identified  Activity 2.0  9.3.7.2  (Symbol 3) */
+   /* colPending = true; */ 
+    
+    /* Check if the Collision Resolution is set to perform only Collision detection   Activity 2.0  9.3.7.5 (Symbol 4)*/
+    if( devLimit == 0 )
+    {
+        return ERR_RF_COLLISION;
+    }
+    
+    
+    /*******************************************************************************/
+    /* Collisions pending, Anticollision loop must be executed                     */
+    /*******************************************************************************/
+    
+    /* Execute until all collisions are resolved Activity 2.0  9.3.7.16  (Symbol 17) */
+    do
+    {
+        /* Activity 2.0  9.3.7.5  (Symbol 6) */
+        slotNum    = 0;
+       /* colPending = false; */
+        
+        
+        /* Send INVENTORY_REQ with 16 slots   Activity 2.0  9.3.7.7  (Symbol 8) */
+        ret = rfalNfcvPollerInventory( RFAL_NFCV_NUM_SLOTS_16, colFound[colIt].maskLen, colFound[colIt].maskVal, &nfcvDevList[(*devCnt)].InvRes, &rcvdLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* If collision have already been found, move to next one */
+        if( colCnt > 0 )
+        {
+            colIt++;
+        }
+        
+        do
+        {
+            /*******************************************************************************/
+            if( ret != ERR_TIMEOUT )
+            {
+                if( ret == ERR_NONE )
+                {
+                    /* Check if the device found is already on the list and its response is a valid INVENTORY_RES */
+                    if( rcvdLen == rfalConvBytesToBits(RFAL_NFCV_INV_RES_LEN + RFAL_NFCV_CRC_LEN) )
+                    {
+                        /* Activity 2.0  9.3.7.15  (Symbol 16) */
+                        (*devCnt)++;
+                    }
+                }
+                /*******************************************************************************/
+                else if(ret == ERR_RF_COLLISION)
+                {
+                    /* Activity 2.0  9.3.7.15  (Symbol 16) */
+                  /* colPending = true; */
+                    
+                    /* Ensure that the frame received has at least the FLAGS + DSFI */
+                    if( rcvdLen <= rfalConvBytesToBits( RFAL_NFCV_FLAG_LEN + RFAL_NFCV_DSFI_LEN ) )
+                    {
+                        return ERR_RF_COLLISION;
+                    }
+
+                    /*******************************************************************************/
+                    /* 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 */
+                        colFound[colCnt].maskLen = ( rcvdLen - rfalConvBytesToBits( RFAL_NFCV_FLAG_LEN + RFAL_NFCV_DSFI_LEN ) );
+                        ST_MEMCPY(colFound[colCnt].maskVal, nfcvDevList[(*devCnt)].InvRes.UID, RFAL_NFCV_UID_LEN);
+                        colCnt++;
+                    }
+                }
+            }
+            
+            /* Check if devices found have reached device limit   Activity 2.0  9.3.7.15  (Symbol 16) */
+            if( *devCnt >= devLimit )
+            {
+                return ERR_NONE;
+            }
+            
+            platformDelay(RFAL_NFCV_FDT_EOF); /* Fulfil FDT EOF */
+            ret = rfalISO15693TransceiveAnticollisionEOF( (uint8_t*)&nfcvDevList[(*devCnt)].InvRes, sizeof(rfalNfcvInventoryRes), &rcvdLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            slotNum++;
+            
+        }
+        while( slotNum < RFAL_NFCV_MAX_SLOTS );  /* Slot loop             */
+    }while( colIt < colCnt );                    /* Collisions found loop */
+    
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfvPollerSleep( uint8_t flags, uint8_t* uid, 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 )
+{
+    ReturnCode      ret;
+    rfalNfcvSlpvReq slpReq;
+    uint8_t         rxBuf;    /* dummy buffer, just to perform Rx */
+    
+    if( uid == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Compute SLPV_REQ */
+    slpReq.REQ_FLAG = (flags | RFAL_NFCV_REQ_FLAG_ADDRESS);   /* Should be with UID according Digital 2.0 (Candidate) 9.7.1.1 */
+    slpReq.CMD      = RFAL_NFCF_CMD_SLPV;
+    ST_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_FDT_POLL_NFCV_POLLER, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret != ERR_TIMEOUT )
+    {
+        return ret;
+    }
+    
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfvSelect( uint8_t flags, uint8_t* uid, 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 )
+{
+    uint16_t           rcvLen;
+    ReturnCode         ret;
+    rfalNfcvGenericReq req;
+    rfalNfcvGenericRes res;
+
+    if( uid == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Compute Request Command */
+    req.REQ_FLAG = (flags | RFAL_NFCV_REQ_FLAG_ADDRESS);
+    req.CMD      = RFAL_NFCF_CMD_SELECT;
+    ST_MEMCPY( req.payload.UID, uid, RFAL_NFCV_UID_LEN );
+    
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, (RFAL_CMD_LEN + RFAL_NFCV_FLAG_LEN + RFAL_NFCV_UID_LEN), (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_MAX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    /* Check if the response minimum length has been received */
+    if( rcvLen < RFAL_NFCV_FLAG_LEN )
+    {
+        return ERR_PROTO;
+    }
+    
+    /* Check if an error has been signalled */
+    if( res.RES_FLAG & RFAL_NFCV_RES_FLAG_ERROR )
+    {
+        return rfalNfvParseError( *res.data );
+    }
+    
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfvReadSingleBlock( uint8_t flags, uint8_t* uid, uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen, 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 )
+{
+    ReturnCode         ret;
+    rfalNfcvGenericReq req;
+    rfalNfcvGenericRes *res;
+    uint8_t            msgIt;
+    
+    msgIt = 0;
+    res   = (rfalNfcvGenericRes*)rxBuf;
+    
+    /* Compute Request Command */
+    req.REQ_FLAG  = (flags & (~RFAL_NFCV_REQ_FLAG_ADDRESS & ~RFAL_NFCV_REQ_FLAG_SELECT));
+    req.CMD       = RFAL_NFCF_CMD_READ_SINGLE_BLOCK;
+    
+    /* Check if request is to be sent in Addressed or Selected mode */
+    if( uid != NULL )
+    {
+        req.REQ_FLAG |= RFAL_NFCV_REQ_FLAG_ADDRESS;
+        ST_MEMCPY( req.payload.UID, uid, RFAL_NFCV_UID_LEN );
+        msgIt += RFAL_NFCV_UID_LEN;
+        req.payload.data[ (RFAL_NFCV_UID_LEN + msgIt++) ] = blockNum;
+    }
+    else
+    {
+        req.REQ_FLAG |= RFAL_NFCV_REQ_FLAG_SELECT;
+        req.payload.data[msgIt++] = blockNum;
+    }
+    
+    /* Transceive Command */
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, (RFAL_CMD_LEN + RFAL_NFCV_FLAG_LEN + msgIt), rxBuf, rxBufLen, rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_MAX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    /* Check if the response minimum length has been received */
+    if( (*rcvLen) < RFAL_NFCV_FLAG_LEN )
+    {
+        return ERR_PROTO;
+    }
+    
+    /* Check if an error has been signalled */
+    if( res->RES_FLAG & RFAL_NFCV_RES_FLAG_ERROR )
+    {
+        return rfalNfvParseError( *(res->data) );
+    }
+    
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfvWriteSingleBlock( uint8_t flags, uint8_t* uid, uint8_t blockNum, uint8_t* wrData, uint8_t blockLen, 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 )
+{
+    ReturnCode         ret;
+    uint16_t           rcvLen;
+    rfalNfcvGenericReq req;
+    rfalNfcvGenericRes res;
+    uint8_t            msgIt;
+
+    if( blockLen > RFAL_NFCV_MAX_BLOCK_LEN )
+    {
+        return ERR_PARAM;
+    }
+    
+    msgIt = 0;
+    
+    /* Compute Request Command */
+    req.REQ_FLAG  = (flags & (~RFAL_NFCV_REQ_FLAG_ADDRESS & ~RFAL_NFCV_REQ_FLAG_SELECT));
+    req.CMD       = RFAL_NFCF_CMD_WRITE_SINGLE_BLOCK;
+    
+    /* Check if request is to be sent in Addressed or Selected mode */
+    if( uid != NULL )
+    {
+        req.REQ_FLAG |= RFAL_NFCV_REQ_FLAG_ADDRESS;
+        ST_MEMCPY( req.payload.UID, uid, RFAL_NFCV_UID_LEN );
+        msgIt += RFAL_NFCV_UID_LEN;
+        req.payload.data[msgIt++] = blockNum;
+        ST_MEMCPY( &req.payload.data[msgIt], wrData, blockLen );
+        msgIt += blockLen;
+    }
+    else
+    {
+        req.REQ_FLAG |= RFAL_NFCV_REQ_FLAG_SELECT;
+        req.payload.data[msgIt++] = blockNum;
+        ST_MEMCPY( &req.payload.data[msgIt], wrData, blockLen );
+        msgIt += blockLen;
+    }
+    
+    /* Transceive Command */
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, (RFAL_CMD_LEN + RFAL_NFCV_FLAG_LEN + msgIt), (uint8_t*)&res, sizeof(rfalNfcvGenericRes), &rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_MAX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( ret != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    /* Check if the response minimum length has been received */
+    if( rcvLen < RFAL_NFCV_FLAG_LEN )
+    {
+        return ERR_PROTO;
+    }
+    
+    /* Check if an error has been signalled */
+    if( res.RES_FLAG & RFAL_NFCV_RES_FLAG_ERROR )
+    {
+        return rfalNfvParseError( *res.data );
+    }
+    
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalNfvReadMultipleBlocks( uint8_t flags, uint8_t* uid, uint8_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen, 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 )
+{
+    ReturnCode          ret;
+    rfalNfcvGenericReq  req;
+    rfalNfcvGenericRes  *res;
+    uint8_t             msgIt;
+    
+    msgIt = 0;
+    res   = (rfalNfcvGenericRes*)rxBuf;
+    
+    /* Compute Request Command */
+    req.REQ_FLAG  = (flags & (~RFAL_NFCV_REQ_FLAG_ADDRESS & ~RFAL_NFCV_REQ_FLAG_SELECT));
+    req.CMD       = RFAL_NFCF_CMD_READ_MULTIPLE_BLOCKS;
+    
+    /* Check if request is to be sent in Addressed or Selected mode */
+    if( uid != NULL )
+    {
+        req.REQ_FLAG |= RFAL_NFCV_REQ_FLAG_ADDRESS;
+        ST_MEMCPY( req.payload.UID, uid, RFAL_NFCV_UID_LEN );
+        msgIt += RFAL_NFCV_UID_LEN;
+        req.payload.data[ (RFAL_NFCV_UID_LEN + msgIt++) ] = firstBlockNum;
+        req.payload.data[ (RFAL_NFCV_UID_LEN + msgIt++) ] = numOfBlocks;
+    }
+    else
+    {
+        req.REQ_FLAG |= RFAL_NFCV_REQ_FLAG_SELECT;
+        req.payload.data[msgIt++] = firstBlockNum;
+        req.payload.data[msgIt++] = numOfBlocks;
+    }
+    
+    /* Transceive Command */
+    ret = rfalTransceiveBlockingTxRx( (uint8_t*)&req, (RFAL_CMD_LEN + RFAL_NFCV_FLAG_LEN + msgIt), rxBuf, rxBufLen, rcvLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_FDT_POLL_MAX, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret != ERR_NONE )
+    {
+        return ret;
+    }
+    
+    /* Check if the response minimum length has been received */
+    if( (*rcvLen) < RFAL_NFCV_FLAG_LEN )
+    {
+        return ERR_PROTO;
+    }
+    
+    /* Check if an error has been signalled */
+    if( res->RES_FLAG & RFAL_NFCV_RES_FLAG_ERROR )
+    {
+        return rfalNfvParseError( *(res->data) );
+    }
+    
+    return ERR_NONE;
+}
+
+#endif /* RFAL_FEATURE_NFCV */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_nfcv.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,388 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_nfcv.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of NFC-V Poller (ISO15693) device
+ *
+ *  The definitions and helpers methods provided by this module
+ *  are aligned with NFC-V Digital 2.0 (Candidate)
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup NFC-V
+ * @brief RFAL NFC-V Module
+ * @{
+ *
+ */
+
+#ifndef RFAL_NFCV_H
+#define RFAL_NFCV_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.h"
+#include "rfal_rf.h"
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+#define RFAL_NFCV_UID_LEN                           8    /*!< NFC-V UID length  */
+#define RFAL_NFCV_MAX_BLOCK_LEN           32    /*!< Max Block size: can be of up to 256 bits  ISO 15693 2000  5       */
+
+
+
+/*! NFC-V RequestFlags   ISO15693 2000 7.3.1 */
+enum{
+    RFAL_NFCV_REQ_FLAG_DEFAULT           = 0x02,       /*!< Default Request Flags           */
+    RFAL_NFCV_REQ_FLAG_SUB_CARRIER       = 0x01,       /*!< Sub Carrier flag                */
+    RFAL_NFCV_REQ_FLAG_DATA_RATE         = 0x02,       /*!< Data Rate flag                  */
+    RFAL_NFCV_REQ_FLAG_INVENTORY         = 0x04,       /*!< Inventory flag                  */
+    RFAL_NFCV_REQ_FLAG_PROTOCOL_EXT      = 0x08,       /*!< Protocol Extension flag         */
+    RFAL_NFCV_REQ_FLAG_SELECT            = 0x10,       /*!< Select flag                     */
+    RFAL_NFCV_REQ_FLAG_ADDRESS           = 0x20,       /*!< Address flag                    */
+    RFAL_NFCV_REQ_FLAG_OPTION            = 0x40,       /*!< Option flag                     */
+    RFAL_NFCV_REQ_FLAG_RFU               = 0x80,       /*!< RFU flag                        */
+    RFAL_NFCV_REQ_FLAG_AFI               = 0x10,       /*!< AFI flag                        */
+    RFAL_NFCV_REQ_FLAG_NB_SLOTS          = 0x20,       /*!< Number of Slots flag            */
+};
+
+/*! NFC-V Response Flags   ISO15693 2000 7.4.1 */
+enum{
+    RFAL_NFCV_RES_FLAG_ERROR             = 0x01,       /*!< Error flag                      */
+    RFAL_NFCV_RES_FLAG_RFU1              = 0x02,       /*!< RFU flag                        */
+    RFAL_NFCV_RES_FLAG_RFU2              = 0x04,       /*!< RFU flag                        */
+    RFAL_NFCV_RES_FLAG_EXTENSION         = 0x08,       /*!< Extension flag                  */
+    RFAL_NFCV_RES_FLAG_RFU3              = 0x10,       /*!< RFU flag                        */
+    RFAL_NFCV_RES_FLAG_RFU4              = 0x20,       /*!< RFU flag                        */
+    RFAL_NFCV_RES_FLAG_RFU5              = 0x40,       /*!< RFU flag                        */
+    RFAL_NFCV_RES_FLAG_RFU6              = 0x80,       /*!< RFU flag                        */
+};
+
+/*! NFC-V Error code  ISO15693 2000 7.4.2 */
+enum{
+    RFAL_NFCV_ERROR_CMD_NOT_SUPPORTED    = 0x01,       /*!< The command is not supported, code is not recognised */
+    RFAL_NFCV_ERROR_CMD_NOT_RECOGNIZED   = 0x02,       /*!< The command is not recognised, format error occurred */
+    RFAL_NFCV_ERROR_OPTION_NOT_SUPPORTED = 0x03,       /*!< The option is not supported                          */
+    RFAL_NFCV_ERROR_UNKNOWN              = 0x0F,       /*!< Unknown error                                        */
+    RFAL_NFCV_ERROR_BLOCK_NOT_AVALIABLE  = 0x10,       /*!< The specified block is not available                 */
+    RFAL_NFCV_ERROR_BLOCK_ALREDY_LOCKED  = 0x11,       /*!< The specified block is already locked                */
+    RFAL_NFCV_ERROR_BLOCK_LOCKED         = 0x12,       /*!< The specified block is locked                        */
+    RFAL_NFCV_ERROR_WRITE_FAILED         = 0x13,       /*!< The specified block was not successfully programmed  */
+    RFAL_NFCV_ERROR_BLOCK_FAILED         = 0x14,       /*!< The specified block was not successfully locked      */
+};
+
+
+/*! NFC-V command set   ISO15693 2000 9.1 */
+enum
+{
+    RFAL_NFCF_CMD_INVENTORY              = 0x01,      /*!< INVENTORY_REQ (Inventory) command                            */
+    RFAL_NFCF_CMD_SLPV                   = 0x02,      /*!< SLPV_REQ (Stay quiet) command                                */
+    RFAL_NFCF_CMD_READ_SINGLE_BLOCK      = 0x20,      /*!< Read single block command                                    */
+    RFAL_NFCF_CMD_WRITE_SINGLE_BLOCK     = 0x21,      /*!< Write single block command                                   */
+    RFAL_NFCF_CMD_LOCK_BLOCK             = 0x22,      /*!< Lock block command                                           */
+    RFAL_NFCF_CMD_READ_MULTIPLE_BLOCKS   = 0x23,      /*!< Read multiple blocks command                                 */
+    RFAL_NFCF_CMD_WRITE_MULTIPLE_BLOCKS  = 0x24,      /*!< Write multiple blocks command                                */
+    RFAL_NFCF_CMD_SELECT                 = 0x25,      /*!< Select command                                               */
+    RFAL_NFCF_CMD_RESET_TO_READY         = 0x26,      /*!< Reset To Ready command                                       */
+    RFAL_NFCF_CMD_GET_SYS_INFO           = 0x2B,      /*!< Get System Information command                               */
+    RFAL_NFCF_CMD_EXTENDED_GET_SYS_INFO  = 0x2B       /*!< Extended Get System Information command (ST Proprietary)     */
+};
+
+/*
+ ******************************************************************************
+ * 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 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-F Poller/RW (ISO15693) including all default timings
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Incorrect bitrate
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfcvPollerInitialize( 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 );
+
+/*!
+ *****************************************************************************
+ * \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
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detectedd
+ * \return ERR_NONE         : No error, one or more device in the field
+ *****************************************************************************
+ */
+ReturnCode rfalNfcvPollerCheckPresence( rfalNfcvInventoryRes *invRes, 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 );
+
+/*!
+ *****************************************************************************
+ * \brief NFC-F 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 rfalISO15693TransceiveAnticollisionEOF()
+ *
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_RF_COLLISION : Collision detected
+ * \return ERR_CRC          : CRC error detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfcvPollerInventory( rfalNfcvNumSlots nSlots, uint8_t maskLen, uint8_t *maskVal, rfalNfcvInventoryRes *invRes, uint16_t* rcvdLen, 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 );
+
+/*!
+ *****************************************************************************
+ * \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]  devLimit     : device limit value, and size nfcaDevList
+ * \param[out] nfcvDevList  : NFC-v listener devices list
+ * \param[out] devCnt       : Devices found counter
+ * \param[out] colPending   : It indicates if collsion(s) are still pending
+ *
+ * \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 rfalNfcvPollerCollisionResolution( uint8_t devLimit, rfalNfcvListenDevice *nfcvDevList, 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 );
+
+/*!
+ *****************************************************************************
+ * \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]  uid          : UID of the device to be put to Sleep
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfvPollerSleep( uint8_t flags, uint8_t* uid, 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 );
+
+/*!
+ *****************************************************************************
+ * \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 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
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfvPollerSelect( uint8_t flags, 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 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 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
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfvPollerReadSingleBlock( uint8_t flags, 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 read
+ *                             if not provided Select mode will be used
+ * \param[in]  blockNum     : Number of the block to read
+ * \param[in]  wrData       : data to be written on the given block
+ * \param[in]  blockLen     : number of bytes of a block
+ *
+ * \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
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfvPollerWriteSingleBlock( uint8_t flags, uint8_t* uid, uint8_t blockNum, 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 not provided Select mode will be used
+ * \param[in]  firstBlockNum  : first block to be 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 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
+ * \return ERR_NONE           : No error
+ *****************************************************************************
+ */
+ReturnCode rfalNfvPollerReadMultipleBlocks( uint8_t flags, uint8_t* uid, uint8_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen, 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 );
+
+ReturnCode rfalNfvSelect( uint8_t flags, uint8_t* uid, 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 );
+ReturnCode rfalNfvReadSingleBlock( uint8_t flags, uint8_t* uid, uint8_t blockNum, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen, 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 );
+ReturnCode rfalNfvWriteSingleBlock( uint8_t flags, uint8_t* uid, uint8_t blockNum, uint8_t* wrData, uint8_t blockLen, 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 );
+ReturnCode rfalNfvReadMultipleBlocks( uint8_t flags, uint8_t* uid, uint8_t firstBlockNum, uint8_t numOfBlocks, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rcvLen, 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 );
+#endif /* RFAL_NFCV_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_rf.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,3535 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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:   ST25R3911 firmware
+ *      $Revision: $
+ *      LANGUAGE:  ISO C99
+ */
+
+/*! \file
+ *
+ *  \author Gustavo Patricio 
+ *
+ *  \brief RF Abstraction Layer (RFAL)
+ *  
+ *  RFAL implementation for ST25R3911
+ */
+
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+
+
+#include "rfal_rf.h"
+
+#include <rfal_rf.h>
+#include "utils.h"
+#include "ST25R3911.h"
+#include "st25r3911_com.h"
+#include "st25r3911_interrupt.h"
+#include "rfal_AnalogConfig.h"
+#include "rfal_iso15693_2.h"
+#include "rfal_chip.h"
+#include "platform1.h"
+#include <stdint.h>
+
+/*
+******************************************************************************
+* GLOBAL TYPES
+******************************************************************************
+*/
+
+
+
+/*! Struct that holds all involved on a Transceive including the context passed by the caller     */
+typedef struct{
+    rfalTransceiveState     state;       /*!< Current transceive state                            */
+    rfalTransceiveState     lastState;   /*!< Last transceive state (debug purposes)              */
+    ReturnCode              status;      /*!< Current status/error of the transceive              */
+    bool                    rxse;        /*!< Flag indicating if RXE was received with RXS        */
+    
+    rfalTransceiveContext   ctx;         /*!< The transceive context given by the caller          */
+} rfalTxRx;
+
+
+/*! Struct that holds all context for the Listen Mode                                             */
+typedef struct{
+    rfalLmState             state;       /*!< Current Listen Mode state                           */
+    rfalBitRate             brDetected;  /*!< Last bit rate detected                              */
+    
+    uint8_t*                rxBuf;       /*!< Location to store incoming data in Listen Mode      */
+    uint16_t                rxBufLen;    /*!< Length of rxBuf                                     */
+    uint16_t*               rxLen;       /*!< Pointer to write the data length placed into rxBuf  */
+    bool                    dataFlag;    /*!< Listen Mode current Data Flag                       */
+} rfalLm;
+
+
+/*! Struct that holds all context for the Wake-Up Mode                                             */
+typedef struct{
+    rfalWumState            state;       /*!< Current Wake-Up Mode state                           */
+    st25r3911WakeUpConfig   cfg;         /*!< Current Wake-Up Mode context                         */     
+} rfalWum;
+
+
+/*! Struct that holds the timings GT and FDTs                             */
+typedef struct{
+    uint32_t                GT;          /*!< GT in 1/fc                  */
+    uint32_t                FDTListen;   /*!< FDTListen in 1/fc           */
+    uint32_t                FDTPoll;     /*!< FDTPoll in 1/fc             */
+} rfalTimings;
+
+
+/*! Struct that holds the software timers                                 */
+typedef struct{
+    uint32_t                GT;          /*!< RFAL's GT timer             */
+    uint32_t                FWT;         /*!< FWT/RWT timer for Active P2P*/
+    uint32_t                RXE;         /*!< Timer between RXS and RXE   */ 
+} rfalTimers;
+
+
+/*! Struct that holds the RFAL's callbacks                                */
+typedef struct{
+    rfalPreTxRxCallback     preTxRx;     /*!< RFAL's Pre TxRx callback    */
+    rfalPostTxRxCallback    postTxRx;    /*!< RFAL's Post TxRx callback   */
+} rfalCallbacks;
+
+
+/*! Struct that holds counters to control the FIFO on Tx and Rx                                                                          */
+typedef struct{    
+    uint16_t                expWL;       /*!< The amount of bytes expected to be Tx when a WL interrupt occours                          */
+    uint16_t                bytesTotal;  /*!< Total bytes to be transmitted OR the total bytes received                                  */
+    uint16_t                bytesWritten;/*!< Amount of bytes already written on FIFO (Tx) OR read (RX) from FIFO and written on rxBuffer*/
+    uint8_t                 status[ST25R3911_FIFO_STATUS_LEN];   /*!< FIFO Status Registers                                              */
+} rfalFIFO;
+
+
+/*! Struct that holds RFAL's configuration settings                                                      */
+typedef struct{    
+    uint8_t                 obsvModeTx;  /*!< RFAL's config of the ST25R3911's observation mode while Tx */
+    uint8_t                 obsvModeRx;  /*!< RFAL's config of the ST25R3911's observation mode while Rx */
+    rfalEHandling           eHandling;   /*!< RFAL's error handling config/mode                          */
+} rfalConfigs;
+
+
+/*! Struct that holds NFC-F data - Used only inside rfalFelicaPoll() (static to avoid adding it into stack) */
+typedef struct{    
+    rfalFeliCaPollRes pollResponses[RFAL_FELICA_POLL_MAX_SLOTS];   /* FeliCa Poll response container for 16 slots */
+} rfalNfcfWorkingData;
+
+
+/*! Struct that holds NFC-V current context
+ *
+ * 96 bytes is FIFO size of ST25R3911, codingBuffer has to be big enough for coping with maximum response size (Manchester coded)
+ *    - current implementation expects it be written in one bulk into FIFO
+ *    - needs to be above FIFO water level of ST25R3911 (64)
+ *    - 65 is actually 1 byte too much, but ~75us in 1of256 another byte is already gone
+ *    
+ *    - inventory requests responses: 14 bytes 
+ *    - Max read single block responses: 32 bytes
+ *    - Read multiple block responses: variable    
+ *    
+ *    ISO15693 frame: SOF + Flags + Data + CRC + EOF  
+ */
+typedef struct{    
+    uint8_t               codingBuffer[((2 + 255 + 3)*2)];/*!< Coding buffer,   length MUST be above 64: [65; ...]                   */
+    uint16_t              nfcvOffset;                    /*!< Offset needed for ISO15693 coding function                             */
+    rfalTransceiveContext origCtx;                       /*!< Context provided by user                                               */
+    uint16_t              ignoreBits;                    /*!< Number of bits at the beginning of a frame to be ignored when decoding */
+} rfalNfcvWorkingData;
+
+
+/*! RFAL instance  */
+typedef struct{
+    rfalState             state;     /*!< RFAL's current state                            */
+    rfalMode              mode;      /*!< RFAL's current mode                             */
+    rfalBitRate           txBR;      /*!< RFAL's current Tx Bit Rate                      */
+    rfalBitRate           rxBR;      /*!< RFAL's current Rx Bit Rate                      */
+    bool                  field;     /*!< Current field state (On / Off)                  */
+    
+    rfalConfigs           conf;      /*!< RFAL's configuration settings                   */
+    rfalTimings           timings;   /*!< RFAL's timing setting                           */
+    rfalTxRx              TxRx;      /*!< RFAL's transceive management                    */
+    rfalLm                Lm;        /*!< RFAL's listen mode management                   */
+    rfalWum               wum;       /*!< RFAL's Wake-Up mode management                  */
+    
+    rfalFIFO              fifo;      /*!< RFAL's FIFO management                          */
+    rfalTimers            tmr;       /*!< RFAL's Software timers                          */
+    rfalCallbacks         callbacks; /*!< RFAL's callbacks                                */
+    
+#if RFAL_FEATURE_NFCF
+    rfalNfcfWorkingData     nfcfData; /*!< RFAL's working data when supporting NFC-F      */
+#endif /* RFAL_FEATURE_NFCF */
+    
+#if RFAL_FEATURE_NFCV
+    rfalNfcvWorkingData     nfcvData; /*!< RFAL's working data when supporting NFC-V      */
+#endif /* RFAL_FEATURE_NFCV */
+    
+} rfal;
+
+
+
+/*! Felica's command set */
+typedef enum 
+{
+    FELICA_CMD_POLLING                  = 0x00, /*!< Felica Poll/REQC command (aka SENSF_REQ) to identify a card    */
+    FELICA_CMD_POLLING_RES              = 0x01, /*!< Felica Poll/REQC command (aka SENSF_RES) response              */
+    FELICA_CMD_REQUEST_SERVICE          = 0x02, /*!< verify the existence of Area and Service                       */
+    FELICA_CMD_REQUEST_RESPONSE         = 0x04, /*!< verify the existence of a card                                 */
+    FELICA_CMD_READ_WITHOUT_ENCRYPTION  = 0x06, /*!< read Block Data from a Service that requires no authentication */
+    FELICA_CMD_WRITE_WITHOUT_ENCRYPTION = 0x08, /*!< write Block Data to a Service that requires no authentication  */
+    FELICA_CMD_REQUEST_SYSTEM_CODE      = 0x0c, /*!< acquire the System Code registered to a card                   */
+    FELICA_CMD_AUTHENTICATION1          = 0x10, /*!< authenticate a card                                            */
+    FELICA_CMD_AUTHENTICATION2          = 0x12, /*!< allow a card to authenticate a Reader/Writer                   */
+    FELICA_CMD_READ                     = 0x14, /*!< read Block Data from a Service that requires authentication    */
+    FELICA_CMD_WRITE                    = 0x16, /*!< write Block Data to a Service that requires authentication     */
+}t_rfalFeliCaCmd;
+
+/*
+******************************************************************************
+* GLOBAL DEFINES
+******************************************************************************
+*/
+
+#define RFAL_TIMING_NONE                0x00                                         /*!< Timing disable | Don't apply                                                    */
+
+#define RFAL_FIFO_IN_LT_32              32                                           /*!< Number of bytes in the FIFO when WL interrupt occurs while Tx ( fifo_lt: 0 )    */
+#define RFAL_FIFO_IN_LT_16              16                                           /*!< Number of bytes in the FIFO when WL interrupt occurs while Tx ( fifo_lt: 1 )    */
+
+#define RFAL_FIFO_OUT_LT_32             (ST25R3911_FIFO_DEPTH - RFAL_FIFO_IN_LT_32)  /*!< Number of bytes sent/out of the FIFO when WL interrupt occurs while Tx ( fifo_lt: 0 ) */
+#define RFAL_FIFO_OUT_LT_16             (ST25R3911_FIFO_DEPTH - RFAL_FIFO_IN_LT_16)  /*!< Number of bytes sent/out of the FIFO when WL interrupt occurs while Tx ( fifo_lt: 1 ) */
+
+#define RFAL_FIFO_STATUS_REG1           0                                            /*!< Location of FIFO status register 1 in local copy                                */
+#define RFAL_FIFO_STATUS_REG2           1                                            /*!< Location of FIFO status register 2 in local copy                                */
+#define RFAL_FIFO_STATUS_INVALID        0xFF                                         /*!< Value indicating that the local FIFO status in invalid|cleared                  */
+
+#define RFAL_ST25R3911_GPT_MAX_1FC      rfalConv8fcTo1fc(  0xFFFF )                  /*!< Max GPT steps in 1fc (0xFFFF steps of 8/fc    => 0xFFFF * 590ns  = 38,7ms)      */
+#define RFAL_ST25R3911_NRT_MAX_1FC      rfalConv4096fcTo1fc( 0xFFFF )                /*!< Max NRT steps in 1fc (0xFFFF steps of 4096/fc => 0xFFFF * 302us  = 19.8s )      */
+#define RFAL_ST25R3911_NRT_DISABLED     0                                            /*!< NRT Disabled: All 0 No-response timer is not started, wait forever              */
+#define RFAL_ST25R3911_MRT_MAX_1FC      rfalConv64fcTo1fc( 0x00FF )                  /*!< Max MRT steps in 1fc (0x00FF steps of 64/fc   => 0x00FF * 4.72us = 1.2ms )      */
+#define RFAL_ST25R3911_MRT_MIN_1FC      rfalConv64fcTo1fc( 0x0004 )                  /*!< Min MRT steps in 1fc ( 0<=mrt<=4 ; 4 (64/fc)  => 0x0004 * 4.72us = 18.88us )    */
+#define RFAL_ST25R3911_GT_MAX_1FC       rfalConvMsTo1fc( 5000 )                      /*!< Max GT value allowed in 1/fc                                                    */
+#define RFAL_ST25R3911_GT_MIN_1FC       rfalConvMsTo1fc(RFAL_ST25R3911_SW_TMR_MIN_1MS)/*!< Min GT value allowed in 1/fc                                                   */
+#define RFAL_ST25R3911_SW_TMR_MIN_1MS   1                                            /*!< Min value of a SW timer in ms                                                   */
+
+#define RFAL_OBSMODE_DISABLE            0x00                                         /*!< Observation Mode disabled                                                       */
+
+#define RFAL_NFC_RX_INCOMPLETE_LEN      1                                            /*!< Threshold value where incoming rx may be considered as incomplete in NFC        */
+#define RFAL_EMVCO_RX_MAXLEN            4                                            /*!< Maximum value where EMVCo to apply special error handling                       */
+#define RFAL_EMVCO_RX_MINLEN            2                                            /*!< Minimum value where EMVCo to apply special error handling                       */
+
+#define RFAL_NORXE_TOUT                 10                                           /*!< Timeout to be used on a potential missing RXE - Silicon ST25R3911B Errata #1.1  */
+
+#define RFAL_ISO14443A_SDD_RES_LEN      5                                            /*!< SDD_RES | Anticollision (UID CLn) length  -  rfalNfcaSddRes                     */
+
+#define RFAL_FELICA_POLL_DELAY_TIME     512                                          /*!<  FeliCa Poll Processing time is 2.417 ms ~512*64/fc Digital 1.1 A4              */
+#define RFAL_FELICA_POLL_SLOT_TIME      256                                          /*!<  FeliCa Poll Time Slot duration is 1.208 ms ~256*64/fc Digital 1.1 A4           */
+
+#define RFAL_ISO15693_IGNORE_BITS       rfalConvBytesToBits(2)                       /*!< Ignore collisions before the UID (RES_FLAG + DSFID)                             */
+
+
+/*******************************************************************************/
+
+#define RFAL_LM_GT                      rfalConvUsTo1fc(100)                         /*!< Listen Mode Guard Time enforced (GT - Passive; TIRFG - Active)                  */
+#define RFAL_FDT_POLL_ADJUSTMENT        rfalConvUsTo1fc(80)                          /*!< FDT Poll adjustment: Time between the expiration of GPT to the actual Tx        */
+#define RFAL_FDT_LISTEN_MRT_ADJUSTMENT  64                                           /*!< MRT jitter adjustment: timeout will be between [ tout ; tout + 64 cycles ]      */
+#define RFAL_AP2P_FIELDOFF_TRFW         rfalConv8fcTo1fc(64)                         /*!< Time after TXE and Field Off in AP2P Trfw: 37.76us -> 64  (8/fc)                */
+
+
+/*! FWT adjustment: 
+ *    64 : NRT jitter between TXE and NRT start      */
+#define RFAL_FWT_ADJUSTMENT             64
+
+/*! FWT ISO14443A adjustment:  
+ *   512  : Initial 4bit length                      */
+#define RFAL_FWT_A_ADJUSTMENT           512
+
+/*! FWT ISO14443B adjustment:  
+ *   2784 : Adjustment for the SOF and initial byte  */
+#define RFAL_FWT_B_ADJUSTMENT           2784
+
+
+/*! FWT FeliCa 212 adjustment:  
+ *    1024 : Length of the two Sync bytes at 212kbps */
+#define RFAL_FWT_F_212_ADJUSTMENT       1024
+
+/*! FWT FeliCa 424 adjustment:  
+ *    512 : Length of the two Sync bytes at 424kbps  */
+#define RFAL_FWT_F_424_ADJUSTMENT       512
+
+
+/*! Time between our field Off and other peer field On : Tadt + (n x Trfw)
+ * Ecma 340 11.1.2 - Tadt: [56.64 , 188.72] us ;  n: [0 , 3]  ; Trfw = 37.76 us        
+ * Should be: 189 + (3*38) = 303us ; we'll use a more relaxed setting: 605 us    */
+#define RFAL_AP2P_FIELDON_TADTTRFW      rfalConvUsTo1fc(605)
+
+
+/*! FDT Poll adjustment for ISO14443A   EMVCo 2.6  4.8.1.3  ;  Digital 1.1  6.10
+ *
+ *  276: Time from the rising pulse of the pause of the logic '1' (i.e. the time point to measure the deaftime from), 
+ *       to the actual end of the EOF sequence (the point where the MRT starts). Please note that the ST25R391x uses the 
+ *       ISO14443-2 definition where the EOF consists of logic '0' followed by sequence Y. 
+ */
+#define RFAL_FDT_LISTEN_A_ADJUSTMENT    276
+
+
+/*! FDT Poll adjustment for ISO14443B   EMVCo 2.6  4.8.1.6  ;  Digital 1.1  7.9
+ *
+ *  340: Time from the rising edge of the EoS to the starting point of the MRT timer (sometime after the final high 
+ *       part of the EoS is completed).
+ *       
+ *  -64: Adjustment for the TR1PUTMIN.
+ *       The TR1PUTMIN of the ST25R3911 is 1152/fc (72/fs). The EMVCo test case TB0000 measures the TR1PUTMIN.
+ *       It takes the default value of TR1PUTMIN (79/fs) and reduces it by 128/fc in every iteration.
+ *       This results in a TR1PUTMIN of 1136/fc (71/fs) for the second iteration. The ST25R3911 sends a NAK because 
+ *       the TR1PUTMIN of the ST25R3911 (72/fs) is higher than 71/fs.
+ *       Therefore the test suite assumes TR1PUTMIN of 1264/fc (79/fs). 
+ *       The test cases TB340.0 and TB435.0 uses the TR1PUTMIN to send frames too early. In order to correctly 
+ *       recognise these frames as being sent too early (starting inside reader deaf time), the MRT has to be
+ *       increased by at least 64/fc (8/fs).
+ */
+#define RFAL_FDT_LISTEN_B_ADJUSTMENT    (340 - 64)
+
+
+
+/*
+******************************************************************************
+* GLOBAL MACROS
+******************************************************************************
+*/
+
+#define rfalCalcNumBytes( nBits )                (uint32_t)( (nBits + 7) / 8 )        /*!< Returns the number of bytes required to fit given the number of bits */
+
+#define rfalTimerStart( timer, time_ms )         timer = platformTimerCreate(time_ms) /*!< Configures and starts the RTOX timer          */
+#define rfalTimerisExpired( timer )              platformTimerIsExpired( timer )      /*!< Checks if timer has expired                   */
+
+#define rfalST25R3911ObsModeDisable()            st25r3911WriteTestRegister(0x01, 0x00, mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )                   /*!< Disable ST25R3911 Observation mode                                                               */
+#define rfalST25R3911ObsModeTx()                 st25r3911WriteTestRegister(0x01, gRFAL.conf.obsvModeTx, mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  /*!< Enable Observation mode 0x0A CSI: Digital TX modulation signal CSO: none                         */
+#define rfalST25R3911ObsModeRx()                 st25r3911WriteTestRegister(0x01, gRFAL.conf.obsvModeRx, mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  /*!< Enable Observation mode 0x04 CSI: Digital output of AM channel CSO: Digital output of PM channel */
+
+
+#define rfalCheckDisableObsMode()                if(gRFAL.conf.obsvModeRx){ rfalST25R3911ObsModeDisable(); }    /*!< Checks if the observation mode is enabled, and applies on ST25R3911 */
+#define rfalCheckEnableObsModeTx()               if(gRFAL.conf.obsvModeTx){ rfalST25R3911ObsModeTx(); }         /*!< Checks if the observation mode is enabled, and applies on ST25R3911 */
+#define rfalCheckEnableObsModeRx()               if(gRFAL.conf.obsvModeRx){ rfalST25R3911ObsModeRx(); }         /*!< Checks if the observation mode is enabled, and applies on ST25R3911 */
+
+
+#define rfalGetIncmplBits( FIFOStatus2 )         (( FIFOStatus2 >> 1) & 0x07)                                             /*!< Returns the number of bits from fifo status */
+#define rfalIsIncompleteByteError( error )       ((error >= ERR_INCOMPLETE_BYTE) && (error <= ERR_INCOMPLETE_BYTE_07))    /*!< Checks if given error is a Incomplete error */
+
+#define rfalConvBR2ACBR( b )                     (((b+1)<<RFAL_ANALOG_CONFIG_BITRATE_SHIFT) & RFAL_ANALOG_CONFIG_BITRATE_MASK) /*!< Converts ST25R391x Bit rate to Analog Configuration bit rate id */
+
+
+#define rfalIsModeActiveComm( md )               ( (md == RFAL_MODE_POLL_ACTIVE_P2P) || (md == RFAL_MODE_LISTEN_ACTIVE_P2P) )  /*!< Checks if mode md is Active Communication */
+#define rfalIsModePassiveComm( md )              ( !rfalIsModeActiveComm(md) )                                                 /*!< Checks if mode md is Passive Communication*/
+#define rfalIsModePassiveListen( md )            ( (md == RFAL_MODE_LISTEN_NFCA) || (md == RFAL_MODE_LISTEN_NFCB) || (md == RFAL_MODE_LISTEN_NFCF) ) /*!< Checks if mode md is Passive Listen */
+#define rfalIsModePassivePoll( md )              ( rfalIsModePassiveComm(md) && !rfalIsModePassiveListen(md) )                 /*!< Checks if mode md is Passive Poll         */
+
+/*
+ ******************************************************************************
+ * LOCAL VARIABLES
+ ******************************************************************************
+ */
+
+static rfal gRFAL;              /*!< RFAL module instance               */
+
+/*
+******************************************************************************
+* LOCAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+
+static void rfalTransceiveTx( 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 );
+static void rfalTransceiveRx( 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 );
+static ReturnCode rfalTransceiveRunBlockingTx( 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 );
+static void rfalPrepareTransceive( 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 );
+static void rfalCleanupTransceive( 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 );
+static void rfalErrorHandling( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+static ReturnCode rfalRunTransceiveWorker( 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 );
+static ReturnCode rfalRunListenModeWorker( 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 );
+static void rfalRunWakeUpModeWorker( 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 );
+
+static void rfalFIFOStatusUpdate( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+static void rfalFIFOStatusClear( void );
+static bool rfalFIFOStatusIsMissingPar( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+static bool rfalFIFOStatusIsIncompleteByte( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+static uint8_t rfalFIFOStatusGetNumBytes( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+static uint8_t rfalFIFOGetNumIncompleteBits( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+
+
+/*
+******************************************************************************
+* GLOBAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+ReturnCode rfalInitialize( 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 )
+{
+
+    st25r3911InitInterrupts( fieldLED_06 );
+    
+    /* Initialize chip */
+    st25r3911Initialize( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check expected chip: ST25R3911 */
+    if( !st25r3911CheckChipID( NULL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+    {
+        return ERR_HW_MISMATCH;
+    }
+    
+    /*******************************************************************************/    
+    /* Apply RF Chip general initialization */
+    rfalSetAnalogConfig( RFAL_ANALOG_CONFIG_TECH_CHIP, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+    /*******************************************************************************/
+    /* Set FIFO Water Levels to be used */
+    st25r3911ChangeRegisterBits( ST25R3911_REG_IO_CONF1, (ST25R3911_REG_IO_CONF1_fifo_lt | ST25R3911_REG_IO_CONF1_fifo_lr), (ST25R3911_REG_IO_CONF1_fifo_lt_32bytes | ST25R3911_REG_IO_CONF1_fifo_lr_64bytes), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Always have CRC in FIFO upon reception  */
+    st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_crc_2_fifo, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Enable External Field Detector */
+    st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_en_fd, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable any previous observation mode */
+    rfalST25R3911ObsModeDisable();
+    
+    /* Clear FIFO status local copy */
+    rfalFIFOStatusClear();
+    
+    
+    /*******************************************************************************/
+    /* Debug purposes */
+    /*logSetLevel( LOG_MODULE_DEFAULT, LOG_LEVEL_INFO ); !!!!!!!!!!!!!!! */
+    /* rfalSetObsvMode( 0x0A, 0x04 ); */
+    
+    /*******************************************************************************/
+    gRFAL.state              = RFAL_STATE_INIT;
+    gRFAL.mode               = RFAL_MODE_NONE;
+    gRFAL.field              = false;
+    
+    /* Set RFAL default configs */
+    gRFAL.conf.obsvModeTx    = RFAL_OBSMODE_DISABLE;
+    gRFAL.conf.obsvModeRx    = RFAL_OBSMODE_DISABLE;
+    gRFAL.conf.eHandling     = RFAL_ERRORHANDLING_NONE;
+    
+    /* Transceive set to IDLE */
+    gRFAL.TxRx.lastState     = RFAL_TXRX_STATE_IDLE;
+    gRFAL.TxRx.state         = RFAL_TXRX_STATE_IDLE;
+    
+    /* Disable all timings */
+    gRFAL.timings.FDTListen  = RFAL_TIMING_NONE;
+    gRFAL.timings.FDTPoll    = RFAL_TIMING_NONE;
+    gRFAL.timings.GT         = RFAL_TIMING_NONE;
+    
+    gRFAL.tmr.GT             = RFAL_TIMING_NONE;
+    
+    gRFAL.callbacks.preTxRx  = NULL;
+    gRFAL.callbacks.postTxRx = NULL;
+    
+#if RFAL_FEATURE_NFCV    
+    /* Initialize NFC-V Data */
+    gRFAL.nfcvData.ignoreBits = 0;
+#endif /* RFAL_FEATURE_NFCV */
+    
+    /* Initialize Listen Mode */
+    gRFAL.Lm.state           = RFAL_LM_STATE_NOT_INIT;
+    gRFAL.Lm.brDetected      = RFAL_BR_KEEP;
+    
+    /* Initialize Wake-Up Mode */
+    gRFAL.wum.state = RFAL_WUM_STATE_NOT_INIT;
+    
+    
+    /*******************************************************************************/    
+    /* Perform Automatic Calibration (if configured to do so).                     *
+     * Registers set by rfalSetAnalogConfig will tell rfalCalibrate what to perform*/
+    rfalCalibrate( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalCalibrate( 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 )
+{
+    uint16_t resValue;
+    
+    /* Check if RFAL is not initialized */
+    if( gRFAL.state == RFAL_STATE_IDLE )
+    {
+        return ERR_WRONG_STATE;
+    }
+
+    /*******************************************************************************/
+    /* Perform ST25R3911 regulators and antenna calibration                        */
+    /*******************************************************************************/
+    
+    /* Automatic regulator adjustment only performed if not set manually on Analog Configs */
+    if( st25r3911CheckReg( ST25R3911_REG_REGULATOR_CONTROL, ST25R3911_REG_REGULATOR_CONTROL_reg_s, 0x00, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+    {
+        /* Adjust the regulators so that Antenna Calibrate has better Regulator values */
+        st25r3911AdjustRegulators( &resValue, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    /* Automatic Antenna calibration only performed if not set manually on Analog Configs */
+    if( st25r3911CheckReg( ST25R3911_REG_ANT_CAL_CONTROL, ST25R3911_REG_ANT_CAL_CONTROL_trim_s, 0x00, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+    {
+        st25r3911CalibrateAntenna( (uint8_t*) &resValue, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+      
+        /*******************************************************************************/
+        /* REMARK: Silicon workaround ST25R3911 Errata #1.5                            */
+        /* Always run the command Calibrate Antenna twice                              */
+        st25r3911CalibrateAntenna( (uint8_t*) &resValue, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        /*******************************************************************************/
+        
+    }
+    else
+    {
+        /* If no antenna calibration is performed there is no need to perform second regulator adjustment again */
+        return ERR_NONE; 
+    }
+    
+    if( st25r3911CheckReg( ST25R3911_REG_REGULATOR_CONTROL, ST25R3911_REG_REGULATOR_CONTROL_reg_s, 0x00, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+    {
+        /* Adjust the regulators again with the Antenna calibrated */
+        st25r3911AdjustRegulators( &resValue, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalAdjustRegulators( uint16_t* result, 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 )
+{
+    /*******************************************************************************/
+    /* Make use of the Automatic Adjust  */
+    st25r3911ClrRegisterBits( ST25R3911_REG_REGULATOR_CONTROL, ST25R3911_REG_REGULATOR_CONTROL_reg_s, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    return st25r3911AdjustRegulators( result, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+void rfalSetUpperLayerCallback( rfalUpperLayerCallback pFunc )
+{
+    st25r3911IRQCallbackSet( pFunc );
+}
+
+
+/*******************************************************************************/
+void rfalSetPreTxRxCallback( rfalPreTxRxCallback pFunc )
+{
+    gRFAL.callbacks.preTxRx = pFunc;
+}
+
+
+/*******************************************************************************/
+void rfalSetPostTxRxCallback( rfalPostTxRxCallback pFunc )
+{
+    gRFAL.callbacks.postTxRx = pFunc;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalDeinitialize( 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 )
+{
+    /* Deinitialize chip */
+    st25r3911Deinitialize(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+ 
+    gRFAL.state = RFAL_STATE_IDLE;
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+void rfalSetObsvMode( uint8_t txMode, uint8_t rxMode )
+{
+    gRFAL.conf.obsvModeTx = txMode;
+    gRFAL.conf.obsvModeRx = rxMode;
+}
+
+
+/*******************************************************************************/
+void rfalGetObsvMode( uint8_t* txMode, uint8_t* rxMode )
+{
+    if(txMode != NULL)
+    {
+        *txMode = gRFAL.conf.obsvModeTx;
+    }
+    
+    if(rxMode != NULL)
+    {
+        *rxMode = gRFAL.conf.obsvModeRx;
+    }
+}
+
+
+/*******************************************************************************/
+void rfalDisableObsvMode( void )
+{
+    gRFAL.conf.obsvModeTx = RFAL_OBSMODE_DISABLE;
+    gRFAL.conf.obsvModeRx = RFAL_OBSMODE_DISABLE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSetMode( rfalMode mode, rfalBitRate txBR, rfalBitRate rxBR,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 )
+{
+
+    /* Check if RFAL is not initialized */
+    if( gRFAL.state == RFAL_STATE_IDLE )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    /* Check allowed bit rate value */
+    if( (txBR == RFAL_BR_KEEP) || (rxBR == RFAL_BR_KEEP) )
+    {
+        return ERR_PARAM;
+    }
+   
+    switch( mode )
+    {
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCA:
+            
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable ISO14443A mode */
+            mST25 -> writeRegister(ST25R3911_REG_MODE, ST25R3911_REG_MODE_om_iso14443a, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCA_T1T:
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable Topaz mode */
+            mST25 ->writeRegister( ST25R3911_REG_MODE, ST25R3911_REG_MODE_om_topaz, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCB:
+            
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable ISO14443B mode */
+            mST25 -> writeRegister(ST25R3911_REG_MODE, ST25R3911_REG_MODE_om_iso14443b, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set the EGT, SOF, EOF and EOF */
+            st25r3911ChangeRegisterBits(  ST25R3911_REG_ISO14443B_1, 
+                                      (ST25R3911_REG_ISO14443B_1_mask_egt | ST25R3911_REG_ISO14443B_1_mask_sof | ST25R3911_REG_ISO14443B_1_mask_eof), 
+                                      ( (0<<ST25R3911_REG_ISO14443B_1_shift_egt) | ST25R3911_REG_ISO14443B_1_sof_0_10etu | ST25R3911_REG_ISO14443B_1_sof_1_2etu),
+									  mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                        
+            /* Set the minimum TR1, SOF, EOF and EOF12 */
+            st25r3911ChangeRegisterBits( ST25R3911_REG_ISO14443B_2, 
+                                      (ST25R3911_REG_ISO14443B_2_mask_tr1 | ST25R3911_REG_ISO14443B_2_no_sof | ST25R3911_REG_ISO14443B_2_no_eof |ST25R3911_REG_ISO14443B_2_eof_12),
+                                      (ST25R3911_REG_ISO14443B_2_tr1_80fs80fs | ST25R3911_REG_ISO14443B_2_eof_12_10to11etu ),
+									  mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_B_PRIME:
+            
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable ISO14443B mode */
+            mST25->writeRegister(ST25R3911_REG_MODE, ST25R3911_REG_MODE_om_iso14443b, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+            
+            /* Set the EGT, SOF, EOF and EOF */
+            st25r3911ChangeRegisterBits(  ST25R3911_REG_ISO14443B_1, 
+                                      (ST25R3911_REG_ISO14443B_1_mask_egt | ST25R3911_REG_ISO14443B_1_mask_sof | ST25R3911_REG_ISO14443B_1_mask_eof), 
+                                      ( (0<<ST25R3911_REG_ISO14443B_1_shift_egt) | ST25R3911_REG_ISO14443B_1_sof_0_10etu | ST25R3911_REG_ISO14443B_1_sof_1_2etu),
+									  mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                        
+            /* Set the minimum TR1, EOF and EOF12 */
+            st25r3911ChangeRegisterBits( ST25R3911_REG_ISO14443B_2, 
+                                      (ST25R3911_REG_ISO14443B_2_mask_tr1 | ST25R3911_REG_ISO14443B_2_no_sof | ST25R3911_REG_ISO14443B_2_no_eof |ST25R3911_REG_ISO14443B_2_eof_12),
+                                      (ST25R3911_REG_ISO14443B_2_tr1_80fs80fs | ST25R3911_REG_ISO14443B_2_no_sof | ST25R3911_REG_ISO14443B_2_eof_12_10to12etu ),
+									  mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_B_CTS:
+            
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable ISO14443B mode */
+            mST25->writeRegister(ST25R3911_REG_MODE, ST25R3911_REG_MODE_om_iso14443b, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set the EGT, SOF, EOF and EOF */
+            st25r3911ChangeRegisterBits(  ST25R3911_REG_ISO14443B_1, 
+                                      (ST25R3911_REG_ISO14443B_1_mask_egt | ST25R3911_REG_ISO14443B_1_mask_sof | ST25R3911_REG_ISO14443B_1_mask_eof), 
+                                      ( (0<<ST25R3911_REG_ISO14443B_1_shift_egt) | ST25R3911_REG_ISO14443B_1_sof_0_10etu | ST25R3911_REG_ISO14443B_1_sof_1_2etu),
+									  mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                        
+            /* Set the minimum TR1, clear SOF, EOF and EOF12 */
+            st25r3911ChangeRegisterBits( ST25R3911_REG_ISO14443B_2, 
+                                      (ST25R3911_REG_ISO14443B_2_mask_tr1 | ST25R3911_REG_ISO14443B_2_no_sof | ST25R3911_REG_ISO14443B_2_no_eof |ST25R3911_REG_ISO14443B_2_eof_12),
+                                      (ST25R3911_REG_ISO14443B_2_tr1_80fs80fs | ST25R3911_REG_ISO14443B_2_no_sof | ST25R3911_REG_ISO14443B_2_no_eof ),
+									  mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCF:
+            
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable FeliCa mode */
+            mST25->writeRegister( ST25R3911_REG_MODE, ST25R3911_REG_MODE_om_felica, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+        
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCV:
+        case RFAL_MODE_POLL_PICOPASS:
+        
+            /* Disable wake up mode, if set */
+            st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_ACTIVE_P2P:
+            
+            /* Set NFCIP1 active communication initiator mode and Enable NFC Automatic Response RF Collision Avoidance */
+        	mST25->writeRegister(ST25R3911_REG_MODE, (ST25R3911_REG_MODE_targ_init | ST25R3911_REG_MODE_om_nfc | ST25R3911_REG_MODE_nfc_ar),
+        			mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set GPT to start after end of TX, as GPT is used in active communication mode to timeout the field switching off */
+            /* The field is turned off 37.76us after the end of the transmission  Trfw                                          */
+            st25r3911StartGPTimer_8fcs( rfalConv1fcTo8fc( RFAL_AP2P_FIELDOFF_TRFW ), ST25R3911_REG_GPT_CONTROL_gptc_etx_nfc,
+            		mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Enable External Field Detector */
+            st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_en_fd, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+        
+        /*******************************************************************************/
+        case RFAL_MODE_LISTEN_ACTIVE_P2P:
+
+            /* Set NFCIP1 active communication initiator mode and Enable NFC Automatic Response RF Collision Avoidance */
+        	mST25-> writeRegister(ST25R3911_REG_MODE, (ST25R3911_REG_MODE_targ_targ | ST25R3911_REG_MODE_om_nfcip1_normal_mode | ST25R3911_REG_MODE_nfc_ar),
+        			mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set GPT to start after end of TX, as GPT is used in active communication mode to timeout the field switching off */
+            /* The field is turned off 37.76us after the end of the transmission  Trfw                                          */
+            st25r3911StartGPTimer_8fcs( rfalConv1fcTo8fc( RFAL_AP2P_FIELDOFF_TRFW ), ST25R3911_REG_GPT_CONTROL_gptc_etx_nfc, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+            
+            /* Enable External Field Detector */
+            st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_en_fd, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Set Analog configurations for this mode and bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_LISTEN_NFCA:
+        case RFAL_MODE_LISTEN_NFCB:
+        case RFAL_MODE_LISTEN_NFCF:
+            return ERR_NOTSUPP;
+            
+        /*******************************************************************************/
+        default:
+            return ERR_NOT_IMPLEMENTED;
+    }
+    
+    /* Set state as STATE_MODE_SET only if not initialized yet (PSL) */
+    gRFAL.state = ((gRFAL.state < RFAL_STATE_MODE_SET) ? RFAL_STATE_MODE_SET : gRFAL.state);
+    gRFAL.mode  = mode;
+    
+    /* Apply the given bit rate */
+    return rfalSetBitRate(txBR, rxBR, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+rfalMode rfalGetMode( void )
+{
+    return gRFAL.mode;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSetBitRate( rfalBitRate txBR, rfalBitRate rxBR, 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 )
+{
+    ReturnCode ret;
+    
+    /* Check if RFAL is not initialized */
+    if( gRFAL.state == RFAL_STATE_IDLE )
+    {
+        return ERR_WRONG_STATE;
+    }
+   
+    /* Store the new Bit Rates */
+    gRFAL.txBR = ((txBR == RFAL_BR_KEEP) ? gRFAL.txBR : txBR);
+    gRFAL.rxBR = ((rxBR == RFAL_BR_KEEP) ? gRFAL.rxBR : rxBR);
+    
+    /* Update the bitrate reg if not in NFCV mode (streaming) */
+    if( (RFAL_MODE_POLL_NFCV != gRFAL.mode) && (RFAL_MODE_POLL_PICOPASS != gRFAL.mode) )
+    {
+        EXIT_ON_ERR( ret, st25r3911SetBitrate( gRFAL.txBR, gRFAL.rxBR, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    }
+    
+    
+    switch( gRFAL.mode )
+    {
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCA:
+        case RFAL_MODE_POLL_NFCA_T1T:
+            
+            /* Set Analog configurations for this bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCA | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCB:
+        case RFAL_MODE_POLL_B_PRIME:
+        case RFAL_MODE_POLL_B_CTS:
+            
+            /* Set Analog configurations for this bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCB | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCF:
+            
+            /* Set Analog configurations for this bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCF | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+        
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_NFCV:
+        case RFAL_MODE_POLL_PICOPASS:
+        
+           #if !RFAL_FEATURE_NFCV
+                return ERR_DISABLED;
+           #else
+               
+                if( ((gRFAL.rxBR != RFAL_BR_26p48) && (gRFAL.rxBR != RFAL_BR_52p97)) || ((gRFAL.txBR != RFAL_BR_1p66) && (gRFAL.txBR != RFAL_BR_26p48)) )
+                {
+                    return ERR_PARAM;
+                }
+        
+                {
+                    const struct iso15693StreamConfig *stream_config;
+                    iso15693PhyConfig_t                config;
+                        
+                    config.coding     = (( gRFAL.txBR == RFAL_BR_1p66  ) ? ISO15693_VCD_CODING_1_256 : ISO15693_VCD_CODING_1_4);
+                    config.fastMode   = (( gRFAL.rxBR == RFAL_BR_52p97 ) ? true : false);
+                    
+                    iso15693PhyConfigure(&config, &stream_config);
+                    st25r3911StreamConfigure((struct st25r3911StreamConfig*)stream_config, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                }
+    
+                /* Set Analog configurations for this bit rate */
+                rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_NFCV | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            
+            #endif /* RFAL_FEATURE_NFCV */
+                
+        
+        /*******************************************************************************/
+        case RFAL_MODE_POLL_ACTIVE_P2P:
+            
+            /* Set Analog configurations for this bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_POLL | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+        
+        /*******************************************************************************/
+        case RFAL_MODE_LISTEN_ACTIVE_P2P:
+            
+            /* Set Analog configurations for this bit rate */
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.txBR) | RFAL_ANALOG_CONFIG_TX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | rfalConvBR2ACBR(gRFAL.rxBR) | RFAL_ANALOG_CONFIG_RX ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_MODE_LISTEN_NFCA:
+        case RFAL_MODE_LISTEN_NFCB:
+        case RFAL_MODE_LISTEN_NFCF:
+        case RFAL_MODE_NONE:
+            return ERR_WRONG_STATE;
+            
+        /*******************************************************************************/
+        default:
+            return ERR_NOT_IMPLEMENTED;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalGetBitRate( rfalBitRate *txBR, rfalBitRate *rxBR )
+{
+    if( (gRFAL.state == RFAL_STATE_IDLE) || (gRFAL.mode == RFAL_MODE_NONE) )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    if( txBR != NULL )
+    {
+        *txBR = gRFAL.txBR;
+    }
+    
+    if( rxBR != NULL )
+    {
+        *rxBR = gRFAL.rxBR;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSetModulatedRFO( uint8_t rfo, 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 )
+{
+	  mST25->writeRegister( ST25R3911_REG_RFO_AM_ON_LEVEL, rfo, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+uint8_t rfalGetModulatedRFO( 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 )
+{
+    uint8_t ret;
+    
+    mST25->readRegister(ST25R3911_REG_RFO_AM_ON_LEVEL, &ret, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalMeasureRF( uint8_t* result, 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 )
+{
+    st25r3911MeasureRF( result, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+void rfalSetErrorHandling( rfalEHandling eHandling )
+{
+    gRFAL.conf.eHandling = eHandling;
+}
+
+
+/*******************************************************************************/
+rfalEHandling rfalGetErrorHandling( void )
+{
+    return gRFAL.conf.eHandling;
+}
+
+
+/*******************************************************************************/
+void rfalSetFDTPoll( uint32_t FDTPoll )
+{
+    gRFAL.timings.FDTPoll = MIN( FDTPoll, RFAL_ST25R3911_GPT_MAX_1FC );
+}
+
+
+/*******************************************************************************/
+uint32_t rfalGetFDTPoll( void )
+{
+    return gRFAL.timings.FDTPoll;
+}
+
+
+/*******************************************************************************/
+void rfalSetFDTListen( uint32_t FDTListen )
+{
+    gRFAL.timings.FDTListen = MIN( FDTListen, RFAL_ST25R3911_MRT_MAX_1FC);
+}
+
+/*******************************************************************************/
+uint32_t rfalGetFDTListen( void )
+{
+    return gRFAL.timings.FDTListen;
+}
+
+void rfalSetGT( uint32_t GT )
+{
+    gRFAL.timings.GT = MIN( GT, RFAL_ST25R3911_GT_MAX_1FC );
+}
+
+/*******************************************************************************/
+uint32_t rfalGetGT( void )
+{
+    return gRFAL.timings.GT;
+}
+
+/*******************************************************************************/
+bool rfalIsGTExpired( void )//check here the platform time
+{
+    if( gRFAL.tmr.GT != RFAL_TIMING_NONE )
+    {
+        if( !rfalTimerisExpired( gRFAL.tmr.GT ) )
+        {
+            return false;
+        }
+    }    
+    return true;
+}
+
+/*******************************************************************************/
+ReturnCode rfalFieldOnAndStartGT( 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 )
+{
+    ReturnCode ret;
+    
+    /* Check if RFAL has been initialized (Oscillator should be running) and also
+     * if a direct register access has been performed and left the Oscillator Off */
+    if( (gRFAL.state < RFAL_STATE_INIT) || !st25r3911CheckReg( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_en, ST25R3911_REG_OP_CONTROL_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    ret = ERR_NONE;
+    
+    /*******************************************************************************/
+    /* Perform collision avoidance and turn field On if not already On */
+    if( !gRFAL.field || !( st25r3911CheckReg(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en, ST25R3911_REG_OP_CONTROL_tx_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  ) )
+    {
+        /* Use Thresholds set by AnalogConfig */
+        ret = st25r3911PerformCollisionAvoidance( ST25R3911_CMD_RESPONSE_RF_COLLISION_0, ST25R3911_THRESHOLD_DO_NOT_SET, ST25R3911_THRESHOLD_DO_NOT_SET, 0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        gRFAL.field = ( st25r3911CheckReg(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en, ST25R3911_REG_OP_CONTROL_tx_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+        
+        /* Only turn on Receiver and Transmitter if field was successfully turned On */
+        if(gRFAL.field)
+        {            
+            st25r3911TxRxOn( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ; /* Enable Tx and Rx (Tx is already On) */
+        }
+    }
+    
+    /*******************************************************************************/
+    /* Start GT timer in case the GT value is set */
+    if( (gRFAL.timings.GT != RFAL_TIMING_NONE) )
+    {
+        /* Ensure that a SW timer doesn't have a lower value then the minimum  */
+        rfalTimerStart( gRFAL.tmr.GT, rfalConv1fcToMs( MAX( (gRFAL.timings.GT), RFAL_ST25R3911_GT_MIN_1FC) ) );
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalFieldOff( 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 )
+{
+    /* Check whether a TxRx is not yet finished */
+    if( gRFAL.TxRx.state != RFAL_TXRX_STATE_IDLE )
+    {
+        rfalCleanupTransceive(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    /* Disable Tx and Rx */
+    st25r3911TxRxOff( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    gRFAL.field = false;
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalStartTransceive( rfalTransceiveContext *ctx,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 )
+{
+    uint32_t FxTAdj;  /* FWT or FDT adjustment calculation */
+    
+    /* Ensure that RFAL is already Initialized and the mode has been set */
+    if( (gRFAL.state >= RFAL_STATE_MODE_SET) /*&& (gRFAL.TxRx.state == RFAL_TXRX_STATE_INIT )*/ )
+    {
+        /*******************************************************************************/
+        /* Check whether the field is already On, otherwise no TXE will be received  */
+        if( !( st25r3911CheckReg(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en, ST25R3911_REG_OP_CONTROL_tx_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+        		&& (!rfalIsModePassiveListen( gRFAL.mode ) && (ctx->txBuf != NULL)) )
+        {
+            return ERR_WRONG_STATE;
+        }
+        
+        gRFAL.TxRx.ctx = *ctx;
+        
+        /*******************************************************************************/
+        if( gRFAL.timings.FDTListen != RFAL_TIMING_NONE )
+        {
+            /* Calculate MRT adjustment accordingly to the current mode */
+            FxTAdj = RFAL_FDT_LISTEN_MRT_ADJUSTMENT;
+            if(gRFAL.mode == RFAL_MODE_POLL_NFCA)           FxTAdj += RFAL_FDT_LISTEN_A_ADJUSTMENT;
+            else if(gRFAL.mode == RFAL_MODE_POLL_NFCA_T1T)  FxTAdj += RFAL_FDT_LISTEN_A_ADJUSTMENT;
+            else if(gRFAL.mode == RFAL_MODE_POLL_NFCB)      FxTAdj += RFAL_FDT_LISTEN_B_ADJUSTMENT;
+            
+            
+            /* Set Minimum FDT(Listen) in which PICC is not allowed to send a response */
+                   mST25 -> writeRegister( ST25R3911_REG_MASK_RX_TIMER, rfalConv1fcTo64fc( (FxTAdj > gRFAL.timings.FDTListen) ? RFAL_ST25R3911_MRT_MIN_1FC : (gRFAL.timings.FDTListen - FxTAdj) ), mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+        }
+        
+        /*******************************************************************************/
+        /* FDT Poll will be loaded in rfalPrepareTransceive() once the previous was expired */
+        
+        /*******************************************************************************/
+        if( rfalIsModePassiveComm( gRFAL.mode ) )  /* Passive Comms */
+        {
+            if( (gRFAL.TxRx.ctx.fwt != RFAL_FWT_NONE) && (gRFAL.TxRx.ctx.fwt != 0) )
+            {
+                FxTAdj = RFAL_FWT_ADJUSTMENT;
+                if(gRFAL.mode == RFAL_MODE_POLL_NFCA)           FxTAdj += RFAL_FWT_A_ADJUSTMENT;
+                else if(gRFAL.mode == RFAL_MODE_POLL_NFCA_T1T)  FxTAdj += RFAL_FWT_A_ADJUSTMENT;
+                else if(gRFAL.mode == RFAL_MODE_POLL_NFCB)      FxTAdj += RFAL_FWT_B_ADJUSTMENT;
+                else if(gRFAL.mode == RFAL_MODE_POLL_NFCF)      
+                {
+                    FxTAdj += ((gRFAL.txBR == RFAL_BR_212) ? RFAL_FWT_F_212_ADJUSTMENT : RFAL_FWT_F_424_ADJUSTMENT );
+                }
+                
+                /* Ensure that the given FWT doesn't exceed NRT maximum */
+                gRFAL.TxRx.ctx.fwt = MIN( (gRFAL.TxRx.ctx.fwt + FxTAdj), RFAL_ST25R3911_NRT_MAX_1FC );
+                
+                /* Set FWT in the NRT */
+                st25r3911SetNoResponseTime_64fcs( rfalConv1fcTo64fc( gRFAL.TxRx.ctx.fwt ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            else
+            {
+                /* Disable NRT, no NRE will be triggered, therefore wait endlessly for Rx */
+                st25r3911SetNoResponseTime_64fcs( RFAL_ST25R3911_NRT_DISABLED, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+        }
+        else /* Active Comms */
+        {
+            /* Setup NRT timer for rf response RF collision timeout. */
+            st25r3911SetNoResponseTime_64fcs( rfalConv1fcTo64fc(RFAL_AP2P_FIELDON_TADTTRFW), mspiChannel, mST25, gpio_cs, IRQ , fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+            
+            /* In Active Mode No Response Timer cannot be used to measure FWT a SW timer is used instead */
+        }
+        
+        gRFAL.state       = RFAL_STATE_TXRX;
+        gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_IDLE;
+        gRFAL.TxRx.status = ERR_BUSY;
+        gRFAL.TxRx.rxse   = false;
+        
+    #if RFAL_FEATURE_NFCV        
+        /*******************************************************************************/
+        if( (RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) )
+        { /* Exchange receive buffer with internal buffer */
+            gRFAL.nfcvData.origCtx = gRFAL.TxRx.ctx;
+
+            gRFAL.TxRx.ctx.rxBuf    = ((gRFAL.nfcvData.origCtx.rxBuf != NULL) ? gRFAL.nfcvData.codingBuffer : NULL);
+            gRFAL.TxRx.ctx.rxBufLen = rfalConvBytesToBits(sizeof(gRFAL.nfcvData.codingBuffer));
+            gRFAL.TxRx.ctx.flags = RFAL_TXRX_FLAGS_CRC_TX_MANUAL
+                                 | RFAL_TXRX_FLAGS_CRC_RX_KEEP
+                                 | RFAL_TXRX_FLAGS_NFCIP1_OFF
+                                 | (gRFAL.nfcvData.origCtx.flags & RFAL_TXRX_FLAGS_AGC_OFF)
+                                 | RFAL_TXRX_FLAGS_PAR_RX_KEEP
+                                 | RFAL_TXRX_FLAGS_PAR_TX_NONE;
+            /* In NFCV a transceive with valid txBuf and txBufSize==0 should send first an EOF. 
+               In this case avoid below code for going directly into receive.                 */
+            if (gRFAL.TxRx.ctx.txBuf) return  ERR_NONE;
+        }
+    #endif /* RFAL_FEATURE_NFCV */
+
+        
+        /*******************************************************************************/
+        /* Check if the Transceive start performing Tx or goes directly to Rx          */
+        if( (gRFAL.TxRx.ctx.txBuf == NULL) || (gRFAL.TxRx.ctx.txBufLen == 0) )
+        {
+            /* Disable our field upon a Rx reEnable on AP2P */
+            if( rfalIsModeActiveComm(gRFAL.mode) )
+            {
+            	 st25r3911ClrRegisterBits((unsigned char)(ST25R3911_REG_OP_CONTROL),(unsigned char)(ST25R3911_REG_OP_CONTROL_tx_en), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            
+            /* Clear FIFO, Clear and Enable the Interrupts */
+            rfalPrepareTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            /* No Tx done, enable the Receiver */
+            mST25 -> executeCommand( ST25R3911_CMD_UNMASK_RECEIVE_DATA, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            /* Start NRT manually, if FWT = 0 (wait endlessly for Rx) chip will ignore anyhow */
+            mST25 -> executeCommand( ST25R3911_CMD_START_NO_RESPONSE_TIMER, mspiChannel,  gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_IDLE;
+        }
+        
+        return ERR_NONE;
+    }
+    
+    return ERR_WRONG_STATE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalTransceiveBlockingTx( uint8_t* txBuf, uint16_t txBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* actLen, uint32_t flags, uint32_t fwt, 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 )
+{
+    ReturnCode               ret;
+    rfalTransceiveContext    ctx;
+    
+    rfalCreateByteFlagsTxRxContext( ctx, txBuf, txBufLen, rxBuf, rxBufLen, actLen, flags, fwt );
+    EXIT_ON_ERR( ret, rfalStartTransceive( &ctx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    return rfalTransceiveRunBlockingTx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+static ReturnCode rfalTransceiveRunBlockingTx( 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 )
+{
+    ReturnCode ret;
+        
+    do{
+        rfalWorker(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    while( ((ret = rfalGetTransceiveStatus() ) == ERR_BUSY) && rfalIsTransceiveInTx() );
+    
+    if( rfalIsTransceiveInRx() )
+    {
+        return ERR_NONE;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalTransceiveBlockingRx( 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 )
+{
+    ReturnCode ret;
+    
+    do{
+        rfalWorker( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    while( ((ret = rfalGetTransceiveStatus() ) == ERR_BUSY) && rfalIsTransceiveInRx() );    
+        
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalTransceiveBlockingTxRx( uint8_t* txBuf, uint16_t txBufLen,
+		uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* actLen, uint32_t flags,
+		uint32_t fwt, 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 )
+{
+    ReturnCode ret;
+    
+    EXIT_ON_ERR( ret, rfalTransceiveBlockingTx( txBuf, txBufLen, rxBuf, rxBufLen, actLen, flags, fwt, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    ret = rfalTransceiveBlockingRx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+    
+    /* Convert received bits to bytes */
+    if( actLen != NULL )
+    {
+        *actLen = rfalConvBitsToBytes(*actLen);
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+static ReturnCode rfalRunTransceiveWorker( 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 )
+{
+    if( gRFAL.state == RFAL_STATE_TXRX )
+    {     
+        /* Run Tx or Rx state machines */
+        if( rfalIsTransceiveInTx() )
+        {
+            rfalTransceiveTx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            return rfalGetTransceiveStatus();
+        }
+        else if( rfalIsTransceiveInRx() )
+        {
+            rfalTransceiveRx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            return rfalGetTransceiveStatus();
+        }
+    }    
+    return ERR_WRONG_STATE;
+}
+
+/*******************************************************************************/
+rfalTransceiveState rfalGetTransceiveState( void )
+{
+    return gRFAL.TxRx.state;
+}
+
+ReturnCode rfalGetTransceiveStatus( void )
+{
+	uint16_t ERR = uint16_t(ERR_BUSY);
+    return ((gRFAL.TxRx.state == RFAL_TXRX_STATE_IDLE) ? gRFAL.TxRx.status : ERR);
+}
+
+
+/*******************************************************************************/
+void rfalWorker( 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 )
+{
+    switch( gRFAL.state )
+    {
+        case RFAL_STATE_TXRX:
+            rfalRunTransceiveWorker( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        case RFAL_STATE_LM:
+            rfalRunListenModeWorker( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        case RFAL_STATE_WUM:
+            rfalRunWakeUpModeWorker(mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            break;
+            
+        /* Nothing to be done */
+        default:            
+            break;
+    }
+}
+
+
+/*******************************************************************************/
+static void rfalErrorHandling(  ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    uint8_t fifoBytesToRead;
+    uint8_t reEnRx[] = { ST25R3911_CMD_CLEAR_FIFO, ST25R3911_CMD_UNMASK_RECEIVE_DATA };
+    
+
+    fifoBytesToRead = rfalFIFOStatusGetNumBytes(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    
+    /*******************************************************************************/
+    /* EMVCo                                                                       */
+    /*******************************************************************************/
+    if( gRFAL.conf.eHandling == RFAL_ERRORHANDLING_EMVCO )
+    {
+        /*******************************************************************************/
+        /* EMD Handling - NFC Forum Digital 1.1  4.1.1.1 ; EMVCo 2.6  4.9.2            */
+        /* ReEnable the receiver on frames with a length < 4 bytes, upon:              */
+        /*   - Collision or Framing error detected                                     */
+        /*   - Residual bits are detected (hard framing error)                         */
+        /*   - Parity error                                                            */
+        /*   - CRC error                                                               */
+        /*******************************************************************************/
+        
+        /* In case there are residual bits decrement FIFO bytes */
+        if( rfalFIFOStatusIsIncompleteByte(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  || rfalFIFOStatusIsMissingPar(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+        {
+            fifoBytesToRead--;
+        }
+            
+        if( ( (gRFAL.fifo.bytesTotal + fifoBytesToRead) < RFAL_EMVCO_RX_MAXLEN )            &&
+            ( (gRFAL.TxRx.status == ERR_RF_COLLISION) || (gRFAL.TxRx.status == ERR_FRAMING) || 
+              (gRFAL.TxRx.status == ERR_PAR)          || (gRFAL.TxRx.status == ERR_CRC)     || 
+              rfalFIFOStatusIsIncompleteByte(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )         || rfalFIFOStatusIsMissingPar(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )         ) )
+        {
+            /* Ignore this reception, ReEnable receiver */
+        	    mST25 -> executeCommands( reEnRx, sizeof(reEnRx), mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            rfalFIFOStatusClear();
+            gRFAL.fifo.bytesTotal = 0;
+            gRFAL.TxRx.status = ERR_BUSY;
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_WAIT_RXS;
+        }
+        return;
+    }
+
+    /*******************************************************************************/
+    /* ISO14443A Mode                                                              */
+    /*******************************************************************************/
+    if( gRFAL.mode == RFAL_MODE_POLL_NFCA )
+    {
+        
+        /*******************************************************************************/
+        /* If we received one incomplete byte (not a block and a incomplete byte at    *
+         * the end) we`ll raise a specific error ( support for T2T 4 bit ACK / NAK )   *
+         * Otherwise just leave it as an CRC/FRAMING/PAR error                         */    
+        /*******************************************************************************/
+        if( (gRFAL.TxRx.status == ERR_PAR) || (gRFAL.TxRx.status == ERR_CRC) )
+        {
+            if( rfalFIFOStatusIsIncompleteByte(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  && (fifoBytesToRead == RFAL_NFC_RX_INCOMPLETE_LEN) )
+            {
+                mST25 -> readFifo( (uint8_t*)(gRFAL.TxRx.ctx.rxBuf), fifoBytesToRead, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                if( gRFAL.TxRx.ctx.rxRcvdLen )  *gRFAL.TxRx.ctx.rxRcvdLen = rfalFIFOGetNumIncompleteBits(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+                gRFAL.TxRx.status = ERR_INCOMPLETE_BYTE;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+            }
+        }
+    }
+    
+}
+
+
+/*******************************************************************************/
+static void rfalCleanupTransceive( 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 )
+{
+    /*******************************************************************************/
+    /* Transceive flags                                                            */
+    /*******************************************************************************/
+    
+    /* Restore default settings on NFCIP1 mode, Receiving parity + CRC bits and manual Tx Parity*/
+    st25r3911ClrRegisterBits( ST25R3911_REG_ISO14443A_NFC, (ST25R3911_REG_ISO14443A_NFC_no_tx_par | ST25R3911_REG_ISO14443A_NFC_no_rx_par | ST25R3911_REG_ISO14443A_NFC_nfc_f0),mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Restore AGC enabled */
+    st25r3911SetRegisterBits( ST25R3911_REG_RX_CONF2, ST25R3911_REG_RX_CONF2_agc_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /*******************************************************************************/
+    
+    
+    
+    /*******************************************************************************/
+    /* Execute Post Transceive Callback                                            */
+    /*******************************************************************************/
+    if( gRFAL.callbacks.postTxRx != NULL )
+    {
+        gRFAL.callbacks.postTxRx();
+    }
+    /*******************************************************************************/
+
+}
+
+
+/*******************************************************************************/
+static void rfalPrepareTransceive( 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 )
+{
+    uint32_t maskInterrupts;
+    uint8_t  reg;
+    
+    /*******************************************************************************/
+    /* In the EMVCo mode the NRT will continue to run.                             *
+     * For the clear to stop it, the EMV mode has to be disabled before            */
+    st25r3911ClrRegisterBits( ST25R3911_REG_GPT_CONTROL, ST25R3911_REG_GPT_CONTROL_nrt_emv, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Reset receive logic */
+      mST25 -> executeCommand( ST25R3911_CMD_CLEAR_FIFO, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Reset Rx Gain */
+      mST25 -> executeCommand( ST25R3911_CMD_CLEAR_SQUELCH, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    
+    /*******************************************************************************/
+    /* FDT Poll                                                                    */
+    /*******************************************************************************/
+    if( rfalIsModePassiveComm( gRFAL.mode ) )  /* Passive Comms */
+    {
+       /* In Passive communications General Purpose Timer is used to measure FDT Poll */
+       if( gRFAL.timings.FDTPoll != RFAL_TIMING_NONE )
+       {
+           /* Configure GPT to start at RX end */
+           st25r3911StartGPTimer_8fcs( rfalConv1fcTo8fc( MIN( gRFAL.timings.FDTPoll, (gRFAL.timings.FDTPoll - RFAL_FDT_POLL_ADJUSTMENT) ) ), ST25R3911_REG_GPT_CONTROL_gptc_erx,
+        		   mspiChannel,  mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+       }
+    }
+    
+    
+    /*******************************************************************************/
+    /* Execute Pre Transceive Callback                                             */
+    /*******************************************************************************/
+    if( gRFAL.callbacks.preTxRx != NULL )
+    {
+        gRFAL.callbacks.preTxRx();
+    }
+    /*******************************************************************************/
+    
+    maskInterrupts = ( ST25R3911_IRQ_MASK_FWL  | ST25R3911_IRQ_MASK_TXE  |
+                       ST25R3911_IRQ_MASK_RXS  | ST25R3911_IRQ_MASK_RXE  |
+                       ST25R3911_IRQ_MASK_FWL  | ST25R3911_IRQ_MASK_NRE  |
+                       ST25R3911_IRQ_MASK_PAR  | ST25R3911_IRQ_MASK_CRC  |
+                       ST25R3911_IRQ_MASK_ERR1 | ST25R3911_IRQ_MASK_ERR2  );
+    
+    
+    /*******************************************************************************/
+    /* Transceive flags                                                            */
+    /*******************************************************************************/
+    
+    reg = (ST25R3911_REG_ISO14443A_NFC_no_tx_par_off | ST25R3911_REG_ISO14443A_NFC_no_rx_par_off | ST25R3911_REG_ISO14443A_NFC_nfc_f0_off);
+    
+    /* Check if NFCIP1 mode is to be enabled */
+    if( (gRFAL.TxRx.ctx.flags & RFAL_TXRX_FLAGS_NFCIP1_ON) )
+    {
+        reg |= ST25R3911_REG_ISO14443A_NFC_nfc_f0;
+    }
+    
+    /* Check if Parity check is to be skipped and to keep the parity + CRC bits in FIFO */
+    if( (gRFAL.TxRx.ctx.flags & RFAL_TXRX_FLAGS_PAR_RX_KEEP) )
+    {
+        reg |= ST25R3911_REG_ISO14443A_NFC_no_rx_par;
+    }
+
+    /* Check if automatic Parity bits is to be disabled */
+    if( (gRFAL.TxRx.ctx.flags & RFAL_TXRX_FLAGS_PAR_TX_NONE) )
+    {
+        reg |= ST25R3911_REG_ISO14443A_NFC_no_tx_par;
+    }
+    
+    /* Apply current TxRx flags on ISO14443A and NFC 106kb/s Settings Register */
+    st25r3911ChangeRegisterBits( ST25R3911_REG_ISO14443A_NFC, (ST25R3911_REG_ISO14443A_NFC_no_tx_par | ST25R3911_REG_ISO14443A_NFC_no_rx_par | ST25R3911_REG_ISO14443A_NFC_nfc_f0),
+    		reg, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    
+    /* Check if AGC is to be disabled */
+    if( (gRFAL.TxRx.ctx.flags & RFAL_TXRX_FLAGS_AGC_OFF) )
+    {
+        st25r3911ClrRegisterBits( ST25R3911_REG_RX_CONF2, ST25R3911_REG_RX_CONF2_agc_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    else
+    {
+        st25r3911SetRegisterBits( ST25R3911_REG_RX_CONF2, ST25R3911_REG_RX_CONF2_agc_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    /*******************************************************************************/
+    
+    
+
+    /*******************************************************************************/
+    /* EMVCo NRT mode                                                              */
+    /*******************************************************************************/
+    if( gRFAL.conf.eHandling == RFAL_ERRORHANDLING_EMVCO )
+    {
+        st25r3911SetRegisterBits( ST25R3911_REG_GPT_CONTROL, ST25R3911_REG_GPT_CONTROL_nrt_emv, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    else
+    {
+        st25r3911ClrRegisterBits( ST25R3911_REG_GPT_CONTROL, ST25R3911_REG_GPT_CONTROL_nrt_emv, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    /*******************************************************************************/
+    
+    
+    
+    /* In Active comms enable also External Field interrupts  */
+    if( rfalIsModeActiveComm( gRFAL.mode ) )
+    {
+        maskInterrupts |= ( ST25R3911_IRQ_MASK_EOF  | ST25R3911_IRQ_MASK_EON | ST25R3911_IRQ_MASK_CAT | ST25R3911_IRQ_MASK_CAC );
+    }
+    
+    
+    /*******************************************************************************/
+    /* clear and enable these interrupts */
+    st25r3911GetInterrupt( maskInterrupts, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    st25r3911EnableInterrupts( maskInterrupts, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Clear FIFO status local copy */
+    rfalFIFOStatusClear();
+}
+
+/*******************************************************************************/
+static void rfalTransceiveTx( 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 )
+{
+    volatile uint32_t irqs;
+    uint16_t          tmp;
+    ReturnCode        ret;
+    
+   /* NO_WARNING(ret); */
+    
+    irqs = ST25R3911_IRQ_MASK_NONE;
+    
+    if( gRFAL.TxRx.state != gRFAL.TxRx.lastState )
+    {        
+        /* rfalLogD( "RFAL: lastSt: %d curSt: %d \r\n", gRFAL.TxRx.lastState, gRFAL.TxRx.state ); */
+        gRFAL.TxRx.lastState = gRFAL.TxRx.state;
+    }
+    
+    switch( gRFAL.TxRx.state )
+    {
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_IDLE:
+            
+            /* Nothing to do */
+            
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_WAIT_GT ;
+            /* fall through */
+            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_WAIT_GT:
+            
+            if( !rfalIsGTExpired() )
+            {
+                break;
+            }
+            
+            gRFAL.tmr.GT = RFAL_TIMING_NONE;
+            
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_WAIT_FDT;
+            /* fall through */
+            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_WAIT_FDT:
+            
+            /* Only in Passive communications GPT is used to measure FDT Poll */
+            if( rfalIsModePassiveComm( gRFAL.mode ) )
+            {
+                if( ( st25r3911CheckReg(ST25R3911_REG_REGULATOR_RESULT, ST25R3911_REG_REGULATOR_RESULT_gpt_on, ST25R3911_REG_REGULATOR_RESULT_gpt_on, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  ) )
+                {                
+                   break;
+                }
+            }
+            
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_TRANSMIT;
+            /* fall through */
+            
+        
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_TRANSMIT:
+            
+            /* Clear FIFO, Clear and Enable the Interrupts */
+            rfalPrepareTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            /* Calculate when Water Level Interrupt will be triggered */
+            gRFAL.fifo.expWL = ( st25r3911CheckReg( ST25R3911_REG_IO_CONF1, ST25R3911_REG_IO_CONF1_fifo_lt, ST25R3911_REG_IO_CONF1_fifo_lt_16bytes, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  ? RFAL_FIFO_OUT_LT_16 : RFAL_FIFO_OUT_LT_32);
+            
+        #if RFAL_FEATURE_NFCV
+            /*******************************************************************************/
+            /* In NFC-V streaming mode, the FIFO needs to be loaded with the coded bits    */
+            if( (RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) )
+            {
+#if 0
+                /* Debugging code: output the payload bits by writing into the FIFO and subsequent clearing */
+                mST25 -> writeFifo(gRFAL.TxRx.ctx.txBuf, rfalConvBitsToBytes(gRFAL.TxRx.ctx.txBufLen));
+                mST25 -> executeCommand( ST25R3911_CMD_CLEAR_FIFO, mspiChannel );
+#endif
+                /* Calculate the bytes needed to be Written into FIFO (a incomplete byte will be added as 1byte) */
+                gRFAL.nfcvData.nfcvOffset = 0;
+                ret = iso15693VCDCode(gRFAL.TxRx.ctx.txBuf, rfalConvBitsToBytes(gRFAL.TxRx.ctx.txBufLen), ((gRFAL.nfcvData.origCtx.flags & RFAL_TXRX_FLAGS_CRC_TX_MANUAL)?false:true),((gRFAL.nfcvData.origCtx.flags & RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL)?false:true), (RFAL_MODE_POLL_PICOPASS == gRFAL.mode),
+                          &gRFAL.fifo.bytesTotal, &gRFAL.nfcvData.nfcvOffset, gRFAL.nfcvData.codingBuffer, MIN( ST25R3911_FIFO_DEPTH, sizeof(gRFAL.nfcvData.codingBuffer) ), &gRFAL.fifo.bytesWritten);
+
+                if( (ret != ERR_NONE) && (ret != ERR_AGAIN) )
+                {
+                    gRFAL.TxRx.status = ret;
+                    gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_FAIL;
+                    break;
+                }
+                /* Set the number of full bytes and bits to be transmitted */
+                st25r3911SetNumTxBits( rfalConvBytesToBits(gRFAL.fifo.bytesTotal), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+                /* Load FIFO with coded bytes */
+                mST25 -> writeFifo( gRFAL.nfcvData.codingBuffer, gRFAL.fifo.bytesWritten, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            }
+            /*******************************************************************************/
+            else
+        #endif /* RFAL_FEATURE_NFCV */
+            {
+                /* Calculate the bytes needed to be Written into FIFO (a incomplete byte will be added as 1byte) */
+                gRFAL.fifo.bytesTotal = rfalCalcNumBytes(gRFAL.TxRx.ctx.txBufLen);
+                
+                /* Set the number of full bytes and bits to be transmitted */
+                st25r3911SetNumTxBits( gRFAL.TxRx.ctx.txBufLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+                /* Load FIFO with total length or FIFO's maximum */
+                gRFAL.fifo.bytesWritten = MIN( gRFAL.fifo.bytesTotal, ST25R3911_FIFO_DEPTH );
+                mST25 -> writeFifo( gRFAL.TxRx.ctx.txBuf, gRFAL.fifo.bytesWritten, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+        
+            /*Check if Observation Mode is enabled and set it on ST25R391x */
+            rfalCheckEnableObsModeTx(); 
+            
+            /*******************************************************************************/
+            /* Trigger/Start transmission                                                  */
+            if( gRFAL.TxRx.ctx.flags & RFAL_TXRX_FLAGS_CRC_TX_MANUAL )
+            {
+            	mST25 -> executeCommand( ST25R3911_CMD_TRANSMIT_WITHOUT_CRC, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            else
+            {
+            	mST25 -> executeCommand( ST25R3911_CMD_TRANSMIT_WITH_CRC, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+             
+            /* Check if a WL level is expected or TXE should come */
+            gRFAL.TxRx.state = (( gRFAL.fifo.bytesWritten < gRFAL.fifo.bytesTotal ) ? RFAL_TXRX_STATE_TX_WAIT_WL : RFAL_TXRX_STATE_TX_WAIT_TXE);
+            break;
+
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_WAIT_WL:
+            
+            irqs = st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_FWL | ST25R3911_IRQ_MASK_TXE), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+               break;  /* No interrupt to process */
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_FWL) && !(irqs & ST25R3911_IRQ_MASK_TXE) )
+            {
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_RELOAD_FIFO;
+            }
+            else
+            {
+                gRFAL.TxRx.status = ERR_IO;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_FAIL;
+                break;
+            }
+            
+            /* fall through */
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_RELOAD_FIFO:
+            
+        #if RFAL_FEATURE_NFCV
+            /*******************************************************************************/
+            /* In NFC-V streaming mode, the FIFO needs to be loaded with the coded bits    */
+            if( (RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) )
+            {
+                uint16_t maxLen;
+                                
+                /* Load FIFO with the remaining length or maximum available (which fit on the coding buffer) */
+                maxLen = MIN( (gRFAL.fifo.bytesTotal - gRFAL.fifo.bytesWritten), gRFAL.fifo.expWL);
+                maxLen = MIN( maxLen, sizeof(gRFAL.nfcvData.codingBuffer) );
+                tmp    = 0;
+
+                /* Calculate the bytes needed to be Written into FIFO (a incomplete byte will be added as 1byte) */
+                ret = iso15693VCDCode(gRFAL.TxRx.ctx.txBuf, rfalConvBitsToBytes(gRFAL.TxRx.ctx.txBufLen), ((gRFAL.nfcvData.origCtx.flags & RFAL_TXRX_FLAGS_CRC_TX_MANUAL)?false:true), ((gRFAL.nfcvData.origCtx.flags & RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL)?false:true), (RFAL_MODE_POLL_PICOPASS == gRFAL.mode),
+                          &gRFAL.fifo.bytesTotal, &gRFAL.nfcvData.nfcvOffset, gRFAL.nfcvData.codingBuffer, maxLen, &tmp);
+
+                if( (ret != ERR_NONE) && (ret != ERR_AGAIN) )
+                {
+                    gRFAL.TxRx.status = ret;
+                    gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_FAIL;
+                    break;
+                }
+
+                /* Load FIFO with coded bytes */
+                mST25 -> writeFifo( gRFAL.nfcvData.codingBuffer, tmp, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            /*******************************************************************************/
+            else
+        #endif /* RFAL_FEATURE_NFCV */
+            {
+                /* Load FIFO with the remaining length or maximum available */
+                tmp = MIN( (gRFAL.fifo.bytesTotal - gRFAL.fifo.bytesWritten), gRFAL.fifo.expWL);       /* tmp holds the number of bytes written on this iteration */
+                mST25 -> writeFifo( gRFAL.TxRx.ctx.txBuf + gRFAL.fifo.bytesWritten, tmp, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            
+            /* Update total written bytes to FIFO */
+            gRFAL.fifo.bytesWritten += tmp;
+            
+            /* Check if a WL level is expected or TXE should come */
+            gRFAL.TxRx.state = (( gRFAL.fifo.bytesWritten < gRFAL.fifo.bytesTotal ) ? RFAL_TXRX_STATE_TX_WAIT_WL : RFAL_TXRX_STATE_TX_WAIT_TXE);
+            break;
+            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_WAIT_TXE:
+
+            irqs = st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_FWL | ST25R3911_IRQ_MASK_TXE), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+               break;  /* No interrupt to process */
+            }
+                        
+            
+            if( (irqs & ST25R3911_IRQ_MASK_TXE) )
+            {
+                /* In Active comm start SW timer to measure FWT */
+                if( rfalIsModeActiveComm( gRFAL.mode) && (gRFAL.TxRx.ctx.fwt != RFAL_FWT_NONE) && (gRFAL.TxRx.ctx.fwt != 0) ) 
+                {
+                    rfalTimerStart( gRFAL.tmr.FWT, rfalConv1fcToMs( gRFAL.TxRx.ctx.fwt ) );
+                }
+                
+                gRFAL.TxRx.state = RFAL_TXRX_STATE_TX_DONE;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_FWL) )
+            {
+                /*******************************************************************************/
+                /* REMARK: Silicon workaround ST25R3911 Errata #TBD                            */
+                /* ST25R3911 may send a WL even when all bytes have been written to FIFO       */
+                /*******************************************************************************/
+                break;  /* Ignore ST25R3911 FIFO WL if total TxLen is already on the FIFO */
+            }
+            else
+            {
+               gRFAL.TxRx.status = ERR_IO;
+               gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_FAIL;
+               break;
+            } // @suppress("No break at end of case")
+            
+            /* fall through */
+           
+        
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_DONE:
+            
+            /* If no rxBuf is provided do not wait/expect Rx */
+            if( gRFAL.TxRx.ctx.rxBuf == NULL )
+            {
+                /*Check if Observation Mode was enabled and disable it on ST25R391x */
+                rfalCheckDisableObsMode();
+                
+                /* Clean up Transceive */
+                rfalCleanupTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                                
+                gRFAL.TxRx.status = ERR_NONE;
+                gRFAL.TxRx.state  =  RFAL_TXRX_STATE_IDLE;
+                break;
+            }
+            
+            rfalCheckEnableObsModeRx();
+            
+            /* Goto Rx */
+            gRFAL.TxRx.state  =  RFAL_TXRX_STATE_RX_IDLE;
+            break;
+           
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_TX_FAIL:
+            
+            /* Error should be assigned by previous state */
+            if( gRFAL.TxRx.status == ERR_BUSY )
+            {
+                gRFAL.TxRx.status = ERR_SYSTEM;
+            }
+            
+            /*Check if Observation Mode was enabled and disable it on ST25R391x */
+            rfalCheckDisableObsMode();
+            
+            /* Clean up Transceive */
+            rfalCleanupTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
+            break;
+        
+        /*******************************************************************************/
+        default:
+            gRFAL.TxRx.status = ERR_SYSTEM;
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_TX_FAIL;
+            break;
+    }
+}
+
+
+/*******************************************************************************/
+static void rfalTransceiveRx( 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 )
+{
+    volatile uint32_t irqs;
+    uint8_t           tmp;
+    uint8_t           aux;
+    
+    irqs = ST25R3911_IRQ_MASK_NONE;
+    
+    if( gRFAL.TxRx.state != gRFAL.TxRx.lastState )
+    {        
+        /* rfalLogD( "RFAL: lastSt: %d curSt: %d \r\n", gRFAL.TxRx.lastState, gRFAL.TxRx.state ); */
+        gRFAL.TxRx.lastState = gRFAL.TxRx.state;
+    }
+    
+    switch( gRFAL.TxRx.state )
+    {
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_RX_IDLE:
+            
+            /* Clear rx counters */
+            gRFAL.fifo.bytesWritten   = 0;    /* Total bytes written on RxBuffer */
+            gRFAL.fifo.bytesTotal     = 0;    /* Total bytes in FIFO will now be from Rx */
+            if( gRFAL.TxRx.ctx.rxRcvdLen )  *gRFAL.TxRx.ctx.rxRcvdLen = 0;
+           
+            gRFAL.TxRx.state = ( rfalIsModeActiveComm( gRFAL.mode ) ? RFAL_TXRX_STATE_RX_WAIT_EON : RFAL_TXRX_STATE_RX_WAIT_RXS );
+            break;
+           
+           
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_RX_WAIT_RXS:
+        
+            /*******************************************************************************/
+            /* If in Active comm, Check if FWT SW timer has expired */
+            if( rfalIsModeActiveComm( gRFAL.mode ) && (gRFAL.TxRx.ctx.fwt != RFAL_FWT_NONE) && (gRFAL.TxRx.ctx.fwt != 0) )
+            {
+                if( rfalTimerisExpired( gRFAL.tmr.FWT ) )  
+                {
+                    gRFAL.TxRx.status = ERR_TIMEOUT;
+                    gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                    break;
+                }
+            }
+            
+            /*******************************************************************************/
+            irqs = st25r3911GetInterrupt( ( ST25R3911_IRQ_MASK_RXS | ST25R3911_IRQ_MASK_NRE | ST25R3911_IRQ_MASK_EOF | ST25R3911_IRQ_MASK_RXE), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+                break;  /* No interrupt to process */
+            }
+            
+                        
+            /*******************************************************************************/
+            /* REMARK: Silicon workaround ST25R3911 Errata #1.7                            */
+            /* NRE interrupt may be triggered twice                                        */
+            /* Ignore NRE if is detected together with no Rx Start                         */
+            /*******************************************************************************/
+            
+            /* Only raise Timeout if NRE is detected with no Rx Start (NRT EMV mode)       */
+            if( (irqs & ST25R3911_IRQ_MASK_NRE) && !(irqs & ST25R3911_IRQ_MASK_RXS) )
+            {
+                gRFAL.TxRx.status = ERR_TIMEOUT;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                break;
+            }
+            
+            /* Only raise Link Loss if EOF is detected with no Rx Start */
+            if( (irqs & ST25R3911_IRQ_MASK_EOF) && !(irqs & ST25R3911_IRQ_MASK_RXS) )
+            {
+                gRFAL.TxRx.status = ERR_LINK_LOSS;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                break;
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_RXS) )
+            {
+                /* If we got RXS + RXE together, jump directly into RFAL_TXRX_STATE_RX_ERR_CHECK */
+                if( (irqs & ST25R3911_IRQ_MASK_RXE) )
+                {
+                    gRFAL.TxRx.rxse  = true;
+                    gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_ERR_CHECK;
+                    break;
+                }
+                else
+                {
+                    /*******************************************************************************/
+                    /* REMARK: Silicon workaround ST25R3911 Errata #1.1                            */
+                    /* Rarely on corrupted frames I_rxs gets signaled but I_rxe is not signaled    */
+                    /* Use a SW timer to handle an eventual missing RXE                            */
+                    rfalTimerStart( gRFAL.tmr.RXE, RFAL_NORXE_TOUT );
+                    /*******************************************************************************/
+                    
+                    gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_WAIT_RXE;
+                }
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_RXE) )
+            {
+                /*******************************************************************************/
+                /* REMARK: Silicon workaround ST25R3911 Errata #1.9                            */
+                /* ST25R3911 may indicate RXE without RXS previously, this happens upon some   */
+                /* noise or incomplete byte frames with less than 4 bits                       */
+                /*******************************************************************************/
+                
+                gRFAL.TxRx.status = ERR_IO;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                
+                rfalErrorHandling(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            }
+            else
+            {
+               gRFAL.TxRx.status = ERR_IO;
+               gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+               break;
+            }
+            
+            /* fall through */
+            
+            
+        /*******************************************************************************/    
+        case RFAL_TXRX_STATE_RX_WAIT_RXE:
+            
+            irqs = st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_RXE | ST25R3911_IRQ_MASK_FWL | ST25R3911_IRQ_MASK_EOF), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+                /*******************************************************************************/
+                /* REMARK: Silicon workaround ST25R3911B Errata #1.1                           */
+                /* ST25R3911 may indicate RXS without RXE afterwards, this happens rarely on   */
+                /* corrupted frames.                                                           */
+                /* SW timer is used to timeout upon a missing RXE                              */
+                if( rfalTimerisExpired( gRFAL.tmr.RXE ) )
+                {
+                    gRFAL.TxRx.status = ERR_FRAMING;
+                    gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                }
+                /*******************************************************************************/
+                    
+                break;  /* No interrupt to process */
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_FWL) && !(irqs & ST25R3911_IRQ_MASK_RXE) )
+            {
+                gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_FIFO;
+                break;
+            }
+            
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_ERR_CHECK;
+            /* fall through */
+            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_RX_ERR_CHECK:
+        
+            /* Retrieve and check for any error irqs */
+            irqs |= st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_CRC | ST25R3911_IRQ_MASK_PAR | ST25R3911_IRQ_MASK_ERR1 | ST25R3911_IRQ_MASK_ERR2 | ST25R3911_IRQ_MASK_COL), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+            if( (irqs & ST25R3911_IRQ_MASK_ERR1) )
+            {
+                gRFAL.TxRx.status = ERR_FRAMING;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_READ_DATA;
+                
+                /* Check if there's a specific error handling for this */
+                rfalErrorHandling(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            }
+            /* Discard Soft Framing errors if not in EMVCo error handling */
+            else if( (irqs & ST25R3911_IRQ_MASK_ERR2) && (gRFAL.conf.eHandling == RFAL_ERRORHANDLING_EMVCO) )
+            {
+                gRFAL.TxRx.status = ERR_FRAMING;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_READ_DATA;
+                
+                /* Check if there's a specific error handling for this */
+                rfalErrorHandling(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_PAR) )
+            {
+                gRFAL.TxRx.status = ERR_PAR;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_READ_DATA;
+                
+                /* Check if there's a specific error handling for this */
+                rfalErrorHandling(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_CRC) )
+            {
+                gRFAL.TxRx.status = ERR_CRC;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_READ_DATA;
+                
+                /* Check if there's a specific error handling for this */
+                rfalErrorHandling(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_COL) )
+            {
+                gRFAL.TxRx.status = ERR_RF_COLLISION;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_READ_DATA;
+                
+                /* Check if there's a specific error handling for this */
+                rfalErrorHandling(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                break;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_EOF) && !(irqs & ST25R3911_IRQ_MASK_RXE) )
+            {
+                 gRFAL.TxRx.status = ERR_LINK_LOSS;
+                 gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                 break;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_RXE) || gRFAL.TxRx.rxse )
+            {
+                /* Reception ended without any error indication,                  *
+                 * check FIFO status for malformed or incomplete frames           */
+                
+                /* Check if the reception ends with an incomplete byte (residual bits) */
+                if( rfalFIFOStatusIsIncompleteByte(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+                {
+                   gRFAL.TxRx.status = ERR_INCOMPLETE_BYTE;
+                }
+                /* Check if the reception ends with missing parity bit */
+                else if( rfalFIFOStatusIsMissingPar(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+                {
+                   gRFAL.TxRx.status = ERR_FRAMING;
+                }
+                
+                gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_READ_DATA;
+            }
+            else
+            {
+                gRFAL.TxRx.status = ERR_IO;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+                break;
+            }
+                        
+            /* fall through */
+            
+            
+        /*******************************************************************************/    
+        case RFAL_TXRX_STATE_RX_READ_DATA:
+                        
+            tmp = rfalFIFOStatusGetNumBytes(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                        
+            /*******************************************************************************/
+            /* Check if CRC should not be placed in rxBuf                                  */
+            if( !(gRFAL.TxRx.ctx.flags & RFAL_TXRX_FLAGS_CRC_RX_KEEP) )
+            {
+                /* Check if CRC is being placed into the FIFO and if received frame was bigger than CRC */
+                if( ( st25r3911CheckReg(ST25R3911_REG_AUX, ST25R3911_REG_AUX_crc_2_fifo, ST25R3911_REG_AUX_crc_2_fifo, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+                		&& ( gRFAL.fifo.bytesTotal + tmp) )
+                {
+                    /* By default CRC will not be placed into the rxBuffer */
+                    if( ( tmp > RFAL_CRC_LEN) )  
+                    {
+                        tmp -= RFAL_CRC_LEN;
+                    }
+                    /* If the CRC was already placed into rxBuffer (due to WL interrupt where CRC was already in FIFO Read)
+                     * cannot remove it from rxBuf. Can only remove it from rxBufLen not indicate the presence of CRC    */ 
+                    else if(gRFAL.fifo.bytesTotal > RFAL_CRC_LEN)                       
+                    {                        
+                        gRFAL.fifo.bytesTotal -= RFAL_CRC_LEN;
+                    }
+                }
+            }
+            
+            gRFAL.fifo.bytesTotal += tmp;                    /* add to total bytes counter */
+            
+            /*******************************************************************************/
+            /* Check if remaining bytes fit on the rxBuf available                         */
+            if( gRFAL.fifo.bytesTotal > rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) )
+            {
+                tmp = ( rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) - gRFAL.fifo.bytesWritten);
+                
+                gRFAL.TxRx.status = ERR_NOMEM;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+            }
+
+            /*******************************************************************************/
+            /* Retrieve remaining bytes from FIFO to rxBuf, and assign total length rcvd   */
+            mST25 -> readFifo( (uint8_t*)(gRFAL.TxRx.ctx.rxBuf + gRFAL.fifo.bytesWritten), tmp, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( gRFAL.TxRx.ctx.rxRcvdLen )
+            {
+                (*gRFAL.TxRx.ctx.rxRcvdLen) = rfalConvBytesToBits( gRFAL.fifo.bytesTotal );
+                if( rfalFIFOStatusIsIncompleteByte(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+                {
+                    (*gRFAL.TxRx.ctx.rxRcvdLen) -= (RFAL_BITS_IN_BYTE - rfalFIFOGetNumIncompleteBits(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) );
+                }
+            }
+            
+        #if RFAL_FEATURE_NFCV
+            /*******************************************************************************/
+            /* Decode sub bit stream into payload bits for NFCV, if no error found so far  */
+            if( ((RFAL_MODE_POLL_NFCV == gRFAL.mode) || (RFAL_MODE_POLL_PICOPASS == gRFAL.mode)) && (gRFAL.TxRx.status == ERR_BUSY) )
+            {
+                ReturnCode ret;
+                uint16_t offset = 0;
+
+                ret = iso15693VICCDecode(gRFAL.TxRx.ctx.rxBuf, gRFAL.fifo.bytesTotal,
+                        gRFAL.nfcvData.origCtx.rxBuf, rfalConvBitsToBytes(gRFAL.nfcvData.origCtx.rxBufLen), &offset, gRFAL.nfcvData.origCtx.rxRcvdLen, gRFAL.nfcvData.ignoreBits, (RFAL_MODE_POLL_PICOPASS == gRFAL.mode) );
+
+                if( ((ERR_NONE == ret) || (ERR_CRC == ret))
+                     && !(RFAL_TXRX_FLAGS_CRC_RX_KEEP & gRFAL.nfcvData.origCtx.flags)
+                     &&  ((*gRFAL.nfcvData.origCtx.rxRcvdLen % RFAL_BITS_IN_BYTE) == 0)
+                     &&  (*gRFAL.nfcvData.origCtx.rxRcvdLen >= rfalConvBytesToBits(RFAL_CRC_LEN) )
+                   )
+                {
+                   *gRFAL.nfcvData.origCtx.rxRcvdLen -= rfalConvBytesToBits(RFAL_CRC_LEN); /* Remove CRC */
+                }
+                
+                /* Restore original ctx */
+                gRFAL.TxRx.ctx    = gRFAL.nfcvData.origCtx;
+                gRFAL.TxRx.status = ret;
+
+                if(gRFAL.TxRx.status)
+                {
+                    gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
+                    break;
+                }
+            }
+        #endif /* RFAL_FEATURE_NFCV */
+            
+            /*******************************************************************************/
+            /* If an error as been marked/detected don't fall into to RX_DONE  */
+            if( gRFAL.TxRx.status != ERR_BUSY )
+            {
+                gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_FAIL;
+                break;
+            }
+            
+            if( rfalIsModeActiveComm( gRFAL.mode ) )
+            {
+                gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_EOF;
+                break;
+            }
+            
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_DONE;
+            /* fall through */
+                            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_RX_DONE:
+            
+            /*Check if Observation Mode was enabled and disable it on ST25R391x */
+            rfalCheckDisableObsMode();
+            
+            /* Clean up Transceive */
+            rfalCleanupTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            
+            gRFAL.TxRx.status = ERR_NONE;
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_IDLE;
+            break;
+            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_RX_READ_FIFO:
+        
+            /*******************************************************************************/
+            /* REMARK: Silicon workaround ST25R3911B Errata #1.1                           */
+            /* ST25R3911 may indicate RXS without RXE afterwards, this happens rarely on   */
+            /* corrupted frames.                                                           */
+            /* Re-Start SW timer to handle an eventual missing RXE                         */
+            rfalTimerStart( gRFAL.tmr.RXE, RFAL_NORXE_TOUT );
+            /*******************************************************************************/        
+                    
+        
+            tmp = rfalFIFOStatusGetNumBytes(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            gRFAL.fifo.bytesTotal += tmp;
+            
+            /*******************************************************************************/
+            /* Calculate the amount of bytes that still fits in rxBuf                      */
+            aux = (( gRFAL.fifo.bytesTotal > rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) ) ? (rfalConvBitsToBytes(gRFAL.TxRx.ctx.rxBufLen) - gRFAL.fifo.bytesWritten) : tmp);
+            
+            /*******************************************************************************/
+            /* Retrieve incoming bytes from FIFO to rxBuf, and store already read amount   */
+            mST25 -> readFifo( (uint8_t*)(gRFAL.TxRx.ctx.rxBuf + gRFAL.fifo.bytesWritten), aux, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            gRFAL.fifo.bytesWritten += aux;
+            
+            /*******************************************************************************/
+            /* If the bytes already read were not the full FIFO WL, dump the remaining     *
+             * FIFO so that ST25R391x can continue with reception                             */
+            if( aux < tmp )
+            {
+                mST25 -> readFifo( NULL, (tmp - aux), mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            
+            rfalFIFOStatusClear();
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_WAIT_RXE;
+            break;
+            
+            
+        /*******************************************************************************/
+        case RFAL_TXRX_STATE_RX_FAIL:
+            
+            /*Check if Observation Mode was enabled and disable it on ST25R391x */
+            rfalCheckDisableObsMode();
+            
+            /* Clean up Transceive */
+            rfalCleanupTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Error should be assigned by previous state */
+            if( gRFAL.TxRx.status == ERR_BUSY )
+            {                
+                gRFAL.TxRx.status = ERR_SYSTEM;
+            }
+             
+            /*rfalLogD( "RFAL: curSt: %d  Error: %d \r\n", gRFAL.TxRx.state, gRFAL.TxRx.status );*/
+            gRFAL.TxRx.state = RFAL_TXRX_STATE_IDLE;
+            break;
+        
+        
+        /*******************************************************************************/    
+        case RFAL_TXRX_STATE_RX_WAIT_EON:
+            
+            irqs = st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_EON | ST25R3911_IRQ_MASK_NRE), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+                break;  /* No interrupt to process */
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_EON) )
+            {
+                gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_WAIT_RXS;
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_NRE) )
+            {
+                /* ST25R3911 uses the NRT to measure other device's Field On max time: Tadt + (n x Trfw)  */
+                gRFAL.TxRx.status = ERR_LINK_LOSS;
+                gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+            }
+            break;
+
+        
+        /*******************************************************************************/    
+        case RFAL_TXRX_STATE_RX_WAIT_EOF:
+           
+            irqs = st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_CAT | ST25R3911_IRQ_MASK_CAC), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+               break;  /* No interrupt to process */
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_CAT) )
+            {
+               gRFAL.TxRx.state = RFAL_TXRX_STATE_RX_DONE;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_CAC) )
+            {
+               gRFAL.TxRx.status = ERR_RF_COLLISION;
+               gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+            }
+            else
+            {
+               gRFAL.TxRx.status = ERR_IO;
+               gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+            }
+            break;
+            
+            
+        /*******************************************************************************/
+        default:
+            gRFAL.TxRx.status = ERR_SYSTEM;
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_FAIL;
+            break;           
+    }    
+}
+
+/*******************************************************************************/
+static void rfalFIFOStatusUpdate( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    if(gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] == RFAL_FIFO_STATUS_INVALID)
+    {
+    	   mST25 -> readMultipleRegisters( ST25R3911_REG_FIFO_RX_STATUS1, gRFAL.fifo.status, ST25R3911_FIFO_STATUS_LEN, mspiChannel,mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+}
+
+
+/*******************************************************************************/
+static void rfalFIFOStatusClear( void )
+{
+    gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] = RFAL_FIFO_STATUS_INVALID;
+}
+
+
+/*******************************************************************************/
+static uint8_t rfalFIFOStatusGetNumBytes( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    rfalFIFOStatusUpdate(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    return gRFAL.fifo.status[RFAL_FIFO_STATUS_REG1]; 
+   
+}
+
+
+/*******************************************************************************/
+static bool rfalFIFOStatusIsIncompleteByte( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    rfalFIFOStatusUpdate(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ((gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & (ST25R3911_REG_FIFO_RX_STATUS2_mask_fifo_lb | ST25R3911_REG_FIFO_RX_STATUS2_fifo_ncp)) != 0);
+}
+
+
+/*******************************************************************************/
+static bool rfalFIFOStatusIsMissingPar( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    rfalFIFOStatusUpdate(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ((gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & ST25R3911_REG_FIFO_RX_STATUS2_np_lb) != 0);
+}
+
+
+/*******************************************************************************/
+static uint8_t rfalFIFOGetNumIncompleteBits( ST25R3911* mST25, SPI * mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    rfalFIFOStatusUpdate(mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ((gRFAL.fifo.status[RFAL_FIFO_STATUS_REG2] & ST25R3911_REG_FIFO_RX_STATUS2_mask_fifo_lb) >> ST25R3911_REG_FIFO_RX_STATUS2_shift_fifo_lb);
+}
+
+
+#if RFAL_FEATURE_NFCA
+
+/*******************************************************************************/
+ReturnCode rfalISO14443ATransceiveShortFrame( rfal14443AShortFrameCmd txCmd, uint8_t* rxBuf, uint8_t rxBufLen, uint16_t* rxRcvdLen, uint32_t fwt, 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 )
+{
+    ReturnCode ret;
+    uint8_t    directCmd;
+
+    /* Check if RFAL is properly initialized */
+    if( (gRFAL.state < RFAL_STATE_MODE_SET) || (( gRFAL.mode != RFAL_MODE_POLL_NFCA ) && ( gRFAL.mode != RFAL_MODE_POLL_NFCA_T1T )) ||
+    		!( st25r3911CheckReg(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en, ST25R3911_REG_OP_CONTROL_tx_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  ) )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    /* Check for valid parameters */
+    if( (rxBuf == NULL) || (rxRcvdLen == NULL) || (fwt == RFAL_FWT_NONE) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Select the Direct Command to be performed                                   */
+    switch (txCmd)
+    {
+        case RFAL_14443A_SHORTFRAME_CMD_WUPA:
+            directCmd = ST25R3911_CMD_TRANSMIT_WUPA;
+            break;
+            
+        case RFAL_14443A_SHORTFRAME_CMD_REQA:
+            directCmd = ST25R3911_CMD_TRANSMIT_REQA;
+            break;
+            
+        default:
+            return ERR_PARAM;
+    }
+    
+    
+    /*******************************************************************************/
+    /* Enable anti collision to recognise collision in first byte of SENS_REQ */
+    st25r3911SetRegisterBits( ST25R3911_REG_ISO14443A_NFC, ST25R3911_REG_ISO14443A_NFC_antcl, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable CRC while receiving since ATQA has no CRC included */
+    st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_no_crc_rx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    
+    /*******************************************************************************/
+    /* Wait for GT and FDT */
+    while( !rfalIsGTExpired() );
+    while( st25r3911CheckReg(ST25R3911_REG_REGULATOR_RESULT, ST25R3911_REG_REGULATOR_RESULT_gpt_on, ST25R3911_REG_REGULATOR_RESULT_gpt_on, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )   );
+    
+    gRFAL.tmr.GT = RFAL_TIMING_NONE;
+
+    
+    /*******************************************************************************/
+    /* Prepare for Transceive, Receive only (bypass Tx states) */
+    gRFAL.TxRx.ctx.flags     = ( RFAL_TXRX_FLAGS_CRC_TX_MANUAL | RFAL_TXRX_FLAGS_CRC_RX_KEEP );
+    gRFAL.TxRx.ctx.rxBuf     = rxBuf;
+    gRFAL.TxRx.ctx.rxBufLen  = rxBufLen;
+    gRFAL.TxRx.ctx.rxRcvdLen = rxRcvdLen;
+    
+    /*******************************************************************************/
+    /* Load NRT with FWT */
+    st25r3911SetNoResponseTime_64fcs( rfalConv1fcTo64fc( MIN( (fwt + RFAL_FWT_ADJUSTMENT + RFAL_FWT_A_ADJUSTMENT), RFAL_ST25R3911_NRT_MAX_1FC ) ),
+    		mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( gRFAL.timings.FDTListen != RFAL_TIMING_NONE )
+    {
+        /* Set Minimum FDT(Listen) in which PICC is not allowed to send a response */
+    	mST25 -> writeRegister( ST25R3911_REG_MASK_RX_TIMER, rfalConv1fcTo64fc( ((RFAL_FDT_LISTEN_MRT_ADJUSTMENT + RFAL_FDT_LISTEN_A_ADJUSTMENT) > gRFAL.timings.FDTListen) ? RFAL_ST25R3911_MRT_MIN_1FC : (gRFAL.timings.FDTListen - (RFAL_FDT_LISTEN_MRT_ADJUSTMENT + RFAL_FDT_LISTEN_A_ADJUSTMENT)) ),
+    			mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    /* In Passive communications General Purpose Timer is used to measure FDT Poll */
+    if( gRFAL.timings.FDTPoll != RFAL_TIMING_NONE )
+    {
+        /* Configure GPT to start at RX end */
+        st25r3911StartGPTimer_8fcs( rfalConv1fcTo8fc( MIN( gRFAL.timings.FDTPoll, (gRFAL.timings.FDTPoll - RFAL_FDT_POLL_ADJUSTMENT) ) ), ST25R3911_REG_GPT_CONTROL_gptc_erx,
+        		mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    /*******************************************************************************/
+    rfalPrepareTransceive( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Also enable bit collision interrupt */
+    st25r3911GetInterrupt( ST25R3911_IRQ_MASK_COL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    st25r3911EnableInterrupts( ST25R3911_IRQ_MASK_COL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /*Check if Observation Mode is enabled and set it on ST25R391x */
+    rfalCheckEnableObsModeTx();
+    
+    /*******************************************************************************/
+    /* Chip bug: Clear nbtx bits before sending WUPA/REQA - otherwise ST25R3911 will report parity error */
+    mST25 -> writeRegister( ST25R3911_REG_NUM_TX_BYTES2, 0, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+    /* Send either WUPA or REQA. All affected tags will backscatter ATQA and change to READY state */
+    mST25 -> executeCommand( directCmd, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Wait for TXE */
+    if( !st25r3911WaitForInterruptsTimed( ST25R3911_IRQ_MASK_TXE, MAX( rfalConv1fcToMs( fwt ), RFAL_ST25R3911_SW_TMR_MIN_1MS ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+    {
+        ret = ERR_IO;
+    }
+    else
+    {
+        /*Check if Observation Mode is enabled and set it on ST25R391x */
+        rfalCheckEnableObsModeRx();
+        
+        /* Jump into a transceive Rx state for reception (bypass Tx states) */
+        gRFAL.state       = RFAL_STATE_TXRX;
+        gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_IDLE;
+        gRFAL.TxRx.status = ERR_BUSY;
+        
+        /* Execute Transceive Rx blocking */
+        ret = rfalTransceiveBlockingRx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    
+    
+    /* Disable Collision interrupt */
+    st25r3911DisableInterrupts( (ST25R3911_IRQ_MASK_COL), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable anti collision again */
+    st25r3911ClrRegisterBits( ST25R3911_REG_ISO14443A_NFC, ST25R3911_REG_ISO14443A_NFC_antcl, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* ReEnable CRC on Rx */
+    st25r3911ClrRegisterBits(ST25R3911_REG_AUX, ST25R3911_REG_AUX_no_crc_rx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+    
+    return ret;
+}
+
+/*******************************************************************************/
+ReturnCode rfalISO14443ATransceiveAnticollisionFrame( uint8_t *buf, uint8_t *bytesToSend, uint8_t *bitsToSend,
+		uint16_t *rxLength, uint32_t fwt, 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 )
+{
+    ReturnCode            ret;
+    rfalTransceiveContext ctx;
+    uint8_t               collByte;
+    uint8_t               collData;
+    
+    /* Check if RFAL is properly initialized */
+    if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCA ) )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    /* Check for valid parameters */
+    if( (buf == NULL) || (bytesToSend == NULL) || (bitsToSend == NULL) || (rxLength == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /*******************************************************************************/
+    /* Enable anti collision to recognise collision in first byte of SENS_REQ */
+    st25r3911SetRegisterBits( ST25R3911_REG_ISO14443A_NFC, ST25R3911_REG_ISO14443A_NFC_antcl, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable CRC while receiving */
+    st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_no_crc_rx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    
+    
+    /*******************************************************************************/
+    /* Prepare for Transceive                                                      */
+    ctx.flags     = ( RFAL_TXRX_FLAGS_CRC_TX_MANUAL | RFAL_TXRX_FLAGS_CRC_RX_KEEP | RFAL_TXRX_FLAGS_AGC_OFF );  /* Disable Automatic Gain Control (AGC) for better detection of collision */
+    ctx.txBuf     = buf;
+    ctx.txBufLen  = (rfalConvBytesToBits( *bytesToSend ) + *bitsToSend );
+    ctx.rxBuf     = (buf + (*bytesToSend));
+    ctx.rxBufLen  = rfalConvBytesToBits( RFAL_ISO14443A_SDD_RES_LEN );
+    ctx.rxRcvdLen = rxLength;
+    ctx.fwt       = fwt;
+    
+    rfalStartTransceive( &ctx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Additionally enable bit collision interrupt */
+    st25r3911GetInterrupt( ST25R3911_IRQ_MASK_COL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    st25r3911EnableInterrupts( ST25R3911_IRQ_MASK_COL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /*******************************************************************************/
+    collByte = 0;
+    
+    /* save the collision byte */
+    if ((*bitsToSend) > 0)
+    {
+        buf[(*bytesToSend)] <<= (RFAL_BITS_IN_BYTE - (*bitsToSend));
+        buf[(*bytesToSend)] >>= (RFAL_BITS_IN_BYTE - (*bitsToSend));
+        collByte = buf[(*bytesToSend)];
+    }
+    
+    
+    /*******************************************************************************/
+    /* Run Transceive blocking */
+    ret = rfalTransceiveRunBlockingTx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret == ERR_NONE)
+    {
+       ret = rfalTransceiveBlockingRx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+    
+       /*******************************************************************************/
+       if ((*bitsToSend) > 0)
+       {
+           buf[(*bytesToSend)] >>= (*bitsToSend);
+           buf[(*bytesToSend)] <<= (*bitsToSend);
+           buf[(*bytesToSend)] |= collByte;
+       }
+       
+       if( (ERR_RF_COLLISION == ret) )
+       {                      
+           /* read out collision register */
+    	   mST25 -> readRegister( ST25R3911_REG_COLLISION_STATUS, &collData, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+           (*bytesToSend) = ((collData >> ST25R3911_REG_COLLISION_STATUS_shift_c_byte) & 0x0F); /* 4-bits Byte information */
+           (*bitsToSend)  = ((collData >> ST25R3911_REG_COLLISION_STATUS_shift_c_bit)  & 0x07); /* 3-bits bit information */
+
+       }
+    }
+    
+   
+    /*******************************************************************************/
+    /* Disable Collision interrupt */
+    st25r3911DisableInterrupts( (ST25R3911_IRQ_MASK_COL), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable anti collision again */
+    st25r3911ClrRegisterBits( ST25R3911_REG_ISO14443A_NFC, ST25R3911_REG_ISO14443A_NFC_antcl, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* ReEnable CRC on Rx */
+    st25r3911ClrRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_no_crc_rx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    return ret;
+}
+
+#endif /* RFAL_FEATURE_NFCA */
+
+#if RFAL_FEATURE_NFCV
+
+/*******************************************************************************/
+ReturnCode rfalISO15693TransceiveAnticollisionFrame( uint8_t *txBuf, uint8_t txBufLen, uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen, 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 )
+{
+    ReturnCode            ret;
+    rfalTransceiveContext ctx;
+    
+    /* Check if RFAL is properly initialized */
+    if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCV ) )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    /* Ignoring collisions before the UID (RES_FLAG + DSFID) */
+    gRFAL.nfcvData.ignoreBits = RFAL_ISO15693_IGNORE_BITS;
+    
+    /*******************************************************************************/
+    /* Prepare for Transceive  */
+    ctx.flags     = ( ((txBufLen==0)?RFAL_TXRX_FLAGS_CRC_TX_MANUAL:RFAL_TXRX_FLAGS_CRC_TX_AUTO) | RFAL_TXRX_FLAGS_CRC_RX_KEEP | RFAL_TXRX_FLAGS_AGC_OFF | ((txBufLen==0)?RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL:RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO) ); /* Disable Automatic Gain Control (AGC) for better detection of collision */
+    ctx.txBuf     = txBuf;
+    ctx.txBufLen  = rfalConvBytesToBits(txBufLen);
+    ctx.rxBuf     = rxBuf;
+    ctx.rxBufLen  = rfalConvBytesToBits(rxBufLen);
+    ctx.rxRcvdLen = actLen;
+    ctx.fwt       = rfalConv64fcTo1fc(ISO15693_NO_RESPONSE_TIME);
+    
+    rfalStartTransceive( &ctx, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /*******************************************************************************/
+    /* Run Transceive blocking */
+    ret = rfalTransceiveRunBlockingTx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret == ERR_NONE)
+    {
+        ret = rfalTransceiveBlockingRx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+        
+    gRFAL.nfcvData.ignoreBits = 0;
+    return ret;
+}
+
+/*******************************************************************************/
+ReturnCode rfalISO15693TransceiveAnticollisionEOF( uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen, 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 )
+{
+    uint8_t dummy;
+
+    return rfalISO15693TransceiveAnticollisionFrame( &dummy, 0, rxBuf, rxBufLen, actLen, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+/*******************************************************************************/
+ReturnCode rfalISO15693TransceiveEOF( uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen,
+		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 )
+{
+    ReturnCode ret;
+    uint8_t    dummy;
+    
+    /* Check if RFAL is properly initialized */
+    if( ( gRFAL.state < RFAL_STATE_MODE_SET ) || ( gRFAL.mode != RFAL_MODE_POLL_NFCV ) )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    /*******************************************************************************/
+    /* Run Transceive blocking */
+    ret = rfalTransceiveBlockingTxRx( &dummy,
+                                      0,
+                                      rxBuf,
+                                      rxBufLen,
+                                      actLen,
+                                      ( RFAL_TXRX_FLAGS_CRC_TX_MANUAL | RFAL_TXRX_FLAGS_CRC_RX_KEEP | RFAL_TXRX_FLAGS_AGC_ON ),
+                                      rfalConv64fcTo1fc(ISO15693_NO_RESPONSE_TIME), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ret;
+}
+
+#endif  /* RFAL_FEATURE_NFCV */
+
+#if RFAL_FEATURE_NFCF
+
+/*******************************************************************************/
+ReturnCode rfalFeliCaPoll( rfalFeliCaPollSlots slots, uint16_t sysCode, uint8_t reqCode, rfalFeliCaPollRes* pollResList, uint8_t pollResListSize, uint8_t *devicesDetected,
+		uint8_t *collisionsDetected, 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 )
+{
+    ReturnCode        ret;
+    uint8_t           frame[RFAL_FELICA_POLL_REQ_LEN - RFAL_FELICA_LEN_LEN];  /* LEN is added by ST25R3911 automatically */
+    uint16_t          actLen;
+    uint8_t           frameIdx;
+    uint8_t           devDetected;
+    uint8_t           colDetected;
+    rfalEHandling     curHandling;
+    
+    int index = (int)slots;
+
+    /* Check if RFAL is properly initialized */
+    if( (gRFAL.state < RFAL_STATE_MODE_SET) || ( gRFAL.mode != RFAL_MODE_POLL_NFCF ) )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    frameIdx    = 0;
+    colDetected = 0;
+    devDetected = 0;
+    
+    /*******************************************************************************/
+    /* Compute SENSF_REQ frame */
+    frame[frameIdx++] =  FELICA_CMD_POLLING;       /* CMD: SENF_REQ                       */
+    frame[frameIdx++] = (uint8_t)(sysCode >> 8);   /* System Code (SC)                    */
+    frame[frameIdx++] = (uint8_t)(sysCode & 0xFF); /* System Code (SC)                    */
+    frame[frameIdx++] = reqCode;                   /* Communication Parameter Request (RC)*/
+    frame[frameIdx++] = (uint8_t)slots;            /* TimeSlot (TSN)                      */
+    
+    
+    /*******************************************************************************/
+    /* NRT should not stop on reception - Use EMVCo mode to run NRT in nrt_emv     *
+     * ERRORHANDLING_EMVCO has no special handling for NFC-F mode                  */
+    curHandling = gRFAL.conf.eHandling;
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_EMVCO );
+    
+    /*******************************************************************************/
+    /* Run transceive blocking, 
+     * Calculate Total Response Time in(64/fc): 
+     *                       512 PICC process time + (n * 256 Time Slot duration)  */
+    ret = rfalTransceiveBlockingTx( frame, 
+                                    frameIdx, 
+                                    (uint8_t*)gRFAL.nfcfData.pollResponses, 
+                                    RFAL_FELICA_POLL_RES_LEN, 
+                                    &actLen,
+                                    (RFAL_TXRX_FLAGS_DEFAULT),
+                                    rfalConv64fcTo1fc( RFAL_FELICA_POLL_DELAY_TIME + (RFAL_FELICA_POLL_SLOT_TIME * (slots + 1)) ),
+									mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+
+    /*******************************************************************************/
+    /* If Tx OK, Wait for all responses, store them as soon as they appear         */
+    if( ret == ERR_NONE )
+    {
+        do 
+        {
+            ret = rfalTransceiveBlockingRx( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( ret == ERR_TIMEOUT )
+            {
+                /* Upon timeout the full Poll Delay + (Slot time)*(slots) has expired */
+                break;
+            }
+            else
+            {
+                /* Reception done, reEnabled Rx for following Slot */
+            	mST25 -> executeCommand( ST25R3911_CMD_UNMASK_RECEIVE_DATA, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            	mST25 -> executeCommand( ST25R3911_CMD_CLEAR_SQUELCH, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+                /* If the reception was OK, new device found */
+                if( ret == ERR_NONE )
+                {
+                   devDetected++;
+                   
+                   /* Overwrite the Transceive context for the next reception */
+                   gRFAL.TxRx.ctx.rxBuf = (uint8_t*)gRFAL.nfcfData.pollResponses[devDetected];
+                }
+                /* If the reception was not OK, mark as collision */
+                else
+                {
+                    colDetected++;
+                }
+                
+                /* Check whether NRT has expired meanwhile  */
+                if( st25r3911CheckReg( ST25R3911_REG_REGULATOR_RESULT, ST25R3911_REG_REGULATOR_RESULT_nrt_on, 0x00, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+                {
+                    break;
+                }
+            }
+            
+            /* Jump again into transceive Rx state for the following reception */
+            gRFAL.TxRx.status = ERR_BUSY;
+            gRFAL.state       = RFAL_STATE_TXRX;
+            gRFAL.TxRx.state  = RFAL_TXRX_STATE_RX_IDLE;
+            
+        }while(index--);
+    }
+    
+    /*******************************************************************************/
+    /* Restore NRT to normal mode - back to previous error handling */
+    rfalSetErrorHandling( curHandling );
+    
+    /*******************************************************************************/
+    /* Assign output parameters if requested                                       */
+    
+    if( (pollResList != NULL) && (pollResListSize > 0) && (devDetected > 0) )
+    {
+        ST_MEMCPY( pollResList, gRFAL.nfcfData.pollResponses, (RFAL_FELICA_POLL_RES_LEN * MIN(pollResListSize, devDetected) ) );
+    }
+    
+    if( devicesDetected != NULL )
+    {
+        *devicesDetected = devDetected;
+    }
+    
+    if( collisionsDetected != NULL )
+    {
+        *collisionsDetected = colDetected;
+    }
+    uint16_t ERR_NONEUI = ERR_NONE;
+    return (( colDetected || devDetected ) ? ERR_NONEUI : ret);
+}
+
+#endif /* RFAL_FEATURE_NFCF */
+
+
+/*****************************************************************************
+ *  Listen Mode                                                              *
+ *****************************************************************************/
+
+
+
+/*******************************************************************************/
+bool rfalIsExtFieldOn( 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 )
+{
+    return st25r3911CheckReg(ST25R3911_REG_AUX_DISPLAY, ST25R3911_REG_AUX_DISPLAY_efd_o, ST25R3911_REG_AUX_DISPLAY_efd_o, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalListenStart( uint32_t lmMask, rfalLmConfPA *confA, rfalLmConfPB *confB,
+		rfalLmConfPF *confF, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rxLen,
+		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 )
+{
+    NO_WARNING(confA);
+    NO_WARNING(confB);
+    NO_WARNING(confF);
+    
+    
+    gRFAL.Lm.state  = RFAL_LM_STATE_NOT_INIT;
+    
+    
+    /*******************************************************************************/
+    if( (lmMask & RFAL_LM_MASK_NFCA) || (lmMask & RFAL_LM_MASK_NFCB) || (lmMask & RFAL_LM_MASK_NFCF) )
+    {
+        return ERR_NOTSUPP;
+    }
+    
+    
+
+    /*******************************************************************************/
+    if( (lmMask & RFAL_LM_MASK_ACTIVE_P2P) )
+    {
+        gRFAL.state       = RFAL_STATE_LM;
+       
+        gRFAL.Lm.rxBuf    = rxBuf;
+        gRFAL.Lm.rxBufLen = rxBufLen;
+        gRFAL.Lm.rxLen    = rxLen;
+        *gRFAL.Lm.rxLen   = 0;
+        gRFAL.Lm.dataFlag = false;
+        
+        /* On Bit Rate Detection Mode ST25R391x will filter incoming frames during MRT time starting on External Field On event, use 512/fc steps */
+        mST25 -> writeRegister( ST25R3911_REG_MASK_RX_TIMER, rfalConv1fcTo512fc( RFAL_LM_GT ), mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* Restore default settings on NFCIP1 mode, Receiving parity + CRC bits and manual Tx Parity*/
+        st25r3911ClrRegisterBits( ST25R3911_REG_ISO14443A_NFC,
+        		(ST25R3911_REG_ISO14443A_NFC_no_tx_par | ST25R3911_REG_ISO14443A_NFC_no_rx_par | ST25R3911_REG_ISO14443A_NFC_nfc_f0),
+				mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* Enable External Field Detector */
+        st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_en_fd, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+      
+        /* Enable Receiver */
+        st25r3911ChangeRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_rx_en, ST25R3911_REG_OP_CONTROL_rx_en,
+        		mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* Set Analog configurations for generic Listen mode */
+        /* Not on SetState(POWER OFF) as otherwise would be applied on every Field Event */
+        rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_TX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        rfalSetAnalogConfig( (RFAL_ANALOG_CONFIG_LISTEN | RFAL_ANALOG_CONFIG_TECH_AP2P | RFAL_ANALOG_CONFIG_BITRATE_COMMON | RFAL_ANALOG_CONFIG_RX), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* Initialize as POWER_OFF and set proper mode in RF Chip */
+        rfalListenSetState( RFAL_LM_STATE_POWER_OFF, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    }
+    else
+    {
+        return ERR_REQUEST;   /* Listen Start called but no mode was enabled */
+    }
+    
+    return ERR_NONE;
+}
+
+
+
+/*******************************************************************************/
+static ReturnCode rfalRunListenModeWorker( 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 )
+{
+    volatile uint32_t irqs;
+    uint8_t           tmp;
+    
+    if( gRFAL.state != RFAL_STATE_LM )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    switch( gRFAL.Lm.state )
+    {
+        /*******************************************************************************/
+        case RFAL_LM_STATE_POWER_OFF:
+            
+            irqs = st25r3911GetInterrupt( (  ST25R3911_IRQ_MASK_EON ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+              break;  /* No interrupt to process */
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_EON) )
+            {
+                rfalListenSetState( RFAL_LM_STATE_IDLE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            else
+            {
+                break;
+            }
+            /* fall through */
+            
+              
+        /*******************************************************************************/
+        case RFAL_LM_STATE_IDLE:
+            
+            irqs = st25r3911GetInterrupt( ( ST25R3911_IRQ_MASK_NFCT | ST25R3911_IRQ_MASK_RXE | ST25R3911_IRQ_MASK_EOF ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+                break;  /* No interrupt to process */
+            }
+            
+            if( (irqs & ST25R3911_IRQ_MASK_NFCT) )
+            {
+                /* Retrieve bitrate detected */
+            	mST25 -> readRegister( ST25R3911_REG_NFCIP1_BIT_RATE, (uint8_t*)&gRFAL.Lm.brDetected,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            //	rfalBitRate test = RFAL_BR_1695;
+            	gRFAL.Lm.brDetected = (rfalBitRate)((int)gRFAL.Lm.brDetected >> ST25R3911_REG_NFCIP1_BIT_RATE_nfc_rate_shift);
+				//(rfalBitRate) ST25R3911_REG_NFCIP1_BIT_RATE_nfc_rate_shift;
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_RXE) && (gRFAL.Lm.brDetected != RFAL_BR_KEEP) )
+            {
+                irqs = st25r3911GetInterrupt( ( ST25R3911_IRQ_MASK_RXE | ST25R3911_IRQ_MASK_EOF | ST25R3911_IRQ_MASK_CRC | ST25R3911_IRQ_MASK_PAR | ST25R3911_IRQ_MASK_ERR2 | ST25R3911_IRQ_MASK_ERR1 ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+                if( (irqs & ST25R3911_IRQ_MASK_CRC) || (irqs & ST25R3911_IRQ_MASK_PAR) || (irqs & ST25R3911_IRQ_MASK_ERR1) )
+                {
+                    /* nfc_ar may have triggered RF Collision Avoidance, disable it before executing Clear (Stop All activities) */
+                    st25r3911ClrRegisterBits( ST25R3911_REG_MODE, ST25R3911_REG_MODE_nfc_ar, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                    mST25 -> executeCommand( ST25R3911_CMD_CLEAR_FIFO,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                    mST25 -> executeCommand( ST25R3911_CMD_UNMASK_RECEIVE_DATA,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                    st25r3911SetRegisterBits( ST25R3911_REG_MODE, ST25R3911_REG_MODE_nfc_ar, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                    st25r3911ClrRegisterBits(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                    break; /* A bad reception occurred, remain in same state */
+                }
+                
+                /* Retrieve received data */
+                mST25 -> readRegister(ST25R3911_REG_FIFO_RX_STATUS1, &tmp,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                *gRFAL.Lm.rxLen = tmp;
+                
+                mST25 -> readFifo( gRFAL.Lm.rxBuf, MIN( *gRFAL.Lm.rxLen, rfalConvBitsToBytes(gRFAL.Lm.rxBufLen) ), mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+                /* Check if the data we got has at least the CRC and remove it, otherwise leave at 0 */
+                *gRFAL.Lm.rxLen  -= ((*gRFAL.Lm.rxLen > RFAL_CRC_LEN) ? RFAL_CRC_LEN : *gRFAL.Lm.rxLen);
+                *gRFAL.Lm.rxLen   = rfalConvBytesToBits( *gRFAL.Lm.rxLen );
+                gRFAL.Lm.dataFlag = true;
+                
+                /*Check if Observation Mode was enabled and disable it on ST25R391x */
+                rfalCheckDisableObsMode();
+            }
+            else if( (irqs & ST25R3911_IRQ_MASK_EOF) && (!gRFAL.Lm.dataFlag) )
+            {
+                rfalListenSetState( RFAL_LM_STATE_POWER_OFF, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            break;
+            
+            /*******************************************************************************/
+            case RFAL_LM_STATE_READY_F:
+            case RFAL_LM_STATE_READY_A:
+            case RFAL_LM_STATE_ACTIVE_A:
+            case RFAL_LM_STATE_ACTIVE_Ax:
+            case RFAL_LM_STATE_SLEEP_A:
+            case RFAL_LM_STATE_SLEEP_B:
+            case RFAL_LM_STATE_SLEEP_AF:
+            case RFAL_LM_STATE_READY_Ax:
+            case RFAL_LM_STATE_CARDEMU_4A:
+            case RFAL_LM_STATE_CARDEMU_4B:
+            case RFAL_LM_STATE_CARDEMU_3:
+                return ERR_INTERNAL;
+                
+            case RFAL_LM_STATE_TARGET_F:
+            case RFAL_LM_STATE_TARGET_A:
+                break;
+                
+            /*******************************************************************************/
+            default:
+                return ERR_WRONG_STATE;
+    }
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalListenStop( 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 )
+{
+    gRFAL.Lm.state  = RFAL_LM_STATE_NOT_INIT;
+  
+    /*Check if Observation Mode was enabled and disable it on ST25R391x */
+    rfalCheckDisableObsMode();
+  
+    /* Disable Receiver and Transmitter */
+    rfalFieldOff( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* As there's no Off mode, set default value: ISO14443A with automatic RF Collision Avoidance Off */
+    mST25 -> writeRegister( ST25R3911_REG_MODE, (ST25R3911_REG_MODE_om_iso14443a | ST25R3911_REG_MODE_nfc_ar_off),  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalListenSleepStart( rfalLmState sleepSt, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rxLen )
+{
+    NO_WARNING(sleepSt);
+    NO_WARNING(rxBuf);
+    NO_WARNING(rxBufLen);
+    NO_WARNING(rxLen);
+    
+    return ERR_NOTSUPP;
+}
+
+
+/*******************************************************************************/
+rfalLmState rfalListenGetState( bool *dataFlag, rfalBitRate *lastBR )
+{
+    /* Allow state retrieval even if gRFAL.state != RFAL_STATE_LM so  *
+     * that this Lm state can be used by caller after activation      */
+
+    if( lastBR != NULL )
+    {
+        *lastBR = gRFAL.Lm.brDetected;
+    }
+    
+    if( dataFlag != NULL )
+    {
+        *dataFlag = gRFAL.Lm.dataFlag;
+    }
+    
+    return gRFAL.Lm.state;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalListenSetState( rfalLmState newSt, 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 )
+{
+    ReturnCode ret;
+    uint8_t    tmp;
+        
+    /*rfalLogD( "RFAL: curState: %02X newState: %02X \r\n", gRFAL.Lm.state, newSt );*/
+    
+    /* SetState clears the Data flag */
+    gRFAL.Lm.dataFlag = false;
+    ret               = ERR_NONE;
+    
+    /*******************************************************************************/
+    switch( newSt )
+    {
+        /*******************************************************************************/
+        case RFAL_LM_STATE_POWER_OFF:
+            
+            /*******************************************************************************/
+            /* Disable nfc_ar as RF Collision Avoidance timer may have already started */
+            st25r3911ClrRegisterBits( ST25R3911_REG_MODE, ST25R3911_REG_MODE_nfc_ar, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+             mST25 -> executeCommand( ST25R3911_CMD_CLEAR_FIFO, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                
+            /* Ensure that our field is Off, as automatic response RF Collision Avoidance may have been triggered */
+            st25r3911ClrRegisterBits(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /*******************************************************************************/
+            /* Ensure that the NFCIP1 mode is disabled */
+            st25r3911ClrRegisterBits( ST25R3911_REG_ISO14443A_NFC, ST25R3911_REG_ISO14443A_NFC_nfc_f0, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            
+            /*******************************************************************************/
+            /* Clear and enable required IRQs */
+            st25r3911DisableInterrupts( ST25R3911_IRQ_MASK_ALL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 );
+            
+            
+            st25r3911GetInterrupt( (ST25R3911_IRQ_MASK_NFCT | ST25R3911_IRQ_MASK_RXS | ST25R3911_IRQ_MASK_CRC | ST25R3911_IRQ_MASK_ERR1 |
+                                    ST25R3911_IRQ_MASK_ERR2 | ST25R3911_IRQ_MASK_PAR | ST25R3911_IRQ_MASK_EON | ST25R3911_IRQ_MASK_EOF  | ST25R3911_IRQ_MASK_RXE ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            
+            /*******************************************************************************/
+            /* REMARK: Silicon workaround ST25R3911 Errata TDB                             */
+            /* RXS and NFCT are triggered very close (specially in higher bitrates).       *
+             * If the interrupt status register is being read when NFCT is trigerred, the  *
+             * IRQ line might go low and NFCT is not signalled on the status register.     *
+             * For initial bitrate detection, mask RXS, only wait for NFCT and RXE.        */
+            /*******************************************************************************/
+            
+            st25r3911EnableInterrupts( (ST25R3911_IRQ_MASK_NFCT | ST25R3911_IRQ_MASK_CRC | ST25R3911_IRQ_MASK_ERR1 |
+                                        ST25R3911_IRQ_MASK_ERR2 | ST25R3911_IRQ_MASK_PAR | ST25R3911_IRQ_MASK_EON | ST25R3911_IRQ_MASK_EOF  | ST25R3911_IRQ_MASK_RXE ),
+            		mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /*******************************************************************************/
+            /* Clear the bitRate previously detected */
+            gRFAL.Lm.brDetected = RFAL_BR_KEEP;
+            
+            
+            /*******************************************************************************/
+            /* Apply the BitRate detection mode mode */
+                   mST25 -> writeRegister( ST25R3911_REG_MODE,
+                		   (ST25R3911_REG_MODE_targ_targ | ST25R3911_REG_MODE_om_bit_rate_detection | ST25R3911_REG_MODE_nfc_ar_on),
+						   mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            
+            /*******************************************************************************/
+            /* REMARK: Silicon workaround ST25R3911 Errata #1.3                            */
+            /* Even though bitrate is going to be detected the bitrate must be set to      *
+             * 106kbps to get correct 106kbps parity                                       */
+                   mST25 -> writeRegister( ST25R3911_REG_BIT_RATE, (ST25R3911_REG_BIT_RATE_txrate_106 | ST25R3911_REG_BIT_RATE_rxrate_106),
+                		   mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            /*******************************************************************************/
+            
+            
+            /*******************************************************************************/
+            /* Check if external Field is already On */
+            if( rfalIsExtFieldOn( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+            {
+                return rfalListenSetState( RFAL_LM_STATE_IDLE, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;                         /* Set IDLE state */
+            }
+            break;
+        
+        /*******************************************************************************/
+        case RFAL_LM_STATE_IDLE:
+        
+            /*******************************************************************************/
+            /* In Active P2P the Initiator may:  Turn its field On;  LM goes into IDLE state;
+             *      Initiator sends an unexpected frame raising a Protocol error; Initiator 
+             *      turns its field Off and ST25R3911 performs the automatic RF Collision 
+             *      Avoidance keeping our field On; upon a Protocol error upper layer sets 
+             *      again the state to IDLE to clear dataFlag and wait for next data.
+             *      
+             * Ensure that when upper layer calls SetState(IDLE), it restores initial 
+             * configuration and that check whether an external Field is still present     */
+             
+            /* nfc_ar may have triggered RF Collision Avoidance, disable it before executing Clear (Stop All activities) */
+            st25r3911ClrRegisterBits( ST25R3911_REG_MODE, ST25R3911_REG_MODE_nfc_ar, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            mST25 -> executeCommand( ST25R3911_CMD_CLEAR_FIFO,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            st25r3911SetRegisterBits( ST25R3911_REG_MODE, ST25R3911_REG_MODE_nfc_ar, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /* Ensure that our field is Off, as automatic response RF Collision Avoidance may have been triggered */
+            st25r3911ClrRegisterBits(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_tx_en , mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            
+            /* Load 2nd/3rd stage gain setting from registers into the receiver */
+            mST25 -> executeCommand( ST25R3911_CMD_CLEAR_SQUELCH,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            /*******************************************************************************/
+            /* REMARK: Silicon workaround ST25R3911 Errata #1.4                            */
+            /* Enable; disable; enable mixer to make sure the digital decoder is in        *
+             * high state. This also switches the demodulator to mixer mode.               */
+            mST25 -> readRegister( ST25R3911_REG_RX_CONF1, &tmp,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            mST25 -> writeRegister( ST25R3911_REG_RX_CONF1, (tmp | ST25R3911_REG_RX_CONF1_amd_sel),  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            mST25 -> writeRegister( ST25R3911_REG_RX_CONF1, (tmp & ~ST25R3911_REG_RX_CONF1_amd_sel),  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            mST25 -> writeRegister( ST25R3911_REG_RX_CONF1, (tmp | ST25R3911_REG_RX_CONF1_amd_sel),  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            /*******************************************************************************/
+            
+            /* ReEnable the receiver */
+            mST25 -> executeCommand( ST25R3911_CMD_UNMASK_RECEIVE_DATA,  mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            
+            
+            /* If external Field is no longer detected go back to POWER_OFF */
+            if( !st25r3911CheckReg(ST25R3911_REG_AUX_DISPLAY, ST25R3911_REG_AUX_DISPLAY_efd_o, ST25R3911_REG_AUX_DISPLAY_efd_o, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  )
+            {
+                return rfalListenSetState( RFAL_LM_STATE_POWER_OFF, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;                         /* Set POWER_OFF state */
+            }
+
+            /*******************************************************************************/
+            /*Check if Observation Mode is enabled and set it on ST25R391x */
+            rfalCheckEnableObsModeRx();
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_LM_STATE_TARGET_A:
+        case RFAL_LM_STATE_TARGET_F:
+            /* States not handled by the LM, just keep state context */
+            break;
+            
+        /*******************************************************************************/
+        case RFAL_LM_STATE_READY_F:
+        case RFAL_LM_STATE_CARDEMU_3:
+        case RFAL_LM_STATE_READY_Ax:
+        case RFAL_LM_STATE_READY_A:
+        case RFAL_LM_STATE_ACTIVE_Ax:
+        case RFAL_LM_STATE_ACTIVE_A:
+        case RFAL_LM_STATE_SLEEP_A:
+        case RFAL_LM_STATE_SLEEP_B:
+        case RFAL_LM_STATE_SLEEP_AF:
+        case RFAL_LM_STATE_CARDEMU_4A:
+        case RFAL_LM_STATE_CARDEMU_4B:
+            return ERR_NOTSUPP;
+            
+        /*******************************************************************************/
+        default:
+            return ERR_WRONG_STATE;
+    }
+    
+    gRFAL.Lm.state = newSt;
+    
+    return ret;
+}
+
+
+/*******************************************************************************
+ *  Wake-Up Mode                                                               *
+ *******************************************************************************/
+
+/*******************************************************************************/
+ReturnCode rfalWakeUpModeStart( void *config, ST25R3911* mST25, SPI* mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{
+    uint8_t                aux;
+    uint8_t                reg;
+    uint32_t               irqs;
+    
+    /* The Wake-Up procedure is explained in detail in Application Note: AN4985 */
+    
+    if( config == NULL)
+    {
+        gRFAL.wum.cfg.period  = ST25R3911_WUM_PERIDOD_500MS;
+        gRFAL.wum.cfg.irqTout = false;
+      
+        gRFAL.wum.cfg.indPha.enabled   = true;
+        gRFAL.wum.cfg.indPha.delta     = 3;
+        gRFAL.wum.cfg.indPha.reference = ST25R3911_WUM_REFRENCE_AUTO;
+        gRFAL.wum.cfg.indPha.autoAvg   = true;
+
+
+        gRFAL.wum.cfg.cap.enabled      = false;
+        gRFAL.wum.cfg.cap.delta     = 3;
+        gRFAL.wum.cfg.cap.reference = ST25R3911_WUM_REFRENCE_AUTO;
+        gRFAL.wum.cfg.cap.autoAvg   = true;
+
+
+
+        gRFAL.wum.cfg.indAmp.enabled   = false;
+        gRFAL.wum.cfg.indAmp.delta     = 3;
+        gRFAL.wum.cfg.indAmp.reference = ST25R3911_WUM_REFRENCE_AUTO;
+        gRFAL.wum.cfg.indAmp.autoAvg   = true;
+    }
+    else
+    {
+        gRFAL.wum.cfg = *((st25r3911WakeUpConfig*)config);
+    }
+    
+    
+    if( gRFAL.wum.cfg.cap.enabled && (gRFAL.wum.cfg.indAmp.enabled || gRFAL.wum.cfg.indPha.enabled) )
+    {
+      return ERR_PARAM;
+    }
+    
+    irqs = ST25R3911_IRQ_MASK_NONE;
+    
+    
+
+    ///// conf wake up timer and control register IRQ if diff larger that delta am -> 00000100
+
+   //mST25->writeRegister(ST25R3911_REG_WUP_TIMER_CONTROL, ST25R3911_REG_WUP_TIMER_CONTROL_wam, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+
+
+
+    /*******************************************************************************/
+    /* Prepare Wake-Up Timer Control Register */
+    reg  = ((gRFAL.wum.cfg.period & 0x0F) << ST25R3911_REG_WUP_TIMER_CONTROL_shift_wut);
+    reg |= ((gRFAL.wum.cfg.period < ST25R3911_WUM_PERIDOD_100MS) ? ST25R3911_REG_WUP_TIMER_CONTROL_wur : 0x00);
+    
+    if(gRFAL.wum.cfg.irqTout)
+    {
+        reg  |= ST25R3911_REG_WUP_TIMER_CONTROL_wto;
+        irqs |= ST25R3911_IRQ_MASK_WT;
+    }
+    
+    /*******************************************************************************/
+    /* Check if Inductive Amplitude is to be performed */
+    if( gRFAL.wum.cfg.indAmp.enabled )
+    {
+        aux  = ((gRFAL.wum.cfg.indAmp.delta) << ST25R3911_REG_AMPLITUDE_MEASURE_CONF_shift_am_d);
+        aux |= (gRFAL.wum.cfg.indAmp.aaInclMeas ? ST25R3911_REG_AMPLITUDE_MEASURE_CONF_am_aam : 0x00);
+        aux |= ((gRFAL.wum.cfg.indAmp.aaWeight << ST25R3911_REG_AMPLITUDE_MEASURE_CONF_shift_am_aew) & ST25R3911_REG_AMPLITUDE_MEASURE_CONF_mask_am_aew);
+        aux |= (gRFAL.wum.cfg.indAmp.autoAvg ? ST25R3911_REG_AMPLITUDE_MEASURE_CONF_am_ae : 0x00);
+        
+        mST25->writeRegister(ST25R3911_REG_AMPLITUDE_MEASURE_CONF, aux, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* Only need to set the reference if not using Auto Average */
+        if( !gRFAL.wum.cfg.indAmp.autoAvg )
+        {
+            if( gRFAL.wum.cfg.indAmp.reference == ST25R3911_WUM_REFRENCE_AUTO )
+            {
+            		 st25r3911MeasureRF( &aux, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                     mST25->writeRegister(ST25R3911_REG_AMPLITUDE_MEASURE_REF, aux, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            else
+            {
+            	    mST25->writeRegister(ST25R3911_REG_AMPLITUDE_MEASURE_REF, gRFAL.wum.cfg.indAmp.reference, mspiChannel, gpio_cs,
+            	    		IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+        }
+        
+        reg  |= ST25R3911_REG_WUP_TIMER_CONTROL_wam;
+        irqs |= ST25R3911_IRQ_MASK_WAM;
+    }
+    
+    /*******************************************************************************/
+    /* Check if Inductive Phase is to be performed */
+    if( gRFAL.wum.cfg.indPha.enabled )
+    {
+        aux  = ((gRFAL.wum.cfg.indPha.delta) << ST25R3911_REG_PHASE_MEASURE_CONF_shift_pm_d);
+        aux |= (gRFAL.wum.cfg.indPha.aaInclMeas ? ST25R3911_REG_PHASE_MEASURE_CONF_pm_aam : 0x00);
+        aux |= ((gRFAL.wum.cfg.indPha.aaWeight << ST25R3911_REG_PHASE_MEASURE_CONF_shift_pm_aew) & ST25R3911_REG_PHASE_MEASURE_CONF_mask_pm_aew);
+        aux |= (gRFAL.wum.cfg.indPha.autoAvg ? ST25R3911_REG_PHASE_MEASURE_CONF_pm_ae : 0x00);
+        
+            mST25->writeRegister(ST25R3911_REG_PHASE_MEASURE_CONF, aux, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        /* Only need to set the reference if not using Auto Average */
+        if( !gRFAL.wum.cfg.indPha.autoAvg )
+        {
+            if( gRFAL.wum.cfg.indPha.reference == ST25R3911_WUM_REFRENCE_AUTO )
+            {
+                st25r3911MeasureAntennaResonance( &aux, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                       mST25->writeRegister(ST25R3911_REG_PHASE_MEASURE_REF, aux, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            }
+            else
+            {
+
+                mST25->writeRegister(ST25R3911_REG_PHASE_MEASURE_REF,  gRFAL.wum.cfg.indPha.reference, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+            }
+        }
+        
+        reg  |= ST25R3911_REG_WUP_TIMER_CONTROL_wph;
+        irqs |= ST25R3911_IRQ_MASK_WPH;
+    }
+    
+    /*******************************************************************************/
+    /* Check if Capacitive is to be performed */
+    if( gRFAL.wum.cfg.cap.enabled )
+    {
+        return ERR_NOT_IMPLEMENTED;
+    }    
+    
+    /* Disable External Field Detector */
+    st25r3911ClrRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_en_fd, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable and clear all interrupts except Wake-Up IRQs */
+    st25r3911DisableInterrupts( ST25R3911_IRQ_MASK_ALL, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    st25r3911GetInterrupt( irqs, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    st25r3911EnableInterrupts( irqs, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Enable Low Power Wake-Up Mode */
+    mST25->writeRegister(ST25R3911_REG_WUP_TIMER_CONTROL, reg, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    mST25->writeRegister(ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+
+    
+    gRFAL.wum.state = RFAL_WUM_STATE_ENABLED;
+    gRFAL.state     = RFAL_STATE_WUM;  
+      
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+bool rfalWakeUpModeHasWoke( ST25R3911* mST25, SPI* mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 )
+{   
+
+    return (gRFAL.wum.state == RFAL_WUM_STATE_ENABLED_WOKE);
+}
+
+
+/*******************************************************************************/
+static void rfalRunWakeUpModeWorker( 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 )
+{
+    uint32_t irqs;
+    
+    if( gRFAL.state != RFAL_STATE_WUM )
+    {
+        return;
+    }
+    
+    switch( gRFAL.wum.state )
+    {
+        case RFAL_WUM_STATE_ENABLED:
+        case RFAL_WUM_STATE_ENABLED_WOKE:
+            
+            irqs = st25r3911GetInterrupt( ( ST25R3911_IRQ_MASK_WT | ST25R3911_IRQ_MASK_WAM | ST25R3911_IRQ_MASK_WPH | ST25R3911_IRQ_MASK_WCAP ), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+            if( irqs == ST25R3911_IRQ_MASK_NONE )
+            {
+               break;  /* No interrupt to process */
+            }
+            
+            /*******************************************************************************/
+            /* Check and mark which measurement(s) cause interrupt */
+            if(irqs & ST25R3911_IRQ_MASK_WAM)
+            {
+                gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
+            }
+            
+            if(irqs & ST25R3911_IRQ_MASK_WPH)
+            {
+                gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
+            }
+            
+            if(irqs & ST25R3911_IRQ_MASK_WCAP)
+            {
+                gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
+            }
+            break;
+            
+        default:
+            break;
+    }
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalWakeUpModeStop( 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 )
+{
+    if( gRFAL.wum.state == RFAL_WUM_STATE_NOT_INIT )
+    {
+        return ERR_WRONG_STATE;
+    }
+    
+    gRFAL.wum.state = RFAL_WUM_STATE_NOT_INIT;
+    
+    /* Re-Enable External Field Detector */
+    st25r3911SetRegisterBits( ST25R3911_REG_AUX, ST25R3911_REG_AUX_en_fd, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Disable Wake-Up Mode */
+    st25r3911ClrRegisterBits( ST25R3911_REG_OP_CONTROL, ST25R3911_REG_OP_CONTROL_wu, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    st25r3911DisableInterrupts( (ST25R3911_IRQ_MASK_WT | ST25R3911_IRQ_MASK_WAM | ST25R3911_IRQ_MASK_WPH | ST25R3911_IRQ_MASK_WCAP),
+    		mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Re-Enable the Oscillator */
+    st25r3911OscOn( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+      
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************
+ *  RF Chip                                                                    *
+ *******************************************************************************/
+
+/*******************************************************************************/
+ReturnCode rfalChipWriteReg( uint16_t reg, uint8_t* values, uint8_t len, 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 )
+{
+    if( !st25r3911IsRegValid( (uint8_t)reg) )
+    {
+        return ERR_PARAM;
+    }
+
+    mST25 -> writeMultipleRegisters( (uint8_t)reg, values, len, mspiChannel,mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalChipReadReg( uint16_t reg, uint8_t* values, uint8_t len, 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 )
+{
+    if( !st25r3911IsRegValid( (uint8_t)reg) )
+    {
+        return ERR_PARAM;
+    }
+    
+    mST25 -> readMultipleRegisters( (uint8_t)reg, values, len, mspiChannel,mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalChipExecCmd( uint16_t cmd, 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 )
+{
+    if( !st25r3911IsCmdValid( (uint8_t)cmd) )
+    {
+        return ERR_PARAM;
+    }
+    
+      mST25 -> executeCommand( (uint8_t) cmd, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalChipWriteTestReg( uint16_t reg, uint8_t value, 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 )
+{
+    st25r3911WriteTestRegister( (uint8_t)reg, value, mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalChipReadTestReg( uint16_t reg, uint8_t* value, 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 )
+{
+    st25r3911ReadTestRegister( (uint8_t)reg, value, mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalChipChangeRegBits( uint16_t reg, uint8_t valueMask, uint8_t value, 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 )
+{
+    st25r3911ChangeRegisterBits( (uint8_t)reg, valueMask, value, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+/*******************************************************************************/
+ReturnCode rfalChipChangeTestRegBits( uint16_t reg, uint8_t valueMask, uint8_t value, 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 )
+{
+    st25r3911ChangeTestRegisterBits( (uint8_t)reg, valueMask, value, mST25, mspiChannel, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    return ERR_NONE;
+}
+
+
+
+void rfalSetWumState( void )
+{
+    gRFAL.wum.state = RFAL_WUM_STATE_ENABLED_WOKE;
+}
+
+
+/*******************************************************************************/
+/* extern uint8_t invalid_size_of_stream_configs[(sizeof(struct st25r3911StreamConfig) == sizeof(struct iso15693StreamConfig))?1:(-1)]; */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_rf.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,1482 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_rf.h
+ *
+ *  \author Gustavo Patricio 
+ *
+ *  \brief RF Abstraction Layer (RFAL)
+ *  
+ *  RFAL (RF Abstraction Layer) provides several functionalities required to 
+ *  perform RF/NFC communications. <br>The RFAL encapsulates the different 
+ *  RF ICs (ST25R3911, ST25R391x, etc) into a common and easy to use interface.
+ *  
+ *  It provides interfaces to configure the RF IC, set/get timings, modes, bit rates,
+ *  specific handlings, execute listen mode, etc. 
+ *  
+ *  Furthermore it provides a common interface to perform a Transceive operations.
+ *  The Transceive can be executed in a blocking or non blocking way.<br>
+ *  Additionally few specific Transceive methods are available to cope with the
+ *  specifics of these particular operations.
+ *  
+ *  The most common interfaces are:
+ *    <br>&nbsp; rfalInitialize()
+ *    <br>&nbsp; rfalSetFDTPoll()
+ *    <br>&nbsp; rfalSetFDTListen()
+ *    <br>&nbsp; rfalSetGT()
+ *    <br>&nbsp; rfalSetBitRate()
+ *    <br>&nbsp; rfalSetMode()
+ *    <br>&nbsp; rfalFieldOnAndStartGT()
+ *    <br>&nbsp; rfalFieldOff()
+ *    <br>&nbsp; rfalStartTransceive()
+ *    <br>&nbsp; rfalGetTransceiveStatus()
+ *    <br>&nbsp; rfalTransceiveBlockingTxRx()
+ *    
+ *    
+ * @addtogroup RFAL
+ * @{
+ * 
+ * @addtogroup RFAL-HAL
+ * @brief RFAL Hardware Abstraction Layer
+ * @{
+ * 
+ * @addtogroup RF
+ * @brief RFAL RF Abstraction Layer
+ * @{
+ *  
+ */
+
+#ifndef RFAL_RF_H
+#define RFAL_RF_H
+
+/*
+******************************************************************************
+* INCLUDES
+******************************************************************************
+*/
+#include "platform1.h"
+#include "st_errno.h"
+#include "rfal_features.h"
+#include "st25r3911_com.h"
+#include <stdint.h>
+
+/*
+******************************************************************************
+* GLOBAL DEFINES
+******************************************************************************
+*/
+#define RFAL_VERSION                               (uint32_t)0x010302 /*!< RFAL Current Version: v1.3.2         */
+
+#define RFAL_FWT_NONE                              0xFFFFFFFF         /*!< Disabled FWT: Wait forever for a response         */
+#define RFAL_GT_NONE                               RFAL_TIMING_NONE   /*!< Disabled GT: No GT will be applied after Field On */
+
+#define RFAL_TIMING_NONE                           0x00               /*!< Timing disabled | Don't apply        */
+
+#define RFAL_1FC_IN_4096FC                         (uint32_t)4096     /*!< Number of 1/fc cycles in one 4096/fc */
+#define RFAL_1FC_IN_512FC                          (uint32_t)512      /*!< Number of 1/fc cycles in one 512/fc  */
+#define RFAL_1FC_IN_64FC                           (uint32_t)64       /*!< Number of 1/fc cycles in one 64/fc   */
+#define RFAL_1FC_IN_8FC                            (uint32_t)8        /*!< Number of 1/fc cycles in one 8/fc    */
+#define RFAL_US_IN_MS                              (uint32_t)1000     /*!< Number of us in one ms               */
+#define RFAL_1MS_IN_1FC                            (uint32_t)13560    /*!< Number of 1/fc cycles in 1ms         */
+#define RFAL_BITS_IN_BYTE                          (uint16_t)8        /*!< Number of bits in one byte           */
+
+#define RFAL_CRC_LEN                               2                  /*!< RF CRC LEN                           */
+
+/*! Default TxRx flags: Tx CRC automatic, Rx CRC removed, NFCIP1 mode off, AGC On, Tx Parity automatic, Rx Parity removed */
+#define RFAL_TXRX_FLAGS_DEFAULT                    ( RFAL_TXRX_FLAGS_CRC_TX_AUTO | RFAL_TXRX_FLAGS_CRC_RX_REMV | RFAL_TXRX_FLAGS_NFCIP1_OFF | RFAL_TXRX_FLAGS_AGC_ON | RFAL_TXRX_FLAGS_PAR_RX_REMV | RFAL_TXRX_FLAGS_PAR_TX_AUTO | RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO)
+
+
+#define RFAL_LM_MASK_NFCA                          (1<<RFAL_MODE_LISTEN_NFCA)         /*!< Bitmask for Listen Mode enabling Listen NFCA   */
+#define RFAL_LM_MASK_NFCB                          (1<<RFAL_MODE_LISTEN_NFCB)         /*!< Bitmask for Listen Mode enabling Listen NFCB   */
+#define RFAL_LM_MASK_NFCF                          (1<<RFAL_MODE_LISTEN_NFCF)         /*!< Bitmask for Listen Mode enabling Listen NFCF   */
+#define RFAL_LM_MASK_ACTIVE_P2P                    (1<<RFAL_MODE_LISTEN_ACTIVE_P2P)   /*!< Bitmask for Listen Mode enabling Listen AP2P   */
+
+#define RFAL_LM_SENS_RES_LEN                       2                                  /*!< NFC-A SENS_RES (ATQA) length                   */
+#define RFAL_LM_SENSB_RES_LEN                      13                                 /*!< NFC-B SENSB_RES (ATQB) length                  */
+#define RFAL_LM_SENSF_RES_LEN                      19                                 /*!< NFC-F SENSF_RES  length                        */
+#define RFAL_LM_SENSF_SC_LEN                       2                                  /*!< NFC-F System Code length                       */
+
+#define RFAL_NFCID3_LEN                            10                                 /*!< NFCID3 length                                  */
+#define RFAL_NFCID2_LEN                            7                                  /*!< NFCID2 length                                  */
+#define RFAL_NFCID1_LEN                            4                                  /*!< NFCID1 length                                  */
+
+
+/*
+******************************************************************************
+* GLOBAL MACROS
+******************************************************************************
+*/
+
+/*! Returns the maximum supported bit rate for RW mode. Caller must check if mode is supported before, as even if mode is not supported will return the min  */
+#define rfalGetMaxBrRW()                     ( ((RFAL_SUPPORT_BR_RW_6780)  ? RFAL_BR_6780 : ((RFAL_SUPPORT_BR_RW_3390)  ? RFAL_BR_3390 : ((RFAL_SUPPORT_BR_RW_1695)  ? RFAL_BR_1695 : ((RFAL_SUPPORT_BR_RW_848)  ? RFAL_BR_848 : ((RFAL_SUPPORT_BR_RW_424)  ? RFAL_BR_424 : ((RFAL_SUPPORT_BR_RW_212)  ? RFAL_BR_212 : RFAL_BR_106 ) ) ) ) ) ) )
+
+/*! Returns the maximum supported bit rate for AP2P mode. Caller must check if mode is supported before, as even if mode is not supported will return the min  */
+#define rfalGetMaxBrAP2P()                   ( ((RFAL_SUPPORT_BR_AP2P_848) ? RFAL_BR_848  : ((RFAL_SUPPORT_BR_AP2P_424) ? RFAL_BR_424  : ((RFAL_SUPPORT_BR_AP2P_212) ? RFAL_BR_212  : RFAL_BR_106 ) ) ) )
+
+/*! Returns the maximum supported bit rate for CE-A mode. Caller must check if mode is supported before, as even if mode is not supported will return the min  */
+#define rfalGetMaxBrCEA()                    ( ((RFAL_SUPPORT_BR_CE_A_848) ? RFAL_BR_848  : ((RFAL_SUPPORT_BR_CE_A_424) ? RFAL_BR_424  : ((RFAL_SUPPORT_BR_CE_A_212) ? RFAL_BR_212  : RFAL_BR_106 ) ) ) )
+
+/*! Returns the maximum supported bit rate for CE-B mode. Caller must check if mode is supported before, as even if mode is not supported will return the min  */
+#define rfalGetMaxBrCEB()                    ( ((RFAL_SUPPORT_BR_CE_B_848) ? RFAL_BR_848  : ((RFAL_SUPPORT_BR_CE_B_424) ? RFAL_BR_424  : ((RFAL_SUPPORT_BR_CE_B_212) ? RFAL_BR_212  : RFAL_BR_106 ) ) ) )
+
+/*! Returns the maximum supported bit rate for CE-F mode. Caller must check if mode is supported before, as even if mode is not supported will return the min  */
+#define rfalGetMaxBrCEF()                    ( ((RFAL_SUPPORT_BR_CE_F_424) ? RFAL_BR_424  : RFAL_BR_212 ) )
+
+#define rfalConv1fcTo8fc( t )                (uint32_t)( (t) / RFAL_1FC_IN_8FC )                               /*!< Converts the given t from 1/fc to 8/fc     */
+#define rfalConv8fcTo1fc( t )                (uint32_t)( (t) * RFAL_1FC_IN_8FC )                               /*!< Converts the given t from 8/fc to 1/fc     */
+
+#define rfalConv1fcTo64fc( t )               (uint32_t)( (t) / RFAL_1FC_IN_64FC )                              /*!< Converts the given t from 1/fc  to 64/fc   */
+#define rfalConv64fcTo1fc( t )               (uint32_t)( (t) * RFAL_1FC_IN_64FC )                              /*!< Converts the given t from 64/fc to 1/fc    */
+
+#define rfalConv1fcTo512fc( t )              (uint32_t)( (t) / RFAL_1FC_IN_512FC )                             /*!< Converts the given t from 1/fc  to 512/fc  */
+#define rfalConv512fcTo1fc( t )              (uint32_t)( (t) * RFAL_1FC_IN_512FC )                             /*!< Converts the given t from 512/fc to 1/fc   */
+
+#define rfalConv1fcTo4096fc( t )             (uint32_t)( (t) / RFAL_1FC_IN_4096FC )                            /*!< Converts the given t from 1/fc to 4096/fc  */
+#define rfalConv4096fcTo1fc( t )             (uint32_t)( (t) * RFAL_1FC_IN_4096FC )                            /*!< Converts the given t from 4096/fc to 1/fc  */
+
+#define rfalConv1fcToMs( t )                 (uint32_t)( (t) / RFAL_1MS_IN_1FC )                               /*!< Converts the given t from 1/fc to ms       */
+#define rfalConvMsTo1fc( t )                 (uint32_t)( (t) * RFAL_1MS_IN_1FC )                               /*!< Converts the given t from ms to 1/fc       */
+
+#define rfalConv1fcToUs( t )                 (uint32_t)( (t * RFAL_US_IN_MS) / RFAL_1MS_IN_1FC)                /*!< Converts the given t from 1/fc to us       */
+#define rfalConvUsTo1fc( t )                 (uint32_t)( (t * RFAL_1MS_IN_1FC) / RFAL_US_IN_MS)                /*!< Converts the given t from us to 1/fc       */
+
+#define rfalConv64fcToMs( t )                (uint32_t)( (t) / (RFAL_1MS_IN_1FC / RFAL_1FC_IN_64FC) )          /*!< Converts the given t from 64/fc to ms      */
+#define rfalConvMsTo64fc( t )                (uint32_t)( (t) * (RFAL_1MS_IN_1FC / RFAL_1FC_IN_64FC) )          /*!< Converts the given t from ms to 64/fc      */
+
+#define rfalConvBitsToBytes( n )             (uint32_t)( (n+(RFAL_BITS_IN_BYTE-1)) / (RFAL_BITS_IN_BYTE) )     /*!< Converts the given n from bits to bytes    */
+#define rfalConvBytesToBits( n )             (uint32_t)( (n) * (RFAL_BITS_IN_BYTE) )                           /*!< Converts the given n from bytes to bits    */
+
+
+
+#define rfalIsTransceiveInTx( )              ( !rfalIsTransceiveInRx() && (rfalGetTransceiveState() >= RFAL_TXRX_STATE_TX_IDLE) )   /*!< Checks if Transceive is in a Transmission state ( Transmit ongoing ) */
+#define rfalIsTransceiveInRx( )              ( rfalGetTransceiveState() >= RFAL_TXRX_STATE_RX_IDLE )                                /*!< Checks if Transceive is in a Reception state ( Transmit done )       */
+
+
+
+
+/*! Computes a Transceive context \a ctx with default flags and the lengths 
+ * in bytes with the given arguments
+ *    \a ctx   : Transceive context to be assigned  
+ *    \a tB    : txBuf the pointer to the buffer to be sent
+ *    \a tBL   : txBuf length in bytes
+ *    \a rB    : rxBuf the pointer to the buffer to place the received frame
+ *    \a rBL   : rxBuf length in bytes
+ *    \a rBL   : rxBuf length in bytes
+ *    \a t     : FWT to be used on this transceive in 1/fc
+ */
+#define rfalCreateByteTxRxContext( ctx, tB, tBL, rB, rBL, rdL, t ) \
+    ctx.txBuf     = (tB);                                      \
+    ctx.txBufLen  = rfalConvBytesToBits(tBL);                  \
+    ctx.rxBuf     = (rB);                                      \
+    ctx.rxBufLen  = rfalConvBytesToBits(rBL);                  \
+    ctx.rxRcvdLen = rdL;                                       \
+    ctx.flags     = RFAL_TXRX_FLAGS_DEFAULT;                   \
+    ctx.fwt       = (t);
+
+
+/*! Computes a Transceive context \a ctx using lengths in bytes 
+ * with the given flags and arguments
+ *    \a ctx   : Transceive context to be assigned  
+ *    \a tB    : txBuf the pointer to the buffer to be sent
+ *    \a tBL   : txBuf length in bytes
+ *    \a rB    : rxBuf the pointer to the buffer to place the received frame
+ *    \a rBL   : rxBuf length in bytes
+ *    \a rBL   : rxBuf length in bytes
+ *    \a t     : FWT to be used on this transceive in 1/fc
+ */
+#define rfalCreateByteFlagsTxRxContext( ctx, tB, tBL, rB, rBL, rdL, fl, t ) \
+    ctx.txBuf     = (tB);                                      \
+    ctx.txBufLen  = rfalConvBytesToBits(tBL);                  \
+    ctx.rxBuf     = (rB);                                      \
+    ctx.rxBufLen  = rfalConvBytesToBits(rBL);                  \
+    ctx.rxRcvdLen = rdL;                                       \
+    ctx.flags     = (fl);                                      \
+    ctx.fwt       = (t);
+
+
+#define rfalLogE(...)             //(__VA_ARGS__)        /*!< Macro for the error log method                  */
+#define rfalLogW(...)             //(__VA_ARGS__)        /*!< Macro for the warning log method                */
+#define rfalLogI(...)             //(__VA_ARGS__)        /*!< Macro for the info log method                   */
+#define rfalLogD(...)             //(__VA_ARGS__)        /*!< Macro for the debug log method                  */
+
+
+/*
+******************************************************************************
+* GLOBAL ENUMS
+******************************************************************************
+*/
+
+/*! RFAL Guard Time (GT) default values                */
+enum {
+    RFAL_GT_NFCA                     = rfalConvMsTo1fc(5),    /*!< GTA  Digital 1.1  6.10.4.1 & A.2                                                                 */
+    RFAL_GT_NFCB                     = rfalConvMsTo1fc(5),    /*!< GTB  Digital 1.1  7.9.4.1  & A.3                                                                 */
+    RFAL_GT_NFCF                     = rfalConvMsTo1fc(20),   /*!< GTF  Digital 1.1  8.7.4.1  & A.4                                                                 */
+    RFAL_GT_NFCV                     = rfalConvMsTo1fc(1),    /*!< GTV  NFC Forum NFCV Change Request 9.7.1.1 & A.2                                                 */
+    RFAL_GT_NFCV_ADJUSTED            = rfalConvMsTo1fc(1+4),  /*!< Adjusted GT for greater interoperability (ISO15693 Dynamic Tags)                                 */
+    RFAL_GT_PICOPASS                 = rfalConvMsTo1fc(1),    /*!< GT Picopass                                                                                      */
+    RFAL_GT_AP2P                     = rfalConvMsTo1fc(5),    /*!< TIRFG  Ecma 340  11.1.1                                                                          */
+    RFAL_GT_AP2P_ADJUSTED            = rfalConvMsTo1fc(5+25)  /*!< Adjusted GT for greater interoperability (Sony XPERIA P, Nokia N9, Huawei P2)                    */
+};
+
+
+/*! RFAL Frame Delay Time (FDT) Listen default values  */
+enum {
+    RFAL_FDT_LISTEN_NFCA_POLLER      = 1172,   /*!< FDTA,LISTEN,MIN (n=9) Last bit: Logic "1" - tnn,min/2 Digital 1.1  6.10 ;  EMV CCP Spec Book D v2.01  4.8.1.3   */
+    RFAL_FDT_LISTEN_NFCB_POLLER      = 1008,   /*!< TR0B,MIN         Digital 1.1  7.1.3 & A.3  ; EMV CCP Spec Book D v2.01  4.8.1.3 & Table A.5                     */
+    RFAL_FDT_LISTEN_NFCF_POLLER      = 2672,   /*!< TR0F,LISTEN,MIN  Digital 1.1  8.7.1.1 & A.4                                                                     */
+    RFAL_FDT_LISTEN_NFCV_POLLER      = 4192,   /*!< t1 min  4192/fc (309,2us)     ISO15693 3 Table 8                                                                */
+    RFAL_FDT_LISTEN_PICOPASS_POLLER  = 3400,   /*!< ISO15693 t1 min - observed adjustment                                                                           */
+    RFAL_FDT_LISTEN_AP2P_POLLER      = 64,     /*!< FDT AP2P No actual FDTListen is required as fields switch and collision avoidance                               */
+    RFAL_FDT_LISTEN_NFCA_LISTENER    = 1172,   /*!< FDTA,LISTEN,MIN  Digital 1.1  6.10                                                                              */
+    RFAL_FDT_LISTEN_NFCB_LISTENER    = 1024,   /*!< TR0B,MIN         Digital 1.1  7.1.3 & A.3  ;  EMV CCP Spec Book D v2.01  4.8.1.3 & Table A.5                    */
+    RFAL_FDT_LISTEN_NFCF_LISTENER    = 2688,   /*!< TR0F,LISTEN,MIN  Digital 1.1  8.7.1.1 & A.4                                                                     */
+    RFAL_FDT_LISTEN_AP2P_LISTENER    = 64      /*!< FDT AP2P No actual FDTListen exists as fields switch and collision avoidance                                    */
+};
+
+
+/*! RFAL Frame Delay Time (FDT) Poll default values  */
+enum {
+    RFAL_FDT_POLL_NFCA_POLLER        = 6780,   /*!< FDTA,POLL,MIN   Digital 1.1  6.10.3.1 & A.2 */
+    RFAL_FDT_POLL_NFCA_T1T_POLLER    = 384,    /*!< RRDDT1T,MIN,B1  Digital 1.1  10.7.1 & A.5   */
+    RFAL_FDT_POLL_NFCB_POLLER        = 6780,   /*!< FDTB,POLL,MIN = TR2B,MIN,DEFAULT Digital 1.1 7.9.3 & A.3 */
+    RFAL_FDT_POLL_NFCF_POLLER        = 2672,   /*!< FDTF,POLL,MIN   Digital 1.1  8.7.3 & A.4    */
+    RFAL_FDT_POLL_NFCV_POLLER        = 4192,   /*!< FDTV,POLL  NFC Forum NFCV Change Request A.2*/
+    RFAL_FDT_POLL_PICOPASS_POLLER    = 1790,   /*!< FDT Max                                     */
+    RFAL_FDT_POLL_AP2P_POLLER        = 0       /*!< FDT AP2P No actual FDTPoll exists as fields switch and collision avoidance  */
+};
+
+
+/*
+******************************************************************************
+* GLOBAL TYPES
+******************************************************************************
+*/
+
+/*! RFAL modes    */
+typedef enum {
+    RFAL_MODE_NONE                   = 0,    /*!< No mode selected/defined                                      */
+    RFAL_MODE_POLL_NFCA              = 1,    /*!< Mode to perform as NFCA (ISO14443A) Poller (PCD)              */
+    RFAL_MODE_POLL_NFCA_T1T          = 2,    /*!< Mode to perform as NFCA T1T (Topaz) Poller (PCD)              */
+    RFAL_MODE_POLL_NFCB              = 3,    /*!< Mode to perform as NFCB (ISO14443B) Poller (PCD)              */
+    RFAL_MODE_POLL_B_PRIME           = 4,    /*!< Mode to perform as B' Calypso (Innovatron) (PCD)              */
+    RFAL_MODE_POLL_B_CTS             = 5,    /*!< Mode to perform as CTS Poller (PCD)                           */
+    RFAL_MODE_POLL_NFCF              = 6,    /*!< Mode to perform as NFCF (FeliCa) Poller (PCD)                 */
+    RFAL_MODE_POLL_NFCV              = 7,    /*!< Mode to perform as NFCV (ISO15963) Poller (PCD)               */
+    RFAL_MODE_POLL_PICOPASS          = 8,    /*!< Mode to perform as PicoPass / iClass Poller (PCD)             */
+    RFAL_MODE_POLL_ACTIVE_P2P        = 9,    /*!< Mode to perform as Active P2P (ISO18092) Initiator            */
+    RFAL_MODE_LISTEN_NFCA            = 10,   /*!< Mode to perform as NFCA (ISO14443A) Listener (PICC)           */
+    RFAL_MODE_LISTEN_NFCB            = 11,   /*!< Mode to perform as NFCA (ISO14443B) Listener (PICC)           */
+    RFAL_MODE_LISTEN_NFCF            = 12,   /*!< Mode to perform as NFCA (ISO15963) Listener (PICC)            */
+    RFAL_MODE_LISTEN_ACTIVE_P2P      = 13    /*!< Mode to perform as Active P2P (ISO18092) Target               */
+} rfalMode;
+
+
+/*! RFAL Bit rates    */
+typedef enum {
+    RFAL_BR_106                      = 0,    /*!< Bit Rate 106 kbit/s (fc/128)                                     */
+    RFAL_BR_212                      = 1,    /*!< Bit Rate 212 kbit/s (fc/64)                                      */
+    RFAL_BR_424                      = 2,    /*!< Bit Rate 424 kbit/s (fc/32)                                      */
+    RFAL_BR_848                      = 3,    /*!< Bit Rate 848 kbit/s (fc/16)                                      */
+    RFAL_BR_1695                     = 4,    /*!< Bit Rate 1695 kbit/s (fc/8)                                      */
+    RFAL_BR_3390                     = 5,    /*!< Bit Rate 3390 kbit/s (fc/4)                                      */
+    RFAL_BR_6780                     = 6,    /*!< Bit Rate 6780 kbit/s (fc/2)                                      */
+    RFAL_BR_52p97                    = 0xEB, /*!< Bit Rate 52.97 kbit/s (fc/256) Fast Mode VICC->VCD               */
+    RFAL_BR_26p48                    = 0xEC, /*!< Bit Rate 26,48 kbit/s (fc/512) NFCV VICC->VCD & VCD->VICC 1of4   */
+    RFAL_BR_1p66                     = 0xED, /*!< Bit Rate 1,66 kbit/s (fc/8192) NFCV VCD->VICC 1of256             */
+    RFAL_BR_KEEP                     = 0xFF  /*!< Value indicating to keep the same previous bit rate              */
+} rfalBitRate;
+
+
+/*! RFAL Compliance modes for upper modules  */
+typedef enum {
+    RFAL_COMPLIANCE_MODE_NFC,      /*!< Perform with NFC Forum 1.1 compliance */
+    RFAL_COMPLIANCE_MODE_EMV,      /*!< Perform with EMVCo compliance         */
+    RFAL_COMPLIANCE_MODE_ISO       /*!< Perform with ISO10373 compliance      */
+}rfalComplianceMode;
+
+
+/*! RFAL main states flags    */
+typedef enum {
+    RFAL_STATE_IDLE                  = 0,
+    RFAL_STATE_INIT                  = 1,
+    RFAL_STATE_MODE_SET              = 2,
+    
+    RFAL_STATE_TXRX                  = 3,
+    RFAL_STATE_LM                    = 4,
+    RFAL_STATE_WUM                   = 5
+    
+} rfalState;
+
+/*! RFAL transceive states    */
+typedef enum {
+    RFAL_TXRX_STATE_IDLE             = 0,
+    RFAL_TXRX_STATE_INIT             = 1,
+    RFAL_TXRX_STATE_START            = 2,
+        
+    RFAL_TXRX_STATE_TX_IDLE          = 11,
+    RFAL_TXRX_STATE_TX_WAIT_GT       = 12,
+    RFAL_TXRX_STATE_TX_WAIT_FDT      = 13,
+    RFAL_TXRX_STATE_TX_TRANSMIT      = 14,
+    RFAL_TXRX_STATE_TX_WAIT_WL       = 15,
+    RFAL_TXRX_STATE_TX_RELOAD_FIFO   = 16,
+    RFAL_TXRX_STATE_TX_WAIT_TXE      = 17,
+    RFAL_TXRX_STATE_TX_DONE          = 18,
+    RFAL_TXRX_STATE_TX_FAIL          = 19,
+    
+    RFAL_TXRX_STATE_RX_IDLE          = 81,
+    RFAL_TXRX_STATE_RX_WAIT_EON      = 82,
+    RFAL_TXRX_STATE_RX_WAIT_RXS      = 83,
+    RFAL_TXRX_STATE_RX_WAIT_RXE      = 84,
+    RFAL_TXRX_STATE_RX_READ_FIFO     = 85,
+    RFAL_TXRX_STATE_RX_ERR_CHECK     = 86,
+    RFAL_TXRX_STATE_RX_READ_DATA     = 87,
+    RFAL_TXRX_STATE_RX_WAIT_EOF      = 88,
+    RFAL_TXRX_STATE_RX_DONE          = 89,
+    RFAL_TXRX_STATE_RX_FAIL          = 90,
+    
+} rfalTransceiveState;
+
+
+/*! RFAL transceive flags    */
+enum {
+    RFAL_TXRX_FLAGS_CRC_TX_AUTO      = (0<<0),  /*!< CRC will be generated automatic upon transmission                                     */
+    RFAL_TXRX_FLAGS_CRC_TX_MANUAL    = (1<<0),  /*!< CRC was calculated manually, included in txBuffer                                     */
+    RFAL_TXRX_FLAGS_CRC_RX_KEEP      = (1<<1),  /*!< Upon Reception keep the CRC in rxBuffer (reflected on rcvd length)                    */
+    RFAL_TXRX_FLAGS_CRC_RX_REMV      = (0<<1),  /*!< Upon Reception remove the CRC from rxBuffer                                           */
+    RFAL_TXRX_FLAGS_NFCIP1_ON        = (1<<2),  /*!< Enable NFCIP1 mode: Add SB(F0) and LEN bytes during Tx and skip SB(F0) byte during Rx */
+    RFAL_TXRX_FLAGS_NFCIP1_OFF       = (0<<2),  /*!< Disable NFCIP1 mode: do not append protocol bytes while Tx nor skip while Rx          */
+    RFAL_TXRX_FLAGS_AGC_OFF          = (1<<3),  /*!< Disable Automatic Gain Control, improving multiple devices collision detection        */
+    RFAL_TXRX_FLAGS_AGC_ON           = (0<<3),  /*!< Enable Automatic Gain Control, improving single device reception                      */
+    RFAL_TXRX_FLAGS_PAR_RX_KEEP      = (1<<4),  /*!< Disable Parity and CRC check and keep the Parity and CRC bits in the received buffer  */
+    RFAL_TXRX_FLAGS_PAR_RX_REMV      = (0<<0),  /*!< Enable Parity check and remove the parity bits from the received buffer               */
+    RFAL_TXRX_FLAGS_PAR_TX_NONE      = (1<<5),  /*!< Disable automatic Parity generation (ISO14443A) and use the one provided in the buffer*/
+    RFAL_TXRX_FLAGS_PAR_TX_AUTO      = (0<<5),  /*!< Enable automatic Parity generation (ISO14443A)                                        */
+    RFAL_TXRX_FLAGS_NFCV_FLAG_MANUAL = (1<<6),  /*!< Disable automatic adaption of flag byte (ISO15693) according to current comm params   */
+    RFAL_TXRX_FLAGS_NFCV_FLAG_AUTO   = (0<<6),  /*!< Enable automatic adaption of flag byte (ISO115693) according to current comm params   */
+};
+
+
+/*! RFAL error handling     */
+typedef enum {
+    RFAL_ERRORHANDLING_NONE          = 0,     /*!< No special error handling will be performed                                            */
+    RFAL_ERRORHANDLING_NFC           = 1,     /*!< Error handling set to perform as NFC complaint device                                  */
+    RFAL_ERRORHANDLING_EMVCO         = 2      /*!< Error handling set to perform as EMVCo complaint device                                */
+} rfalEHandling;
+
+
+/*! Struct that holds all context to be used on a Transceive                                            */
+typedef struct {
+    uint8_t*              txBuf;              /*!< (In)  Buffer where outgoing message is located       */
+    uint16_t              txBufLen;           /*!< (In)  Length of the outgoing message in bits         */
+    
+    uint8_t*              rxBuf;              /*!< (Out) Buffer where incoming message will be placed   */
+    uint16_t              rxBufLen;           /*!< (In)  Maximum length of the incoming message in bits */
+    uint16_t*             rxRcvdLen;          /*!< (Out) Actual received length in bits                 */
+    
+    uint32_t              flags;              /*!< (In)  TransceiveFlags indication special handling    */
+    uint32_t              fwt;                /*!< (In)  Frame Waiting Time in 1/fc                     */
+} rfalTransceiveContext;
+
+
+/*! System callback to indicate an event that requires a system reRun        */
+typedef void (* rfalUpperLayerCallback)(void);
+
+/*! Callback to be executed before a Transceive                              */
+typedef void (* rfalPreTxRxCallback)(void);
+
+/*! Callback to be executed after a Transceive                               */
+typedef void (* rfalPostTxRxCallback)(void);
+
+
+/*******************************************************************************/
+/*  ISO14443A                                                                  */
+/*******************************************************************************/
+
+/*! RFAL ISO 14443A Short Frame Command */
+typedef enum
+{
+     RFAL_14443A_SHORTFRAME_CMD_WUPA = 0x52,  /*!< ISO14443A WUPA / NFC-A ALL_REQ  */
+     RFAL_14443A_SHORTFRAME_CMD_REQA = 0x26   /*!< ISO14443A REQA / NFC-A SENS_REQ */    
+} rfal14443AShortFrameCmd;
+
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/*  FeliCa                                                                     */
+/*******************************************************************************/
+
+#define RFAL_FELICA_LEN_LEN                        1                                      /*!< FeliCa LEN byte length                                              */
+#define RFAL_FELICA_POLL_REQ_LEN                   (RFAL_FELICA_LEN_LEN + 1 + 2 + 1 + 1)  /*!< FeliCa Poll Request length (LEN + CMD + SC + RC + TSN)              */
+#define RFAL_FELICA_POLL_RES_LEN                   (RFAL_FELICA_LEN_LEN + 1 + 8 + 8 + 2)  /*!< Maximum FeliCa Poll Response length (LEN + CMD + NFCID2 + PAD + RD) */
+#define RFAL_FELICA_POLL_MAX_SLOTS                 16                                     /*!< Maximum number of slots (TSN) on FeliCa Poll                        */
+
+
+/*! NFC-F RC (Request Code) codes  NFC Forum Digital 1.1 Table 42 */
+enum 
+{
+    RFAL_FELICA_POLL_RC_NO_REQUEST        =     0x00,                                  /*!< RC: No System Code information requested */
+    RFAL_FELICA_POLL_RC_SYSTEM_CODE       =     0x01,                                  /*!< RC: System Code information requested    */
+    RFAL_FELICA_POLL_RC_COM_PERFORMANCE   =     0x02                                   /*!< RC: Advanced protocol features supported */
+};
+
+
+/*! NFC-F TSN (Time Slot Number) codes  NFC Forum Digital 1.1 Table 43 */
+typedef enum 
+{
+    RFAL_FELICA_1_SLOT    =  0,   /*!< TSN with number of Time Slots: 1  */
+    RFAL_FELICA_2_SLOTS   =  1,   /*!< TSN with number of Time Slots: 2  */
+    RFAL_FELICA_4_SLOTS   =  3,   /*!< TSN with number of Time Slots: 4  */
+    RFAL_FELICA_8_SLOTS   =  7,   /*!< TSN with number of Time Slots: 8  */
+    RFAL_FELICA_16_SLOTS  =  15   /*!< TSN with number of Time Slots: 16 */
+} rfalFeliCaPollSlots;
+
+
+/*! NFCF Poll Response  NFC Forum Digital 1.1 Table 44 */
+typedef uint8_t rfalFeliCaPollRes[RFAL_FELICA_POLL_RES_LEN];
+
+
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/*  Listen Mode                                                                */  
+/*******************************************************************************/
+
+/*! RFAL Listen Mode NFCID Length */
+typedef enum 
+{
+    RFAL_LM_NFCID_LEN_04               = 4,         /*!< Listen mode indicates  4 byte NFCID         */
+    RFAL_LM_NFCID_LEN_07               = 7,         /*!< Listen mode indicates  7 byte NFCID         */
+    RFAL_LM_NFCID_LEN_10               = 10,        /*!< Listen mode indicates 10 byte NFCID         */   
+} rfalLmNfcidLen;
+
+
+/*! RFAL Listen Mode States */
+typedef enum 
+{
+    RFAL_LM_STATE_NOT_INIT              = 0x00,     /*!< Not Initialized state                       */
+    RFAL_LM_STATE_POWER_OFF             = 0x01,     /*!< Power Off state                             */
+    RFAL_LM_STATE_IDLE                  = 0x02,     /*!< Idle state  Activity 1.1  5.2               */
+    RFAL_LM_STATE_READY_A               = 0x03,     /*!< Ready A state  Activity 1.1  5.3 5.4 & 5.5  */
+    RFAL_LM_STATE_READY_B               = 0x04,     /*!< Ready B state  Activity 1.1  5.11 5.12      */
+    RFAL_LM_STATE_READY_F               = 0x05,     /*!< Ready F state  Activity 1.1  5.15           */
+    RFAL_LM_STATE_ACTIVE_A              = 0x06,     /*!< Active A state  Activity 1.1  5.6           */
+    RFAL_LM_STATE_CARDEMU_4A            = 0x07,     /*!< Card Emulation 4A state  Activity 1.1  5.10 */
+    RFAL_LM_STATE_CARDEMU_4B            = 0x08,     /*!< Card Emulation 4B state  Activity 1.1  5.14 */
+    RFAL_LM_STATE_CARDEMU_3             = 0x09,     /*!< Card Emulation 3 state  Activity 1.1  5.18  */
+    RFAL_LM_STATE_TARGET_A              = 0x0A,     /*!< Target A state  Activity 1.1  5.9           */
+    RFAL_LM_STATE_TARGET_F              = 0x0B,     /*!< Target F state  Activity 1.1  5.17          */
+    RFAL_LM_STATE_SLEEP_A               = 0x0C,     /*!< Sleep A state  Activity 1.1  5.7            */
+    RFAL_LM_STATE_SLEEP_B               = 0x0D,     /*!< Sleep B state  Activity 1.1  5.13           */
+    RFAL_LM_STATE_READY_Ax              = 0x0E,     /*!< Ready A* state  Activity 1.1  5.3 5.4 & 5.5 */
+    RFAL_LM_STATE_ACTIVE_Ax             = 0x0F,     /*!< Active A* state  Activity 1.1  5.6          */
+    RFAL_LM_STATE_SLEEP_AF              = 0x10,     /*!< Sleep AF state  Activity 1.1  5.19          */
+} rfalLmState;
+
+
+/*! RFAL Listen Mode Passive A configs */
+typedef struct 
+{
+    rfalLmNfcidLen   nfcidLen;                        /*!<  NFCID Len (00: 4bytes ; 01: 7bytes)      */
+    uint8_t          nfcid[RFAL_NFCID3_LEN];          /*!<  NFCID                                    */
+    uint8_t          SENS_RES[RFAL_LM_SENS_RES_LEN];  /*!<  NFC-106k; SENS_REQ Response              */
+    uint8_t          SEL_RES;                         /*!<  SEL_RES (SAK) with complete NFCID1 (UID) */
+} rfalLmConfPA;
+
+
+/*! RFAL Listen Mode Passive B configs */
+typedef struct 
+{
+    uint8_t          SENSB_RES[RFAL_LM_SENSB_RES_LEN];  /*!<  SENSF_RES                                */
+} rfalLmConfPB;
+
+
+/*! RFAL Listen Mode Passive F configs */
+typedef struct 
+{
+    uint8_t          SC[RFAL_LM_SENSF_SC_LEN];          /*!<  System Code to listen for                */
+    uint8_t          SENSF_RES[RFAL_LM_SENSF_RES_LEN];  /*!<  SENSF_RES                                */
+} rfalLmConfPF;
+
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/*  Wake-Up Mode                                                               */  
+/*******************************************************************************/
+
+/*! RFAL Wake-Up Mode States */
+typedef enum 
+{
+    RFAL_WUM_STATE_NOT_INIT              = 0x00,     /*!< Not Initialized state                       */
+    RFAL_WUM_STATE_ENABLED               = 0x01,     /*!< Wake-Up mode is enabled                     */
+    RFAL_WUM_STATE_ENABLED_WOKE          = 0x02,     /*!< Wake-Up mode enabled and has received IRQ(s)*/
+} rfalWumState;
+/*******************************************************************************/
+
+/*
+******************************************************************************
+* GLOBAL FUNCTION PROTOTYPES
+******************************************************************************
+*/
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Initialize
+ *  
+ * Initializes RFAL layer and the ST25R391x
+ * Ensures that ST25R391x is properly connected and returns error if any problem 
+ * is detected
+ *
+ * \warning rfalAnalogConfigInitialize() should be called before so that 
+ *           the Analog config table has been previously initialized.
+ *           
+ * \return ERR_HW_MISMATCH  : Expected HW do not match or communication error
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalInitialize( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief  RFAL Calibrate 
+ *  
+ * Performs necessary calibration of RF chip in case it is indicated by current
+ * register settings. E.g. antenna calibration and regulator calibration
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized
+ * \return ERR_NONE         : No error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalCalibrate( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief  RFAL Adjust Regulators 
+ *  
+ * Adjusts ST25R391x regulators 
+ * 
+ * \param[out]  result : the result of the calibrate antenna in mV
+ *                       NULL if result not requested
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized
+ * \return ERR_NONE         : No error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalAdjustRegulators( uint16_t* result, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+
+
+/*!
+ *****************************************************************************
+ * \brief RFAL Set System Callback
+ *
+ * Sets a callback for the driver to call when an event has occurred that 
+ * may require the system to be notified
+ * 
+ * \param[in]  pFunc : method pointer for the upper layer callback 
+ * 
+ *****************************************************************************
+ */
+void rfalSetUpperLayerCallback( rfalUpperLayerCallback pFunc );
+
+
+/*!
+ *****************************************************************************
+ * \brief RFAL Set Pre Tx Callback
+ *
+ * Sets a callback for the driver to call before a Transceive 
+ * 
+ * \param[in]  pFunc : method pointer for the Pre Tx callback 
+ * 
+ *****************************************************************************
+ */
+void rfalSetPreTxRxCallback( rfalPreTxRxCallback pFunc );
+
+/*!
+ *****************************************************************************
+ * \brief RFAL Set Post Tx Callback
+ *
+ * Sets a callback for the driver to call after a Transceive 
+ * 
+ * \param[in]  pFunc : method pointer for the Post Tx callback 
+ * 
+ *****************************************************************************
+ */
+void rfalSetPostTxRxCallback( rfalPostTxRxCallback pFunc );
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Deinitialize
+ *  
+ * Deinitializes RFAL layer and the ST25R391x
+ *
+ * \return ERR_NONE : No error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalDeinitialize( 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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set Mode
+ *  
+ * Sets the mode that RFAL will operate on the following communications.
+ * Proper initializations will be performed on the ST25R391x
+ * 
+ * \warning bit rate value RFAL_BR_KEEP is not allowed, only in rfalSetBitRate()
+ * 
+ * \warning the mode will be applied immediately on the RFchip regardless of 
+ *          any ongoing operations like Transceive, ListenMode
+ * 
+ * \param[in]  mode : mode for the RFAL/RFchip to perform
+ * \param[in]  txBR : transmit bit rate
+ * \param[in]  rxBR : receive bit rate 
+ * 
+ * \see rfalIsGTDone
+ * \see rfalMode
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized
+ * \return ERR_PARAM        : Invalid parameter
+ * \return ERR_NONE         : No error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalSetMode( rfalMode mode, rfalBitRate txBR, rfalBitRate rxBR,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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Get Mode
+ *  
+ * Gets the mode that RFAL is set to operate
+ * 
+ * \see rfalMode
+ *
+ * \return rfalMode : The current RFAL mode
+ *****************************************************************************
+ */
+rfalMode rfalGetMode( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set Bit Rate
+ *  
+ * Sets the Tx and Rx bit rates with the given values 
+ * The bit rate change is applied on the RF chip remaining in the same  
+ * mode previous defined with rfalSetMode()
+ * 
+ * If no mode is defined bit rates will not be applied and an error 
+ * is returned
+ * 
+ * \param[in]  txBR : transmit bit rate
+ * \param[in]  rxBR : receive bit rate 
+ * 
+ * \see rfalSetMode
+ * \see rfalMode
+ * \see rfalBitRate
+ *
+ * \return ERR_WRONG_STATE     : RFAL not initialized
+ * \return ERR_PARAM           : Invalid parameter
+ * \return ERR_NOT_IMPLEMENTED : Mode not implemented
+ * \return ERR_NONE            : No error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalSetBitRate( rfalBitRate txBR, rfalBitRate rxBR, 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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Get Bit Rate
+ *  
+ * Gets the Tx and Rx current bit rates 
+ * 
+ * If RFAL is not initialized or mode not set the bit rates return will 
+ * be invalid RFAL_BR_KEEP
+ * 
+ * \param[out]  txBR : RFAL's current Tx Bit Rate
+ * \param[out]  rxBR : RFAL's current Rx Bit Rate
+ * 
+ * \see rfalSetBitRate
+ * \see rfalBitRate
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalGetBitRate( rfalBitRate *txBR, rfalBitRate *rxBR );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set Modulated RFO
+ *
+ * Sets the RFO value to be used in the modulated state
+ * 
+ * \param[in] rfo : the RFO value to be used
+ *
+ * \return  ERR_IO           : Internal error
+ * \return  ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSetModulatedRFO( uint8_t rfo, 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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Get Modulated RFO
+ *
+ * Gets the RFO value used in the modulated state
+ *
+ * \return  ERR_IO           : Internal error
+ * \return  ERR_NONE         : No error
+ *****************************************************************************
+ */
+uint8_t rfalGetModulatedRFO( 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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Measure RF Amplitude
+ *
+ * Measures the RF Amplitude
+ *
+ * \param[out] result : result of RF measurement
+ *
+ * \return  ERR_IO           : Internal error
+ * \return  ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalMeasureRF( uint8_t* result, 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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief Set Error Handling Mode
+ *  
+ *  Sets the error handling mode to be used by the RFAL
+ *  
+ * \param[in]  eHandling : the error handling mode
+ * 
+ *****************************************************************************
+ */
+void rfalSetErrorHandling( rfalEHandling eHandling );
+
+
+/*! 
+ *****************************************************************************
+ * \brief Get Error Handling Mode
+ *  
+ *  Gets the error handling mode currently used by the RFAL 
+ *  
+ * \return rfalEHandling : Current error handling mode
+ *****************************************************************************
+ */
+rfalEHandling rfalGetErrorHandling( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief Set Observation Mode
+ *  
+ * Sets ST25R391x observation modes for RF debug purposes
+ *
+ * \param[in]  txMode : the observation mode to be used during transmission
+ * \param[in]  rxMode : the observation mode to be used during reception
+ * 
+ * \warning The Observation Mode is an advanced feature and should be set 
+ *          according to the documentation of the part number in use.
+ *          Please refer to the corresponding Datasheet or Application Note(s)
+ *****************************************************************************
+ */
+void rfalSetObsvMode( uint8_t txMode, uint8_t rxMode );
+
+
+/*! 
+ *****************************************************************************
+ * \brief Get Observation Mode
+ *  
+ * Gets ST25R391x the current configured observation modes
+ *
+ * \param[in]  txMode : the current observation mode configured for transmission
+ * \param[in]  rxMode : the current observation mode configured for reception
+ * 
+ *****************************************************************************
+ */
+void rfalGetObsvMode( uint8_t* txMode, uint8_t* rxMode );
+
+
+/*! 
+ *****************************************************************************
+ * \brief Disable Observation Mode
+ *  
+ * Disables the ST25R391x observation mode
+ *****************************************************************************
+ */
+void rfalDisableObsvMode( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set FDT Poll
+ *  
+ * Sets the Frame Delay Time (FDT) to be used on the following
+ * communications.
+ * 
+ * FDT Poll is the minimum time following a Poll Frame during 
+ * which no subsequent Poll Frame can be sent (without a response from 
+ * the Listener in between)
+ * FDTx,PP,MIN - Digital 1.1  6.10.2  &  7.9.2  &  8.7.2
+ * 
+ * \param[in]  fdt : Frame Delay Time in 1/fc cycles
+ *
+ *****************************************************************************
+ */
+void rfalSetFDTPoll( uint32_t fdt );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set FDT Poll
+ *  
+ * Gets the current Frame Delay Time (FDT) 
+ * 
+ * FDT Poll is the minimum time following a Poll Frame during 
+ * which no subsequent Poll Frame can be sent (without a response from 
+ * the Listener in between)
+ * FDTx,PP,MIN - Digital 1.1  6.10.2  &  7.9.2  &  8.7.2
+ *  
+ * \return FDT : current FDT value in 1/fc cycles
+ *
+ *****************************************************************************
+ */
+uint32_t rfalGetFDTPoll( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set FDT Listen
+ *  
+ * Sets the Frame Delay Time (FDT) Listen minimum to be used on the 
+ * following communications.
+ * 
+ * FDT Listen is the minimum time between a Poll Frame and a Listen Frame
+ * FDTx,LISTEN,MIN - Digital 1.1  6.10.1  &  7.9.1  &  8.7.1
+ *  
+ * \param[in]  fdt : Frame Delay Time in 1/fc cycles
+ *
+ *****************************************************************************
+ */
+void rfalSetFDTListen( uint32_t fdt );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set FDT Listen
+ *  
+ * Gets the Frame Delay Time (FDT) Listen minimum  
+ * 
+ * FDT Listen is the minimum time between a Poll Frame and a Listen Frame
+ * FDTx,LISTEN,MIN - Digital 1.1  6.10.1  &  7.9.1  &  8.7.1
+ *  
+ * \return FDT : current FDT value in 1/fc cycles
+ *
+ *****************************************************************************
+ */
+uint32_t rfalGetFDTListen( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Get GT
+ *  
+ * Gets the current Guard Time (GT)
+ *  
+ * GT is the minimum time when a device in Listen Mode is exposed to an 
+ * unmodulated carrier
+ *  
+ * \return GT :  Guard Time in 1/fc cycles
+ *
+ *****************************************************************************
+ */
+uint32_t rfalGetGT( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set GT
+ *  
+ * Sets the Guard Time (GT) to be used on the following communications.
+ * 
+ * GT is the minimum time when a device in Listen Mode is exposed to an 
+ * unmodulated carrier
+ *  
+ * \param[in]  gt : Guard Time in 1/fc cycles
+ *                  RFAL_GT_NONE if no GT should be applied
+ *
+ *****************************************************************************
+ */
+void rfalSetGT( uint32_t gt );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Is GT expired 
+ *  
+ * Checks whether the GT timer has expired
+ *    
+ * \return true  : GT has expired or not running
+ * \return false : GT is still running
+ *
+ *****************************************************************************
+ */
+bool rfalIsGTExpired( void );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Turn Field On and Start GT
+ *  
+ * Turns the Field On, performing Initial Collision Avoidance
+ * 
+ * After Field On, if GT was set before, it starts the GT timer to be 
+ * used on the following communications.
+ *  
+ * \return ERR_RF_COLLISION : External field detected
+ * \return ERR_NONE         : Field turned On
+ *
+ *****************************************************************************
+ */
+ReturnCode rfalFieldOnAndStartGT( 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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Turn Field Off
+ *  
+ * Turns the Field Off  
+ *   
+ * \return ERR_NONE : Field turned Off
+ *****************************************************************************
+ */
+ReturnCode rfalFieldOff( 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 );
+
+
+
+/*****************************************************************************
+ *  Transceive                                                               *  
+ *****************************************************************************/
+
+/*! 
+ *****************************************************************************
+ * \brief  RFAL Set transceive context
+ *  
+ * Set the context that will be used for the following Transceive
+ * Output and input buffers have to be passed and all other details prior to 
+ * the Transceive itself has been started
+ * 
+ * This method only sets the context, once set rfalWorker has
+ * to be executed until is done
+ * 
+ * \param[in]  ctx : the context for the following Transceive
+ * 
+ * \see  rfalWorker
+ * \see  rfalGetTransceiveStatus
+ *
+ * \return ERR_NONE        : Done with no error
+ * \return ERR_WRONG_STATE : Not initialized properly 
+ *****************************************************************************
+ */
+ReturnCode rfalStartTransceive( rfalTransceiveContext *ctx,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 );
+
+
+/*! 
+ *****************************************************************************
+ * \brief  Get Transceive State
+ *  
+ * Gets current Transceive internal State
+ *
+ * \return rfalTransceiveState : the current Transceive internal State
+ *****************************************************************************
+ */
+rfalTransceiveState rfalGetTransceiveState( void );
+
+/*! 
+ *****************************************************************************
+ * \brief  Get Transceive Status
+ *  
+ * Gets current Transceive status
+ *
+ * \return  ERR_NONE         : Transceive done with no error
+ * \return  ERR_BUSY         : Transceive ongoing
+ * \return  ERR_XXXX         : Error occurred
+ * \return  ERR_TIMEOUT      : No response
+ * \return  ERR_FRAMING      : Framing error detected
+ * \return  ERR_PAR          : Parity error detected
+ * \return  ERR_CRC          : CRC error detected
+ * \return  ERR_LINK_LOSS    : Link Loss - External Field is Off
+ * \return  ERR_RF_COLLISION : Collision detected
+ * \return  ERR_IO           : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalGetTransceiveStatus( void );
+
+
+/*! 
+ *****************************************************************************
+ *  \brief RFAL Worker
+ *  
+ *  This runs RFAL layer, which drives the actual Transceive procedure
+ *  It MUST be executed frequently in order to execute the RFAL internal
+ *  states and perform the requested operations
+ *
+ *****************************************************************************
+ */
+void rfalWorker( 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 );
+
+
+/*****************************************************************************
+ *  ISO1443A                                                                 *  
+ *****************************************************************************/
+
+/*! 
+ *****************************************************************************
+ *  \brief Transceives an ISO14443A ShortFrame  
+ *  
+ *  Sends REQA to detect if there is any PICC in the field 
+ *
+ * \param[in]  txCmd:     Command to be sent:
+ *                           0x52 WUPA / ALL_REQ
+ *                           0x26 REQA / SENS_REQ
+ *                           
+ * \param[in]  txCmd    : type of short frame to be sent REQA or WUPA                          
+ * \param[out] rxBuf    : buffer to place the response
+ * \param[in]  rxBufLen : length of rxBuf
+ * \param[out] rxRcvdLen: received length
+ * \param[in]  fwt      : Frame Waiting Time in 1/fc
+ * 
+ * \warning If fwt is set to RFAL_FWT_NONE it will make endlessly for 
+ *         a response, which on a blocking method may not be the 
+ *         desired usage 
+ * 
+ * \return ERR_NONE if there is response
+ * \return ERR_TIMEOUT if there is no response
+ * \return ERR_COLLISION collision has occurred
+ *  
+ *****************************************************************************
+ */
+ReturnCode rfalISO14443ATransceiveShortFrame( rfal14443AShortFrameCmd txCmd, uint8_t* rxBuf, uint8_t rxBufLen, uint16_t* rxRcvdLen, uint32_t fwt, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Sends an ISO14443A Anticollision Frame 
+ * 
+ * This is use to perform ISO14443A anti-collision. 
+ * \note Anticollision is sent without CRC
+ * 
+ * 
+ * \param[in]   buf        : reference to ANTICOLLISION command (with known UID if any) to be sent (also out param)
+ *                           reception will be place on this buf after bytesToSend 
+ * \param[in]   bytesToSend: reference number of full bytes to be sent (including CMD byte and SEL_PAR)
+ *                           if a collision occurs will contain the number of clear bytes  
+ * \param[in]   bitsToSend : reference to number of bits (0-7) to be sent; and received (also out param)
+ *                           if a collision occurs will indicate the number of clear bits (also out param)
+ * \param[out]  rxLength   : reference to the return the received length
+ * \param[in]   fwt        : Frame Waiting Time in 1/fc
+ * 
+ * \return ERR_NONE if there is no error
+ *****************************************************************************
+ */
+ReturnCode rfalISO14443ATransceiveAnticollisionFrame( uint8_t *buf, uint8_t *bytesToSend, uint8_t *bitsToSend, uint16_t *rxLength, uint32_t fwt, 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 );
+
+
+/*****************************************************************************
+ *  FeliCa                                                                   *  
+ *****************************************************************************/
+
+/*!
+ *****************************************************************************
+ * \brief FeliCa Poll 
+ * 
+ * Sends a Poll Request and collects all Poll Responses according to the 
+ * given slots  
+ * 
+ * 
+ * \param[in]   slots             : number of slots for the Poll Request
+ * \param[in]   sysCode           : system code (SC) for the Poll Request  
+ * \param[in]   reqCode           : request code (RC) for the Poll Request
+ * \param[out]  pollResList       : list of all responses
+ * \param[in]   pollResListSize   : number of responses that can be placed in pollResList 
+ * \param[out]  devicesDetected   : number of cards found
+ * \param[out]  collisionsDetected: number of collisions detected
+ * 
+ * \return ERR_NONE if there is no error
+ * \return ERR_TIMEOUT if there is no response
+ *****************************************************************************
+ */
+ReturnCode rfalFeliCaPoll( rfalFeliCaPollSlots slots, uint16_t sysCode, uint8_t reqCode, rfalFeliCaPollRes* pollResList,
+		uint8_t pollResListSize, uint8_t *devicesDetected,
+		uint8_t *collisionsDetected, 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 );
+
+
+/*****************************************************************************
+ *  ISO15693                                                                 *  
+ *****************************************************************************/
+
+/*!
+ *****************************************************************************
+ * \brief Sends an ISO15693 Anticollision Frame 
+ * 
+ * This send the Anticollision|Inventory frame (INVENTORY_REQ)
+ *
+ * \warning rxBuf must be able to contain the payload and CRC
+ * 
+ * \param[in]  txBuf        : Buffer where outgoing message is located
+ * \param[in]  txBufLen     : Length of the outgoing message in bytes
+ * \param[out] rxBuf        : Buffer where incoming message will be placed
+ * \param[in]  rxBufLen     : Maximum length of the incoming message in bytes
+ * \param[out] actLen       : Actual received length in bits
+ * 
+ * \return  ERR_NONE        : Transceive done with no error
+ * \return  ERR_WRONG_STATE : RFAL not initialized or mode not set
+ * \return  ERR_IO          : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalISO15693TransceiveAnticollisionFrame( uint8_t *txBuf, uint8_t txBufLen, uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Sends an ISO15693 Anticollision EOF
+ * 
+ * This sends the Anticollision|Inventory EOF used as a slot marker
+ * 
+ * \warning rxBuf must be able to contain the payload and CRC
+ * 
+ * \param[out] rxBuf        : Buffer where incoming message will be placed
+ * \param[in] rxBufLen      : Maximum length of the incoming message in bytes
+ * \param[out] actLen       : Actual received length in bits
+ * 
+ * \return  ERR_NONE        : Transceive done with no error
+ * \return  ERR_WRONG_STATE : RFAL not initialized or mode not set
+ * \return  ERR_IO          : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalISO15693TransceiveAnticollisionEOF( uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Sends an ISO15693 Slot Marker 
+ *
+ * This is method sends an ISO15693 (EoF) used for a Write operation
+ * 
+ * \warning rxBuf must be able to contain the payload and CRC
+ * 
+ * \param[out] rxBuf        : Buffer where incoming message will be placed
+ * \param[in] rxBufLen      : Maximum length of the incoming message in bytes
+ * \param[out] actLen       : Actual received length in bytes
+ * 
+ * \return  ERR_NONE        : Transceive done with no error
+ * \return  ERR_IO          : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalISO15693TransceiveEOF( uint8_t *rxBuf, uint8_t rxBufLen, uint16_t *actLen, SPI* mspiChannel, ST25R3911* mST25, DigitalOut* gpio_cs, InterruptIn* IRQ  );
+
+
+/*!
+ *****************************************************************************
+ * \brief Transceive Blocking Tx 
+ *
+ * This is method triggers a Transceive and executes it blocking until the 
+ * Tx has been completed
+ * 
+ * \param[in]  txBuf    : Buffer where outgoing message is located
+ * \param[in]  txBufLen : Length of the outgoing message in bytes
+ * \param[out] rxBuf    : Buffer where incoming message will be placed
+ * \param[in]  rxBufLen : Maximum length of the incoming message in bytes
+ * \param[out] actLen   : Actual received length in bits
+ * \param[in]  flags    : TransceiveFlags indication special handling
+ * \param[in]  fwt      : Frame Waiting Time in 1/fc
+ * 
+ * \return  ERR_NONE         : Transceive done with no error
+ * \return  ERR_BUSY         : Transceive ongoing
+ * \return  ERR_XXXX         : Error occurred
+ * \return  ERR_LINK_LOSS    : Link Loss - External Field is Off
+ * \return  ERR_RF_COLLISION : Collision detected
+ * \return  ERR_IO           : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalTransceiveBlockingTx( uint8_t* txBuf, uint16_t txBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* actLen, uint32_t flags, uint32_t fwt, 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 );
+
+/*!
+ *****************************************************************************
+ * \brief Transceive Blocking Rx 
+ *
+ * This is method executes the reception of an ongoing Transceive triggered 
+ * before by rfalTransceiveBlockingTx()
+ * 
+ * \return  ERR_NONE         : Transceive done with no error
+ * \return  ERR_BUSY         : Transceive ongoing
+ * \return  ERR_XXXX         : Error occurred
+ * \return  ERR_TIMEOUT      : No response
+ * \return  ERR_FRAMING      : Framing error detected
+ * \return  ERR_PAR          : Parity error detected
+ * \return  ERR_CRC          : CRC error detected
+ * \return  ERR_LINK_LOSS    : Link Loss - External Field is Off
+ * \return  ERR_RF_COLLISION : Collision detected
+ * \return  ERR_IO           : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalTransceiveBlockingRx( 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 );
+
+/*!
+ *****************************************************************************
+ * \brief Transceive Blocking 
+ *
+ * This is method triggers a Transceive and executes it blocking until it 
+ * has been completed
+ * 
+ * \param[in]  txBuf    : Buffer where outgoing message is located
+ * \param[in]  txBufLen : Length of the outgoing message in bytes
+ * \param[out] rxBuf    : Buffer where incoming message will be placed
+ * \param[in]  rxBufLen : Maximum length of the incoming message in bytes
+ * \param[out] actLen   : Actual received length in bytes
+ * \param[in]  flags    : TransceiveFlags indication special handling
+ * \param[in]  fwt      : Frame Waiting Time in 1/fc
+ * 
+ * \return  ERR_NONE         : Transceive done with no error
+ * \return  ERR_BUSY         : Transceive ongoing
+ * \return  ERR_XXXX         : Error occurred
+ * \return  ERR_TIMEOUT      : No response
+ * \return  ERR_FRAMING      : Framing error detected
+ * \return  ERR_PAR          : Parity error detected
+ * \return  ERR_CRC          : CRC error detected
+ * \return  ERR_LINK_LOSS    : Link Loss - External Field is Off
+ * \return  ERR_RF_COLLISION : Collision detected
+ * \return  ERR_IO           : Internal error
+ *****************************************************************************
+ */
+ReturnCode rfalTransceiveBlockingTxRx( uint8_t* txBuf, uint16_t txBufLen, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t* actLen, uint32_t flags, uint32_t fwt, 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 );
+
+
+
+/*****************************************************************************
+ *  Listen Mode                                                              *  
+ *****************************************************************************/
+
+/*!
+ *****************************************************************************
+ * \brief Is external Field On
+ * 
+ * Checks if external field (other peer/device) is on/detected
+ * 
+ *  
+ * 
+ * \return true  External field is On
+ * \return false No external field is detected
+ * 
+ *****************************************************************************
+ */
+bool rfalIsExtFieldOn( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Listen Mode start
+ * 
+ * Configures RF Chip to go into listen mode enabling the given technologies
+ * 
+ * 
+ * \param[in]  lmMask:    mask with the enabled/disabled listen modes
+ *                        use: RFAL_LM_MASK_NFCA ; RFAL_LM_MASK_NFCB ; 
+ *                             RFAL_LM_MASK_NFCF ; RFAL_LM_MASK_ACTIVE_P2P 
+ * \param[in]  confA:     pointer to Passive A configurations (NULL if disabled)
+ * \param[in]  confB:     pointer to Passive B configurations (NULL if disabled)
+ * \param[in]  confF:     pointer to Passive F configurations (NULL if disabled)
+ * \param[in]  rxBuf:     buffer to place incoming data
+ * \param[in]  rxBufLen:  length in bits of rxBuf
+ * \param[in]  rxLen:     pointer to write the data length in bits placed into rxBuf
+ *  
+ * 
+ * \return ERR_PARAM    Invalid parameter
+ * \return ERR_REQUEST  Invalid listen mode mask
+ * \return ERR_NONE     Done with no error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalListenStart( uint32_t lmMask, rfalLmConfPA *confA, rfalLmConfPB *confB, rfalLmConfPF *confF, uint8_t *rxBuf,
+		uint16_t rxBufLen, uint16_t *rxLen, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Listen Mode start Sleeping
+ * 
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalListenSleepStart( rfalLmState sleepSt, uint8_t *rxBuf, uint16_t rxBufLen, uint16_t *rxLen );
+
+
+/*!
+ *****************************************************************************
+ * \brief Listen Mode Stop
+ * 
+ * Disables the listen mode on the RF Chip 
+ * 
+ * \warning the listen mode will be disabled immediately on the RFchip regardless 
+ *          of any ongoing operations like Transceive
+ * 
+ * \return ERR_NONE Done with no error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalListenStop(   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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Listen Mode get state
+ *
+ * Sets the new state of the Listen Mode and applies the necessary changes 
+ * on the RF Chip
+ *
+ * \param[out]  dataFlag: indicates that Listen Mode has rcvd data and caller
+ *                         must process it. The received message is located
+ *                         at the rxBuf passed on rfalListenStart()
+ *                         rfalListenSetState() will clear this flag
+ *                         if NULL output parameter will no be written/returned
+ * \param[out]  lastBR:   bit rate detected  of the last initiator request 
+ *                         if NULL output parameter will no be written/returned
+ * 
+ * \return rfalLmState  RFAL_LM_STATE_NOT_INIT : LM not initialized properly
+ *                      Any Other              : LM State
+ * 
+ *****************************************************************************
+ */
+rfalLmState rfalListenGetState( bool *dataFlag, rfalBitRate *lastBR );
+
+
+/*!
+ *****************************************************************************
+ * \brief Listen Mode set state
+ *
+ * Sets the new state of the Listen Mode and applies the necessary changes 
+ * on the RF Chip
+ *  
+ * \param[in] newSt : New state to go to
+ * 
+ * \return ERR_WRONG_STATE : Not initialized properly
+ * \return ERR_PARAM       : Invalid parameter
+ * \return ERR_NONE        : Done with no error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalListenSetState( rfalLmState newSt, 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 );
+
+
+/*****************************************************************************
+ *  Wake-Up Mode                                                             *  
+ *****************************************************************************/
+
+/*!
+ *****************************************************************************
+ * \brief Wake-Up Mode Start
+ *
+ * Sets the RF Chip in Low Power Wake-Up Mode according to the given 
+ * configuration.
+ *  
+ * \param[in] config       : Generic Wake-Up configuration provided by lower 
+ *                            layers. If NULL will automatically configure the 
+ *                            Wake-Up mode
+ * 
+ * \return ERR_WRONG_STATE : Not initialized properly
+ * \return ERR_PARAM       : Invalid parameter
+ * \return ERR_NONE        : Done with no error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalWakeUpModeStart( void *config, ST25R3911* mST25, SPI* mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Wake-Up Has Woke
+ *
+ * Returns true if the Wake-Up mode is enabled and it has already received 
+ * the indication from the RF Chip that the surrounding environment has changed
+ * and flagged at least one wake-Up interrupt
+ * 
+ * \return true  : Wake-Up mode enabled and has received a wake-up IRQ
+ * \return false : no Wake-Up IRQ has been received
+ * 
+ *****************************************************************************
+ */
+bool rfalWakeUpModeHasWoke( ST25R3911* mST25, SPI* mspiChannel, DigitalOut* gpio_cs, InterruptIn* IRQ, DigitalOut* fieldLED_01, DigitalOut* fieldLED_02, DigitalOut* fieldLED_03, DigitalOut* fieldLED_04, DigitalOut* fieldLED_05, DigitalOut* fieldLED_06 );
+
+
+/*!
+ *****************************************************************************
+ * \brief Wake-Up Mode Stop
+ *
+ * Stops the Wake-Up Mode
+ * 
+ * \return ERR_WRONG_STATE : Not initialized properly
+ * \return ERR_PARAM       : Invalid parameter
+ * \return ERR_NONE        : Done with no error
+ * 
+ *****************************************************************************
+ */
+ReturnCode rfalWakeUpModeStop( 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 );
+
+
+void rfalSetWumState( void );
+
+
+#endif /* RFAL_RF_H */
+
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_st25tb.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,516 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_st25tb.c
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of ST25TB interface 
+ *
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "rfal_st25tb.h"
+#include "utils.h"
+#include "platform1.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+#ifndef RFAL_FEATURE_ST25TB
+    #error " RFAL: Module configuration missing. Please enable/disable ST25TB module by setting: RFAL_FEATURE_ST25TB "
+#endif
+
+#if RFAL_FEATURE_ST25TB
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_ST25TB_CMD_LEN          1                                 /*!< ST25TB length of a command                       */
+#define RFAL_ST25TB_SLOTS            16                                /*!< ST25TB number of slots                           */
+#define RFAL_ST25TB_SLOTNUM_MASK     0x0F                              /*!< ST25TB Slot Number bit mask on SlotMarker        */
+#define RFAL_ST25TB_SLOTNUM_SHIFT    4                                 /*!< ST25TB Slot Number shift on SlotMarker           */
+
+#define RFAL_ST25TB_INITIATE_CMD1    0x06                              /*!< ST25TB Initiate command byte1                    */
+#define RFAL_ST25TB_INITIATE_CMD2    0x00                              /*!< ST25TB Initiate command byte2                    */
+#define RFAL_ST25TB_PCALL_CMD1       0x06                              /*!< ST25TB Pcall16 command byte1                     */
+#define RFAL_ST25TB_PCALL_CMD2       0x04                              /*!< ST25TB Pcall16 command byte2                     */
+#define RFAL_ST25TB_SELECT_CMD       0x0E                              /*!< ST25TB Select command                            */
+#define RFAL_ST25TB_GET_UID_CMD      0x0B                              /*!< ST25TB Get UID command                           */
+#define RFAL_ST25TB_COMPLETION_CMD   0x0F                              /*!< ST25TB Completion command                        */
+#define RFAL_ST25TB_RESET_INV_CMD    0x0C                              /*!< ST25TB Reset to Inventory command                */
+#define RFAL_ST25TB_READ_BLOCK_CMD   0x08                              /*!< ST25TB Read Block command                        */
+#define RFAL_ST25TB_WRITE_BLOCK_CMD  0x09                              /*!< ST25TB Write Block command                       */
+
+
+#define RFAL_ST25TB_T0               2157                              /*!< ST25TB t0  159 us   ST25TB RF characteristics    */
+#define RFAL_ST25TB_T1               2048                              /*!< 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(7)                 /*!< 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
+******************************************************************************
+*/
+
+
+/*
+******************************************************************************
+* LOCAL VARIABLES
+******************************************************************************
+*/
+
+/*
+******************************************************************************
+* GLOBAL FUNCTIONS
+******************************************************************************
+*/
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerInitialize( 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 )
+{
+    return rfalNfcbPollerInitialize( mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerCheckPresence( uint8_t *chipId, 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 )
+{
+    ReturnCode ret;
+    uint8_t    chipIdRes;
+
+    chipIdRes = 0x00;
+   
+    /* Send Initiate Request */
+    ret = rfalSt25tbPollerInitiate( &chipIdRes, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /*  Check if a transmission error was detected */
+    if( (ret == ERR_CRC) || (ret == ERR_FRAMING) )
+    {
+        return ERR_NONE;
+    }
+    
+    /* Copy chip ID if requested */
+    if( chipId != NULL )
+    {
+        *chipId = chipIdRes;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerInitiate( uint8_t *chipId,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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for valid Select Response   */
+    if( (ret == ERR_NONE) && (rxLen != RFAL_ST25TB_CHIP_ID_LEN) )
+    {
+        return ERR_PROTO;
+    }
+    
+    /* Copy chip ID if requested */
+    if( chipId != NULL )
+    {
+        *chipId = *rxBuf;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerPcall( uint8_t *chipId,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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for valid Select Response   */
+    if( (ret == ERR_NONE) && (rxLen != RFAL_ST25TB_CHIP_ID_LEN) )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerSlotMarker( uint8_t slotNum, uint8_t *chipIdRes,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 )
+{
+    ReturnCode ret;
+    uint16_t   rxLen;
+    uint8_t    slotMarker;
+
+    if( (slotNum == 0) || (slotNum > 15) )
+    {
+        return 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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for valid ChipID Response   */
+    if( (ret == ERR_NONE) && (rxLen != RFAL_ST25TB_CHIP_ID_LEN) )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerSelect( uint8_t chipId,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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for valid Select Response   */
+    if( (ret == ERR_NONE) && ((rxLen != RFAL_ST25TB_CHIP_ID_LEN) || (chipIdRes != chipId)) )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerGetUID( rfalSt25tbUID *UID,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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for valid UID Response */
+    if( (ret == ERR_NONE) && (rxLen != RFAL_ST25TB_UID_LEN) )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerCollisionResolution( uint8_t devLimit, rfalSt25tbListenDevice *st25tbDevList, 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 )
+{
+    uint8_t    i;
+    uint8_t    chipId;
+    ReturnCode ret;
+    bool       detected;  /* collision or device was detected */
+    
+    if( (st25tbDevList == NULL) || (devCnt == NULL) || (devLimit == 0) )
+    {
+        return ERR_PARAM;
+    }
+    
+    *devCnt = 0;
+    
+    /* Step 1: Send Initiate */
+    ret = rfalSt25tbPollerInitiate( &chipId, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret == 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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        
+        if( ERR_NONE == ret )
+        {
+            ret = rfalSt25tbPollerGetUID( &st25tbDevList[*devCnt].UID, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+        }
+        
+        if( 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 = false;
+            
+            for(i = 0; i < RFAL_ST25TB_SLOTS; i++)
+            {
+                platformDelay(1);  /* Wait t2: Answer to new request delay  */
+                
+                if( i==0 )
+                {
+                    /* Step 2: Send Pcall16 */
+                    ret = rfalSt25tbPollerPcall( &chipId, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                }
+                else
+                {
+                    /* Step 3-17: Send Pcall16 */
+                    ret = rfalSt25tbPollerSlotMarker( i, &chipId, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                }
+                
+                if( ret == ERR_NONE )
+                {
+                    /* Found another device */
+                    st25tbDevList[*devCnt].chipID       = chipId;
+                    st25tbDevList[*devCnt].isDeselected = false;
+                    
+                    /* Select Device, retrieve its UID  */
+                    ret = rfalSt25tbPollerSelect( chipId, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+
+                    /* By Selecting this device, the previous gets Deselected */
+                    if( (*devCnt) > 0 )
+                    {
+                        st25tbDevList[(*devCnt)-1].isDeselected = true;
+                    }
+
+                    if( ERR_NONE == ret )
+                    {
+                        rfalSt25tbPollerGetUID( &st25tbDevList[*devCnt].UID, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+                    }
+
+                    if( ERR_NONE == ret )
+                    {
+                        (*devCnt)++;
+                    }
+                }
+                else if( (ret == ERR_CRC) || (ret == ERR_FRAMING) )
+                {
+                    detected = true;
+                }
+                
+                if( *devCnt >= devLimit )
+                {
+                    break;
+                }
+            }
+        }
+        while( (detected == true) && (*devCnt < devLimit) );
+    }
+
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerReadBlock( uint8_t blockAddress, rfalSt25tbBlock *blockData,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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check for valid UID Response */
+    if( (ret == ERR_NONE) && (rxLen != RFAL_ST25TB_BLOCK_LEN) )
+    {
+        return ERR_PROTO;
+    }
+    
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerWriteBlock( uint8_t blockAddress, rfalSt25tbBlock *blockData,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 )
+{
+    ReturnCode              ret;
+    uint16_t                rxLen;
+    rfalSt25tbWriteBlockReq writeBlockReq;
+    rfalSt25tbBlock         tmpBlockData; 
+    
+
+    /* Compute Write Block Request */
+    writeBlockReq.cmd     = RFAL_ST25TB_WRITE_BLOCK_CMD;
+    writeBlockReq.address = blockAddress;
+    ST_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), mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    /* Check if an unexpected answer was received */
+    if( ret == ERR_NONE )
+    {
+        return ERR_PROTO; 
+    }
+    /* Check there was any error besides Timeout*/
+    else if( ret != ERR_TIMEOUT )
+    {
+        return ret;
+    }
+    
+    ret = rfalSt25tbPollerReadBlock(blockAddress, &tmpBlockData, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    if( ret == ERR_NONE )
+    {
+        if( !ST_BYTECMP( tmpBlockData, blockData, RFAL_ST25TB_BLOCK_LEN ) )
+        {
+            return ERR_NONE;
+        }
+        return ERR_PROTO;
+    }
+    return ret;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerCompletion( 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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalSt25tbPollerResetToInventory( 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 )
+{
+    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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+#endif /* RFAL_FEATURE_ST25TB */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_st25tb.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,355 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_st25tb.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Implementation of ST25TB interface
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup ST25TB
+ * @brief RFAL ST25TB Module
+ * @{
+ *
+ */
+
+
+#ifndef RFAL_ST25TB_H
+#define RFAL_ST25TB_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.h"
+#include "rfal_rf.h"
+#include "rfal_nfcb.h"
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_ST25TB_CHIP_ID_LEN      1       /*!< ST25TB chip ID length       */
+#define RFAL_ST25TB_CRC_LEN          2       /*!< ST25TB CRC length           */
+#define RFAL_ST25TB_UID_LEN          8       /*!< ST25TB Unique ID length     */
+#define RFAL_ST25TB_BLOCK_LEN        4       /*!< 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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerInitialize( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_RF_COLLISION : Collision detected one or more device in the field
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerCheckPresence( uint8_t *chipId, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_RF_COLLISION : Collision detected one or more device in the field
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerCollisionResolution( uint8_t devLimit, rfalSt25tbListenDevice *st25tbDevList, 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 );
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerInitiate( uint8_t *chipId,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return 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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerSlotMarker( uint8_t slotNum, uint8_t *chipIdRes,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerSelect( uint8_t chipId,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerGetUID( rfalSt25tbUID *UID,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerReadBlock( uint8_t blockAddress, rfalSt25tbBlock *blockData,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerWriteBlock( uint8_t blockAddress, rfalSt25tbBlock *blockData,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected, invalid SENSB_RES received
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerCompletion( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \brief  ST25TB Poller Reset to Inventory
+ *
+ * This method sends a Reset to Inventory command to the ST25TB.
+ *
+ * \return ERR_WRONG_STATE  : RFAL not initialized or incorrect mode
+ * \return ERR_PARAM        : Invalid parameters
+ * \return ERR_IO           : Generic internal error
+ * \return ERR_TIMEOUT      : Timeout error, no listener device detected
+ * \return ERR_PROTO        : Protocol error detected, invalid SENSB_RES received
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalSt25tbPollerResetToInventory( 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 );
+
+
+#endif /* RFAL_ST25TB_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_t1t.cpp	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,221 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_t1t.c
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Provides NFC-A T1T convenience methods and definitions
+ *  
+ *  This module provides an interface to perform as a NFC-A Reader/Writer
+ *  to handle a Type 1 Tag T1T (Topaz) 
+ *  
+ */
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "rfal_t1t.h"
+#include "utils.h"
+#include "platform1.h"
+
+/*
+ ******************************************************************************
+ * ENABLE SWITCH
+ ******************************************************************************
+ */
+
+#ifndef RFAL_FEATURE_T1T
+    #error " RFAL: Module configuration missing. Please enable/disable T1T module by setting: RFAL_FEATURE_T1T "
+#endif
+
+#if RFAL_FEATURE_T1T
+
+/*
+ ******************************************************************************
+ * GLOBAL DEFINES
+ ******************************************************************************
+ */
+
+#define RFAL_T1T_DRD_READ           (1236*2)/*!< DRD for Reads with n=9         => 1236/fc  ~= 91 us   T1T 1.2  4.4.2 */
+#define RFAL_T1T_DRD_WRITE          36052   /*!< DRD for Write with n=281       => 36052/fc ~= 2659 us T1T 1.2  4.4.2 */
+#define RFAL_T1T_DRD_WRITE_E        70996   /*!< DRD for Write/Erase with n=554 => 70996/fc ~= 5236 us T1T 1.2  4.4.2 */
+
+#define RFAL_T1T_RID_RES_HR0_VAL    0x10    /*!< HR0 indicating NDEF support  Digital 2.0 (Candidate) 11.6.2.1        */
+#define RFAL_T1T_RID_RES_HR0_MASK   0xF0    /*!< 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( 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 )
+{
+    ReturnCode ret;
+    
+    EXIT_ON_ERR(ret, rfalSetMode( RFAL_MODE_POLL_NFCA_T1T, RFAL_BR_106, RFAL_BR_106, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    rfalSetErrorHandling( RFAL_ERRORHANDLING_NFC );
+    
+    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 ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalT1TPollerRid( rfalT1TRidRes *ridRes,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 )
+{
+    ReturnCode     ret;
+    rfalT1TRidReq  ridReq;
+    uint16_t       rcvdLen;
+    
+    if( ridRes == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Compute RID command and set Undefined Values to 0x00    Digital 1.1 10.6.1 */
+    ST_MEMSET( &ridReq, 0x00, sizeof(rfalT1TRidReq) );
+    ridReq.cmd = RFAL_T1T_CMD_RID;
+    
+    EXIT_ON_ERR( ret, rfalTransceiveBlockingTxRx( (uint8_t*)&ridReq, sizeof(rfalT1TRidReq), (uint8_t*)ridRes, sizeof(rfalT1TRidRes), &rcvdLen, RFAL_TXRX_FLAGS_DEFAULT, RFAL_T1T_DRD_READ, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 )  );
+    
+    /* 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 ERR_PROTO;
+    }
+    
+    return ERR_NONE;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalT1TPollerRall( uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rxRcvdLen,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 )
+{
+    rfalT1TRallReq rallReq;
+    
+    if( (rxBuf == NULL) || (uid == NULL) || (rxRcvdLen == NULL) )
+    {
+        return ERR_PARAM;
+    }
+    
+    /* Compute RALL command and set Add to 0x00 */
+    ST_MEMSET( &rallReq, 0x00, sizeof(rfalT1TRallReq) );
+    rallReq.cmd = RFAL_T1T_CMD_RALL;
+    ST_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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+}
+
+
+/*******************************************************************************/
+ReturnCode rfalT1TPollerWrite( uint8_t* uid, uint8_t address, uint8_t data,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 )
+{
+    rfalT1TWriteReq writeReq;
+    rfalT1TWriteRes writeRes;
+    uint16_t        rxRcvdLen;
+    ReturnCode      err;
+    
+    if( uid == NULL )
+    {
+        return ERR_PARAM;
+    }
+    
+    writeReq.cmd  = RFAL_T1T_CMD_WRITE_E;
+    writeReq.add  = address;
+    writeReq.data = data;
+    ST_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, mspiChannel, mST25, gpio_cs, IRQ, fieldLED_01, fieldLED_02, fieldLED_03, fieldLED_04, fieldLED_05, fieldLED_06 ) ;
+    
+    if( err == ERR_NONE )
+    {
+        if( (writeReq.add != writeRes.add) || (writeReq.data != writeRes.data) || (rxRcvdLen != sizeof(rfalT1TWriteRes)) )
+        {
+            return ERR_PROTO;
+        }
+    }
+    return err;
+}
+
+#endif /* RFAL_FEATURE_T1T */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/rfal_t1t.h	Thu Nov 14 14:34:50 2019 +0000
@@ -0,0 +1,187 @@
+
+/******************************************************************************
+  * @attention
+  *
+  * <h2><center>&copy; COPYRIGHT 2016 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:
+  *
+  *        http://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_t1t.h
+ *
+ *  \author Gustavo Patricio
+ *
+ *  \brief Provides NFC-A T1T convenience methods and definitions
+ *
+ *  This module provides an interface to perform as a NFC-A Reader/Writer
+ *  to handle a Type 1 Tag T1T (Topaz)
+ *
+ *
+ * @addtogroup RFAL
+ * @{
+ *
+ * @addtogroup RFAL-AL
+ * @brief RFAL Abstraction Layer
+ * @{
+ *
+ * @addtogroup T1T
+ * @brief RFAL T1T Module
+ * @{
+ *
+ */
+
+
+#ifndef RFAL_T1T_H
+#define RFAL_T1T_H
+
+/*
+ ******************************************************************************
+ * INCLUDES
+ ******************************************************************************
+ */
+#include "platform1.h"
+#include "st_errno.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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalT1TPollerInitialize( 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Invalid parameter
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalT1TPollerRid( rfalT1TRidRes *ridRes, 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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Invalid parameter
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalT1TPollerRall( uint8_t* uid, uint8_t* rxBuf, uint16_t rxBufLen, uint16_t *rxRcvdLen,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 );
+
+
+/*!
+ *****************************************************************************
+ * \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 ERR_WRONG_STATE  : RFAL not initialized or mode not set
+ * \return ERR_PARAM        : Invalid parameter
+ * \return ERR_NONE         : No error
+ *****************************************************************************
+ */
+ReturnCode rfalT1TPollerWrite( uint8_t* uid, uint8_t address, uint8_t data,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 );
+
+#endif /* RFAL_T1T_H */
+
+/**
+  * @}
+  *
+  * @}
+  *
+  * @}
+  */