From 64121aaf15054b797f71610bb7fd4ee229a1e183 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Tue, 26 Jul 2016 12:40:52 +0200
Subject: [PATCH] configuration files, minor changes in RF interface

---
 targets/ARCH/COMMON/common_lib.h              |  2 +-
 targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp  | 35 +++++-------
 .../CONF/enb.band7.tm1.100PRB.usrpb210.conf   | 24 +++++----
 .../CONF/enb.band7.tm1.50PRB.usrpb210.conf    |  2 +-
 .../CONF/enb.band7.tm1.usrpb210.conf          |  3 ++
 targets/RT/USER/lte-enb.c                     | 53 +++++++++++--------
 6 files changed, 64 insertions(+), 55 deletions(-)

diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h
index 17d1f7b180..99350a4c1e 100644
--- a/targets/ARCH/COMMON/common_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -152,8 +152,8 @@ typedef struct {
   int mmapped_dma;
   //! offset in samples between TX and RX paths
   int tx_sample_advance;
+  //! samples per packet on the fronthaul interface
   int samples_per_packet;
-  int tx_scheduling_advance;
   //! number of RX channels (=RX antennas)
   int rx_num_channels;
   //! number of TX channels (=TX antennas)
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index d8a65dc2ca..fc4f8d5d39 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -172,25 +172,32 @@ static void trx_usrp_end(openair0_device *device)
 */ 
 static int trx_usrp_write(openair0_device *device, openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags)
 {
+  int ret;
   usrp_state_t *s = (usrp_state_t*)device->priv;
-  s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
 
+  s->tx_md.time_spec = uhd::time_spec_t::from_ticks(timestamp, s->sample_rate);
 
+  
   if(flags)
     s->tx_md.has_time_spec = true;
   else
     s->tx_md.has_time_spec = false;
-
+  
   if (cc>1) {
     std::vector<void *> buff_ptrs;
     for (int i=0;i<cc;i++) buff_ptrs.push_back(buff[i]);
-    s->tx_stream->send(buff_ptrs, nsamps, s->tx_md);
+    ret = (int)s->tx_stream->send(buff_ptrs, nsamps, s->tx_md,1e-3);
   }
   else
-    s->tx_stream->send(buff[0], nsamps, s->tx_md);
+    ret = (int)s->tx_stream->send(buff[0], nsamps, s->tx_md,1e-3);
+
   s->tx_md.start_of_burst = false;
 
-  return 0;
+  if (ret != nsamps) {
+    printf("[xmit] tx samples %d != %d\n",ret,nsamps);
+  }
+      
+  return ret;
 }
 
 /*! \brief Receive samples from hardware.
@@ -551,28 +558,24 @@ extern "C" {
       openair0_cfg[0].tx_sample_advance     = 15;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
       break;
     case 15360000:
       openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 45;
       openair0_cfg[0].tx_bw                 = 10e6;
       openair0_cfg[0].rx_bw                 = 10e6;
-      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
       break;
     case 7680000:
       openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 50;
       openair0_cfg[0].tx_bw                 = 5e6;
       openair0_cfg[0].rx_bw                 = 5e6;
-      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
       break;
     case 1920000:
       openair0_cfg[0].samples_per_packet    = 256;
       openair0_cfg[0].tx_sample_advance     = 50;
       openair0_cfg[0].tx_bw                 = 1.25e6;
       openair0_cfg[0].rx_bw                 = 1.25e6;
-      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
       break;
     default:
       printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
@@ -607,44 +610,34 @@ extern "C" {
 
     switch ((int)openair0_cfg[0].sample_rate) {
     case 30720000:
-      s->usrp->set_master_clock_rate(30.72e6);
-      openair0_cfg[0].samples_per_packet    = 4096;
+      s->usrp->set_master_clock_rate(61.44e6);
       openair0_cfg[0].tx_sample_advance     = 115;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet;
       break;
     case 23040000:
       s->usrp->set_master_clock_rate(23.04e6); //to be checked
-      openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 113;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
       break;
     case 15360000:
       s->usrp->set_master_clock_rate(30.72e06);
-      openair0_cfg[0].samples_per_packet    = 2048;
       openair0_cfg[0].tx_sample_advance     = 103; 
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].tx_scheduling_advance = 10240;
       break;
     case 7680000:
       s->usrp->set_master_clock_rate(30.72e6);
-      openair0_cfg[0].samples_per_packet    = 1024;
       openair0_cfg[0].tx_sample_advance     = 80;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
       break;
     case 1920000:
-      s->usrp->set_master_clock_rate(7.68e6);
-      openair0_cfg[0].samples_per_packet    = 256;
+      s->usrp->set_master_clock_rate(30.72e6);
       openair0_cfg[0].tx_sample_advance     = 40;
       openair0_cfg[0].tx_bw                 = 20e6;
       openair0_cfg[0].rx_bw                 = 20e6;
-      openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
       break;
     default:
       printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf
index 7d34889f67..a2187d402f 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.100PRB.usrpb210.conf
@@ -23,12 +23,15 @@ eNBs =
 
     component_carriers = (
       {
+        node_function                                         = "eNodeB_3GPP";
+	node_timing                                           = "synch_to_ext_device";
+	node_synch_ref                                        = 0;
         frame_type					      = "FDD";
         tdd_config 					      = 3;
         tdd_config_s            			      = 0;
         prefix_type             			      = "NORMAL";
         eutra_band              			      = 7;
-        downlink_frequency      			      = 2680000000L;
+        downlink_frequency      			      = 2660000000L;
         uplink_frequency_offset 			      = -120000000;
         Nid_cell					      = 0;
         N_RB_DL                 			      = 100;
@@ -46,7 +49,7 @@ eNBs =
         pucch_nRB_CQI           			      = 1;
         pucch_nCS_AN            			      = 0;
         pucch_n1_AN             			      = 32;
-        pdsch_referenceSignalPower 			      = -26;
+        pdsch_referenceSignalPower 			      = -29;
         pdsch_p_b                  			      = 0;
         pusch_n_SB                 			      = 1;
         pusch_enable64QAM          			      = "DISABLE";
@@ -64,9 +67,9 @@ eNBs =
         srs_ackNackST                                      =;
         srs_MaxUpPts                                       =;*/
 
-        pusch_p0_Nominal                                   = -90;
+        pusch_p0_Nominal                                   = -96;
         pusch_alpha                                        = "AL1";
-        pucch_p0_Nominal                                   = -100;
+        pucch_p0_Nominal                                   = -103;
         msg3_delta_Preamble                                = 6;
         pucch_deltaF_Format1                               = "deltaF2";
         pucch_deltaF_Format1b                              = "deltaF3";
@@ -82,7 +85,7 @@ eNBs =
         rach_messagePowerOffsetGroupB                      = ;
         */
         rach_powerRampingStep                              = 4;
-        rach_preambleInitialReceivedTargetPower            = -108;
+        rach_preambleInitialReceivedTargetPower            = -104;
         rach_preambleTransMax                              = 10;
         rach_raResponseWindowSize                          = 10;
         rach_macContentionResolutionTimer                  = 48;
@@ -130,7 +133,7 @@ eNBs =
     };
 
     ////////// MME parameters:
