Skip to content

Commit fbe4c1a

Browse files
committed
drivers: serial: Added support for raspberry pi
Added a serial driver for the RP2040. Only polling API is supported. Signed-off-by: Yonatan Schachter <yonatan.schachter@gmail.com>
1 parent e766ae8 commit fbe4c1a

File tree

13 files changed

+145
-0
lines changed

13 files changed

+145
-0
lines changed

CODEOWNERS

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -335,6 +335,7 @@
335335
/drivers/serial/uart_mcux_iuart.c @Mani-Sadhasivam
336336
/drivers/serial/Kconfig.rtt @carlescufi @pkral78
337337
/drivers/serial/uart_rtt.c @carlescufi @pkral78
338+
/drivers/serial/*rpi_pico* @yonsch
338339
/drivers/serial/Kconfig.xlnx @wjliang
339340
/drivers/serial/uart_xlnx_ps.c @wjliang
340341
/drivers/serial/uart_xlnx_uartlite.c @henrikbrixandersen

boards/arm/raspberrypi_pico/doc/index.rst

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,4 +45,5 @@ hardware features:
4545
+-----------+------------+----------------------+
4646
| Interface | Controller | Driver/Component |
4747
+===========+============+======================+
48+
| UART | on-chip | serial port |
4849
+-----------+------------+----------------------+

boards/arm/raspberrypi_pico/raspberrypi_pico-pinctrl.dtsi

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,4 +6,13 @@
66
#include <dt-bindings/pinctrl/rp2040-pinctrl.h>
77

88
&pinctrl {
9+
uart0_default: uart0_default {
10+
group1 {
11+
pinmux = <UART0_TX_P0>;
12+
};
13+
group2 {
14+
pinmux = <UART0_RX_P1>;
15+
input-enable;
16+
};
17+
};
918
};

boards/arm/raspberrypi_pico/raspberrypi_pico.dts

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
chosen {
1414
zephyr,sram = &sram0;
1515
zephyr,flash = &flash0;
16+
zephyr,console = &uart0;
1617
};
1718
};
1819

@@ -22,3 +23,10 @@
2223
*/
2324
reg = <0x10000100 0x001fff00>;
2425
};
26+
27+
&uart0 {
28+
current-speed = <115200>;
29+
status = "okay";
30+
pinctrl-0 = <&uart0_default>;
31+
pinctrl-names = "default";
32+
};

boards/arm/raspberrypi_pico/raspberrypi_pico.yaml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,3 +8,5 @@ toolchain:
88
- zephyr
99
- gnuarmemb
1010
- xtools
11+
supported:
12+
- serial
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,6 @@
11
CONFIG_SOC_SERIES_RP2XXX=y
22
CONFIG_SOC_RP2040=y
33
CONFIG_SYS_CLOCK_HW_CYCLES_PER_SEC=125000000
4+
CONFIG_SERIAL=y
5+
CONFIG_CONSOLE=y
6+
CONFIG_UART_CONSOLE=y

drivers/serial/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ zephyr_library_sources_ifdef(CONFIG_UART_SAM0 uart_sam0.c)
3232
zephyr_library_sources_ifdef(CONFIG_UART_PSOC6 uart_psoc6.c)
3333
zephyr_library_sources_ifdef(CONFIG_UART_PL011 uart_pl011.c)
3434
zephyr_library_sources_ifdef(CONFIG_UART_RV32M1_LPUART uart_rv32m1_lpuart.c)
35+
zephyr_library_sources_ifdef(CONFIG_UART_RPI_PICO uart_rpi_pico.c)
3536
zephyr_library_sources_ifdef(CONFIG_UART_LITEUART uart_liteuart.c)
3637
zephyr_library_sources_ifdef(CONFIG_UART_RTT_DRIVER uart_rtt.c)
3738
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
@@ -159,6 +159,8 @@ source "drivers/serial/Kconfig.pl011"
159159

160160
source "drivers/serial/Kconfig.rv32m1_lpuart"
161161

162+
source "drivers/serial/Kconfig.rpi_pico"
163+
162164
source "drivers/serial/Kconfig.litex"
163165

164166
source "drivers/serial/Kconfig.rtt"

drivers/serial/Kconfig.rpi_pico

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_RPI_PICO
5+
bool "Raspberry Pi UART driver"
6+
select SERIAL_HAS_DRIVER

drivers/serial/uart_rpi_pico.c

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,76 @@
1+
/*
2+
* Copyright (c) 2021, Yonatan Schachter
3+
*
4+
* SPDX-License-Identifier: Apache-2.0
5+
*/
6+
7+
#include <drivers/uart.h>
8+
#include <drivers/pinctrl.h>
9+
10+
#pragma GCC diagnostic push
11+
#pragma GCC diagnostic ignored "-Wunused-function"
12+
#include <hardware/uart.h>
13+
#include <hardware/gpio.h>
14+
#pragma GCC diagnostic pop
15+
16+
struct uart_rpi_config {
17+
uart_inst_t *const uart_dev;
18+
uint32_t baudrate;
19+
const struct pinctrl_dev_config *pcfg;
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+
30+
*c = (unsigned char)uart_get_hw(config->uart_dev)->dr;
31+
return 0;
32+
}
33+
34+
static void uart_rpi_poll_out(const struct device *dev, unsigned char c)
35+
{
36+
const struct uart_rpi_config *config = dev->config;
37+
38+
uart_putc_raw(config->uart_dev, c);
39+
}
40+
41+
static int uart_rpi_init(const struct device *dev)
42+
{
43+
const struct uart_rpi_config *config = dev->config;
44+
int ret;
45+
46+
ret = pinctrl_apply_state(config->pcfg, PINCTRL_STATE_DEFAULT);
47+
if (ret < 0) {
48+
return ret;
49+
}
50+
51+
return !uart_init(config->uart_dev, config->baudrate);
52+
}
53+
54+
static const struct uart_driver_api uart_rpi_driver_api = {
55+
.poll_in = uart_rpi_poll_in,
56+
.poll_out = uart_rpi_poll_out,
57+
};
58+
59+
#define DT_DRV_COMPAT raspberrypi_pico_uart
60+
61+
#define RPI_UART_INIT(idx) \
62+
PINCTRL_DT_INST_DEFINE(idx); \
63+
static const struct uart_rpi_config uart_rpi_cfg_##idx = { \
64+
.uart_dev = (uart_inst_t *)DT_INST_REG_ADDR(idx), \
65+
.baudrate = DT_INST_PROP(idx, current_speed), \
66+
.pcfg = PINCTRL_DT_INST_DEV_CONFIG_GET(idx), \
67+
}; \
68+
\
69+
DEVICE_DT_INST_DEFINE(idx, &uart_rpi_init, \
70+
NULL, \
71+
NULL, \
72+
&uart_rpi_cfg_##idx, PRE_KERNEL_1, \
73+
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
74+
&uart_rpi_driver_api);
75+
76+
DT_INST_FOREACH_STATUS_OKAY(RPI_UART_INIT)

0 commit comments

Comments
 (0)