]> git.sur5r.net Git - freertos/blobdiff - FreeRTOS/Demo/CORTEX_MPU_LPC54018_MCUXpresso/NXP_Code/component/serial_manager/serial_port_uart.c
Add MPU demo project for LPC54018 board.
[freertos] / FreeRTOS / Demo / CORTEX_MPU_LPC54018_MCUXpresso / NXP_Code / component / serial_manager / serial_port_uart.c
diff --git a/FreeRTOS/Demo/CORTEX_MPU_LPC54018_MCUXpresso/NXP_Code/component/serial_manager/serial_port_uart.c b/FreeRTOS/Demo/CORTEX_MPU_LPC54018_MCUXpresso/NXP_Code/component/serial_manager/serial_port_uart.c
new file mode 100644 (file)
index 0000000..799e85a
--- /dev/null
@@ -0,0 +1,403 @@
+/*\r
+ * Copyright 2018 NXP\r
+ * All rights reserved.\r
+ *\r
+ *\r
+ * SPDX-License-Identifier: BSD-3-Clause\r
+ */\r
+\r
+#include "fsl_common.h"\r
+#include "serial_manager.h"\r
+#include "serial_port_internal.h"\r
+\r
+#if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U))\r
+#include "uart.h"\r
+\r
+#include "serial_port_uart.h"\r
+\r
+/*******************************************************************************\r
+ * Definitions\r
+ ******************************************************************************/\r
+#ifndef NDEBUG\r
+#if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U))\r
+#undef assert\r
+#define assert(n)\r
+#endif\r
+#endif\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+#define SERIAL_PORT_UART_RECEIVE_DATA_LENGTH 1U\r
+\r
+typedef struct _serial_uart_send_state\r
+{\r
+    serial_manager_callback_t callback;\r
+    void *callbackParam;\r
+    uint8_t *buffer;\r
+    uint32_t length;\r
+    volatile uint8_t busy;\r
+} serial_uart_send_state_t;\r
+\r
+typedef struct _serial_uart_recv_state\r
+{\r
+    serial_manager_callback_t callback;\r
+    void *callbackParam;\r
+    volatile uint8_t busy;\r
+    uint8_t readBuffer[SERIAL_PORT_UART_RECEIVE_DATA_LENGTH];\r
+} serial_uart_recv_state_t;\r
+#endif\r
+\r
+typedef struct _serial_uart_state\r
+{\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+    serial_uart_send_state_t tx;\r
+    serial_uart_recv_state_t rx;\r
+#endif\r
+    uint8_t usartHandleBuffer[HAL_UART_HANDLE_SIZE];\r
+} serial_uart_state_t;\r
+\r
+/*******************************************************************************\r
+ * Prototypes\r
+ ******************************************************************************/\r
+\r
+/*******************************************************************************\r
+ * Code\r
+ ******************************************************************************/\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+/* UART user callback */\r
+static void Serial_UartCallback(hal_uart_handle_t handle, hal_uart_status_t status, void *userData)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+    serial_manager_callback_message_t msg;\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    hal_uart_transfer_t transfer;\r
+#endif\r
+\r
+    if (NULL == userData)\r
+    {\r
+        return;\r
+    }\r
+\r
+    serialUartHandle = (serial_uart_state_t *)userData;\r
+\r
+    if ((hal_uart_status_t)kStatus_HAL_UartRxIdle == status)\r
+    {\r
+        if ((NULL != serialUartHandle->rx.callback))\r
+        {\r
+            msg.buffer = &serialUartHandle->rx.readBuffer[0];\r
+            msg.length = sizeof(serialUartHandle->rx.readBuffer);\r
+            serialUartHandle->rx.callback(serialUartHandle->rx.callbackParam, &msg, kStatus_SerialManager_Success);\r
+        }\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+        transfer.data     = &serialUartHandle->rx.readBuffer[0];\r
+        transfer.dataSize = sizeof(serialUartHandle->rx.readBuffer);\r
+        if (kStatus_HAL_UartSuccess ==\r
+            HAL_UartTransferReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))\r
+#else\r
+        if ((hal_uart_status_t)kStatus_HAL_UartSuccess ==\r
+            HAL_UartReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r
+                                       &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer)))\r
+#endif\r
+        {\r
+            serialUartHandle->rx.busy = 1U;\r
+        }\r
+        else\r
+        {\r
+            serialUartHandle->rx.busy = 0U;\r
+        }\r
+    }\r
+    else if ((hal_uart_status_t)kStatus_HAL_UartTxIdle == status)\r
+    {\r
+        if (0U != serialUartHandle->tx.busy)\r
+        {\r
+            serialUartHandle->tx.busy = 0U;\r
+            if ((NULL != serialUartHandle->tx.callback))\r
+            {\r
+                msg.buffer = serialUartHandle->tx.buffer;\r
+                msg.length = serialUartHandle->tx.length;\r
+                serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &msg, kStatus_SerialManager_Success);\r
+            }\r
+        }\r
+    }\r
+    else\r
+    {\r
+    }\r
+}\r
+#endif\r
+\r
+serial_manager_status_t Serial_UartInit(serial_handle_t serialHandle, void *serialConfig)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+    serial_port_uart_config_t *uartConfig;\r
+    hal_uart_config_t config;\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    hal_uart_transfer_t transfer;\r
+#endif\r
+#endif\r
+\r
+    assert(serialConfig);\r
+    assert(serialHandle);\r
+    assert(SERIAL_PORT_UART_HANDLE_SIZE >= sizeof(serial_uart_state_t));\r
+\r
+    uartConfig       = (serial_port_uart_config_t *)serialConfig;\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    config.baudRate_Bps = uartConfig->baudRate;\r
+    config.parityMode   = (hal_uart_parity_mode_t)uartConfig->parityMode;\r
+    config.stopBitCount = (hal_uart_stop_bit_count_t)uartConfig->stopBitCount;\r
+    config.enableRx     = uartConfig->enableRx;\r
+    config.enableTx     = uartConfig->enableTx;\r
+    config.srcClock_Hz  = uartConfig->clockRate;\r
+    config.instance     = uartConfig->instance;\r
+\r
+    if (kStatus_HAL_UartSuccess != HAL_UartInit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &config))\r
+    {\r
+        return kStatus_SerialManager_Error;\r
+    }\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    if (kStatus_HAL_UartSuccess !=\r
+        HAL_UartTransferInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r
+                                        Serial_UartCallback, serialUartHandle))\r
+#else\r
+    if (kStatus_HAL_UartSuccess != HAL_UartInstallCallback(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r
+                                                           Serial_UartCallback, serialUartHandle))\r
+#endif\r
+    {\r
+        return kStatus_SerialManager_Error;\r
+    }\r
+\r
+    if (0U != uartConfig->enableRx)\r
+    {\r
+        serialUartHandle->rx.busy = 1U;\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+        transfer.data     = &serialUartHandle->rx.readBuffer[0];\r
+        transfer.dataSize = sizeof(serialUartHandle->rx.readBuffer);\r
+        if (kStatus_HAL_UartSuccess !=\r
+            HAL_UartTransferReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))\r
+#else\r
+        if (kStatus_HAL_UartSuccess !=\r
+            HAL_UartReceiveNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r
+                                       &serialUartHandle->rx.readBuffer[0], sizeof(serialUartHandle->rx.readBuffer)))\r
+#endif\r
+        {\r
+            serialUartHandle->rx.busy = 0U;\r
+            return kStatus_SerialManager_Error;\r
+        }\r
+    }\r
+#endif\r
+\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+serial_manager_status_t Serial_UartDeinit(serial_handle_t serialHandle)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    (void)HAL_UartTransferAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r
+#else\r
+    (void)HAL_UartAbortReceive(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r
+#endif\r
+#endif\r
+    (void)HAL_UartDeinit(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+    serialUartHandle->tx.busy = 0U;\r
+    serialUartHandle->rx.busy = 0U;\r
+#endif\r
+\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+\r
+serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    hal_uart_transfer_t transfer;\r
+#endif\r
+\r
+    assert(serialHandle);\r
+    assert(buffer);\r
+    assert(length);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    if (0U != serialUartHandle->tx.busy)\r
+    {\r
+        return kStatus_SerialManager_Busy;\r
+    }\r
+    serialUartHandle->tx.busy = 1U;\r
+\r
+    serialUartHandle->tx.buffer = buffer;\r
+    serialUartHandle->tx.length = length;\r
+\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    transfer.data     = buffer;\r
+    transfer.dataSize = length;\r
+    if (kStatus_HAL_UartSuccess !=\r
+        HAL_UartTransferSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), &transfer))\r
+#else\r
+    if (kStatus_HAL_UartSuccess !=\r
+        HAL_UartSendNonBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length))\r
+#endif\r
+    {\r
+        serialUartHandle->tx.busy = 0U;\r
+        return kStatus_SerialManager_Error;\r
+    }\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+#else\r
+\r
+serial_manager_status_t Serial_UartWrite(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+    assert(buffer);\r
+    assert(length);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    return (serial_manager_status_t)HAL_UartSendBlocking(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]),\r
+                                                         buffer, length);\r
+}\r
+\r
+serial_manager_status_t Serial_UartRead(serial_handle_t serialHandle, uint8_t *buffer, uint32_t length)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+    assert(buffer);\r
+    assert(length);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    return (serial_manager_status_t)HAL_UartReceiveBlocking(\r
+        ((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]), buffer, length);\r
+}\r
+\r
+#endif\r
+\r
+#if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U))\r
+serial_manager_status_t Serial_UartCancelWrite(serial_handle_t serialHandle)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+    serial_manager_callback_message_t msg;\r
+    uint32_t primask;\r
+    uint8_t isBusy = 0U;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    primask                   = DisableGlobalIRQ();\r
+    isBusy                    = serialUartHandle->tx.busy;\r
+    serialUartHandle->tx.busy = 0U;\r
+    EnableGlobalIRQ(primask);\r
+\r
+#if (defined(HAL_UART_TRANSFER_MODE) && (HAL_UART_TRANSFER_MODE > 0U))\r
+    (void)HAL_UartTransferAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r
+#else\r
+    (void)HAL_UartAbortSend(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r
+#endif\r
+    if (0U != isBusy)\r
+    {\r
+        if ((NULL != serialUartHandle->tx.callback))\r
+        {\r
+            msg.buffer = serialUartHandle->tx.buffer;\r
+            msg.length = serialUartHandle->tx.length;\r
+            serialUartHandle->tx.callback(serialUartHandle->tx.callbackParam, &msg, kStatus_SerialManager_Canceled);\r
+        }\r
+    }\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+serial_manager_status_t Serial_UartInstallTxCallback(serial_handle_t serialHandle,\r
+                                                     serial_manager_callback_t callback,\r
+                                                     void *callbackParam)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    serialUartHandle->tx.callback      = callback;\r
+    serialUartHandle->tx.callbackParam = callbackParam;\r
+\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+serial_manager_status_t Serial_UartInstallRxCallback(serial_handle_t serialHandle,\r
+                                                     serial_manager_callback_t callback,\r
+                                                     void *callbackParam)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    serialUartHandle->rx.callback      = callback;\r
+    serialUartHandle->rx.callbackParam = callbackParam;\r
+\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+void Serial_UartIsrFunction(serial_handle_t serialHandle)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    HAL_UartIsrFunction(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0]));\r
+}\r
+#endif\r
+\r
+serial_manager_status_t Serial_UartEnterLowpower(serial_handle_t serialHandle)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    if (kStatus_HAL_UartSuccess != HAL_UartEnterLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0])))\r
+    {\r
+        return kStatus_SerialManager_Error;\r
+    }\r
+\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+serial_manager_status_t Serial_UartExitLowpower(serial_handle_t serialHandle)\r
+{\r
+    serial_uart_state_t *serialUartHandle;\r
+\r
+    assert(serialHandle);\r
+\r
+    serialUartHandle = (serial_uart_state_t *)serialHandle;\r
+\r
+    if (kStatus_HAL_UartSuccess != HAL_UartExitLowpower(((hal_uart_handle_t)&serialUartHandle->usartHandleBuffer[0])))\r
+    {\r
+        return kStatus_SerialManager_Error;\r
+    }\r
+\r
+    return kStatus_SerialManager_Success;\r
+}\r
+\r
+#endif\r