Files
TencentOS-tiny/platform/hal/nxp/mimxrt10xx/src/tos_hal_uart.c
2022-03-01 15:11:30 +08:00

131 lines
3.3 KiB
C

#include "tos_k.h"
#include "tos_hal.h"
#include "fsl_lpuart.h"
/* Definition of the clock source frequency */
#define LPUART_CLOCK_SOURCE 80000000UL
__API__ int tos_hal_uart_init(hal_uart_t *uart, hal_uart_port_t port)
{
status_t status;
lpuart_config_t config;
if (!uart) {
return -1;
}
if (port == HAL_UART_PORT_0) {
// not support.
return -1;
} else if (port == HAL_UART_PORT_1) {
uart->private_uart = LPUART1;
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = 115200;
config.enableTx = true;
config.enableRx = true;
status = LPUART_Init(LPUART1, &config, LPUART_CLOCK_SOURCE);
if (status != kStatus_Success) {
return -1;
}
/* Enable RX interrupt. */
LPUART_EnableInterrupts(LPUART1, kLPUART_RxDataRegFullInterruptEnable);
EnableIRQ(LPUART1_IRQn);
} else if (port == HAL_UART_PORT_2) {
uart->private_uart = LPUART2;
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = 115200;
config.enableTx = true;
config.enableRx = true;
status = LPUART_Init(LPUART2, &config, LPUART_CLOCK_SOURCE);
if (status != kStatus_Success) {
return -1;
}
/* Enable RX interrupt. */
LPUART_EnableInterrupts(LPUART2, kLPUART_RxDataRegFullInterruptEnable);
EnableIRQ(LPUART2_IRQn);
} else if (port == HAL_UART_PORT_3) {
uart->private_uart = LPUART3;
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = 115200;
config.enableTx = true;
config.enableRx = true;
status = LPUART_Init(LPUART3, &config, LPUART_CLOCK_SOURCE);
if (status != kStatus_Success) {
return -1;
}
/* Enable RX interrupt. */
LPUART_EnableInterrupts(LPUART3, kLPUART_RxDataRegFullInterruptEnable);
EnableIRQ(LPUART3_IRQn);
} else if (port == HAL_UART_PORT_4) {
uart->private_uart = LPUART4;
LPUART_GetDefaultConfig(&config);
config.baudRate_Bps = 115200;
config.enableTx = true;
config.enableRx = true;
status = LPUART_Init(LPUART4, &config, LPUART_CLOCK_SOURCE);
if (status != kStatus_Success) {
return -1;
}
/* Enable RX interrupt. */
LPUART_EnableInterrupts(LPUART4, kLPUART_RxDataRegFullInterruptEnable);
EnableIRQ(LPUART4_IRQn);
}
return 0;
}
__API__ int tos_hal_uart_write(hal_uart_t *uart, const uint8_t *buf, size_t size, uint32_t timeout)
{
status_t status;
LPUART_Type *base;
if (!uart || !buf) {
return -1;
}
if (!uart->private_uart) {
return -1;
}
base = (LPUART_Type *)uart->private_uart;
status = LPUART_WriteBlocking(base, (uint8_t *)buf, size);
if (status != kStatus_Success) {
return -1;
}
return 0;
}
__API__ int tos_hal_uart_read(hal_uart_t *uart, const uint8_t *buf, size_t size, uint32_t timeout)
{
return 0;
}
__API__ int tos_hal_uart_deinit(hal_uart_t *uart)
{
LPUART_Type *base;
if (!uart) {
return -1;
}
if (!uart->private_uart) {
return -1;
}
base = (LPUART_Type *)uart->private_uart;
LPUART_Deinit(base);
return 0;
}