Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
23 changes: 21 additions & 2 deletions include/zephyr/modem/backend/uart.h
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,25 @@ struct modem_backend_uart_isr {
uint32_t transmit_buf_put_limit;
};

#if CONFIG_MODEM_BACKEND_UART_ASYNC_HWFC_ENABLED
struct rx_queue_event_t {
uint8_t *buf;
size_t len;
};

struct modem_backend_uart_async {
struct k_mem_slab rx_slab;
struct k_msgq rx_queue;
struct rx_queue_event_t rx_event;
struct rx_queue_event_t rx_queue_buf[CONFIG_MODEM_BACKEND_UART_ASYNC_HWFC_BUFFER_COUNT];
uint32_t rx_buf_size;
uint8_t rx_buf_count;
uint8_t *transmit_buf;
uint32_t transmit_buf_size;
struct k_work rx_disabled_work;
atomic_t state;
};
#else
struct modem_backend_uart_async {
uint8_t *receive_bufs[2];
uint32_t receive_buf_size;
Expand All @@ -40,7 +59,7 @@ struct modem_backend_uart_async {
struct k_work rx_disabled_work;
atomic_t state;
};

#endif /* CONFIG_MODEM_BACKEND_UART_ASYNC_HWFC_ENABLED */
struct modem_backend_uart {
const struct device *uart;
struct modem_pipe pipe;
Expand All @@ -60,7 +79,7 @@ struct modem_backend_uart {

struct modem_backend_uart_config {
const struct device *uart;
uint8_t *receive_buf;
uint8_t *receive_buf __aligned(sizeof(uint32_t));
uint32_t receive_buf_size;
uint8_t *transmit_buf;
uint32_t transmit_buf_size;
Expand Down
3 changes: 2 additions & 1 deletion subsys/modem/backends/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,5 @@ zephyr_library()
zephyr_library_sources_ifdef(CONFIG_MODEM_BACKEND_TTY modem_backend_tty.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_BACKEND_UART modem_backend_uart.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_BACKEND_UART_ISR modem_backend_uart_isr.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_BACKEND_UART_ASYNC modem_backend_uart_async.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_BACKEND_UART_ASYNC_HWFC_DISABLED modem_backend_uart_async.c)
zephyr_library_sources_ifdef(CONFIG_MODEM_BACKEND_UART_ASYNC_HWFC_ENABLED modem_backend_uart_async_hwfc.c)
22 changes: 22 additions & 0 deletions subsys/modem/backends/Kconfig
Original file line number Diff line number Diff line change
Expand Up @@ -48,6 +48,28 @@ config MODEM_BACKEND_UART_ASYNC_RECEIVE_IDLE_TIMEOUT_MS
int "Modem async UART receive idle timeout in milliseconds"
default 30

choice MODEM_BACKEND_UART_ASYNC_HWFC_CHOICE
prompt "Modem async UART hardware flow control"
default MODEM_BACKEND_UART_ASYNC_HWFC_DISABLED
help
Select whether to enable or disable hardware flow control (HWFC)
for the modem async UART backend.

config MODEM_BACKEND_UART_ASYNC_HWFC_DISABLED
bool "Hardware flow control is disabled"

config MODEM_BACKEND_UART_ASYNC_HWFC_ENABLED
bool "Hardware flow control is enabled"
endchoice

if MODEM_BACKEND_UART_ASYNC_HWFC_ENABLED

config MODEM_BACKEND_UART_ASYNC_HWFC_BUFFER_COUNT
int "Modem async UART buffer count"
range 2 4
default 3
endif

endif # MODEM_BACKEND_UART_ASYNC

endif # MODEM_BACKEND_UART
4 changes: 3 additions & 1 deletion subsys/modem/backends/modem_backend_uart.c
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,9 @@ struct modem_pipe *modem_backend_uart_init(struct modem_backend_uart *backend,

#ifdef CONFIG_MODEM_BACKEND_UART_ASYNC
if (modem_backend_uart_async_is_supported(backend)) {
modem_backend_uart_async_init(backend, config);
if (modem_backend_uart_async_init(backend, config)) {
return NULL;
}
return &backend->pipe;
}
#endif /* CONFIG_MODEM_BACKEND_UART_ASYNC */
Expand Down
6 changes: 4 additions & 2 deletions subsys/modem/backends/modem_backend_uart_async.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,8 +310,8 @@ static void init_stats(struct modem_backend_uart *backend)
}
#endif

void modem_backend_uart_async_init(struct modem_backend_uart *backend,
const struct modem_backend_uart_config *config)
int modem_backend_uart_async_init(struct modem_backend_uart *backend,
const struct modem_backend_uart_config *config)
{
uint32_t receive_buf_size_quarter = config->receive_buf_size / 4;

Expand All @@ -332,4 +332,6 @@ void modem_backend_uart_async_init(struct modem_backend_uart *backend,
#if CONFIG_MODEM_STATS
init_stats(backend);
#endif

return 0;
}
4 changes: 2 additions & 2 deletions subsys/modem/backends/modem_backend_uart_async.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ extern "C" {

bool modem_backend_uart_async_is_supported(struct modem_backend_uart *backend);

void modem_backend_uart_async_init(struct modem_backend_uart *backend,
const struct modem_backend_uart_config *config);
int modem_backend_uart_async_init(struct modem_backend_uart *backend,
const struct modem_backend_uart_config *config);

#ifdef __cplusplus
}
Expand Down
Loading
Loading