File indexing completed on 2025-05-11 08:23:01
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "fsl_smartcard_emvsim.h"
0010
0011
0012 #ifndef FSL_COMPONENT_ID
0013 #define FSL_COMPONENT_ID "platform.drivers.smartcard_emvsim"
0014 #endif
0015
0016
0017
0018
0019
0020 static EMVSIM_Type *const s_emvsimBases[] = EMVSIM_BASE_PTRS;
0021
0022
0023 static const IRQn_Type s_emvsimIRQ[] = EMVSIM_IRQS;
0024
0025 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0026
0027 static const clock_ip_name_t s_emvsimClock[] = EMVSIM_CLOCKS;
0028 #endif
0029
0030
0031
0032
0033
0034
0035 static void smartcard_emvsim_CompleteSendData(EMVSIM_Type *base, smartcard_context_t *context);
0036 static void smartcard_emvsim_StartSendData(EMVSIM_Type *base, smartcard_context_t *context);
0037 static void smartcard_emvsim_CompleteReceiveData(EMVSIM_Type *base, smartcard_context_t *context);
0038 static void smartcard_emvsim_StartReceiveData(EMVSIM_Type *base, smartcard_context_t *context);
0039 static void smartcard_emvsim_SetTransferType(EMVSIM_Type *base,
0040 smartcard_context_t *context,
0041 smartcard_control_t control);
0042 static uint32_t smartcard_emvsim_GetInstance(EMVSIM_Type *base);
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053 static uint32_t smartcard_emvsim_GetInstance(EMVSIM_Type *base)
0054 {
0055 uint8_t instance = 0;
0056 uint32_t emvsimArrayCount = (sizeof(s_emvsimBases) / sizeof(s_emvsimBases[0]));
0057
0058
0059 for (instance = 0; instance < emvsimArrayCount; instance++)
0060 {
0061 if (s_emvsimBases[instance] == base)
0062 {
0063 break;
0064 }
0065 }
0066
0067 assert(instance < emvsimArrayCount);
0068
0069 return instance;
0070 }
0071
0072
0073
0074
0075
0076
0077 static void smartcard_emvsim_CompleteSendData(EMVSIM_Type *base, smartcard_context_t *context)
0078 {
0079 assert((NULL != context));
0080
0081
0082 base->INT_MASK |= (EMVSIM_INT_MASK_ETC_IM_MASK | EMVSIM_INT_MASK_TDT_IM_MASK);
0083
0084
0085 base->CTRL &= ~EMVSIM_CTRL_XMT_EN_MASK;
0086
0087 base->RX_STATUS = EMVSIM_RX_STATUS_RX_DATA_MASK;
0088
0089 base->CTRL |= EMVSIM_CTRL_RCV_EN_MASK;
0090
0091 context->xIsBusy = false;
0092 context->transferState = kSMARTCARD_IdleState;
0093
0094 context->xSize = 0u;
0095
0096 if (NULL != context->transferCallback)
0097 {
0098 context->transferCallback(context, context->transferCallbackParam);
0099 }
0100 }
0101
0102
0103
0104
0105
0106
0107
0108 static void smartcard_emvsim_CompleteReceiveData(EMVSIM_Type *base, smartcard_context_t *context)
0109 {
0110 assert((NULL != context));
0111
0112
0113 base->INT_MASK |= (EMVSIM_INT_MASK_RDT_IM_MASK | EMVSIM_INT_MASK_RX_DATA_IM_MASK);
0114
0115
0116 while (((base->RX_STATUS & EMVSIM_RX_STATUS_RX_CNT_MASK) != 0u) && ((context->xSize) > 0u))
0117 {
0118
0119 *context->xBuff = (uint8_t)(base->RX_BUF);
0120 ++context->xBuff;
0121 --context->xSize;
0122 }
0123
0124
0125 context->xIsBusy = false;
0126
0127 if (NULL != context->transferCallback)
0128 {
0129 context->transferCallback(context, context->transferCallbackParam);
0130 }
0131 }
0132
0133
0134
0135
0136
0137
0138
0139 static void smartcard_emvsim_StartSendData(EMVSIM_Type *base, smartcard_context_t *context)
0140 {
0141 assert((NULL != context));
0142
0143 uint32_t delay = 0u;
0144 uint32_t control = 0u;
0145
0146
0147
0148 delay = 22u * 16u;
0149
0150 control = base->CTRL;
0151 base->CTRL = 0u;
0152 base->TX_GETU = context->cardParams.GTN;
0153
0154 base->TX_STATUS = EMVSIM_TX_STATUS_GPCNT1_TO_MASK;
0155
0156 base->INT_MASK |= EMVSIM_INT_MASK_GPCNT1_IM_MASK;
0157
0158 base->GPCNT1_VAL = delay;
0159
0160 base->CLKCFG =
0161 (base->CLKCFG & ~EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK) | EMVSIM_CLKCFG_GPCNT1_CLK_SEL(kEMVSIM_GPCRxClock);
0162
0163 base->CTRL |= EMVSIM_CTRL_RCV_EN_MASK;
0164
0165 while ((base->TX_STATUS & EMVSIM_TX_STATUS_GPCNT1_TO_MASK) == 0u)
0166 {
0167 }
0168
0169 base->TX_STATUS = EMVSIM_TX_STATUS_GPCNT1_TO_MASK;
0170 base->CLKCFG &= ~EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK;
0171
0172 base->CTRL = control & ~(EMVSIM_CTRL_XMT_EN_MASK | EMVSIM_CTRL_RCV_EN_MASK);
0173
0174 context->transferState = kSMARTCARD_TransmittingState;
0175 context->xIsBusy = true;
0176
0177
0178 base->CTRL |= EMVSIM_CTRL_FLSH_TX_MASK;
0179
0180
0181 base->CTRL |= EMVSIM_CTRL_XMT_EN_MASK;
0182
0183
0184 base->TX_THD &= ~EMVSIM_TX_THD_TDT_MASK;
0185
0186
0187 base->INT_MASK &= ~EMVSIM_INT_MASK_TDT_IM_MASK;
0188 }
0189
0190
0191
0192
0193
0194
0195
0196 static void smartcard_emvsim_StartReceiveData(EMVSIM_Type *base, smartcard_context_t *context)
0197 {
0198 assert((NULL != context));
0199
0200
0201 context->xIsBusy = true;
0202
0203 base->INT_MASK &= ~EMVSIM_INT_MASK_BWT_ERR_IM_MASK;
0204
0205 base->CTRL &= ~EMVSIM_CTRL_XMT_EN_MASK;
0206
0207 base->CTRL |= EMVSIM_CTRL_RCV_EN_MASK;
0208
0209
0210
0211 if (context->xSize < context->rxFifoThreshold)
0212 {
0213 uint32_t rx_thd;
0214 rx_thd = (base->RX_THD & ~EMVSIM_RX_THD_RDT_MASK);
0215 rx_thd |= context->xSize;
0216 base->RX_THD = rx_thd;
0217 }
0218 else
0219 {
0220 base->RX_THD = ((base->RX_THD & ~EMVSIM_RX_THD_RDT_MASK) | context->rxFifoThreshold);
0221 }
0222
0223
0224 base->INT_MASK &= ~EMVSIM_INT_MASK_RDT_IM_MASK;
0225
0226 if (context->tType == kSMARTCARD_T1Transport)
0227 {
0228
0229
0230 base->INT_MASK &= ~EMVSIM_INT_MASK_RX_DATA_IM_MASK;
0231 }
0232 }
0233
0234
0235
0236
0237
0238
0239
0240 static void smartcard_emvsim_SetTransferType(EMVSIM_Type *base,
0241 smartcard_context_t *context,
0242 smartcard_control_t control)
0243 {
0244 assert((NULL != context));
0245 assert((control == kSMARTCARD_SetupATRMode) || (control == kSMARTCARD_SetupT0Mode) ||
0246 (control == kSMARTCARD_SetupT1Mode));
0247
0248 uint16_t temp16 = 0u;
0249 uint32_t bwiVal = 0u;
0250 uint8_t tdt = 0u;
0251
0252 if (control == kSMARTCARD_SetupATRMode)
0253 {
0254
0255 base->CTRL &= ~(EMVSIM_CTRL_RCVR_11_MASK | EMVSIM_CTRL_XMT_CRC_LRC_MASK | EMVSIM_CTRL_LRC_EN_MASK |
0256 EMVSIM_CTRL_ANACK_MASK | EMVSIM_CTRL_ONACK_MASK | EMVSIM_CTRL_RCV_EN_MASK);
0257
0258 context->cardParams.Fi = 372u;
0259 context->cardParams.Di = 1u;
0260 context->cardParams.currentD = 1u;
0261 context->cardParams.WI = 0x0Au;
0262 context->cardParams.GTN = 0x00u;
0263
0264 base->DIVISOR = (((uint32_t)context->cardParams.Fi / context->cardParams.currentD) & 0x1FFu);
0265
0266
0267 temp16 = (960u * context->cardParams.currentD * context->cardParams.WI) +
0268 (context->cardParams.currentD * 480u) + SMARTCARD_WWT_ADJUSTMENT;
0269 base->CWT_VAL = temp16;
0270 base->BWT_VAL = temp16;
0271
0272
0273
0274 base->TX_GETU = context->cardParams.GTN;
0275
0276
0277 base->RX_THD = EMVSIM_RX_THD_RDT(1);
0278
0279 tdt = (uint8_t)(((base->PARAM & EMVSIM_PARAM_TX_FIFO_DEPTH_MASK) >> EMVSIM_PARAM_TX_FIFO_DEPTH_SHIFT) - 1u);
0280 base->TX_THD = (EMVSIM_TX_THD_TNCK_THD(SMARTCARD_EMV_TX_NACK_THRESHOLD) | EMVSIM_TX_THD_TDT(tdt));
0281
0282 base->RX_STATUS = 0xFFFFFFFFu;
0283
0284 base->INT_MASK &= ~EMVSIM_INT_MASK_TNACK_IM_MASK;
0285
0286 context->tType = kSMARTCARD_T0Transport;
0287 }
0288 else if (control == kSMARTCARD_SetupT0Mode)
0289 {
0290
0291
0292
0293 base->CTRL &=
0294 ~(EMVSIM_CTRL_RCV_EN_MASK | EMVSIM_CTRL_CWT_EN_MASK | EMVSIM_CTRL_BWT_EN_MASK | EMVSIM_CTRL_RCVR_11_MASK |
0295 EMVSIM_CTRL_XMT_CRC_LRC_MASK | EMVSIM_CTRL_LRC_EN_MASK | EMVSIM_CTRL_ICM_MASK);
0296
0297
0298 temp16 = (960u * context->cardParams.currentD * context->cardParams.WI) +
0299 (context->cardParams.currentD * 480u) + SMARTCARD_WWT_ADJUSTMENT;
0300 base->CWT_VAL = temp16;
0301 base->BWT_VAL = temp16;
0302
0303
0304
0305
0306 context->cardParams.GTN = (context->cardParams.GTN == 0xFFu) ? 0x00u : context->cardParams.GTN;
0307 base->TX_GETU = context->cardParams.GTN;
0308
0309
0310 base->RX_THD = (EMVSIM_RX_THD_RNCK_THD(SMARTCARD_EMV_RX_NACK_THRESHOLD) | EMVSIM_RX_THD_RDT(1));
0311
0312 tdt = (uint8_t)(((base->PARAM & EMVSIM_PARAM_TX_FIFO_DEPTH_MASK) >> EMVSIM_PARAM_TX_FIFO_DEPTH_SHIFT) - 1u);
0313 base->TX_THD = (EMVSIM_TX_THD_TNCK_THD(SMARTCARD_EMV_TX_NACK_THRESHOLD) | EMVSIM_TX_THD_TDT(tdt));
0314
0315 base->INT_MASK &= ~EMVSIM_INT_MASK_TNACK_IM_MASK;
0316
0317 base->CTRL |=
0318 (EMVSIM_CTRL_CWT_EN_MASK | EMVSIM_CTRL_BWT_EN_MASK | EMVSIM_CTRL_ANACK_MASK | EMVSIM_CTRL_ONACK_MASK);
0319
0320 context->tType = kSMARTCARD_T0Transport;
0321 }
0322 else
0323 {
0324 base->CTRL &= ~(EMVSIM_CTRL_CWT_EN_MASK | EMVSIM_CTRL_BWT_EN_MASK | EMVSIM_CTRL_ANACK_MASK |
0325 EMVSIM_CTRL_ONACK_MASK | EMVSIM_CTRL_XMT_CRC_LRC_MASK | EMVSIM_CTRL_LRC_EN_MASK);
0326
0327
0328
0329 bwiVal = 11u + ((((uint32_t)1u << context->cardParams.BWI) + 1u) * 960u * context->cardParams.currentD);
0330 #ifdef CARDSIM_EXTRADELAY_USED
0331 base->BWT_VAL = bwiVal + 100u;
0332 #else
0333 base->BWT_VAL = bwiVal;
0334 #endif
0335
0336
0337
0338 if (context->cardParams.currentD == 1u)
0339 {
0340 #ifdef CARDSIM_EXTRADELAY_USED
0341 temp16 = ((uint16_t)1u << context->cardParams.CWI) + 16u;
0342 #else
0343 temp16 = ((uint16_t)1u << context->cardParams.CWI) + 15u;
0344 #endif
0345 }
0346 else
0347 {
0348 #ifdef CARDSIM_EXTRADELAY_USED
0349 temp16 = ((uint16_t)1u << context->cardParams.CWI) + 20u + SMARTCARD_CWT_ADJUSTMENT;
0350 #else
0351 temp16 = ((uint16_t)1u << context->cardParams.CWI) + 15u + SMARTCARD_CWT_ADJUSTMENT;
0352 #endif
0353 }
0354
0355
0356
0357 base->CWT_VAL = temp16;
0358 context->cardParams.BGI = 22u;
0359 base->BGT_VAL = context->cardParams.BGI;
0360
0361
0362
0363 base->TX_GETU = context->cardParams.GTN;
0364
0365
0366 base->CTRL |= (EMVSIM_CTRL_RCVR_11_MASK | EMVSIM_CTRL_CWT_EN_MASK | EMVSIM_CTRL_BWT_EN_MASK);
0367
0368 base->RX_THD = (EMVSIM_RX_THD_RNCK_THD(SMARTCARD_EMV_RX_NACK_THRESHOLD) | EMVSIM_RX_THD_RDT(1));
0369
0370 tdt = (uint8_t)(((base->PARAM & EMVSIM_PARAM_TX_FIFO_DEPTH_MASK) >> EMVSIM_PARAM_TX_FIFO_DEPTH_SHIFT) - 1u);
0371 base->TX_THD = (EMVSIM_TX_THD_TDT(tdt) | EMVSIM_TX_THD_TNCK_THD(SMARTCARD_EMV_TX_NACK_THRESHOLD));
0372
0373 context->tType = kSMARTCARD_T1Transport;
0374 }
0375 }
0376
0377
0378
0379
0380
0381
0382
0383
0384
0385
0386
0387
0388
0389 void SMARTCARD_EMVSIM_GetDefaultConfig(smartcard_card_params_t *cardParams)
0390 {
0391
0392 (void)memset(cardParams, 0, sizeof(*cardParams));
0393
0394
0395 cardParams->Fi = 372u;
0396 cardParams->Di = 1u;
0397 cardParams->currentD = 1u;
0398 cardParams->WI = 0x0Au;
0399 cardParams->GTN = 0x00u;
0400 }
0401
0402
0403
0404
0405
0406
0407
0408
0409
0410
0411
0412
0413
0414 status_t SMARTCARD_EMVSIM_Init(EMVSIM_Type *base, smartcard_context_t *context, uint32_t srcClock_Hz)
0415 {
0416 assert((NULL != base));
0417
0418 if ((NULL == context) || (srcClock_Hz == 0u))
0419 {
0420 return kStatus_SMARTCARD_InvalidInput;
0421 }
0422
0423 uint32_t instance = smartcard_emvsim_GetInstance(base);
0424
0425 #if (defined(FSL_FEATURE_SOC_MCG_COUNT) && FSL_FEATURE_SOC_MCG_COUNT)
0426 CLOCK_SetEmvsimClock(1u);
0427 #endif
0428 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0429
0430 CLOCK_EnableClock(s_emvsimClock[instance]);
0431 #endif
0432 context->base = base;
0433
0434 base->CLKCFG = 0u;
0435 base->DIVISOR = 372u;
0436 base->CTRL = 0x300u;
0437 base->INT_MASK = 0x7FFFu;
0438 base->RX_THD = 1u;
0439 base->TX_THD = 0u;
0440 base->PCSR = 0x1000000u;
0441 base->TX_GETU = 0u;
0442 base->CWT_VAL = 0xFFFFu;
0443 base->BWT_VAL = 0xFFFFFFFFu;
0444 base->BGT_VAL = 0u;
0445 base->GPCNT0_VAL = 0xFFFFu;
0446 base->GPCNT1_VAL = 0xFFFFu;
0447
0448 smartcard_emvsim_SetTransferType(base, context, kSMARTCARD_SetupATRMode);
0449
0450 context->txFifoEntryCount =
0451 (uint8_t)((base->PARAM & EMVSIM_PARAM_TX_FIFO_DEPTH_MASK) >> EMVSIM_PARAM_TX_FIFO_DEPTH_SHIFT);
0452
0453 context->rxFifoThreshold =
0454 (uint8_t)((base->PARAM & EMVSIM_PARAM_RX_FIFO_DEPTH_MASK) >> EMVSIM_PARAM_RX_FIFO_DEPTH_SHIFT);
0455 if ((EMVSIM_RX_THD_RDT_MASK >> EMVSIM_RX_THD_RDT_SHIFT) < context->rxFifoThreshold)
0456 {
0457 context->rxFifoThreshold = (EMVSIM_RX_THD_RDT_MASK >> EMVSIM_RX_THD_RDT_SHIFT);
0458 }
0459
0460 #if defined(FSL_FEATURE_SOC_INTMUX_COUNT) && FSL_FEATURE_SOC_INTMUX_COUNT
0461 if ((uint32_t)s_emvsimIRQ[instance] < (uint32_t)FSL_FEATURE_INTMUX_IRQ_START_INDEX)
0462 {
0463 NVIC_EnableIRQ(s_emvsimIRQ[instance]);
0464 }
0465 #else
0466 NVIC_EnableIRQ(s_emvsimIRQ[instance]);
0467 #endif
0468
0469 base->CTRL &= ~EMVSIM_CTRL_XMT_EN_MASK & ~EMVSIM_CTRL_RCV_EN_MASK;
0470
0471 return kStatus_SMARTCARD_Success;
0472 }
0473
0474
0475
0476
0477
0478
0479
0480 void SMARTCARD_EMVSIM_Deinit(EMVSIM_Type *base)
0481 {
0482 uint32_t instance = 0u;
0483
0484
0485
0486 if ((base->TX_STATUS & EMVSIM_TX_STATUS_TX_CNT_MASK) != 0u)
0487 {
0488 while ((base->TX_STATUS & EMVSIM_TX_STATUS_ETCF_MASK) == 0u)
0489 {
0490 }
0491 }
0492 instance = smartcard_emvsim_GetInstance(base);
0493
0494 base->CTRL &= ~EMVSIM_CTRL_XMT_EN_MASK & ~EMVSIM_CTRL_RCV_EN_MASK;
0495 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0496
0497 CLOCK_DisableClock(s_emvsimClock[instance]);
0498 #endif
0499
0500 #if defined(FSL_FEATURE_SOC_INTMUX_COUNT) && FSL_FEATURE_SOC_INTMUX_COUNT
0501 if ((uint32_t)s_emvsimIRQ[instance] < (uint32_t)FSL_FEATURE_INTMUX_IRQ_START_INDEX)
0502 {
0503 NVIC_DisableIRQ(s_emvsimIRQ[instance]);
0504 }
0505 #else
0506 NVIC_DisableIRQ(s_emvsimIRQ[instance]);
0507 #endif
0508 }
0509
0510
0511
0512
0513
0514
0515
0516
0517
0518
0519
0520
0521
0522
0523
0524
0525 status_t SMARTCARD_EMVSIM_TransferNonBlocking(EMVSIM_Type *base, smartcard_context_t *context, smartcard_xfer_t *xfer)
0526 {
0527 if ((NULL == context) || (NULL == xfer) || (xfer->buff == NULL))
0528 {
0529 return kStatus_SMARTCARD_InvalidInput;
0530 }
0531
0532
0533 if ((0u == xfer->size))
0534 {
0535 return kStatus_SMARTCARD_Success;
0536 }
0537
0538 if (0 != SMARTCARD_EMVSIM_GetTransferRemainingBytes(base, context))
0539 {
0540 if (kSMARTCARD_Receive == context->direction)
0541 {
0542 return kStatus_SMARTCARD_RxBusy;
0543 }
0544 else
0545 {
0546 return kStatus_SMARTCARD_TxBusy;
0547 }
0548 }
0549
0550 context->rxtCrossed = false;
0551 context->txtCrossed = false;
0552 context->parityError = false;
0553
0554 context->xBuff = xfer->buff;
0555 context->xSize = xfer->size;
0556
0557 if (kSMARTCARD_Receive == xfer->direction)
0558 {
0559 context->direction = xfer->direction;
0560 context->transferState = kSMARTCARD_ReceivingState;
0561
0562 smartcard_emvsim_StartReceiveData(base, context);
0563 }
0564 else if (kSMARTCARD_Transmit == xfer->direction)
0565 {
0566 context->direction = xfer->direction;
0567 context->transferState = kSMARTCARD_TransmittingState;
0568
0569 smartcard_emvsim_StartSendData(base, context);
0570 }
0571 else
0572 {
0573 return kStatus_SMARTCARD_InvalidInput;
0574 }
0575
0576 return kStatus_SMARTCARD_Success;
0577 }
0578
0579
0580
0581
0582
0583
0584
0585
0586
0587
0588
0589
0590
0591
0592 int32_t SMARTCARD_EMVSIM_GetTransferRemainingBytes(EMVSIM_Type *base, smartcard_context_t *context)
0593 {
0594 if ((NULL == context))
0595 {
0596 return -1;
0597 }
0598 if (context->xIsBusy)
0599 {
0600 if (context->direction == kSMARTCARD_Transmit)
0601 {
0602
0603 uint32_t count;
0604 count = context->xSize;
0605 count += ((base->TX_STATUS & EMVSIM_TX_STATUS_TX_CNT_MASK) >> EMVSIM_TX_STATUS_TX_CNT_SHIFT);
0606 return (int32_t)count;
0607 }
0608 return (int32_t)context->xSize;
0609 }
0610
0611 return 0;
0612 }
0613
0614
0615
0616
0617
0618
0619
0620
0621
0622
0623
0624
0625 status_t SMARTCARD_EMVSIM_AbortTransfer(EMVSIM_Type *base, smartcard_context_t *context)
0626 {
0627 if ((NULL == context))
0628 {
0629 return kStatus_SMARTCARD_InvalidInput;
0630 }
0631
0632 context->abortTransfer = true;
0633
0634
0635 if ((!context->xIsBusy))
0636 {
0637 return kStatus_SMARTCARD_NoTransferInProgress;
0638 }
0639
0640 if (kSMARTCARD_Receive == context->direction)
0641 {
0642 smartcard_emvsim_CompleteReceiveData(base, context);
0643 }
0644 else if (kSMARTCARD_Transmit == context->direction)
0645 {
0646 smartcard_emvsim_CompleteSendData(base, context);
0647 }
0648 else
0649 {
0650 return kStatus_SMARTCARD_InvalidInput;
0651 }
0652
0653 return kStatus_SMARTCARD_Success;
0654 }
0655
0656
0657
0658
0659
0660
0661
0662 void SMARTCARD_EMVSIM_IRQHandler(EMVSIM_Type *base, smartcard_context_t *context)
0663 {
0664 if (NULL == context)
0665 {
0666 return;
0667 }
0668
0669
0670
0671 if (((base->PCSR & EMVSIM_PCSR_SPDIM_MASK) == 0u) && ((base->PCSR & EMVSIM_PCSR_SPDIF_MASK) != 0u))
0672 {
0673
0674 base->PCSR |= EMVSIM_PCSR_SPDIF_MASK;
0675
0676 if (((emvsim_presence_detect_edge_t)(uint32_t)((base->PCSR & EMVSIM_PCSR_SPDES_MASK) >>
0677 EMVSIM_PCSR_SPDES_SHIFT) == kEMVSIM_DetectOnFallingEdge) &&
0678 ((emvsim_presence_detect_status_t)(uint32_t)((base->PCSR & EMVSIM_PCSR_SPDP_MASK) >>
0679 EMVSIM_PCSR_SPDP_SHIFT) == kEMVSIM_DetectPinIsLow))
0680 {
0681 base->PCSR |= EMVSIM_PCSR_SPDES_MASK;
0682 }
0683 if (((emvsim_presence_detect_edge_t)(uint32_t)((base->PCSR & EMVSIM_PCSR_SPDES_MASK) >>
0684 EMVSIM_PCSR_SPDES_SHIFT) == kEMVSIM_DetectOnRisingEdge) &&
0685 ((emvsim_presence_detect_status_t)(uint32_t)((base->PCSR & EMVSIM_PCSR_SPDP_MASK) >>
0686 EMVSIM_PCSR_SPDP_SHIFT) == kEMVSIM_DetectPinIsHigh))
0687 {
0688 base->PCSR &= ~EMVSIM_PCSR_SPDES_MASK;
0689 }
0690
0691
0692 if (NULL != context->interfaceCallback)
0693 {
0694 context->interfaceCallback(context, context->interfaceCallbackParam);
0695 }
0696 return;
0697 }
0698
0699 if (((base->INT_MASK & EMVSIM_INT_MASK_GPCNT0_IM_MASK) >> EMVSIM_INT_MASK_GPCNT0_IM_SHIFT == 0u) &&
0700 ((base->TX_STATUS & EMVSIM_TX_STATUS_GPCNT0_TO_MASK) != 0u))
0701 {
0702
0703 base->CLKCFG &= ~(EMVSIM_CLKCFG_GPCNT0_CLK_SEL_MASK | EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK);
0704 context->timersState.initCharTimerExpired = true;
0705
0706 base->INT_MASK |= EMVSIM_INT_MASK_GPCNT0_IM_MASK;
0707 base->TX_STATUS = EMVSIM_TX_STATUS_GPCNT0_TO_MASK;
0708
0709 base->CTRL &= ~EMVSIM_CTRL_RCV_EN_MASK;
0710 base->CTRL |= EMVSIM_CTRL_RCV_EN_MASK;
0711 context->transferState = kSMARTCARD_IdleState;
0712
0713 smartcard_emvsim_CompleteReceiveData(base, context);
0714 return;
0715 }
0716
0717 if (((base->INT_MASK & EMVSIM_INT_MASK_GPCNT1_IM_MASK) == 0u) &&
0718 ((base->TX_STATUS & EMVSIM_TX_STATUS_GPCNT1_TO_MASK) != 0u))
0719 {
0720 base->CLKCFG &= ~EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK;
0721
0722 base->INT_MASK |= EMVSIM_INT_MASK_GPCNT1_IM_MASK;
0723 base->TX_STATUS = EMVSIM_TX_STATUS_GPCNT1_TO_MASK;
0724 context->timersState.adtExpired = true;
0725
0726 smartcard_emvsim_CompleteReceiveData(base, context);
0727 return;
0728 }
0729
0730
0731
0732
0733
0734
0735 if ((base->RX_STATUS & EMVSIM_RX_STATUS_PEF_MASK) != 0u)
0736 {
0737 context->parityError = true;
0738
0739 base->RX_STATUS = EMVSIM_RX_STATUS_PEF_MASK;
0740 }
0741
0742 if ((base->TX_STATUS & EMVSIM_TX_STATUS_TNTE_MASK) != 0u)
0743 {
0744 context->txtCrossed = true;
0745
0746 base->INT_MASK |= EMVSIM_INT_MASK_TNACK_IM_MASK;
0747
0748 base->TX_STATUS = EMVSIM_TX_STATUS_TNTE_MASK;
0749
0750 smartcard_emvsim_CompleteSendData(base, context);
0751 return;
0752 }
0753
0754 if ((base->RX_STATUS & EMVSIM_RX_STATUS_RTE_MASK) != 0u)
0755 {
0756 context->rxtCrossed = true;
0757
0758 base->RX_STATUS = EMVSIM_RX_STATUS_RTE_MASK;
0759 if (context->xIsBusy)
0760 {
0761 smartcard_emvsim_CompleteReceiveData(base, context);
0762 }
0763 }
0764
0765 if (((base->INT_MASK & EMVSIM_INT_MASK_CWT_ERR_IM_MASK) == 0u) &&
0766 ((base->RX_STATUS & EMVSIM_RX_STATUS_CWT_ERR_MASK) != 0u))
0767 {
0768 base->INT_MASK |= EMVSIM_INT_MASK_CWT_ERR_IM_MASK;
0769
0770 base->CTRL &= ~EMVSIM_CTRL_CWT_EN_MASK;
0771
0772 base->RX_STATUS = EMVSIM_RX_STATUS_CWT_ERR_MASK;
0773
0774 base->CTRL |= EMVSIM_CTRL_CWT_EN_MASK;
0775 context->transferState = kSMARTCARD_IdleState;
0776
0777 if (kSMARTCARD_T0Transport == context->tType)
0778 {
0779 context->timersState.wwtExpired = true;
0780 }
0781 else
0782 {
0783 context->timersState.cwtExpired = true;
0784 }
0785 if (context->xIsBusy)
0786 {
0787 smartcard_emvsim_CompleteReceiveData(base, context);
0788 }
0789 }
0790
0791 if (((base->INT_MASK & EMVSIM_INT_MASK_BWT_ERR_IM_MASK) == 0u) &&
0792 ((base->RX_STATUS & EMVSIM_RX_STATUS_BWT_ERR_MASK) != 0u))
0793 {
0794 base->INT_MASK |= EMVSIM_INT_MASK_BWT_ERR_IM_MASK;
0795
0796 base->CTRL &= ~EMVSIM_CTRL_BWT_EN_MASK;
0797
0798 base->RX_STATUS = EMVSIM_RX_STATUS_BWT_ERR_MASK;
0799
0800 base->CTRL |= EMVSIM_CTRL_BWT_EN_MASK;
0801
0802 if (kSMARTCARD_T0Transport == context->tType)
0803 {
0804 context->timersState.wwtExpired = true;
0805 }
0806 else
0807 {
0808 context->timersState.bwtExpired = true;
0809 }
0810
0811 if (context->wtxRequested)
0812 {
0813 (void)SMARTCARD_EMVSIM_Control(base, context, kSMARTCARD_ResetWaitTimeMultiplier, 1u);
0814 }
0815 if (context->xIsBusy)
0816 {
0817 smartcard_emvsim_CompleteReceiveData(base, context);
0818 }
0819 }
0820
0821
0822
0823 if (((base->INT_MASK & EMVSIM_INT_MASK_RX_DATA_IM_MASK) == 0u) &&
0824 ((base->RX_STATUS & EMVSIM_RX_STATUS_RX_DATA_MASK) != 0u))
0825 {
0826 if ((context->tType == kSMARTCARD_T1Transport) && (context->xSize > 0u) &&
0827 ((base->INT_MASK & EMVSIM_INT_MASK_BWT_ERR_IM_MASK) == 0u))
0828 {
0829 context->timersState.cwtExpired = false;
0830
0831 base->RX_STATUS = EMVSIM_RX_STATUS_CWT_ERR_MASK;
0832
0833 base->CTRL |= EMVSIM_CTRL_CWT_EN_MASK;
0834
0835 base->INT_MASK = (base->INT_MASK & ~EMVSIM_INT_MASK_CWT_ERR_IM_MASK) | EMVSIM_INT_MASK_BWT_ERR_IM_MASK;
0836 }
0837
0838 base->INT_MASK |= EMVSIM_INT_MASK_RX_DATA_IM_MASK;
0839 }
0840
0841
0842 if (((base->INT_MASK & EMVSIM_INT_MASK_RDT_IM_MASK) == 0u) &&
0843 ((base->RX_STATUS & EMVSIM_RX_STATUS_RDTF_MASK) != 0u))
0844 {
0845 if (kSMARTCARD_WaitingForTSState == context->transferState)
0846 {
0847
0848 (void)(base->RX_BUF);
0849
0850 if ((base->CTRL & EMVSIM_CTRL_ICM_MASK) != 0u)
0851 {
0852 context->transferState = kSMARTCARD_InvalidTSDetecetedState;
0853 }
0854 else
0855 {
0856 context->transferState = kSMARTCARD_ReceivingState;
0857
0858 context->cardParams.convention =
0859 (smartcard_card_convention_t)(uint32_t)((base->CTRL & EMVSIM_CTRL_IC_MASK) >> EMVSIM_CTRL_IC_SHIFT);
0860 }
0861 if (kSMARTCARD_InvalidTSDetecetedState == context->transferState)
0862 {
0863 base->CLKCFG &= ~(EMVSIM_CLKCFG_GPCNT0_CLK_SEL_MASK | EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK);
0864 base->INT_MASK |= EMVSIM_INT_MASK_GPCNT0_IM_MASK;
0865 smartcard_emvsim_CompleteReceiveData(base, context);
0866 }
0867 if (kSMARTCARD_ReceivingState == context->transferState)
0868 {
0869 base->CLKCFG &= ~(EMVSIM_CLKCFG_GPCNT0_CLK_SEL_MASK | EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK);
0870
0871 base->CLKCFG |= EMVSIM_CLKCFG_GPCNT1_CLK_SEL(kEMVSIM_GPCTxClock);
0872
0873 base->INT_MASK = (base->INT_MASK & ~EMVSIM_INT_MASK_GPCNT1_IM_MASK) | EMVSIM_INT_MASK_GPCNT0_IM_MASK;
0874
0875 smartcard_emvsim_CompleteReceiveData(base, context);
0876 }
0877
0878 return;
0879 }
0880
0881 while (((base->RX_STATUS & EMVSIM_RX_STATUS_RX_CNT_MASK) != 0u) && ((context->xSize) > 0u))
0882 {
0883
0884 *context->xBuff = (uint8_t)(base->RX_BUF);
0885 ++context->xBuff;
0886 --context->xSize;
0887 }
0888
0889
0890 if (context->xSize == 0u)
0891 {
0892 smartcard_emvsim_CompleteReceiveData(base, context);
0893 }
0894 else
0895 {
0896
0897
0898 if (context->xSize < context->rxFifoThreshold)
0899 {
0900
0901 uint32_t rx_thd;
0902 rx_thd = (base->RX_THD & ~EMVSIM_RX_THD_RDT_MASK);
0903 rx_thd |= context->xSize;
0904 base->RX_THD = rx_thd;
0905 }
0906 }
0907 }
0908
0909
0910 if (((base->INT_MASK & EMVSIM_INT_MASK_ETC_IM_MASK) == 0u) &&
0911 ((base->TX_STATUS & EMVSIM_TX_STATUS_ETCF_MASK) != 0u))
0912 {
0913 smartcard_emvsim_CompleteSendData(base, context);
0914 }
0915
0916
0917 if (((base->INT_MASK & EMVSIM_INT_MASK_TDT_IM_MASK) == 0u) &&
0918 ((base->TX_STATUS & EMVSIM_TX_STATUS_TDTF_MASK) != 0u))
0919 {
0920 if (context->xSize == 0u)
0921 {
0922 smartcard_emvsim_CompleteSendData(base, context);
0923 }
0924
0925 if (context->xSize == 1u)
0926 {
0927
0928 base->INT_MASK |= EMVSIM_INT_MASK_TDT_IM_MASK;
0929
0930 base->TX_GETU = 0;
0931
0932
0933 base->TX_BUF = *(context->xBuff);
0934 ++context->xBuff;
0935 --context->xSize;
0936
0937
0938
0939 base->TX_STATUS |= EMVSIM_TX_STATUS_ETCF_MASK;
0940 base->INT_MASK &= ~EMVSIM_INT_MASK_ETC_IM_MASK;
0941 }
0942 else
0943 {
0944
0945 size_t getu_tail = (size_t)(base->TX_GETU > 0u);
0946 while (((context->txFifoEntryCount - (uint8_t)((base->TX_STATUS & EMVSIM_TX_STATUS_TX_CNT_MASK) >>
0947 EMVSIM_TX_STATUS_TX_CNT_SHIFT)) > 0u) &&
0948 (context->xSize > getu_tail))
0949 {
0950
0951 base->TX_BUF = *(context->xBuff);
0952 ++context->xBuff;
0953 --context->xSize;
0954 }
0955
0956 if (context->xSize == 0u)
0957 {
0958
0959 base->INT_MASK |= EMVSIM_INT_MASK_TDT_IM_MASK;
0960
0961
0962 base->TX_STATUS |= EMVSIM_TX_STATUS_ETCF_MASK;
0963 base->INT_MASK &= ~EMVSIM_INT_MASK_ETC_IM_MASK;
0964 }
0965 }
0966 }
0967 SDK_ISR_EXIT_BARRIER;
0968 }
0969
0970
0971
0972
0973
0974
0975
0976
0977
0978
0979
0980
0981 status_t SMARTCARD_EMVSIM_Control(EMVSIM_Type *base,
0982 smartcard_context_t *context,
0983 smartcard_control_t control,
0984 uint32_t param)
0985 {
0986 if ((NULL == context))
0987 {
0988 return kStatus_SMARTCARD_InvalidInput;
0989 }
0990
0991 status_t status = kStatus_SMARTCARD_Success;
0992 uint32_t temp32 = 0u;
0993
0994 switch (control)
0995 {
0996 case kSMARTCARD_EnableADT:
0997
0998
0999
1000
1001
1002
1003 break;
1004 case kSMARTCARD_DisableADT:
1005 base->CTRL &= ~EMVSIM_CTRL_RCV_EN_MASK;
1006
1007 base->CLKCFG &= ~EMVSIM_CLKCFG_GPCNT1_CLK_SEL_MASK;
1008 base->TX_STATUS = EMVSIM_TX_STATUS_GPCNT1_TO_MASK;
1009 base->INT_MASK |= EMVSIM_INT_MASK_GPCNT1_IM_MASK;
1010 break;
1011 case kSMARTCARD_EnableGTV:
1012
1013 base->INT_MASK &= ~EMVSIM_INT_MASK_BGT_ERR_IM_MASK;
1014 break;
1015 case kSMARTCARD_DisableGTV:
1016
1017 base->INT_MASK |= EMVSIM_INT_MASK_BGT_ERR_IM_MASK;
1018 break;
1019 case kSMARTCARD_ResetWWT:
1020
1021 base->CTRL &= ~(EMVSIM_CTRL_CWT_EN_MASK | EMVSIM_CTRL_BWT_EN_MASK);
1022 base->CTRL |= (EMVSIM_CTRL_CWT_EN_MASK | EMVSIM_CTRL_BWT_EN_MASK);
1023 break;
1024 case kSMARTCARD_EnableWWT:
1025
1026 base->INT_MASK |= EMVSIM_INT_MASK_BGT_ERR_IM_MASK;
1027
1028 base->INT_MASK &= (~EMVSIM_INT_MASK_CWT_ERR_IM_MASK & ~EMVSIM_INT_MASK_BWT_ERR_IM_MASK);
1029 break;
1030 case kSMARTCARD_DisableWWT:
1031
1032 base->INT_MASK |= (EMVSIM_INT_MASK_CWT_ERR_IM_MASK | EMVSIM_INT_MASK_BWT_ERR_IM_MASK);
1033 break;
1034 case kSMARTCARD_ResetCWT:
1035
1036 base->CTRL &= ~EMVSIM_CTRL_CWT_EN_MASK;
1037 base->CTRL |= EMVSIM_CTRL_CWT_EN_MASK;
1038 break;
1039 case kSMARTCARD_EnableCWT:
1040 base->CTRL |= EMVSIM_CTRL_CWT_EN_MASK;
1041
1042 base->INT_MASK &= ~EMVSIM_INT_MASK_CWT_ERR_IM_MASK;
1043 break;
1044 case kSMARTCARD_DisableCWT:
1045
1046 base->CTRL &= ~EMVSIM_CTRL_CWT_EN_MASK;
1047
1048 base->INT_MASK |= EMVSIM_INT_MASK_CWT_ERR_IM_MASK;
1049 break;
1050 case kSMARTCARD_ResetBWT:
1051
1052 base->CTRL &= ~EMVSIM_CTRL_BWT_EN_MASK;
1053 base->CTRL |= EMVSIM_CTRL_BWT_EN_MASK;
1054 break;
1055 case kSMARTCARD_EnableBWT:
1056 base->CTRL |= EMVSIM_CTRL_BWT_EN_MASK;
1057
1058 base->INT_MASK &= ~EMVSIM_INT_MASK_BWT_ERR_IM_MASK;
1059 break;
1060 case kSMARTCARD_DisableBWT:
1061
1062 base->INT_MASK |= EMVSIM_INT_MASK_BWT_ERR_IM_MASK;
1063 break;
1064 case kSMARTCARD_EnableInitDetect:
1065
1066 base->RX_STATUS = 0xFFFFFFFFu;
1067
1068 context->transferState = kSMARTCARD_WaitingForTSState;
1069
1070 base->CTRL |= EMVSIM_CTRL_ICM_MASK;
1071 base->CTRL |= EMVSIM_CTRL_RCV_EN_MASK;
1072 break;
1073 case kSMARTCARD_EnableAnack:
1074
1075 base->CTRL |= EMVSIM_CTRL_ANACK_MASK;
1076 break;
1077 case kSMARTCARD_DisableAnack:
1078
1079 base->CTRL &= ~EMVSIM_CTRL_ANACK_MASK;
1080 break;
1081 case kSMARTCARD_ConfigureBaudrate:
1082
1083 base->DIVISOR = (((uint32_t)context->cardParams.Fi / context->cardParams.currentD) & 0x1FFu);
1084 break;
1085 case kSMARTCARD_SetupATRMode:
1086
1087 smartcard_emvsim_SetTransferType(base, context, kSMARTCARD_SetupATRMode);
1088 break;
1089 case kSMARTCARD_SetupT0Mode:
1090
1091 smartcard_emvsim_SetTransferType(base, context, kSMARTCARD_SetupT0Mode);
1092 break;
1093 case kSMARTCARD_SetupT1Mode:
1094
1095 smartcard_emvsim_SetTransferType(base, context, kSMARTCARD_SetupT1Mode);
1096 break;
1097 case kSMARTCARD_EnableReceiverMode:
1098
1099 base->CTRL |= EMVSIM_CTRL_RCV_EN_MASK;
1100
1101 base->RX_THD = ((base->RX_THD & ~EMVSIM_RX_THD_RDT_MASK) | 1u);
1102
1103 base->INT_MASK &= ~EMVSIM_INT_MASK_RDT_IM_MASK;
1104 break;
1105 case kSMARTCARD_DisableReceiverMode:
1106
1107 base->CTRL &= ~EMVSIM_CTRL_RCV_EN_MASK;
1108 break;
1109 case kSMARTCARD_EnableTransmitterMode:
1110
1111 base->CTRL |= EMVSIM_CTRL_XMT_EN_MASK;
1112 break;
1113 case kSMARTCARD_DisableTransmitterMode:
1114
1115 base->CTRL &= ~EMVSIM_CTRL_XMT_EN_MASK;
1116 break;
1117 case kSMARTCARD_ResetWaitTimeMultiplier:
1118 base->CTRL &= ~EMVSIM_CTRL_BWT_EN_MASK;
1119
1120
1121 temp32 = ((uint8_t)param) *
1122 (11u + ((((uint32_t)1u << context->cardParams.BWI) + 1u) * 960u * context->cardParams.currentD));
1123 #ifdef CARDSIM_EXTRADELAY_USED
1124 temp32 += context->cardParams.currentD * 50;
1125 #endif
1126 base->BWT_VAL = temp32;
1127
1128 if (param > 1u)
1129 {
1130 context->wtxRequested = true;
1131 }
1132 else
1133 {
1134 context->wtxRequested = false;
1135 }
1136 base->CTRL |= EMVSIM_CTRL_BWT_EN_MASK;
1137 break;
1138 default:
1139 status = kStatus_SMARTCARD_InvalidInput;
1140 break;
1141 }
1142 return status;
1143 }