From a491fbb1aa076b53802ba1ae4a661745ff67c0cc Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Mon, 14 Jul 2014 13:47:29 +0000
Subject: [PATCH] git-svn-id: http://svn.eurecom.fr/openair4G/trunk@5493
 818b1a75-f10b-46b9-bf7c-635c3b92a50f

---
 .../LIB/usrp_lib.h => COMMON/common_lib.h}    |   27 +-
 .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c  |   96 +-
 .../ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h  |    3 +
 targets/ARCH/USRP/USERSPACE/LIB/Makefile.inc  |    2 +-
 targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp  |    2 +-
 targets/RT/USER/Makefile                      |   43 +-
 targets/RT/USER/lte-softmodem.c               | 2120 ++++++++---------
 7 files changed, 1098 insertions(+), 1195 deletions(-)
 rename targets/ARCH/{USRP/USERSPACE/LIB/usrp_lib.h => COMMON/common_lib.h} (83%)

diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h b/targets/ARCH/COMMON/common_lib.h
similarity index 83%
rename from targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h
rename to targets/ARCH/COMMON/common_lib.h
index 2f2ba098884..203d38767a6 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.h
+++ b/targets/ARCH/COMMON/common_lib.h
@@ -1,14 +1,21 @@
-/** usrp_lib.h
+/** common_lib.h
  *
  * Author: HongliangXU : hong-liang-xu@agilent.com
  */
-#ifndef USRP_LIB_H
-#define USRP_LIB_H
+#ifndef COMMON_LIB_H
+#define COMMON_LIB_H
+#include <stdint.h>
 
 typedef int64_t openair0_timestamp;
 typedef struct openair0_device_t openair0_device;
 /* structrue holds the parameters to configure USRP devices
  */
+
+typedef enum {
+  max_gain=0,med_gain,byp_gain
+} rx_gain_t;
+
+
 typedef struct {
   /* the sample rate for both transmit and receive. */
   double sample_rate;
@@ -17,13 +24,15 @@ typedef struct {
   /* number of TX channels (=TX antennas) */
   int tx_num_channels;
   /* center frequency in Hz for RX */
-  double rx_freq;
+  double rx_freq[4];
   /* center frequency in Hz for TX */
-  double tx_freq;
+  double tx_freq[4];
+  /* mode for rxgain (ExpressMIMO2)*/
+  rx_gain_t rxg_mode[4];
   /* gain for RX in dB */
-  double rx_gain;
+  double rx_gain[4];
   /* gain for TX in dB */
-  double tx_gain;
+  double tx_gain[4];
   /* RX bandwidth in Hz */
   double rx_bw;
   /* TX bandwidth in Hz */
@@ -65,6 +74,8 @@ extern "C"
 /* return 0 if OK, < 0 if error */
 int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg);
 }
+#else
+int openair0_device_init(openair0_device* device, openair0_config_t *openair0_cfg);
 #endif
 
-#endif // USRP_LIB_H
+#endif // COMMON_LIB_H
diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
index dc81620073d..a6d1f25d397 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
+++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.c
@@ -16,7 +16,8 @@
 
 #include "openair0_lib.h"
 #include "openair_device.h"
-
+#include "common_lib.h"
+#define max(a,b) ((a)>(b) ? (a) : (b))
 exmimo_pci_interface_bot_virtual_t openair0_exmimo_pci[MAX_CARDS]; // contains userspace pointers for each card
 
 char *bigshm_top[MAX_CARDS] = INIT_ZEROS;
@@ -42,7 +43,8 @@ int openair0_open(void)
     
     int card;
     int ant;
-    
+    int openair0_num_antennas[4];
+
     PAGE_SHIFT = log2_int( sysconf( _SC_PAGESIZE ) );
     
     if ((openair0_fd = open("/dev/openair0", O_RDWR,0)) <0)
@@ -187,3 +189,93 @@ int openair0_stop_without_reset(int card)
 {
     return ioctl(openair0_fd, openair_STOP_WITHOUT_RESET, card);
 }
+
+static exmimo_config_t         *p_exmimo_config;
+static exmimo_id_t             *p_exmimo_id;
+#define MY_RF_MODE      (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX)
+#define RF_MODE_BASE    (TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM)
+
+int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cfg) {
+
+  // Initialize card
+  int ret;
+  int ant;
+
+  ret = openair0_open();
+  if ( ret != 0 ) {
+    if (ret == -1)
+      printf("Error opening /dev/openair0");
+    if (ret == -2)
+      printf("Error mapping bigshm");
+    if (ret == -3)
+      printf("Error mapping RX or TX buffer");
+    return(ret);
+  }
+
+  printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[0]);
+  
+  p_exmimo_config = openair0_exmimo_pci[0].exmimo_config_ptr;
+  p_exmimo_id     = openair0_exmimo_pci[0].exmimo_id_ptr;
+  
+  printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", 0, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
+
+  // check if the software matches firmware
+  if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) {
+    printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev);
+    exit(-1);
+  }
+
+  if (p_exmimo_id->board_swrev>=9)
+    p_exmimo_config->framing.eNB_flag   = 0; 
+  else 
+    p_exmimo_config->framing.eNB_flag   = 1;//!UE_flag;
+
+  p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
+#if (BOARD_SWREV_CNTL2>=0x0A)
+  for (ant=0; ant<4; ant++)
+    p_exmimo_config->framing.resampling_factor[ant] = 2;
+#else
+    p_exmimo_config->framing.resampling_factor = 2;
+#endif
+
+  for (ant=0;ant<max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant++) 
+    p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE;
+  for (ant=0;ant<openair0_cfg->tx_num_channels;ant++)
+    p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
+  for (ant=0;ant<openair0_cfg->rx_num_channels;ant++) {
+    p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
+    switch (openair0_cfg->rxg_mode[ant]) {
+    default:
+    case max_gain:
+      p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMax;
+      break;
+    case med_gain:
+      p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAMed;
+      break;
+    case byp_gain:
+      p_exmimo_config->rf.rf_mode[ant] = (p_exmimo_config->rf.rf_mode[ant]&(~LNAGAINMASK))|LNAByp;
+      break;
+    }
+  }
+  for (ant=max(openair0_cfg->tx_num_channels,openair0_cfg->rx_num_channels);ant<4;ant++) {
+    p_exmimo_config->rf.rf_mode[ant] = 0;
+  }
+  
+  for (ant = 0; ant<openair0_cfg->rx_num_channels; ant++) { 
+    p_exmimo_config->rf.do_autocal[ant] = 1;
+    p_exmimo_config->rf.rf_freq_rx[ant] = (unsigned int)openair0_cfg->rx_freq[ant];
+    p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->rx_gain;
+  }
+  for (ant = 0; ant<openair0_cfg->tx_num_channels; ant++) { 
+    p_exmimo_config->rf.do_autocal[ant] = 1;
+    p_exmimo_config->rf.rf_freq_tx[ant] = (unsigned int)openair0_cfg->tx_freq[ant];
+    p_exmimo_config->rf.tx_gain[ant][0] = (unsigned int)openair0_cfg->tx_gain;
+  }
+
+}
+
+unsigned int *openair0_daq_cnt() {
+
+  return((unsigned int *)openair0_exmimo_pci[0].rxcnt_ptr[0]);
+
+}
diff --git a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h
index b06cc4805a7..de793b25302 100644
--- a/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h
+++ b/targets/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.h
@@ -12,6 +12,7 @@
 
 #include "pcie_interface.h"
 #include "openair_device.h"
+#include "common_lib.h"
 
 // Use this to access shared memory (configuration structures, adc/dac data buffers, ...)
 // contains userspace pointers
@@ -53,5 +54,7 @@ int openair0_stop(int card);
 // return 0 on success
 int openair0_stop_without_reset(int card);
 
+// return the DAQ block counter
+unsigned int *openair0_daq_cnt();
 
 #endif
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/Makefile.inc b/targets/ARCH/USRP/USERSPACE/LIB/Makefile.inc
index d50783d6657..0c426078beb 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/Makefile.inc
+++ b/targets/ARCH/USRP/USERSPACE/LIB/Makefile.inc
@@ -1,4 +1,4 @@
 USRP_OBJ += $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.o
 USRP_FILE_OBJ += $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
-USRP_CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/
+USRP_CFLAGS += -I$(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/COMMON
 
diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
index 27e0ba15764..3d736a1ed42 100644
--- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
+++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp
@@ -16,7 +16,7 @@
 #include <complex>
 #include <fstream>
 #include <cmath>
-#include "usrp_lib.h"
+#include "common_lib.h"
 
 typedef struct
 {
diff --git a/targets/RT/USER/Makefile b/targets/RT/USER/Makefile
index 4151d1a8d53..b85f0eef5ed 100644
--- a/targets/RT/USER/Makefile
+++ b/targets/RT/USER/Makefile
@@ -18,12 +18,13 @@ ifeq "$(GCCVERSION)" "4.6.1"
 endif
 
 CFLAGS += -O2 
-CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
+CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/COMMON -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
 ifdef DEBUG
 CFLAGS += -g -ggdb
 endif
 SRC = synctest.c condtest.c #lte-softmodem.c
 
+
 ifndef RTAI
 RTAI=1
 endif
@@ -55,24 +56,14 @@ endif
 ifeq ($(RTAI),1)
 CFLAGS += -DENABLE_RTAI_CLOCK
 CFLAGS += -DCONFIG_RTAI_LXRT_INLINE  #remend the RTAI warning
-RTAI_OBJ = sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o 
-ifeq ($(USRP),1)
-RTAI_OBJ += lte-softmodem-usrp.o
-endif
+RTAI_OBJ = sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o 
 else #RTAI
 CFLAGS += -DENABLE_USE_CPU_EXECUTION_TIME
-OBJ += sched_dlsch.o sched_ulsch.o sched_rx_pdsch.o rt_wrapper.o
-ifeq ($(USRP),1)
-OBJ += lte-softmodem-usrp.o
-endif
+OBJ += sched_dlsch.o sched_rx_pdsch.o rt_wrapper.o
 endif
 
 OBJ += $(OPENAIR1_DIR)/SIMULATION/TOOLS/taus.o $(OPENAIR_TARGETS)/SIMU/USER/init_lte.o #$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o 
 
-ifeq ($(USRP),1)
-include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc
-endif
-
 OBJ += $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/openair0_lib.o $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/gain_control.o
 CFLAGS += -DDRIVER2013 -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/LIB/ -I$(OPENAIR_TARGETS)/ARCH/EXMIMO/DEFS -DENABLE_VCD_FIFO
 
@@ -94,6 +85,14 @@ include $(OPENAIR2_DIR)/RRC/NAS/Makefile.inc
 include $(OPENAIR2_DIR)/ENB_APP/Makefile.inc
 include $(OPENAIR3_DIR)/RAL-LTE/Makefile.inc
 
+ifeq ($(USRP),1)
+
+include $(OPENAIR_TARGETS)/ARCH/USRP/USERSPACE/LIB/Makefile.inc
+CFLAGS += -I/opt/uhd/include -L/opt/uhd/lib -luhd -lpthread -lstdc++
+CFLAGS += -DUSRP
+LDFLAGS += -L/opt/uhd/lib -luhd -lpthread -lstdc++ 
+endif
+
 OBJ +=  $(ENB_APP_OBJS)
 
 ifeq ($(RTAI),1)
@@ -119,6 +118,8 @@ endif
 
 RTAI_OBJ += $(UTILS_OBJS)
 
+
+
 ifdef ENABLE_ITTI
 CFLAGS += -DEXMIMO_IOT
 endif
@@ -205,8 +206,12 @@ $(LFDS_LIB):
 	@if [ ! -d $(LFDS_OBJ_DIR)/obj ]; then mkdir -p $(LFDS_OBJ_DIR)/obj; fi;
 	$(MAKE) -C $(LFDS_DIR) -f makefile.linux OUTDIR=$(LFDS_OBJ_DIR)
 
+$(USRP_OBJ):$(USRP_FILE_OBJ)
+	@echo Compiling $<
+	@$(CXX) -c  $(USRP_CFLAGS) $(USRP_FILE_OBJ) -o $(USRP_OBJ)
+
 ifeq ($(RTAI),1)
-$(RTAI_OBJ) lte-enb.o lte-softmodem.o: %.o : %.c
+$(RTAI_OBJ) lte-softmodem.o: %.o : %.c
 else
 $(RTAI_OBJ): %.o : %.c
 endif
@@ -256,18 +261,10 @@ synctest: $(OBJ_SYNC) $(SHARED_DEPENDENCIES) synctest.c
 sleeptest: rt_wrapper.o sleeptest.c
 	$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) rt_wrapper.o -o sleeptest sleeptest.c $(LDFLAGS) 
 
-lte-softmodem: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-softmodem.o $(SHARED_DEPENDENCIES)
+lte-softmodem: $(OBJ) $(USRP_OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-softmodem.o $(SHARED_DEPENDENCIES)
 	@echo Linking $@
 	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-softmodem.o -o lte-softmodem $(LDFLAGS) $(LIBS)
 
-lte-enb: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) lte-enb.o $(SHARED_DEPENDENCIES)
-	@echo Linking $@
-	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) lte-enb.o -o lte-enb $(LDFLAGS) $(LIBS)
-
-lte-softmodem-usrp: $(OBJ) $(ASN1_MSG_OBJS1) $(RTAI_OBJ) $(USRP_OBJ) $(SHARED_DEPENDENCIES)
-	@echo Linking $@
-	@$(CC) $(USRP_OBJ) $(CFLAGS) $(OBJ) $(RTAI_OBJ) $(ASN1_MSG_OBJS1) -o lte-softmodem-usrp $(LDFLAGS) $(LIBS)
-
 emos-raw: $(SHARED_DEPENDENCIES) $(OBJ_EMOS) emos-raw.c
 	@$(CC) $(CFLAGS) $(EXTRA_CFLAGS) $(RTAI_CFLAGS) $(OBJ_EMOS) -o emos-raw emos-raw.c $(LDFLAGS) $(LIBS)
 
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index 5556a2624d9..0579b4b6401 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -121,9 +121,6 @@ unsigned short config_frames[4] = {2,9,11,13};
 
 #define DEBUG_THREADS 1
 
-#define MY_RF_MODE      (RXEN + TXEN + TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM + DMAMODE_RX + DMAMODE_TX)
-#define RF_MODE_BASE    (TXLPFNORM + TXLPFEN + TXLPF25 + RXLPFNORM + RXLPFEN + RXLPF25 + LNA1ON +LNAMax + RFBBNORM)
-
 struct timing_info_t {
   //unsigned int frame, hw_slot, last_slot, next_slot;
   RTIME time_min, time_max, time_avg, time_last, time_now;
@@ -138,12 +135,11 @@ int init_dlsch_threads(void);
 void cleanup_dlsch_threads(void);
 int32_t init_rx_pdsch_thread(void);
 void cleanup_rx_pdsch_thread(void);
-int init_ulsch_threads(void);
-void cleanup_ulsch_threads(void);
+
+
 
 void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
 void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier);
