blob: 418c754381ab408db1976a05dbffcf486cd3673a [file] [log] [blame]
/*
* Copyright (c) 2015, Freescale Semiconductor, Inc.
* Copyright 2016-2017 NXP
* All rights reserved.
*
* SPDX-License-Identifier: BSD-3-Clause
*/
/* FreeRTOS kernel includes. */
#include "FreeRTOS.h"
#include "task.h"
#include "queue.h"
#include "timers.h"
/* Freescale includes. */
#include "fsl_device_registers.h"
#include "fsl_debug_console.h"
#include "board.h"
#include "fsl_uart_freertos.h"
#include "fsl_uart.h"
#include "pin_mux.h"
#include "clock_config.h"
/*******************************************************************************
* Definitions
******************************************************************************/
#define DEMO_UART UART2
#define DEMO_UART_CLK_FREQ BOARD_DEBUG_UART_CLK_FREQ
#define DEMO_IRQn UART2_IRQn
/* Task priorities. */
#define uart_task_PRIORITY (configMAX_PRIORITIES - 1)
/*******************************************************************************
* Prototypes
******************************************************************************/
static void uart_task(void *pvParameters);
/*******************************************************************************
* Variables
******************************************************************************/
const char *to_send = "FreeRTOS UART driver example!\r\n";
const char *send_ring_overrun = "\r\nRing buffer overrun!\r\n";
const char *send_hardware_overrun = "\r\nHardware buffer overrun!\r\n";
uint8_t background_buffer[32];
uint8_t recv_buffer[4];
uart_rtos_handle_t handle;
struct _uart_handle t_handle;
uart_rtos_config_t uart_config = {
.baudrate = 115200,
.parity = kUART_ParityDisabled,
.stopbits = kUART_OneStopBit,
.buffer = background_buffer,
.buffer_size = sizeof(background_buffer),
};
/*******************************************************************************
* Code
******************************************************************************/
/*!
* @brief Application entry point.
*/
int main(void)
{
/* Init board hardware. */
/* Board specific RDC settings */
BOARD_RdcInit();
BOARD_InitBootPins();
BOARD_BootClockRUN();
BOARD_InitDebugConsole();
BOARD_InitMemory();
NVIC_SetPriority(DEMO_IRQn, 3);
if (xTaskCreate(uart_task, "Uart_task", configMINIMAL_STACK_SIZE + 100, NULL, uart_task_PRIORITY, NULL) != pdPASS)
{
PRINTF("Task creation failed!.\r\n");
while (1)
;
}
vTaskStartScheduler();
for (;;)
;
}
/*!
* @brief Task responsible for loopback.
*/
static void uart_task(void *pvParameters)
{
int error;
size_t n = 0;
uart_config.srcclk = DEMO_UART_CLK_FREQ;
uart_config.base = DEMO_UART;
if (kStatus_Success != UART_RTOS_Init(&handle, &t_handle, &uart_config))
{
vTaskSuspend(NULL);
}
/* Send introduction message. */
if (kStatus_Success != UART_RTOS_Send(&handle, (uint8_t *)to_send, strlen(to_send)))
{
vTaskSuspend(NULL);
}
/* Receive user input and send it back to terminal. */
do
{
error = UART_RTOS_Receive(&handle, recv_buffer, sizeof(recv_buffer), &n);
if (error == kStatus_UART_RxHardwareOverrun)
{
/* Notify about hardware buffer overrun */
if (kStatus_Success !=
UART_RTOS_Send(&handle, (uint8_t *)send_hardware_overrun, strlen(send_hardware_overrun)))
{
vTaskSuspend(NULL);
}
}
if (error == kStatus_UART_RxRingBufferOverrun)
{
/* Notify about ring buffer overrun */
if (kStatus_Success != UART_RTOS_Send(&handle, (uint8_t *)send_ring_overrun, strlen(send_ring_overrun)))
{
vTaskSuspend(NULL);
}
}
if (n > 0)
{
/* send back the received data */
UART_RTOS_Send(&handle, (uint8_t *)recv_buffer, n);
}
} while (kStatus_Success == error);
UART_RTOS_Deinit(&handle);
vTaskSuspend(NULL);
}