File indexing completed on 2025-05-11 08:23:01
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef _FSL_SMARTCARD_H_
0010 #define _FSL_SMARTCARD_H_
0011
0012 #include "fsl_common.h"
0013
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027 #define FSL_SMARTCARD_DRIVER_VERSION (MAKE_VERSION(2, 2, 2))
0028
0029
0030
0031
0032 #define SMARTCARD_INIT_DELAY_CLOCK_CYCLES (42000u)
0033
0034
0035 #define SMARTCARD_EMV_ATR_DURATION_ETU (20150u)
0036
0037
0038 #define SMARTCARD_TS_DIRECT_CONVENTION (0x3Bu)
0039
0040
0041 #define SMARTCARD_TS_INVERSE_CONVENTION (0x3Fu)
0042
0043
0044 enum
0045 {
0046 kStatus_SMARTCARD_Success = MAKE_STATUS(kStatusGroup_SMARTCARD, 0),
0047 kStatus_SMARTCARD_TxBusy = MAKE_STATUS(kStatusGroup_SMARTCARD, 1),
0048 kStatus_SMARTCARD_RxBusy = MAKE_STATUS(kStatusGroup_SMARTCARD, 2),
0049 kStatus_SMARTCARD_NoTransferInProgress = MAKE_STATUS(kStatusGroup_SMARTCARD, 3),
0050 kStatus_SMARTCARD_Timeout = MAKE_STATUS(kStatusGroup_SMARTCARD, 4),
0051 kStatus_SMARTCARD_Initialized =
0052 MAKE_STATUS(kStatusGroup_SMARTCARD, 5),
0053 kStatus_SMARTCARD_PhyInitialized =
0054 MAKE_STATUS(kStatusGroup_SMARTCARD, 6),
0055 kStatus_SMARTCARD_CardNotActivated = MAKE_STATUS(kStatusGroup_SMARTCARD, 7),
0056 kStatus_SMARTCARD_InvalidInput =
0057 MAKE_STATUS(kStatusGroup_SMARTCARD, 8),
0058 kStatus_SMARTCARD_OtherError = MAKE_STATUS(kStatusGroup_SMARTCARD, 9)
0059 };
0060
0061
0062 typedef enum _smartcard_control
0063 {
0064 kSMARTCARD_EnableADT = 0x0u,
0065 kSMARTCARD_DisableADT = 0x1u,
0066 kSMARTCARD_EnableGTV = 0x2u,
0067 kSMARTCARD_DisableGTV = 0x3u,
0068 kSMARTCARD_ResetWWT = 0x4u,
0069 kSMARTCARD_EnableWWT = 0x5u,
0070 kSMARTCARD_DisableWWT = 0x6u,
0071 kSMARTCARD_ResetCWT = 0x7u,
0072 kSMARTCARD_EnableCWT = 0x8u,
0073 kSMARTCARD_DisableCWT = 0x9u,
0074 kSMARTCARD_ResetBWT = 0xAu,
0075 kSMARTCARD_EnableBWT = 0xBu,
0076 kSMARTCARD_DisableBWT = 0xCu,
0077 kSMARTCARD_EnableInitDetect = 0xDu,
0078 kSMARTCARD_EnableAnack = 0xEu,
0079 kSMARTCARD_DisableAnack = 0xFu,
0080 kSMARTCARD_ConfigureBaudrate = 0x10u,
0081 kSMARTCARD_SetupATRMode = 0x11u,
0082 kSMARTCARD_SetupT0Mode = 0x12u,
0083 kSMARTCARD_SetupT1Mode = 0x13u,
0084 kSMARTCARD_EnableReceiverMode = 0x14u,
0085 kSMARTCARD_DisableReceiverMode = 0x15u,
0086 kSMARTCARD_EnableTransmitterMode = 0x16u,
0087 kSMARTCARD_DisableTransmitterMode = 0x17u,
0088 kSMARTCARD_ResetWaitTimeMultiplier = 0x18u,
0089 } smartcard_control_t;
0090
0091
0092 typedef enum _smartcard_card_voltage_class
0093 {
0094 kSMARTCARD_VoltageClassUnknown = 0x0u,
0095 kSMARTCARD_VoltageClassA5_0V = 0x1u,
0096 kSMARTCARD_VoltageClassB3_3V = 0x2u,
0097 kSMARTCARD_VoltageClassC1_8V = 0x3u
0098 } smartcard_card_voltage_class_t;
0099
0100
0101 typedef enum _smartcard_transfer_state
0102 {
0103 kSMARTCARD_IdleState = 0x0u,
0104 kSMARTCARD_WaitingForTSState = 0x1u,
0105 kSMARTCARD_InvalidTSDetecetedState = 0x2u,
0106 kSMARTCARD_ReceivingState = 0x3u,
0107 kSMARTCARD_TransmittingState = 0x4u,
0108 } smartcard_transfer_state_t;
0109
0110
0111 typedef enum _smartcard_reset_type
0112 {
0113 kSMARTCARD_ColdReset = 0x0u,
0114 kSMARTCARD_WarmReset = 0x1u,
0115 kSMARTCARD_NoColdReset = 0x2u,
0116 kSMARTCARD_NoWarmReset = 0x3u,
0117 } smartcard_reset_type_t;
0118
0119
0120 typedef enum _smartcard_transport_type
0121 {
0122 kSMARTCARD_T0Transport = 0x0u,
0123 kSMARTCARD_T1Transport = 0x1u
0124 } smartcard_transport_type_t;
0125
0126
0127 typedef enum _smartcard_parity_type
0128 {
0129 kSMARTCARD_EvenParity = 0x0u,
0130 kSMARTCARD_OddParity = 0x1u
0131 } smartcard_parity_type_t;
0132
0133
0134 typedef enum _smartcard_card_convention
0135 {
0136 kSMARTCARD_DirectConvention = 0x0u,
0137 kSMARTCARD_InverseConvention = 0x1u
0138 } smartcard_card_convention_t;
0139
0140
0141 typedef enum _smartcard_interface_control
0142 {
0143 kSMARTCARD_InterfaceSetVcc = 0x00u,
0144 kSMARTCARD_InterfaceSetClockToResetDelay = 0x01u,
0145 kSMARTCARD_InterfaceReadStatus = 0x02u
0146 } smartcard_interface_control_t;
0147
0148
0149 typedef enum _smartcard_direction
0150 {
0151 kSMARTCARD_Receive = 0u,
0152 kSMARTCARD_Transmit = 1u
0153 } smartcard_direction_t;
0154
0155
0156 typedef void (*smartcard_interface_callback_t)(void *smartcardContext, void *param);
0157
0158 typedef void (*smartcard_transfer_callback_t)(void *smartcardContext, void *param);
0159
0160
0161 typedef void (*smartcard_time_delay_t)(uint32_t us);
0162
0163
0164 typedef struct _smartcard_card_params
0165 {
0166
0167 uint16_t Fi;
0168 uint8_t fMax;
0169 uint8_t WI;
0170 uint8_t Di;
0171 uint8_t BWI;
0172 uint8_t CWI;
0173 uint8_t BGI;
0174 uint8_t GTN;
0175 uint8_t IFSC;
0176 uint8_t modeNegotiable;
0177 uint8_t currentD;
0178
0179 uint8_t status;
0180 bool t0Indicated;
0181 bool t1Indicated;
0182 bool atrComplete;
0183 bool atrValid;
0184 bool present;
0185 bool active;
0186 bool faulty;
0187 smartcard_card_convention_t convention;
0188
0189 } smartcard_card_params_t;
0190
0191
0192 typedef struct _smartcard_timers_state
0193 {
0194 volatile bool adtExpired;
0195 volatile bool wwtExpired;
0196 volatile bool cwtExpired;
0197 volatile bool bwtExpired;
0198 volatile bool initCharTimerExpired;
0199
0200 } smartcard_timers_state_t;
0201
0202
0203 typedef struct _smartcard_interface_config
0204 {
0205 uint32_t smartCardClock;
0206 uint32_t clockToResetDelay;
0207 uint8_t clockModule;
0208 uint8_t clockModuleChannel;
0209 uint8_t clockModuleSourceClock;
0210 smartcard_card_voltage_class_t vcc;
0211 uint8_t controlPort;
0212 uint8_t controlPin;
0213 uint8_t irqPort;
0214 uint8_t irqPin;
0215 uint8_t resetPort;
0216 uint8_t resetPin;
0217 uint8_t vsel0Port;
0218 uint8_t vsel0Pin;
0219 uint8_t vsel1Port;
0220 uint8_t vsel1Pin;
0221 uint8_t dataPort;
0222 uint8_t dataPin;
0223 uint8_t dataPinMux;
0224 uint8_t tsTimerId;
0225 } smartcard_interface_config_t;
0226
0227
0228 typedef struct _smartcard_xfer
0229 {
0230 smartcard_direction_t direction;
0231 uint8_t *buff;
0232 size_t size;
0233 } smartcard_xfer_t;
0234
0235
0236
0237
0238 typedef struct _smartcard_context
0239 {
0240
0241 void *base;
0242 smartcard_direction_t direction;
0243 uint8_t *xBuff;
0244 volatile size_t xSize;
0245 volatile bool xIsBusy;
0246 uint8_t txFifoEntryCount;
0247 uint8_t rxFifoThreshold;
0248
0249 smartcard_interface_callback_t interfaceCallback;
0250 smartcard_transfer_callback_t transferCallback;
0251 void *interfaceCallbackParam;
0252 void *transferCallbackParam;
0253 smartcard_time_delay_t timeDelay;
0254 smartcard_reset_type_t resetType;
0255 smartcard_transport_type_t tType;
0256
0257 volatile smartcard_transfer_state_t transferState;
0258 smartcard_timers_state_t timersState;
0259 smartcard_card_params_t
0260 cardParams;
0261 uint8_t IFSD;
0262 smartcard_parity_type_t parity;
0263 volatile bool rxtCrossed;
0264 volatile bool txtCrossed;
0265 volatile bool wtxRequested;
0266 volatile bool parityError;
0267 uint8_t statusBytes[2];
0268
0269 smartcard_interface_config_t interfaceConfig;
0270 bool abortTransfer;
0271 } smartcard_context_t;
0272
0273
0274 #endif