-void test_config(int card, int ant, unsigned int rf_mode, int UE_flag);
 
 #ifdef XFORMS
 // current status is that every UE has a DL scope for a SINGLE eNB (eNB_id=0)
@@ -181,6 +177,9 @@ static pthread_t                thread2; //xforms
 static pthread_t                thread3; //emos
 #endif
 
+openair0_device openair0;
+openair0_timestamp timestamp;
+
 /*
   static int instance_cnt=-1; //0 means worker is busy, -1 means its free
   int instance_cnt_ptr_kern,*instance_cnt_ptr_user;
@@ -190,9 +189,7 @@ static pthread_t                thread3; //emos
 //extern unsigned int mem_base;
 
 int                             card = 0;
-static exmimo_config_t         *p_exmimo_config;
-static exmimo_id_t             *p_exmimo_id;
-static volatile unsigned int   *DAQ_MBOX;
+
 
 #if defined(ENABLE_ITTI)
 static volatile int             start_eNB = 0;
@@ -204,7 +201,7 @@ volatile int                    oai_exit = 0;
 //static int                      time_offset[4] = {-145,-145,-145,-145};
 static int                      time_offset[4] = {0,0,0,0};
 
-static int                      fs4_test=0;
+
 static char                     UE_flag=0;
 static uint8_t                       eNB_id=0,UE_id=0;
 
@@ -213,36 +210,55 @@ static uint32_t          downlink_frequency[4] =     {1907600000,1907600000,1907
 static int32_t                      uplink_frequency_offset[4]= {-120000000,-120000000,-120000000,-120000000};
 static char                    *conf_config_file_name = NULL;
 
+#ifdef ITTI_ENABLED
 static char                    *itti_dump_file = NULL;
+#endif
+
+double tx_gain = 50;
+double rx_gain = 30;
+double bw = 14e6;
 
-static char                     rxg_fname[100];
-static char                     txg_fname[100];
-static char                     rflo_fname[100];
-static char                     rfdc_fname[100];
-static FILE                    *rxg_fd=NULL;
-static FILE                    *txg_fd=NULL;
-static FILE                    *rflo_fd=NULL;
-static FILE                    *rfdc_fd=NULL;
+#ifndef USRP
 static unsigned int             rxg_max[4] =    {133,133,133,133};
 static unsigned int             rxg_med[4] =    {127,127,127,127};
 static unsigned int             rxg_byp[4] =    {120,120,120,120};
 static int                      tx_max_power =  0;
 
+double sample_rate=30.72e6;
+#else
+double tx_gain = 50;
+double rx_gain = 30;
+double bw = 14e6;
+char ref[128] = "internal";
+char channels[128] = "0";
+
+int samples_per_frame = 307200;
+int samples_per_packets = 2048; // samples got every recv or send
+int tx_forward_nsamps;
+
+int sf_bounds_5[10] = {8, 15, 23, 30, 38, 45, 53, 60, 68, 75};
+int sf_bounds_10[10] = {8, 15, 23, 30, 38, 45, 53, 60, 68, 75};
+int sf_bounds_20[10] = {15, 30, 45, 60, 75, 90, 105, 120, 135, 150};
+int *sf_bounds;
+int max_cnt;
+int tx_delay;
+
+#endif
 /*
   uint32_t rf_mode_max[4]     = {55759,55759,55759,55759};
   uint32_t rf_mode_med[4]     = {39375,39375,39375,39375};
   uint32_t rf_mode_byp[4]     = {22991,22991,22991,22991};
 */
-static uint32_t                      rf_mode[4] =        {MY_RF_MODE,0,0,0};
-static uint32_t                      rf_local[4] =       {8255000,8255000,8255000,8255000}; // UE zepto
+//static uint32_t                      rf_mode[4] =        {MY_RF_MODE,0,0,0};
+//static uint32_t                      rf_local[4] =       {8255000,8255000,8255000,8255000}; // UE zepto
 //{8254617, 8254617, 8254617, 8254617}; //eNB khalifa
 //{8255067,8254810,8257340,8257340}; // eNB PETRONAS
 
-static uint32_t                      rf_vcocal[4] =      {910,910,910,910};
-static uint32_t                      rf_vcocal_850[4] =  {2015, 2015, 2015, 2015};
-static uint32_t                      rf_rxdc[4] =        {32896,32896,32896,32896};
-static uint32_t                      rxgain[4] =         {20,20,20,20};
-static uint32_t                      txgain[4] =         {20,20,20,20};
+//static uint32_t                      rf_vcocal[4] =      {910,910,910,910};
+//static uint32_t                      rf_vcocal_850[4] =  {2015, 2015, 2015, 2015};
+//static uint32_t                      rf_rxdc[4] =        {32896,32896,32896,32896};
+//static uint32_t                      rxgain[4] =         {20,20,20,20};
+//static uint32_t                      txgain[4] =         {20,20,20,20};
 
 static runmode_t                mode;
 static int                      rx_input_level_dBm;
@@ -253,7 +269,7 @@ static char                     do_forms=0;
 #else
 int                             otg_enabled;
 #endif
-int                             number_of_cards =   1;
+//int                             number_of_cards =   1;
 
 static int                      mbox_bounds[20] =   {8,16,24,30,38,46,54,60,68,76,84,90,98,106,114,120,128,136,144, 0}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
 //static int                      mbox_bounds[20] =   {6,14,22,28,36,44,52,58,66,74,82,88,96,104,112,118,126,134,142, 148}; ///boundaries of slots in terms ob mbox counter rounded up to even numbers
@@ -261,6 +277,7 @@ static int                      mbox_bounds[20] =   {8,16,24,30,38,46,54,60,68,7
 static LTE_DL_FRAME_PARMS      *frame_parms;
 
 int multi_thread=0;
+int N_RB_DL=25;
 
 unsigned int build_rflocal(int txi, int txq, int rxi, int rxq)
 {
@@ -647,7 +664,7 @@ void do_OFDM_mod(int subframe,PHY_VARS_eNB *phy_vars_eNB) {
     (phy_vars_eNB->lte_frame_parms.samples_per_tti>>1);
   if ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_DL)||
       ((subframe_select(&phy_vars_eNB->lte_frame_parms,subframe)==SF_S))) {
-      //	  LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
+    //	  LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
       
     for (aa=0; aa<phy_vars_eNB->lte_frame_parms.nb_antennas_tx; aa++) {
       if (phy_vars_eNB->lte_frame_parms.Ncp == EXTENDED){ 
@@ -733,21 +750,21 @@ static void * eNB_thread_tx(void *param) {
 
 
   subframe_tx = (proc->subframe+1)%10;
-
+  
   while (!oai_exit){
-
+    
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0);
-
-
+    
+    
     //    LOG_I(PHY,"Locking mutex for eNB proc %d (IC %d,mutex %p)\n",proc->subframe,proc->instance_cnt,&proc->mutex);
     if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
       LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
     }
     else {
-        
+      
       while (proc->instance_cnt_tx < 0) {
 	//	LOG_I(PHY,"Waiting and unlocking mutex for eNB proc %d (IC %d,lock %d)\n",proc->subframe,proc->instance_cnt,pthread_mutex_trylock(&proc->mutex));
-
+	
 	pthread_cond_wait(&proc->cond_tx,&proc->mutex_tx);
       }
       //      LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d\n",proc->subframe);
@@ -758,7 +775,7 @@ static void * eNB_thread_tx(void *param) {
     vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),1);    
     vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_ENB, proc->frame_tx);
     vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_SLOT_NUMBER_ENB, proc->subframe*2);
-
+    
     if (oai_exit) break;
     
     if ((((PHY_vars_eNB_g[0]->lte_frame_parms.frame_type == TDD)&&(subframe_select(&PHY_vars_eNB_g[0]->lte_frame_parms,subframe_tx)==SF_DL))||
@@ -769,7 +786,7 @@ static void * eNB_thread_tx(void *param) {
       phy_procedures_eNB_TX(subframe_tx,PHY_vars_eNB_g[0],0,no_relay,NULL);
     }
     do_OFDM_mod(subframe_tx,PHY_vars_eNB_g[0]);  
-
+    
     if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
       printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
     }
@@ -780,16 +797,16 @@ static void * eNB_thread_tx(void *param) {
 	printf("[openair][SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe);
       }
     }
-
+    
     proc->frame_tx++;
     if (proc->frame_tx==1024)
       proc->frame_tx=0;
-  }
+  }    
   vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0);        
 #ifdef HARD_RT
   rt_make_soft_real_time();
 #endif
-
+  
 #ifdef DEBUG_THREADS
   printf("Exiting eNB thread TX %d\n",proc->subframe);
 #endif
