fixeria has uploaded this change for review. (
https://gerrit.osmocom.org/c/libosmocore/+/35914?usp=email )
Change subject: gsm: add TCH block/lchan definitions for CSD
......................................................................
gsm: add TCH block/lchan definitions for CSD
Change-Id: Ie230e09d496c9b791981d8ee04902fc9966ed6d7
Related: OS#1572, OS#4396
---
M include/osmocom/gsm/gsm44021.h
M src/gsm/gsm44021.c
M src/gsm/libosmogsm.map
3 files changed, 53 insertions(+), 0 deletions(-)
git pull ssh://gerrit.osmocom.org:29418/libosmocore refs/changes/14/35914/1
diff --git a/include/osmocom/gsm/gsm44021.h b/include/osmocom/gsm/gsm44021.h
index 8f89c56..9ec4852 100644
--- a/include/osmocom/gsm/gsm44021.h
+++ b/include/osmocom/gsm/gsm44021.h
@@ -1,6 +1,18 @@
#pragma once
#include <osmocom/isdn/v110.h>
+/*! TCH block description for CSD */
+struct osmo_csd_tch_block_desc {
+ int num_frames; /*!< Number of V.110 frames in a block */
+ int num_bits; /*!< Number of bits in each V.110 frame */
+};
+
+/*! TCH block description for Full and Half Rate channels */
+struct osmo_csd_tch_lchan_desc {
+ struct osmo_csd_tch_block_desc fr; /*!< Full-Rate channel */
+ struct osmo_csd_tch_block_desc hr; /*!< Half-Rate channel */
+};
+
int osmo_csd_12k_6k_decode_frame(struct osmo_v110_decoded_frame *fr, const ubit_t
*ra_bits, size_t n_bits);
int osmo_csd_12k_6k_encode_frame(ubit_t *ra_bits, size_t ra_bits_size, const struct
osmo_v110_decoded_frame *fr);
int osmo_csd_3k6_decode_frame(struct osmo_v110_decoded_frame *fr, const ubit_t *ra_bits,
size_t n_bits);
diff --git a/src/gsm/gsm44021.c b/src/gsm/gsm44021.c
index 5e9d5ab..cc2c545 100644
--- a/src/gsm/gsm44021.c
+++ b/src/gsm/gsm44021.c
@@ -3,6 +3,7 @@
*************************************************************************/
/* (C) 2022 by Harald Welte <laforge(a)osmocom.org>
+ * (C) 2024 by sysmocom - s.f.m.c. GmbH <info(a)sysmocom.de>
*
* SPDX-License-Identifier: GPL-2.0+
*
@@ -20,6 +21,35 @@
#include <errno.h>
#include <osmocom/core/bits.h>
#include <osmocom/isdn/v110.h>
+#include <osmocom/gsm/protocol/gsm_04_08.h>
+#include <osmocom/gsm/gsm44021.h>
+
+/*! TCH block description for various TS 48.008 Channel Mode and rate values.
+ * Key is enum gsm48_chan_mode, so assuming a value in range 0..255. */
+const struct osmo_csd_tch_lchan_desc osmo_csd_chan_mode_rate_desc[256] = {
+#if 0
+ [GSM48_CMODE_DATA_14k5] = {
+ /* TCH/F14.4: 290 bits every 20 ms (14.5 kbit/s) */
+ .fr = { .num_frames = 1, .num_bits = 290 },
+ },
+#endif
+ [GSM48_CMODE_DATA_12k0] = {
+ /* TCH/F9.6: 4 * 60 bits every 20 ms (12.0 kbit/s) */
+ .fr = { .num_frames = 4, .num_bits = 60 },
+ },
+ [GSM48_CMODE_DATA_6k0] = {
+ /* TCH/F4.8: 2 * 60 bits every 20 ms (6.0 kbit/s) */
+ .fr = { .num_frames = 2, .num_bits = 60 },
+ /* TCH/H4.8: 4 * 60 bits every 40 ms (6.0 kbit/s) */
+ .hr = { .num_frames = 4, .num_bits = 60 },
+ },
+ [GSM48_CMODE_DATA_3k6] = {
+ /* TCH/F2.4: 2 * 36 bits every 20 ms (3.6 kbit/s) */
+ .fr = { .num_frames = 2, .num_bits = 36 },
+ /* TCH/H2.4: 4 * 36 bits every 40 ms (3.6 kbit/s) */
+ .hr = { .num_frames = 4, .num_bits = 36 },
+ },
+};
/*! Decode a 60-bit GSM 12kbit/s CSD frame present as 60 ubits into a struct
osmo_v110_decoded_frame.
* \param[out] caller-allocated output data structure, filled by this function
diff --git a/src/gsm/libosmogsm.map b/src/gsm/libosmogsm.map
index db2dbcb..88de94c 100644
--- a/src/gsm/libosmogsm.map
+++ b/src/gsm/libosmogsm.map
@@ -858,6 +858,7 @@
osmo_iuup_rnl_prim_alloc;
osmo_iuup_tnl_prim_alloc;
+osmo_csd_chan_mode_rate_desc;
osmo_csd_12k_6k_decode_frame;
osmo_csd_12k_6k_encode_frame;
osmo_csd_3k6_decode_frame;
--
To view, visit
https://gerrit.osmocom.org/c/libosmocore/+/35914?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gerrit.osmocom.org/settings
Gerrit-Project: libosmocore
Gerrit-Branch: master
Gerrit-Change-Id: Ie230e09d496c9b791981d8ee04902fc9966ed6d7
Gerrit-Change-Number: 35914
Gerrit-PatchSet: 1
Gerrit-Owner: fixeria <vyanitskiy(a)sysmocom.de>
Gerrit-MessageType: newchange