aboutsummaryrefslogtreecommitdiff
path: root/drivers/chibios/serial_usart.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/chibios/serial_usart.c')
-rw-r--r--drivers/chibios/serial_usart.c69
1 files changed, 20 insertions, 49 deletions
diff --git a/drivers/chibios/serial_usart.c b/drivers/chibios/serial_usart.c
index 7c81b1646..cae29388c 100644
--- a/drivers/chibios/serial_usart.c
+++ b/drivers/chibios/serial_usart.c
@@ -1,13 +1,20 @@
1#include "quantum.h" 1/* Copyright 2021 QMK
2#include "serial.h" 2 *
3#include "print.h" 3 * This program is free software: you can redistribute it and/or modify
4 4 * it under the terms of the GNU General Public License as published by
5#include <ch.h> 5 * the Free Software Foundation, either version 3 of the License, or
6#include <hal.h> 6 * (at your option) any later version.
7 *
8 * This program is distributed in the hope that it will be useful,
9 * but WITHOUT ANY WARRANTY; without even the implied warranty of
10 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 * GNU General Public License for more details.
12 *
13 * You should have received a copy of the GNU General Public License
14 * along with this program. If not, see <http://www.gnu.org/licenses/>.
15 */
7 16
8#ifndef USART_CR1_M0 17#include "serial_usart.h"
9# define USART_CR1_M0 USART_CR1_M // some platforms (f1xx) dont have this so
10#endif
11 18
12#ifndef USE_GPIOV1 19#ifndef USE_GPIOV1
13// The default PAL alternate modes are used to signal that the pins are used for USART 20// The default PAL alternate modes are used to signal that the pins are used for USART
@@ -20,50 +27,10 @@
20# define SERIAL_USART_DRIVER SD1 27# define SERIAL_USART_DRIVER SD1
21#endif 28#endif
22 29
23#ifndef SERIAL_USART_CR1
24# define SERIAL_USART_CR1 (USART_CR1_PCE | USART_CR1_PS | USART_CR1_M0) // parity enable, odd parity, 9 bit length
25#endif
26
27#ifndef SERIAL_USART_CR2
28# define SERIAL_USART_CR2 (USART_CR2_STOP_1) // 2 stop bits
29#endif
30
31#ifndef SERIAL_USART_CR3
32# define SERIAL_USART_CR3 0
33#endif
34
35#ifdef SOFT_SERIAL_PIN 30#ifdef SOFT_SERIAL_PIN
36# define SERIAL_USART_TX_PIN SOFT_SERIAL_PIN 31# define SERIAL_USART_TX_PIN SOFT_SERIAL_PIN
37#endif 32#endif
38 33
39#ifndef SELECT_SOFT_SERIAL_SPEED
40# define SELECT_SOFT_SERIAL_SPEED 1
41#endif
42
43#ifdef SERIAL_USART_SPEED
44// Allow advanced users to directly set SERIAL_USART_SPEED
45#elif SELECT_SOFT_SERIAL_SPEED == 0
46# define SERIAL_USART_SPEED 460800
47#elif SELECT_SOFT_SERIAL_SPEED == 1
48# define SERIAL_USART_SPEED 230400
49#elif SELECT_SOFT_SERIAL_SPEED == 2
50# define SERIAL_USART_SPEED 115200
51#elif SELECT_SOFT_SERIAL_SPEED == 3
52# define SERIAL_USART_SPEED 57600
53#elif SELECT_SOFT_SERIAL_SPEED == 4
54# define SERIAL_USART_SPEED 38400
55#elif SELECT_SOFT_SERIAL_SPEED == 5
56# define SERIAL_USART_SPEED 19200
57#else
58# error invalid SELECT_SOFT_SERIAL_SPEED value
59#endif
60
61#ifndef SERIAL_USART_TIMEOUT
62# define SERIAL_USART_TIMEOUT 100
63#endif
64
65#define HANDSHAKE_MAGIC 7
66
67static inline msg_t sdWriteHalfDuplex(SerialDriver* driver, uint8_t* data, uint8_t size) { 34static inline msg_t sdWriteHalfDuplex(SerialDriver* driver, uint8_t* data, uint8_t size) {
68 msg_t ret = sdWrite(driver, data, size); 35 msg_t ret = sdWrite(driver, data, size);
69 36
@@ -123,6 +90,10 @@ __attribute__((weak)) void usart_init(void) {
123#else 90#else
124 palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_ALTERNATE(SERIAL_USART_TX_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN); 91 palSetLineMode(SERIAL_USART_TX_PIN, PAL_MODE_ALTERNATE(SERIAL_USART_TX_PAL_MODE) | PAL_STM32_OTYPE_OPENDRAIN);
125#endif 92#endif
93
94#if defined(USART_REMAP)
95 USART_REMAP;
96#endif
126} 97}
127 98
128void usart_master_init(void) { 99void usart_master_init(void) {