1093 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			1093 lines
		
	
	
		
			50 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
| 
 | |
| /******************************************************************************
 | |
|   * \attention
 | |
|   *
 | |
|   * <h2><center>© COPYRIGHT 2020 STMicroelectronics</center></h2>
 | |
|   *
 | |
|   * Licensed under ST MYLIBERTY SOFTWARE LICENSE AGREEMENT (the "License");
 | |
|   * You may not use this file except in compliance with the License.
 | |
|   * You may obtain a copy of the License at:
 | |
|   *
 | |
|   *        www.st.com/myliberty
 | |
|   *
 | |
|   * Unless required by applicable law or agreed to in writing, software 
 | |
|   * distributed under the License is distributed on an "AS IS" BASIS, 
 | |
|   * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied,
 | |
|   * AND SPECIFICALLY DISCLAIMING THE IMPLIED WARRANTIES OF MERCHANTABILITY,
 | |
|   * FITNESS FOR A PARTICULAR PURPOSE, AND NON-INFRINGEMENT.
 | |
|   * See the License for the specific language governing permissions and
 | |
|   * limitations under the License.
 | |
|   *
 | |
| ******************************************************************************/
 | |
| 
 | |
| /*
 | |
|  *      PROJECT:   ST25R391x firmware
 | |
|  *      Revision:
 | |
|  *      LANGUAGE:  ISO C99
 | |
|  */
 | |
| 
 | |
| /*! \file rfal_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 "platform.h"
 | |
| #include "rfal_nfcb.h"
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * ENABLE SWITCH
 | |
|  ******************************************************************************
 | |
|  */
 | |
| 
 | |
| #ifndef RFAL_FEATURE_ISO_DEP
 | |
| #define RFAL_FEATURE_ISO_DEP \
 | |
|     false /*!< ISO-DEP module configuration missing. Disabled by default */
 | |
| #endif
 | |
| 
 | |
| /* If module is disabled remove the need for the user to set lengths */
 | |
| #if !RFAL_FEATURE_ISO_DEP
 | |
| #undef RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN
 | |
| #undef RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN
 | |
| 
 | |
| #define RFAL_FEATURE_ISO_DEP_IBLOCK_MAX_LEN (1U) /*!< ISO-DEP I-Block max length, set to "none" */
 | |
| #define RFAL_FEATURE_ISO_DEP_APDU_MAX_LEN (1U) /*!< ISO-DEP APDU max length, set to "none"    */
 | |
| #endif /* !RFAL_FEATURE_NFC_DEP  */
 | |
| 
 | |
| /*
 | |
|  ******************************************************************************
 | |
|  * DEFINES
 | |
|  ******************************************************************************
 | |
|  */
 | |
| 
 | |
| #define RFAL_ISODEP_PROLOGUE_SIZE \
 | |
|     (3U) /*!< Length of Prologue Field for I-Block Format                       */
 | |
| 
 | |
| #define RFAL_ISODEP_PCB_LEN \
 | |
|     (1U) /*!< PCB length                                                        */
 | |
| #define RFAL_ISODEP_DID_LEN \
 | |
|     (1U) /*!< DID length                                                        */
 | |
| #define RFAL_ISODEP_NAD_LEN \
 | |
|     (1U) /*!< NAD length                                                        */
 | |
| #define RFAL_ISODEP_NO_DID \
 | |
|     (0x00U) /*!< DID value indicating the ISO-DEP layer not to use DID             */
 | |
| #define RFAL_ISODEP_NO_NAD \
 | |
|     (0xFFU) /*!< NAD value indicating the ISO-DEP layer not to use NAD             */
 | |
| 
 | |
| #define RFAL_ISODEP_FWI_MASK \
 | |
|     (0xF0U) /*!< Mask bits of FWI                                                  */
 | |
| #define RFAL_ISODEP_FWI_SHIFT \
 | |
|     (4U) /*!< Shift val of FWI                                                  */
 | |
| #define RFAL_ISODEP_FWI_DEFAULT \
 | |
|     (4U) /*!< Default value for FWI Digital 1.0 11.6.2.17                       */
 | |
| #define RFAL_ISODEP_ADV_FEATURE \
 | |
|     (0x0FU) /*!< Indicate 256 Bytes FSD and Advanc Proto Feature support:NAD & DID */
 | |
| 
 | |
| #define RFAL_ISODEP_DID_MAX \
 | |
|     (14U) /*!< Maximum DID value                                                 */
 | |
| 
 | |