@@ -800,7 +817,7 @@ static void * eNB_thread_tx(void *param) {
   eNB_thread_tx_status[proc->subframe]=0;
   pthread_exit(&eNB_thread_tx_status[proc->subframe]);
 #endif
-
+  
 #ifdef DEBUG_THREADS
   printf("Exiting eNB TX thread %d\n",proc->subframe);
 #endif
@@ -988,7 +1005,7 @@ void kill_eNB_proc() {
 #endif
     pthread_join(PHY_vars_eNB_g[0]->proc[i].pthread_rx,(void**)status_rx);
 #ifdef DEBUG_THREADS 
-   if (status_rx) printf("status %d...",*status_rx);
+    if (status_rx) printf("status %d...",*status_rx);
 #endif
     pthread_mutex_destroy(&PHY_vars_eNB_g[0]->proc[i].mutex_tx);
     pthread_mutex_destroy(&PHY_vars_eNB_g[0]->proc[i].mutex_rx);
@@ -1004,20 +1021,23 @@ void kill_eNB_proc() {
 /* This is the main eNB thread. */
 int eNB_thread_status;
 
+#ifndef USRP
 static void *eNB_thread(void *arg)
 {
 #ifdef RTAI
   RT_TASK *task;
 #endif
-  unsigned char slot=0,last_slot, next_slot;
+  unsigned char slot=0;//,last_slot, next_slot;
   int hw_slot,frame=0;
   int diff;
   int delay_cnt;
   RTIME time_in, time_diff;
   int mbox_target=0,mbox_current=0;
-  int i,ret;
-  int tx_offset;
+  int i;//
+  int ret;
+  //  int tx_offset;
   int sf;
+  volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
 
 #if defined(ENABLE_ITTI)
   /* Wait for eNB application initialization to be complete (eNB registration to MME) */
@@ -1079,7 +1099,7 @@ static void *eNB_thread(void *arg)
       if (diff>8)
 	LOG_D(HW,"eNB Frame %d, time %llu: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, rt_get_time_ns(), slot, hw_slot, mbox_current, mbox_target, diff);
       
-      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
       vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff);
       
       delay_cnt = 0;
@@ -1090,7 +1110,7 @@ static void *eNB_thread(void *arg)
 	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
 	ret = rt_sleep_ns(diff*DAQ_PERIOD);
 	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
-	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
+	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
 	if (ret)
 	  LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
 	hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
@@ -1111,19 +1131,8 @@ static void *eNB_thread(void *arg)
       
       if (oai_exit) break;
 
-      last_slot = (slot)%LTE_SLOTS_PER_FRAME;
-      if (last_slot <0)
-	last_slot+=20;
-      next_slot = (slot+2)%LTE_SLOTS_PER_FRAME;
-      
-      //PHY_vars_eNB_g[0]->frame = frame;
       if (frame>5)  {
-	/*
-	  if (frame%100==0)
-	  LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, next_slot %d (before): DAQ_MBOX %d\n",frame, PHY_vars_eNB_g[0]->frame, slot, hw_slot,next_slot,DAQ_MBOX[0]);
-	*/
-	
-	//if (PHY_vars_eNB_g[0]->frame>5) {
+
 	timing_info.time_last = timing_info.time_now;
 	timing_info.time_now = rt_get_time_ns();
 	
@@ -1230,1337 +1239,1128 @@ static void *eNB_thread(void *arg)
   return 0;
 }
 
+
+
+
 /* This is the main UE thread. Initially it is doing a periodic get_frame. One synchronized it gets woken up by the kernel driver using the RTAI message mechanism (rt_send and rt_receive). */
 static void *UE_thread(void *arg) {
 #ifdef RTAI
-    RT_TASK *task;
-#endif
-    // RTIME in, out, diff;
-    int slot=0,frame=0,hw_slot,last_slot, next_slot;
-    // unsigned int aa;
-    static int is_synchronized = 0;
-    int delay_cnt;
-    RTIME time_in;
-    int hw_slot_offset=0,rx_offset_mbox=0,mbox_target=0,mbox_current=0;
-    int diff2;
-    int i, ret;
+  RT_TASK *task;
+#endif
+  // RTIME in, out, diff;
+  int slot=0,frame=0,hw_slot,last_slot, next_slot;
+  // unsigned int aa;
+  static int is_synchronized = 0;
+  int delay_cnt;
+  RTIME time_in;
+  int hw_slot_offset=0,rx_offset_mbox=0,mbox_target=0,mbox_current=0;
+  int diff2;
+  int i, ret;
+  volatile unsigned int *DAQ_MBOX = openair0_daq_cnt();
+#ifndef USRP
+  exmimo_config_t *p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;;
+#endif
+
 
 #if defined(ENABLE_ITTI) && defined(ENABLE_USE_MME)
-    /* Wait for NAS UE to start cell selection */
-    wait_system_ready ("Waiting for UE to be activated by UserProcess %s\r", &start_UE);
+  /* Wait for NAS UE to start cell selection */
+  wait_system_ready ("Waiting for UE to be activated by UserProcess %s\r", &start_UE);
 #endif
 
 #ifdef RTAI
-    task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF);
-    LOG_D(HW,"Started UE thread (id %p)\n",task);
+  task = rt_task_init_schmod(nam2num("TASK0"), 0, 0, 0, SCHED_FIFO, 0xF);
+  LOG_D(HW,"Started UE thread (id %p)\n",task);
 #endif
 
 #ifdef HARD_RT
-    rt_make_hard_real_time();
+  rt_make_hard_real_time();
 #endif
 
-    mlockall(MCL_CURRENT | MCL_FUTURE);
+  mlockall(MCL_CURRENT | MCL_FUTURE);
 
-    openair_daq_vars.freq_offset = 0; //-7500;
-    /*
-      if (mode == rx_calib_ue) {
-      openair_daq_vars.freq_offset = -7500;
-      for (i=0; i<4; i++) {
-      p_exmimo_config->rf.rf_freq_rx[i] = p_exmimo_config->rf.rf_freq_rx[i]+openair_daq_vars.freq_offset;
-      p_exmimo_config->rf.rf_freq_tx[i] = p_exmimo_config->rf.rf_freq_rx[i]+openair_daq_vars.freq_offset;
-      }
-      openair0_dump_config(card);
-      }
-    */
-    while (!oai_exit)
-      {
-	hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
+  openair_daq_vars.freq_offset = 0; //-7500;
+  /*
+    if (mode == rx_calib_ue) {
+    openair_daq_vars.freq_offset = -7500;
+    for (i=0; i<4; i++) {
+    p_exmimo_config->rf.rf_freq_rx[i] = p_exmimo_config->rf.rf_freq_rx[i]+openair_daq_vars.freq_offset;
+    p_exmimo_config->rf.rf_freq_tx[i] = p_exmimo_config->rf.rf_freq_rx[i]+openair_daq_vars.freq_offset;
+    }
+    openair0_dump_config(card);
+    }
+  */
+  while (!oai_exit)  {
+    hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15; //the slot the hw is about to store
       
-	if (is_synchronized) {
-	  //this is the mbox counter that indicates the start of the frame
-	  rx_offset_mbox = (PHY_vars_UE_g[0]->rx_offset * 150) / (10*PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti);
-	  //this is the mbox counter where we should be
-	  mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150;
-	  // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers)
-	  mbox_target = ((mbox_target+1)-((mbox_target-1)%2))%150;
-	  //this is the mbox counter where we are
-	  mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-	  //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD)
-	  if ((mbox_current>=120) && (mbox_target<30)) //handle the frame wrap-arround
-	    diff2 = 150-mbox_current+mbox_target;
-	  else if ((mbox_current<30) && (mbox_target>=120))
-	    diff2 = -150+mbox_target-mbox_current;
-	  else
-	    diff2 = mbox_target - mbox_current;
-
-	  if (diff2 <(-7)) {
-	    LOG_D(HW,"UE Frame %d: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, slot, hw_slot, diff2);
-	    if (frame>0)
-	      exit_fun("[HW][UE] missed slot");
-	    slot++;
-	    if (slot==20) {
-	      slot=0;
-	      frame++;
-	    }
-	    continue;
-	  }
-	  if (diff2>8)
-	    LOG_D(HW,"UE Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff2);
-
-	  /*
-	  if (frame%100==0)
-	    LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, rx_offset_mbox %d, mbox_target %d, mbox_current %d, diff %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,rx_offset_mbox,mbox_target,mbox_current,diff2);
-	  */
-
-	  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
-	  vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
-
-	  delay_cnt = 0;
-	  while ((diff2>0) && (!oai_exit) && (is_synchronized) )
-	    {
-	      time_in = rt_get_time_ns();
-	      //LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
-	      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
-	      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
-	      ret = rt_sleep_ns(diff2*DAQ_PERIOD);
-	      vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
-	      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
-	      if (ret)
-		LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
-
-	      hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
-	      //LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
-	      delay_cnt++;
-	      if (delay_cnt == 30)
-		{
-		  LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
-		  exit_fun("[HW][UE] HW stopped");
-		}
-	      mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
-	      if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
-		diff2 = 150-mbox_current+mbox_target;
-	      else if ((mbox_current<15) && (mbox_target>=135))
-		diff2 = -150+mbox_target-mbox_current;
-	      else
-		diff2 = mbox_target - mbox_current;
-
-	      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *((volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0]));
-	      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
-	    }
+    if (is_synchronized) {
+      //this is the mbox counter that indicates the start of the frame
+      rx_offset_mbox = (PHY_vars_UE_g[0]->rx_offset * 150) / (10*PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti);
+      //this is the mbox counter where we should be
+      mbox_target = (((((slot+1)%20)*15+1)>>1) + rx_offset_mbox + 1)%150;
+      // round up to the next multiple of two (mbox counter from express MIMO gives only even numbers)
+      mbox_target = ((mbox_target+1)-((mbox_target-1)%2))%150;
+      //this is the mbox counter where we are
+      mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
+      //this is the time we need to sleep in order to synchronize with the hw (in multiples of DAQ_PERIOD)
+      if ((mbox_current>=120) && (mbox_target<30)) //handle the frame wrap-arround
+	diff2 = 150-mbox_current+mbox_target;
+      else if ((mbox_current<30) && (mbox_target>=120))
+	diff2 = -150+mbox_target-mbox_current;
+      else
+	diff2 = mbox_target - mbox_current;
 	
+      if (diff2 <(-7)) {
+	LOG_D(HW,"UE Frame %d: missed slot, proceeding with next one (slot %d, hw_slot %d, diff %d)\n",frame, slot, hw_slot, diff2);
+	if (frame>0)
+	  exit_fun("[HW][UE] missed slot");
+	slot++;
+	if (slot==20) {
+	  slot=0;
+	  frame++;
 	}
-
-	last_slot = (slot)%LTE_SLOTS_PER_FRAME;
-	if (last_slot <0)
-	  last_slot+=LTE_SLOTS_PER_FRAME;
-	next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
-
-	if (is_synchronized)
-	  {
-
-	    /*
-	      if (frame%100==0)
-	      LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, last_slot %d (before): DAQ_MBOX %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,last_slot,DAQ_MBOX[0]);
-	    */
-
-	    // in = rt_get_time_ns();
-	    phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0], 0, 0,mode,0,NULL);
-	    // out = rt_get_time_ns();
-	    // diff = out-in;
-
-	    /*
-	      if (frame % 100 == 0)
-	      LOG_D(HW,"hw_slot %d (after): DAQ_MBOX %d\n",hw_slot,DAQ_MBOX[0]);
+	continue;
+      }
+      if (diff2>8)
+	LOG_D(HW,"UE Frame %d: skipped slot, waiting for hw to catch up (slot %d, hw_slot %d, mbox_current %d, mbox_target %d, diff %d)\n",frame, slot, hw_slot, mbox_current, mbox_target, diff2);
+	
+      /*
+	if (frame%100==0)
+	LOG_D(HW,"frame %d (%d), slot %d, hw_slot %d, rx_offset_mbox %d, mbox_target %d, mbox_current %d, diff %d\n",frame, PHY_vars_UE_g[0]->frame, slot,hw_slot,rx_offset_mbox,mbox_target,mbox_current,diff2);
+      */
+	
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+      vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
+	
+      delay_cnt = 0;
+      while ((diff2>0) && (!oai_exit) && (is_synchronized) )  {
+	time_in = rt_get_time_ns();
+	//LOG_D(HW,"eNB Frame %d delaycnt %d : hw_slot %d (%d), slot %d (%d), diff %d, time %llu\n",frame,delay_cnt,hw_slot,((volatile unsigned int *)DAQ_MBOX)[0],slot,mbox_target,diff2,time_in);
+	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,1);
+	ret = rt_sleep_ns(diff2*DAQ_PERIOD);
+	vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP,0);
+	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+	if (ret)
+	  LOG_D(HW,"eNB Frame %d, time %llu: rt_sleep_ns returned %d\n",frame, time_in);
 	  
-	      LOG_D(HW,"Frame %d: last_slot %d, phy_procedures_lte_ue time_in %llu, time_out %llu, diff %llu\n",
-	      frame, last_slot,in,out,diff);
-	    */
-
-	  }
-	else   // we are not yet synchronized
-	  {
-	    hw_slot_offset = 0;
-
-	    slot = 0;
-	    openair0_get_frame(card);
-	    //          LOG_D(HW,"after get_frame\n");
-	    //          rt_sleep_ns(FRAME_PERIOD);
-	    //          LOG_D(HW,"after sleep\n");
-
-	    if (initial_sync(PHY_vars_UE_g[0],mode)==0) {
-              /*
-		lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms,
-		PHY_vars_UE_g[0],
-		0,
-		1,
-		16384);
-              */
-              //for better visualization afterwards
-              /*
-		for (aa=0; aa<PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx; aa++)
-		memset(PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[aa],0,
-		PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int));
-              */
-	      if (mode == rx_calib_ue) {
-                exit_fun("[HW][UE] UE in RX calibration mode");
-              }
-              else {
-                is_synchronized = 1;
-                //start the DMA transfers
-                //LOG_D(HW,"Before openair0_start_rt_acquisition \n");
-                openair0_start_rt_acquisition(card);
-
-                hw_slot_offset = (PHY_vars_UE_g[0]->rx_offset<<1) / PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti;
-                LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset);
-              }
-	    }
-	    else {
-	      if (openair_daq_vars.freq_offset >= 0) {
-		openair_daq_vars.freq_offset += 100;
-		openair_daq_vars.freq_offset *= -1;
-	      }
-	      else {
-		openair_daq_vars.freq_offset *= -1;
-	      }
-	      if (abs(openair_daq_vars.freq_offset) > 7500) {
-		LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n");
-		mac_xface->macphy_exit("No cell synchronization found, abondoning");
-	      }
-	      else {
-		LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
-		for (i=0; i<4; i++) {
-		  if (p_exmimo_config->rf.rf_freq_rx[i])
-		    p_exmimo_config->rf.rf_freq_rx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
-		  if (p_exmimo_config->rf.rf_freq_tx[i])
-		    p_exmimo_config->rf.rf_freq_tx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
-		}
-		openair0_dump_config(card);
-		rt_sleep_ns(FRAME_PERIOD);
-	      }
-	    }
-	  }
-
+	hw_slot = (((((volatile unsigned int *)DAQ_MBOX)[0]+1)%150)<<1)/15;
+	//LOG_D(HW,"eNB Frame %d : hw_slot %d, time %llu\n",frame,hw_slot,rt_get_time_ns());
+	delay_cnt++;
+	if (delay_cnt == 30)  {
+	  LOG_D(HW,"UE frame %d: HW stopped ... \n",frame);
+	  exit_fun("[HW][UE] HW stopped");
+	}
+	mbox_current = ((volatile unsigned int *)DAQ_MBOX)[0];
+	if ((mbox_current>=135) && (mbox_target<15)) //handle the frame wrap-arround
+	  diff2 = 150-mbox_current+mbox_target;
+	else if ((mbox_current<15) && (mbox_target>=135))
+	  diff2 = -150+mbox_target-mbox_current;
+	else
+	  diff2 = mbox_target - mbox_current;
+	  
+	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DAQ_MBOX, *DAQ_MBOX);
+	vcd_signal_dumper_dump_variable_by_name(VCD_SIGNAL_DUMPER_VARIABLES_DIFF, diff2);
+      }
+	
+    }
+      
+    last_slot = (slot)%LTE_SLOTS_PER_FRAME;
+    if (last_slot <0)
+      last_slot+=LTE_SLOTS_PER_FRAME;
+    next_slot = (slot+3)%LTE_SLOTS_PER_FRAME;
+      
+    if (is_synchronized)  {
+      phy_procedures_UE_lte (last_slot, next_slot, PHY_vars_UE_g[0], 0, 0,mode,0,NULL);
+	
+    }
+    else {  // we are not yet synchronized
+      hw_slot_offset = 0;
+	
+      slot = 0;
+      openair0_get_frame(card);
+      //          LOG_D(HW,"after get_frame\n");
+      //          rt_sleep_ns(FRAME_PERIOD);
+      //          LOG_D(HW,"after sleep\n");
+	
+      if (initial_sync(PHY_vars_UE_g[0],mode)==0) {
 	/*
-	  if ((slot%2000)<10)
-	  LOG_D(HW,"fun0: doing very hard work\n");
+	  lte_adjust_synch(&PHY_vars_UE_g[0]->lte_frame_parms,
+	  PHY_vars_UE_g[0],
+	  0,
+	  1,
+	  16384);
 	*/
-	slot++;
-	if (slot==20) {
-          slot=0;
-          frame++;
+	//for better visualization afterwards
+	/*
+	  for (aa=0; aa<PHY_vars_UE_g[0]->lte_frame_parms.nb_antennas_rx; aa++)
+	  memset(PHY_vars_UE_g[0]->lte_ue_common_vars.rxdata[aa],0,
+	  PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti*LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*sizeof(int));
+	*/
+	if (mode == rx_calib_ue) {
+	  exit_fun("[HW][UE] UE in RX calibration mode");
 	}
-#if defined(ENABLE_ITTI)
-	itti_update_lte_time(frame, slot);
+	else {
+	  is_synchronized = 1;
+	  //start the DMA transfers
+	  //LOG_D(HW,"Before openair0_start_rt_acquisition \n");
+	  openair0_start_rt_acquisition(card);
+	    
+	  hw_slot_offset = (PHY_vars_UE_g[0]->rx_offset<<1) / PHY_vars_UE_g[0]->lte_frame_parms.samples_per_tti;
+	  LOG_D(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset);
+	}
+      }
+      else {
+	if (openair_daq_vars.freq_offset >= 0) {
+	  openair_daq_vars.freq_offset += 100;
+	  openair_daq_vars.freq_offset *= -1;
+	}
+	else {
+	  openair_daq_vars.freq_offset *= -1;
+	}
+	if (abs(openair_daq_vars.freq_offset) > 7500) {
+	  LOG_I(PHY,"[initial_sync] No cell synchronization found, abondoning\n");
+	  mac_xface->macphy_exit("No cell synchronization found, abondoning");
+	}
+	else {
+	  LOG_I(PHY,"[initial_sync] trying carrier off %d Hz\n",openair_daq_vars.freq_offset);
+#ifndef USRP
+	  for (i=0; i<4; i++) {
+	    if (p_exmimo_config->rf.rf_freq_rx[i])
+	      p_exmimo_config->rf.rf_freq_rx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
+	    if (p_exmimo_config->rf.rf_freq_tx[i])
+	      p_exmimo_config->rf.rf_freq_tx[i] = carrier_freq[i]+openair_daq_vars.freq_offset;
+	  }
 #endif
+	  openair0_dump_config(card);
+	  rt_sleep_ns(FRAME_PERIOD);
+	}
       }
-    LOG_D(HW,"UE_thread: finished, ran %d times.\n",frame);
+    }
+      
+    /*
+      if ((slot%2000)<10)
+      LOG_D(HW,"fun0: doing very hard work\n");
+    */
+    slot++;
+    if (slot==20) {
+      slot=0;
+      frame++;
+    }
+#if defined(ENABLE_ITTI)
+    itti_update_lte_time(frame, slot);
+#endif
+  }
+  LOG_D(HW,"UE_thread: finished, ran %d times.\n",frame);
 
 #ifdef HARD_RT
-    rt_make_soft_real_time();
+  rt_make_soft_real_time();
 #endif
 
-    // clean task
+  // clean task
 #ifdef RTAI
-    rt_task_delete(task);
+  rt_task_delete(task);
 #endif
-    LOG_D(HW,"Task deleted. returning\n");
-    return 0;
-  }
+  LOG_D(HW,"Task deleted. returning\n");
+  return 0;
+}
 
-  static void get_options (int argc, char **argv)
-  {
-    int                           c;
-    char                          line[1000];
-    int                           l;
-    const Enb_properties_array_t *enb_properties;
-
-    enum long_option_e {
-      LONG_OPTION_START = 0x100, /* Start after regular single char options */
-
-      LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS,
-      LONG_OPTION_CALIB_UE_RX,
-      LONG_OPTION_CALIB_UE_RX_MED,
-      LONG_OPTION_CALIB_UE_RX_BYP,
-
-      LONG_OPTION_DEBUG_UE_PRACH,
-
-      LONG_OPTION_NO_L2_CONNECT,
-    };
-
-    static const struct option long_options[] = {
-      {"ulsch-max-errors",required_argument,  NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS},
-      {"calib-ue-rx",     required_argument,  NULL, LONG_OPTION_CALIB_UE_RX},
-      {"calib-ue-rx-med", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_MED},
-      {"calib-ue-rx-byp", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_BYP},
-      {"debug-ue-prach",  no_argument,        NULL, LONG_OPTION_DEBUG_UE_PRACH},
-      {"no-L2-connect",   no_argument,        NULL, LONG_OPTION_NO_L2_CONNECT},
-      {NULL, 0, NULL, 0}};
-
-    while ((c = getopt_long (argc, argv, "C:dF:K:qO:ST:UVRM",long_options,NULL)) != -1)
-      {
-	switch (c)
-	  {
-	  case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
-	    ULSCH_max_consecutive_errors = atoi(optarg);
-	    printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
-	    break;
-
-	  case LONG_OPTION_CALIB_UE_RX:
-	    mode = rx_calib_ue;
-	    rx_input_level_dBm = atoi(optarg);
-	    printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm);
-	    break;
-
-	  case LONG_OPTION_CALIB_UE_RX_MED:
-	    mode = rx_calib_ue_med;
-	    rx_input_level_dBm = atoi(optarg);
-	    printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm);
-	    break;
-
-	  case LONG_OPTION_CALIB_UE_RX_BYP:
-	    mode = rx_calib_ue_byp;
-	    rx_input_level_dBm = atoi(optarg);
-	    printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm);
-	    break;
-
-	  case LONG_OPTION_DEBUG_UE_PRACH:
-	    mode = debug_prach;
-	    break;
-
-	  case LONG_OPTION_NO_L2_CONNECT:
-	    mode = no_L2_connect;
-	    break;
-	  case 'M':
-	    multi_thread=1;
-	    break;
-	  case 'C':
-	    downlink_frequency[0] = atof(optarg); // Use float to avoid issue with frequency over 2^31.
-	    downlink_frequency[1] = downlink_frequency[0];
-	    downlink_frequency[2] = downlink_frequency[0];
-	    downlink_frequency[3] = downlink_frequency[0];
-	    carrier_freq[0] = downlink_frequency[0];
-	    carrier_freq[1] = downlink_frequency[1];
-	    carrier_freq[2] = downlink_frequency[2];
-	    carrier_freq[3] = downlink_frequency[3];
-	    printf("Downlink frequency set to %u\n", downlink_frequency[0]);
-	    break;
-
-	  case 'd':
-#ifdef XFORMS
-	    do_forms=1;
-#endif
-	    break;
-
-	  case 'F':
-	    sprintf(rxg_fname,"%srxg.lime",optarg);
-	    rxg_fd = fopen(rxg_fname,"r");
-	    if (rxg_fd) {
-	      printf("Loading RX Gain parameters from %s\n",rxg_fname);
-	      l=0;
-	      while (fgets(line, sizeof(line), rxg_fd)) {
-		if ((strlen(line)==0) || (*line == '#')) continue; //ignore empty or comment lines
-		else {
-		  if (l==0) sscanf(line,"%d %d %d %d",&rxg_max[0],&rxg_max[1],&rxg_max[2],&rxg_max[3]);
-		  if (l==1) sscanf(line,"%d %d %d %d",&rxg_med[0],&rxg_med[1],&rxg_med[2],&rxg_med[3]);
-		  if (l==2) sscanf(line,"%d %d %d %d",&rxg_byp[0],&rxg_byp[1],&rxg_byp[2],&rxg_byp[3]);
-		  l++;
-		}
-	      }
-	    }
-	    else
-	      printf("%s not found, running with defaults\n",rxg_fname);
-
-	    sprintf(txg_fname,"%stxg.lime",optarg);
-	    txg_fd = fopen(txg_fname,"r");
-	    if (txg_fd) {
-	      printf("Loading TX Gain parameters from %s\n",txg_fname);
-	      l=0;
-	      while (fgets(line, sizeof(line), txg_fd)) {
-		if ((strlen(line)==0) || (*line == '#')) {
-		  continue; //ignore empty or comment lines
-		}
-		else {
-		  if (l==0) sscanf(line,"%d %d %d %d",&txgain[0],&txgain[1],&txgain[2],&txgain[3]);
-		  if (l==1) sscanf(line,"%d",&tx_max_power);
-		  l++;
-		}
-	      }
-	    }
-	    else
-	      printf("%s not found, running with defaults\n",txg_fname);
-
-	    sprintf(rflo_fname,"%srflo.lime",optarg);
-	    rflo_fd = fopen(rflo_fname,"r");
-	    if (rflo_fd) {
-	      printf("Loading RF LO parameters from %s\n",rflo_fname);
-	      if (fscanf(rflo_fd,"%d %d %d %d",&rf_local[0],&rf_local[1],&rf_local[2],&rf_local[3]) < 4)
-		LOG_E(EMU, "Error parsing \"%s\"", rflo_fname);
-	    }
-	    else
-	      printf("%s not found, running with defaults\n",rflo_fname);
-
-	    sprintf(rfdc_fname,"%srfdc.lime",optarg);
-	    rfdc_fd = fopen(rfdc_fname,"r");
-	    if (rfdc_fd) {
-	      printf("Loading RF DC parameters from %s\n",rfdc_fname);
-	      if (fscanf(rfdc_fd,"%d %d %d %d",&rf_rxdc[0],&rf_rxdc[1],&rf_rxdc[2],&rf_rxdc[3]) < 4)
-		LOG_E(EMU, "Error parsing \"%s\"", rfdc_fname);
-	    }
-	    else
-	      printf("%s not found, running with defaults\n",rfdc_fname);
-	    break;
+#else  // This is for USRP or ETHERNET targets
 
-	  case 'K':
-#if defined(ENABLE_ITTI)
-	    itti_dump_file = strdup(optarg);
-#else
-	    printf("-K option is disabled when ENABLE_ITTI is not defined\n");
 #endif
-	    break;
-
-	  case 'O':
-	    conf_config_file_name = optarg;
-	    break;
-
-	  case 'S':
-	    fs4_test=1;
-	    break;
-
-	  case 'T':
-#ifdef ENABLE_TCXO
-	    tcxo=atoi(optarg);
-#endif
-	    break;
-
-	  case 'U':
-	    UE_flag = 1;
-	    break;
-
-	  case 'V':
-	    ouput_vcd = 1;
-	    break;
-	  case  'q': 
-	    opp_enabled = 1;
-	    break;
-	  case  'R' :
-	    online_log_messages =1;
-	    break;
-	  default:
-	    break;
-	  }
-      }
 
