1
#include <config/board_config.h>
3
#include <drivers/gpio/gpio.h>
5
extern int clk_enable(char *clk_name);
7
static inline int uart_nr_by_addr(uintptr_t base_addr) {
11
#if defined CONF_UART0_ENABLED
12
case CONF_UART0_REGION_BASE_ADDR:
16
#if defined CONF_UART1_ENABLED
17
case CONF_UART1_REGION_BASE_ADDR:
21
#if defined CONF_UART2_ENABLED
22
case CONF_UART2_REGION_BASE_ADDR:
26
#if defined CONF_UART3_ENABLED
27
case CONF_UART3_REGION_BASE_ADDR:
31
#if defined CONF_UART4_ENABLED
32
case CONF_UART4_REGION_BASE_ADDR:
42
static inline int uart_get_tx_port(int num) {
46
#if defined CONF_UART0_PIN_TX_PORT
48
port = CONF_UART0_PIN_TX_PORT;
51
#if defined CONF_UART1_PIN_TX_PORT
53
port = CONF_UART1_PIN_TX_PORT;
56
#if defined CONF_UART2_PIN_TX_PORT
58
port = CONF_UART2_PIN_TX_PORT;
61
#if defined CONF_UART3_PIN_TX_PORT
63
port = CONF_UART3_PIN_TX_PORT;
66
#if defined CONF_UART4_PIN_TX_PORT
68
port = CONF_UART4_PIN_TX_PORT;
78
static inline int uart_get_tx_pin(int num) {
82
#if defined CONF_UART0_PIN_TX_NR
84
pin = CONF_UART0_PIN_TX_NR;
87
#if defined CONF_UART1_PIN_TX_NR
89
pin = CONF_UART1_PIN_TX_NR;
92
#if defined CONF_UART2_PIN_TX_NR
94
pin = CONF_UART2_PIN_TX_NR;
97
#if defined CONF_UART3_PIN_TX_NR
99
pin = CONF_UART3_PIN_TX_NR;
102
#if defined CONF_UART4_PIN_TX_NR
104
pin = CONF_UART4_PIN_TX_NR;
114
static inline int uart_get_tx_alt(int num) {
118
#if defined CONF_UART0_PIN_TX_AF
120
alt = CONF_UART0_PIN_TX_AF;
123
#if defined CONF_UART1_PIN_TX_AF
125
alt = CONF_UART1_PIN_TX_AF;
128
#if defined CONF_UART2_PIN_TX_AF
130
alt = CONF_UART2_PIN_TX_AF;
133
#if defined CONF_UART3_PIN_TX_AF
135
alt = CONF_UART3_PIN_TX_AF;
138
#if defined CONF_UART4_PIN_TX_NR
140
alt = CONF_UART4_PIN_TX_NR;
150
static inline int uart_get_rx_port(int num) {
154
#if defined CONF_UART0_PIN_RX_PORT
156
port = CONF_UART0_PIN_RX_PORT;
159
#if defined CONF_UART1_PIN_RX_PORT
161
port = CONF_UART1_PIN_RX_PORT;
164
#if defined CONF_UART2_PIN_RX_PORT
166
port = CONF_UART2_PIN_RX_PORT;
169
#if defined CONF_UART3_PIN_RX_PORT
171
port = CONF_UART3_PIN_RX_PORT;
174
#if defined CONF_UART4_PIN_RX_PORT
176
port = CONF_UART4_PIN_RX_PORT;
186
static inline int uart_get_rx_pin(int num) {
190
#if defined CONF_UART0_PIN_RX_NR
192
pin = CONF_UART0_PIN_RX_NR;
195
#if defined CONF_UART1_PIN_RX_NR
197
pin = CONF_UART1_PIN_RX_NR;
200
#if defined CONF_UART2_PIN_RX_NR
202
pin = CONF_UART2_PIN_RX_NR;
205
#if defined CONF_UART3_PIN_RX_NR
207
pin = CONF_UART3_PIN_RX_NR;
210
#if defined CONF_UART4_PIN_RX_NR
212
pin = CONF_UART4_PIN_RX_NR;
222
static inline int uart_get_rx_alt(int num) {
226
#if defined CONF_UART0_PIN_RX_AF
228
alt = CONF_UART0_PIN_RX_AF;
231
#if defined CONF_UART1_PIN_RX_AF
233
alt = CONF_UART1_PIN_RX_AF;
236
#if defined CONF_UART2_PIN_RX_AF
238
alt = CONF_UART2_PIN_RX_AF;
241
#if defined CONF_UART3_PIN_RX_AF
243
alt = CONF_UART3_PIN_RX_AF;
246
#if defined CONF_UART4_PIN_RX_NR
248
alt = CONF_UART4_PIN_RX_NR;
258
static inline void uart_set_pins(int num) {
259
gpio_setup_mode(uart_get_tx_port(num),
260
(1 << uart_get_tx_pin(num)),
261
GPIO_MODE_OUT_ALTERNATE |
262
GPIO_ALTERNATE(uart_get_tx_alt(num)));
264
gpio_setup_mode(uart_get_rx_port(num),
265
(1 << uart_get_rx_pin(num)),
266
GPIO_MODE_OUT_ALTERNATE |
267
GPIO_ALTERNATE(uart_get_tx_alt(num)));
270
static inline int uart_set_clk(int num) {
273
#if defined CONF_UART0_CLK_ENABLE
275
clk_name = CONF_UART0_CLK_ENABLE();
278
#if defined CONF_UART1_CLK_ENABLE
280
clk_name = CONF_UART1_CLK_ENABLE();
283
#if defined CONF_UART2_CLK_ENABLE
285
clk_name = CONF_UART2_CLK_ENABLE();
288
#if defined CONF_UART3_CLK_ENABLE
290
clk_name = CONF_UART3_CLK_ENABLE();
293
#if defined CONF_UART4_CLK_ENABLE
295
clk_name = CONF_UART4_CLK_ENABLE();
302
clk_enable(clk_name);
307
static inline int uart_setup_hw(struct uart *dev) {
308
int uart_num = uart_nr_by_addr(dev->base_addr);
310
uart_set_pins(uart_num);
311
uart_set_clk(uart_num);