<p>fixeria has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.osmocom.org/c/osmocom-bb/+/17495">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">firmware/layer1: introduce experimental PDCH support<br><br>This change implements basic (receive only) support of the PDCH<br>channels that are used in GPRS. Several coding schemes are<br>defined by 3GPP TS 45.003, however we can only do CS-1<br>for now, since it's basically an equivalent of xCCH.<br><br>In order to support the other schemes (CS2-4), we would need to<br>know how to configure the DSP (look at Freecalypso code?).<br><br>Change-Id: I44531bbe8743c188cc5d4a6ca2a63000e41d6189<br>---<br>M src/target/firmware/include/layer1/mframe_sched.h<br>M src/target/firmware/include/layer1/sync.h<br>M src/target/firmware/layer1/l23_api.c<br>M src/target/firmware/layer1/mframe_sched.c<br>M src/target/firmware/layer1/prim_rx_nb.c<br>5 files changed, 71 insertions(+), 1 deletion(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.osmocom.org:29418/osmocom-bb refs/changes/95/17495/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/src/target/firmware/include/layer1/mframe_sched.h b/src/target/firmware/include/layer1/mframe_sched.h</span><br><span>index 74e2d27..9434fc6 100644</span><br><span>--- a/src/target/firmware/include/layer1/mframe_sched.h</span><br><span>+++ b/src/target/firmware/include/layer1/mframe_sched.h</span><br><span>@@ -31,6 +31,9 @@</span><br><span>    MF_TASK_TCH_H_0,</span><br><span>     MF_TASK_TCH_H_1,</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+  MF_TASK_GPRS_PDTCH,</span><br><span style="color: hsl(120, 100%, 40%);">+   MF_TASK_GPRS_PTCCH,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        MF_TASK_NEIGH_PM51_C0T0,</span><br><span>     MF_TASK_NEIGH_PM51,</span><br><span>  MF_TASK_NEIGH_PM26E,</span><br><span>@@ -42,6 +45,7 @@</span><br><span> </span><br><span> enum mf_sched_item_flag {</span><br><span>    MF_F_SACCH      = (1 << 0),</span><br><span style="color: hsl(120, 100%, 40%);">+     MF_F_PTCCH      = (1 << 1),</span><br><span> };</span><br><span> </span><br><span> /* The scheduler itself */</span><br><span>diff --git a/src/target/firmware/include/layer1/sync.h b/src/target/firmware/include/layer1/sync.h</span><br><span>index daf998b..6ed3890 100644</span><br><span>--- a/src/target/firmware/include/layer1/sync.h</span><br><span>+++ b/src/target/firmware/include/layer1/sync.h</span><br><span>@@ -124,6 +124,7 @@</span><br><span>                     GSM_DCHAN_SDCCH_8_CBCH,</span><br><span>                      GSM_DCHAN_TCH_H,</span><br><span>                     GSM_DCHAN_TCH_F,</span><br><span style="color: hsl(120, 100%, 40%);">+                      GSM_DCHAN_PDCH,</span><br><span>                      GSM_DCHAN_UNKNOWN,</span><br><span>           } type;</span><br><span> </span><br><span>diff --git a/src/target/firmware/layer1/l23_api.c b/src/target/firmware/layer1/l23_api.c</span><br><span>index f55e670..e0fee84 100644</span><br><span>--- a/src/target/firmware/layer1/l23_api.c</span><br><span>+++ b/src/target/firmware/layer1/l23_api.c</span><br><span>@@ -78,6 +78,7 @@</span><br><span>         uint8_t tn = chan_nr & 0x7;</span><br><span>      uint8_t lch_idx;</span><br><span>     enum mframe_task master_task = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+     enum mframe_task second_task = 0;</span><br><span>    uint32_t neigh_task = 0;</span><br><span>     enum mf_type multiframe = 0;</span><br><span> </span><br><span>@@ -97,6 +98,12 @@</span><br><span>                lch_idx = cbits & 0x7;</span><br><span>           master_task = MF_TASK_SDCCH8_0 + lch_idx;</span><br><span>            multiframe = MF51;</span><br><span style="color: hsl(120, 100%, 40%);">+    } else if ((cbits & 0x1f) == 0x18) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Osmocom specific extension for PDTCH and PTCCH */</span><br><span style="color: hsl(120, 100%, 40%);">+          master_task = MF_TASK_GPRS_PDTCH;</span><br><span style="color: hsl(120, 100%, 40%);">+             second_task = MF_TASK_GPRS_PTCCH;</span><br><span style="color: hsl(120, 100%, 40%);">+             /* FIXME: PDCH has different multiframe structure */</span><br><span style="color: hsl(120, 100%, 40%);">+          multiframe = MFNONE;</span><br><span>         } else if ((cbits & 0x1f) == 0x19) {</span><br><span>             /* Osmocom specific extension for CBCH on SDCCH/4 */</span><br><span>                 master_task = MF_TASK_SDCCH4_CBCH;</span><br><span>@@ -129,7 +136,7 @@</span><br><span>             }</span><br><span>            break;</span><br><span>       }</span><br><span style="color: hsl(0, 100%, 40%);">-       return (1 << master_task) | neigh_task;</span><br><span style="color: hsl(120, 100%, 40%);">+ return (1 << master_task) | (1 << second_task) | neigh_task;</span><br><span> }</span><br><span> </span><br><span> static int  chan_nr2dchan_type(uint8_t chan_nr)</span><br><span>@@ -144,6 +151,9 @@</span><br><span>           return GSM_DCHAN_SDCCH_4;</span><br><span>    } else if ((cbits & 0x18) == 0x08) {</span><br><span>             return GSM_DCHAN_SDCCH_8;</span><br><span style="color: hsl(120, 100%, 40%);">+     } else if ((cbits & 0x1f) == 0x18) {</span><br><span style="color: hsl(120, 100%, 40%);">+              /* Osmocom-specific extension for PDCH */</span><br><span style="color: hsl(120, 100%, 40%);">+             return GSM_DCHAN_PDCH;</span><br><span>       } else if ((cbits & 0x1f) == 0x19) {</span><br><span>             /* Osmocom-specific extension for CBCH on SDCCH/4 */</span><br><span>                 return GSM_DCHAN_SDCCH_4_CBCH;</span><br><span>diff --git a/src/target/firmware/layer1/mframe_sched.c b/src/target/firmware/layer1/mframe_sched.c</span><br><span>index 9c2954c..fac84b4 100644</span><br><span>--- a/src/target/firmware/layer1/mframe_sched.c</span><br><span>+++ b/src/target/firmware/layer1/mframe_sched.c</span><br><span>@@ -311,6 +311,52 @@</span><br><span>       { .sched_set = NULL }</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/* See 3GPP TS 45.002, table 6 */</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct mframe_sched_item mf_gprs_pdtch[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = NB_QUAD_DL, .modulo = 13, .frame_nr = 0 },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .sched_set = NB_QUAD_DL, .modulo = 13, .frame_nr = 4 },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .sched_set = NB_QUAD_DL, .modulo = 13, .frame_nr = 8 },</span><br><span style="color: hsl(120, 100%, 40%);">+     /* NOTE: receive only task */</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = NULL }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static const struct mframe_sched_item mf_gprs_ptcch[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+        /* TODO: implement AB_PTCCH_UL for PTCCH/U */</span><br><span style="color: hsl(120, 100%, 40%);">+ /* TODO: implement NB_PTCCH_DL for PTCCH/D */</span><br><span style="color: hsl(120, 100%, 40%);">+#if 0</span><br><span style="color: hsl(120, 100%, 40%);">+  /* PTCCH/D */</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = NB_PTCCH_DL, .modulo = 104, .frame_nr = 12, .flags = MF_F_PTCCH },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .sched_set = NB_PTCCH_DL, .modulo = 104, .frame_nr = 38, .flags = MF_F_PTCCH },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .sched_set = NB_PTCCH_DL, .modulo = 104, .frame_nr = 64, .flags = MF_F_PTCCH },</span><br><span style="color: hsl(120, 100%, 40%);">+     { .sched_set = NB_PTCCH_DL, .modulo = 104, .frame_nr = 90, .flags = MF_F_PTCCH },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   /* PTCCH/U for TAI 0 .. 3 */</span><br><span style="color: hsl(120, 100%, 40%);">+  { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 12 },</span><br><span style="color: hsl(120, 100%, 40%);">+  { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 38 },</span><br><span style="color: hsl(120, 100%, 40%);">+  { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 64 },</span><br><span style="color: hsl(120, 100%, 40%);">+  { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 90 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+        /* PTCCH/U for TAI 4 .. 7 */</span><br><span style="color: hsl(120, 100%, 40%);">+  { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 116 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 142 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 168 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 194 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* PTCCH/U for TAI 8 .. 11 */</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 220 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 246 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 272 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 298 },</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       /* PTCCH/U for TAI 12 .. 15 */</span><br><span style="color: hsl(120, 100%, 40%);">+        { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 324 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 350 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 376 },</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = AB_PTCCH_UL, .modulo = 416, .frame_nr = 402 },</span><br><span style="color: hsl(120, 100%, 40%);">+#endif</span><br><span style="color: hsl(120, 100%, 40%);">+ { .sched_set = NULL }</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Test TX */</span><br><span> static const struct mframe_sched_item mf_tx_all_nb[] = {</span><br><span>     { .sched_set = NB_QUAD_FH_UL, .modulo = 4, .frame_nr = 0 },</span><br><span>@@ -345,6 +391,9 @@</span><br><span>    [MF_TASK_TCH_H_0]    = mf_tch_h_0,</span><br><span>   [MF_TASK_TCH_H_1]    = mf_tch_h_1,</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+        [MF_TASK_GPRS_PDTCH] = mf_gprs_pdtch,</span><br><span style="color: hsl(120, 100%, 40%);">+ [MF_TASK_GPRS_PTCCH] = mf_gprs_ptcch,</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>      [MF_TASK_NEIGH_PM51_C0T0] = mf_neigh_pm51_c0t0,</span><br><span>      [MF_TASK_NEIGH_PM51] = mf_neigh_pm51,</span><br><span>        [MF_TASK_NEIGH_PM26E] = mf_neigh_pm26_even,</span><br><span>@@ -415,6 +464,10 @@</span><br><span>           break;</span><br><span> </span><br><span>   /* Osmocom specific extensions */</span><br><span style="color: hsl(120, 100%, 40%);">+     case MF_TASK_GPRS_PDTCH:</span><br><span style="color: hsl(120, 100%, 40%);">+      case MF_TASK_GPRS_PTCCH:</span><br><span style="color: hsl(120, 100%, 40%);">+              cbits = 0x18;</span><br><span style="color: hsl(120, 100%, 40%);">+         break;</span><br><span>       case MF_TASK_SDCCH4_CBCH:</span><br><span>            cbits = 0x19;</span><br><span>                break;</span><br><span>diff --git a/src/target/firmware/layer1/prim_rx_nb.c b/src/target/firmware/layer1/prim_rx_nb.c</span><br><span>index 38c7b53..c90c98c 100644</span><br><span>--- a/src/target/firmware/layer1/prim_rx_nb.c</span><br><span>+++ b/src/target/firmware/layer1/prim_rx_nb.c</span><br><span>@@ -126,6 +126,8 @@</span><br><span>                /* Set SACCH indication in Link IDentifier */</span><br><span>                if (mf_task_flags & MF_F_SACCH)</span><br><span>                  rxnb.dl->link_id = 0x40;</span><br><span style="color: hsl(120, 100%, 40%);">+           if (mf_task_flags & MF_F_PTCCH)</span><br><span style="color: hsl(120, 100%, 40%);">+                   rxnb.dl->link_id = 0x80;</span><br><span>          else</span><br><span>                         rxnb.dl->link_id = 0x00;</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.osmocom.org/c/osmocom-bb/+/17495">change 17495</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.osmocom.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.osmocom.org/c/osmocom-bb/+/17495"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: osmocom-bb </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-Change-Id: I44531bbe8743c188cc5d4a6ca2a63000e41d6189 </div>
<div style="display:none"> Gerrit-Change-Number: 17495 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: fixeria <axilirator@gmail.com> </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>