libosmocore 1.9.0.196-9975
Osmocom core library
soft_uart.c File Reference

Software UART implementation. More...

#include <stdbool.h>
#include <stdint.h>
#include <errno.h>
#include <osmocom/core/utils.h>
#include <osmocom/core/timer.h>
#include <osmocom/core/soft_uart.h>

Data Structures

struct  osmo_soft_uart
 Internal state of a soft-UART. More...
 

Enumerations

enum  suart_flow_state {
  SUART_FLOW_ST_IDLE ,
  SUART_FLOW_ST_DATA ,
  SUART_FLOW_ST_PARITY ,
  SUART_FLOW_ST_STOP
}
 Rx/Tx flow state of a soft-UART. More...
 

Functions

void osmo_soft_uart_flush_rx (struct osmo_soft_uart *suart)
 Flush the receive buffer, passing ownership of the msgb to the .rx_cb(). More...
 
static void suart_rx_ch (struct osmo_soft_uart *suart, uint8_t ch)
 
static void suart_rx_bit (struct osmo_soft_uart *suart, const ubit_t bit)
 
static void suart_rx_timer_cb (void *data)
 
int osmo_soft_uart_rx_ubits (struct osmo_soft_uart *suart, const ubit_t *ubits, size_t n_ubits)
 Feed a number of unpacked bits into the soft-UART receiver. More...
 
static ubit_t suart_tx_bit (struct osmo_soft_uart *suart, struct msgb *msg)
 
static size_t suart_tx_pending (struct osmo_soft_uart *suart, 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)
 Pull a number of unpacked bits out of the soft-UART transmitter. More...
 
unsigned int osmo_soft_uart_get_status (const struct osmo_soft_uart *suart)
 Get the modem status bitmask of the given soft-UART. More...
 
int osmo_soft_uart_set_status (struct osmo_soft_uart *suart, unsigned int status)
 Set the modem status bitmask of the given soft-UART. More...
 
void osmo_soft_uart_set_status_line (struct osmo_soft_uart *suart, enum osmo_soft_uart_status line, bool active)
 Activate/deactivate a modem status line of the given soft-UART. More...
 
struct osmo_soft_uartosmo_soft_uart_alloc (void *ctx, const char *name, const struct osmo_soft_uart_cfg *cfg)
 Allocate a soft-UART instance. More...
 
void osmo_soft_uart_free (struct osmo_soft_uart *suart)
 Release memory taken by the given soft-UART. More...
 
int osmo_soft_uart_configure (struct osmo_soft_uart *suart, const struct osmo_soft_uart_cfg *cfg)
 Change soft-UART configuration to the user-provided config. More...
 
const char * osmo_soft_uart_get_name (const struct osmo_soft_uart *suart)
 Get a name for the given soft-UART instance. More...
 
void osmo_soft_uart_set_name (struct osmo_soft_uart *suart, const char *name)
 Set a new name for the given soft-UART instance. More...
 
int osmo_soft_uart_set_rx (struct osmo_soft_uart *suart, bool enable)
 Enable/disable receiver of the given soft-UART. More...
 
int osmo_soft_uart_set_tx (struct osmo_soft_uart *suart, bool enable)
 Enable/disable transmitter of the given soft-UART. More...
 

Variables

const struct osmo_soft_uart_cfg osmo_soft_uart_default_cfg
 Default soft-UART configuration (8-N-1) More...
 

Detailed Description

Software UART implementation.

Enumeration Type Documentation

◆ suart_flow_state

Rx/Tx flow state of a soft-UART.

Enumerator
SUART_FLOW_ST_IDLE 

waiting for a start bit or Tx data

SUART_FLOW_ST_DATA 

receiving/transmitting data bits

SUART_FLOW_ST_PARITY 

receiving/transmitting parity bits

SUART_FLOW_ST_STOP 

receiving/transmitting stop bits

Function Documentation

◆ osmo_soft_uart_alloc()

struct osmo_soft_uart * osmo_soft_uart_alloc ( void *  ctx,
const char *  name,
const struct osmo_soft_uart_cfg cfg 
)

Allocate a soft-UART instance.

