diff options
Diffstat (limited to 'platforms/chibios/drivers/uart_serial.c')
-rw-r--r-- | platforms/chibios/drivers/uart_serial.c | 65 |
1 files changed, 65 insertions, 0 deletions
diff --git a/platforms/chibios/drivers/uart_serial.c b/platforms/chibios/drivers/uart_serial.c new file mode 100644 index 0000000000..6aff4eae47 --- /dev/null +++ b/platforms/chibios/drivers/uart_serial.c @@ -0,0 +1,65 @@ +// Copyright 2024 Stefan Kerkmann (@KarlK90) +// Copyright 2021 QMK +// SPDX-License-Identifier: GPL-2.0-or-later + +#include "uart.h" + +#if defined(MCU_KINETIS) +static SerialConfig serialConfig = {SERIAL_DEFAULT_BITRATE}; +#elif defined(WB32F3G71xx) || defined(WB32FQ95xx) +static SerialConfig serialConfig = { + SERIAL_DEFAULT_BITRATE, UART_WRDLEN, UART_STPBIT, UART_PARITY, UART_ATFLCT, +}; +#else +static SerialConfig serialConfig = { + SERIAL_DEFAULT_BITRATE, + UART_CR1, + UART_CR2, + UART_CR3, +}; +#endif + +void uart_init(uint32_t baud) { + static bool is_initialised = false; + + if (is_initialised) { + return; + } + is_initialised = true; + +#if defined(MCU_KINETIS) + serialConfig.sc_speed = baud; +#else + serialConfig.speed = baud; +#endif + +#if defined(USE_GPIOV1) + palSetLineMode(UART_TX_PIN, UART_TX_PAL_MODE); + palSetLineMode(UART_RX_PIN, UART_RX_PAL_MODE); +#else + palSetLineMode(UART_TX_PIN, PAL_MODE_ALTERNATE(UART_TX_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); + palSetLineMode(UART_RX_PIN, PAL_MODE_ALTERNATE(UART_RX_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); +#endif + + sdStart(&UART_DRIVER, &serialConfig); +} + +void uart_write(uint8_t data) { + sdPut(&UART_DRIVER, data); +} + +uint8_t uart_read(void) { + return (uint8_t)sdGet(&UART_DRIVER); +} + +void uart_transmit(const uint8_t *data, uint16_t length) { + sdWrite(&UART_DRIVER, data, length); +} + +void uart_receive(uint8_t *data, uint16_t length) { + sdRead(&UART_DRIVER, data, length); +} + +bool uart_available(void) { + return !sdGetWouldBlock(&UART_DRIVER); +} |