-    mme_ip_address      = ( { ipv4       = "192.168.12.11";
+    mme_ip_address      = ( { ipv4       = "127.0.0.3";
                               ipv6       = "192:168:30::17";
                               active     = "yes";
                               preference = "ipv4";
@@ -139,11 +142,11 @@ eNBs =
 
     NETWORK_INTERFACES :
     {
-        ENB_INTERFACE_NAME_FOR_S1_MME            = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1_MME              = "192.168.12.215/24";
+        ENB_INTERFACE_NAME_FOR_S1_MME            = "lo";
+        ENB_IPV4_ADDRESS_FOR_S1_MME              = "127.0.0.2/24";
 
-        ENB_INTERFACE_NAME_FOR_S1U               = "eth0";
-        ENB_IPV4_ADDRESS_FOR_S1U                 = "192.168.12.215/24";
+        ENB_INTERFACE_NAME_FOR_S1U               = "lo";
+        ENB_IPV4_ADDRESS_FOR_S1U                 = "127.0.0.4/24";
         ENB_PORT_FOR_S1U                         = 2152; # Spec 2152
     };
 
@@ -164,6 +167,5 @@ eNBs =
       rrc_log_level                         ="info";
       rrc_log_verbosity                     ="medium";
    };
-
   }
 );
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
index b6ba5213ef..d2e99a3481 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.50PRB.usrpb210.conf
@@ -25,7 +25,7 @@ eNBs =
       {
         node_function                                         = "eNodeB_3GPP";
 	node_timing                                           = "synch_to_ext_device";
-	node_synch_ref                                        = 0; 
+	node_synch_ref                                        = 0;
         frame_type					      = "FDD";
         tdd_config 					      = 3;
         tdd_config_s            			      = 0;
diff --git a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf
index ae2b076a49..c73c4ef809 100644
--- a/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf
+++ b/targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.usrpb210.conf
@@ -23,6 +23,9 @@ eNBs =
 
     component_carriers = (
       {
+        node_function                                         = "eNodeB_3GPP";
+	node_timing                                           = "synch_to_ext_device";
+	node_synch_ref                                        = 0;
         frame_type					      = "FDD";
         tdd_config 					      = 3;
         tdd_config_s            			      = 0;
diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c
index ff302ec80d..93795c7220 100644
--- a/targets/RT/USER/lte-enb.c
+++ b/targets/RT/USER/lte-enb.c
@@ -298,7 +298,8 @@ static void* eNB_thread_rxtx( void* param ) {
   FILE  *tx_time_file = NULL;
   char tx_time_name[101];
   void *txp[PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx]; 
-  
+  int txs;
+
   uint16_t packet_type;
   uint32_t symbol_number=0;
   
@@ -553,18 +554,21 @@ static void* eNB_thread_rxtx( void* param ) {
       for (i=0; i<PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx; i++)
         txp[i] = (void*)&PHY_vars_eNB_g[0][0]->common_vars.txdata[0][i][proc->subframe_tx*PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti];
     
-      // if symb_written < spp ==> error 
-      PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice,
-            (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance),
-            txp,
-            PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti,
-            PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
-            1);
+      txs = PHY_vars_eNB_g[0][proc->CC_id]->rfdevice.trx_write_func(&PHY_vars_eNB_g[0][proc->CC_id]->rfdevice,
+								    (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance),
+								    txp,
+								    PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti,
+								    PHY_vars_eNB_g[0][0]->frame_parms.nb_antennas_tx,
+								    1);
 	      
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
  
       VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff );
 
+      if (txs !=  PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti) {
+	LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, PHY_vars_eNB_g[0][0]->frame_parms.samples_per_tti);
+	exit_fun( "problem transmitting samples" );
+      }	
     } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) {
       /// **** send_IF5 of txdata to RRH **** ///       
       VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 );  
@@ -651,7 +655,7 @@ static void* eNB_thread_asynch_rx( void* param ) {
   uint32_t symbol_mask, symbol_mask_full;
   int prach_rx;
   int dummy_rx[fp->nb_antennas_rx][fp->samples_per_tti]; 
-  int rxs;
+  int rxs=0;
 
 #ifdef DEADLINE_SCHEDULER
   struct sched_attr attr;
@@ -770,6 +774,9 @@ static void* eNB_thread_asynch_rx( void* param ) {
       printf("eNB asynch RX\n");
       sleep(1);
     }
+    if (rxs!=fp->samples_per_tti) {
+      exit_fun("error receiving samples\n");
+    }
   }
   else if (eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF
       /// **** recv_IF5 of rxdata from RRH **** ///       
@@ -1031,7 +1038,7 @@ static void* eNB_thread_FH( void* param ) {
       
       while (proc->instance_cnt_FH < 0) {
         // most of the time the thread is waiting here
-        // proc->instance_cnt_prach is -1
+        // proc->instance_cnt_FH is -1
         pthread_cond_wait( &proc->cond_FH,&proc->mutex_FH ); // this unlocks mutex_rxtx while waiting and then locks it again
       }      
       proc->instance_cnt_FH++;
@@ -1243,15 +1250,19 @@ static void* eNB_thread_FH( void* param ) {
     
     print_meas_now(&softmodem_stats_rx_sf,"eNB_RX_SF", rx_time_file);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0+(proc->subframe_rx&1), 0 );
-  }
+  
  
-  if (eNB->node_timing == synch_to_ext_device) {
-    proc->instance_cnt_FH--;
-    
-    if (pthread_mutex_unlock(&proc->mutex_FH) != 0) {
-      LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for FH\n");
-      exit_fun( "error unlocking mutex" );
+    if (eNB->node_timing == synch_to_ext_device) {
+      proc->instance_cnt_FH--;
+      
+      if (pthread_mutex_unlock(&proc->mutex_FH) != 0) {
+	LOG_E( PHY, "[SCHED][eNB] error unlocking mutex for FH\n");
+	exit_fun( "error unlocking mutex" );
+      }
     }
+
+    if (eNB->frame_parms.N_RB_DL==6)
+      rt_sleep_ns(800000LL);
   }
     
   printf( "Exiting FH thread \n");
@@ -1271,12 +1282,12 @@ static void* eNB_thread_prach( void* param ) {
 
   eNB_proc_t *proc = (eNB_proc_t*)param;
   PHY_VARS_eNB *eNB= PHY_vars_eNB_g[0][proc->CC_id];
-
+  /*
   struct timespec wait;
 
   wait.tv_sec=0;
   wait.tv_nsec=5000000L;
-
+  */
   // set default return value
   eNB_thread_prach_status = 0;
 
@@ -1378,7 +1389,7 @@ static void* eNB_thread_prach( void* param ) {
     
     if (oai_exit) break;
         
-    if (pthread_mutex_timedlock(&proc->mutex_prach,&wait) != 0) {
+    if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
       LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH\n");
       exit_fun( "error locking mutex" );
       break;
@@ -1400,7 +1411,7 @@ static void* eNB_thread_prach( void* param ) {
     prach_procedures(eNB,0);
     VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX,0);
     
-    if (pthread_mutex_timedlock(&proc->mutex_prach,&wait) != 0) {
+    if (pthread_mutex_lock(&proc->mutex_prach) != 0) {
       LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB PRACH proc %d\n");
       exit_fun( "error locking mutex" );
       break;
-- 
GitLab