libosmocore 1.13.1.1-afb4 Osmocom core library

sercomm.h
Go to the documentation of this file.
1
5#pragma once
6
7#include <osmocom/core/msgb.h>
8
14 enum sercomm_dlci {
15 SC_DLCI_HIGHEST = 0,
16 SC_DLCI_DEBUG = 4,
17 SC_DLCI_L1A_L23 = 5,
18 SC_DLCI_LOADER = 9,
19 SC_DLCI_CONSOLE = 10,
20 SC_DLCI_ECHO = 128,
21 _SC_DLCI_MAX
22};
23
24 struct osmo_sercomm_inst;
29 typedef void (*dlci_cb_t)(struct osmo_sercomm_inst *sercomm, uint8_t dlci, struct msgb *msg);
30
32 struct osmo_sercomm_inst {
34 int initialized;
36 int uart_id;
37
39 struct {
41 struct llist_head dlci_queues[_SC_DLCI_MAX];
43 struct msgb *msg;
45 int state;
47 uint8_t *next_char;
48 } tx;
49
51 struct {
53 dlci_cb_t dlci_handler[_SC_DLCI_MAX];
55 unsigned int msg_size;
57 struct msgb *msg;
59 int state;
61 uint8_t dlci;
63 uint8_t ctrl;
64 } rx;
65};
66
67
68 void osmo_sercomm_init(struct osmo_sercomm_inst *sercomm);
69 int osmo_sercomm_initialized(struct osmo_sercomm_inst *sercomm);
70
71/* User Interface: Tx */
72 void osmo_sercomm_sendmsg(struct osmo_sercomm_inst *sercomm, uint8_t dlci, struct msgb *msg);
73 unsigned int osmo_sercomm_tx_queue_depth(struct osmo_sercomm_inst *sercomm, uint8_t dlci);
74
75/* User Interface: Rx */
76 int osmo_sercomm_register_rx_cb(struct osmo_sercomm_inst *sercomm, uint8_t dlci, dlci_cb_t cb);
77
78 int osmo_sercomm_change_speed(struct osmo_sercomm_inst *sercomm, uint32_t bdrt);
79
80/* Driver Interface */
81
82 int osmo_sercomm_drv_pull(struct osmo_sercomm_inst *sercomm, uint8_t *ch);
83 int osmo_sercomm_drv_rx_char(struct osmo_sercomm_inst *sercomm, uint8_t ch);
84
85 extern void sercomm_drv_lock(unsigned long *flags);
86 extern void sercomm_drv_unlock(unsigned long *flags);
87
96 extern void sercomm_drv_start_tx(struct osmo_sercomm_inst *sercomm);
97
103 extern int sercomm_drv_baudrate_chg(struct osmo_sercomm_inst *sercomm, uint32_t bdrt);
104
106 static inline struct msgb *osmo_sercomm_alloc_msgb(unsigned int len)
107{
108 return msgb_alloc_headroom(len+4, 4, "sercomm_tx");
109}
110
len
static size_t len(const char *str)
msgb_alloc_headroom
static struct msgb * msgb_alloc_headroom(uint16_t size, uint16_t headroom, const char *name)
Allocate message buffer with specified headroom.
Definition: msgb.h:551
osmo_sercomm_register_rx_cb
int osmo_sercomm_register_rx_cb(struct osmo_sercomm_inst *sercomm, uint8_t dlci, dlci_cb_t cb)
Register a handler for a given DLCI.
Definition: sercomm.c:245
osmo_sercomm_drv_pull
int osmo_sercomm_drv_pull(struct osmo_sercomm_inst *sercomm, uint8_t *ch)
fetch one octet of to-be-transmitted serial data
Definition: sercomm.c:179
osmo_sercomm_drv_rx_char
int osmo_sercomm_drv_rx_char(struct osmo_sercomm_inst *sercomm, uint8_t ch)
the driver has received one byte, pass it into sercomm layer
Definition: sercomm.c:272
osmo_sercomm_tx_queue_depth
unsigned int osmo_sercomm_tx_queue_depth(struct osmo_sercomm_inst *sercomm, uint8_t dlci)
How deep is the Tx queue for a given DLCI?
Definition: sercomm.c:126
sercomm_drv_start_tx
void sercomm_drv_start_tx(struct osmo_sercomm_inst *sercomm)
low-level driver routine to request start of transmission The Sercomm code calls this function to inf...
osmo_sercomm_alloc_msgb
static struct msgb * osmo_sercomm_alloc_msgb(unsigned int len)
Sercomm msgb allocator function.
Definition: sercomm.h:106
osmo_sercomm_initialized
int osmo_sercomm_initialized(struct osmo_sercomm_inst *sercomm)
Determine if a given Osmocom sercomm instance has been initialized.
Definition: sercomm.c:92
sercomm_drv_unlock
void sercomm_drv_unlock(unsigned long *flags)
sercomm_dlci
sercomm_dlci
A low sercomm_dlci means high priority.
Definition: sercomm.h:14
dlci_cb_t
void(* dlci_cb_t)(struct osmo_sercomm_inst *sercomm, uint8_t dlci, struct msgb *msg)
call-back function for per-DLC receive handler
Definition: sercomm.h:29
osmo_sercomm_change_speed
int osmo_sercomm_change_speed(struct osmo_sercomm_inst *sercomm, uint32_t bdrt)
wait until everything has been transmitted, then grab the lock and change the baud rate as requested
Definition: sercomm.c:144
osmo_sercomm_sendmsg
void osmo_sercomm_sendmsg(struct osmo_sercomm_inst *sercomm, uint8_t dlci, struct msgb *msg)
User interface for transmitting messages for a given DLCI.
Definition: sercomm.c:102
osmo_sercomm_init
void osmo_sercomm_init(struct osmo_sercomm_inst *sercomm)
Initialize an Osmocom sercomm instance.
Definition: sercomm.c:74
sercomm_drv_lock
void sercomm_drv_lock(unsigned long *flags)
sercomm_drv_baudrate_chg
int sercomm_drv_baudrate_chg(struct osmo_sercomm_inst *sercomm, uint32_t bdrt)
low-level driver routine to execute baud-rate change
SC_DLCI_HIGHEST
@ SC_DLCI_HIGHEST
Definition: sercomm.h:15
SC_DLCI_L1A_L23
@ SC_DLCI_L1A_L23
Definition: sercomm.h:17
SC_DLCI_ECHO
@ SC_DLCI_ECHO
Definition: sercomm.h:20
SC_DLCI_CONSOLE
@ SC_DLCI_CONSOLE
Definition: sercomm.h:19
SC_DLCI_DEBUG
@ SC_DLCI_DEBUG
Definition: sercomm.h:16
_SC_DLCI_MAX
@ _SC_DLCI_MAX
Definition: sercomm.h:21
SC_DLCI_LOADER
@ SC_DLCI_LOADER
Definition: sercomm.h:18
msg
uint8_t msg[0]
msgb.h
llist_head
(double) linked list header structure
Definition: linuxlist.h:46
msgb
Osmocom message buffer.
Definition: msgb.h:31
msgb::cb
unsigned long cb[5]
control buffer
Definition: msgb.h:48
osmo_sercomm_inst
one instance of a sercomm multiplex/demultiplex
Definition: sercomm.h:32
osmo_sercomm_inst::msg_size
unsigned int msg_size
msgb allocation size for rx msgs
Definition: sercomm.h:55
osmo_sercomm_inst::initialized
int initialized
Has this instance been initialized?
Definition: sercomm.h:34
osmo_sercomm_inst::dlci_queues
struct llist_head dlci_queues[_SC_DLCI_MAX]
per-DLC queue of pending transmit msgbs
Definition: sercomm.h:41
osmo_sercomm_inst::msg
struct msgb * msg
msgb currently being transmitted
Definition: sercomm.h:43
osmo_sercomm_inst::dlci
uint8_t dlci
DLCI of currently received msgb.
Definition: sercomm.h:61
osmo_sercomm_inst::ctrl
uint8_t ctrl
CTRL of currently received msgb.
Definition: sercomm.h:63
osmo_sercomm_inst::uart_id
int uart_id
UART Identifier.
Definition: sercomm.h:36
osmo_sercomm_inst::state
int state
transmit state
Definition: sercomm.h:45
osmo_sercomm_inst::rx
struct osmo_sercomm_inst::@25 rx
receive side
osmo_sercomm_inst::next_char
uint8_t * next_char
next to-be-transmitted char in msg
Definition: sercomm.h:47
osmo_sercomm_inst::tx
struct osmo_sercomm_inst::@24 tx
transmit side
osmo_sercomm_inst::dlci_handler
dlci_cb_t dlci_handler[_SC_DLCI_MAX]
per-DLC handler call-back functions
Definition: sercomm.h:53