zephyr/subsys/modem/backends/modem_backend_uart.c

63 lines
1.8 KiB
C

/*
* Copyright (c) 2023 Trackunit Corporation
*
* SPDX-License-Identifier: Apache-2.0
*/
#include "modem_backend_uart_isr.h"
#include "modem_backend_uart_async.h"
#include <zephyr/modem/backend/uart.h>
#include <string.h>
static void modem_backend_uart_receive_ready_handler(struct k_work *item)
{
struct modem_backend_uart *backend = CONTAINER_OF(
k_work_delayable_from_work(item), struct modem_backend_uart, receive_ready_work);
modem_pipe_notify_receive_ready(&backend->pipe);
}
static void modem_backend_uart_transmit_idle_handler(struct k_work *item)
{
struct modem_backend_uart *backend =
CONTAINER_OF(item, struct modem_backend_uart, transmit_idle_work);
modem_pipe_notify_transmit_idle(&backend->pipe);
}
struct modem_pipe *modem_backend_uart_init(struct modem_backend_uart *backend,
const struct modem_backend_uart_config *config)
{
__ASSERT_NO_MSG(config->uart != NULL);
__ASSERT_NO_MSG(config->receive_buf != NULL);
__ASSERT_NO_MSG(config->receive_buf_size > 1);
__ASSERT_NO_MSG((config->receive_buf_size % 2) == 0);
__ASSERT_NO_MSG(config->transmit_buf != NULL);
__ASSERT_NO_MSG(config->transmit_buf_size > 0);
memset(backend, 0x00, sizeof(*backend));
backend->uart = config->uart;
k_work_init_delayable(&backend->receive_ready_work,
modem_backend_uart_receive_ready_handler);
k_work_init(&backend->transmit_idle_work, modem_backend_uart_transmit_idle_handler);
#ifdef CONFIG_MODEM_BACKEND_UART_ASYNC
if (modem_backend_uart_async_is_supported(backend)) {
modem_backend_uart_async_init(backend, config);
return &backend->pipe;
}
#endif /* CONFIG_MODEM_BACKEND_UART_ASYNC */
#ifdef CONFIG_MODEM_BACKEND_UART_ISR
modem_backend_uart_isr_init(backend, config);
return &backend->pipe;
#endif /* CONFIG_MODEM_BACKEND_UART_ISR */
__ASSERT(0, "No supported UART API");
return NULL;
}