Skip to content

Commit 77e2610

Browse files
committed
drivers: serial: Added support for raspberry pi
Signed-off-by: Yonatan Schachter <[email protected]>
1 parent a3aca2f commit 77e2610

File tree

6 files changed

+109
-0
lines changed

6 files changed

+109
-0
lines changed

CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -288,6 +288,7 @@
288288
/drivers/serial/uart_mcux_iuart.c @Mani-Sadhasivam
289289
/drivers/serial/Kconfig.rtt @carlescufi @pkral78
290290
/drivers/serial/uart_rtt.c @carlescufi @pkral78
291+
/drivers/serial/uart_raspberrypi.c @yonsch
291292
/drivers/serial/Kconfig.xlnx @wjliang
292293
/drivers/serial/uart_xlnx_ps.c @wjliang
293294
/drivers/serial/uart_xlnx_uartlite.c @henrikbrixandersen

drivers/serial/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ zephyr_library_sources_ifdef(CONFIG_UART_SAM0 uart_sam0.c)
3030
zephyr_library_sources_ifdef(CONFIG_UART_PSOC6 uart_psoc6.c)
3131
zephyr_library_sources_ifdef(CONFIG_UART_PL011 uart_pl011.c)
3232
zephyr_library_sources_ifdef(CONFIG_UART_RV32M1_LPUART uart_rv32m1_lpuart.c)
33+
zephyr_library_sources_ifdef(CONFIG_UART_RASPBERRYPI uart_raspberrypi.c)
3334
zephyr_library_sources_ifdef(CONFIG_UART_LITEUART uart_liteuart.c)
3435
zephyr_library_sources_ifdef(CONFIG_UART_RTT_DRIVER uart_rtt.c)
3536
zephyr_library_sources_ifdef(CONFIG_UART_XLNX_PS uart_xlnx_ps.c)

drivers/serial/Kconfig

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -120,6 +120,8 @@ source "drivers/serial/Kconfig.pl011"
120120

121121
source "drivers/serial/Kconfig.rv32m1_lpuart"
122122

123+
source "drivers/serial/Kconfig.raspberrypi"
124+
123125
source "drivers/serial/Kconfig.litex"
124126

125127
source "drivers/serial/Kconfig.rtt"

drivers/serial/Kconfig.raspberrypi

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
# Copyright (c) 2021 Yonatan Schachter
2+
# SPDX-License-Identifier: Apache-2.0
3+
4+
config UART_RASPBERRYPI
5+
bool "Raspberry Pi UART driver"
6+
select SERIAL_HAS_DRIVER

drivers/serial/uart_raspberrypi.c

Lines changed: 77 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,77 @@
1+
/*
2+
* Copyright (c) 2021, Yonatan Schachter
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <drivers/uart.h>
8+
#include <hardware/uart.h>
9+
#include <hardware/gpio.h>
10+
11+
struct uart_rpi_config {
12+
uart_inst_t *const uart_dev;
13+
uint32_t baudrate;
14+
uint32_t tx_pin;
15+
uint32_t rx_pin;
16+
};
17+
18+
struct uart_rpi_data {
19+
20+
};
21+
22+
static int uart_rpi_poll_in(const struct device *dev, unsigned char *c)
23+
{
24+
const struct uart_rpi_config *config = dev->config;
25+
26+
if (!uart_is_readable(config->uart_dev))
27+
return -1;
28+
29+
*c = (unsigned char)uart_get_hw(config->uart_dev)->dr;
30+
return 0;
31+
}
32+
33+
static void uart_rpi_poll_out(const struct device *dev, unsigned char c)
34+
{
35+
const struct uart_rpi_config *config = dev->config;
36+
37+
uart_putc_raw(config->uart_dev, c);
38+
}
39+
40+
static int uart_rpi_init(const struct device *dev)
41+
{
42+
const struct uart_rpi_config *config = dev->config;
43+
44+
gpio_init(config->tx_pin);
45+
gpio_init(config->rx_pin);
46+
gpio_set_function(config->tx_pin, GPIO_FUNC_UART);
47+
gpio_set_function(config->rx_pin, GPIO_FUNC_UART);
48+
49+
return !uart_init(config->uart_dev, config->baudrate);
50+
}
51+
52+
static const struct uart_driver_api uart_rpi_driver_api = {
53+
.poll_in = uart_rpi_poll_in,
54+
.poll_out = uart_rpi_poll_out,
55+
};
56+
57+
#undef DT_DRV_COMPAT
58+
#define DT_DRV_COMPAT raspberrypi_rp2_uart
59+
60+
#define RPI_UART_INIT(idx) \
61+
static const struct uart_rpi_config uart_rpi_cfg_##idx = { \
62+
.uart_dev = (uart_inst_t *)DT_INST_REG_ADDR(idx), \
63+
.baudrate = DT_INST_PROP(idx, current_speed), \
64+
.tx_pin = DT_INST_PROP(idx, tx_pin), \
65+
.rx_pin = DT_INST_PROP(idx, rx_pin), \
66+
}; \
67+
\
68+
static struct uart_rpi_data uart_rpi_data_##idx; \
69+
\
70+
DEVICE_DT_INST_DEFINE(idx, &uart_rpi_init, \
71+
device_pm_control_nop, \
72+
&uart_rpi_data_##idx, \
73+
&uart_rpi_cfg_##idx, PRE_KERNEL_1, \
74+
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
75+
&uart_rpi_driver_api);
76+
77+
DT_INST_FOREACH_STATUS_OKAY(RPI_UART_INIT)
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
description: Raspberry Pi UART
2+
3+
compatible: "raspberrypi,rp2-uart"
4+
5+
include: uart-controller.yaml
6+
7+
properties:
8+
reg:
9+
required: true
10+
11+
interrupts:
12+
required: true
13+
14+
tx-pin:
15+
type: int
16+
required: true
17+
description: TX pin as a GPIO number
18+
19+
rx-pin:
20+
type: int
21+
required: true
22+
description: RX pin as a GPIO number

0 commit comments

Comments
 (0)