From a413f12d9c62bc83825d38d014988b7f4661ec0a Mon Sep 17 00:00:00 2001
From: Florian Kaltenberger <florian.kaltenberger@eurecom.fr>
Date: Mon, 9 Apr 2018 08:07:52 -0700
Subject: [PATCH] adding support for bandwidths 40 and 80 MHz to usrp_lib and
 rru

---
 targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp | 29 +++++++
 targets/RT/USER/lte-softmodem.c              |  6 +-
 targets/RT/USER/nr-ru.c                      | 90 +++++++++++++-------
 targets/RT/USER/nr-softmodem.c               |  6 +-
 4 files changed, 94 insertions(+), 37 deletions(-)

diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 9b1755954a..f77996b2e8 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -1016,6 +1016,30 @@ extern "C" {
             LOG_I(PHY,"%s() sample_rate:%u\n", __FUNCTION__, (int)openair0_cfg[0].sample_rate);
 
             switch ((int)openair0_cfg[0].sample_rate) {
+	    case 122880000:
+                // from usrp_time_offset
+                //openair0_cfg[0].samples_per_packet    = 2048;
+ 	        openair0_cfg[0].tx_sample_advance     = 15; //to be checked
+                openair0_cfg[0].tx_bw                 = 80e6;
+                openair0_cfg[0].rx_bw                 = 80e6;
+                break;
+	    case 92160000:
+ 	        openair0_cfg[0].tx_sample_advance     = 15; //to be checked
+                openair0_cfg[0].tx_bw                 = 80e6;
+                openair0_cfg[0].rx_bw                 = 80e6;
+		break;
+            case 61440000:
+                // from usrp_time_offset
+                //openair0_cfg[0].samples_per_packet    = 2048;
+                openair0_cfg[0].tx_sample_advance     = 15;
+                openair0_cfg[0].tx_bw                 = 40e6;
+                openair0_cfg[0].rx_bw                 = 40e6;
+                break;
+	    case 46080000:
+                openair0_cfg[0].tx_sample_advance     = 15;
+                openair0_cfg[0].tx_bw                 = 40e6;
+                openair0_cfg[0].rx_bw                 = 40e6;
+                break;
             case 30720000:
                 // from usrp_time_offset
                 //openair0_cfg[0].samples_per_packet    = 2048;
@@ -1023,6 +1047,11 @@ extern "C" {
                 openair0_cfg[0].tx_bw                 = 20e6;
                 openair0_cfg[0].rx_bw                 = 20e6;
                 break;
+	    case 23040000:
+                openair0_cfg[0].tx_sample_advance     = 15;
+                openair0_cfg[0].tx_bw                 = 20e6;
+                openair0_cfg[0].rx_bw                 = 20e6;
+                break;
             case 15360000:
                 //openair0_cfg[0].samples_per_packet    = 2048;
                 openair0_cfg[0].tx_sample_advance     = 45;
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 59775a2c0d..39f532f222 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -627,7 +627,7 @@ void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
 
 }
 
-
+/*
 void init_openair0(void) {
 
   int card;
@@ -710,9 +710,9 @@ void init_openair0(void) {
 	     openair0_cfg[card].tx_freq[i],
 	     openair0_cfg[card].rx_freq[i]);
     }
-  } /* for loop on cards */
+  } // for loop on cards
 }