-    if ((UE_flag == 0) && (conf_config_file_name != NULL)) {
-      int i;
 
-      NB_eNB_INST = 1;
-
-      /* Read eNB configuration file */
-      enb_properties = enb_config_init(conf_config_file_name);
-
-      AssertFatal (NB_eNB_INST <= enb_properties->number,
-		   "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!",
-		   conf_config_file_name, NB_eNB_INST, enb_properties->number);
-
-      /* Update some simulation parameters */
-      frame_parms->frame_type =       enb_properties->properties[0]->frame_type;
-      frame_parms->tdd_config =       enb_properties->properties[0]->tdd_config;
-      frame_parms->tdd_config_S =     enb_properties->properties[0]->tdd_config_s;
-      for (i = 0 ; i < (sizeof(downlink_frequency) / sizeof (downlink_frequency[0])); i++) {
-	downlink_frequency[i] =       enb_properties->properties[0]->downlink_frequency;
-	printf("Downlink frequency set to %u\n", downlink_frequency[i]);
-	uplink_frequency_offset[i] =  enb_properties->properties[0]->uplink_frequency_offset;
+static void get_options (int argc, char **argv) {
+  int                           c;
+  char                          line[1000];
+  int                           l;
+  const Enb_properties_array_t *enb_properties;
+  
+  enum long_option_e {
+    LONG_OPTION_START = 0x100, /* Start after regular single char options */
+    
+    LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS,
+    LONG_OPTION_CALIB_UE_RX,
+    LONG_OPTION_CALIB_UE_RX_MED,
+    LONG_OPTION_CALIB_UE_RX_BYP,
+    
+    LONG_OPTION_DEBUG_UE_PRACH,
+    
+    LONG_OPTION_NO_L2_CONNECT,
+  };
+  
+  static const struct option long_options[] = {
+    {"ulsch-max-errors",required_argument,  NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS},
+    {"calib-ue-rx",     required_argument,  NULL, LONG_OPTION_CALIB_UE_RX},
+    {"calib-ue-rx-med", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_MED},
+    {"calib-ue-rx-byp", required_argument,  NULL, LONG_OPTION_CALIB_UE_RX_BYP},
+    {"debug-ue-prach",  no_argument,        NULL, LONG_OPTION_DEBUG_UE_PRACH},
+    {"no-L2-connect",   no_argument,        NULL, LONG_OPTION_NO_L2_CONNECT},
+    {NULL, 0, NULL, 0}};
+  
+  while ((c = getopt_long (argc, argv, "C:dK:qO:SUVRMr:",long_options,NULL)) != -1) {
+    switch (c) {
+    case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
+      ULSCH_max_consecutive_errors = atoi(optarg);
+      printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
+      break;
+      
+    case LONG_OPTION_CALIB_UE_RX:
+      mode = rx_calib_ue;
+      rx_input_level_dBm = atoi(optarg);
+      printf("Running with UE calibration on (LNA max), input level %d dBm\n",rx_input_level_dBm);
+      break;
+      
+    case LONG_OPTION_CALIB_UE_RX_MED:
+      mode = rx_calib_ue_med;
+      rx_input_level_dBm = atoi(optarg);
+      printf("Running with UE calibration on (LNA med), input level %d dBm\n",rx_input_level_dBm);
+      break;
+      
+    case LONG_OPTION_CALIB_UE_RX_BYP:
+      mode = rx_calib_ue_byp;
+      rx_input_level_dBm = atoi(optarg);
+      printf("Running with UE calibration on (LNA byp), input level %d dBm\n",rx_input_level_dBm);
+      break;
+      
+    case LONG_OPTION_DEBUG_UE_PRACH:
+      mode = debug_prach;
+      break;
+      
+    case LONG_OPTION_NO_L2_CONNECT:
+      mode = no_L2_connect;
+      break;
+    case 'M':
+      multi_thread=1;
+      break;
+    case 'C':
+      downlink_frequency[0] = atof(optarg); // Use float to avoid issue with frequency over 2^31.
+      downlink_frequency[1] = downlink_frequency[0];
+      downlink_frequency[2] = downlink_frequency[0];
+      downlink_frequency[3] = downlink_frequency[0];
+      carrier_freq[0] = downlink_frequency[0];
+      carrier_freq[1] = downlink_frequency[1];
+      carrier_freq[2] = downlink_frequency[2];
+      carrier_freq[3] = downlink_frequency[3];
+      printf("Downlink frequency set to %u\n", downlink_frequency[0]);
+      break;
+      
+    case 'd':
+#ifdef XFORMS
+      do_forms=1;
+#endif
+      break;
+      
+    case 'K':
+#if defined(ENABLE_ITTI)
+      itti_dump_file = strdup(optarg);
+#else
+      printf("-K option is disabled when ENABLE_ITTI is not defined\n");
+#endif
+      break;
+      
+    case 'O':
+      conf_config_file_name = optarg;
+      break;
+      
+    case 'U':
+      UE_flag = 1;
+      break;
+      
+    case 'V':
+      ouput_vcd = 1;
+      break;
+    case  'q': 
+      opp_enabled = 1;
+      break;
+    case  'R' :
+      online_log_messages =1;
+      break;
+    case 'r':
+      switch(atoi(optarg)) {
+      case 6:
+	N_RB_DL=6;
+	break;
+      case 25:
+	N_RB_DL=25;
+	break;
+      case 50:
+	N_RB_DL=50;
+	break;
+      case 100:
+	N_RB_DL=100;
+	break;
+      default:
+	printf("Unknown N_RB_DL %d, switching to 25\n",atoi(optarg));
+	break;
       }
+    default:
+      break;
     }
   }
+  
+  if ((UE_flag == 0) && (conf_config_file_name != NULL)) {
+    int i;
+    
+    NB_eNB_INST = 1;
+    
+    /* Read eNB configuration file */
+    enb_properties = enb_config_init(conf_config_file_name);
+    
+    AssertFatal (NB_eNB_INST <= enb_properties->number,
+		 "Number of eNB is greater than eNB defined in configuration file %s (%d/%d)!",
+		 conf_config_file_name, NB_eNB_INST, enb_properties->number);
+    
+    /* Update some simulation parameters */
+    frame_parms->frame_type =       enb_properties->properties[0]->frame_type;
+    frame_parms->tdd_config =       enb_properties->properties[0]->tdd_config;
+    frame_parms->tdd_config_S =     enb_properties->properties[0]->tdd_config_s;
+    for (i = 0 ; i < (sizeof(downlink_frequency) / sizeof (downlink_frequency[0])); i++) {
+      downlink_frequency[i] =       enb_properties->properties[0]->downlink_frequency;
+      printf("Downlink frequency set to %u\n", downlink_frequency[i]);
+      uplink_frequency_offset[i] =  enb_properties->properties[0]->uplink_frequency_offset;
+    }
+  }
+}
 
-  int main(int argc, char **argv) {
+int main(int argc, char **argv) {
 #ifdef RTAI
-    // RT_TASK *task;
+  // RT_TASK *task;
 #else
-    int *eNB_thread_status_p;
-	int *eNB_thread_status_rx[10],*eNB_thread_status_tx[10];
+  int *eNB_thread_status_p;
+  int *eNB_thread_status_rx[10],*eNB_thread_status_tx[10];
 #endif
-    int i,j,aa;
+  int i,j,aa;
 #if defined (XFORMS) || defined (EMOS) || (! defined (RTAI))
-    void *status;
+  void *status;
 #endif
+  
 
-
-    uint16_t Nid_cell = 0;
-    uint8_t  cooperation_flag=0, transmission_mode=1, abstraction_flag=0;
+  uint16_t Nid_cell = 0;
+  uint8_t  cooperation_flag=0, transmission_mode=1, abstraction_flag=0;
 #ifndef OPENAIR2
-    uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
+  uint8_t beta_ACK=0,beta_RI=0,beta_CQI=2;
 #endif
 
 #ifdef ENABLE_TCXO
-    unsigned int tcxo = 114;
+  unsigned int tcxo = 114;
 #endif
 
-    int amp;
-    // uint8_t prach_fmt;
-    // int N_ZC;
+  int amp;
+  // uint8_t prach_fmt;
+  // int N_ZC;
 
-    int ret, ant;
-    int ant_offset=0;
+  int ret, ant;
+  int ant_offset=0;
 
 #if defined (EMOS) || (! defined (RTAI))
-    int error_code;
+  int error_code;
 #endif
+  openair0_config_t openair0_cfg;
 
-    mode = normal_txrx;
 
-    frame_parms = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
-    /* Set some default values that may be overwritten while reading options */
-    frame_parms->frame_type         = 1; /* TDD */
-    frame_parms->tdd_config         = 3;
-    frame_parms->tdd_config_S       = 0;
+  mode = normal_txrx;
 
-    get_options (argc, argv); //Command-line options
+  frame_parms = (LTE_DL_FRAME_PARMS*) malloc(sizeof(LTE_DL_FRAME_PARMS));
+  /* Set some default values that may be overwritten while reading options */
+  frame_parms->frame_type         = TDD; /* TDD */
+  frame_parms->tdd_config         = 3;
+  frame_parms->tdd_config_S       = 0;
 
-    //randominit (0);
-    set_taus_seed (0);
+  get_options (argc, argv); //Command-line options
 
-    // initialize the log (see log.h for details)
-    logInit();
+  //randominit (0);
+  set_taus_seed (0);
 
-    set_glog(LOG_WARNING, LOG_MED);
-    if (UE_flag==1)
-      {
-	printf("configuring for UE\n");
+  // initialize the log (see log.h for details)
+  logInit();
+
+  set_glog(LOG_WARNING, LOG_MED);
+  if (UE_flag==1)
+    {
+      printf("configuring for UE\n");
 
-	set_comp_log(HW,      LOG_DEBUG,  LOG_HIGH, 1);
+      set_comp_log(HW,      LOG_DEBUG,  LOG_HIGH, 1);
 #ifdef OPENAIR2
-	set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
 #else
-	set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
 #endif
-	set_comp_log(MAC,     LOG_INFO,   LOG_HIGH, 1);
-	set_comp_log(RLC,     LOG_INFO,   LOG_HIGH, 1);
-	set_comp_log(PDCP,    LOG_INFO,   LOG_HIGH, 1);
-	set_comp_log(OTG,     LOG_INFO,   LOG_HIGH, 1);
-	set_comp_log(RRC,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(MAC,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(RLC,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(PDCP,    LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(OTG,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(RRC,     LOG_INFO,   LOG_HIGH, 1);
 #if defined(ENABLE_ITTI)
-	set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
+      set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
 # if defined(ENABLE_USE_MME)
-	set_comp_log(NAS,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(NAS,     LOG_INFO,   LOG_HIGH, 1);
 # endif
 #endif
-      }
-    else
-      {
-	printf("configuring for eNB\n");
+    }
+  else
+    {
+      printf("configuring for eNB\n");
 
-	set_comp_log(HW,      LOG_DEBUG,  LOG_HIGH, 1);
+      set_comp_log(HW,      LOG_DEBUG,  LOG_HIGH, 1);
 #ifdef OPENAIR2
-	set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
 #else
-	set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(PHY,     LOG_INFO,   LOG_HIGH, 1);
 #endif
-	set_comp_log(MAC,     LOG_INFO,   LOG_HIGH, 1);
-	set_comp_log(RLC,     LOG_TRACE,   LOG_HIGH, 1);
-	set_comp_log(PDCP,    LOG_DEBUG,   LOG_HIGH, 1);
-	set_comp_log(OTG,     LOG_INFO,   LOG_HIGH, 1);
-	set_comp_log(RRC,     LOG_DEBUG,   LOG_HIGH, 1);
+      set_comp_log(MAC,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(RLC,     LOG_TRACE,   LOG_HIGH, 1);
+      set_comp_log(PDCP,    LOG_DEBUG,   LOG_HIGH, 1);
+      set_comp_log(OTG,     LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(RRC,     LOG_DEBUG,   LOG_HIGH, 1);
 #if defined(ENABLE_ITTI)
-	set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
+      set_comp_log(EMU,     LOG_INFO,   LOG_MED, 1);
 # if defined(ENABLE_USE_MME)
-	set_comp_log(UDP_,    LOG_DEBUG,   LOG_HIGH, 1);
-	set_comp_log(GTPU,    LOG_DEBUG,   LOG_HIGH, 1);
-	set_comp_log(S1AP,    LOG_DEBUG,   LOG_HIGH, 1);
-	set_comp_log(SCTP,    LOG_INFO,   LOG_HIGH, 1);
+      set_comp_log(UDP_,    LOG_DEBUG,   LOG_HIGH, 1);
+      set_comp_log(GTPU,    LOG_DEBUG,   LOG_HIGH, 1);
+      set_comp_log(S1AP,    LOG_DEBUG,   LOG_HIGH, 1);
+      set_comp_log(SCTP,    LOG_INFO,   LOG_HIGH, 1);
 # endif
 #if defined(ENABLE_SECURITY)
-	set_comp_log(OSA,    LOG_DEBUG,   LOG_HIGH, 1);
+      set_comp_log(OSA,    LOG_DEBUG,   LOG_HIGH, 1);
 #endif
 #endif
-	set_comp_log(ENB_APP, LOG_INFO, LOG_HIGH, 1);
-	if (online_log_messages == 1) { 
-	  set_component_filelog(RRC);
-	  set_component_filelog(PDCP);
-	}
+      set_comp_log(ENB_APP, LOG_INFO, LOG_HIGH, 1);
+      if (online_log_messages == 1) { 
+	set_component_filelog(RRC);
+	set_component_filelog(PDCP);
       }
-
-    if (ouput_vcd) {
-      if (UE_flag==1)
-	vcd_signal_dumper_init("/tmp/openair_dump_UE.vcd");
-      else
-	vcd_signal_dumper_init("/tmp/openair_dump_eNB.vcd");
     }
 
+  if (ouput_vcd) {
+    if (UE_flag==1)
+      vcd_signal_dumper_init("/tmp/openair_dump_UE.vcd");
+    else
+      vcd_signal_dumper_init("/tmp/openair_dump_eNB.vcd");
+  }
+
 #if defined(ENABLE_ITTI)
-    if (UE_flag == 1) {
-      log_set_instance_type (LOG_INSTANCE_UE);
-    }
-    else {
-      log_set_instance_type (LOG_INSTANCE_ENB);
-    }
+  if (UE_flag == 1) {
+    log_set_instance_type (LOG_INSTANCE_UE);
+  }
+  else {
+    log_set_instance_type (LOG_INSTANCE_ENB);
+  }
 
-    itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file);
+  itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file);
 #endif
 
 #ifdef NAS_NETLINK
-    netlink_init();
+  netlink_init();
 #endif
 
 #if !defined(ENABLE_ITTI)
-    // to make a graceful exit when ctrl-c is pressed
-    signal(SIGSEGV, signal_handler);
-    signal(SIGINT, signal_handler);
+  // to make a graceful exit when ctrl-c is pressed
+  signal(SIGSEGV, signal_handler);
+  signal(SIGINT, signal_handler);
 #endif
 
 #ifndef RTAI
-    check_clock();
-#endif
-
-    // init the parameters
-    frame_parms->N_RB_DL            = 25;
-    frame_parms->N_RB_UL            = 25;
-    frame_parms->Ncp                = 0;
-    frame_parms->Ncp_UL             = 0;
-    frame_parms->Nid_cell           = Nid_cell;
-    frame_parms->nushift            = 0;
-    if (UE_flag==0)
-      {
-	switch (transmission_mode) {
-	case 1: 
-	  frame_parms->nb_antennas_tx     = 1;
-	  frame_parms->nb_antennas_rx     = 1;
-	  break;
-	case 2:
-	case 5:
-	case 6:
-	  frame_parms->nb_antennas_tx     = 2;
-	  frame_parms->nb_antennas_rx     = 2;
-	  break;
-	default:
-	  printf("Unsupported transmission mode %d\n",transmission_mode);
-	  exit(-1);
-	}
-      }
-    else
-      { //UE_flag==1
+  check_clock();
+#endif
+
+  // init the parameters
+  frame_parms->N_RB_DL            = N_RB_DL;
+  frame_parms->N_RB_UL            = N_RB_DL;
+  frame_parms->Ncp                = NORMAL;
+  frame_parms->Ncp_UL             = NORMAL;
+  frame_parms->Nid_cell           = Nid_cell;
+  frame_parms->nushift            = 0;
+  if (UE_flag==0)
+    {
+      switch (transmission_mode) {
+      case 1: 
 	frame_parms->nb_antennas_tx     = 1;
 	frame_parms->nb_antennas_rx     = 1;
+	break;
+      case 2:
+      case 5:
+      case 6:
+	frame_parms->nb_antennas_tx     = 2;
+	frame_parms->nb_antennas_rx     = 2;
+	break;
+      default:
+	printf("Unsupported transmission mode %d\n",transmission_mode);
+	exit(-1);
       }
-    frame_parms->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later
-    frame_parms->mode1_flag         = (transmission_mode == 1) ? 1 : 0;
-    frame_parms->phich_config_common.phich_resource = oneSixth;
-    frame_parms->phich_config_common.phich_duration = normal;
-    // UL RS Config
-    frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0
-    frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0;
-    frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
-    frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
-    init_ul_hopping(frame_parms);
-
-    init_frame_parms(frame_parms,1);
-
-    phy_init_top(frame_parms);
-    phy_init_lte_top(frame_parms);
-
-    //init prach for openair1 test
-    frame_parms->prach_config_common.rootSequenceIndex=22; 
-    frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1;
-    frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; 
-    frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag=0;
-    frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
-    // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type);
-    // N_ZC = (prach_fmt <4)?839:139;
-
-    if (UE_flag==1)
-      {
-	PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE*));
-	PHY_vars_UE_g[0] = init_lte_UE(frame_parms, UE_id,abstraction_flag,transmission_mode);
+    }
+  else
+    { //UE_flag==1
+      frame_parms->nb_antennas_tx     = 1;
+      frame_parms->nb_antennas_rx     = 1;
+    }
+  frame_parms->nb_antennas_tx_eNB = (transmission_mode == 1) ? 1 : 2; //initial value overwritten by initial sync later
+  frame_parms->mode1_flag         = (transmission_mode == 1) ? 1 : 0;
+  frame_parms->phich_config_common.phich_resource = oneSixth;
+  frame_parms->phich_config_common.phich_duration = normal;
+  // UL RS Config
+  frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.cyclicShift = 0;//n_DMRS1 set to 0
+  frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupHoppingEnabled = 0;
+  frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.sequenceHoppingEnabled = 0;
+  frame_parms->pusch_config_common.ul_ReferenceSignalsPUSCH.groupAssignmentPUSCH = 0;
+  init_ul_hopping(frame_parms);
+
+  init_frame_parms(frame_parms,1);
+
+  phy_init_top(frame_parms);
+  phy_init_lte_top(frame_parms);
+
+  //init prach for openair1 test
+  frame_parms->prach_config_common.rootSequenceIndex=22; 
+  frame_parms->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig=1;
+  frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex=0; 
+  frame_parms->prach_config_common.prach_ConfigInfo.highSpeedFlag=0;
+  frame_parms->prach_config_common.prach_ConfigInfo.prach_FreqOffset=0;
+  // prach_fmt = get_prach_fmt(frame_parms->prach_config_common.prach_ConfigInfo.prach_ConfigIndex, frame_parms->frame_type);
+  // N_ZC = (prach_fmt <4)?839:139;
+
+  if (UE_flag==1) {
+    PHY_vars_UE_g = malloc(sizeof(PHY_VARS_UE*));
+    PHY_vars_UE_g[0] = init_lte_UE(frame_parms, UE_id,abstraction_flag,transmission_mode);
     
 #ifndef OPENAIR2
-	for (i=0;i<NUMBER_OF_eNB_MAX;i++) {
-	  PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
-	  PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
-	  PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
-
-	  PHY_vars_UE_g[0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = UE_id;
-	  PHY_vars_UE_g[0]->scheduling_request_config[i].sr_ConfigIndex = 7+(UE_id%3);
-	  PHY_vars_UE_g[0]->scheduling_request_config[i].dsr_TransMax = sr_n4;
-	}
+    for (i=0;i<NUMBER_OF_eNB_MAX;i++) {
+      PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
+      PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
+      PHY_vars_UE_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
+      
+      PHY_vars_UE_g[0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = UE_id;
+      PHY_vars_UE_g[0]->scheduling_request_config[i].sr_ConfigIndex = 7+(UE_id%3);
+      PHY_vars_UE_g[0]->scheduling_request_config[i].dsr_TransMax = sr_n4;
+    }
 #endif
     
-	compute_prach_seq(&PHY_vars_UE_g[0]->lte_frame_parms.prach_config_common,
-			  PHY_vars_UE_g[0]->lte_frame_parms.frame_type,
-			  PHY_vars_UE_g[0]->X_u);
-
-	PHY_vars_UE_g[0]->lte_ue_pdcch_vars[0]->crnti = 0x1234;
+    compute_prach_seq(&PHY_vars_UE_g[0]->lte_frame_parms.prach_config_common,
+		      PHY_vars_UE_g[0]->lte_frame_parms.frame_type,
+		      PHY_vars_UE_g[0]->X_u);
+    
+    PHY_vars_UE_g[0]->lte_ue_pdcch_vars[0]->crnti = 0x1234;
 #ifndef OPENAIR2
-	PHY_vars_UE_g[0]->lte_ue_pdcch_vars[0]->crnti = 0x1235;
+    PHY_vars_UE_g[0]->lte_ue_pdcch_vars[0]->crnti = 0x1235;
 #endif
-	NB_UE_INST=1;
-	NB_INST=1;
+    NB_UE_INST=1;
+    NB_INST=1;
     
-	openair_daq_vars.manual_timing_advance = 0;
-	//openair_daq_vars.timing_advance = TIMING_ADVANCE_HW;
-	openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;
-	openair_daq_vars.auto_freq_correction = 0;
-	openair_daq_vars.use_ia_receiver = 0;
-
-	// if AGC is off, the following values will be used
-	for (i=0;i<4;i++) 
-	  rxgain[i] = 0;
-
-	for (i=0;i<4;i++) {
-	  PHY_vars_UE_g[0]->rx_gain_max[i] = rxg_max[i];
-	  PHY_vars_UE_g[0]->rx_gain_med[i] = rxg_med[i];
-	  PHY_vars_UE_g[0]->rx_gain_byp[i] = rxg_byp[i];
-	}
-  
-	if ((mode == normal_txrx) || (mode == rx_calib_ue) || (mode == no_L2_connect) || (mode == debug_prach)) {
-	  for (i=0; i<4; i++) {
-            PHY_vars_UE_g[0]->rx_gain_mode[i]  = max_gain;
-            //            frame_parms->rfmode[i] = rf_mode_max[i];
-            rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMax;
-	  }
-	  PHY_vars_UE_g[0]->rx_total_gain_dB =  PHY_vars_UE_g[0]->rx_gain_max[0] + rxgain[0] - 30; //-30 because it was calibrated with a 30dB gain
-	}
-	else if ((mode == rx_calib_ue_med)) {
-	  for (i=0; i<4; i++) {
-            PHY_vars_UE_g[0]->rx_gain_mode[i] = med_gain;
-            //            frame_parms->rfmode[i] = rf_mode_med[i];
-            rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMed;
-	  }
-	  PHY_vars_UE_g[0]->rx_total_gain_dB =  PHY_vars_UE_g[0]->rx_gain_med[0]  + rxgain[0] - 30; //-30 because it was calibrated with a 30dB gain;
-	}
-	else if ((mode == rx_calib_ue_byp)) {
-	  for (i=0; i<4; i++) {
-            PHY_vars_UE_g[0]->rx_gain_mode[i] = byp_gain;
-            //            frame_parms->rfmode[i] = rf_mode_byp[i];
-            rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAByp;
-	  }
-	  PHY_vars_UE_g[0]->rx_total_gain_dB =  PHY_vars_UE_g[0]->rx_gain_byp[0]  + rxgain[0] - 30; //-30 because it was calibrated with a 30dB gain;
-	}
+    openair_daq_vars.manual_timing_advance = 0;
+    //openair_daq_vars.timing_advance = TIMING_ADVANCE_HW;
+    openair_daq_vars.rx_gain_mode = DAQ_AGC_ON;
+    openair_daq_vars.auto_freq_correction = 0;
+    openair_daq_vars.use_ia_receiver = 0;
     
-	PHY_vars_UE_g[0]->tx_power_max_dBm = tx_max_power;
+    for (i=0;i<4;i++) {
+      PHY_vars_UE_g[0]->rx_gain_max[i] = rxg_max[i];
+      //      PHY_vars_UE_g[0]->rx_gain_med[i] = rxg_med[i];
+      //      PHY_vars_UE_g[0]->rx_gain_byp[i] = rxg_byp[i];
+    }
     
-	//  printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power));
-      }
-    else
-      { //this is eNB
-	PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB*));
-	PHY_vars_eNB_g[0] = init_lte_eNB(frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
+    if ((mode == normal_txrx) || (mode == rx_calib_ue) || (mode == no_L2_connect) || (mode == debug_prach)) {
+      for (i=0;i<4;i++)
+	openair0_cfg.rxg_mode[i] =  max_gain;
+      PHY_vars_UE_g[0]->rx_total_gain_dB =  PHY_vars_UE_g[0]->rx_gain_max[0] + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain
+    }
+    else if ((mode == rx_calib_ue_med)) {
+      for (i=0;i<4;i++)
+	openair0_cfg.rxg_mode[i] =  med_gain;
+      PHY_vars_UE_g[0]->rx_total_gain_dB =  PHY_vars_UE_g[0]->rx_gain_med[0]  + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain;
+    }
+    else if ((mode == rx_calib_ue_byp)) {
+      for (i=0;i<4;i++)
+	openair0_cfg.rxg_mode[i] =  byp_gain;
+      PHY_vars_UE_g[0]->rx_total_gain_dB =  PHY_vars_UE_g[0]->rx_gain_byp[0]  + (int)rx_gain - 30; //-30 because it was calibrated with a 30dB gain;
+    }
+    
+    PHY_vars_UE_g[0]->tx_power_max_dBm = tx_max_power;
+    
+    //  printf("tx_max_power = %d -> amp %d\n",tx_max_power,get_tx_amp(tx_max_power,tx_max_power));
+  }
+  else
+    { //this is eNB
+      PHY_vars_eNB_g = malloc(sizeof(PHY_VARS_eNB*));
+      PHY_vars_eNB_g[0] = init_lte_eNB(frame_parms,eNB_id,Nid_cell,cooperation_flag,transmission_mode,abstraction_flag);
     
 #ifndef OPENAIR2
-	for (i=0;i<NUMBER_OF_UE_MAX;i++) {
-	  PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
-	  PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
-	  PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
-
-	  PHY_vars_eNB_g[0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i;
-	  PHY_vars_eNB_g[0]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3);
-	  PHY_vars_eNB_g[0]->scheduling_request_config[i].dsr_TransMax = sr_n4;
-	}
+      for (i=0;i<NUMBER_OF_UE_MAX;i++) {
+	PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_ACK_Index = beta_ACK;
+	PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_RI_Index  = beta_RI;
+	PHY_vars_eNB_g[0]->pusch_config_dedicated[i].betaOffset_CQI_Index = beta_CQI;
+
+	PHY_vars_eNB_g[0]->scheduling_request_config[i].sr_PUCCH_ResourceIndex = i;
+	PHY_vars_eNB_g[0]->scheduling_request_config[i].sr_ConfigIndex = 7+(i%3);
+	PHY_vars_eNB_g[0]->scheduling_request_config[i].dsr_TransMax = sr_n4;
+      }
 #endif
 
-	compute_prach_seq(&PHY_vars_eNB_g[0]->lte_frame_parms.prach_config_common,
-			  PHY_vars_eNB_g[0]->lte_frame_parms.frame_type,
-			  PHY_vars_eNB_g[0]->X_u);
+      compute_prach_seq(&PHY_vars_eNB_g[0]->lte_frame_parms.prach_config_common,
+			PHY_vars_eNB_g[0]->lte_frame_parms.frame_type,
+			PHY_vars_eNB_g[0]->X_u);
 
-	NB_eNB_INST=1;
-	NB_INST=1;
+      NB_eNB_INST=1;
+      NB_INST=1;
 
-	openair_daq_vars.ue_dl_rb_alloc=0x1fff;
-	openair_daq_vars.target_ue_dl_mcs=16;
-	openair_daq_vars.ue_ul_nb_rb=6;
-	openair_daq_vars.target_ue_ul_mcs=6;
+      openair_daq_vars.ue_dl_rb_alloc=0x1fff;
+      openair_daq_vars.target_ue_dl_mcs=16;
+      openair_daq_vars.ue_ul_nb_rb=6;
+      openair_daq_vars.target_ue_ul_mcs=6;
 
-	// if AGC is off, the following values will be used
-	for (i=0;i<4;i++) 
-	  rxgain[i]=10;
-
-	// set eNB to max gain
-	PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB =  rxg_max[0] + rxgain[0] - 30; //was measured at rxgain=30;
-	for (i=0; i<4; i++) {
-	  //        frame_parms->rfmode[i] = rf_mode_max[i];
-	  rf_mode[i] = (rf_mode[i] & (~LNAGAINMASK)) | LNAMax;
-	}
-      }
-
-    // Initialize card
-    ret = openair0_open();
-    if ( ret != 0 ) {
-      if (ret == -1)
-        printf("Error opening /dev/openair0");
-      if (ret == -2)
-        printf("Error mapping bigshm");
-      if (ret == -3)
-        printf("Error mapping RX or TX buffer");
-      return(ret);
+      // set eNB to max gain
+      PHY_vars_eNB_g[0]->rx_total_gain_eNB_dB =  rxg_max[0] + (int)rx_gain - 30; //was measured at rxgain=30;
+      for (i=0;i<4;i++)
+	openair0_cfg.rxg_mode[i] =  max_gain;
     }
 
-    printf ("Detected %d number of cards, %d number of antennas.\n", openair0_num_detected_cards, openair0_num_antennas[card]);
-  
-    p_exmimo_config = openair0_exmimo_pci[card].exmimo_config_ptr;
-    p_exmimo_id     = openair0_exmimo_pci[card].exmimo_id_ptr;
-  
-    printf("Card %d: ExpressMIMO %d, HW Rev %d, SW Rev 0x%d\n", card, p_exmimo_id->board_exmimoversion, p_exmimo_id->board_hwrev, p_exmimo_id->board_swrev);
-
-    // check if the software matches firmware
-    if (p_exmimo_id->board_swrev!=BOARD_SWREV_CNTL2) {
-      printf("Software revision %d and firmware revision %d do not match. Please update either the firmware or the software!\n",BOARD_SWREV_CNTL2,p_exmimo_id->board_swrev);
-      exit(-1);
-    }
 
-    if (p_exmimo_id->board_swrev>=9)
-      p_exmimo_config->framing.eNB_flag   = 0; 
-    else 
-      p_exmimo_config->framing.eNB_flag   = !UE_flag;
 
-    p_exmimo_config->framing.tdd_config = DUPLEXMODE_FDD + TXRXSWITCH_LSB;
-#if (BOARD_SWREV_CNTL2>=0x0A)
-    p_exmimo_config->framing.resampling_factor[ant] = 2;
-#else
-    for (ant=0; ant<4; ant++)
-      p_exmimo_config->framing.resampling_factor = 2;
-#endif
-
-    for (ant=0;ant<max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant++) 
-      p_exmimo_config->rf.rf_mode[ant] = RF_MODE_BASE;
-    for (ant=0;ant<frame_parms->nb_antennas_tx;ant++)
-      p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
-    for (ant=0;ant<frame_parms->nb_antennas_rx;ant++)
-      p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
-    for (ant=max(frame_parms->nb_antennas_tx,frame_parms->nb_antennas_rx);ant<4;ant++) {
-      p_exmimo_config->rf.rf_mode[ant] = 0;
-      carrier_freq[ant] = 0; //this turns off all other LIMEs
-      downlink_frequency[ant] = 0; //this turns off all other LIMEs
-      uplink_frequency_offset[ant] = 0;
-    }
+  dump_frame_parms(frame_parms);
 
-    /*
-      ant_offset = 0;
-      for (ant=0; ant<4; ant++) {
-      if (ant==ant_offset) {
-      //if (1) {
-      p_exmimo_config->rf.rf_mode[ant] = rf_mode_base;
-      p_exmimo_config->rf.rf_mode[ant] += (TXEN + DMAMODE_TX);
-      p_exmimo_config->rf.rf_mode[ant] += (RXEN + DMAMODE_RX);
-      }
-      else {
-      p_exmimo_config->rf.rf_mode[ant] = 0;
-      downlink_frequency[ant] = 0; //this turns off all other LIMEs
-      }
-      }
-    */
-
-    for (ant = 0; ant<4; ant++) { 
-      p_exmimo_config->rf.do_autocal[ant] = 1;
-      if (UE_flag==0) {
-	/* eNB */
-	if (frame_parms->frame_type == FDD) {
-	  p_exmimo_config->rf.rf_freq_rx[ant] = downlink_frequency[ant] + uplink_frequency_offset[ant];
-	} else {
-	  p_exmimo_config->rf.rf_freq_rx[ant] = downlink_frequency[ant];
-	}
-	p_exmimo_config->rf.rf_freq_tx[ant] = downlink_frequency[ant];
-      } else {
-	/* UE */
-	p_exmimo_config->rf.rf_freq_rx[ant] = carrier_freq[ant];
-	if (frame_parms->frame_type == FDD) {
-	  p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant] + uplink_frequency_offset[ant];
-	} else {
-	  p_exmimo_config->rf.rf_freq_tx[ant] = carrier_freq[ant];
-	}
-      }
-
-      p_exmimo_config->rf.rx_gain[ant][0] = rxgain[ant];
-      p_exmimo_config->rf.tx_gain[ant][0] = txgain[ant];
-    
-      p_exmimo_config->rf.rf_local[ant]   = rf_local[ant];
-      p_exmimo_config->rf.rf_rxdc[ant]    = rf_rxdc[ant];
+  if(frame_parms->N_RB_DL == 100) {
+    sample_rate = 30.72e6;
+#ifdef USRP
+    samples_per_packets = 2048;
+    samples_per_frame = 307200;
+    // from usrp_time_offset
+    tx_forward_nsamps = 175;
+    sf_bounds = sf_bounds_20;
+    max_cnt = 150;
+    tx_delay = 8;
+#endif
+  }
+  else if(frame_parms->N_RB_DL == 50){
+    sample_rate = 15.36e6;
+#ifdef USRP
+    samples_per_packets = 2048;
+    samples_per_frame = 153600;
+    tx_forward_nsamps = 95;
+    sf_bounds = sf_bounds_10;
+    max_cnt = 75;
+    tx_delay = 4;
+#endif
+  }
+  else if (frame_parms->N_RB_DL == 25) {
+    sample_rate = 7.68e6;
+#ifdef USRP
+    samples_per_packets = 1024;
+    samples_per_frame = 76800;
+    tx_forward_nsamps = 70;
+    sf_bounds = sf_bounds_5;
+    max_cnt = 75;
+    tx_delay = 4;
+#endif
+  }
+  
+  mac_xface = malloc(sizeof(MAC_xface));
 
-      if ((downlink_frequency[ant] >= 850000000) && (downlink_frequency[ant] <= 865000000)) {
-	p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal_850[ant];
-	p_exmimo_config->rf.rffe_band_mode[ant] = DD_TDD;	    
-      }
-      else if ((downlink_frequency[ant] >= 1900000000) && (downlink_frequency[ant] <= 2000000000)) {
-	p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-	p_exmimo_config->rf.rffe_band_mode[ant] = B19G_TDD;	    
-      }
-      else {
-	p_exmimo_config->rf.rf_vcocal[ant]  = rf_vcocal[ant];
-	p_exmimo_config->rf.rffe_band_mode[ant] = 0;	    
-      }
 
-      p_exmimo_config->rf.rffe_gain_txlow[ant] = 31;
-      p_exmimo_config->rf.rffe_gain_txhigh[ant] = 31;
-      p_exmimo_config->rf.rffe_gain_rxfinal[ant] = 52;
-      p_exmimo_config->rf.rffe_gain_rxlow[ant] = 31;
+  openair0_cfg.sample_rate = sample_rate;
+  openair0_cfg.tx_num_channels = frame_parms->nb_antennas_tx;
+  openair0_cfg.rx_num_channels = frame_parms->nb_antennas_rx;
+  
+  for (i=0;i<4;i++) {
+    if (UE_flag==0) {
+      openair0_cfg.tx_freq[i] = downlink_frequency[i]+uplink_frequency_offset[i];
+      openair0_cfg.rx_freq[i] = downlink_frequency[i];
     }
-
-    dump_frame_parms(frame_parms);
+    else {
+      openair0_cfg.rx_freq[i] = downlink_frequency[i]+uplink_frequency_offset[i];
+      openair0_cfg.tx_freq[i] = downlink_frequency[i];
+    }
+  }
+  openair0_cfg.tx_bw = bw;
+  openair0_cfg.rx_bw = bw;
+  for (i=0;i<4;i++) {
+    openair0_cfg.tx_gain[i] = tx_gain;
+    openair0_cfg.rx_gain[i] = rx_gain;
+  }
   
-    mac_xface = malloc(sizeof(MAC_xface));
+  openair0_device_init(&openair0, &openair0_cfg);
   
 #ifdef OPENAIR2
-    int eMBMS_active=0;
+  int eMBMS_active=0;
 
-    l2_init(frame_parms,eMBMS_active,
-	    0,// cba_group_active
-	    0); // HO flag
-    if (UE_flag == 1)
-      mac_xface->dl_phy_sync_success (0, 0, 0, 1);
-    else
-      mac_xface->mrbch_phy_sync_failure (0, 0, 0);
+  l2_init(frame_parms,eMBMS_active,
+	  0,// cba_group_active
+	  0); // HO flag
+  if (UE_flag == 1)
+    mac_xface->dl_phy_sync_success (0, 0, 0, 1);
+  else
+    mac_xface->mrbch_phy_sync_failure (0, 0, 0);
 #endif
 
-    mac_xface->macphy_exit = &exit_fun;
+  mac_xface->macphy_exit = &exit_fun;
 
 #if defined(ENABLE_ITTI)
-    if (create_tasks(UE_flag ? 0 : 1, UE_flag ? 1 : 0) < 0) {
-      exit(-1); // need a softer mode
-    }
-    printf("ITTI tasks created\n");
+  if (create_tasks(UE_flag ? 0 : 1, UE_flag ? 1 : 0) < 0) {
+    exit(-1); // need a softer mode
+  }
+  printf("ITTI tasks created\n");
 #endif
 
 #ifdef OPENAIR2
-    //if (otg_enabled) {
-    init_all_otg(0);
-    g_otg->seed = 0;
-    init_seeds(g_otg->seed);
-    g_otg->num_nodes = 2;
-    for (i=0; i<g_otg->num_nodes; i++){
-      for (j=0; j<g_otg->num_nodes; j++){
-	g_otg->application_idx[i][j] = 1;
-	//g_otg->packet_gen_type=SUBSTRACT_STRING;
-	g_otg->aggregation_level[i][j][0]=1;
-	g_otg->application_type[i][j][0] = BCBR; //MCBR, BCBR
-      }
+  //if (otg_enabled) {
+  init_all_otg(0);
+  g_otg->seed = 0;
+  init_seeds(g_otg->seed);
+  g_otg->num_nodes = 2;
+  for (i=0; i<g_otg->num_nodes; i++){
+    for (j=0; j<g_otg->num_nodes; j++){
+      g_otg->application_idx[i][j] = 1;
+      //g_otg->packet_gen_type=SUBSTRACT_STRING;
+      g_otg->aggregation_level[i][j][0]=1;
+      g_otg->application_type[i][j][0] = BCBR; //MCBR, BCBR
     }
-    init_predef_traffic(UE_flag ? 1 : 0, UE_flag ? 0 : 1);
-    //  }
+  }
+  init_predef_traffic(UE_flag ? 1 : 0, UE_flag ? 0 : 1);
+  //  }
 #endif
 
-#ifdef OPENAIR2
-    //init_pdcp_thread();
-#endif
+  //  number_of_cards = openair0_num_detected_cards;
 
-    number_of_cards = openair0_num_detected_cards;
-    if (p_exmimo_id->board_exmimoversion==1) //ExpressMIMO1
-      openair_daq_vars.timing_advance = 138;
-    else //ExpressMIMO2
-      openair_daq_vars.timing_advance = 0;
+  openair_daq_vars.timing_advance = 0;
 
-    // connect the TX/RX buffers
-    if (UE_flag==1)
-      {
-	setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,ant_offset);
-	printf("Setting UE buffer to all-RX\n");
-	// Set LSBs for antenna switch (ExpressMIMO)
-	for (i=0; i<frame_parms->samples_per_tti*10; i++)
-	  for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
-	    PHY_vars_UE_g[0]->lte_ue_common_vars.txdata[aa][i] = 0x00010001;
-
-	//p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
-      }
-    else
-      {
-	setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,ant_offset);
-	if (fs4_test==0)
-	  {
-	    printf("Setting eNB buffer to all-RX\n");
-	    // Set LSBs for antenna switch (ExpressMIMO)
-	    for (i=0; i<frame_parms->samples_per_tti*10; i++)
-	      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
-		PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
-
-	    // Set the last OFDM symbol of subframe 4 to TX to allow enough time for switch to settle
-	    // (that's ok since the last symbol can be configured as SRS)
-	    /*
-	      for (i=frame_parms->samples_per_tti*5-0*(frame_parms->ofdm_symbol_size+frame_parms->nb_prefix_samples);
-	      i<frame_parms->samples_per_tti*5; i++)
-	      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
-	      PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x0;
-	    */
-	  }
-	else
-	  {
-	    printf("Setting eNB buffer to fs/4 test signal\n");
-	    for (j=0; j<PHY_vars_eNB_g[0]->lte_frame_parms.samples_per_tti*10; j+=4)
-	      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
-		{
-		  amp = 0x8000;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+1] = 0;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+3] = amp-1;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+5] = 0;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+7] = amp;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j] = amp-1;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+2] = 0;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+4] = amp;
-		  ((short*)PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa])[2*j+6] = 0;
-		}
-	  }
-      }
-
-    openair0_dump_config(card);
+  // connect the TX/RX buffers
+  if (UE_flag==1) {
+    setup_ue_buffers(PHY_vars_UE_g[0],frame_parms,ant_offset);
+    printf("Setting UE buffer to all-RX\n");
+    // Set LSBs for antenna switch (ExpressMIMO)
+    for (i=0; i<frame_parms->samples_per_tti*10; i++)
+      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
+	PHY_vars_UE_g[0]->lte_ue_common_vars.txdata[aa][i] = 0x00010001;
+    
+    //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX;
+  }
+  else {
+    setup_eNB_buffers(PHY_vars_eNB_g[0],frame_parms,ant_offset);
+    printf("Setting eNB buffer to all-RX\n");
+    // Set LSBs for antenna switch (ExpressMIMO)
+    for (i=0; i<frame_parms->samples_per_tti*10; i++)
+      for (aa=0; aa<frame_parms->nb_antennas_tx; aa++)
+	PHY_vars_eNB_g[0]->lte_eNB_common_vars.txdata[0][aa][i] = 0x00010001;
+  }
 
-    printf("EXMIMO_CONFIG: rf_mode 0x %x %x %x %x, [0]: TXRXEn %d, TXLPFEn %d, TXLPF %d, RXLPFEn %d, RXLPF %d, RFBB %d, LNA %d, LNAGain %d, RXLPFMode %d, SWITCH %d, rf_rxdc %d, rf_local %d, rf_vcocal %d\n",  
-	   p_exmimo_config->rf.rf_mode[0],
-	   p_exmimo_config->rf.rf_mode[1],
-	   p_exmimo_config->rf.rf_mode[2],
-	   p_exmimo_config->rf.rf_mode[3],
-	   (p_exmimo_config->rf.rf_mode[0]&3),  // RXen+TXen
-	   (p_exmimo_config->rf.rf_mode[0]&4)>>2,         //TXLPFen
-	   (p_exmimo_config->rf.rf_mode[0]&TXLPFMASK)>>3, //TXLPF
-	   (p_exmimo_config->rf.rf_mode[0]&128)>>7,      //RXLPFen
-	   (p_exmimo_config->rf.rf_mode[0]&RXLPFMASK)>>8, //TXLPF
-	   (p_exmimo_config->rf.rf_mode[0]&RFBBMASK)>>16, // RFBB mode
-	   (p_exmimo_config->rf.rf_mode[0]&LNAMASK)>>12, // RFBB mode
-	   (p_exmimo_config->rf.rf_mode[0]&LNAGAINMASK)>>14, // RFBB mode
-	   (p_exmimo_config->rf.rf_mode[0]&RXLPFMODEMASK)>>19, // RXLPF mode
-	   (p_exmimo_config->framing.tdd_config&TXRXSWITCH_MASK)>>1, // Switch mode
-	   p_exmimo_config->rf.rf_rxdc[0],
-	   p_exmimo_config->rf.rf_local[0],
-	   p_exmimo_config->rf.rf_vcocal[0]);
-  
-    for (ant=0;ant<4;ant++)
-      p_exmimo_config->rf.do_autocal[ant] = 0;
+  openair0_dump_config(card);
+  /*  
+  for (ant=0;ant<4;ant++)
+    p_exmimo_config->rf.do_autocal[ant] = 0;
+  */
 
 #ifdef EMOS
-    error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE);
-    if (error_code==0)
-      printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR);
-    else if (error_code==ENODEV)
-      printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR);
-    else if (error_code==ENOMEM)
-      printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR);
-    else 
-      printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code);
+  error_code = rtf_create(CHANSOUNDER_FIFO_MINOR,CHANSOUNDER_FIFO_SIZE);
+  if (error_code==0)
+    printf("[OPENAIR][SCHED][INIT] Created EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR);
+  else if (error_code==ENODEV)
+    printf("[OPENAIR][SCHED][INIT] Problem: EMOS FIFO %d is greater than or equal to RTF_NO\n",CHANSOUNDER_FIFO_MINOR);
+  else if (error_code==ENOMEM)
+    printf("[OPENAIR][SCHED][INIT] Problem: cannot allocate memory for EMOS FIFO %d\n",CHANSOUNDER_FIFO_MINOR);
+  else 
+    printf("[OPENAIR][SCHED][INIT] Problem creating EMOS FIFO %d, error_code %d\n",CHANSOUNDER_FIFO_MINOR,error_code);
 #endif
 
-    mlockall(MCL_CURRENT | MCL_FUTURE);
+  mlockall(MCL_CURRENT | MCL_FUTURE);
 
 #ifdef RTAI
-    // make main thread LXRT soft realtime
-    /* task = */ rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF);
-
-    // start realtime timer and scheduler
-    //rt_set_oneshot_mode();
-    rt_set_periodic_mode();
-    start_rt_timer(0);
-
-    //now = rt_get_time() + 10*PERIOD;
-    //rt_task_make_periodic(task, now, PERIOD);
-
-    printf("Init mutex\n");
-    //mutex = rt_get_adr(nam2num("MUTEX"));
-    mutex = rt_sem_init(nam2num("MUTEX"), 1);
-    if (mutex==0)
-      {
-	printf("Error init mutex\n");
-	exit(-1);
-      }
-    else
-      printf("mutex=%p\n",mutex);
+  // make main thread LXRT soft realtime
+  /* task = */ rt_task_init_schmod(nam2num("MYTASK"), 9, 0, 0, SCHED_FIFO, 0xF);
+
+  // start realtime timer and scheduler
+  //rt_set_oneshot_mode();
+  rt_set_periodic_mode();
+  start_rt_timer(0);
+
+  //now = rt_get_time() + 10*PERIOD;
+  //rt_task_make_periodic(task, now, PERIOD);
+
+  printf("Init mutex\n");
+  //mutex = rt_get_adr(nam2num("MUTEX"));
+  mutex = rt_sem_init(nam2num("MUTEX"), 1);
+  if (mutex==0)
+    {
+      printf("Error init mutex\n");
+      exit(-1);
+    }
+  else
+    printf("mutex=%p\n",mutex);
 #endif
 
