]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso/NXP_Code/drivers/fsl_usart.c
commit 9f316c246baafa15c542a5aea81a94f26e3d6507
[freertos] / FreeRTOS / Demo / CORTEX_MPU_M33F_NXP_LPC55S69_MCUXpresso / NXP_Code / drivers / fsl_usart.c
index c52abed4328801d186ff9632782303256e1e10bc..dd35da6b49c7584c80bd6b1b8be707cccfa23ba3 100644 (file)
@@ -1,6 +1,6 @@
 /*\r
  * Copyright (c) 2016, Freescale Semiconductor, Inc.\r
- * Copyright 2016-2018 NXP\r
+ * Copyright 2016-2019 NXP\r
  * All rights reserved.\r
  *\r
  * SPDX-License-Identifier: BSD-3-Clause\r
 #include "fsl_device_registers.h"\r
 #include "fsl_flexcomm.h"\r
 \r
+/*******************************************************************************\r
+ * Definitions\r
+ ******************************************************************************/\r
+\r
 /* Component ID definition, used by tools. */\r
 #ifndef FSL_COMPONENT_ID\r
 #define FSL_COMPONENT_ID "platform.drivers.flexcomm_usart"\r
 #endif\r
 \r
-enum _usart_transfer_states\r
+/*!\r
+ * @brief Used for conversion from `flexcomm_usart_irq_handler_t` to `flexcomm_irq_handler_t`\r
+ */\r
+typedef union usart_to_flexcomm\r
+{\r
+    flexcomm_usart_irq_handler_t usart_master_handler;\r
+    flexcomm_irq_handler_t flexcomm_handler;\r
+} usart_to_flexcomm_t;\r
+\r
+enum\r
 {\r
     kUSART_TxIdle, /* TX idle. */\r
     kUSART_TxBusy, /* TX busy. */\r
@@ -41,18 +54,18 @@ static const uint32_t s_usartBaseAddrs[FSL_FEATURE_SOC_USART_COUNT] = USART_BASE
 /*! brief Returns instance number for USART peripheral base address. */\r
 uint32_t USART_GetInstance(USART_Type *base)\r
 {\r
-    int i;\r
+    uint32_t i;\r
 \r
-    for (i = 0; i < FSL_FEATURE_SOC_USART_COUNT; i++)\r
+    for (i = 0; i < (uint32_t)FSL_FEATURE_SOC_USART_COUNT; i++)\r
     {\r
         if ((uint32_t)base == s_usartBaseAddrs[i])\r
         {\r
-            return i;\r
+            break;\r
         }\r
     }\r
 \r
-    assert(false);\r
-    return 0;\r
+    assert(i < FSL_FEATURE_SOC_USART_COUNT);\r
+    return i;\r
 }\r
 \r
 /*!\r
@@ -67,14 +80,16 @@ size_t USART_TransferGetRxRingBufferLength(usart_handle_t *handle)
 \r
     /* Check arguments */\r
     assert(NULL != handle);\r
+    uint16_t rxRingBufferHead = handle->rxRingBufferHead;\r
+    uint16_t rxRingBufferTail = handle->rxRingBufferTail;\r
 \r
-    if (handle->rxRingBufferTail > handle->rxRingBufferHead)\r
+    if (rxRingBufferTail > rxRingBufferHead)\r
     {\r
-        size = (size_t)(handle->rxRingBufferHead + handle->rxRingBufferSize - handle->rxRingBufferTail);\r
+        size = (size_t)rxRingBufferHead + handle->rxRingBufferSize - (size_t)rxRingBufferTail;\r
     }\r
     else\r
     {\r
-        size = (size_t)(handle->rxRingBufferHead - handle->rxRingBufferTail);\r
+        size = (size_t)rxRingBufferHead - (size_t)rxRingBufferTail;\r
     }\r
     return size;\r
 }\r