-
+*/
 
 void wait_RUs(void) {
 
diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c
index 80f924b3c9..61e69bf359 100644
--- a/targets/RT/USER/nr-ru.c
+++ b/targets/RT/USER/nr-ru.c
@@ -1168,38 +1168,66 @@ void fill_rf_config(RU_t *ru, char *rf_config_file) {
   nfapi_config_request_t *gNB_config = ru->gNB_list[0]->gNB_config; //tmp index
   openair0_config_t *cfg   = &ru->openair0_cfg;
   int N_RB = gNB_config->rf_config.dl_channel_bandwidth.value;
-
-  if(N_RB == 100) {
-    if (fp->threequarter_fs) {
-      cfg->sample_rate=23.04e6;
-      cfg->samples_per_frame = 230400; 
-      cfg->tx_bw = 10e6;
-      cfg->rx_bw = 10e6;
-    }
-    else {
-      cfg->sample_rate=30.72e6;
-      cfg->samples_per_frame = 307200; 
-      cfg->tx_bw = 10e6;
-      cfg->rx_bw = 10e6;
-    }
-  } else if(N_RB == 50) {
-    cfg->sample_rate=15.36e6;
-    cfg->samples_per_frame = 153600;
-    cfg->tx_bw = 5e6;
-    cfg->rx_bw = 5e6;
-  } else if (N_RB == 25) {
-    cfg->sample_rate=7.68e6;
-    cfg->samples_per_frame = 76800;
-    cfg->tx_bw = 2.5e6;
-    cfg->rx_bw = 2.5e6;
-  } else if (N_RB == 6) {
-    cfg->sample_rate=1.92e6;
-    cfg->samples_per_frame = 19200;
-    cfg->tx_bw = 1.5e6;
-    cfg->rx_bw = 1.5e6;
+  int mu = gNB_config->subframe_config.numerology_index_mu.value;
+
+  if (mu == NR_MU_0) { //or if LTE
+     if(N_RB == 100) {
+       if (fp->threequarter_fs) {
+	 cfg->sample_rate=23.04e6;
+	 cfg->samples_per_frame = 230400; 
+	 cfg->tx_bw = 10e6;
+	 cfg->rx_bw = 10e6;
+       }
+       else {
+	 cfg->sample_rate=30.72e6;
+	 cfg->samples_per_frame = 307200; 
+	 cfg->tx_bw = 10e6;
+	 cfg->rx_bw = 10e6;
+       }
+     } else if(N_RB == 50) {
+       cfg->sample_rate=15.36e6;
+       cfg->samples_per_frame = 153600;
+       cfg->tx_bw = 5e6;
+       cfg->rx_bw = 5e6;
+     } else if (N_RB == 25) {
+       cfg->sample_rate=7.68e6;
+       cfg->samples_per_frame = 76800;
+       cfg->tx_bw = 2.5e6;
+       cfg->rx_bw = 2.5e6;
+     } else if (N_RB == 6) {
+       cfg->sample_rate=1.92e6;
+       cfg->samples_per_frame = 19200;
+       cfg->tx_bw = 1.5e6;
+       cfg->rx_bw = 1.5e6;
+     }
+     else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
   }
-  else AssertFatal(1==0,"Unknown N_RB %d\n",N_RB);
-
+  else if (mu == NR_MU_1) {
+    if(N_RB == 217) {
+      if (fp->threequarter_fs) {
+	cfg->sample_rate=92.16e6;
+	cfg->samples_per_frame = 921600; 
+	cfg->tx_bw = 40e6;
+	cfg->rx_bw = 40e6;
+      }
+      else {
+	cfg->sample_rate=122.88e6;
+	cfg->samples_per_frame = 1228800; 
+	cfg->tx_bw = 40e6;
+	cfg->rx_bw = 40e6;
+      }
+    } else if(N_RB == 106) {
+      cfg->sample_rate=61.44e6;
+      cfg->samples_per_frame = 614400;
+      cfg->tx_bw = 20e6;
+      cfg->rx_bw = 20e6;
+    } else {
+      AssertFatal(0==1,"N_RB %d not yet supported for numerology %d\n",N_RB,mu);
+    }          
+  } else {
+    AssertFatal(0 == 1,"Numerology %d not supported for the moment\n",mu);
+  }
+  
   if (gNB_config->subframe_config.duplex_mode.value==TDD)
     cfg->duplex_mode = duplex_mode_TDD;
   else //FDD
diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c
index 8d4ede633c..facbdfcb76 100644
--- a/targets/RT/USER/nr-softmodem.c
+++ b/targets/RT/USER/nr-softmodem.c
@@ -642,7 +642,7 @@ void set_default_frame_parms(nfapi_config_request_t *config[MAX_NUM_CCs], NR_DL_
 
 }
 
-
+/*
 void init_openair0(void) {
 
   int card;
@@ -725,9 +725,9 @@ void init_openair0(void) {
 	     openair0_cfg[card].tx_freq[i],
 	     openair0_cfg[card].rx_freq[i]);
     }
-  } /* for loop on cards */
+  } // for loop on cards 
 }
-
+*/
 
 void wait_RUs(void) {
 
-- 
GitLab