-    DAQ_MBOX = (volatile unsigned int *) openair0_exmimo_pci[card].rxcnt_ptr[0];
 
-    // this starts the DMA transfers
-    if (UE_flag!=1)
-      openair0_start_rt_acquisition(card);
+
+  // this starts the DMA transfers
+  if (UE_flag!=1)
+    openair0_start_rt_acquisition(card);
 
 #ifdef XFORMS
-    if (do_forms==1) {
-      fl_initialize (&argc, argv, NULL, 0, 0);
-      form_stats = create_form_stats_form();
-      if (UE_flag==1) {
-	form_ue[UE_id] = create_lte_phy_scope_ue();
-	sprintf (title, "LTE DL SCOPE UE");
-	fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
-      } else {
-	for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
-	  form_enb[UE_id] = create_lte_phy_scope_enb();
-	  sprintf (title, "UE%d LTE UL SCOPE eNB",UE_id+1);
-	  fl_show_form (form_enb[UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
-	}
-      }
-      fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
-      if (UE_flag==0) {
-	for (UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
-	  if (otg_enabled) {
-	    fl_set_button(form_enb[UE_id]->button_0,1);
-	    fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON");
-	  }
-	  else {
-	    fl_set_button(form_enb[UE_id]->button_0,0);
-	    fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF");
-	  }
-	}
+  if (do_forms==1) {
+    fl_initialize (&argc, argv, NULL, 0, 0);
+    form_stats = create_form_stats_form();
+    if (UE_flag==1) {
+      form_ue[UE_id] = create_lte_phy_scope_ue();
+      sprintf (title, "LTE DL SCOPE UE");
+      fl_show_form (form_ue[UE_id]->lte_phy_scope_ue, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
+    } else {
+      for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
+	form_enb[UE_id] = create_lte_phy_scope_enb();
+	sprintf (title, "UE%d LTE UL SCOPE eNB",UE_id+1);
+	fl_show_form (form_enb[UE_id]->lte_phy_scope_enb, FL_PLACE_HOTSPOT, FL_FULLBORDER, title);
       }
-      else {
-	if (openair_daq_vars.use_ia_receiver) {
-	  fl_set_button(form_ue[UE_id]->button_0,1);
-	  fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON");
+    }
+    fl_show_form (form_stats->stats_form, FL_PLACE_HOTSPOT, FL_FULLBORDER, "stats");
+    if (UE_flag==0) {
+      for (UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
+	if (otg_enabled) {
+	  fl_set_button(form_enb[UE_id]->button_0,1);
+	  fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic ON");
 	}
 	else {
-	  fl_set_button(form_ue[UE_id]->button_0,0);
-	  fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
+	  fl_set_button(form_enb[UE_id]->button_0,0);
+	  fl_set_object_label(form_enb[UE_id]->button_0,"DL Traffic OFF");
 	}
       }
-
-      ret = pthread_create(&thread2, NULL, scope_thread, NULL);
-      printf("Scope thread created, ret=%d\n",ret);
     }
+    else {
+      if (openair_daq_vars.use_ia_receiver) {
+	fl_set_button(form_ue[UE_id]->button_0,1);
+	fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver ON");
+      }
+      else {
+	fl_set_button(form_ue[UE_id]->button_0,0);
+	fl_set_object_label(form_ue[UE_id]->button_0, "IA Receiver OFF");
+      }
+    }
+
+    ret = pthread_create(&thread2, NULL, scope_thread, NULL);
+    printf("Scope thread created, ret=%d\n",ret);
+  }
 #endif
 
 #ifdef EMOS
-    ret = pthread_create(&thread3, NULL, emos_thread, NULL);
-    printf("EMOS thread created, ret=%d\n",ret);
+  ret = pthread_create(&thread3, NULL, emos_thread, NULL);
+  printf("EMOS thread created, ret=%d\n",ret);
 #endif
 
-    rt_sleep_ns(10*FRAME_PERIOD);
+  rt_sleep_ns(10*FRAME_PERIOD);
 
 #ifndef RTAI
-    pthread_attr_init (&attr_dlsch_threads);
-    pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
-    //attr_dlsch_threads.priority = 1;
-    sched_param_dlsch.sched_priority = 90;//sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
-    pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
-    pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
+  pthread_attr_init (&attr_dlsch_threads);
+  pthread_attr_setstacksize(&attr_dlsch_threads,OPENAIR_THREAD_STACK_SIZE);
+  //attr_dlsch_threads.priority = 1;
+  sched_param_dlsch.sched_priority = 90;//sched_get_priority_max(SCHED_FIFO); //OPENAIR_THREAD_PRIORITY;
+  pthread_attr_setschedparam  (&attr_dlsch_threads, &sched_param_dlsch);
+  pthread_attr_setschedpolicy (&attr_dlsch_threads, SCHED_FIFO);
 #endif
 
-    // start the main thread
-    if (UE_flag == 1) {
+  // start the main thread
+  if (UE_flag == 1) {
+#ifndef USRP
 #ifdef RTAI
-      thread1 = rt_thread_create(UE_thread, NULL, 100000000);
+    thread1 = rt_thread_create(UE_thread, NULL, 100000000);
 #else
-      error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL);
-      if (error_code!= 0) {
-	LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code);
-	return(error_code);
-      }
-      else {
-	LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n");
-      }
+    error_code = pthread_create(&thread1, &attr_dlsch_threads, UE_thread, NULL);
+    if (error_code!= 0) {
+      LOG_D(HW,"[lte-softmodem.c] Could not allocate UE_thread, error %d\n",error_code);
+      return(error_code);
+    }
+    else {
+      LOG_D(HW,"[lte-softmodem.c] Allocate UE_thread successful\n");
+    }
 #endif
 #ifdef DLSCH_THREAD
-      init_rx_pdsch_thread();
-      rt_sleep_ns(FRAME_PERIOD/10);
-      init_dlsch_threads();
+    init_rx_pdsch_thread();
+    rt_sleep_ns(FRAME_PERIOD/10);
+    init_dlsch_threads();
 #endif
-      printf("UE threads created\n");
-    }
-    else {
-
-      if (multi_thread>0) {
-	init_eNB_proc();
-	LOG_D(HW,"[lte-softmodem.c] eNB threads created\n");
-      }
-#ifdef RTAI
-      thread0 = rt_thread_create(eNB_thread, NULL, 100000000);
+    printf("UE threads created\n");
 #else
-      error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL);
-      if (error_code!= 0) {
-	LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code);
-	return(error_code);
-      }
-      else {
-	LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n");
-      }
-#endif
-#ifdef ULSCH_THREAD
-      init_ulsch_threads();
+    printf("UE functionality not yet supported on USRP");
 #endif
+  }
+  else {
 
-
-
-
+    if (multi_thread>0) {
+      init_eNB_proc();
+      LOG_D(HW,"[lte-softmodem.c] eNB threads created\n");
+    }
+#ifdef RTAI
+    thread0 = rt_thread_create(eNB_thread, NULL, 100000000);
+#else
+    error_code = pthread_create(&thread0, &attr_dlsch_threads, eNB_thread, NULL);
+    if (error_code!= 0) {
+      LOG_D(HW,"[lte-softmodem.c] Could not allocate eNB_thread, error %d\n",error_code);
+      return(error_code);
+    }
+    else {
+      LOG_D(HW,"[lte-softmodem.c] Allocate eNB_thread successful\n");
     }
+#endif
+  }
 
 
-    // wait for end of program
-    printf("TYPE <CTRL-C> TO TERMINATE\n");
-    //getchar();
+  // wait for end of program
+  printf("TYPE <CTRL-C> TO TERMINATE\n");
+  //getchar();
 
 #if defined(ENABLE_ITTI)
-    printf("Entering ITTI signals handler\n");
-    itti_wait_tasks_end();
+  printf("Entering ITTI signals handler\n");
+  itti_wait_tasks_end();
 #else
-    while (oai_exit==0)
-      rt_sleep_ns(FRAME_PERIOD);
+  while (oai_exit==0)
+    rt_sleep_ns(FRAME_PERIOD);
 #endif
 
-    // stop threads
+  // stop threads
 #ifdef XFORMS
-    printf("waiting for XFORMS thread\n");
-    if (do_forms==1)
-      {
-	pthread_join(thread2,&status);
-        fl_hide_form(form_stats->stats_form);
-        fl_free_form(form_stats->stats_form);
-        if (UE_flag==1) {
-	  fl_hide_form(form_ue[UE_id]->lte_phy_scope_ue);
-	  fl_free_form(form_ue[UE_id]->lte_phy_scope_ue);
-        } else {
-	  for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
-	    fl_hide_form(form_enb[UE_id]->lte_phy_scope_enb);
-	    fl_free_form(form_enb[UE_id]->lte_phy_scope_enb);
-	  }
-        }
+  printf("waiting for XFORMS thread\n");
+  if (do_forms==1)
+    {
+      pthread_join(thread2,&status);
+      fl_hide_form(form_stats->stats_form);
+      fl_free_form(form_stats->stats_form);
+      if (UE_flag==1) {
+	fl_hide_form(form_ue[UE_id]->lte_phy_scope_ue);
+	fl_free_form(form_ue[UE_id]->lte_phy_scope_ue);
+      } else {
+	for(UE_id=0;UE_id<scope_enb_num_ue;UE_id++) {
+	  fl_hide_form(form_enb[UE_id]->lte_phy_scope_enb);
+	  fl_free_form(form_enb[UE_id]->lte_phy_scope_enb);
+	}
       }
+    }
 #endif
 
-    printf("stopping MODEM threads\n");
-    // cleanup
-    if (UE_flag == 1) {
+  printf("stopping MODEM threads\n");
+  // cleanup
+  if (UE_flag == 1) {
+#ifndef USRP
 #ifdef RTAI
-      rt_thread_join(thread1); 
+    rt_thread_join(thread1); 
 #else
-      pthread_join(thread1,&status); 
+    pthread_join(thread1,&status); 
 #endif
 #ifdef DLSCH_THREAD
-      cleanup_dlsch_threads();
-      cleanup_rx_pdsch_thread();
+    cleanup_dlsch_threads();
+    cleanup_rx_pdsch_thread();
 #endif
-    }
-    else {
+#endif
+  }
+  else {
 #ifdef RTAI
-      rt_thread_join(thread0); 
+    rt_thread_join(thread0); 
 #else
 #ifdef DEBUG_THREADS
-      printf("Joining eNB_thread ...");
+    printf("Joining eNB_thread ...");
 #endif
-      pthread_join(thread0,(void**)&eNB_thread_status_p); 
+    pthread_join(thread0,(void**)&eNB_thread_status_p); 
 #ifdef DEBUG_THREADS
-      printf("status %d\n",*eNB_thread_status_p);
+    printf("status %d\n",*eNB_thread_status_p);
 #endif
-#endif
-#ifdef ULSCH_THREAD
-      cleanup_ulsch_threads();
 #endif
 
-      if (multi_thread>0) {
-   	    printf("Killing eNB processing threads\n");
-	    kill_eNB_proc();
+    if (multi_thread>0) {
+      printf("Killing eNB processing threads\n");
+      kill_eNB_proc();
 
-      }
     }
+  }
 
 #ifdef OPENAIR2
-    //cleanup_pdcp_thread();
+  //cleanup_pdcp_thread();
 #endif
 
 #ifdef RTAI
-    stop_rt_timer();
+  stop_rt_timer();
 #endif
 
-    printf("stopping card\n");
-    openair0_stop(card);
-    printf("closing openair0_lib\n");
-    openair0_close();
+  printf("stopping card\n");
+  openair0_stop(card);
+  printf("closing openair0_lib\n");
+  openair0_close();
 
 #ifdef EMOS
-    printf("waiting for EMOS thread\n");
-    pthread_cancel(thread3);
-    pthread_join(thread3,&status);
+  printf("waiting for EMOS thread\n");
+  pthread_cancel(thread3);
+  pthread_join(thread3,&status);
 #endif
 
 #ifdef EMOS
-    error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR);
-    printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code);
+  error_code = rtf_destroy(CHANSOUNDER_FIFO_MINOR);
+  printf("[OPENAIR][SCHED][CLEANUP] EMOS FIFO closed, error_code %d\n", error_code);
 #endif
 
-    if (ouput_vcd)
-      vcd_signal_dumper_close();
-
-    logClean();
+  if (ouput_vcd)
+    vcd_signal_dumper_close();
 
-    return 0;
-  }
-
-  void test_config(int card, int ant, unsigned int rf_mode, int UE_flag) {
-    p_exmimo_config->framing.eNB_flag   = !UE_flag;
-    p_exmimo_config->framing.tdd_config = 0;
-#if (BOARD_SWREV_CNTL2>=0x0A)
-    p_exmimo_config->framing.resampling_factor[ant] = 2;
-#else
-    p_exmimo_config->framing.resampling_factor = 2;
-#endif
+  logClean();
 
-    p_exmimo_config->rf.rf_freq_rx[ant] = 1907600000;
-    p_exmimo_config->rf.rf_freq_tx[ant] = 1907600000;;
-    p_exmimo_config->rf.rx_gain[ant][0] = 20;
-    p_exmimo_config->rf.tx_gain[ant][0] = 10;
-    p_exmimo_config->rf.rf_mode[ant] = rf_mode;
-
-    p_exmimo_config->rf.rf_local[ant] = build_rflocal(20,25,26,04);
-    p_exmimo_config->rf.rf_rxdc[ant] = build_rfdc(128, 128);
-    p_exmimo_config->rf.rf_vcocal[ant] = (0xE<<6) + 0xE;
-  }
+  return 0;
+}
 
