rt-thread/bsp/imxrt/libraries/MIMXRT1170/MIMXRT1176/drivers/fsl_smartcard.h

275 lines
14 KiB
C

/*
* Copyright (c) 2015-2016, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
#ifndef _FSL_SMARTCARD_H_
#define _FSL_SMARTCARD_H_
#include "fsl_common.h"
/*!
* @addtogroup smartcard
* @{
*/
/*******************************************************************************
* Definitions
******************************************************************************/
/*! @name Driver version */
/*@{*/
/*! @brief Smart card driver version 2.2.2.
*/
#define FSL_SMARTCARD_DRIVER_VERSION (MAKE_VERSION(2, 2, 2))
/*@}*/
/*! @brief Smart card global define which specify number of clock cycles until initial 'TS' character has to be received
*/
#define SMARTCARD_INIT_DELAY_CLOCK_CYCLES (42000u)
/*! @brief Smart card global define which specify number of clock cycles during which ATR string has to be received */
#define SMARTCARD_EMV_ATR_DURATION_ETU (20150u)
/*! @brief Smart card specification initial TS character definition of direct convention */
#define SMARTCARD_TS_DIRECT_CONVENTION (0x3Bu)
/*! @brief Smart card specification initial TS character definition of inverse convention */
#define SMARTCARD_TS_INVERSE_CONVENTION (0x3Fu)
/*! @brief Smart card Error codes. */
enum
{
kStatus_SMARTCARD_Success = MAKE_STATUS(kStatusGroup_SMARTCARD, 0), /*!< Transfer ends successfully */
kStatus_SMARTCARD_TxBusy = MAKE_STATUS(kStatusGroup_SMARTCARD, 1), /*!< Transmit in progress */
kStatus_SMARTCARD_RxBusy = MAKE_STATUS(kStatusGroup_SMARTCARD, 2), /*!< Receiving in progress */
kStatus_SMARTCARD_NoTransferInProgress = MAKE_STATUS(kStatusGroup_SMARTCARD, 3), /*!< No transfer in progress */
kStatus_SMARTCARD_Timeout = MAKE_STATUS(kStatusGroup_SMARTCARD, 4), /*!< Transfer ends with time-out */
kStatus_SMARTCARD_Initialized =
MAKE_STATUS(kStatusGroup_SMARTCARD, 5), /*!< Smart card driver is already initialized */
kStatus_SMARTCARD_PhyInitialized =
MAKE_STATUS(kStatusGroup_SMARTCARD, 6), /*!< Smart card PHY drive is already initialized */
kStatus_SMARTCARD_CardNotActivated = MAKE_STATUS(kStatusGroup_SMARTCARD, 7), /*!< Smart card is not activated */
kStatus_SMARTCARD_InvalidInput =
MAKE_STATUS(kStatusGroup_SMARTCARD, 8), /*!< Function called with invalid input arguments */
kStatus_SMARTCARD_OtherError = MAKE_STATUS(kStatusGroup_SMARTCARD, 9) /*!< Some other error occur */
};
/*! @brief Control codes for the Smart card protocol timers and misc. */
typedef enum _smartcard_control
{
kSMARTCARD_EnableADT = 0x0u,
kSMARTCARD_DisableADT = 0x1u,
kSMARTCARD_EnableGTV = 0x2u,
kSMARTCARD_DisableGTV = 0x3u,
kSMARTCARD_ResetWWT = 0x4u,
kSMARTCARD_EnableWWT = 0x5u,
kSMARTCARD_DisableWWT = 0x6u,
kSMARTCARD_ResetCWT = 0x7u,
kSMARTCARD_EnableCWT = 0x8u,
kSMARTCARD_DisableCWT = 0x9u,
kSMARTCARD_ResetBWT = 0xAu,
kSMARTCARD_EnableBWT = 0xBu,
kSMARTCARD_DisableBWT = 0xCu,
kSMARTCARD_EnableInitDetect = 0xDu,
kSMARTCARD_EnableAnack = 0xEu,
kSMARTCARD_DisableAnack = 0xFu,
kSMARTCARD_ConfigureBaudrate = 0x10u,
kSMARTCARD_SetupATRMode = 0x11u,
kSMARTCARD_SetupT0Mode = 0x12u,
kSMARTCARD_SetupT1Mode = 0x13u,
kSMARTCARD_EnableReceiverMode = 0x14u,
kSMARTCARD_DisableReceiverMode = 0x15u,
kSMARTCARD_EnableTransmitterMode = 0x16u,
kSMARTCARD_DisableTransmitterMode = 0x17u,
kSMARTCARD_ResetWaitTimeMultiplier = 0x18u,
} smartcard_control_t;
/*! @brief Defines Smart card interface voltage class values */
typedef enum _smartcard_card_voltage_class
{
kSMARTCARD_VoltageClassUnknown = 0x0u,
kSMARTCARD_VoltageClassA5_0V = 0x1u,
kSMARTCARD_VoltageClassB3_3V = 0x2u,
kSMARTCARD_VoltageClassC1_8V = 0x3u
} smartcard_card_voltage_class_t;
/*! @brief Defines Smart card I/O transfer states */
typedef enum _smartcard_transfer_state
{
kSMARTCARD_IdleState = 0x0u,
kSMARTCARD_WaitingForTSState = 0x1u,
kSMARTCARD_InvalidTSDetecetedState = 0x2u,
kSMARTCARD_ReceivingState = 0x3u,
kSMARTCARD_TransmittingState = 0x4u,
} smartcard_transfer_state_t;
/*! @brief Defines Smart card reset types */
typedef enum _smartcard_reset_type
{
kSMARTCARD_ColdReset = 0x0u,
kSMARTCARD_WarmReset = 0x1u,
kSMARTCARD_NoColdReset = 0x2u,
kSMARTCARD_NoWarmReset = 0x3u,
} smartcard_reset_type_t;
/*! @brief Defines Smart card transport protocol types */
typedef enum _smartcard_transport_type
{
kSMARTCARD_T0Transport = 0x0u,
kSMARTCARD_T1Transport = 0x1u
} smartcard_transport_type_t;
/*! @brief Defines Smart card data parity types */
typedef enum _smartcard_parity_type
{
kSMARTCARD_EvenParity = 0x0u,
kSMARTCARD_OddParity = 0x1u
} smartcard_parity_type_t;
/*! @brief Defines data Convention format */
typedef enum _smartcard_card_convention
{
kSMARTCARD_DirectConvention = 0x0u,
kSMARTCARD_InverseConvention = 0x1u
} smartcard_card_convention_t;
/*! @brief Defines Smart card interface IC control types */
typedef enum _smartcard_interface_control
{
kSMARTCARD_InterfaceSetVcc = 0x00u,
kSMARTCARD_InterfaceSetClockToResetDelay = 0x01u,
kSMARTCARD_InterfaceReadStatus = 0x02u
} smartcard_interface_control_t;
/*! @brief Defines transfer direction.*/
typedef enum _smartcard_direction
{
kSMARTCARD_Receive = 0u,
kSMARTCARD_Transmit = 1u
} smartcard_direction_t;
/*! @brief Smart card interface interrupt callback function type */
typedef void (*smartcard_interface_callback_t)(void *smartcardContext, void *param);
/*! @brief Smart card transfer interrupt callback function type */
typedef void (*smartcard_transfer_callback_t)(void *smartcardContext, void *param);
/*! @brief Time Delay function used to passive waiting using RTOS [us] */
typedef void (*smartcard_time_delay_t)(uint32_t us);
/*! @brief Defines card-specific parameters for Smart card driver */
typedef struct _smartcard_card_params
{
/* ISO7816/EMV4.3 specification variables */
uint16_t Fi; /*!< 4 bits Fi - clock rate conversion integer */
uint8_t fMax; /*!< Maximum Smart card frequency in MHz */
uint8_t WI; /*!< 8 bits WI - work wait time integer */
uint8_t Di; /*!< 4 bits DI - baud rate divisor */
uint8_t BWI; /*!< 4 bits BWI - block wait time integer */
uint8_t CWI; /*!< 4 bits CWI - character wait time integer */
uint8_t BGI; /*!< 4 bits BGI - block guard time integer */
uint8_t GTN; /*!< 8 bits GTN - extended guard time integer */
uint8_t IFSC; /*!< Indicates IFSC value of the card */
uint8_t modeNegotiable; /*!< Indicates if the card acts in negotiable or a specific mode. */
uint8_t currentD; /*!< 4 bits DI - current baud rate divisor*/
/* Driver-specific variables */
uint8_t status; /*!< Indicates smart card status */
bool t0Indicated; /*!< Indicates ff T=0 indicated in TD1 byte */
bool t1Indicated; /*!< Indicates if T=1 indicated in TD2 byte */
bool atrComplete; /*!< Indicates whether the ATR received from the card was complete or not */
bool atrValid; /*!< Indicates whether the ATR received from the card was valid or not */
bool present; /*!< Indicates if a smart card is present */
bool active; /*!< Indicates if the smart card is activated */
bool faulty; /*!< Indicates whether smart card/interface is faulty */
smartcard_card_convention_t convention; /*!< Card convention, kSMARTCARD_DirectConvention for direct convention,
kSMARTCARD_InverseConvention for inverse convention */
} smartcard_card_params_t;
/*! @brief Smart card defines the state of the EMV timers in the Smart card driver */
typedef struct _smartcard_timers_state
{
volatile bool adtExpired; /*!< Indicates whether ADT timer expired */
volatile bool wwtExpired; /*!< Indicates whether WWT timer expired */
volatile bool cwtExpired; /*!< Indicates whether CWT timer expired */
volatile bool bwtExpired; /*!< Indicates whether BWT timer expired */
volatile bool initCharTimerExpired; /*!< Indicates whether reception timer
for initialization character (TS) after the RST has expired */
} smartcard_timers_state_t;
/*! @brief Defines user specified configuration of Smart card interface */
typedef struct _smartcard_interface_config
{
uint32_t smartCardClock; /*!< Smart card interface clock [Hz] */
uint32_t clockToResetDelay; /*!< Indicates clock to RST apply delay [smart card clock cycles] */
uint8_t clockModule; /*!< Smart card clock module number */
uint8_t clockModuleChannel; /*!< Smart card clock module channel number */
uint8_t clockModuleSourceClock; /*!< Smart card clock module source clock [e.g., BusClk] */
smartcard_card_voltage_class_t vcc; /*!< Smart card voltage class */
uint8_t controlPort; /*!< Smart card PHY control port instance */
uint8_t controlPin; /*!< Smart card PHY control pin instance */
uint8_t irqPort; /*!< Smart card PHY Interrupt port instance */
uint8_t irqPin; /*!< Smart card PHY Interrupt pin instance */
uint8_t resetPort; /*!< Smart card reset port instance */
uint8_t resetPin; /*!< Smart card reset pin instance */
uint8_t vsel0Port; /*!< Smart card PHY Vsel0 control port instance */
uint8_t vsel0Pin; /*!< Smart card PHY Vsel0 control pin instance */
uint8_t vsel1Port; /*!< Smart card PHY Vsel1 control port instance */
uint8_t vsel1Pin; /*!< Smart card PHY Vsel1 control pin instance */
uint8_t dataPort; /*!< Smart card PHY data port instance */
uint8_t dataPin; /*!< Smart card PHY data pin instance */
uint8_t dataPinMux; /*!< Smart card PHY data pin mux option */
uint8_t tsTimerId; /*!< Numerical identifier of the External HW timer for Initial character detection */
} smartcard_interface_config_t;
/*! @brief Defines user transfer structure used to initialize transfer */
typedef struct _smartcard_xfer
{
smartcard_direction_t direction; /*!< Direction of communication. (RX/TX) */
uint8_t *buff; /*!< The buffer of data. */
size_t size; /*!< The number of transferred units. */
} smartcard_xfer_t;
/*!
* @brief Runtime state of the Smart card driver.
*/
typedef struct _smartcard_context
{
/* Xfer part */
void *base; /*!< Smart card module base address */
smartcard_direction_t direction; /*!< Direction of communication. (RX/TX) */
uint8_t *xBuff; /*!< The buffer of data being transferred.*/
volatile size_t xSize; /*!< The number of bytes to be transferred. */
volatile bool xIsBusy; /*!< True if there is an active transfer. */
uint8_t txFifoEntryCount; /*!< Number of data word entries in transmit FIFO. */
uint8_t rxFifoThreshold; /*!< The max value of the receiver FIFO threshold. */
/* Smart card Interface part */
smartcard_interface_callback_t interfaceCallback; /*!< Callback to invoke after interface IC raised interrupt.*/
smartcard_transfer_callback_t transferCallback; /*!< Callback to invoke after transfer event occur.*/
void *interfaceCallbackParam; /*!< Interface callback parameter pointer.*/
void *transferCallbackParam; /*!< Transfer callback parameter pointer.*/
smartcard_time_delay_t timeDelay; /*!< Function which handles time delay defined by user or RTOS. */
smartcard_reset_type_t resetType; /*!< Indicates whether a Cold reset or Warm reset was requested. */
smartcard_transport_type_t tType; /*!< Indicates current transfer protocol (T0 or T1) */
/* Smart card State part */
volatile smartcard_transfer_state_t transferState; /*!< Indicates the current transfer state */
smartcard_timers_state_t timersState; /*!< Indicates the state of different protocol timers used in driver */
smartcard_card_params_t
cardParams; /*!< Smart card parameters(ATR and current) and interface slots states(ATR and current) */
uint8_t IFSD; /*!< Indicates the terminal IFSD */
smartcard_parity_type_t parity; /*!< Indicates current parity even/odd */
volatile bool rxtCrossed; /*!< Indicates whether RXT thresholds has been crossed */
volatile bool txtCrossed; /*!< Indicates whether TXT thresholds has been crossed */
volatile bool wtxRequested; /*!< Indicates whether WTX has been requested or not*/
volatile bool parityError; /*!< Indicates whether a parity error has been detected */
uint8_t statusBytes[2]; /*!< Used to store Status bytes SW1, SW2 of the last executed card command response */
/* Configuration part */
smartcard_interface_config_t interfaceConfig; /*!< Smart card interface configuration structure */
bool abortTransfer; /*!< Used to abort transfer. */
} smartcard_context_t;
/*! @}*/
#endif /* _FSL_SMARTCARD_H_*/