@@ -122,7 +137,7 @@ void USART_TransferStartRingBuffer(USART_Type *base, usart_handle_t *handle, uin
     assert(NULL != ringBuffer);\r
 \r
     /* Setup the ringbuffer address */\r
-    handle->rxRingBuffer = ringBuffer;\r
+    handle->rxRingBuffer     = ringBuffer;\r
     handle->rxRingBufferSize = ringBufferSize;\r
     handle->rxRingBufferHead = 0U;\r
     handle->rxRingBufferTail = 0U;\r
@@ -144,11 +159,11 @@ void USART_TransferStopRingBuffer(USART_Type *base, usart_handle_t *handle)
     assert(NULL != base);\r
     assert(NULL != handle);\r
 \r
-    if (handle->rxState == kUSART_RxIdle)\r
+    if (handle->rxState == (uint8_t)kUSART_RxIdle)\r
     {\r
         base->FIFOINTENCLR = USART_FIFOINTENCLR_RXLVL_MASK | USART_FIFOINTENCLR_RXERR_MASK;\r
     }\r
-    handle->rxRingBuffer = NULL;\r
+    handle->rxRingBuffer     = NULL;\r
     handle->rxRingBufferSize = 0U;\r
     handle->rxRingBufferHead = 0U;\r
     handle->rxRingBufferTail = 0U;\r
@@ -180,8 +195,8 @@ status_t USART_Init(USART_Type *base, const usart_config_t *config, uint32_t src
     int result;\r
 \r
     /* check arguments */\r
-    assert(!((NULL == base) || (NULL == config) || (0 == srcClock_Hz)));\r
-    if ((NULL == base) || (NULL == config) || (0 == srcClock_Hz))\r
+    assert(!((NULL == base) || (NULL == config) || (0U == srcClock_Hz)));\r
+    if ((NULL == base) || (NULL == config) || (0U == srcClock_Hz))\r
     {\r
         return kStatus_InvalidArgument;\r
     }\r
@@ -193,13 +208,6 @@ status_t USART_Init(USART_Type *base, const usart_config_t *config, uint32_t src
         return result;\r
     }\r
 \r
-    /* setup baudrate */\r
-    result = USART_SetBaudRate(base, config->baudRate_Bps, srcClock_Hz);\r
-    if (kStatus_Success != result)\r
-    {\r
-        return result;\r
-    }\r
-\r
     if (config->enableTx)\r
     {\r
         /* empty and enable txFIFO */\r
@@ -223,7 +231,19 @@ status_t USART_Init(USART_Type *base, const usart_config_t *config, uint32_t src
     }\r
     /* setup configuration and enable USART */\r
     base->CFG = USART_CFG_PARITYSEL(config->parityMode) | USART_CFG_STOPLEN(config->stopBitCount) |\r
-                USART_CFG_DATALEN(config->bitCountPerChar) | USART_CFG_LOOP(config->loopback) | USART_CFG_ENABLE_MASK;\r
+                USART_CFG_DATALEN(config->bitCountPerChar) | USART_CFG_LOOP(config->loopback) |\r
+                USART_CFG_SYNCEN((uint32_t)config->syncMode >> 1) | USART_CFG_SYNCMST((uint8_t)config->syncMode) |\r
+                USART_CFG_CLKPOL(config->clockPolarity) | USART_CFG_ENABLE_MASK;\r
+\r
+    /* Setup baudrate */\r
+    result = USART_SetBaudRate(base, config->baudRate_Bps, srcClock_Hz);\r
+    if (kStatus_Success != result)\r
+    {\r
+        return result;\r
+    }\r
+    /* Setting continuous Clock configuration. used for synchronous mode. */\r
+    USART_EnableContinuousSCLK(base, config->enableContinuousSCLK);\r
+\r
     return kStatus_Success;\r
 }\r
 \r
@@ -238,7 +258,7 @@ void USART_Deinit(USART_Type *base)
 {\r
     /* Check arguments */\r
     assert(NULL != base);\r
-    while (!(base->STAT & USART_STAT_TXIDLE_MASK))\r
+    while (0U == (base->STAT & USART_STAT_TXIDLE_MASK))\r
     {\r
     }\r
     /* Disable interrupts, disable dma requests, disable peripheral */\r
@@ -269,18 +289,21 @@ void USART_GetDefaultConfig(usart_config_t *config)
     assert(NULL != config);\r
 \r
     /* Initializes the configure structure to zero. */\r
-    memset(config, 0, sizeof(*config));\r
+    (void)memset(config, 0, sizeof(*config));\r
 \r
     /* Set always all members ! */\r
-    config->baudRate_Bps = 115200U;\r
-    config->parityMode = kUSART_ParityDisabled;\r
-    config->stopBitCount = kUSART_OneStopBit;\r
-    config->bitCountPerChar = kUSART_8BitsPerChar;\r
-    config->loopback = false;\r
-    config->enableRx = false;\r
-    config->enableTx = false;\r
-    config->txWatermark = kUSART_TxFifo0;\r
-    config->rxWatermark = kUSART_RxFifo1;\r
+    config->baudRate_Bps         = 115200U;\r
+    config->parityMode           = kUSART_ParityDisabled;\r
+    config->stopBitCount         = kUSART_OneStopBit;\r
+    config->bitCountPerChar      = kUSART_8BitsPerChar;\r
+    config->loopback             = false;\r
+    config->enableRx             = false;\r
+    config->enableTx             = false;\r
+    config->txWatermark          = kUSART_TxFifo0;\r
+    config->rxWatermark          = kUSART_RxFifo1;\r
+    config->syncMode             = kUSART_SyncModeDisabled;\r
+    config->enableContinuousSCLK = false;\r
+    config->clockPolarity        = kUSART_RxSampleOnFallingEdge;\r
 }\r
 \r
 /*!\r
@@ -294,7 +317,7 @@ void USART_GetDefaultConfig(usart_config_t *config)
  *\r
  * param base USART peripheral base address.\r
  * param baudrate_Bps USART baudrate to be set.\r
- * param srcClock_Hz USART clock source freqency in HZ.\r
+ * param srcClock_Hz USART clock source frequency in HZ.\r
  * retval kStatus_USART_BaudrateNotSupport Baudrate is not support in current clock source.\r
  * retval kStatus_Success Set baudrate succeed.\r
  * retval kStatus_InvalidArgument One or more arguments are invalid.\r
@@ -306,40 +329,53 @@ status_t USART_SetBaudRate(USART_Type *base, uint32_t baudrate_Bps, uint32_t src
 \r
     /* check arguments */\r
     assert(!((NULL == base) || (0 == baudrate_Bps) || (0 == srcClock_Hz)));\r
-    if ((NULL == base) || (0 == baudrate_Bps) || (0 == srcClock_Hz))\r
+    if ((NULL == base) || (0U == baudrate_Bps) || (0U == srcClock_Hz))\r
     {\r
         return kStatus_InvalidArgument;\r
     }\r
 \r
-    /*\r
-     * Smaller values of OSR can make the sampling position within a data bit less accurate and may\r
-     * potentially cause more noise errors or incorrect data.\r
-     */\r
-    for (osrval = best_osrval; osrval >= 8; osrval--)\r
+    /* If synchronous master mode is enabled, only configure the BRG value. */\r
+    if ((base->CFG & USART_CFG_SYNCEN_MASK) != 0U)\r
     {\r
-        brgval = (srcClock_Hz / ((osrval + 1) * baudrate_Bps)) - 1;\r
-        if (brgval > 0xFFFF)\r
+        if ((base->CFG & USART_CFG_SYNCMST_MASK) != 0U)\r
         {\r
-            continue;\r
+            brgval    = srcClock_Hz / baudrate_Bps;\r
+            base->BRG = brgval - 1U;\r
         }\r
-        baudrate = srcClock_Hz / ((osrval + 1) * (brgval + 1));\r
-        diff = baudrate_Bps < baudrate ? baudrate - baudrate_Bps : baudrate_Bps - baudrate;\r
-        if (diff < best_diff)\r
+    }\r
+    else\r
+    {\r
+        /*\r
+         * Smaller values of OSR can make the sampling position within a data bit less accurate and may\r
+         * potentially cause more noise errors or incorrect data.\r
+         */\r
+        for (osrval = best_osrval; osrval >= 8U; osrval--)\r
         {\r
-            best_diff = diff;\r
-            best_osrval = osrval;\r
-            best_brgval = brgval;\r
+            brgval = (((srcClock_Hz * 10U) / ((osrval + 1U) * baudrate_Bps)) - 5U) / 10U;\r
+            if (brgval > 0xFFFFU)\r
+            {\r
+                continue;\r
+            }\r
+            baudrate = srcClock_Hz / ((osrval + 1U) * (brgval + 1U));\r
+            diff     = baudrate_Bps < baudrate ? baudrate - baudrate_Bps : baudrate_Bps - baudrate;\r
+            if (diff < best_diff)\r
+            {\r
+                best_diff   = diff;\r
+                best_osrval = osrval;\r
+                best_brgval = brgval;\r
+            }\r
         }\r
-    }\r
 \r
-    /* value over range */\r
-    if (best_brgval > 0xFFFF)\r
-    {\r
-        return kStatus_USART_BaudrateNotSupport;\r
+        /* value over range */\r
+        if (best_brgval > 0xFFFFU)\r
+        {\r
+            return kStatus_USART_BaudrateNotSupport;\r
+        }\r
+\r
+        base->OSR = best_osrval;\r
+        base->BRG = best_brgval;\r
     }\r
 \r
-    base->OSR = best_osrval;\r
-    base->BRG = best_brgval;\r
     return kStatus_Success;\r
 }\r
 \r
@@ -362,21 +398,21 @@ void USART_WriteBlocking(USART_Type *base, const uint8_t *data, size_t length)
         return;\r
     }\r
     /* Check whether txFIFO is enabled */\r
