Line data Source code
1 0 : /*
2 : * Copyright (c) 2024 Intel Corporation
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : *
6 : */
7 :
8 : #ifndef ZEPHYR_MCTP_UART_H_
9 : #define ZEPHYR_MCTP_UART_H_
10 :
11 : #include <stdint.h>
12 : #include <zephyr/kernel.h>
13 : #include <zephyr/device.h>
14 : #include <libmctp.h>
15 :
16 : /**
17 : * @brief An MCTP binding for Zephyr's asynchronous UART interface
18 : */
19 1 : struct mctp_binding_uart {
20 : /** @cond INTERNAL_HIDDEN */
21 : struct mctp_binding binding;
22 : const struct device *dev;
23 :
24 : /* receive buffers and state */
25 : uint8_t rx_buf[2][256];
26 : bool rx_buf_used[2];
27 : struct mctp_pktbuf *rx_pkt;
28 : uint8_t rx_exp_len;
29 : uint16_t rx_fcs;
30 : uint16_t rx_fcs_calc;
31 : enum {
32 : STATE_WAIT_SYNC_START,
33 : STATE_WAIT_REVISION,
34 : STATE_WAIT_LEN,
35 : STATE_DATA,
36 : STATE_DATA_ESCAPED,
37 : STATE_WAIT_FCS1,
38 : STATE_WAIT_FCS2,
39 : STATE_WAIT_SYNC_END,
40 : } rx_state;
41 : int rx_res;
42 :
43 : /* staging buffer for tx */
44 : uint8_t tx_buf[256];
45 : int tx_res;
46 :
47 : /** @endcond INTERNAL_HIDDEN */
48 : };
49 :
50 : /**
51 : * @brief Start the receive of a single mctp message
52 : *
53 : * Will read a single mctp message from the uart.
54 : *
55 : * @param uart MCTP UART binding
56 : */
57 1 : void mctp_uart_start_rx(struct mctp_binding_uart *uart);
58 :
59 : /** @cond INTERNAL_HIDDEN */
60 : int mctp_uart_start(struct mctp_binding *binding);
61 : int mctp_uart_tx(struct mctp_binding *binding, struct mctp_pktbuf *pkt);
62 : /** @endcond INTERNAL_HIDDEN */
63 :
64 : /**
65 : * @brief Statically define a MCTP bus binding for a UART
66 : *
67 : * @param _name Symbolic name of the bus binding variable
68 : * @param _dev UART device
69 : */
70 1 : #define MCTP_UART_DT_DEFINE(_name, _dev) \
71 : struct mctp_binding_uart _name = { \
72 : .binding = \
73 : { \
74 : .name = STRINGIFY(_name), .version = 1, \
75 : .pkt_size = MCTP_PACKET_SIZE(MCTP_BTU), \
76 : .pkt_header = 0, .pkt_trailer = 0, \
77 : .start = mctp_uart_start, .tx = mctp_uart_tx, \
78 : }, \
79 : .dev = _dev, \
80 : .rx_state = STATE_WAIT_SYNC_START, \
81 : .rx_pkt = NULL, \
82 : .rx_res = 0, \
83 : .tx_res = 0, \
84 : };
85 :
86 : #endif /* ZEPHYR_MCTP_UART_H_ */
|