| #pragma once |
| |
| /*! \file soft_uart.h |
| * Software UART implementation. */ |
| /* |
| * (C) 2022 by Harald Welte <laforge@gnumonks.org> |
| * |
| * All Rights Reserved |
| * |
| * SPDX-License-Identifier: GPL-2.0+ |
| * |
| * This program is free software; you can redistribute it and/or modify |
| * it under the terms of the GNU General Public License as published by |
| * the Free Software Foundation; either version 2 of the License, or |
| * (at your option) any later version. |
| * |
| * This program is distributed in the hope that it will be useful, |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| * GNU General Public License for more details. |
| * |
| */ |
| |
| #include <stdint.h> |
| #include <osmocom/core/bits.h> |
| #include <osmocom/core/msgb.h> |
| |
| enum osmo_soft_uart_parity_mode { |
| OSMO_SUART_PARITY_NONE, |
| OSMO_SUART_PARITY_EVEN, |
| OSMO_SUART_PARITY_ODD, |
| _OSMO_SUART_PARITY_NUM |
| }; |
| |
| enum osmo_soft_uart_flags { |
| OSMO_SUART_F_FRAMING_ERROR = (1 << 0), |
| OSMO_SUART_F_PARITY_ERROR = (1 << 1), |
| OSMO_SUART_F_BREAK = (1 << 2), |
| }; |
| |
| #if 0 |
| enum osmo_soft_uart_status { |
| /* RTS, CTS, ... */ |
| _fixme, |
| }; |
| #endif |
| |
| /* configuration for a soft-uart */ |
| struct osmo_soft_uart_cfg { |
| /*! number of data bits (typically 5, 6, 7 or 8) */ |
| uint8_t num_data_bits; |
| /*! number of stop bots (typically 1 or 2) */ |
| uint8_t num_stop_bits; |
| /*! parity mode (none, even, odd) */ |
| enum osmo_soft_uart_parity_mode parity_mode; |
| /*! size of receive buffer; UART will buffer up to that number of characters |
| * before calling the receive call-back */ |
| unsigned int rx_buf_size; |
| /*! receive timeout; UART will flush receive buffer via the receive call-back |
| * after indicated number of milli-seconds even if it is not full yet */ |
| unsigned int rx_timeout_ms; |
| |
| /*! opaque application-private data; passed to call-backs */ |
| void *priv; |
| |
| /*! receive call-back. Either rx_buf_size characters were received or rx_timeout_ms |
| * expired, or an error flag was detected (related to last byte received). |
| * 'flags' is a bit-mask of osmo_soft_uart_flags, */ |
| void (*rx_cb)(void *priv, struct msgb *rx_data, unsigned int flags); |
| |
| /*! modem status line change call-back. gets bitmask of osmo_soft_uart_status */ |
| void (*status_change_cb)(void *priv, unsigned int status); |
| }; |
| |
| struct osmo_soft_uart; |
| |
| struct osmo_soft_uart *osmo_soft_uart_alloc(void *ctx, const char *name); |
| int osmo_soft_uart_configure(struct osmo_soft_uart *suart, const struct osmo_soft_uart_cfg *cfg); |
| int osmo_soft_uart_enable(struct osmo_soft_uart *suart, bool rx, bool tx); |
| |
| int osmo_soft_uart_rx_ubits(struct osmo_soft_uart *suart, const ubit_t *ubits, size_t n_ubits); |
| int osmo_soft_uart_tx_ubits(struct osmo_soft_uart *suart, ubit_t *ubits, size_t n_ubits); |
| |
| void osmo_soft_uart_tx(struct osmo_soft_uart *suart, struct msgb *tx_data); |
| int osmo_soft_uart_set_status(struct osmo_soft_uart *suart, unsigned int status); |