added poll api passthrough

This commit is contained in:
2026-03-11 20:34:44 +01:00
commit 9f05489b3a
13 changed files with 218 additions and 0 deletions

View File

@@ -0,0 +1 @@
add_subdirectory(drivers/serial/uart-interrupt-poll-bridge)

View File

@@ -0,0 +1 @@
rsource "drivers/serial/uart-interrupt-poll-bridge/Kconfig"

View File

@@ -0,0 +1 @@
zephyr_library_sources_ifdef(CONFIG_UART_INTERRUPT_POLL_BRIDGE uart-interrupt-poll-bridge.c)

View File

@@ -0,0 +1,7 @@
config UART_INTERRUPT_POLL_BRIDGE
bool "UART interrupt/poll bridge driver"
default y
config UART_INTERRUPT_POLL_BRIDGE_QUEUE_SIZE
int "UART interrupt/poll bridge driver rx / tx buffer size"
default 256

View File

@@ -0,0 +1,125 @@
#define DT_DRV_COMPAT uart_interrupt_poll_bridge
#include <zephyr/drivers/uart.h>
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
#include <zephyr/sys/ring_buffer.h>
#endif
struct uart_pti_bridge_config {
const struct device *uart;
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
const struct device *timer;
const uint8_t interrupt_line;
#endif
};
struct uart_pti_bridge_data {
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
struct ring_buf *rx_buf;
struct ring_buf *tx_buf;
#endif
};
int uart_pti_bridge_init(const struct device *dev) {
ARG_UNUSED(dev);
return 0;
}
static int uart_pti_bridge_poll_in(const struct device *dev, unsigned char *c) {
const struct uart_pti_bridge_config *config = dev->config;
return uart_poll_in(config->uart, c);
}
static void uart_pti_bridge_poll_out(const struct device *dev,
unsigned char c) {
const struct uart_pti_bridge_config *config = dev->config;
return uart_poll_out(config->uart, c);
}
static int uart_pti_bridge_err_check(const struct device *dev) {
const struct uart_pti_bridge_config *config = dev->config;
return uart_err_check(config->uart);
}
#ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
static int uart_pti_bridge_configure(const struct device *dev,
const struct uart_config *cfg) {
ARG_UNUSED(dev);
ARG_UNUSED(cfg);
return 0;
}
static int uart_pti_bridge_config_get(const struct device *dev,
struct uart_config *cfg) {
const struct uart_pti_bridge_config *config = dev->config;
return uart_config_get(config->uart, cfg);
}
#endif
static DEVICE_API(uart, uart_interrupt_poll_bridge_api) = {
.poll_in = uart_pti_bridge_poll_in,
.poll_out = uart_pti_bridge_poll_out,
.err_check = uart_pti_bridge_err_check,
#ifdef CONFIG_UART_USE_RUNTIME_CONFIGURE
.configure = uart_pti_bridge_configure,
.config_get = uart_pti_bridge_config_get,
#endif
#ifdef CONFIG_UART_INTERRUPT_DRIVEN
.fifo_fill = NULL,
.fifo_read = NULL,
.irq_tx_enable = NULL,
.irq_tx_disable = NULL,
.irq_tx_ready = NULL,
.irq_tx_complete = NULL,
.irq_rx_enable = NULL,
.irq_rx_disable = NULL,
.irq_rx_ready = NULL,
.irq_err_enable = NULL,
.irq_err_disable = NULL,
.irq_is_pending = NULL,
.irq_update = NULL,
.irq_callback_set = NULL,
#endif
};
#define BRIDGE_DEFINE(inst) \
COND_CODE_1(CONFIG_UART_INTERRUPT_DRIVEN, ( \
RING_BUF_DECLARE(uart_pti_bridge_rx_buf##inst, CONFIG_UART_INTERRUPT_POLL_BRIDGE_QUEUE_SIZE); \
RING_BUF_DECLARE(uart_pti_bridge_tx_buf##inst, CONFIG_UART_INTERRUPT_POLL_BRIDGE_QUEUE_SIZE); \
), ()) \
\
static struct uart_pti_bridge_data uart_pti_bridge_data_##inst = { \
COND_CODE_1(CONFIG_UART_INTERRUPT_DRIVEN, ( \
.rx_buf = &uart_pti_bridge_rx_buf##inst, \
.tx_buf = &uart_pti_bridge_tx_buf##inst, \
), ()) \
}; \
\
static const struct uart_pti_bridge_config uart_pti_bridge_config_##inst = { \
.uart = DEVICE_DT_GET(DT_INST_PHANDLE(inst, uart)), \
COND_CODE_1(CONFIG_UART_INTERRUPT_DRIVEN, ( \
.timer = DEVICE_DT_GET(DT_INST_PHANDLE(inst, timer)), \
.interrupt_line = DT_INST_IRQN(inst), \
), ()) \
}; \
\
DEVICE_DT_INST_DEFINE(inst, \
uart_pti_bridge_init, \
NULL, \
&uart_pti_bridge_data_##inst, \
&uart_pti_bridge_config_##inst, \
POST_KERNEL, \
CONFIG_KERNEL_INIT_PRIORITY_DEVICE, \
&uart_interrupt_poll_bridge_api);
DT_INST_FOREACH_STATUS_OKAY(BRIDGE_DEFINE)

View File

@@ -0,0 +1,17 @@
description: Uart interrupt driven api for poll only devices via timer instead of busy cpu time
compatible: "uart-interrupt-poll-bridge"
properties:
interrupt-parent:
type: phandle
required: true
interrupts:
type: array
required: true
timer:
type: phandle
required: true
uart:
type: phandle
required: true

View File

@@ -0,0 +1,8 @@
name: uart-interrupt-poll-bridge
build:
cmake: .
kconfig: Kconfig
settings:
dts_root: .