-    if (!(base->FIFOCFG & USART_FIFOCFG_ENABLETX_MASK))\r
+    if (0U == (base->FIFOCFG & USART_FIFOCFG_ENABLETX_MASK))\r
     {\r
         return;\r
     }\r
-    for (; length > 0; length--)\r
+    for (; length > 0U; length--)\r
     {\r
         /* Loop until txFIFO get some space for new data */\r
-        while (!(base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK))\r
+        while (0U == (base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK))\r
         {\r
         }\r
         base->FIFOWR = *data;\r
         data++;\r
     }\r
     /* Wait to finish transfer */\r
-    while (!(base->STAT & USART_STAT_TXIDLE_MASK))\r
+    while (0U == (base->STAT & USART_STAT_TXIDLE_MASK))\r
     {\r
     }\r
 }\r
@@ -398,7 +434,8 @@ void USART_WriteBlocking(USART_Type *base, const uint8_t *data, size_t length)
  */\r
 status_t USART_ReadBlocking(USART_Type *base, uint8_t *data, size_t length)\r
 {\r
-    uint32_t status;\r
+    uint32_t statusFlag;\r
+    status_t status = kStatus_Success;\r
 \r
     /* check arguments */\r
     assert(!((NULL == base) || (NULL == data)));\r
@@ -408,45 +445,52 @@ status_t USART_ReadBlocking(USART_Type *base, uint8_t *data, size_t length)
     }\r
 \r
     /* Check whether rxFIFO is enabled */\r
