From 1447d0fa40d5c27f3a832949cc337420e1632710 Mon Sep 17 00:00:00 2001
From: Guy De Souza <desouza@eurecom.fr>
Date: Tue, 10 Apr 2018 14:38:59 +0200
Subject: [PATCH] Synchronization signals scheduling update

---
 cmake_targets/build_oai                      |  2 +-
 openair1/PHY/INIT/nr_init.c                  |  4 +-
 openair1/PHY/NR_TRANSPORT/nr_pss.c           | 16 ++++----
 openair1/PHY/NR_TRANSPORT/nr_sss.c           | 16 ++++----
 openair1/PHY/defs.h                          |  4 ++
 openair1/SCHED_NR/phy_procedures_nr_common.c | 39 ++++++++++++++++++++
 openair1/SCHED_NR/phy_procedures_nr_gNB.c    | 15 ++++++--
 targets/RT/USER/nr-ru.c                      | 14 +++----
 targets/RT/USER/nr-softmodem.c               |  6 +--
 9 files changed, 81 insertions(+), 35 deletions(-)

diff --git a/cmake_targets/build_oai b/cmake_targets/build_oai
index b41e53ea90..57f6bc9538 100755
--- a/cmake_targets/build_oai
+++ b/cmake_targets/build_oai
@@ -895,7 +895,7 @@ function main() {
  
   # build RF device and transport protocol libraries
   #####################################
-  if [ "$eNB" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" - o "$HWLAT" = "1" ] ; then
+  if [ "$eNB" = "1" -o "$UE" = "1" -o "$gNB" = "1" -o "$nrUE" = "1" -o "$HWLAT" = "1" ] ; then
 
       build_dir=$build_dir
 
diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c
index 785976084f..0e30ebfa62 100644
--- a/openair1/PHY/INIT/nr_init.c
+++ b/openair1/PHY/INIT/nr_init.c
@@ -80,7 +80,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB,
 
   // shortcuts
   NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
-  nfapi_config_request_t* cfg       = &gNB->gNB_config;
+  nfapi_config_request_t* cfg       = gNB->gNB_config;
   NR_gNB_COMMON* const common_vars  = &gNB->common_vars;
   LTE_eNB_PUSCH** const pusch_vars   = gNB->pusch_vars;
   LTE_eNB_SRS* const srs_vars        = gNB->srs_vars;
@@ -469,7 +469,7 @@ void phy_config_request(PHY_Config_t *phy_config) {
 void phy_free_nr_gNB(PHY_VARS_gNB *gNB)
 {
 //  NR_DL_FRAME_PARMS* const fp       = &gNB->frame_parms;
-  nfapi_config_request_t *cfg       = &gNB->gNB_config;
+  nfapi_config_request_t *cfg       = gNB->gNB_config;
   NR_gNB_COMMON* const common_vars  = &gNB->common_vars;
   LTE_eNB_PUSCH** const pusch_vars   = gNB->pusch_vars;
   LTE_eNB_SRS* const srs_vars        = gNB->srs_vars;
diff --git a/openair1/PHY/NR_TRANSPORT/nr_pss.c b/openair1/PHY/NR_TRANSPORT/nr_pss.c
index 5cf7d5b007..eba023692c 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_pss.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_pss.c
@@ -28,9 +28,8 @@
 int nr_generate_pss(  int16_t *d_pss,
                       int32_t **txdataF,
                       int16_t amp,
-                      int16_t ssb_start_subcarrier,
                       uint8_t ssb_start_symbol,
-                      nfapi_config_request_t config,
+                      nfapi_config_request_t* config,
                       NR_DL_FRAME_PARMS *frame_parms)
 {
   int i,m,k,l;
@@ -38,7 +37,7 @@ int nr_generate_pss(  int16_t *d_pss,
   int16_t x[NR_PSS_LENGTH];
   const int x_initial[7] = {0, 1, 1 , 0, 1, 1, 1};
 
-  uint8_t Nid2 = config.sch_config.physical_cell_id.value % 3;
+  uint8_t Nid2 = config->sch_config.physical_cell_id.value % 3;
 
   /// Sequence generation
   for (i=0; i < 7; i++)
@@ -50,22 +49,21 @@ int nr_generate_pss(  int16_t *d_pss,
 
   for (i=0; i < NR_PSS_LENGTH; i++) {
     m = (i + 43*Nid2)%(NR_PSS_LENGTH);
-    d_pss[i] = (1 - 2*x[m]) * 32767;
+    d_pss[i] = (1 - 2*x[m]) * 768;
   }
 
   /// Resource mapping
-  a = (config.rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
+  a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
 
-  for (aa = 0; aa < config.rf_config.tx_antenna_ports.value; aa++)
+  for (aa = 0; aa < config->rf_config.tx_antenna_ports.value; aa++)
   {
 
     // PSS occupies a predefined position (subcarriers 56-182, symbol 0) within the SSB block starting from
-    k = frame_parms->first_carrier_offset + ssb_start_subcarrier + 56; //and
+    k = frame_parms->first_carrier_offset + config->sch_config.ssb_subcarrier_offset.value + 56; //and
     l = ssb_start_symbol;
 
     for (m = 0; m < NR_PSS_LENGTH; m++) {
-      ((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_pss[m]) >> 15;
-      //((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k) + 1] = (a * pss_mod[2*m + 1]) >> 15;
+      ((short*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_pss[m]) >> 15;
       k+=1;
 
       if (k >= frame_parms->ofdm_symbol_size) {
diff --git a/openair1/PHY/NR_TRANSPORT/nr_sss.c b/openair1/PHY/NR_TRANSPORT/nr_sss.c
index a4970dd05a..0e9c400861 100644
--- a/openair1/PHY/NR_TRANSPORT/nr_sss.c
+++ b/openair1/PHY/NR_TRANSPORT/nr_sss.c
@@ -28,9 +28,8 @@ extern short nr_mod_table[MOD_TABLE_SIZE_SHORT];
 int nr_generate_sss(  int16_t *d_sss,
                       int32_t **txdataF,
                       int16_t amp,
-                      int16_t ssb_start_subcarrier,
                       uint8_t ssb_start_symbol,
-                      nfapi_config_request_t config,
+                      nfapi_config_request_t* config,
                       NR_DL_FRAME_PARMS *frame_parms)
 {
   int i,m,k,l;
@@ -42,7 +41,7 @@ int nr_generate_sss(  int16_t *d_sss,
   const int x1_initial[7] = { 1, 0, 0, 0, 0, 0, 0 };
 
   /// Sequence generation
-  Nid = config.sch_config.physical_cell_id.value;
+  Nid = config->sch_config.physical_cell_id.value;
   Nid2 = Nid % 3;
   Nid1 = (Nid - Nid2)/3;
 
@@ -60,22 +59,21 @@ int nr_generate_sss(  int16_t *d_sss,
   m1 = Nid1 % 112;
 
   for (i = 0; i < NR_SSS_LENGTH ; i++) {
-    d_sss[i] = (1 - 2*x0[(i + m0) % NR_SSS_LENGTH] ) * (1 - 2*x1[(i + m1) % NR_SSS_LENGTH] ) * 32767;
+    d_sss[i] = (1 - 2*x0[(i + m0) % NR_SSS_LENGTH] ) * (1 - 2*x1[(i + m1) % NR_SSS_LENGTH] ) * 768;
   }
 
   /// Resource mapping
-  a = (config.rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
+  a = (config->rf_config.tx_antenna_ports.value == 1) ? amp : (amp*ONE_OVER_SQRT2_Q15)>>15;
 
-  for (aa = 0; aa < config.rf_config.tx_antenna_ports.value; aa++)
+  for (aa = 0; aa < config->rf_config.tx_antenna_ports.value; aa++)
   {
 
     // SSS occupies a predefined position (subcarriers 56-182, symbol 2) within the SSB block starting from
-    k = frame_parms->first_carrier_offset + ssb_start_subcarrier + 56; //and
+    k = frame_parms->first_carrier_offset + config->sch_config.ssb_subcarrier_offset.value + 56; //and
     l = ssb_start_symbol + 2;
 
     for (m = 0; m < NR_SSS_LENGTH; m++) {
-      ((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_sss[2*m]) >> 15;
-      //((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k) + 1] = (a * sss_mod[2*m + 1]) >> 15;
+      ((int16_t*)txdataF[aa])[2*(l*frame_parms->ofdm_symbol_size + k)] = (a * d_sss[m]) >> 15;
       k+=1;
 
       if (k >= frame_parms->ofdm_symbol_size) {
diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h
index d627561065..c1a1b8e85c 100644
--- a/openair1/PHY/defs.h
+++ b/openair1/PHY/defs.h
@@ -1972,6 +1972,10 @@ typedef struct PHY_VARS_gNB_s {
   uint8_t pbch_pdu[4]; //PBCH_PDU_SIZE
   char gNB_generate_rar;
 
+  /// NR synchronization sequences
+  int16_t d_pss[NR_PSS_LENGTH];
+  int16_t d_sss[NR_SSS_LENGTH];
+
   /// Indicator set to 0 after first SR
   uint8_t first_sr[NUMBER_OF_UE_MAX];
 
diff --git a/openair1/SCHED_NR/phy_procedures_nr_common.c b/openair1/SCHED_NR/phy_procedures_nr_common.c
index e4cb626237..90b1662b2c 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_common.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_common.c
@@ -40,3 +40,42 @@ nr_subframe_t nr_subframe_select(nfapi_config_request_t *cfg,unsigned char subfr
   if (cfg->subframe_config.duplex_mode.value == FDD)
     return(SF_DL);
 }
+
+// First possible symbol is used with n=0
+int nr_get_ssb_start_symbol(nfapi_config_request_t *cfg, NR_DL_FRAME_PARMS *fp)
+{
+  int mu = cfg->subframe_config.numerology_index_mu.value;
+  int symbol = 0;
+
+  switch(mu) {
+
+  case NR_MU_0:
+    symbol = 2;
+    break;
+
+  case NR_MU_1: // case B
+    symbol = 4;
+    break;
+
+  case NR_MU_3:
+    symbol = 4;
+    break;
+
+  case NR_MU_4:
+    symbol = 8;
+    break;
+
+  default:
+    AssertFatal(0==1, "Invalid numerology index %d for the synchronization block\n", mu);
+  }
+
+  if (cfg->sch_config.half_frame_index)
+    symbol += (5 * fp->symbols_per_slot * fp->slots_per_subframe);
+
+  return symbol;
+}
+
+void nr_set_ssb_first_subcarrier(nfapi_config_request_t *cfg)
+{
+  cfg->sch_config.ssb_subcarrier_offset.value = 0;
+}
diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
index baaf375e9c..563f503f0e 100644
--- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c
+++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c
@@ -47,7 +47,16 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int subframe) {
   int **txdataF = gNB->common_vars.txdataF;
   uint8_t *pbch_pdu=&gNB->pbch_pdu[0];
 
-  LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d\n",frame,subframe); 
+  LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d\n",frame,subframe);
+
+  int ssb_start_symbol = nr_get_ssb_start_symbol(cfg, fp);
+  nr_set_ssb_first_subcarrier(cfg);
+
+  if (subframe == (cfg->sch_config.half_frame_index)? 0:5)
+  {
+    nr_generate_pss(gNB->d_pss, txdataF, AMP, ssb_start_symbol, cfg, fp);
+    nr_generate_sss(gNB->d_sss, txdataF, AMP_OVER_2, ssb_start_symbol, cfg, fp);
+  }
 
 }
 
@@ -66,8 +75,8 @@ void phy_procedures_gNB_TX(PHY_VARS_gNB *gNB,
 
   if ((cfg->subframe_config.duplex_mode.value == TDD) && (nr_subframe_select(cfg,subframe)==SF_UL)) return;
 
-  //VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1);
-  //if (do_meas==1) start_meas(&gNB->phy_proc_tx);
+  VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX+offset,1);
+  if (do_meas==1) start_meas(&gNB->phy_proc_tx);
 
   // clear the transmit data array for the current subframe
   for (aa=0; aa<cfg->rf_config.tx_antenna_ports.value; aa++) {      
diff --git a/targets/RT/USER/nr-ru.c b/targets/RT/USER/nr-ru.c
index 61e69bf359..2dba1f6d1b 100644
--- a/targets/RT/USER/nr-ru.c
+++ b/targets/RT/USER/nr-ru.c
@@ -1373,11 +1373,12 @@ static void* ru_thread( void* param ) {
     AssertFatal(ret==0,"Cannot connect to radio\n");
   }
   if (ru->if_south == LOCAL_RF) { // configure RF parameters only 
-        fill_rf_config(ru,ru->rf_config_file);
-        nr_init_frame_parms(ru->gNB_list[0]->gNB_config, fp);
-        phy_init_RU(ru);
- 
-        ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
+    fill_rf_config(ru,ru->rf_config_file);
+    nr_init_frame_parms(ru->gNB_list[0]->gNB_config, fp);
+    nr_dump_frame_parms(fp);
+    phy_init_RU(ru);
+
+    ret = openair0_device_load(&ru->rfdevice,&ru->openair0_cfg);
   }
   if (setup_RU_buffers(ru)!=0) {
         printf("Exiting, cannot initialize RU Buffers\n");
@@ -1391,9 +1392,6 @@ static void* ru_thread( void* param ) {
   pthread_mutex_unlock(&RC.ru_mutex);
   
   wait_sync("ru_thread");
-  
-
-
 
   // Start RF device if any
   if (ru->start_rf) {
diff --git a/targets/RT/USER/nr-softmodem.c b/targets/RT/USER/nr-softmodem.c
index facbdfcb76..a2e979fcf8 100644
--- a/targets/RT/USER/nr-softmodem.c
+++ b/targets/RT/USER/nr-softmodem.c
@@ -760,7 +760,7 @@ void wait_gNBs(void) {
 
       for (j=0;j<RC.nb_L1_CC[i];j++) {
 	if (RC.gNB[i][j]->configured==0) {
-	  waiting=1;
+	  waiting=0; //skip gNB configuration check
 	  break;
         } 
       }
@@ -839,7 +839,7 @@ int restart_L1L2(module_id_t gnb_id)
   int cc_id;
   MessageDef *msg_p = NULL;
 
-  LOG_W(ENB_APP, "restarting lte-softmodem\n");
+  LOG_W(ENB_APP, "restarting nr-softmodem\n");
 
   /* block threads */
   sync_var = -1;
@@ -859,7 +859,7 @@ int restart_L1L2(module_id_t gnb_id)
     LOG_E(RRC, "Create task for RRC eNB failed\n");
     return -1;
   } else {
-    LOG_I(RRC, "Re-created task for RRC eNB successfully\n");
+    LOG_I(RRC, "Re-created task for RRC gNB successfully\n");
   }
   if (itti_create_task (TASK_L2L1, l2l1_task, NULL) < 0) {
     LOG_E(PDCP, "Create task for L2L1 failed\n");
-- 
GitLab