| #define RFAL_ISODEP_BRI_MASK \
 | |
|     (0x07U) /*!< Mask bits for Poll to Listen Send bitrate                         */
 | |
| #define RFAL_ISODEP_BSI_MASK \
 | |
|     (0x70U) /*!< Mask bits for Listen to Poll Send bitrate                         */
 | |
| #define RFAL_ISODEP_SAME_BITRATE_MASK \
 | |
|     (0x80U) /*!< Mask bit indicate only same bit rate D for both direction support */
 | |
| #define RFAL_ISODEP_BITRATE_RFU_MASK \
 | |
|     (0x08U) /*!< 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 ((uint32_t)1U << 26)
 | |
| 
 | |
| #define RFAL_ISODEP_FSDI_DEFAULT \
 | |
|     RFAL_ISODEP_FSXI_256 /*!< Default Frame Size Integer in Poll mode              */
 | |
| #define RFAL_ISODEP_FSX_KEEP (0xFFU) /*!< 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 (0U) /*!< SFGI Default value to be used  in Listen Mode        */
 | |
| #define RFAL_ISODEP_DEFAULT_FWI (8U) /*!< Default Listener FWI (Max)      Digital 2.0  B7 & B3 */
 | |
| 
 | |
| #define RFAL_ISODEP_APDU_MAX_LEN \
 | |
|     RFAL_ISODEP_FSX_1024 /*!< Max APDU length                                      */
 | |
| 
 | |
| #define RFAL_ISODEP_ATTRIB_RES_MBLI_NO_INFO \
 | |
|     (0x00U) /*!< MBLI indicating no information on its internal input buffer size  */
 | |
| #define RFAL_ISODEP_ATTRIB_REQ_PARAM1_DEFAULT \
 | |
|     (0x00U) /*!< Default values of Param 1 of ATTRIB_REQ Digital 1.0  12.6.1.3-5   */
 | |
| #define RFAL_ISODEP_ATTRIB_HLINFO_LEN \
 | |
|     (32U) /*!< Maximum Size of Higher Layer Information                          */
 | |
| #define RFAL_ISODEP_ATS_HB_MAX_LEN \
 | |
|     (15U) /*!< Maximum length of Historical Bytes  Digital 1.1  13.6.2.23        */
 | |
| #define RFAL_ISODEP_ATTRIB_REQ_MIN_LEN \
 | |
|     (9U) /*!< Minimum Length of ATTRIB_REQ command                              */
 | |
| #define RFAL_ISODEP_ATTRIB_RES_MIN_LEN \
 | |
|     (1U) /*!< Minimum Length of ATTRIB_RES response                             */
 | |
| 
 | |
| #define RFAL_ISODEP_SPARAM_VALUES_MAX_LEN \
 | |
|     (16U) /*!< Maximum Length of the value field on S(PARAMETERS)                */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BLOCKINFO \
 | |
|     (0xA0U) /*!< S(PARAMETERS) tag Block information                               */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BRREQ \
 | |
|     (0xA1U) /*!< S(PARAMETERS) tag Bit rates Request                               */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BRIND \
 | |
|     (0xA2U) /*!< S(PARAMETERS) tag Bit rates Indication                            */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BRACT \
 | |
|     (0xA3U) /*!< S(PARAMETERS) tag Bit rates Activation                            */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BRACK \
 | |
|     (0xA4U) /*!< S(PARAMETERS) tag Bit rates Acknowledgement                       */
 | |
| 
 | |
| #define RFAL_ISODEP_SPARAM_TAG_SUP_PCD2PICC \
 | |
|     (0x80U) /*!< S(PARAMETERS) tag Supported bit rates from PCD to PICC            */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_SUP_PICC2PCD \
 | |
|     (0x81U) /*!< S(PARAMETERS) tag Supported bit rates from PICC to PCD            */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_SUP_FRAME \
 | |
|     (0x82U) /*!< S(PARAMETERS) tag Supported framing options PICC to PCD           */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_SEL_PCD2PICC \
 | |
|     (0x83U) /*!< S(PARAMETERS) tag Selected bit rate from PCD to PICC              */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_SEL_PICC2PCD \
 | |
|     (0x84U) /*!< S(PARAMETERS) tag Selected bit rate from PICC to PCD              */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_SEL_FRAME \
 | |
|     (0x85U) /*!< S(PARAMETERS) tag Selected framing options PICC to PCD            */
 | |
| 
 | |
| #define RFAL_ISODEP_SPARAM_TAG_LEN \
 | |
