Line data Source code
1 0 : /*
2 : * Copyright (c) 2018 Linaro Limited
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_CONSOLE_TTY_H_
8 : #define ZEPHYR_INCLUDE_CONSOLE_TTY_H_
9 :
10 : #include <sys/types.h>
11 : #include <zephyr/types.h>
12 : #include <zephyr/kernel.h>
13 :
14 : #ifdef __cplusplus
15 : extern "C" {
16 : #endif
17 :
18 0 : struct tty_serial {
19 0 : const struct device *uart_dev;
20 :
21 0 : struct k_sem rx_sem;
22 0 : uint8_t *rx_ringbuf;
23 0 : uint32_t rx_ringbuf_sz;
24 0 : uint16_t rx_get, rx_put;
25 0 : int32_t rx_timeout;
26 :
27 0 : struct k_sem tx_sem;
28 0 : uint8_t *tx_ringbuf;
29 0 : uint32_t tx_ringbuf_sz;
30 0 : uint16_t tx_get, tx_put;
31 0 : int32_t tx_timeout;
32 : };
33 :
34 : /**
35 : * @brief Initialize serial port object (classically known as tty).
36 : *
37 : * "tty" device provides support for buffered, interrupt-driven,
38 : * timeout-controlled access to an underlying UART device. For
39 : * completeness, it also support non-interrupt-driven, busy-polling
40 : * access mode. After initialization, tty is in the "most conservative"
41 : * unbuffered mode with infinite timeouts (this is guaranteed to work
42 : * on any hardware). Users should configure buffers and timeouts as
43 : * they need using functions tty_set_rx_buf(), tty_set_tx_buf(),
44 : * tty_set_rx_timeout(), tty_set_tx_timeout().
45 : *
46 : * @param tty tty device structure to initialize
47 : * @param uart_dev underlying UART device to use (should support
48 : * interrupt-driven operation)
49 : *
50 : * @return 0 on success, error code (<0) otherwise
51 : */
52 1 : int tty_init(struct tty_serial *tty, const struct device *uart_dev);
53 :
54 : /**
55 : * @brief Set receive timeout for tty device.
56 : *
57 : * Set timeout for getchar() operation. Default timeout after
58 : * device initialization is SYS_FOREVER_MS.
59 : *
60 : * @param tty tty device structure
61 : * @param timeout timeout in milliseconds, or 0, or SYS_FOREVER_MS.
62 : */
63 1 : static inline void tty_set_rx_timeout(struct tty_serial *tty, int32_t timeout)
64 : {
65 : tty->rx_timeout = timeout;
66 : }
67 :
68 : /**
69 : * @brief Set transmit timeout for tty device.
70 : *
71 : * Set timeout for putchar() operation, for a case when output buffer is full.
72 : * Default timeout after device initialization is SYS_FOREVER_MS.
73 : *
74 : * @param tty tty device structure
75 : * @param timeout timeout in milliseconds, or 0, or SYS_FOREVER_MS.
76 : */
77 1 : static inline void tty_set_tx_timeout(struct tty_serial *tty, int32_t timeout)
78 : {
79 : tty->tx_timeout = timeout;
80 : }
81 :
82 : /**
83 : * @brief Set receive buffer for tty device.
84 : *
85 : * Set receive buffer or switch to unbuffered operation for receive.
86 : *
87 : * @param tty tty device structure
88 : * @param buf buffer, or NULL for unbuffered operation
89 : * @param size buffer buffer size, 0 for unbuffered operation
90 : * @return 0 on success, error code (<0) otherwise:
91 : * EINVAL: unsupported buffer (size)
92 : */
93 1 : int tty_set_rx_buf(struct tty_serial *tty, void *buf, size_t size);
94 :
95 : /**
96 : * @brief Set transmit buffer for tty device.
97 : *
98 : * Set transmit buffer or switch to unbuffered operation for transmit.
99 : * Note that unbuffered mode is implicitly blocking, i.e. behaves as
100 : * if tty_set_tx_timeout(SYS_FOREVER_MS) was set.
101 : *
102 : * @param tty tty device structure
103 : * @param buf buffer, or NULL for unbuffered operation
104 : * @param size buffer buffer size, 0 for unbuffered operation
105 : * @return 0 on success, error code (<0) otherwise:
106 : * EINVAL: unsupported buffer (size)
107 : */
108 1 : int tty_set_tx_buf(struct tty_serial *tty, void *buf, size_t size);
109 :
110 : /**
111 : * @brief Read data from a tty device.
112 : *
113 : * @param tty tty device structure
114 : * @param buf buffer to read data to
115 : * @param size maximum number of bytes to read
116 : * @return >0, number of actually read bytes (can be less than size param)
117 : * =0, for EOF-like condition (e.g., break signaled)
118 : * <0, in case of error (e.g. -EAGAIN if timeout expired). errno
119 : * variable is also set.
120 : */
121 1 : ssize_t tty_read(struct tty_serial *tty, void *buf, size_t size);
122 :
123 : /**
124 : * @brief Write data to tty device.
125 : *
126 : * @param tty tty device structure
127 : * @param buf buffer containing data
128 : * @param size maximum number of bytes to write
129 : * @return =>0, number of actually written bytes (can be less than size param)
130 : * <0, in case of error (e.g. -EAGAIN if timeout expired). errno
131 : * variable is also set.
132 : */
133 1 : ssize_t tty_write(struct tty_serial *tty, const void *buf, size_t size);
134 :
135 : #ifdef __cplusplus
136 : }
137 : #endif
138 :
139 : #endif /* ZEPHYR_INCLUDE_CONSOLE_TTY_H_ */
|