summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/target/firmware/include/layer1/mframe_sched.h3
-rw-r--r--src/target/firmware/include/layer1/sync.h2
-rw-r--r--src/target/firmware/layer1/l23_api.c10
-rw-r--r--src/target/firmware/layer1/mframe_sched.c21
4 files changed, 36 insertions, 0 deletions
diff --git a/src/target/firmware/include/layer1/mframe_sched.h b/src/target/firmware/include/layer1/mframe_sched.h
index ecdb1ec8..74e2d271 100644
--- a/src/target/firmware/include/layer1/mframe_sched.h
+++ b/src/target/firmware/include/layer1/mframe_sched.h
@@ -23,6 +23,9 @@ enum mframe_task {
MF_TASK_SDCCH8_6,
MF_TASK_SDCCH8_7,
+ MF_TASK_SDCCH4_CBCH,
+ MF_TASK_SDCCH8_CBCH,
+
MF_TASK_TCH_F_EVEN,
MF_TASK_TCH_F_ODD,
MF_TASK_TCH_H_0,
diff --git a/src/target/firmware/include/layer1/sync.h b/src/target/firmware/include/layer1/sync.h
index dae85a1a..3565ee20 100644
--- a/src/target/firmware/include/layer1/sync.h
+++ b/src/target/firmware/include/layer1/sync.h
@@ -119,7 +119,9 @@ struct l1s_state {
enum {
GSM_DCHAN_NONE = 0,
GSM_DCHAN_SDCCH_4,
+ GSM_DCHAN_SDCCH_4_CBCH,
GSM_DCHAN_SDCCH_8,
+ GSM_DCHAN_SDCCH_8_CBCH,
GSM_DCHAN_TCH_H,
GSM_DCHAN_TCH_F,
GSM_DCHAN_UNKNOWN,
diff --git a/src/target/firmware/layer1/l23_api.c b/src/target/firmware/layer1/l23_api.c
index e46ca09d..404a2f98 100644
--- a/src/target/firmware/layer1/l23_api.c
+++ b/src/target/firmware/layer1/l23_api.c
@@ -97,6 +97,11 @@ static uint32_t chan_nr2mf_task_mask(uint8_t chan_nr, uint8_t neigh_mode)
lch_idx = cbits & 0x7;
master_task = MF_TASK_SDCCH8_0 + lch_idx;
multiframe = MF51;
+ } else if ((cbits & 0x1e) == 0x18) {
+ /* Osmocom specific extension for CBCH */
+ master_task = (cbits & 0x01) ? /* 0b1100T */
+ MF_TASK_SDCCH4_CBCH : MF_TASK_SDCCH8_CBCH;
+ multiframe = MF51;
#if 0
} else if (cbits == 0x10) {
/* FIXME: when to do extended BCCH? */
@@ -136,7 +141,12 @@ static int chan_nr2dchan_type(uint8_t chan_nr)
return GSM_DCHAN_SDCCH_4;
} else if ((cbits & 0x18) == 0x08) {
return GSM_DCHAN_SDCCH_8;
+ } else if ((cbits & 0x1e) == 0x18) {
+ /* Osmocom-specific extension for CBCH */
+ return (cbits & 0x01) ? /* 0b1100T */
+ GSM_DCHAN_SDCCH_8_CBCH : GSM_DCHAN_SDCCH_4_CBCH;
}
+
return GSM_DCHAN_UNKNOWN;
}
diff --git a/src/target/firmware/layer1/mframe_sched.c b/src/target/firmware/layer1/mframe_sched.c
index 01ae1678..7fa38c13 100644
--- a/src/target/firmware/layer1/mframe_sched.c
+++ b/src/target/firmware/layer1/mframe_sched.c
@@ -198,6 +198,16 @@ static const struct mframe_sched_item mf_sdcch8_7[] = {
{ .sched_set = NULL }
};
+/* CBCH replaces sub-slot 2 of SDCCH, see GSM 05.02, section 6.4 */
+static const struct mframe_sched_item mf_sdcch8_cbch[] = {
+ { .sched_set = NB_QUAD_FH_DL, .modulo = 51, .frame_nr = 8 },
+ { .sched_set = NULL }
+};
+static const struct mframe_sched_item mf_sdcch4_cbch[] = {
+ { .sched_set = NB_QUAD_DL, .modulo = 51, .frame_nr = 32 },
+ { .sched_set = NULL }
+};
+
/* Measurement for MF 51 C0 */
static const struct mframe_sched_item mf_neigh_pm51_c0t0[] = {
{ .sched_set = NEIGH_PM , .modulo = 51, .frame_nr = 0 },
@@ -327,6 +337,9 @@ static const struct mframe_sched_item *sched_set_for_task[32] = {
[MF_TASK_SDCCH8_6] = mf_sdcch8_6,
[MF_TASK_SDCCH8_7] = mf_sdcch8_7,
+ [MF_TASK_SDCCH4_CBCH] = mf_sdcch4_cbch,
+ [MF_TASK_SDCCH8_CBCH] = mf_sdcch8_cbch,
+
[MF_TASK_TCH_F_EVEN] = mf_tch_f_even,
[MF_TASK_TCH_F_ODD] = mf_tch_f_odd,
[MF_TASK_TCH_H_0] = mf_tch_h_0,
@@ -401,6 +414,14 @@ uint8_t mframe_task2chan_nr(enum mframe_task mft, uint8_t ts)
cbits = 0x02 + 1;
break;
+ /* Osmocom specific extensions */
+ case MF_TASK_SDCCH4_CBCH:
+ cbits = 0x18;
+ break;
+ case MF_TASK_SDCCH8_CBCH:
+ cbits = 0x19;
+ break;
+
case MF_TASK_UL_ALL_NB:
default:
printd("ERROR: cannot express mf_task=%d as "