|     (1) /*!< S(PARAMETERS) Tag Length                                          */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BRREQ_LEN \
 | |
|     (0U) /*!< S(PARAMETERS) tag Bit rates Request Length                        */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_PICC2PCD_LEN \
 | |
|     (2U) /*!< S(PARAMETERS) bit rates from PCD to PICC Length                   */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_PCD2PICC_LEN \
 | |
|     (2U) /*!< S(PARAMETERS) bit rates from PICC to PCD Length                   */
 | |
| #define RFAL_ISODEP_SPARAM_TAG_BRACK_LEN \
 | |
|     (0U) /*!< S(PARAMETERS) tag Bit rates Acknowledgement Length                */
 | |
| 
 | |
| #define RFAL_ISODEP_ATS_TA_DPL_212 \
 | |
|     (0x01U) /*!< ATS TA DSI 212 kbps support bit mask                              */
 | |
| #define RFAL_ISODEP_ATS_TA_DPL_424 \
 | |
|     (0x02U) /*!< ATS TA DSI 424 kbps support bit mask                              */
 | |
| #define RFAL_ISODEP_ATS_TA_DPL_848 \
 | |
|     (0x04U) /*!< ATS TA DSI 848 kbps support bit mask                              */
 | |
| #define RFAL_ISODEP_ATS_TA_DLP_212 \
 | |
|     (0x10U) /*!< ATS TA DSI 212 kbps support bit mask                              */
 | |
| #define RFAL_ISODEP_ATS_TA_DLP_424 \
 | |
|     (0x20U) /*!< ATS TA DRI 424 kbps support bit mask                              */
 | |
| #define RFAL_ISODEP_ATS_TA_DLP_848 \
 | |
|     (0x40U) /*!< ATS TA DRI 848 kbps support bit mask                              */
 | |
| #define RFAL_ISODEP_ATS_TA_SAME_D \
 | |
|     (0x80U) /*!< ATS TA same bit both directions bit mask                          */
 | |
| #define RFAL_ISODEP_ATS_TB_FWI_MASK \
 | |
|     (0xF0U) /*!< Mask bits for FWI (Frame Waiting Integer) in TB byte              */
 | |
| #define RFAL_ISODEP_ATS_TB_SFGI_MASK \
 | |
|     (0x0FU) /*!< Mask bits for SFGI (Start-Up Frame Guard Integer) in TB byte      */
 | |
| 
 | |
| #define RFAL_ISODEP_ATS_T0_TA_PRESENCE_MASK \
 | |
|     (0x10U) /*!< Mask bit for TA presence                                          */
 | |
| #define RFAL_ISODEP_ATS_T0_TB_PRESENCE_MASK \
 | |
|     (0x20U) /*!< Mask bit for TB presence                                          */
 | |
| #define RFAL_ISODEP_ATS_T0_TC_PRESENCE_MASK \
 | |
|     (0x40U) /*!< Mask bit for TC presence                                          */
 | |
| #define RFAL_ISODEP_ATS_T0_FSCI_MASK \
 | |
|     (0x0FU) /*!< Mask bit for FSCI presence                                        */
 | |
| #define RFAL_ISODEP_ATS_T0_OFFSET \
 | |
|     (0x01U) /*!< Offset of T0 in ATS Response                                      */
 | |
| 
 | |
| #define RFAL_ISODEP_MAX_I_RETRYS \
 | |
|     (2U) /*!< Number of retries for a I-Block     Digital 2.0   16.2.5.4                  */
 | |
| #define RFAL_ISODEP_MAX_R_RETRYS \
 | |
|     (3U) /*!< Number of retries for a R-Block     Digital 2.0 B9 - nRETRY ACK/NAK: [2,5]  */
 | |
| #define RFAL_ISODEP_MAX_WTX_NACK_RETRYS \
 | |
|     (3U) /*!< Number of S(WTX) replied with NACK  Digital 2.0 B9 - nRETRY WTX[2,5]        */
 | |
| #define RFAL_ISODEP_MAX_WTX_RETRYS \
 | |
|     (20U) /*!< Number of overall S(WTX) retries    Digital 2.0  16.2.5.2                   */
 | |
| #define RFAL_ISODEP_MAX_WTX_RETRYS_ULTD \
 | |
|     (255U) /*!< Use unlimited number of overall S(WTX)                                      */
 | |
| #define RFAL_ISODEP_MAX_DSL_RETRYS \
 | |
|     (0U) /*!< Number of retries for a S(DESELECT) Digital 2.0 B9 - nRETRY DESELECT: [0,5] */
 | |
