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