-  void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
+void setup_ue_buffers(PHY_VARS_UE *phy_vars_ue, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
 
-    int i;
-    if (phy_vars_ue) {
-      if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) {
-	printf("RX antennas > 1 and carrier > 0 not possible\n");
-	exit(-1);
-      }
+  int i;
+  if (phy_vars_ue) {
+    if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) {
+      printf("RX antennas > 1 and carrier > 0 not possible\n");
+      exit(-1);
+    }
 
-      if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) {
-	printf("TX antennas > 1 and carrier > 0 not possible\n");
-	exit(-1);
-      }
+    if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) {
+      printf("TX antennas > 1 and carrier > 0 not possible\n");
+      exit(-1);
+    }
     
-      // replace RX signal buffers with mmaped HW versions
-      for (i=0;i<frame_parms->nb_antennas_rx;i++) {
-	free(phy_vars_ue->lte_ue_common_vars.rxdata[i]);
-	phy_vars_ue->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier];
+    // replace RX signal buffers with mmaped HW versions
+    for (i=0;i<frame_parms->nb_antennas_rx;i++) {
+      free(phy_vars_ue->lte_ue_common_vars.rxdata[i]);
+      phy_vars_ue->lte_ue_common_vars.rxdata[i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier];
 
 
-	printf("rxdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.rxdata[i]);
-      }
-      for (i=0;i<frame_parms->nb_antennas_tx;i++) {
-	free(phy_vars_ue->lte_ue_common_vars.txdata[i]);
-	phy_vars_ue->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier];
+      printf("rxdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.rxdata[i]);
+    }
+    for (i=0;i<frame_parms->nb_antennas_tx;i++) {
+      free(phy_vars_ue->lte_ue_common_vars.txdata[i]);
+      phy_vars_ue->lte_ue_common_vars.txdata[i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier];
 
-	printf("txdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.txdata[i]);
-      }
+      printf("txdata[%d] @ %p\n",i,phy_vars_ue->lte_ue_common_vars.txdata[i]);
     }
   }