| #define RFAL_ISODEP_RATS_RETRIES \
 | |
|     (1U) /*!< RATS retries upon fail              Digital 2.0 B7 - nRETRY RATS [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 24 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;
 | |
| 
 | |
| /*! S(Parameters) Command Format  ISO14443-4 (2016) Table 4 */
 | |
| typedef struct {
 | |
|     uint8_t tag; /*!< S(PARAMETERS) Tag field        */
 | |
|     uint8_t length; /*!< S(PARAMETERS) Length field     */
 | |
|     uint8_t value[RFAL_ISODEP_SPARAM_VALUES_MAX_LEN]; /*!< S(PARAMETERS) Value field      */
 | |
| } rfalIsoDepSParameter;
 | |
| 
 | |
| /*! Activation info as Poller and Listener for NFC-A and NFC-B                                    */
 | |
| typedef union { /*  PRQA S 0750 # MISRA 19.2 - Both members of the union will not be used concurrently, device is only of type A or B at a time. Thus no problem can occur. */
 | |
| 
 | |
|     /*! NFC-A information                                                                         */
 | |
|     union { /*  PRQA S 0750 # MISRA 19.2 - Both members of the union will not be used concurrently, device is only PCD or PICC at a time. Thus no problem can occur. */
 | |
|         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 { /*  PRQA S 0750 # MISRA 19.2 - Both members of the union will not be used concurrently, device is only PCD or PICC at a time. Thus no problem can occur. */
 | |
|         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_FEATURE_ISO_DEP_IBLOCK_MAX_LEN]; /*!< 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_FEATURE_ISO_DEP_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
 | |
|  *                                Digital 2.0 B9 - nRETRY ACK/NAK: [2,5]
 | |
|  *  \param[in] maxRetriesSnWTX : Number of retries for a S(WTX) (only in case
 | |
|  *                               of NAKs)   Digital 2.0 B9 - nRETRY WTX[2,5]    
 | |
|  *  \param[in] maxRetriesSWTX  : Number of overall S(WTX) retries. 
 | |
|  *                                Use RFAL_ISODEP_MAX_WTX_RETRYS_ULTD for disabling 
 | |
|  *                                this limit check   Digital 2.0  16.2.5.2
 | |
|  *  \param[in] maxRetriesSDSL  : Number of retries for a S(DESELECT)
 | |
|  *                                Digital 2.0 B9 - nRETRY DESELECT: [0,5]
 | |
|  *  \param[in] maxRetriesI     : Number of retries for a I-Block 
 | |
|  *                                Digital 2.0  16.2.5.4
 | |
|  *  \param[in] maxRetriesRATS  : Number of retries for RATS 
 | |
|  *                                Digital 2.0 B7 - nRETRY RATS [0,1]
 | |
|  *    
 | |
|  ******************************************************************************
 | |
|  */
 | |
| void rfalIsoDepInitializeWithParams(
 | |
|     rfalComplianceMode compMode,
 | |
|     uint8_t maxRetriesR,
 | |
|     uint8_t maxRetriesSnWTX,
 | |
|     uint8_t maxRetriesSWTX,
 | |
|     uint8_t maxRetriesSDSL,
 | |
|     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(const 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(const 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] actParam       : 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 actParam 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,
 | |
|     const rfalIsoDepAttribResParam* attribResParam,
 | |
|     const uint8_t* buf,
 | |
|     uint16_t bufLen,
 | |
|     rfalIsoDepListenActvParam actParam);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \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(void);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \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(void);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \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(void);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \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);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \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);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \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(
 | |
|     const uint8_t* nfcid0,
 | |
|     uint8_t PARAM1,
 | |
|     rfalBitRate DSI,
 | |
|     rfalBitRate DRI,
 | |
|     rfalIsoDepFSxI FSDI,
 | |
|     uint8_t PARAM3,
 | |
|     uint8_t DID,
 | |
|     const uint8_t* HLInfo,
 | |
|     uint8_t HLInfoLen,
 | |
|     uint32_t fwt,
 | |
|     rfalIsoDepAttribRes* attribRes,
 | |
|     uint8_t* attribResLen);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \brief  Deselects PICC
 | |
|  *
 | |
|  *  This function sends a deselect command to PICC and waits for it`s
 | |
|  *  response in a blocking way
 | |
|  *
 | |
|  *  \return ERR_NONE   : Deselect successfully sent and acknowledged by PICC 
 | |
|  *  \return ERR_TIMEOUT: No response rcvd from PICC 
 | |
|  *
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalIsoDepDeselect(void);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \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);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \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,
 | |
|     const rfalNfcbListenDevice* nfcbDev,
 | |
|     const uint8_t* HLInfo,
 | |
|     uint8_t HLInfoLen,
 | |
|     rfalIsoDepDevice* isoDepDev);
 | |
| 
 | |
| /*! 
 | |
|  *****************************************************************************
 | |
|  *  \brief  ISO-DEP Poller Handle S(Parameters)
 | |
|  *   
 | |
|  *  This checks if PICC supports S(PARAMETERS), retieves PICC's
 | |
|  *  capabilities and sets the Bit Rate at the highest supported by both
 | |
|  *  devices
 | |
|  *   
 | |
|  *  \param[out] isoDepDev    : ISO-DEP information of the activated Listen device
 | |
|  *  \param[in]  maxTxBR      : Maximum Tx bit rate supported by PCD
 | |
|  *  \param[in]  maxRxBR      : Maximum Rx bit rate supported by PCD
 | |
|  *
 | |
|  *  \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_FRAMING      : Framing error detected
 | |
|  *  \return ERR_PROTO        : Protocol error detected
 | |
|  *  \return ERR_NONE         : No error, S(PARAMETERS) selection successful
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalIsoDepPollHandleSParameters(
 | |
|     rfalIsoDepDevice* isoDepDev,
 | |
|     rfalBitRate maxTxBR,
 | |
|     rfalBitRate maxRxBR);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \brief  ISO-DEP Poller Start NFC-A Activation 
 | |
|  *
 | |
|  *  This starts 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
 | |
|  *
 | |
|  *
 | |
|  *  \see rfalIsoDepPollAGetActivationStatus
 | |
|  *
 | |
|  *  \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, start of asynchronous operation successful
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalIsoDepPollAStartActivation(
 | |
|     rfalIsoDepFSxI FSDI,
 | |
|     uint8_t DID,
 | |
|     rfalBitRate maxBR,
 | |
|     rfalIsoDepDevice* isoDepDev);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \brief  ISO-DEP Poller Get NFC-A Activation Status
 | |
|  *
 | |
|  *  Returns the activation status started by rfalIsoDepPollAStartActivation
 | |
|  *
 | |
|  *  \see rfalIsoDepPollAStartActivation
 | |
|  *
 | |
|  *  \return ERR_BUSY         : Operation is ongoing
 | |
|  *  \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 rfalIsoDepPollAGetActivationStatus(void);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \brief  ISO-DEP Poller Start NFC-B Activation 
 | |
|  *
 | |
|  *  This starts a NFC-B Activation into ISO-DEP layer (ISO14443-4) with the given
 | |
|  *  parameters. It will send ATTRIB and calculate supported higher bit rates of both 
 | |
|  *  devices and perform activation.
 | |
|  *  Once Activated all details of the device are provided on isoDepDev
 | |
|  *
 | |
|  *  \see rfalIsoDepPollBGetActivationStatus
 | |
|  *
 | |
|  *  \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, start of asynchronous operation successful
 | |
|  *****************************************************************************
 | |
|  */
 | |
| ReturnCode rfalIsoDepPollBStartActivation(
 | |
|     rfalIsoDepFSxI FSDI,
 | |
|     uint8_t DID,
 | |
|     rfalBitRate maxBR,
 | |
|     uint8_t PARAM1,
 | |
|     const rfalNfcbListenDevice* nfcbDev,
 | |
|     const uint8_t* HLInfo,
 | |
|     uint8_t HLInfoLen,
 | |
|     rfalIsoDepDevice* isoDepDev);
 | |
| 
 | |
| /*!
 | |
|  *****************************************************************************
 | |
|  *  \brief  ISO-DEP Poller Get NFC-B Activation Status
 | |
|  *
 | |
|  *  Returns the activation status started by rfalIsoDepPollBStartActivation
 | |
|  *
 | |
|  *  \see rfalIsoDepPollBStartActivation
 | |
|  *
 | |
|  *  \return ERR_BUSY         : Operation is ongoing
 | |
|  *  \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 rfalIsoDepPollBGetActivationStatus(void);
 | |
| 
 | |
| #endif /* RFAL_ISODEP_H_ */
 | |
| 
 | |
| /**
 | |
|   * @}
 | |
|   *
 | |
|   * @}
 | |
|   *
 | |
|   * @}
 | |
|   */
 | 
