| /* |
| * Copyright 2018-2020 NXP |
| * All rights reserved. |
| * |
| * |
| * SPDX-License-Identifier: BSD-3-Clause |
| */ |
| |
| #include "fsl_common.h" |
| #include <string.h> |
| |
| #include "serial_manager.h" |
| #include "serial_port_internal.h" |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| |
| #include "generic_list.h" |
| |
| /* |
| * The OSA_USED macro can only be defined when the OSA component is used. |
| * If the source code of the OSA component does not exist, the OSA_USED cannot be defined. |
| * OR, If OSA component is not added into project event the OSA source code exists, the OSA_USED |
| * also cannot be defined. |
| * The source code path of the OSA component is <MCUXpresso_SDK>/components/osa. |
| * |
| */ |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| #include "common_task.h" |
| #else |
| #include "fsl_os_abstraction.h" |
| #endif |
| |
| #endif |
| |
| #endif |
| |
| /******************************************************************************* |
| * Definitions |
| ******************************************************************************/ |
| |
| #ifndef NDEBUG |
| #if (defined(DEBUG_CONSOLE_ASSERT_DISABLE) && (DEBUG_CONSOLE_ASSERT_DISABLE > 0U)) |
| #undef assert |
| #define assert(n) |
| #endif |
| #endif |
| |
| #define SERIAL_EVENT_DATA_RECEIVED (1U << 0) |
| #define SERIAL_EVENT_DATA_SENT (1U << 1) |
| |
| #define SERIAL_MANAGER_WRITE_TAG 0xAABB5754U |
| #define SERIAL_MANAGER_READ_TAG 0xBBAA5244U |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| typedef enum _serial_manager_transmission_mode |
| { |
| kSerialManager_TransmissionBlocking = 0x0U, /*!< Blocking transmission*/ |
| kSerialManager_TransmissionNonBlocking = 0x1U, /*!< None blocking transmission*/ |
| } serial_manager_transmission_mode_t; |
| |
| /* TX transfer structure */ |
| typedef struct _serial_manager_transfer |
| { |
| uint8_t *buffer; |
| volatile uint32_t length; |
| volatile uint32_t soFar; |
| serial_manager_transmission_mode_t mode; |
| serial_manager_status_t status; |
| } serial_manager_transfer_t; |
| #endif |
| |
| /* write handle structure */ |
| typedef struct _serial_manager_send_handle |
| { |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| list_element_t link; /*!< list element of the link */ |
| serial_manager_transfer_t transfer; |
| #endif |
| struct _serial_manager_handle *serialManagerHandle; |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| serial_manager_callback_t callback; |
| void *callbackParam; |
| uint32_t tag; |
| #endif |
| } serial_manager_write_handle_t; |
| |
| typedef serial_manager_write_handle_t serial_manager_read_handle_t; |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| /* receive state structure */ |
| typedef struct _serial_manager_read_ring_buffer |
| { |
| uint8_t *ringBuffer; |
| uint32_t ringBufferSize; |
| volatile uint32_t ringHead; |
| volatile uint32_t ringTail; |
| } serial_manager_read_ring_buffer_t; |
| #endif |
| |
| #if defined(__CC_ARM) |
| #pragma anon_unions |
| #endif |
| /* The serial manager handle structure */ |
| typedef struct _serial_manager_handle |
| { |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| list_label_t runningWriteHandleHead; /*!< The queue of running write handle */ |
| list_label_t completedWriteHandleHead; /*!< The queue of completed write handle */ |
| #endif |
| serial_manager_read_handle_t *volatile openedReadHandleHead; |
| volatile uint32_t openedWriteHandleCount; |
| union |
| { |
| uint32_t lowLevelhandleBuffer[1]; |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| uint8_t uartHandleBuffer[SERIAL_PORT_UART_HANDLE_SIZE]; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| uint8_t usbcdcHandleBuffer[SERIAL_PORT_USB_CDC_HANDLE_SIZE]; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| uint8_t swoHandleBuffer[SERIAL_PORT_SWO_HANDLE_SIZE]; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| uint8_t usbcdcVirtualHandleBuffer[SERIAL_PORT_USB_VIRTUAL_HANDLE_SIZE]; |
| #endif |
| }; |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| serial_manager_read_ring_buffer_t ringBuffer; |
| #endif |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| common_task_message_t commontaskMsg; |
| #else |
| OSA_EVENT_HANDLE_DEFINE(event); /*!< Event instance */ |
| OSA_TASK_HANDLE_DEFINE(taskId); /*!< Task handle */ |
| #endif |
| |
| #endif |
| |
| #endif |
| |
| serial_port_type_t type; |
| } serial_manager_handle_t; |
| |
| /******************************************************************************* |
| * Prototypes |
| ******************************************************************************/ |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| static void SerialManager_Task(void *param); |
| #endif |
| |
| /******************************************************************************* |
| * Variables |
| ******************************************************************************/ |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| |
| #else |
| /* |
| * \brief Defines the serial manager task's stack |
| */ |
| OSA_TASK_DEFINE(SerialManager_Task, SERIAL_MANAGER_TASK_PRIORITY, 1, SERIAL_MANAGER_TASK_STACK_SIZE, false); |
| #endif |
| |
| #endif |
| |
| #endif |
| |
| /******************************************************************************* |
| * Code |
| ******************************************************************************/ |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| static void SerialManager_AddTail(list_label_t *queue, serial_manager_write_handle_t *node) |
| { |
| (void)LIST_AddTail(queue, &node->link); |
| } |
| |
| static void SerialManager_RemoveHead(list_label_t *queue) |
| { |
| (void)LIST_RemoveHead(queue); |
| } |
| #endif |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| |
| static serial_manager_status_t SerialManager_StartWriting(serial_manager_handle_t *handle) |
| { |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| serial_manager_write_handle_t *writeHandle = |
| (serial_manager_write_handle_t *)(void *)LIST_GetHead(&handle->runningWriteHandleHead); |
| |
| if (writeHandle != NULL) |
| { |
| switch (handle->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| status = Serial_UartWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| writeHandle->transfer.buffer, writeHandle->transfer.length); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| status = Serial_UsbCdcWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| writeHandle->transfer.buffer, writeHandle->transfer.length); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| status = Serial_SwoWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| writeHandle->transfer.buffer, writeHandle->transfer.length); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| status = Serial_UsbCdcVirtualWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| writeHandle->transfer.buffer, writeHandle->transfer.length); |
| break; |
| #endif |
| default: |
| status = kStatus_SerialManager_Error; |
| break; |
| } |
| } |
| return status; |
| } |
| |
| static serial_manager_status_t SerialManager_StartReading(serial_manager_handle_t *handle, |
| serial_manager_read_handle_t *readHandle, |
| uint8_t *buffer, |
| uint32_t length) |
| { |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| |
| if (NULL != readHandle) |
| { |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| if (handle->type == kSerialPort_UsbCdc) |
| { |
| status = Serial_UsbCdcRead(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| if (handle->type == kSerialPort_UsbCdcVirtual) |
| { |
| status = Serial_UsbCdcVirtualRead(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| #endif |
| } |
| return status; |
| } |
| |
| #else /*SERIAL_MANAGER_NON_BLOCKING_MODE > 0U*/ |
| |
| static serial_manager_status_t SerialManager_StartWriting(serial_manager_handle_t *handle, |
| serial_manager_write_handle_t *writeHandle, |
| uint8_t *buffer, |
| uint32_t length) |
| { |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| if (kSerialPort_Uart == handle->type) /* Serial port UART */ |
| { |
| status = Serial_UartWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| if (kSerialPort_UsbCdc == handle->type) /* Serial port UsbCdc */ |
| { |
| status = Serial_UsbCdcWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| if (kSerialPort_Swo == handle->type) /* Serial port SWO */ |
| { |
| status = Serial_SwoWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| if (kSerialPort_UsbCdcVirtual == handle->type) /* Serial port UsbCdcVirtual */ |
| { |
| status = Serial_UsbCdcVirtualWrite(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| { |
| /*MISRA rule*/ |
| } |
| return status; |
| } |
| |
| static serial_manager_status_t SerialManager_StartReading(serial_manager_handle_t *handle, |
| serial_manager_read_handle_t *readHandle, |
| uint8_t *buffer, |
| uint32_t length) |
| { |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| if (kSerialPort_Uart == handle->type) /* Serial port UART */ |
| { |
| status = Serial_UartRead(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| if (kSerialPort_UsbCdc == handle->type) /* Serial port UsbCdc */ |
| { |
| status = Serial_UsbCdcRead(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| if (kSerialPort_Swo == handle->type) /* Serial port SWO */ |
| { |
| status = Serial_SwoRead(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| else |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| if (kSerialPort_UsbCdcVirtual == handle->type) /* Serial port UsbCdcVirtual */ |
| { |
| status = Serial_UsbCdcVirtualRead(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), buffer, length); |
| } |
| #endif |
| { |
| /*MISRA rule*/ |
| } |
| return status; |
| } |
| #endif /*SERIAL_MANAGER_NON_BLOCKING_MODE > 0U*/ |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| static void SerialManager_IsrFunction(serial_manager_handle_t *handle) |
| { |
| uint32_t regPrimask = DisableGlobalIRQ(); |
| switch (handle->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| Serial_UartIsrFunction(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| Serial_UsbCdcIsrFunction(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| Serial_SwoIsrFunction(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| Serial_UsbCdcVirtualIsrFunction(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| default: |
| /*MISRA rule 16.4*/ |
| break; |
| } |
| EnableGlobalIRQ(regPrimask); |
| } |
| |
| static void SerialManager_Task(void *param) |
| { |
| serial_manager_handle_t *handle = (serial_manager_handle_t *)param; |
| serial_manager_write_handle_t *serialWriteHandle; |
| serial_manager_read_handle_t *serialReadHandle; |
| uint32_t primask; |
| serial_manager_callback_message_t msg; |
| |
| if (NULL != handle) |
| { |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| #else |
| osa_event_flags_t ev = 0; |
| |
| do |
| { |
| if (KOSA_StatusSuccess == |
| OSA_EventWait((osa_event_handle_t)handle->event, osaEventFlagsAll_c, false, osaWaitForever_c, &ev)) |
| { |
| if (ev & SERIAL_EVENT_DATA_SENT) |
| #endif |
| |
| #endif |
| { |
| serialWriteHandle = |
| (serial_manager_write_handle_t *)(void *)LIST_GetHead(&handle->completedWriteHandleHead); |
| while (NULL != serialWriteHandle) |
| { |
| SerialManager_RemoveHead(&handle->completedWriteHandleHead); |
| msg.buffer = serialWriteHandle->transfer.buffer; |
| msg.length = serialWriteHandle->transfer.soFar; |
| serialWriteHandle->transfer.buffer = NULL; |
| if (NULL != serialWriteHandle->callback) |
| { |
| serialWriteHandle->callback(serialWriteHandle->callbackParam, &msg, |
| serialWriteHandle->transfer.status); |
| } |
| serialWriteHandle = |
| (serial_manager_write_handle_t *)(void *)LIST_GetHead(&handle->completedWriteHandleHead); |
| } |
| } |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| #else |
| if (ev & SERIAL_EVENT_DATA_RECEIVED) |
| #endif |
| |
| #endif |
| { |
| primask = DisableGlobalIRQ(); |
| serialReadHandle = handle->openedReadHandleHead; |
| EnableGlobalIRQ(primask); |
| |
| if (NULL != serialReadHandle) |
| { |
| if (NULL != serialReadHandle->transfer.buffer) |
| { |
| if (serialReadHandle->transfer.soFar >= serialReadHandle->transfer.length) |
| { |
| msg.buffer = serialReadHandle->transfer.buffer; |
| msg.length = serialReadHandle->transfer.soFar; |
| serialReadHandle->transfer.buffer = NULL; |
| if (NULL != serialReadHandle->callback) |
| { |
| serialReadHandle->callback(serialReadHandle->callbackParam, &msg, |
| serialReadHandle->transfer.status); |
| } |
| } |
| } |
| } |
| } |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| #else |
| } |
| } while (gUseRtos_c); |
| #endif |
| |
| #endif |
| } |
| } |
| #endif |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| static void SerialManager_TxCallback(void *callbackParam, |
| serial_manager_callback_message_t *message, |
| serial_manager_status_t status) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_write_handle_t *writeHandle; |
| |
| assert(callbackParam); |
| assert(message); |
| |
| handle = (serial_manager_handle_t *)callbackParam; |
| |
| writeHandle = (serial_manager_write_handle_t *)(void *)LIST_GetHead(&handle->runningWriteHandleHead); |
| |
| if (NULL != writeHandle) |
| { |
| SerialManager_RemoveHead(&handle->runningWriteHandleHead); |
| (void)SerialManager_StartWriting(handle); |
| writeHandle->transfer.soFar = message->length; |
| writeHandle->transfer.status = status; |
| if (kSerialManager_TransmissionNonBlocking == writeHandle->transfer.mode) |
| { |
| SerialManager_AddTail(&handle->completedWriteHandleHead, writeHandle); |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| handle->commontaskMsg.callback = SerialManager_Task; |
| handle->commontaskMsg.callbackParam = handle; |
| COMMON_TASK_post_message(&handle->commontaskMsg); |
| #else |
| (void)OSA_EventSet((osa_event_handle_t)handle->event, SERIAL_EVENT_DATA_SENT); |
| #endif |
| |
| #else |
| SerialManager_Task(handle); |
| #endif |
| } |
| else |
| { |
| writeHandle->transfer.buffer = NULL; |
| } |
| } |
| } |
| |
| static void SerialManager_RxCallback(void *callbackParam, |
| serial_manager_callback_message_t *message, |
| serial_manager_status_t status) |
| { |
| serial_manager_handle_t *handle; |
| uint32_t ringBufferLength; |
| uint32_t primask; |
| |
| assert(callbackParam); |
| assert(message); |
| |
| handle = (serial_manager_handle_t *)callbackParam; |
| |
| status = kStatus_SerialManager_Notify; |
| |
| for (uint32_t i = 0; i < message->length; i++) |
| { |
| handle->ringBuffer.ringBuffer[handle->ringBuffer.ringHead++] = message->buffer[i]; |
| if (handle->ringBuffer.ringHead >= handle->ringBuffer.ringBufferSize) |
| { |
| handle->ringBuffer.ringHead = 0U; |
| } |
| if (handle->ringBuffer.ringHead == handle->ringBuffer.ringTail) |
| { |
| status = kStatus_SerialManager_RingBufferOverflow; |
| handle->ringBuffer.ringTail++; |
| if (handle->ringBuffer.ringTail >= handle->ringBuffer.ringBufferSize) |
| { |
| handle->ringBuffer.ringTail = 0U; |
| } |
| } |
| } |
| |
| ringBufferLength = handle->ringBuffer.ringHead + handle->ringBuffer.ringBufferSize - handle->ringBuffer.ringTail; |
| ringBufferLength = ringBufferLength % handle->ringBuffer.ringBufferSize; |
| |
| primask = DisableGlobalIRQ(); |
| if ((NULL != handle->openedReadHandleHead) && (NULL != handle->openedReadHandleHead->transfer.buffer)) |
| { |
| if (handle->openedReadHandleHead->transfer.length > handle->openedReadHandleHead->transfer.soFar) |
| { |
| uint32_t remainLength = |
| handle->openedReadHandleHead->transfer.length - handle->openedReadHandleHead->transfer.soFar; |
| for (uint32_t i = 0; i < MIN(ringBufferLength, remainLength); i++) |
| { |
| handle->openedReadHandleHead->transfer.buffer[handle->openedReadHandleHead->transfer.soFar] = |
| handle->ringBuffer.ringBuffer[handle->ringBuffer.ringTail]; |
| handle->ringBuffer.ringTail++; |
| handle->openedReadHandleHead->transfer.soFar++; |
| if (handle->ringBuffer.ringTail >= handle->ringBuffer.ringBufferSize) |
| { |
| handle->ringBuffer.ringTail = 0U; |
| } |
| } |
| ringBufferLength = ringBufferLength - MIN(ringBufferLength, remainLength); |
| } |
| |
| if (handle->openedReadHandleHead->transfer.length > handle->openedReadHandleHead->transfer.soFar) |
| { |
| } |
| else |
| { |
| if (kSerialManager_TransmissionBlocking == handle->openedReadHandleHead->transfer.mode) |
| { |
| handle->openedReadHandleHead->transfer.buffer = NULL; |
| } |
| else |
| { |
| handle->openedReadHandleHead->transfer.status = kStatus_SerialManager_Success; |
| |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| handle->commontaskMsg.callback = SerialManager_Task; |
| handle->commontaskMsg.callbackParam = handle; |
| COMMON_TASK_post_message(&handle->commontaskMsg); |
| #else |
| (void)OSA_EventSet((osa_event_handle_t)handle->event, SERIAL_EVENT_DATA_RECEIVED); |
| #endif |
| |
| #else |
| SerialManager_Task(handle); |
| #endif |
| } |
| } |
| } |
| |
| if (0U != ringBufferLength) |
| { |
| message->buffer = NULL; |
| message->length = ringBufferLength; |
| if ((NULL != handle->openedReadHandleHead) && (NULL != handle->openedReadHandleHead->callback)) |
| { |
| handle->openedReadHandleHead->callback(handle->openedReadHandleHead->callbackParam, message, status); |
| } |
| } |
| |
| ringBufferLength = handle->ringBuffer.ringBufferSize - 1U - ringBufferLength; |
| |
| if (NULL != handle->openedReadHandleHead) |
| { |
| (void)SerialManager_StartReading(handle, handle->openedReadHandleHead, NULL, ringBufferLength); |
| } |
| EnableGlobalIRQ(primask); |
| } |
| |
| static serial_manager_status_t SerialManager_Write(serial_write_handle_t writeHandle, |
| uint8_t *buffer, |
| uint32_t length, |
| serial_manager_transmission_mode_t mode) |
| { |
| serial_manager_write_handle_t *serialWriteHandle; |
| serial_manager_handle_t *handle; |
| serial_manager_status_t status = kStatus_SerialManager_Success; |
| uint32_t primask; |
| uint8_t isEmpty = 0U; |
| |
| assert(writeHandle); |
| assert(buffer); |
| assert(length); |
| |
| serialWriteHandle = (serial_manager_write_handle_t *)writeHandle; |
| handle = serialWriteHandle->serialManagerHandle; |
| |
| assert(handle); |
| assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag); |
| assert(!((kSerialManager_TransmissionNonBlocking == mode) && (NULL == serialWriteHandle->callback))); |
| |
| primask = DisableGlobalIRQ(); |
| if (NULL != serialWriteHandle->transfer.buffer) |
| { |
| EnableGlobalIRQ(primask); |
| return kStatus_SerialManager_Busy; |
| } |
| serialWriteHandle->transfer.buffer = buffer; |
| serialWriteHandle->transfer.length = length; |
| serialWriteHandle->transfer.soFar = 0U; |
| serialWriteHandle->transfer.mode = mode; |
| |
| if (NULL == LIST_GetHead(&handle->runningWriteHandleHead)) |
| { |
| isEmpty = 1U; |
| } |
| SerialManager_AddTail(&handle->runningWriteHandleHead, serialWriteHandle); |
| EnableGlobalIRQ(primask); |
| |
| if (0U != isEmpty) |
| { |
| status = SerialManager_StartWriting(handle); |
| if ((serial_manager_status_t)kStatus_SerialManager_Success != status) |
| { |
| #if (USB_CDC_SERIAL_MANAGER_RUN_NO_HOST == 1) |
| if (status == kStatus_SerialManager_NotConnected) |
| { |
| SerialManager_RemoveHead(&handle->runningWriteHandleHead); |
| serialWriteHandle->transfer.buffer = 0; |
| serialWriteHandle->transfer.length = 0; |
| } |
| #endif /* USB_CDC_SERIAL_MANAGER_RUN_NO_HOST == 1 */ |
| return status; |
| } |
| } |
| |
| if (kSerialManager_TransmissionBlocking == mode) |
| { |
| while (serialWriteHandle->transfer.length > serialWriteHandle->transfer.soFar) |
| { |
| #if defined(__GIC_PRIO_BITS) |
| if (0x13 == (__get_CPSR() & CPSR_M_Msk)) |
| #else |
| if (0U != __get_IPSR()) |
| #endif |
| { |
| SerialManager_IsrFunction(handle); |
| } |
| } |
| } |
| return kStatus_SerialManager_Success; |
| } |
| |
| static serial_manager_status_t SerialManager_Read(serial_read_handle_t readHandle, |
| uint8_t *buffer, |
| uint32_t length, |
| serial_manager_transmission_mode_t mode, |
| uint32_t *receivedLength) |
| { |
| serial_manager_read_handle_t *serialReadHandle; |
| serial_manager_handle_t *handle; |
| uint32_t dataLength; |
| uint32_t primask; |
| |
| assert(readHandle); |
| assert(buffer); |
| assert(length); |
| |
| serialReadHandle = (serial_manager_read_handle_t *)readHandle; |
| handle = serialReadHandle->serialManagerHandle; |
| |
| assert(handle); |
| assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag); |
| assert(!((kSerialManager_TransmissionNonBlocking == mode) && (NULL == serialReadHandle->callback))); |
| |
| primask = DisableGlobalIRQ(); |
| if (NULL != serialReadHandle->transfer.buffer) |
| { |
| EnableGlobalIRQ(primask); |
| return kStatus_SerialManager_Busy; |
| } |
| serialReadHandle->transfer.buffer = buffer; |
| serialReadHandle->transfer.length = length; |
| serialReadHandle->transfer.soFar = 0U; |
| serialReadHandle->transfer.mode = mode; |
| |
| dataLength = handle->ringBuffer.ringHead + handle->ringBuffer.ringBufferSize - handle->ringBuffer.ringTail; |
| dataLength = dataLength % handle->ringBuffer.ringBufferSize; |
| |
| for (serialReadHandle->transfer.soFar = 0U; serialReadHandle->transfer.soFar < MIN(dataLength, length); |
| serialReadHandle->transfer.soFar++) |
| { |
| buffer[serialReadHandle->transfer.soFar] = handle->ringBuffer.ringBuffer[handle->ringBuffer.ringTail]; |
| handle->ringBuffer.ringTail++; |
| if (handle->ringBuffer.ringTail >= handle->ringBuffer.ringBufferSize) |
| { |
| handle->ringBuffer.ringTail = 0U; |
| } |
| } |
| |
| dataLength = handle->ringBuffer.ringHead + handle->ringBuffer.ringBufferSize - handle->ringBuffer.ringTail; |
| dataLength = dataLength % handle->ringBuffer.ringBufferSize; |
| dataLength = handle->ringBuffer.ringBufferSize - 1U - dataLength; |
| |
| (void)SerialManager_StartReading(handle, readHandle, NULL, dataLength); |
| |
| if (NULL != receivedLength) |
| { |
| *receivedLength = serialReadHandle->transfer.soFar; |
| serialReadHandle->transfer.buffer = NULL; |
| EnableGlobalIRQ(primask); |
| } |
| else |
| { |
| if (serialReadHandle->transfer.soFar >= serialReadHandle->transfer.length) |
| { |
| serialReadHandle->transfer.buffer = NULL; |
| EnableGlobalIRQ(primask); |
| if (kSerialManager_TransmissionNonBlocking == mode) |
| { |
| if (NULL != serialReadHandle->callback) |
| { |
| serial_manager_callback_message_t msg; |
| msg.buffer = buffer; |
| msg.length = serialReadHandle->transfer.soFar; |
| serialReadHandle->callback(serialReadHandle->callbackParam, &msg, kStatus_SerialManager_Success); |
| } |
| } |
| } |
| else |
| { |
| EnableGlobalIRQ(primask); |
| } |
| |
| if (kSerialManager_TransmissionBlocking == mode) |
| { |
| while (serialReadHandle->transfer.length > serialReadHandle->transfer.soFar) |
| { |
| } |
| } |
| } |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| #else |
| |
| static serial_manager_status_t SerialManager_Write(serial_write_handle_t writeHandle, uint8_t *buffer, uint32_t length) |
| { |
| serial_manager_write_handle_t *serialWriteHandle; |
| serial_manager_handle_t *handle; |
| |
| assert(writeHandle); |
| assert(buffer); |
| assert(length); |
| |
| serialWriteHandle = (serial_manager_write_handle_t *)writeHandle; |
| handle = serialWriteHandle->serialManagerHandle; |
| |
| assert(handle); |
| |
| return SerialManager_StartWriting(handle, serialWriteHandle, buffer, length); |
| } |
| |
| static serial_manager_status_t SerialManager_Read(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length) |
| { |
| serial_manager_read_handle_t *serialReadHandle; |
| serial_manager_handle_t *handle; |
| |
| assert(readHandle); |
| assert(buffer); |
| assert(length); |
| |
| serialReadHandle = (serial_manager_read_handle_t *)readHandle; |
| handle = serialReadHandle->serialManagerHandle; |
| |
| assert(handle); |
| |
| return SerialManager_StartReading(handle, serialReadHandle, buffer, length); |
| } |
| #endif |
| |
| serial_manager_status_t SerialManager_Init(serial_handle_t serialHandle, serial_manager_config_t *config) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| |
| assert(config); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| assert(config->ringBuffer); |
| assert(config->ringBufferSize); |
| #endif |
| assert(serialHandle); |
| assert(SERIAL_MANAGER_HANDLE_SIZE >= sizeof(serial_manager_handle_t)); |
| |
| handle = (serial_manager_handle_t *)serialHandle; |
| |
| (void)memset(handle, 0, SERIAL_MANAGER_HANDLE_SIZE); |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| |
| COMMON_TASK_init(); |
| |
| #else |
| if (KOSA_StatusSuccess != OSA_EventCreate((osa_event_handle_t)handle->event, true)) |
| { |
| return kStatus_SerialManager_Error; |
| } |
| |
| if (KOSA_StatusSuccess != OSA_TaskCreate((osa_task_handle_t)handle->taskId, OSA_TASK(SerialManager_Task), handle)) |
| { |
| return kStatus_SerialManager_Error; |
| } |
| #endif |
| |
| #endif |
| |
| #endif |
| |
| handle->type = config->type; |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| handle->ringBuffer.ringBuffer = config->ringBuffer; |
| handle->ringBuffer.ringBufferSize = config->ringBufferSize; |
| #endif |
| |
| switch (config->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| status = Serial_UartInit(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), config->portConfig); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| if ((serial_manager_status_t)kStatus_SerialManager_Success == status) |
| { |
| status = Serial_UartInstallTxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_TxCallback, handle); |
| if ((serial_manager_status_t)kStatus_SerialManager_Success == status) |
| { |
| status = Serial_UartInstallRxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_RxCallback, handle); |
| } |
| } |
| #endif |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| status = Serial_UsbCdcInit(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), config->portConfig); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| if (kStatus_SerialManager_Success == status) |
| { |
| status = Serial_UsbCdcInstallTxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_TxCallback, handle); |
| if (kStatus_SerialManager_Success == status) |
| { |
| status = Serial_UsbCdcInstallRxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_RxCallback, handle); |
| } |
| } |
| #endif |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| status = Serial_SwoInit(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), config->portConfig); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| if (kStatus_SerialManager_Success == status) |
| { |
| status = Serial_SwoInstallTxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_TxCallback, handle); |
| } |
| #endif |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| status = Serial_UsbCdcVirtualInit(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), config->portConfig); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| if (kStatus_SerialManager_Success == status) |
| { |
| status = Serial_UsbCdcVirtualInstallTxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_TxCallback, handle); |
| if (kStatus_SerialManager_Success == status) |
| { |
| status = Serial_UsbCdcVirtualInstallRxCallback(((serial_handle_t)&handle->lowLevelhandleBuffer[0]), |
| SerialManager_RxCallback, handle); |
| } |
| } |
| #endif |
| break; |
| #endif |
| default: |
| /*MISRA rule 16.4*/ |
| break; |
| } |
| |
| return status; |
| } |
| |
| serial_manager_status_t SerialManager_Deinit(serial_handle_t serialHandle) |
| { |
| serial_manager_handle_t *handle; |
| uint32_t primask; |
| |
| assert(serialHandle); |
| |
| handle = (serial_manager_handle_t *)serialHandle; |
| |
| primask = DisableGlobalIRQ(); |
| if ((NULL != handle->openedReadHandleHead) || (0U != handle->openedWriteHandleCount)) |
| { |
| EnableGlobalIRQ(primask); |
| return kStatus_SerialManager_Busy; |
| } |
| EnableGlobalIRQ(primask); |
| |
| switch (handle->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| (void)Serial_UartDeinit(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| (void)Serial_UsbCdcDeinit(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| (void)Serial_SwoDeinit(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| (void)Serial_UsbCdcVirtualDeinit(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| default: |
| /*MISRA rule 16.4*/ |
| break; |
| } |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| #else |
| OSA_EventDestroy((osa_event_handle_t)handle->event); |
| OSA_TaskDestroy((osa_task_handle_t)handle->taskId); |
| #endif |
| |
| #endif |
| |
| #endif |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_OpenWriteHandle(serial_handle_t serialHandle, serial_write_handle_t writeHandle) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_write_handle_t *serialWriteHandle; |
| uint32_t primask; |
| |
| assert(serialHandle); |
| assert(writeHandle); |
| assert(SERIAL_MANAGER_WRITE_HANDLE_SIZE >= sizeof(serial_manager_write_handle_t)); |
| |
| handle = (serial_manager_handle_t *)serialHandle; |
| serialWriteHandle = (serial_manager_write_handle_t *)writeHandle; |
| |
| (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_HANDLE_SIZE); |
| |
| primask = DisableGlobalIRQ(); |
| handle->openedWriteHandleCount++; |
| EnableGlobalIRQ(primask); |
| |
| serialWriteHandle->serialManagerHandle = handle; |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| serialWriteHandle->tag = SERIAL_MANAGER_WRITE_TAG; |
| #endif |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_CloseWriteHandle(serial_write_handle_t writeHandle) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_write_handle_t *serialWriteHandle; |
| uint32_t primask; |
| |
| assert(writeHandle); |
| |
| serialWriteHandle = (serial_manager_write_handle_t *)writeHandle; |
| handle = (serial_manager_handle_t *)(void *)serialWriteHandle->serialManagerHandle; |
| |
| assert(handle); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag); |
| #endif |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| (void)SerialManager_CancelWriting(writeHandle); |
| #endif |
| primask = DisableGlobalIRQ(); |
| if (handle->openedWriteHandleCount > 0U) |
| { |
| handle->openedWriteHandleCount--; |
| } |
| EnableGlobalIRQ(primask); |
| |
| (void)memset(writeHandle, 0, SERIAL_MANAGER_WRITE_HANDLE_SIZE); |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_OpenReadHandle(serial_handle_t serialHandle, serial_read_handle_t readHandle) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_read_handle_t *serialReadHandle; |
| uint32_t primask; |
| |
| assert(serialHandle); |
| assert(readHandle); |
| assert(SERIAL_MANAGER_READ_HANDLE_SIZE >= sizeof(serial_manager_read_handle_t)); |
| |
| handle = (serial_manager_handle_t *)serialHandle; |
| serialReadHandle = (serial_manager_read_handle_t *)readHandle; |
| |
| primask = DisableGlobalIRQ(); |
| if (handle->openedReadHandleHead != NULL) |
| { |
| EnableGlobalIRQ(primask); |
| return kStatus_SerialManager_Busy; |
| } |
| handle->openedReadHandleHead = serialReadHandle; |
| EnableGlobalIRQ(primask); |
| |
| (void)memset(readHandle, 0, SERIAL_MANAGER_READ_HANDLE_SIZE); |
| |
| serialReadHandle->serialManagerHandle = handle; |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| serialReadHandle->tag = SERIAL_MANAGER_READ_TAG; |
| #endif |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_CloseReadHandle(serial_read_handle_t readHandle) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_read_handle_t *serialReadHandle; |
| uint32_t primask; |
| |
| assert(readHandle); |
| |
| serialReadHandle = (serial_manager_read_handle_t *)readHandle; |
| handle = (serial_manager_handle_t *)(void *)serialReadHandle->serialManagerHandle; |
| |
| assert((NULL != handle) && (handle->openedReadHandleHead == serialReadHandle)); |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag); |
| #endif |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| (void)SerialManager_CancelReading(readHandle); |
| #endif |
| |
| primask = DisableGlobalIRQ(); |
| handle->openedReadHandleHead = NULL; |
| EnableGlobalIRQ(primask); |
| |
| (void)memset(readHandle, 0, SERIAL_MANAGER_READ_HANDLE_SIZE); |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_WriteBlocking(serial_write_handle_t writeHandle, uint8_t *buffer, uint32_t length) |
| { |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| return SerialManager_Write(writeHandle, buffer, length, kSerialManager_TransmissionBlocking); |
| #else |
| return SerialManager_Write(writeHandle, buffer, length); |
| #endif |
| } |
| |
| serial_manager_status_t SerialManager_ReadBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length) |
| { |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionBlocking, NULL); |
| #else |
| return SerialManager_Read(readHandle, buffer, length); |
| #endif |
| } |
| |
| #if (defined(SERIAL_MANAGER_NON_BLOCKING_MODE) && (SERIAL_MANAGER_NON_BLOCKING_MODE > 0U)) |
| serial_manager_status_t SerialManager_WriteNonBlocking(serial_write_handle_t writeHandle, |
| uint8_t *buffer, |
| uint32_t length) |
| { |
| return SerialManager_Write(writeHandle, buffer, length, kSerialManager_TransmissionNonBlocking); |
| } |
| |
| serial_manager_status_t SerialManager_ReadNonBlocking(serial_read_handle_t readHandle, uint8_t *buffer, uint32_t length) |
| { |
| return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionNonBlocking, NULL); |
| } |
| |
| serial_manager_status_t SerialManager_CancelWriting(serial_write_handle_t writeHandle) |
| { |
| serial_manager_write_handle_t *serialWriteHandle; |
| uint32_t primask; |
| uint8_t isNotUsed = 0; |
| |
| assert(writeHandle); |
| |
| serialWriteHandle = (serial_manager_write_handle_t *)writeHandle; |
| |
| assert(serialWriteHandle->serialManagerHandle); |
| assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag); |
| |
| if ((NULL != serialWriteHandle->transfer.buffer) && |
| (kSerialManager_TransmissionBlocking == serialWriteHandle->transfer.mode)) |
| { |
| return kStatus_SerialManager_Error; |
| } |
| |
| primask = DisableGlobalIRQ(); |
| if (serialWriteHandle != (serial_manager_write_handle_t *)(void *)LIST_GetHead( |
| &serialWriteHandle->serialManagerHandle->runningWriteHandleHead)) |
| { |
| (void)LIST_RemoveElement(&serialWriteHandle->link); |
| isNotUsed = 1; |
| } |
| EnableGlobalIRQ(primask); |
| |
| if (0U != isNotUsed) |
| { |
| serialWriteHandle->transfer.soFar = 0; |
| serialWriteHandle->transfer.status = kStatus_SerialManager_Canceled; |
| |
| SerialManager_AddTail(&serialWriteHandle->serialManagerHandle->completedWriteHandleHead, serialWriteHandle); |
| #if defined(OSA_USED) |
| |
| #if (defined(SERIAL_MANAGER_USE_COMMON_TASK) && (SERIAL_MANAGER_USE_COMMON_TASK > 0U)) |
| serialWriteHandle->serialManagerHandle->commontaskMsg.callback = SerialManager_Task; |
| serialWriteHandle->serialManagerHandle->commontaskMsg.callbackParam = serialWriteHandle->serialManagerHandle; |
| COMMON_TASK_post_message(&serialWriteHandle->serialManagerHandle->commontaskMsg); |
| #else |
| (void)OSA_EventSet((osa_event_handle_t)serialWriteHandle->serialManagerHandle->event, SERIAL_EVENT_DATA_SENT); |
| #endif |
| |
| #else |
| SerialManager_Task(serialWriteHandle->serialManagerHandle); |
| #endif |
| } |
| else |
| { |
| switch (serialWriteHandle->serialManagerHandle->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| (void)Serial_UartCancelWrite( |
| ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| (void)Serial_UsbCdcCancelWrite( |
| ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| (void)Serial_SwoCancelWrite( |
| ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| (void)Serial_UsbCdcVirtualCancelWrite( |
| ((serial_handle_t)&serialWriteHandle->serialManagerHandle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| default: |
| /*MISRA rule 16.4*/ |
| break; |
| } |
| } |
| |
| (void)SerialManager_StartWriting(serialWriteHandle->serialManagerHandle); |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_CancelReading(serial_read_handle_t readHandle) |
| { |
| serial_manager_read_handle_t *serialReadHandle; |
| serial_manager_callback_message_t msg; |
| uint8_t *buffer; |
| uint32_t primask; |
| |
| assert(readHandle); |
| |
| serialReadHandle = (serial_manager_read_handle_t *)readHandle; |
| |
| assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag); |
| |
| if ((NULL != serialReadHandle->transfer.buffer) && |
| (kSerialManager_TransmissionBlocking == serialReadHandle->transfer.mode)) |
| { |
| return kStatus_SerialManager_Error; |
| } |
| |
| primask = DisableGlobalIRQ(); |
| buffer = serialReadHandle->transfer.buffer; |
| serialReadHandle->transfer.buffer = NULL; |
| serialReadHandle->transfer.length = 0; |
| msg.buffer = buffer; |
| msg.length = serialReadHandle->transfer.soFar; |
| EnableGlobalIRQ(primask); |
| |
| if (NULL != buffer) |
| { |
| if (NULL != serialReadHandle->callback) |
| { |
| serialReadHandle->callback(serialReadHandle->callbackParam, &msg, kStatus_SerialManager_Canceled); |
| } |
| } |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_TryRead(serial_read_handle_t readHandle, |
| uint8_t *buffer, |
| uint32_t length, |
| uint32_t *receivedLength) |
| { |
| assert(receivedLength); |
| |
| return SerialManager_Read(readHandle, buffer, length, kSerialManager_TransmissionBlocking, receivedLength); |
| } |
| |
| serial_manager_status_t SerialManager_InstallTxCallback(serial_write_handle_t writeHandle, |
| serial_manager_callback_t callback, |
| void *callbackParam) |
| { |
| serial_manager_write_handle_t *serialWriteHandle; |
| |
| assert(writeHandle); |
| |
| serialWriteHandle = (serial_manager_write_handle_t *)writeHandle; |
| |
| assert(SERIAL_MANAGER_WRITE_TAG == serialWriteHandle->tag); |
| |
| serialWriteHandle->callbackParam = callbackParam; |
| serialWriteHandle->callback = callback; |
| |
| return kStatus_SerialManager_Success; |
| } |
| |
| serial_manager_status_t SerialManager_InstallRxCallback(serial_read_handle_t readHandle, |
| serial_manager_callback_t callback, |
| void *callbackParam) |
| { |
| serial_manager_read_handle_t *serialReadHandle; |
| |
| assert(readHandle); |
| |
| serialReadHandle = (serial_manager_read_handle_t *)readHandle; |
| |
| assert(SERIAL_MANAGER_READ_TAG == serialReadHandle->tag); |
| |
| serialReadHandle->callbackParam = callbackParam; |
| serialReadHandle->callback = callback; |
| |
| return kStatus_SerialManager_Success; |
| } |
| #endif |
| |
| serial_manager_status_t SerialManager_EnterLowpower(serial_handle_t serialHandle) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| |
| assert(serialHandle); |
| |
| handle = (serial_manager_handle_t *)serialHandle; |
| |
| switch (handle->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| status = Serial_UartEnterLowpower(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| break; |
| #endif |
| default: |
| /*MISRA rule 16.4*/ |
| break; |
| } |
| return status; |
| } |
| |
| serial_manager_status_t SerialManager_ExitLowpower(serial_handle_t serialHandle) |
| { |
| serial_manager_handle_t *handle; |
| serial_manager_status_t status = kStatus_SerialManager_Error; |
| |
| assert(serialHandle); |
| |
| handle = (serial_manager_handle_t *)serialHandle; |
| |
| switch (handle->type) |
| { |
| #if (defined(SERIAL_PORT_TYPE_UART) && (SERIAL_PORT_TYPE_UART > 0U)) |
| case kSerialPort_Uart: |
| status = Serial_UartExitLowpower(((serial_handle_t)&handle->lowLevelhandleBuffer[0])); |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC) && (SERIAL_PORT_TYPE_USBCDC > 0U)) |
| case kSerialPort_UsbCdc: |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_SWO) && (SERIAL_PORT_TYPE_SWO > 0U)) |
| case kSerialPort_Swo: |
| break; |
| #endif |
| #if (defined(SERIAL_PORT_TYPE_USBCDC_VIRTUAL) && (SERIAL_PORT_TYPE_USBCDC_VIRTUAL > 0U)) |
| case kSerialPort_UsbCdcVirtual: |
| break; |
| #endif |
| default: |
| /*MISRA rule 16.4*/ |
| break; |
| } |
| return status; |
| } |