File indexing completed on 2025-05-11 08:22:59
0001
0002
0003
0004
0005
0006
0007
0008
0009 #include "fsl_flexio_uart.h"
0010
0011
0012
0013
0014
0015
0016 #ifndef FSL_COMPONENT_ID
0017 #define FSL_COMPONENT_ID "platform.drivers.flexio_uart"
0018 #endif
0019
0020
0021 enum _flexio_uart_transfer_states
0022 {
0023 kFLEXIO_UART_TxIdle,
0024 kFLEXIO_UART_TxBusy,
0025 kFLEXIO_UART_RxIdle,
0026 kFLEXIO_UART_RxBusy
0027 };
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039 static size_t FLEXIO_UART_TransferGetRxRingBufferLength(flexio_uart_handle_t *handle);
0040
0041
0042
0043
0044
0045
0046
0047
0048 static bool FLEXIO_UART_TransferIsRxRingBufferFull(flexio_uart_handle_t *handle);
0049
0050
0051
0052
0053
0054 static uint32_t FLEXIO_UART_GetInstance(FLEXIO_UART_Type *base)
0055 {
0056 return FLEXIO_GetInstance(base->flexioBase);
0057 }
0058
0059 static size_t FLEXIO_UART_TransferGetRxRingBufferLength(flexio_uart_handle_t *handle)
0060 {
0061 size_t size;
0062 uint16_t rxRingBufferHead = handle->rxRingBufferHead;
0063 uint16_t rxRingBufferTail = handle->rxRingBufferTail;
0064
0065 if (rxRingBufferTail > rxRingBufferHead)
0066 {
0067 size = (size_t)rxRingBufferHead + handle->rxRingBufferSize - (size_t)rxRingBufferTail;
0068 }
0069 else
0070 {
0071 size = (size_t)rxRingBufferHead - (size_t)rxRingBufferTail;
0072 }
0073
0074 return size;
0075 }
0076
0077 static bool FLEXIO_UART_TransferIsRxRingBufferFull(flexio_uart_handle_t *handle)
0078 {
0079 bool full;
0080
0081 if (FLEXIO_UART_TransferGetRxRingBufferLength(handle) == (handle->rxRingBufferSize - 1U))
0082 {
0083 full = true;
0084 }
0085 else
0086 {
0087 full = false;
0088 }
0089
0090 return full;
0091 }
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120
0121
0122
0123
0124 status_t FLEXIO_UART_Init(FLEXIO_UART_Type *base, const flexio_uart_config_t *userConfig, uint32_t srcClock_Hz)
0125 {
0126 assert((base != NULL) && (userConfig != NULL));
0127
0128 flexio_shifter_config_t shifterConfig;
0129 flexio_timer_config_t timerConfig;
0130 uint32_t ctrlReg = 0;
0131 uint16_t timerDiv = 0;
0132 uint16_t timerCmp = 0;
0133 uint32_t calculatedBaud;
0134 uint32_t diff;
0135 status_t result = kStatus_Success;
0136
0137
0138 (void)memset(&shifterConfig, 0, sizeof(shifterConfig));
0139 (void)memset(&timerConfig, 0, sizeof(timerConfig));
0140
0141 #if !(defined(FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL) && FSL_SDK_DISABLE_DRIVER_CLOCK_CONTROL)
0142
0143 CLOCK_EnableClock(s_flexioClocks[FLEXIO_UART_GetInstance(base)]);
0144 #endif
0145
0146
0147 ctrlReg = base->flexioBase->CTRL;
0148 ctrlReg &= ~(FLEXIO_CTRL_DOZEN_MASK | FLEXIO_CTRL_DBGE_MASK | FLEXIO_CTRL_FASTACC_MASK | FLEXIO_CTRL_FLEXEN_MASK);
0149 ctrlReg |= (FLEXIO_CTRL_DBGE(userConfig->enableInDebug) | FLEXIO_CTRL_FASTACC(userConfig->enableFastAccess) |
0150 FLEXIO_CTRL_FLEXEN(userConfig->enableUart));
0151 if (!userConfig->enableInDoze)
0152 {
0153 ctrlReg |= FLEXIO_CTRL_DOZEN_MASK;
0154 }
0155
0156 base->flexioBase->CTRL = ctrlReg;
0157
0158
0159
0160 shifterConfig.timerSelect = base->timerIndex[0];
0161 shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnPositive;
0162 shifterConfig.pinConfig = kFLEXIO_PinConfigOutput;
0163 shifterConfig.pinSelect = base->TxPinIndex;
0164 shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh;
0165 shifterConfig.shifterMode = kFLEXIO_ShifterModeTransmit;
0166 shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin;
0167 shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh;
0168 shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow;
0169
0170 FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[0], &shifterConfig);
0171
0172
0173 timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_SHIFTnSTAT(base->shifterIndex[0]);
0174 timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveLow;
0175 timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceInternal;
0176 timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled;
0177 timerConfig.pinSelect = base->TxPinIndex;
0178 timerConfig.pinPolarity = kFLEXIO_PinActiveHigh;
0179 timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit;
0180 timerConfig.timerOutput = kFLEXIO_TimerOutputOneNotAffectedByReset;
0181 timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput;
0182 timerConfig.timerReset = kFLEXIO_TimerResetNever;
0183 timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare;
0184 timerConfig.timerEnable = kFLEXIO_TimerEnableOnTriggerHigh;
0185 timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable;
0186 timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled;
0187
0188 timerDiv = (uint16_t)(srcClock_Hz / userConfig->baudRate_Bps);
0189 timerDiv = timerDiv / 2U - 1U;
0190
0191 if (timerDiv > 0xFFU)
0192 {
0193
0194 return kStatus_FLEXIO_UART_BaudrateNotSupport;
0195 }
0196 else
0197 {
0198
0199
0200 calculatedBaud = srcClock_Hz / (((uint32_t)timerDiv + 1U) * 2U);
0201
0202
0203 diff = calculatedBaud - userConfig->baudRate_Bps;
0204 if (diff > ((userConfig->baudRate_Bps / 100U) * 3U))
0205 {
0206 return kStatus_FLEXIO_UART_BaudrateNotSupport;
0207 }
0208 }
0209
0210 timerCmp = ((uint16_t)userConfig->bitCountPerChar * 2U - 1U) << 8U;
0211 timerCmp |= timerDiv;
0212
0213 timerConfig.timerCompare = timerCmp;
0214
0215 FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[0], &timerConfig);
0216
0217
0218 shifterConfig.timerSelect = base->timerIndex[1];
0219 shifterConfig.timerPolarity = kFLEXIO_ShifterTimerPolarityOnNegitive;
0220 shifterConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled;
0221 shifterConfig.pinSelect = base->RxPinIndex;
0222 shifterConfig.pinPolarity = kFLEXIO_PinActiveHigh;
0223 shifterConfig.shifterMode = kFLEXIO_ShifterModeReceive;
0224 shifterConfig.inputSource = kFLEXIO_ShifterInputFromPin;
0225 shifterConfig.shifterStop = kFLEXIO_ShifterStopBitHigh;
0226 shifterConfig.shifterStart = kFLEXIO_ShifterStartBitLow;
0227
0228 FLEXIO_SetShifterConfig(base->flexioBase, base->shifterIndex[1], &shifterConfig);
0229
0230
0231 timerConfig.triggerSelect = FLEXIO_TIMER_TRIGGER_SEL_PININPUT(base->RxPinIndex);
0232 timerConfig.triggerPolarity = kFLEXIO_TimerTriggerPolarityActiveHigh;
0233 timerConfig.triggerSource = kFLEXIO_TimerTriggerSourceExternal;
0234 timerConfig.pinConfig = kFLEXIO_PinConfigOutputDisabled;
0235 timerConfig.pinSelect = base->RxPinIndex;
0236 timerConfig.pinPolarity = kFLEXIO_PinActiveLow;
0237 timerConfig.timerMode = kFLEXIO_TimerModeDual8BitBaudBit;
0238 timerConfig.timerOutput = kFLEXIO_TimerOutputOneAffectedByReset;
0239 timerConfig.timerDecrement = kFLEXIO_TimerDecSrcOnFlexIOClockShiftTimerOutput;
0240 timerConfig.timerReset = kFLEXIO_TimerResetOnTimerPinRisingEdge;
0241 timerConfig.timerDisable = kFLEXIO_TimerDisableOnTimerCompare;
0242 timerConfig.timerEnable = kFLEXIO_TimerEnableOnPinRisingEdge;
0243 timerConfig.timerStop = kFLEXIO_TimerStopBitEnableOnTimerDisable;
0244 timerConfig.timerStart = kFLEXIO_TimerStartBitEnabled;
0245
0246 timerConfig.timerCompare = timerCmp;
0247
0248 FLEXIO_SetTimerConfig(base->flexioBase, base->timerIndex[1], &timerConfig);
0249
0250 return result;
0251 }
0252
0253
0254
0255
0256
0257
0258
0259
0260 void FLEXIO_UART_Deinit(FLEXIO_UART_Type *base)
0261 {
0262 base->flexioBase->SHIFTCFG[base->shifterIndex[0]] = 0;
0263 base->flexioBase->SHIFTCTL[base->shifterIndex[0]] = 0;
0264 base->flexioBase->SHIFTCFG[base->shifterIndex[1]] = 0;
0265 base->flexioBase->SHIFTCTL[base->shifterIndex[1]] = 0;
0266 base->flexioBase->TIMCFG[base->timerIndex[0]] = 0;
0267 base->flexioBase->TIMCMP[base->timerIndex[0]] = 0;
0268 base->flexioBase->TIMCTL[base->timerIndex[0]] = 0;
0269 base->flexioBase->TIMCFG[base->timerIndex[1]] = 0;
0270 base->flexioBase->TIMCMP[base->timerIndex[1]] = 0;
0271 base->flexioBase->TIMCTL[base->timerIndex[1]] = 0;
0272
0273 base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[0]);
0274 base->flexioBase->SHIFTSTAT = (1UL << base->shifterIndex[1]);
0275
0276 base->flexioBase->TIMSTAT = (1UL << base->timerIndex[0]);
0277 base->flexioBase->TIMSTAT = (1UL << base->timerIndex[1]);
0278 }
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290 void FLEXIO_UART_GetDefaultConfig(flexio_uart_config_t *userConfig)
0291 {
0292 assert(userConfig != NULL);
0293
0294
0295 (void)memset(userConfig, 0, sizeof(*userConfig));
0296
0297 userConfig->enableUart = true;
0298 userConfig->enableInDoze = false;
0299 userConfig->enableInDebug = true;
0300 userConfig->enableFastAccess = false;
0301
0302 userConfig->baudRate_Bps = 115200U;
0303
0304 userConfig->bitCountPerChar = kFLEXIO_UART_8BitsPerChar;
0305 }
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315 void FLEXIO_UART_EnableInterrupts(FLEXIO_UART_Type *base, uint32_t mask)
0316 {
0317 if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable) != 0U)
0318 {
0319 FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]);
0320 }
0321 if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable) != 0U)
0322 {
0323 FLEXIO_EnableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]);
0324 }
0325 }
0326
0327
0328
0329
0330
0331
0332
0333
0334
0335 void FLEXIO_UART_DisableInterrupts(FLEXIO_UART_Type *base, uint32_t mask)
0336 {
0337 if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable) != 0U)
0338 {
0339 FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[0]);
0340 }
0341 if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable) != 0U)
0342 {
0343 FLEXIO_DisableShifterStatusInterrupts(base->flexioBase, 1UL << base->shifterIndex[1]);
0344 }
0345 }
0346
0347
0348
0349
0350
0351
0352
0353
0354 uint32_t FLEXIO_UART_GetStatusFlags(FLEXIO_UART_Type *base)
0355 {
0356 uint32_t status = 0U;
0357 status =
0358 ((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0])) >> base->shifterIndex[0]);
0359 status |=
0360 (((FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1]))
0361 << 1U);
0362 status |=
0363 (((FLEXIO_GetShifterErrorFlags(base->flexioBase) & (1UL << base->shifterIndex[1])) >> (base->shifterIndex[1]))
0364 << 2U);
0365 return status;
0366 }
0367
0368
0369
0370
0371
0372
0373
0374
0375
0376
0377
0378
0379 void FLEXIO_UART_ClearStatusFlags(FLEXIO_UART_Type *base, uint32_t mask)
0380 {
0381 if ((mask & (uint32_t)kFLEXIO_UART_TxDataRegEmptyFlag) != 0U)
0382 {
0383 FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[0]);
0384 }
0385 if ((mask & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag) != 0U)
0386 {
0387 FLEXIO_ClearShifterStatusFlags(base->flexioBase, 1UL << base->shifterIndex[1]);
0388 }
0389 if ((mask & (uint32_t)kFLEXIO_UART_RxOverRunFlag) != 0U)
0390 {
0391 FLEXIO_ClearShifterErrorFlags(base->flexioBase, 1UL << base->shifterIndex[1]);
0392 }
0393 }
0394
0395
0396
0397
0398
0399
0400
0401
0402
0403
0404
0405
0406 status_t FLEXIO_UART_WriteBlocking(FLEXIO_UART_Type *base, const uint8_t *txData, size_t txSize)
0407 {
0408 assert(txData != NULL);
0409 assert(txSize != 0U);
0410 #if UART_RETRY_TIMES
0411 uint32_t waitTimes;
0412 #endif
0413
0414 while (0U != txSize--)
0415 {
0416
0417 #if UART_RETRY_TIMES
0418 waitTimes = UART_RETRY_TIMES;
0419 while ((0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0]))) &&
0420 (0U != --waitTimes))
0421 #else
0422 while (0U == (FLEXIO_GetShifterStatusFlags(base->flexioBase) & (1UL << base->shifterIndex[0])))
0423 #endif
0424 {
0425 }
0426 #if UART_RETRY_TIMES
0427 if (0U == waitTimes)
0428 {
0429 return kStatus_FLEXIO_UART_Timeout;
0430 }
0431 #endif
0432
0433 base->flexioBase->SHIFTBUF[base->shifterIndex[0]] = *txData++;
0434 }
0435 return kStatus_Success;
0436 }
0437
0438
0439
0440
0441
0442
0443
0444
0445
0446
0447
0448
0449 status_t FLEXIO_UART_ReadBlocking(FLEXIO_UART_Type *base, uint8_t *rxData, size_t rxSize)
0450 {
0451 assert(rxData != NULL);
0452 assert(rxSize != 0U);
0453 #if UART_RETRY_TIMES
0454 uint32_t waitTimes;
0455 #endif
0456
0457 while (0U != rxSize--)
0458 {
0459
0460 #if UART_RETRY_TIMES
0461 waitTimes = UART_RETRY_TIMES;
0462 while ((0U == (FLEXIO_UART_GetStatusFlags(base) & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag)) &&
0463 (0U != --waitTimes))
0464 #else
0465 while (0U == (FLEXIO_UART_GetStatusFlags(base) & (uint32_t)kFLEXIO_UART_RxDataRegFullFlag))
0466 #endif
0467 {
0468 }
0469 #if UART_RETRY_TIMES
0470 if (0U == waitTimes)
0471 {
0472 return kStatus_FLEXIO_UART_Timeout;
0473 }
0474 #endif
0475
0476 *rxData++ = (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]);
0477 }
0478 return kStatus_Success;
0479 }
0480
0481
0482
0483
0484
0485
0486
0487
0488
0489
0490
0491
0492
0493
0494
0495
0496
0497
0498
0499
0500
0501 status_t FLEXIO_UART_TransferCreateHandle(FLEXIO_UART_Type *base,
0502 flexio_uart_handle_t *handle,
0503 flexio_uart_transfer_callback_t callback,
0504 void *userData)
0505 {
0506 assert(handle != NULL);
0507
0508 IRQn_Type flexio_irqs[] = FLEXIO_IRQS;
0509
0510
0511 (void)memset(handle, 0, sizeof(*handle));
0512
0513
0514 handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle;
0515 handle->txState = (uint8_t)kFLEXIO_UART_TxIdle;
0516
0517
0518 handle->callback = callback;
0519 handle->userData = userData;
0520
0521
0522 NVIC_ClearPendingIRQ(flexio_irqs[FLEXIO_UART_GetInstance(base)]);
0523
0524 (void)EnableIRQ(flexio_irqs[FLEXIO_UART_GetInstance(base)]);
0525
0526
0527 return FLEXIO_RegisterHandleIRQ(base, handle, FLEXIO_UART_TransferHandleIRQ);
0528 }
0529
0530
0531
0532
0533
0534
0535
0536
0537
0538
0539
0540
0541
0542
0543
0544
0545
0546
0547 void FLEXIO_UART_TransferStartRingBuffer(FLEXIO_UART_Type *base,
0548 flexio_uart_handle_t *handle,
0549 uint8_t *ringBuffer,
0550 size_t ringBufferSize)
0551 {
0552 assert(handle != NULL);
0553
0554
0555 if (ringBuffer != NULL)
0556 {
0557 handle->rxRingBuffer = ringBuffer;
0558 handle->rxRingBufferSize = ringBufferSize;
0559 handle->rxRingBufferHead = 0U;
0560 handle->rxRingBufferTail = 0U;
0561
0562
0563 FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0564 }
0565 }
0566
0567
0568
0569
0570
0571
0572
0573
0574
0575 void FLEXIO_UART_TransferStopRingBuffer(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle)
0576 {
0577 assert(handle != NULL);
0578
0579 if (handle->rxState == (uint8_t)kFLEXIO_UART_RxIdle)
0580 {
0581 FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0582 }
0583
0584 handle->rxRingBuffer = NULL;
0585 handle->rxRingBufferSize = 0U;
0586 handle->rxRingBufferHead = 0U;
0587 handle->rxRingBufferTail = 0U;
0588 }
0589
0590
0591
0592
0593
0594
0595
0596
0597
0598
0599
0600
0601
0602
0603
0604
0605
0606
0607 status_t FLEXIO_UART_TransferSendNonBlocking(FLEXIO_UART_Type *base,
0608 flexio_uart_handle_t *handle,
0609 flexio_uart_transfer_t *xfer)
0610 {
0611 status_t status;
0612
0613
0614 if ((0U == xfer->dataSize) || (NULL == xfer->txData))
0615 {
0616 return kStatus_InvalidArgument;
0617 }
0618
0619
0620 if ((uint8_t)kFLEXIO_UART_TxBusy == handle->txState)
0621 {
0622 status = kStatus_FLEXIO_UART_TxBusy;
0623 }
0624 else
0625 {
0626 handle->txData = xfer->txData;
0627 handle->txDataSize = xfer->dataSize;
0628 handle->txDataSizeAll = xfer->dataSize;
0629 handle->txState = (uint8_t)kFLEXIO_UART_TxBusy;
0630
0631
0632 FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable);
0633
0634 status = kStatus_Success;
0635 }
0636
0637 return status;
0638 }
0639
0640
0641
0642
0643
0644
0645
0646
0647
0648
0649 void FLEXIO_UART_TransferAbortSend(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle)
0650 {
0651
0652 FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable);
0653
0654 handle->txDataSize = 0U;
0655 handle->txState = (uint8_t)kFLEXIO_UART_TxIdle;
0656 }
0657
0658
0659
0660
0661
0662
0663
0664
0665
0666
0667
0668
0669 status_t FLEXIO_UART_TransferGetSendCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count)
0670 {
0671 assert(handle != NULL);
0672 assert(count != NULL);
0673
0674 if ((uint8_t)kFLEXIO_UART_TxIdle == handle->txState)
0675 {
0676 return kStatus_NoTransferInProgress;
0677 }
0678
0679 *count = handle->txDataSizeAll - handle->txDataSize;
0680
0681 return kStatus_Success;
0682 }
0683
0684
0685
0686
0687
0688
0689
0690
0691
0692
0693
0694
0695
0696
0697
0698
0699
0700
0701
0702
0703
0704
0705
0706
0707
0708
0709 status_t FLEXIO_UART_TransferReceiveNonBlocking(FLEXIO_UART_Type *base,
0710 flexio_uart_handle_t *handle,
0711 flexio_uart_transfer_t *xfer,
0712 size_t *receivedBytes)
0713 {
0714 uint32_t i;
0715 status_t status;
0716
0717 size_t bytesToCopy = 0U;
0718
0719 size_t bytesToReceive;
0720
0721 size_t bytesCurrentReceived;
0722
0723
0724 if ((0U == xfer->dataSize) || (NULL == xfer->rxData))
0725 {
0726 return kStatus_InvalidArgument;
0727 }
0728
0729
0730
0731
0732
0733
0734
0735
0736
0737
0738
0739 if ((uint8_t)kFLEXIO_UART_RxBusy == handle->rxState)
0740 {
0741 status = kStatus_FLEXIO_UART_RxBusy;
0742 }
0743 else
0744 {
0745 bytesToReceive = xfer->dataSize;
0746 bytesCurrentReceived = 0U;
0747
0748
0749 if (handle->rxRingBuffer != NULL)
0750 {
0751
0752 FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0753
0754
0755 bytesToCopy = FLEXIO_UART_TransferGetRxRingBufferLength(handle);
0756
0757 if (bytesToCopy != 0U)
0758 {
0759 bytesToCopy = MIN(bytesToReceive, bytesToCopy);
0760
0761 bytesToReceive -= bytesToCopy;
0762
0763
0764 for (i = 0U; i < bytesToCopy; i++)
0765 {
0766 xfer->rxData[bytesCurrentReceived++] = handle->rxRingBuffer[handle->rxRingBufferTail];
0767
0768
0769 if ((uint32_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)
0770 {
0771 handle->rxRingBufferTail = 0U;
0772 }
0773 else
0774 {
0775 handle->rxRingBufferTail++;
0776 }
0777 }
0778 }
0779
0780
0781 if (bytesToReceive != 0U)
0782 {
0783
0784 handle->rxData = xfer->rxData + bytesCurrentReceived;
0785 handle->rxDataSize = bytesToReceive;
0786 handle->rxDataSizeAll = xfer->dataSize;
0787 handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy;
0788 }
0789
0790
0791 FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0792
0793
0794 if (0U == bytesToReceive)
0795 {
0796 if (handle->callback != NULL)
0797 {
0798 handle->callback(base, handle, kStatus_FLEXIO_UART_RxIdle, handle->userData);
0799 }
0800 }
0801 }
0802
0803 else
0804 {
0805 handle->rxData = xfer->rxData + bytesCurrentReceived;
0806 handle->rxDataSize = bytesToReceive;
0807 handle->rxDataSizeAll = bytesToReceive;
0808 handle->rxState = (uint8_t)kFLEXIO_UART_RxBusy;
0809
0810
0811 FLEXIO_UART_EnableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0812 }
0813
0814
0815 if (receivedBytes != NULL)
0816 {
0817 *receivedBytes = bytesCurrentReceived;
0818 }
0819
0820 status = kStatus_Success;
0821 }
0822
0823 return status;
0824 }
0825
0826
0827
0828
0829
0830
0831
0832
0833
0834 void FLEXIO_UART_TransferAbortReceive(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle)
0835 {
0836
0837 if (NULL == handle->rxRingBuffer)
0838 {
0839
0840 FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0841 }
0842
0843 handle->rxDataSize = 0U;
0844 handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle;
0845 }
0846
0847
0848
0849
0850
0851
0852
0853
0854
0855
0856
0857
0858 status_t FLEXIO_UART_TransferGetReceiveCount(FLEXIO_UART_Type *base, flexio_uart_handle_t *handle, size_t *count)
0859 {
0860 assert(handle != NULL);
0861 assert(count != NULL);
0862
0863 if ((uint8_t)kFLEXIO_UART_RxIdle == handle->rxState)
0864 {
0865 return kStatus_NoTransferInProgress;
0866 }
0867
0868 *count = handle->rxDataSizeAll - handle->rxDataSize;
0869
0870 return kStatus_Success;
0871 }
0872
0873
0874
0875
0876
0877
0878
0879
0880
0881 void FLEXIO_UART_TransferHandleIRQ(void *uartType, void *uartHandle)
0882 {
0883 uint8_t count = 1;
0884 FLEXIO_UART_Type *base = (FLEXIO_UART_Type *)uartType;
0885 flexio_uart_handle_t *handle = (flexio_uart_handle_t *)uartHandle;
0886 uint16_t rxRingBufferHead;
0887
0888
0889 uint32_t status = FLEXIO_UART_GetStatusFlags(base);
0890
0891
0892 if (((uint32_t)kFLEXIO_UART_RxOverRunFlag & status) != 0U)
0893 {
0894
0895 FLEXIO_UART_ClearStatusFlags(base, (uint32_t)kFLEXIO_UART_RxOverRunFlag);
0896
0897
0898 if (handle->callback != NULL)
0899 {
0900 handle->callback(base, handle, kStatus_FLEXIO_UART_RxHardwareOverrun, handle->userData);
0901 }
0902 }
0903
0904
0905 if ((((uint32_t)kFLEXIO_UART_RxDataRegFullFlag & status) != 0U) &&
0906 ((base->flexioBase->SHIFTSIEN & (1UL << base->shifterIndex[1])) != 0U))
0907 {
0908
0909 if (handle->rxDataSize != 0U)
0910 {
0911
0912 FLEXIO_UART_ReadByte(base, handle->rxData);
0913 handle->rxDataSize--;
0914 handle->rxData++;
0915 count--;
0916
0917
0918 if (0U == handle->rxDataSize)
0919 {
0920 handle->rxState = (uint8_t)kFLEXIO_UART_RxIdle;
0921
0922 if (handle->callback != NULL)
0923 {
0924 handle->callback(base, handle, kStatus_FLEXIO_UART_RxIdle, handle->userData);
0925 }
0926 }
0927 }
0928
0929 if (handle->rxRingBuffer != NULL)
0930 {
0931 if (count != 0U)
0932 {
0933
0934 if (FLEXIO_UART_TransferIsRxRingBufferFull(handle))
0935 {
0936 if (handle->callback != NULL)
0937 {
0938 handle->callback(base, handle, kStatus_FLEXIO_UART_RxRingBufferOverrun, handle->userData);
0939 }
0940 }
0941
0942
0943 if (FLEXIO_UART_TransferIsRxRingBufferFull(handle))
0944 {
0945
0946 if ((uint32_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)
0947 {
0948 handle->rxRingBufferTail = 0U;
0949 }
0950 else
0951 {
0952 handle->rxRingBufferTail++;
0953 }
0954 }
0955
0956
0957 rxRingBufferHead = handle->rxRingBufferHead;
0958 handle->rxRingBuffer[rxRingBufferHead] =
0959 (uint8_t)(base->flexioBase->SHIFTBUFBYS[base->shifterIndex[1]]);
0960
0961
0962 if ((uint32_t)handle->rxRingBufferHead + 1U == handle->rxRingBufferSize)
0963 {
0964 handle->rxRingBufferHead = 0U;
0965 }
0966 else
0967 {
0968 handle->rxRingBufferHead++;
0969 }
0970 }
0971 }
0972
0973 else if (0U == handle->rxDataSize)
0974 {
0975 FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_RxDataRegFullInterruptEnable);
0976 }
0977 else
0978 {
0979 }
0980 }
0981
0982
0983 if ((((uint32_t)kFLEXIO_UART_TxDataRegEmptyFlag & status) != 0U) &&
0984 ((base->flexioBase->SHIFTSIEN & (1UL << base->shifterIndex[0])) != 0U))
0985 {
0986 if (handle->txDataSize != 0U)
0987 {
0988
0989 FLEXIO_UART_WriteByte(base, handle->txData);
0990 handle->txData++;
0991 handle->txDataSize--;
0992
0993
0994 if (0U == handle->txDataSize)
0995 {
0996 handle->txState = (uint8_t)kFLEXIO_UART_TxIdle;
0997
0998
0999 FLEXIO_UART_DisableInterrupts(base, (uint32_t)kFLEXIO_UART_TxDataRegEmptyInterruptEnable);
1000
1001
1002 if (handle->callback != NULL)
1003 {
1004 handle->callback(base, handle, kStatus_FLEXIO_UART_TxIdle, handle->userData);
1005 }
1006 }
1007 }
1008 }
1009 }