Loading...
Searching...
No Matches
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().
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.
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.
unsigned int | osmo_soft_uart_get_status (const struct osmo_soft_uart *suart)
| Get the modem status bitmask of the given soft-UART.
int | osmo_soft_uart_set_status (struct osmo_soft_uart *suart, unsigned int status)
| Set the modem status bitmask of the given soft-UART.
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.
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.
void | osmo_soft_uart_free (struct osmo_soft_uart *suart)
| Release memory taken by the given soft-UART.
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.
const char * | osmo_soft_uart_get_name (const struct osmo_soft_uart *suart)
| Get a name for the given soft-UART instance.
void | osmo_soft_uart_set_name (struct osmo_soft_uart *suart, const char *name)
| Set a new name for the given soft-UART instance.
int | osmo_soft_uart_set_rx (struct osmo_soft_uart *suart, bool enable)
| Enable/disable receiver of the given soft-UART.
int | osmo_soft_uart_set_tx (struct osmo_soft_uart *suart, bool enable)
| Enable/disable transmitter of the given soft-UART.

## Variables

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

## Detailed Description

Software UART implementation.

## Enumeration Type Documentation

## suart_flow_state

enum 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] | ctx | parent talloc context.
  [in] | name | name of the soft-UART instance.
  [in] | cfg | initial 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] | suart | soft-UART instance to be re-configured.
  [in] | cfg | the 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 | ) |

Flush the receive buffer, passing ownership of the msgb to the .rx_cb().

Parameters

  [in] | suart | soft-UART instance holding the receive buffer.

References osmo_soft_uart::cfg, osmo_soft_uart::flags, osmo_soft_uart::msg, msgb_alloc_c(), msgb_length(), msgb_reset(), osmo_timer_del(), osmo_soft_uart_cfg::priv, osmo_soft_uart::rx, osmo_soft_uart_cfg::rx_buf_size, osmo_soft_uart_cfg::rx_cb, and osmo_soft_uart::timer.

Referenced by osmo_soft_uart_configure(), osmo_soft_uart_set_rx(), suart_rx_ch(), and suart_rx_timer_cb().

## osmo_soft_uart_free()

void osmo_soft_uart_free | ( | struct osmo_soft_uart * | suart | ) |

Release memory taken by the given soft-UART.

Parameters

  [in] | suart | soft-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] | suart | soft-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] | suart | soft-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] | suart | soft-UART instance to feed bits into.
  [in] | ubits | pointer to the unpacked bits.
  [in] | n_ubits | number 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] | suart | soft-UART instance to set the name for.
  [in] | name | the 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] | suart | soft-UART instance to be re-configured.
  [in] | enable | enable/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] | suart | soft-UART instance to set the modem status.
  [in] | status | bitmask 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] | suart | soft-UART instance to update the modem status.
  [in] | line | a modem status line, one of OSMO_SUART_STATUS_F_*.
  [in] | active | activate (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] | suart | soft-UART instance to be re-configured.
  [in] | enable | enable/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] | suart | soft-UART instance to pull the bits from.
  [out] | ubits | pointer to a buffer where to store pulled bits.
  [in] | n_ubits | number 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, 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()

void suart_rx_bit | ( | struct osmo_soft_uart * | suart,
|  | const ubit_t | bit )

inline static

References osmo_soft_uart::bit_count, osmo_soft_uart::cfg, osmo_soft_uart::flags, osmo_soft_uart::flow_state, osmo_soft_uart_cfg::num_data_bits, osmo_soft_uart_cfg::num_stop_bits, OSMO_ASSERT, OSMO_SUART_F_FRAMING_ERROR, OSMO_SUART_F_PARITY_ERROR, OSMO_SUART_PARITY_EVEN, OSMO_SUART_PARITY_MARK, OSMO_SUART_PARITY_NONE, OSMO_SUART_PARITY_ODD, OSMO_SUART_PARITY_SPACE, osmo_soft_uart::parity_bit, osmo_soft_uart_cfg::parity_mode, osmo_soft_uart::rx, osmo_soft_uart::shift_reg, SUART_FLOW_ST_DATA, SUART_FLOW_ST_IDLE, SUART_FLOW_ST_PARITY, SUART_FLOW_ST_STOP, and suart_rx_ch().

Referenced by osmo_soft_uart_rx_ubits().

## suart_rx_ch()

void suart_rx_ch | ( | struct osmo_soft_uart * | suart,
|  | uint8_t | ch )

static

References osmo_soft_uart::cfg, osmo_soft_uart::flags, osmo_soft_uart::msg, msgb_length(), msgb_put_u8(), OSMO_ASSERT, osmo_soft_uart_flush_rx(), osmo_timer_schedule(), osmo_soft_uart::rx, osmo_soft_uart_cfg::rx_buf_size, osmo_soft_uart_cfg::rx_timeout_ms, and osmo_soft_uart::timer.

Referenced by suart_rx_bit().

## suart_rx_timer_cb()

void suart_rx_timer_cb | ( | void * | data | ) |

static

References osmo_soft_uart_flush_rx().

Referenced by osmo_soft_uart_configure().

## suart_tx_bit()

ubit_t suart_tx_bit | ( | struct osmo_soft_uart * | suart,
|  | struct msgb * | msg )

inline static

References osmo_soft_uart::bit_count, osmo_soft_uart::cfg, osmo_soft_uart::flow_state, msgb_length(), msgb_pull_u8(), osmo_soft_uart_cfg::num_data_bits, osmo_soft_uart_cfg::num_stop_bits, OSMO_ASSERT, OSMO_SUART_PARITY_EVEN, OSMO_SUART_PARITY_MARK, OSMO_SUART_PARITY_NONE, OSMO_SUART_PARITY_ODD, OSMO_SUART_PARITY_SPACE, osmo_soft_uart::parity_bit, osmo_soft_uart_cfg::parity_mode, osmo_soft_uart::shift_reg, SUART_FLOW_ST_DATA, SUART_FLOW_ST_IDLE, SUART_FLOW_ST_PARITY, SUART_FLOW_ST_STOP, and osmo_soft_uart::tx.

Referenced by osmo_soft_uart_tx_ubits(), and suart_tx_pending().

## suart_tx_pending()

size_t suart_tx_pending | ( | struct osmo_soft_uart * | suart,
|  | ubit_t * | ubits,
|  | size_t | n_ubits )

static

References osmo_soft_uart::flow_state, SUART_FLOW_ST_IDLE, suart_tx_bit(), and osmo_soft_uart::tx.

Referenced by osmo_soft_uart_tx_ubits().

## 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
@ OSMO_SUART_FLOW_CTRL_NONE
No flow control.
Definition soft_uart.h:64
OSMO_SUART_PARITY_NONE
@ OSMO_SUART_PARITY_NONE
No parity bit.
Definition soft_uart.h:34

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