Parameters
[in]ctxparent talloc context.
[in]namename of the soft-UART instance.
[in]cfginitial configuration of the soft-UART instance.
Returns
pointer to allocated soft-UART instance; NULL on error.

References osmo_soft_uart::cfg, name, osmo_soft_uart::name, and OSMO_ASSERT.

◆ osmo_soft_uart_configure()

int osmo_soft_uart_configure ( struct osmo_soft_uart suart,
const struct osmo_soft_uart_cfg cfg 
)

Change soft-UART configuration to the user-provided config.

Parameters
[in]suartsoft-UART instance to be re-configured.
[in]cfgthe user-provided config to be applied.
Returns
0 on success; negative on error.

References _OSMO_SUART_PARITY_NUM, osmo_soft_uart::cfg, osmo_soft_uart_cfg::num_data_bits, osmo_soft_uart_cfg::num_stop_bits, osmo_soft_uart_flush_rx(), osmo_timer_setup(), osmo_soft_uart_cfg::parity_mode, osmo_soft_uart::rx, osmo_soft_uart_cfg::rx_buf_size, osmo_soft_uart_cfg::rx_timeout_ms, suart_rx_timer_cb(), and osmo_soft_uart::timer.

◆ osmo_soft_uart_flush_rx()

void osmo_soft_uart_flush_rx ( struct osmo_soft_uart suart)

◆ osmo_soft_uart_free()

void osmo_soft_uart_free ( struct osmo_soft_uart suart)

Release memory taken by the given soft-UART.

Parameters
[in]suartsoft-UART instance to be free()d.

References osmo_soft_uart::msg, msgb_free(), osmo_soft_uart::name, osmo_timer_del(), osmo_soft_uart::rx, and osmo_soft_uart::timer.

◆ osmo_soft_uart_get_name()

const char * osmo_soft_uart_get_name ( const struct osmo_soft_uart suart)

Get a name for the given soft-UART instance.

Parameters
[in]suartsoft-UART instance to get the name from.
Returns
name of the given soft-UART instance.

References osmo_soft_uart::name.

◆ osmo_soft_uart_get_status()

unsigned int osmo_soft_uart_get_status ( const struct osmo_soft_uart suart)

Get the modem status bitmask of the given soft-UART.

Parameters
[in]suartsoft-UART instance to get the modem status.
Returns
bitmask of OSMO_SUART_STATUS_F_*.

References osmo_soft_uart::status.

◆ osmo_soft_uart_rx_ubits()

int osmo_soft_uart_rx_ubits ( struct osmo_soft_uart suart,
const ubit_t ubits,
size_t  n_ubits 
)

Feed a number of unpacked bits into the soft-UART receiver.

Parameters
[in]suartsoft-UART instance to feed bits into.
[in]ubitspointer to the unpacked bits.
[in]n_ubitsnumber of unpacked bits to be fed.
Returns
0 on success; negative on error. -EAGAIN indicates that the receiver is disabled.

References osmo_soft_uart::running, osmo_soft_uart::rx, and suart_rx_bit().

◆ osmo_soft_uart_set_name()

void osmo_soft_uart_set_name ( struct osmo_soft_uart suart,
const char *  name 
)

Set a new name for the given soft-UART instance.

Parameters
[in]suartsoft-UART instance to set the name for.
[in]namethe new name.

References name, osmo_soft_uart::name, and osmo_talloc_replace_string().

◆ osmo_soft_uart_set_rx()

int osmo_soft_uart_set_rx ( struct osmo_soft_uart suart,
bool  enable 
)

Enable/disable receiver of the given soft-UART.

Parameters
[in]suartsoft-UART instance to be re-configured.
[in]enableenable/disable state of the receiver.
Returns
0 on success; negative on error.

References osmo_soft_uart::cfg, osmo_soft_uart::flow_state, osmo_soft_uart::msg, msgb_alloc_c(), osmo_soft_uart_flush_rx(), osmo_soft_uart::running, osmo_soft_uart::rx, osmo_soft_uart_cfg::rx_buf_size, and SUART_FLOW_ST_IDLE.

◆ osmo_soft_uart_set_status()

int osmo_soft_uart_set_status ( struct osmo_soft_uart suart,
unsigned int  status 
)