+}
 
-  void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
+void setup_eNB_buffers(PHY_VARS_eNB *phy_vars_eNB, LTE_DL_FRAME_PARMS *frame_parms, int carrier) {
 
-    int i,j;
+  int i,j;
 
-    if (phy_vars_eNB) {
-      if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) {
-	printf("RX antennas > 1 and carrier > 0 not possible\n");
-	exit(-1);
-      }
+  if (phy_vars_eNB) {
+    if ((frame_parms->nb_antennas_rx>1) && (carrier>0)) {
+      printf("RX antennas > 1 and carrier > 0 not possible\n");
+      exit(-1);
+    }
 
-      if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) {
-	printf("TX antennas > 1 and carrier > 0 not possible\n");
-	exit(-1);
-      }
+    if ((frame_parms->nb_antennas_tx>1) && (carrier>0)) {
+      printf("TX antennas > 1 and carrier > 0 not possible\n");
+      exit(-1);
+    }
     
-      // replace RX signal buffers with mmaped HW versions
-      for (i=0;i<frame_parms->nb_antennas_rx;i++) {
-	free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
-	phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier];
-
-	printf("rxdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
-	for (j=0;j<16;j++) {
-	  printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]);
-	  phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j;
-	}
+    // replace RX signal buffers with mmaped HW versions
+    for (i=0;i<frame_parms->nb_antennas_rx;i++) {
+      free(phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
+      phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i] = (int32_t*) openair0_exmimo_pci[card].adc_head[i+carrier];
+
+      printf("rxdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i]);
+      for (j=0;j<16;j++) {
+	printf("rxbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j]);
+	phy_vars_eNB->lte_eNB_common_vars.rxdata[0][i][j] = 16-j;
       }
-      for (i=0;i<frame_parms->nb_antennas_tx;i++) {
-	free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
-	phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier];
-
-	printf("txdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
-	for (j=0;j<16;j++) {
-	  printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]);
-	  phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j;
-	}
+    }
+    for (i=0;i<frame_parms->nb_antennas_tx;i++) {
+      free(phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
+      phy_vars_eNB->lte_eNB_common_vars.txdata[0][i] = (int32_t*) openair0_exmimo_pci[card].dac_head[i+carrier];
+
+      printf("txdata[%d] @ %p\n",i,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i]);
+      for (j=0;j<16;j++) {
+	printf("txbuffer %d: %x\n",j,phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j]);
+	phy_vars_eNB->lte_eNB_common_vars.txdata[0][i][j] = 16-j;
       }
     }
   }
+}
-- 
GitLab