uart_serial.c (2981B)
1 // Copyright 2024 Stefan Kerkmann (@KarlK90) 2 // Copyright 2021 QMK 3 // SPDX-License-Identifier: GPL-2.0-or-later 4 5 #include "uart.h" 6 #include "gpio.h" 7 #include "chibios_config.h" 8 #include <hal.h> 9 10 #ifndef UART_DRIVER 11 # define UART_DRIVER SD1 12 #endif 13 14 #ifndef UART_TX_PIN 15 # define UART_TX_PIN A9 16 #endif 17 18 #ifndef UART_TX_PAL_MODE 19 # ifdef USE_GPIOV1 20 # define UART_TX_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL 21 # else 22 # define UART_TX_PAL_MODE 7 23 # endif 24 #endif 25 26 #ifndef UART_RX_PIN 27 # define UART_RX_PIN A10 28 #endif 29 30 #ifndef UART_RX_PAL_MODE 31 # ifdef USE_GPIOV1 32 # define UART_RX_PAL_MODE PAL_MODE_INPUT 33 # else 34 # define UART_RX_PAL_MODE 7 35 # endif 36 #endif 37 38 #ifndef UART_CTS_PIN 39 # define UART_CTS_PIN A11 40 #endif 41 42 #ifndef UART_CTS_PAL_MODE 43 # ifdef USE_GPIOV1 44 # define UART_CTS_PAL_MODE PAL_MODE_INPUT 45 # else 46 # define UART_CTS_PAL_MODE 7 47 # endif 48 #endif 49 50 #ifndef UART_RTS_PIN 51 # define UART_RTS_PIN A12 52 #endif 53 54 #ifndef UART_RTS_PAL_MODE 55 # ifdef USE_GPIOV1 56 # define UART_RTS_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL 57 # else 58 # define UART_RTS_PAL_MODE 7 59 # endif 60 #endif 61 62 #ifndef UART_CR1 63 # define UART_CR1 0 64 #endif 65 66 #ifndef UART_CR2 67 # define UART_CR2 0 68 #endif 69 70 #ifndef UART_CR3 71 # define UART_CR3 0 72 #endif 73 74 #ifndef UART_WRDLEN 75 # define UART_WRDLEN 3 76 #endif 77 78 #ifndef UART_STPBIT 79 # define UART_STPBIT 0 80 #endif 81 82 #ifndef UART_PARITY 83 # define UART_PARITY 0 84 #endif 85 86 #ifndef UART_ATFLCT 87 # define UART_ATFLCT 0 88 #endif 89 90 #if defined(MCU_KINETIS) 91 static SerialConfig serialConfig = {SERIAL_DEFAULT_BITRATE}; 92 #elif defined(WB32F3G71xx) || defined(WB32FQ95xx) 93 static SerialConfig serialConfig = { 94 SERIAL_DEFAULT_BITRATE, UART_WRDLEN, UART_STPBIT, UART_PARITY, UART_ATFLCT, 95 }; 96 #else 97 static SerialConfig serialConfig = { 98 SERIAL_DEFAULT_BITRATE, 99 UART_CR1, 100 UART_CR2, 101 UART_CR3, 102 }; 103 #endif 104 105 void uart_init(uint32_t baud) { 106 static bool is_initialised = false; 107 108 if (is_initialised) { 109 return; 110 } 111 is_initialised = true; 112 113 #if defined(MCU_KINETIS) 114 serialConfig.sc_speed = baud; 115 #else 116 serialConfig.speed = baud; 117 #endif 118 119 #if defined(USE_GPIOV1) 120 palSetLineMode(UART_TX_PIN, UART_TX_PAL_MODE); 121 palSetLineMode(UART_RX_PIN, UART_RX_PAL_MODE); 122 #else 123 palSetLineMode(UART_TX_PIN, PAL_MODE_ALTERNATE(UART_TX_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); 124 palSetLineMode(UART_RX_PIN, PAL_MODE_ALTERNATE(UART_RX_PAL_MODE) | PAL_OUTPUT_TYPE_PUSHPULL | PAL_OUTPUT_SPEED_HIGHEST); 125 #endif 126 127 sdStart(&UART_DRIVER, &serialConfig); 128 } 129 130 void uart_write(uint8_t data) { 131 sdPut(&UART_DRIVER, data); 132 } 133 134 uint8_t uart_read(void) { 135 return (uint8_t)sdGet(&UART_DRIVER); 136 } 137 138 void uart_transmit(const uint8_t *data, uint16_t length) { 139 sdWrite(&UART_DRIVER, data, length); 140 } 141 142 void uart_receive(uint8_t *data, uint16_t length) { 143 sdRead(&UART_DRIVER, data, length); 144 } 145 146 bool uart_available(void) { 147 return !sdGetWouldBlock(&UART_DRIVER); 148 }