-    if (!(base->FIFOCFG & USART_FIFOCFG_ENABLERX_MASK))\r
+    if ((base->FIFOCFG & USART_FIFOCFG_ENABLERX_MASK) == 0U)\r
     {\r
         return kStatus_Fail;\r
     }\r
-    for (; length > 0; length--)\r
+    for (; length > 0U; length--)\r
     {\r
         /* loop until rxFIFO have some data to read */\r
-        while (!(base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK))\r
+        while ((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) == 0U)\r
         {\r
         }\r
-        /* check receive status */\r
-        status = base->STAT;\r
-        if (status & USART_STAT_FRAMERRINT_MASK)\r
+        /* check rxFIFO statusFlag */\r
+        if ((base->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK) != 0U)\r
         {\r
-            base->STAT |= USART_STAT_FRAMERRINT_MASK;\r
-            return kStatus_USART_FramingError;\r
+            base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r
+            base->FIFOSTAT |= USART_FIFOSTAT_RXERR_MASK;\r
+            status = kStatus_USART_RxError;\r
+            break;\r
         }\r
-        if (status & USART_STAT_PARITYERRINT_MASK)\r
+        /* check receive statusFlag */\r
+        statusFlag = base->STAT;\r
+        /* Clear all status flags */\r
+        base->STAT |= statusFlag;\r
+        if ((statusFlag & USART_STAT_PARITYERRINT_MASK) != 0U)\r
         {\r
-            base->STAT |= USART_STAT_PARITYERRINT_MASK;\r
-            return kStatus_USART_ParityError;\r
+            status = kStatus_USART_ParityError;\r
         }\r
-        if (status & USART_STAT_RXNOISEINT_MASK)\r
+        if ((statusFlag & USART_STAT_FRAMERRINT_MASK) != 0U)\r
         {\r
-            base->STAT |= USART_STAT_RXNOISEINT_MASK;\r
-            return kStatus_USART_NoiseError;\r
+            status = kStatus_USART_FramingError;\r
         }\r
-        /* check rxFIFO status */\r
-        if (base->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK)\r
+        if ((statusFlag & USART_STAT_RXNOISEINT_MASK) != 0U)\r
         {\r
-            base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r
-            base->FIFOSTAT |= USART_FIFOSTAT_RXERR_MASK;\r
-            return kStatus_USART_RxError;\r
+            status = kStatus_USART_NoiseError;\r
         }\r
 \r
-        *data = base->FIFORD;\r
-        data++;\r
+        if (kStatus_Success == status)\r
+        {\r
+            *data = (uint8_t)base->FIFORD;\r
+            data++;\r
+        }\r
+        else\r
+        {\r
+            break;\r
+        }\r
     }\r
-    return kStatus_Success;\r
+    return status;\r
 }\r
 \r
 /*!\r
@@ -466,10 +510,13 @@ status_t USART_TransferCreateHandle(USART_Type *base,
                                     usart_transfer_callback_t callback,\r
                                     void *userData)\r
 {\r
-    int32_t instance = 0;\r
-\r
     /* Check 'base' */\r
     assert(!((NULL == base) || (NULL == handle)));\r
