summaryrefslogtreecommitdiffstats
path: root/include/drivers/st/stm32_uart.h
blob: 866e1589072e4c10871edf7db9f72448ded572dc (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
/*
 * Copyright (c) 2021-2022, STMicroelectronics - All Rights Reserved
 *
 * SPDX-License-Identifier: BSD-3-Clause
 */

#ifndef STM32_UART_H
#define STM32_UART_H

/* UART word length */
#define STM32_UART_WORDLENGTH_7B		USART_CR1_M1
#define STM32_UART_WORDLENGTH_8B		0x00000000U
#define STM32_UART_WORDLENGTH_9B		USART_CR1_M0

/* UART number of stop bits */
#define STM32_UART_STOPBITS_0_5			USART_CR2_STOP_0
#define STM32_UART_STOPBITS_1			0x00000000U
#define STM32_UART_STOPBITS_1_5			(USART_CR2_STOP_0 | USART_CR2_STOP_1)
#define STM32_UART_STOPBITS_2			USART_CR2_STOP_1

/* UART parity */
#define STM32_UART_PARITY_NONE			0x00000000U
#define STM32_UART_PARITY_EVEN			USART_CR1_PCE
#define STM32_UART_PARITY_ODD			(USART_CR1_PCE | USART_CR1_PS)

/* UART transfer mode */
#define STM32_UART_MODE_RX			USART_CR1_RE
#define STM32_UART_MODE_TX			USART_CR1_TE
#define STM32_UART_MODE_TX_RX			(USART_CR1_TE | USART_CR1_RE)

/* UART hardware flow control */
#define STM32_UART_HWCONTROL_NONE		0x00000000U
#define STM32_UART_HWCONTROL_RTS		USART_CR3_RTSE
#define STM32_UART_HWCONTROL_CTS		USART_CR3_CTSE
#define STM32_UART_HWCONTROL_RTS_CTS		(USART_CR3_RTSE | USART_CR3_CTSE)

/* UART prescaler */
#define STM32_UART_PRESCALER_DIV1		0x00000000U
#define STM32_UART_PRESCALER_DIV2		0x00000001U
#define STM32_UART_PRESCALER_DIV4		0x00000002U
#define STM32_UART_PRESCALER_DIV6		0x00000003U
#define STM32_UART_PRESCALER_DIV8		0x00000004U
#define STM32_UART_PRESCALER_DIV10		0x00000005U
#define STM32_UART_PRESCALER_DIV12		0x00000006U
#define STM32_UART_PRESCALER_DIV16		0x00000007U
#define STM32_UART_PRESCALER_DIV32		0x00000008U
#define STM32_UART_PRESCALER_DIV64		0x00000009U
#define STM32_UART_PRESCALER_DIV128		0x0000000AU
#define STM32_UART_PRESCALER_DIV256		0x0000000BU
#define STM32_UART_PRESCALER_NB			0x0000000CU

/* UART fifo mode */
#define STM32_UART_FIFOMODE_EN			USART_CR1_FIFOEN
#define STM32_UART_FIFOMODE_DIS			0x00000000U

/* UART TXFIFO threshold level */
#define STM32_UART_TXFIFO_THRESHOLD_1EIGHTHFULL		0x00000000U
#define STM32_UART_TXFIFO_THRESHOLD_1QUARTERFUL		USART_CR3_TXFTCFG_0
#define STM32_UART_TXFIFO_THRESHOLD_HALFFULL		USART_CR3_TXFTCFG_1
#define STM32_UART_TXFIFO_THRESHOLD_3QUARTERSFULL	(USART_CR3_TXFTCFG_0 | USART_CR3_TXFTCFG_1)
#define STM32_UART_TXFIFO_THRESHOLD_7EIGHTHFULL		USART_CR3_TXFTCFG_2
#define STM32_UART_TXFIFO_THRESHOLD_EMPTY		(USART_CR3_TXFTCFG_2 | USART_CR3_TXFTCFG_0)

/* UART RXFIFO threshold level */
#define STM32_UART_RXFIFO_THRESHOLD_1EIGHTHFULL		0x00000000U
#define STM32_UART_RXFIFO_THRESHOLD_1QUARTERFULL	USART_CR3_RXFTCFG_0
#define STM32_UART_RXFIFO_THRESHOLD_HALFFULL		USART_CR3_RXFTCFG_1
#define STM32_UART_RXFIFO_THRESHOLD_3QUARTERSFULL	(USART_CR3_RXFTCFG_0 | USART_CR3_RXFTCFG_1)
#define STM32_UART_RXFIFO_THRESHOLD_7EIGHTHFULL		USART_CR3_RXFTCFG_2
#define STM32_UART_RXFIFO_THRESHOLD_FULL		(USART_CR3_RXFTCFG_2 | USART_CR3_RXFTCFG_0)

struct stm32_uart_init_s {
	uint32_t baud_rate;		/*
					 * Configures the UART communication
					 * baud rate.
					 */

	uint32_t word_length;		/*
					 * Specifies the number of data bits
					 * transmitted or received in a frame.
					 * This parameter can be a value of
					 * @ref STM32_UART_WORDLENGTH_*.
					 */

	uint32_t stop_bits;		/*
					 * Specifies the number of stop bits
					 * transmitted. This parameter can be
					 * a value of @ref STM32_UART_STOPBITS_*.
					 */

	uint32_t parity;		/*
					 * Specifies the parity mode.
					 * This parameter can be a value of
					 * @ref STM32_UART_PARITY_*.
					 */

	uint32_t mode;			/*
					 * Specifies whether the receive or
					 * transmit mode is enabled or
					 * disabled. This parameter can be a
					 * value of @ref @ref STM32_UART_MODE_*.
					 */

	uint32_t hw_flow_control;	/*
					 * Specifies whether the hardware flow
					 * control mode is enabled or
					 * disabled. This parameter can be a
					 * value of @ref STM32_UARTHWCONTROL_*.
					 */

	uint32_t one_bit_sampling;	/*
					 * Specifies whether a single sample
					 * or three samples' majority vote is
					 * selected. This parameter can be 0
					 * or USART_CR3_ONEBIT.
					 */

	uint32_t prescaler;		/*
					 * Specifies the prescaler value used
					 * to divide the UART clock source.
					 * This parameter can be a value of
					 * @ref STM32_UART_PRESCALER_*.
					 */

	uint32_t fifo_mode;		/*
					 * Specifies if the FIFO mode will be
					 * used. This parameter can be a value
					 * of @ref STM32_UART_FIFOMODE_*.
					 */

	uint32_t tx_fifo_threshold;	/*
					 * Specifies the TXFIFO threshold
					 * level. This parameter can be a
					 * value of @ref
					 * STM32_UART_TXFIFO_THRESHOLD_*.
					 */

	uint32_t rx_fifo_threshold;	/*
					 * Specifies the RXFIFO threshold
					 * level. This parameter can be a
					 * value of @ref
					 * STM32_UART_RXFIFO_THRESHOLD_*.
					 */
};

struct stm32_uart_handle_s {
	uint32_t base;
	uint32_t rdr_mask;
};

int stm32_uart_init(struct stm32_uart_handle_s *huart,
		    uintptr_t base_addr,
		    const struct stm32_uart_init_s *init);
void stm32_uart_stop(uintptr_t base_addr);
int stm32_uart_putc(struct stm32_uart_handle_s *huart, int c);
int stm32_uart_flush(struct stm32_uart_handle_s *huart);
int stm32_uart_getc(struct stm32_uart_handle_s *huart);

#endif /* STM32_UART_H */