summaryrefslogtreecommitdiff
path: root/platforms/chibios/drivers/uart.h
blob: c1945575f1331a513f53c9cd1e849fc2889c5619 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
// Copyright 2024 Stefan Kerkmann
// Copyright 2021 QMK
// Copyright 2024 Stefan Kerkmann
// SPDX-License-Identifier: GPL-2.0-or-later

#pragma once

#include <stdint.h>
#include <stdbool.h>

#include <hal.h>

#include "gpio.h"
#include "chibios_config.h"

// ======== DEPRECATED DEFINES - DO NOT USE ========
#ifdef SERIAL_DRIVER
#    define UART_DRIVER SERIAL_DRIVER
#endif
#ifdef SD1_TX_PIN
#    define UART_TX_PIN SD1_TX_PIN
#endif
#ifdef SD1_RX_PIN
#    define UART_RX_PIN SD1_RX_PIN
#endif
#ifdef SD1_CTS_PIN
#    define UART_CTS_PIN SD1_CTS_PIN
#endif
#ifdef SD1_RTS_PIN
#    define UART_RTS_PIN SD1_RTS_PIN
#endif
#ifdef SD1_TX_PAL_MODE
#    define UART_TX_PAL_MODE SD1_TX_PAL_MODE
#endif
#ifdef SD1_RX_PAL_MODE
#    define UART_RX_PAL_MODE SD1_RX_PAL_MODE
#endif
#ifdef SD1_CTS_PAL_MODE
#    define UART_RTS_PAL_MODE SD1_CTS_PAL_MODE
#endif
#ifdef SD1_RTS_PAL_MODE
#    define UART_TX_PAL_MODE SD1_RTS_PAL_MODE
#endif
#ifdef SD1_CR1
#    define UART_CR1 SD1_CR1
#endif
#ifdef SD1_CR2
#    define UART_CR2 SD1_CR2
#endif
#ifdef SD1_CR3
#    define UART_CR3 SD1_CR3
#endif
#ifdef SD1_WRDLEN
#    define UART_WRDLEN SD1_WRDLEN
#endif
#ifdef SD1_STPBIT
#    define UART_STPBIT SD1_STPBIT
#endif
#ifdef SD1_PARITY
#    define UART_PARITY SD1_PARITY
#endif
#ifdef SD1_ATFLCT
#    define UART_ATFLCT SD1_ATFLCT
#endif
// ========

#ifndef UART_DRIVER
#    if (HAL_USE_SERIAL == TRUE)
#        define UART_DRIVER SD1
#    elif (HAL_USE_SIO == TRUE)
#        define UART_DRIVER SIOD1
#    endif
#endif

#ifndef UART_TX_PIN
#    define UART_TX_PIN A9
#endif

#ifndef UART_RX_PIN
#    define UART_RX_PIN A10
#endif

#ifndef UART_CTS_PIN
#    define UART_CTS_PIN A11
#endif

#ifndef UART_RTS_PIN
#    define UART_RTS_PIN A12
#endif

#ifdef USE_GPIOV1
#    ifndef UART_TX_PAL_MODE
#        define UART_TX_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
#    endif
#    ifndef UART_RX_PAL_MODE
#        define UART_RX_PAL_MODE PAL_MODE_INPUT
#    endif
#    ifndef UART_CTS_PAL_MODE
#        define UART_CTS_PAL_MODE PAL_MODE_INPUT
#    endif
#    ifndef UART_RTS_PAL_MODE
#        define UART_RTS_PAL_MODE PAL_MODE_ALTERNATE_PUSHPULL
#    endif
#else
#    ifndef UART_TX_PAL_MODE
#        define UART_TX_PAL_MODE 7
#    endif

#    ifndef UART_RX_PAL_MODE
#        define UART_RX_PAL_MODE 7
#    endif

#    ifndef UART_CTS_PAL_MODE
#        define UART_CTS_PAL_MODE 7
#    endif

#    ifndef UART_RTS_PAL_MODE
#        define UART_RTS_PAL_MODE 7
#    endif
#endif

#ifndef UART_CR1
#    define UART_CR1 0
#endif

#ifndef UART_CR2
#    define UART_CR2 0
#endif

#ifndef UART_CR3
#    define UART_CR3 0
#endif

#ifndef UART_WRDLEN
#    define UART_WRDLEN 3
#endif

#ifndef UART_STPBIT
#    define UART_STPBIT 0
#endif

#ifndef UART_PARITY
#    define UART_PARITY 0
#endif

#ifndef UART_ATFLCT
#    define UART_ATFLCT 0
#endif

/**
 * @brief Initialize the UART driver. This function must be called only once,
 * before any of the below functions can be called.
 *
 * @param baud The baud rate to transmit and receive at. This may depend on the
 * device you are communicating with. Common values are 1200, 2400, 4800, 9600,
 * 19200, 38400, 57600, and 115200.
 */
void uart_init(uint32_t baud);

/**
 * @brief Transmit a single byte.
 *
 * @param data The byte to transmit.
 */
void uart_write(uint8_t data);

/**
 * @brief Receive a single byte.
 *
 * @return uint8_t The byte read from the receive buffer. This function will
 * block if the buffer is empty (ie. no data to read).
 */
uint8_t uart_read(void);

/**
 * @brief Transmit multiple bytes.
 *
 * @param data A pointer to the data to write from.
 * @param length The number of bytes to write. Take care not to overrun the
 * length of `data`.
 */
void uart_transmit(const uint8_t *data, uint16_t length);

/**
 * @brief Receive multiple bytes.
 *
 * @param data A pointer to the buffer to read into.
 * @param length The number of bytes to read. Take care not to overrun the
 * length of `data`.
 */
void uart_receive(uint8_t *data, uint16_t length);

/**
 * @brief Return whether the receive buffer contains data. Call this function
 * to determine if `uart_read()` will return data immediately.
 *
 * @return true If there is data available to read.
 * @return false If there is no data available to read.
 */
bool uart_available(void);