+\r
+    uint32_t instance = 0;\r
+    usart_to_flexcomm_t handler;\r
+    handler.usart_master_handler = USART_TransferHandleIRQ;\r
+\r
     if ((NULL == base) || (NULL == handle))\r
     {\r
         return kStatus_InvalidArgument;\r
@@ -477,20 +524,20 @@ status_t USART_TransferCreateHandle(USART_Type *base,
 \r
     instance = USART_GetInstance(base);\r
 \r
-    memset(handle, 0, sizeof(*handle));\r
+    (void)memset(handle, 0, sizeof(*handle));\r
     /* Set the TX/RX state. */\r
-    handle->rxState = kUSART_RxIdle;\r
-    handle->txState = kUSART_TxIdle;\r
+    handle->rxState = (uint8_t)kUSART_RxIdle;\r
+    handle->txState = (uint8_t)kUSART_TxIdle;\r
     /* Set the callback and user data. */\r
-    handle->callback = callback;\r
-    handle->userData = userData;\r
-    handle->rxWatermark = (usart_rxfifo_watermark_t)USART_FIFOTRIG_RXLVL_GET(base);\r
-    handle->txWatermark = (usart_txfifo_watermark_t)USART_FIFOTRIG_TXLVL_GET(base);\r
+    handle->callback    = callback;\r
+    handle->userData    = userData;\r
+    handle->rxWatermark = (uint8_t)USART_FIFOTRIG_RXLVL_GET(base);\r
+    handle->txWatermark = (uint8_t)USART_FIFOTRIG_TXLVL_GET(base);\r
 \r
-    FLEXCOMM_SetIRQHandler(base, (flexcomm_irq_handler_t)USART_TransferHandleIRQ, handle);\r
+    FLEXCOMM_SetIRQHandler(base, handler.flexcomm_handler, handle);\r
 \r
     /* Enable interrupt in NVIC. */\r
-    EnableIRQ(s_usartIRQ[instance]);\r
+    (void)EnableIRQ(s_usartIRQ[instance]);\r
 \r
     return kStatus_Success;\r
 }\r
@@ -524,22 +571,22 @@ status_t USART_TransferSendNonBlocking(USART_Type *base, usart_handle_t *handle,
     }\r
     /* Check xfer members */\r
     assert(!((0 == xfer->dataSize) || (NULL == xfer->data)));\r
-    if ((0 == xfer->dataSize) || (NULL == xfer->data))\r
+    if ((0U == xfer->dataSize) || (NULL == xfer->data))\r
     {\r
         return kStatus_InvalidArgument;\r
     }\r
 \r
     /* Return error if current TX busy. */\r
-    if (kUSART_TxBusy == handle->txState)\r
+    if ((uint8_t)kUSART_TxBusy == handle->txState)\r
     {\r
         return kStatus_USART_TxBusy;\r
     }\r
     else\r
     {\r
-        handle->txData = xfer->data;\r
-        handle->txDataSize = xfer->dataSize;\r
+        handle->txData        = xfer->data;\r
+        handle->txDataSize    = xfer->dataSize;\r
         handle->txDataSizeAll = xfer->dataSize;\r
-        handle->txState kUSART_TxBusy;\r
+        handle->txState       = (uint8_t)kUSART_TxBusy;\r
         /* Enable transmiter interrupt. */\r
         base->FIFOINTENSET |= USART_FIFOINTENSET_TXLVL_MASK;\r
     }\r
@@ -560,12 +607,12 @@ void USART_TransferAbortSend(USART_Type *base, usart_handle_t *handle)
     assert(NULL != handle);\r
 \r
     /* Disable interrupts */\r
-    USART_DisableInterrupts(base, kUSART_TxLevelInterruptEnable);\r
+    USART_DisableInterrupts(base, (uint32_t)kUSART_TxLevelInterruptEnable);\r
     /* Empty txFIFO */\r
     base->FIFOCFG |= USART_FIFOCFG_EMPTYTX_MASK;\r
 \r
-    handle->txDataSize = 0;\r
-    handle->txState kUSART_TxIdle;\r
+    handle->txDataSize = 0U;\r
+    handle->txState    = (uint8_t)kUSART_TxIdle;\r
 }\r
 \r
 /*!\r
@@ -586,7 +633,7 @@ status_t USART_TransferGetSendCount(USART_Type *base, usart_handle_t *handle, ui
     assert(NULL != handle);\r
     assert(NULL != count);\r
 \r
-    if (kUSART_TxIdle == handle->txState)\r
+    if ((uint8_t)kUSART_TxIdle == handle->txState)\r
     {\r
         return kStatus_NoTransferInProgress;\r
     }\r
@@ -644,7 +691,7 @@ status_t USART_TransferReceiveNonBlocking(USART_Type *base,
     }\r
     /* Check xfer members */\r
     assert(!((0 == xfer->dataSize) || (NULL == xfer->data)));\r
-    if ((0 == xfer->dataSize) || (NULL == xfer->data))\r
+    if ((0U == xfer->dataSize) || (NULL == xfer->data))\r
     {\r
         return kStatus_InvalidArgument;\r
     }\r
