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