Set the modem status bitmask of the given soft-UART.

Parameters
[in]suartsoft-UART instance to set the modem status.
[in]statusbitmask of OSMO_SUART_STATUS_F_*.
Returns
0 on success; negative on error.

References osmo_soft_uart::cfg, osmo_soft_uart_cfg::priv, osmo_soft_uart::status, and osmo_soft_uart_cfg::status_change_cb.

Referenced by osmo_soft_uart_set_status_line().

◆ osmo_soft_uart_set_status_line()

void osmo_soft_uart_set_status_line ( struct osmo_soft_uart suart,
enum osmo_soft_uart_status  line,
bool  active 
)

Activate/deactivate a modem status line of the given soft-UART.

Parameters
[in]suartsoft-UART instance to update the modem status.
[in]linea modem status line, one of OSMO_SUART_STATUS_F_*.
[in]activeactivate (true) or deactivate (false) the line.

References osmo_soft_uart_set_status(), and osmo_soft_uart::status.

◆ osmo_soft_uart_set_tx()

int osmo_soft_uart_set_tx ( struct osmo_soft_uart suart,
bool  enable 
)

Enable/disable transmitter of the given soft-UART.

Parameters
[in]suartsoft-UART instance to be re-configured.
[in]enableenable/disable state of the transmitter.
Returns
0 on success; negative on error.

References osmo_soft_uart::flow_state, osmo_soft_uart::running, SUART_FLOW_ST_IDLE, and osmo_soft_uart::tx.

◆ osmo_soft_uart_tx_ubits()

int osmo_soft_uart_tx_ubits ( struct osmo_soft_uart suart,
ubit_t ubits,
size_t  n_ubits 
)

Pull a number of unpacked bits out of the soft-UART transmitter.

Parameters
[in]suartsoft-UART instance to pull the bits from.
[out]ubitspointer to a buffer where to store pulled bits.
[in]n_ubitsnumber of unpacked bits to be pulled.
Returns
number of bits pulled (may be less than n_ubits); negative on error. -EAGAIN indicates that the transmitter is disabled.

References osmo_soft_uart::cfg, osmo_soft_uart_cfg::flow_ctrl_mode, osmo_soft_uart::flow_state, msg, msgb_alloc_c(), msgb_free(), osmo_soft_uart_cfg::num_data_bits, osmo_soft_uart_cfg::num_stop_bits, OSMO_ASSERT, OSMO_SUART_FLOW_CTRL_DTR_DSR, OSMO_SUART_FLOW_CTRL_NONE, OSMO_SUART_FLOW_CTRL_RTS_CTS, OSMO_SUART_PARITY_NONE, OSMO_SUART_STATUS_F_CTS, OSMO_SUART_STATUS_F_DSR, OSMO_UNLIKELY, osmo_soft_uart_cfg::parity_mode, osmo_soft_uart_cfg::priv, osmo_soft_uart::running, osmo_soft_uart::status, SUART_FLOW_ST_IDLE, suart_tx_bit(), suart_tx_pending(), osmo_soft_uart::tx, and osmo_soft_uart_cfg::tx_cb.

◆ suart_rx_bit()

◆ suart_rx_ch()

◆ suart_rx_timer_cb()

static void suart_rx_timer_cb ( void *  data)
static

◆ suart_tx_bit()

◆ suart_tx_pending()

static size_t suart_tx_pending ( struct osmo_soft_uart suart,
ubit_t ubits,
size_t  n_ubits 
)
static

Variable Documentation

◆ osmo_soft_uart_default_cfg

const struct osmo_soft_uart_cfg osmo_soft_uart_default_cfg
Initial value:
= {
.num_data_bits = 8,
.num_stop_bits = 1,
.parity_mode = OSMO_SUART_PARITY_NONE,
.rx_buf_size = 1024,
.rx_timeout_ms = 100,
.flow_ctrl_mode = OSMO_SUART_FLOW_CTRL_NONE,
}
@ OSMO_SUART_FLOW_CTRL_NONE
No flow control.
Definition: soft_uart.h:64
@ OSMO_SUART_PARITY_NONE
No parity bit.
Definition: soft_uart.h:34

Default soft-UART configuration (8-N-1)