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@osmocom.org + * (C) 2024 by sysmocom - s.f.m.c. GmbH info@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;