@@ -658,22 +705,22 @@ status_t USART_TransferReceiveNonBlocking(USART_Type *base,
           If there are not enough data in ring buffer, copy all of them to xfer->data,\r
           save the xfer->data remained empty space to uart handle, receive data\r
           to this empty space and trigger callback when finished. */\r
-    if (kUSART_RxBusy == handle->rxState)\r
+    if ((uint8_t)kUSART_RxBusy == handle->rxState)\r
     {\r
         return kStatus_USART_RxBusy;\r
     }\r
     else\r
     {\r
-        bytesToReceive = xfer->dataSize;\r
+        bytesToReceive       = xfer->dataSize;\r
         bytesCurrentReceived = 0U;\r
         /* If RX ring buffer is used. */\r
-        if (handle->rxRingBuffer)\r
+        if (handle->rxRingBuffer != NULL)\r
         {\r
             /* Disable IRQ, protect ring buffer. */\r
             regPrimask = DisableGlobalIRQ();\r
             /* How many bytes in RX ring buffer currently. */\r
             bytesToCopy = USART_TransferGetRxRingBufferLength(handle);\r
-            if (bytesToCopy)\r
+            if (bytesToCopy != 0U)\r
             {\r
                 bytesToCopy = MIN(bytesToReceive, bytesToCopy);\r
                 bytesToReceive -= bytesToCopy;\r
@@ -682,7 +729,7 @@ status_t USART_TransferReceiveNonBlocking(USART_Type *base,
                 {\r
                     xfer->data[bytesCurrentReceived++] = handle->rxRingBuffer[handle->rxRingBufferTail];\r
                     /* Wrap to 0. Not use modulo (%) because it might be large and slow. */\r
-                    if (handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)\r
+                    if ((size_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)\r
                     {\r
                         handle->rxRingBufferTail = 0U;\r
                     }\r
@@ -693,20 +740,20 @@ status_t USART_TransferReceiveNonBlocking(USART_Type *base,
                 }\r
             }\r
             /* If ring buffer does not have enough data, still need to read more data. */\r
-            if (bytesToReceive)\r
+            if (bytesToReceive != 0U)\r
             {\r
                 /* No data in ring buffer, save the request to UART handle. */\r
-                handle->rxData = xfer->data + bytesCurrentReceived;\r
-                handle->rxDataSize = bytesToReceive;\r
+                handle->rxData        = xfer->data + bytesCurrentReceived;\r
+                handle->rxDataSize    = bytesToReceive;\r
                 handle->rxDataSizeAll = bytesToReceive;\r
-                handle->rxState kUSART_RxBusy;\r
+                handle->rxState       = (uint8_t)kUSART_RxBusy;\r
             }\r
             /* Enable IRQ if previously enabled. */\r
             EnableGlobalIRQ(regPrimask);\r
             /* Call user callback since all data are received. */\r
-            if (0 == bytesToReceive)\r
+            if (0U == bytesToReceive)\r
             {\r
-                if (handle->callback)\r
+                if (handle->callback != NULL)\r
                 {\r
                     handle->callback(base, handle, kStatus_USART_RxIdle, handle->userData);\r
                 }\r
@@ -715,16 +762,16 @@ status_t USART_TransferReceiveNonBlocking(USART_Type *base,
         /* Ring buffer not used. */\r
         else\r
         {\r
-            handle->rxData = xfer->data + bytesCurrentReceived;\r
-            handle->rxDataSize = bytesToReceive;\r
+            handle->rxData        = xfer->data + bytesCurrentReceived;\r
+            handle->rxDataSize    = bytesToReceive;\r
             handle->rxDataSizeAll = bytesToReceive;\r
-            handle->rxState kUSART_RxBusy;\r
+            handle->rxState       = (uint8_t)kUSART_RxBusy;\r
 \r
             /* Enable RX interrupt. */\r
             base->FIFOINTENSET |= USART_FIFOINTENSET_RXLVL_MASK;\r
         }\r
         /* Return the how many bytes have read. */\r
-        if (receivedBytes)\r
+        if (receivedBytes != NULL)\r
         {\r
             *receivedBytes = bytesCurrentReceived;\r
         }\r
@@ -746,16 +793,16 @@ void USART_TransferAbortReceive(USART_Type *base, usart_handle_t *handle)
     assert(NULL != handle);\r
 \r
     /* Only abort the receive to handle->rxData, the RX ring buffer is still working. */\r
-    if (!handle->rxRingBuffer)\r
+    if (NULL == handle->rxRingBuffer)\r
     {\r
         /* Disable interrupts */\r
-        USART_DisableInterrupts(base, kUSART_RxLevelInterruptEnable);\r
+        USART_DisableInterrupts(base, (uint32_t)kUSART_RxLevelInterruptEnable);\r
         /* Empty rxFIFO */\r
         base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r
     }\r
 \r
     handle->rxDataSize = 0U;\r
-    handle->rxState kUSART_RxIdle;\r
+    handle->rxState    = (uint8_t)kUSART_RxIdle;\r
 }\r
 \r
 /*!\r
@@ -775,7 +822,7 @@ status_t USART_TransferGetReceiveCount(USART_Type *base, usart_handle_t *handle,
     assert(NULL != handle);\r
     assert(NULL != count);\r
 \r
-    if (kUSART_RxIdle == handle->rxState)\r
+    if ((uint8_t)kUSART_RxIdle == handle->rxState)\r
     {\r
         return kStatus_NoTransferInProgress;\r
     }\r
@@ -798,43 +845,46 @@ void USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle)
     /* Check arguments */\r
     assert((NULL != base) && (NULL != handle));\r
 \r
-    bool receiveEnabled = (handle->rxDataSize) || (handle->rxRingBuffer);\r
-    bool sendEnabled = handle->txDataSize;\r
+    bool receiveEnabled = ((handle->rxDataSize != 0U) || (handle->rxRingBuffer != NULL));\r
+    bool sendEnabled    = (handle->txDataSize != 0U);\r
+    uint8_t rxdata;\r
+    size_t tmpsize;\r
 \r
     /* If RX overrun. */\r
-    if (base->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK)\r
+    if ((base->FIFOSTAT & USART_FIFOSTAT_RXERR_MASK) != 0U)\r
     {\r
         /* Clear rx error state. */\r
         base->FIFOSTAT |= USART_FIFOSTAT_RXERR_MASK;\r
         /* clear rxFIFO */\r
         base->FIFOCFG |= USART_FIFOCFG_EMPTYRX_MASK;\r
         /* Trigger callback. */\r
-        if (handle->callback)\r
+        if (handle->callback != NULL)\r
         {\r
             handle->callback(base, handle, kStatus_USART_RxError, handle->userData);\r
         }\r
     }\r
-    while ((receiveEnabled && (base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK)) ||\r
-           (sendEnabled && (base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK)))\r
+    while ((receiveEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) != 0U)) ||\r
+           (sendEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) != 0U)))\r
     {\r
         /* Receive data */\r
-        if (receiveEnabled && (base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK))\r
+        if (receiveEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_RXNOTEMPTY_MASK) != 0U))\r
         {\r
             /* Receive to app bufffer if app buffer is present */\r
-            if (handle->rxDataSize)\r
+            if (handle->rxDataSize != 0U)\r
             {\r
-                *handle->rxData = base->FIFORD;\r
+                rxdata          = (uint8_t)base->FIFORD;\r
+                *handle->rxData = rxdata;\r
                 handle->rxDataSize--;\r
                 handle->rxData++;\r
-                receiveEnabled = ((handle->rxDataSize != 0) || (handle->rxRingBuffer));\r
-                if (!handle->rxDataSize)\r
+                receiveEnabled = ((handle->rxDataSize != 0U) || (handle->rxRingBuffer != NULL));\r
+                if (0U == handle->rxDataSize)\r
                 {\r
-                    if (!handle->rxRingBuffer)\r
+                    if (NULL == handle->rxRingBuffer)\r
                     {\r
                         base->FIFOINTENCLR = USART_FIFOINTENCLR_RXLVL_MASK | USART_FIFOINTENSET_RXERR_MASK;\r
                     }\r
-                    handle->rxState = kUSART_RxIdle;\r
-                    if (handle->callback)\r
+                    handle->rxState = (uint8_t)kUSART_RxIdle;\r
+                    if (handle->callback != NULL)\r
                     {\r
                         handle->callback(base, handle, kStatus_USART_RxIdle, handle->userData);\r
                     }\r
@@ -843,21 +893,21 @@ void USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle)
             /* Otherwise receive to ring buffer if ring buffer is present */\r
             else\r
             {\r
-                if (handle->rxRingBuffer)\r
+                if (handle->rxRingBuffer != NULL)\r
                 {\r
                     /* If RX ring buffer is full, trigger callback to notify over run. */\r
                     if (USART_TransferIsRxRingBufferFull(handle))\r
                     {\r
-                        if (handle->callback)\r
+                        if (handle->callback != NULL)\r
                         {\r
                             handle->callback(base, handle, kStatus_USART_RxRingBufferOverrun, handle->userData);\r
                         }\r
                     }\r
-                    /* If ring buffer is still full after callback function, the oldest data is overrided. */\r
+                    /* If ring buffer is still full after callback function, the oldest data is overridden. */\r
                     if (USART_TransferIsRxRingBufferFull(handle))\r
                     {\r
                         /* Increase handle->rxRingBufferTail to make room for new data. */\r
-                        if (handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)\r
+                        if ((size_t)handle->rxRingBufferTail + 1U == handle->rxRingBufferSize)\r
                         {\r
                             handle->rxRingBufferTail = 0U;\r
                         }\r
@@ -867,9 +917,10 @@ void USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle)
                         }\r
                     }\r
                     /* Read data. */\r
-                    handle->rxRingBuffer[handle->rxRingBufferHead] = base->FIFORD;\r
+                    rxdata                                         = (uint8_t)base->FIFORD;\r
+                    handle->rxRingBuffer[handle->rxRingBufferHead] = rxdata;\r
                     /* Increase handle->rxRingBufferHead. */\r
-                    if (handle->rxRingBufferHead + 1U == handle->rxRingBufferSize)\r
+                    if ((size_t)handle->rxRingBufferHead + 1U == handle->rxRingBufferSize)\r
                     {\r
                         handle->rxRingBufferHead = 0U;\r
                     }\r
@@ -881,38 +932,50 @@ void USART_TransferHandleIRQ(USART_Type *base, usart_handle_t *handle)
             }\r
         }\r
         /* Send data */\r
-        if (sendEnabled && (base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK))\r
+        if (sendEnabled && ((base->FIFOSTAT & USART_FIFOSTAT_TXNOTFULL_MASK) != 0U))\r
         {\r
             base->FIFOWR = *handle->txData;\r
             handle->txDataSize--;\r
             handle->txData++;\r
-            sendEnabled = handle->txDataSize != 0;\r
+            sendEnabled = handle->txDataSize != 0U;\r
             if (!sendEnabled)\r
             {\r
                 base->FIFOINTENCLR = USART_FIFOINTENCLR_TXLVL_MASK;\r
-                handle->txState = kUSART_TxIdle;\r
-                if (handle->callback)\r
-                {\r
-                    handle->callback(base, handle, kStatus_USART_TxIdle, handle->userData);\r
-                }\r
+                handle->txState    = (uint8_t)kUSART_TxIdle;\r
+\r
+                base->INTENSET |= USART_INTENSET_TXIDLEEN_MASK;\r
             }\r
         }\r
     }\r
 \r
+    /* Tx idle and the interrupt is enabled. */\r
+    if ((0U != (base->INTENSET & USART_INTENSET_TXIDLEEN_MASK)) &&\r
+        (0U != (base->INTSTAT & USART_INTSTAT_TXIDLE_MASK)) && (handle->txState == (uint8_t)kUSART_TxIdle))\r
+    {\r
+        /* Disable tx idle interrupt */\r
+        base->INTENCLR |= USART_INTENCLR_TXIDLECLR_MASK;\r
+        /* Trigger callback. */\r
+        if (handle->callback != NULL)\r
+        {\r
+            handle->callback(base, handle, kStatus_USART_TxIdle, handle->userData);\r
+        }\r
+    }\r
+\r
     /* ring buffer is not used */\r
     if (NULL == handle->rxRingBuffer)\r
     {\r
+        tmpsize = handle->rxDataSize;\r
+\r
         /* restore if rx transfer ends and rxLevel is different from default value */\r
-        if ((handle->rxDataSize == 0) && (USART_FIFOTRIG_RXLVL_GET(base) != handle->rxWatermark))\r
+        if ((tmpsize == 0U) && (USART_FIFOTRIG_RXLVL_GET(base) != handle->rxWatermark))\r
         {\r
             base->FIFOTRIG =\r
                 (base->FIFOTRIG & (~USART_FIFOTRIG_RXLVL_MASK)) | USART_FIFOTRIG_RXLVL(handle->rxWatermark);\r
         }\r
         /* decrease level if rx transfer is bellow */\r
-        if ((handle->rxDataSize != 0) && (handle->rxDataSize < (USART_FIFOTRIG_RXLVL_GET(base) + 1)))\r
+        if ((tmpsize != 0U) && (tmpsize < (USART_FIFOTRIG_RXLVL_GET(base) + 1U)))\r
         {\r
-            base->FIFOTRIG =\r
-                (base->FIFOTRIG & (~USART_FIFOTRIG_RXLVL_MASK)) | (USART_FIFOTRIG_RXLVL(handle->rxDataSize - 1));\r
+            base->FIFOTRIG = (base->FIFOTRIG & (~USART_FIFOTRIG_RXLVL_MASK)) | (USART_FIFOTRIG_RXLVL(tmpsize - 1U));\r
         }\r
     }\r
 }\r