1 /* 2 * Copyright (c) 2022 Trackunit Corporation 3 * 4 * SPDX-License-Identifier: Apache-2.0 5 */ 6 7 #include <zephyr/kernel.h> 8 #include <zephyr/types.h> 9 #include <zephyr/device.h> 10 #include <zephyr/drivers/uart.h> 11 #include <zephyr/sys/ring_buffer.h> 12 #include <zephyr/sys/atomic.h> 13 14 #include <zephyr/modem/pipe.h> 15 #include <zephyr/modem/stats.h> 16 17 #ifndef ZEPHYR_MODEM_BACKEND_UART_ 18 #define ZEPHYR_MODEM_BACKEND_UART_ 19 20 #ifdef __cplusplus 21 extern "C" { 22 #endif 23 24 struct modem_backend_uart_isr { 25 struct ring_buf receive_rdb[2]; 26 struct ring_buf transmit_rb; 27 atomic_t transmit_buf_len; 28 atomic_t receive_buf_len; 29 uint8_t receive_rdb_used; 30 uint32_t transmit_buf_put_limit; 31 }; 32 33 struct modem_backend_uart_async { 34 uint8_t *receive_bufs[2]; 35 uint32_t receive_buf_size; 36 struct ring_buf receive_rb; 37 struct k_spinlock receive_rb_lock; 38 uint8_t *transmit_buf; 39 uint32_t transmit_buf_size; 40 struct k_work rx_disabled_work; 41 atomic_t state; 42 }; 43 44 struct modem_backend_uart { 45 const struct device *uart; 46 struct modem_pipe pipe; 47 struct k_work_delayable receive_ready_work; 48 struct k_work transmit_idle_work; 49 50 #if CONFIG_MODEM_STATS 51 struct modem_stats_buffer receive_buf_stats; 52 struct modem_stats_buffer transmit_buf_stats; 53 #endif 54 55 union { 56 struct modem_backend_uart_isr isr; 57 struct modem_backend_uart_async async; 58 }; 59 }; 60 61 struct modem_backend_uart_config { 62 const struct device *uart; 63 uint8_t *receive_buf; 64 uint32_t receive_buf_size; 65 uint8_t *transmit_buf; 66 uint32_t transmit_buf_size; 67 }; 68 69 struct modem_pipe *modem_backend_uart_init(struct modem_backend_uart *backend, 70 const struct modem_backend_uart_config *config); 71 72 #ifdef __cplusplus 73 } 74 #endif 75 76 #endif /* ZEPHYR_MODEM_BACKEND_UART_ */ 77