From 74054c6139d8b536361060096ab1e809fcd10094 Mon Sep 17 00:00:00 2001
From: Raymond Knopp <raymond.knopp@eurecom.fr>
Date: Mon, 19 Jan 2015 13:31:45 +0000
Subject: [PATCH] added LTE band scanning for UE
git-svn-id: http://svn.eurecom.fr/openair4G/trunk@6415 818b1a75-f10b-46b9-bf7c-635c3b92a50f
---
targets/RT/USER/lte-softmodem.c | 553 +++++++++++++++++++-------------
1 file changed, 323 insertions(+), 230 deletions(-)
diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c
index b39c4ddcab..3689c8d8b7 100644
--- a/targets/RT/USER/lte-softmodem.c
+++ b/targets/RT/USER/lte-softmodem.c
@@ -343,6 +343,7 @@ int tx_delay;
static runmode_t mode;
static int rx_input_level_dBm;
+static int UE_scan=1;
static int online_log_messages=0;
#ifdef XFORMS
extern int otg_enabled;
@@ -409,6 +410,58 @@ int rrh_UE_port = 1600;
char uecap_xer[1024],uecap_xer_in=0;
+#define KHz (1000UL)
+#define MHz (1000 * KHz)
+
+typedef struct eutra_band_s {
+ int16_t band;
+ uint32_t ul_min;
+ uint32_t ul_max;
+ uint32_t dl_min;
+ uint32_t dl_max;
+ lte_frame_type_t frame_type;
+} eutra_band_t;
+
+typedef struct band_info_s {
+ int nbands;
+ eutra_band_t band_info[100];
+} band_info_t;
+
+band_info_t bands_to_scan;
+
+static const eutra_band_t eutra_bands[] =
+ {
+ { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD},
+ { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD},
+ { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD},
+ { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD},
+ { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD},
+ { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD},
+ { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD},
+ { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD},
+ { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD},
+ {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD},
+ {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD},
+ {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD},
+ {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD},
+ {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD},
+
+ {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD},
+
+ {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD},
+ {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD},
+ {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD},
+ {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD},
+ {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD},
+ {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD},
+ {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD},
+ {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD},
+ {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD},
+ {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD},
+ {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD},
+ {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD},
+ };
+
unsigned int build_rflocal(int txi, int txq, int rxi, int rxq)
{
return (txi + (txq<<6) + (rxi<<12) + (rxq<<18));
@@ -924,13 +977,13 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) {
#ifdef EXMIMO
((short*)dummy_tx_b)[2*i]<<4;
#else
- ((short*)dummy_tx_b)[2*i]<<5;
+ ((short*)dummy_tx_b)[2*i]<<5;
#endif
((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[1]=
#ifdef EXMIMO
((short*)dummy_tx_b)[2*i+1]<<4;
#else
- ((short*)dummy_tx_b)[2*i+1]<<5;
+ ((short*)dummy_tx_b)[2*i+1]<<5;
#endif
}
}
@@ -965,15 +1018,15 @@ static void * eNB_thread_tx(void *param) {
task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF);
if (task==NULL) {
- LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name);
- return 0;
-}
+ LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_TX thread_index %d (%s)!!!!\n",proc->subframe,task_name);
+ return 0;
+ }
else {
- LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n",
- proc->CC_id,
- proc->subframe,
- task);
-}
+ LOG_I(PHY,"[SCHED][eNB] eNB TX thread CC %d SF %d started with id %p\n",
+ proc->CC_id,
+ proc->subframe,
+ task);
+ }
#else
#ifdef LOWLATENCY
attr.size = sizeof(attr);
@@ -988,14 +1041,14 @@ static void * eNB_thread_tx(void *param) {
attr.sched_period = 1 * 10000000; // each tx thread has a period of 10ms from the starting point
if (sched_setattr(0, &attr, flags) < 0 ){
- perror("[SCHED] eNB tx thread: sched_setattr failed\n");
- exit(-1);
-}
+ perror("[SCHED] eNB tx thread: sched_setattr failed\n");
+ exit(-1);
+ }
LOG_I(HW,"[SCHED] eNB TX deadline thread %d(id %ld) started on CPU %d\n",
- proc->subframe, gettid(),sched_getcpu());
+ proc->subframe, gettid(),sched_getcpu());
#else
LOG_I(HW,"[SCHED] eNB TX thread %d started on CPU %d\n",
- proc->subframe,sched_getcpu());
+ proc->subframe,sched_getcpu());
#endif
#endif
@@ -1011,66 +1064,66 @@ static void * eNB_thread_tx(void *param) {
while (!oai_exit){
- vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0);
+ 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);
- // printf("Locking mutex for eNB proc %d (subframe_tx %d))\n",proc->subframe,proc->instance_cnt_tx);
+ //LOG_I(PHY,"Locking mutex for eNB proc %d (IC %d,mutex %p)\n",proc->subframe,proc->instance_cnt,&proc->mutex);
+ // printf("Locking mutex for eNB proc %d (subframe_tx %d))\n",proc->subframe,proc->instance_cnt_tx);
- if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
- LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
- oai_exit=1;
-}
- else {
+ if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
+ LOG_E(PHY,"[SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
+ oai_exit=1;
+ }
+ 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));
- //printf("Waiting and unlocking mutex for eNB proc %d (subframe_tx %d)\n",proc->subframe,proc->instance_cnt_tx);
+ 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));
+ //printf("Waiting and unlocking mutex for eNB proc %d (subframe_tx %d)\n",proc->subframe,proc->instance_cnt_tx);
- pthread_cond_wait(&proc->cond_tx,&proc->mutex_tx);
-}
- // LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d instance_cnt_tx %d\n",proc->subframe,proc->instance_cnt_tx);
- if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {
- LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe);
- oai_exit=1;
-}
-}
- 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_TX_ENB, proc->frame_tx);
- start_meas(&softmodem_stats_tx_sf[proc->subframe]);
+ pthread_cond_wait(&proc->cond_tx,&proc->mutex_tx);
+ }
+ // LOG_I(PHY,"Waking up and unlocking mutex for eNB proc %d instance_cnt_tx %d\n",proc->subframe,proc->instance_cnt_tx);
+ if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {
+ LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe);
+ oai_exit=1;
+ }
+ }
+ 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_TX_ENB, proc->frame_tx);
+ start_meas(&softmodem_stats_tx_sf[proc->subframe]);
- if (oai_exit) break;
+ if (oai_exit) break;
- if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&&
- (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))||
- (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) {
+ if ((((PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == TDD)&&
+ (subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_DL))||
+ (PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.frame_type == FDD))) {
- phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL);
+ phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL);
-}
- if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) {
- phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL);
-}
+ }
+ if ((subframe_select(&PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms,proc->subframe_tx)==SF_S)) {
+ phy_procedures_eNB_TX(proc->subframe,PHY_vars_eNB_g[0][proc->CC_id],0,no_relay,NULL);
+ }
- do_OFDM_mod_rt(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]);
+ do_OFDM_mod_rt(proc->subframe_tx,PHY_vars_eNB_g[0][proc->CC_id]);
- if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
- printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
-}
- else {
- proc->instance_cnt_tx--;
+ if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
+ printf("[openair][SCHED][eNB] error locking mutex for eNB TX proc %d\n",proc->subframe);
+ }
+ else {
+ proc->instance_cnt_tx--;
- if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {
- printf("[openair][SCHED][eNB] error unlocking mutex for eNB TX proc %d\n",proc->subframe);
-}
-}
+ if (pthread_mutex_unlock(&proc->mutex_tx) != 0) {
+ 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;
+ proc->frame_tx++;
+ if (proc->frame_tx==1024)
+ proc->frame_tx=0;
-}
+ }
stop_meas(&softmodem_stats_tx_sf[proc->subframe]);
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_TX0+(2*proc->subframe),0);
#ifdef HARD_RT
@@ -1093,8 +1146,8 @@ static void * eNB_thread_tx(void *param) {
#endif
}
- int eNB_thread_rx_status[10];
- static void * eNB_thread_rx(void *param) {
+int eNB_thread_rx_status[10];
+static void * eNB_thread_rx(void *param) {
//unsigned long cpuid;
eNB_proc_t *proc = (eNB_proc_t*)param;
@@ -1119,9 +1172,9 @@ static void * eNB_thread_tx(void *param) {
task = rt_task_init_schmod(nam2num(task_name), 0, 0, 0, SCHED_FIFO, 0xF);
if (task==NULL) {
- LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name);
- return 0;
-}
+ LOG_E(PHY,"[SCHED][eNB] Problem starting eNB_proc_RX thread_index %d (%s)!!!!\n",proc->subframe,task_name);
+ return 0;
+ }
else {
LOG_I(PHY,"[SCHED][eNB] eNB RX thread CC_id %d SF %d started with id %p\n", /* on CPU %d*/
proc->CC_id,
@@ -1591,7 +1644,7 @@ static void *eNB_thread(void *arg)
vcd_signal_dumper_dump_function_by_name(VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE,0);
/*
- if (trace_cnt++<10)
+ if (trace_cnt++<10)
printf("TRX: t1 %llu (trx_read), t2 %llu (trx_write)\n",(long long unsigned int)(trx_time1.tv_nsec - trx_time0.tv_nsec), (long long unsigned int)(trx_time2.tv_nsec - trx_time1.tv_nsec));
*/
#else
@@ -1771,10 +1824,21 @@ int is_synchronized=1;
int is_synchronized=0;
#endif
+typedef enum {
+ rssi=0,
+ pbch=1,
+ si=2
+} sync_mode_t;
+
static void *UE_thread_synch(void *arg) {
int i,hw_slot_offset,CC_id;
PHY_VARS_UE *UE = arg;
+ int current_band = 0;
+ int current_offset = 0;
+ sync_mode_t sync_mode = rssi;
+ int rssi_lin,rssi_min,rssi_max,rssi_avg;
+ double rssi_dBm,rssi_min_dBm,rssi_max_dBm;
printf("UE_thread_sync in with PHY_vars_UE %p\n",arg);
#ifdef USRP
@@ -1793,101 +1857,180 @@ static void *UE_thread_synch(void *arg) {
printf("starting UE synch thread\n");
#endif
-
+ if (UE_scan == 1) {
+ for (card=0;card<MAX_CARDS;card++) {
+ for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
+ downlink_frequency[card][i] = bands_to_scan.band_info[0].dl_min;
+ uplink_frequency_offset[card][i] = bands_to_scan.band_info[0].ul_min-bands_to_scan.band_info[0].dl_min;
+
+ openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i];
+ openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i];
+ openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-USRP_GAIN_OFFSET;
+#ifdef USRP
+#ifndef USRP_DEBUG
+ openair0_set_frequencies(&openair0,&openair0_cfg[0]);
+ // openair0_set_gains(&openair0,&openair0_cfg[0]);
+#endif
+#endif
+ }
+ }
+ LOG_D(PHY,"[SCHED][UE] Scanning band %d, freq %u\n",bands_to_scan.band_info[0].band, bands_to_scan.band_info[0].dl_min);
+ }
+ else {
+ LOG_D(PHY,"[SCHED][UE] Check absolute frequency %u\n",downlink_frequency[0][0]);
+ }
while (!oai_exit) {
- if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
- LOG_E(PHY,"[SCHED][eNB] error locking mutex for UE initial synch thread\n");
- oai_exit=1;
- }
- else {
- while (UE->instance_cnt_synch < 0) {
+ if (pthread_mutex_lock(&UE->mutex_synch) != 0) {
+ LOG_E(PHY,"[SCHED][UE] error locking mutex for UE initial synch thread\n");
+ oai_exit=1;
+ }
+ else {
+ while (UE->instance_cnt_synch < 0) {
pthread_cond_wait(&UE->cond_synch,&UE->mutex_synch);
}
- if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {
+ if (pthread_mutex_unlock(&UE->mutex_synch) != 0) {
LOG_E(PHY,"[SCHED][eNB] error unlocking mutex for UE Initial Synch thread\n");
oai_exit=1;
}
-
- } // mutex_lock
- // LOG_I(PHY,"[SCHED][UE] Running UE intial synch\n");
- if (initial_sync(PHY_vars_UE_g[0][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));
- */
+ } // mutex_lock
- T0 = rt_get_time_ns();
-
- is_synchronized = 1;
- PHY_vars_UE_g[0][0]->slot_rx = 0;
- //oai_exit=1;
- //start the DMA transfers
- //LOG_D(HW,"Before openair0_start_rt_acquisition \n");
- //openair0_start_rt_acquisition(0);
-
- hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti;
- LOG_I(HW,"Got synch: hw_slot_offset %d\n",hw_slot_offset);
-
- }
- else {
-
- if (openair_daq_vars.freq_offset >= 0) {
+
+ switch (sync_mode) {
+ case rssi:
+ rssi_min = 1<<31;
+ rssi_max = 0;
+ rssi_avg = 0;
+ for (i=0;i<76800;i+=7680) {
+
+ rssi_lin = signal_energy(&PHY_vars_UE_g[0][0]->lte_ue_common_vars.rxdata[0][i],7680);
+ if (PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx>1)
+ rssi_lin += signal_energy(&PHY_vars_UE_g[0][0]->lte_ue_common_vars.rxdata[0][i],7680);
+ rssi_avg += rssi;
+ rssi_min = (rssi < rssi_min) ? rssi : rssi_min;
+ rssi_max = (rssi > rssi_max) ? rssi : rssi_max;
+ }
+
+ rssi_dBm = dB_fixed_times10(rssi_avg/10)/10.0 - PHY_vars_UE_g[0][0]->rx_total_gain_dB;
+ rssi_max_dBm = dB_fixed_times10(rssi_max)/10.0 - PHY_vars_UE_g[0][0]->rx_total_gain_dB;
+ rssi_min_dBm = dB_fixed_times10(rssi_min)/10.0 - PHY_vars_UE_g[0][0]->rx_total_gain_dB;
+
+ LOG_D(PHY,"Band %d, DL Freq %u: RSSI (avg, min, max) %f,%f,%f dBm\n",
+ bands_to_scan.band_info[current_band].band,
+ downlink_frequency[0][0],
+ rssi_dBm,
+ rssi_min_dBm,
+ rssi_max_dBm);
+
+ current_offset += 100000; // increase by 1 EARFCN (100kHz)
+ if (current_offset+5000000 > bands_to_scan.band_info[current_band].dl_max-bands_to_scan.band_info[current_band].dl_min) {
+ current_band++;
+ current_offset=0;
+ }
+ if (current_band==bands_to_scan.nbands) {
+ current_band=0;
+
+ }
+
+ for (card=0;card<MAX_CARDS;card++) {
+ for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
+ openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+openair_daq_vars.freq_offset;
+ openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+openair_daq_vars.freq_offset;
+ openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-USRP_GAIN_OFFSET; // 65 calibrated for USRP B210 @ 2.6 GHz
+#ifdef USRP
+#ifndef USRP_DEBUG
+ openair0_set_frequencies(&openair0,&openair0_cfg[0]);
+ // openair0_set_gains(&openair0,&openair0_cfg[0]);
+#endif
+#endif
+ }
+ }
+
+ break;
+ case pbch:
+
+ if (initial_sync(PHY_vars_UE_g[0][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));
+ */
+
+ T0 = rt_get_time_ns();
+
+ is_synchronized = 1;
+ PHY_vars_UE_g[0][0]->slot_rx = 0;
+ //oai_exit=1;
+ //start the DMA transfers
+ //LOG_D(HW,"Before openair0_start_rt_acquisition \n");
+ //openair0_start_rt_acquisition(0);
+
+ hw_slot_offset = (PHY_vars_UE_g[0][0]->rx_offset<<1) / PHY_vars_UE_g[0][0]->lte_frame_parms.samples_per_tti;
+ LOG_I(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 {
+ else {
openair_daq_vars.freq_offset *= -1;
}
- if (abs(openair_daq_vars.freq_offset) > 7500) {
+ if (abs(openair_daq_vars.freq_offset) > 7500) {
LOG_I(PHY,"[initial_sync] No cell synchronization found, abandoning\n");
mac_xface->macphy_exit("No cell synchronization found, abandoning");
}
- else {
+ else {
LOG_I(PHY,"[initial_sync] trying carrier off %d Hz, rxgain %d\n",openair_daq_vars.freq_offset,
- PHY_vars_UE_g[0][0]->rx_total_gain_dB);
+ PHY_vars_UE_g[0][0]->rx_total_gain_dB);
for (card=0;card<MAX_CARDS;card++) {
- for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
- openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+openair_daq_vars.freq_offset;
- openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+openair_daq_vars.freq_offset;
- openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-82; // 65 calibrated for USRP B210 @ 2.6 GHz
+ for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
+ openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+openair_daq_vars.freq_offset;
+ openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+openair_daq_vars.freq_offset;
+ openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB-USRP_GAIN_OFFSET; // 65 calibrated for USRP B210 @ 2.6 GHz
#ifdef USRP
#ifndef USRP_DEBUG
- openair0_set_frequencies(&openair0,&openair0_cfg[0]);
- // openair0_set_gains(&openair0,&openair0_cfg[0]);
+ openair0_set_frequencies(&openair0,&openair0_cfg[0]);
+ // openair0_set_gains(&openair0,&openair0_cfg[0]);
#endif
#endif
- }
- }
-
+ }
+ }
+
// openair0_dump_config(&openair0_cfg[0],UE_flag);
-
+
// rt_sleep_ns(FRAME_PERIOD);
- } // freq_offset
- } // initial_sync=0
+ } // freq_offset
+} // initial_sync=0
+ break;
+ case si:
+ default:
+break;
+}
- if (pthread_mutex_lock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {
- printf("[openair][SCHED][eNB] error locking mutex for UE synch\n");
- }
- else {
- PHY_vars_UE_g[0][0]->instance_cnt_synch--;
+if (pthread_mutex_lock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {
+ printf("[openair][SCHED][eNB] error locking mutex for UE synch\n");
+ }
+ else {
+ PHY_vars_UE_g[0][0]->instance_cnt_synch--;
- if (pthread_mutex_unlock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {
- printf("[openair][SCHED][eNB] error unlocking mutex for UE synch\n");
- }
- }
+ if (pthread_mutex_unlock(&PHY_vars_UE_g[0][0]->mutex_synch) != 0) {
+ printf("[openair][SCHED][eNB] error unlocking mutex for UE synch\n");
+ }
+ }
- } // while !oai_exit
- return(0);
+} // while !oai_exit
+return(0);
}
static void *UE_thread_tx(void *arg) {
@@ -1979,31 +2122,31 @@ static void *UE_thread_rx(void *arg) {
PHY_VARS_UE *UE = (PHY_VARS_UE*)arg;
int i;
/*
-#ifdef LOWLATENCY
- struct sched_attr attr;
- unsigned int flags = 0;
-#endif
+ #ifdef LOWLATENCY
+ struct sched_attr attr;
+ unsigned int flags = 0;
+ #endif
*/
UE->instance_cnt_rx=-1;
/*
-#ifdef LOWLATENCY
- attr.size = sizeof(attr);
- attr.sched_flags = 0;
- attr.sched_nice = 0;
- attr.sched_priority = 0;
+ #ifdef LOWLATENCY
+ attr.size = sizeof(attr);
+ attr.sched_flags = 0;
+ attr.sched_nice = 0;
+ attr.sched_priority = 0;
- // This creates a 1ms reservation every 10ms period
- attr.sched_policy = SCHED_DEADLINE;
- attr.sched_runtime = 1 * 800000; // each tx thread requires 1ms to finish its job
- attr.sched_deadline =1 * 1000000; // each tx thread will finish within 1ms
- attr.sched_period = 1 * 1000000; // each tx thread has a period of 10ms from the starting point
+ // This creates a 1ms reservation every 10ms period
+ attr.sched_policy = SCHED_DEADLINE;
+ attr.sched_runtime = 1 * 800000; // each tx thread requires 1ms to finish its job
+ attr.sched_deadline =1 * 1000000; // each tx thread will finish within 1ms
+ attr.sched_period = 1 * 1000000; // each tx thread has a period of 10ms from the starting point
- if (sched_setattr(0, &attr, flags) < 0 ){
+ if (sched_setattr(0, &attr, flags) < 0 ){
perror("[SCHED] eNB tx thread: sched_setattr failed\n");
exit(-1);
- }
-#endif
-*/
+ }
+ #endif
+ */
mlockall(MCL_CURRENT | MCL_FUTURE);
#ifndef EXMIMO
@@ -2103,12 +2246,12 @@ static void *UE_thread(void *arg) {
void *rxp[2],*txp[2];
/*
-#ifdef LOWLATENCY
- struct sched_attr attr;
- unsigned int flags = 0;
- unsigned long mask = 1; // processor 0
-#endif
-*/
+ #ifdef LOWLATENCY
+ struct sched_attr attr;
+ unsigned int flags = 0;
+ unsigned long mask = 1; // processor 0
+ #endif
+ */
printf("waiting for sync (UE_thread)\n");
#ifdef RTAI
@@ -2124,32 +2267,32 @@ static void *UE_thread(void *arg) {
printf("starting UE thread\n");
/*
-#ifdef LOWLATENCY
- attr.size = sizeof(attr);
- attr.sched_flags = 0;
- attr.sched_nice = 0;
- attr.sched_priority = 0;
+ #ifdef LOWLATENCY
+ attr.size = sizeof(attr);
+ attr.sched_flags = 0;
+ attr.sched_nice = 0;
+ attr.sched_priority = 0;
- // This creates a .5 ms reservation
- attr.sched_policy = SCHED_DEADLINE;
- attr.sched_runtime = 0.5 * 1000000;
- attr.sched_deadline = 0.5 * 1000000;
- attr.sched_period = 1 * 1000000;
+ // This creates a .5 ms reservation
+ attr.sched_policy = SCHED_DEADLINE;
+ attr.sched_runtime = 0.5 * 1000000;
+ attr.sched_deadline = 0.5 * 1000000;
+ attr.sched_period = 1 * 1000000;
- // pin the UE main thread to CPU0
- // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) {
- // perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n");
- // }
+ // pin the UE main thread to CPU0
+ // if (pthread_setaffinity_np(pthread_self(), sizeof(mask),&mask) <0) {
+ // perror("[MAIN_ENB_THREAD] pthread_setaffinity_np failed\n");
+ // }
- if (sched_setattr(0, &attr, flags) < 0 ){
+ if (sched_setattr(0, &attr, flags) < 0 ){
perror("[SCHED] main eNB thread: sched_setattr failed\n");
exit_fun("Nothing to add");
- } else {
+ } else {
LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %ld started on CPU %d\n",
- gettid(),sched_getcpu());
- }
-#endif
-*/
+ gettid(),sched_getcpu());
+ }
+ #endif
+ */
mlockall(MCL_CURRENT | MCL_FUTURE);
T0 = rt_get_time_ns();
@@ -2631,57 +2774,6 @@ void init_UE_threads(void) {
}
-#define KHz (1000UL)
-#define MHz (1000 * KHz)
-
-typedef struct eutra_band_s {
- int16_t band;
- uint32_t ul_min;
- uint32_t ul_max;
- uint32_t dl_min;
- uint32_t dl_max;
- lte_frame_type_t frame_type;
-} eutra_band_t;
-
-typedef struct band_info_s {
- int nbands;
- eutra_band_t band_info[100];
-} band_info_t;
-
-band_info_t bands_to_scan;
-
-static const eutra_band_t eutra_bands[] =
-{
- { 1, 1920 * MHz, 1980 * MHz, 2110 * MHz, 2170 * MHz, FDD},
- { 2, 1850 * MHz, 1910 * MHz, 1930 * MHz, 1990 * MHz, FDD},
- { 3, 1710 * MHz, 1785 * MHz, 1805 * MHz, 1880 * MHz, FDD},
- { 4, 1710 * MHz, 1755 * MHz, 2110 * MHz, 2155 * MHz, FDD},
- { 5, 824 * MHz, 849 * MHz, 869 * MHz, 894 * MHz, FDD},
- { 6, 830 * MHz, 840 * MHz, 875 * MHz, 885 * MHz, FDD},
- { 7, 2500 * MHz, 2570 * MHz, 2620 * MHz, 2690 * MHz, FDD},
- { 8, 880 * MHz, 915 * MHz, 925 * MHz, 960 * MHz, FDD},
- { 9, 1749900 * KHz, 1784900 * KHz, 1844900 * KHz, 1879900 * KHz, FDD},
- {10, 1710 * MHz, 1770 * MHz, 2110 * MHz, 2170 * MHz, FDD},
- {11, 1427900 * KHz, 1452900 * KHz, 1475900 * KHz, 1500900 * KHz, FDD},
- {12, 698 * MHz, 716 * MHz, 728 * MHz, 746 * MHz, FDD},
- {13, 777 * MHz, 787 * MHz, 746 * MHz, 756 * MHz, FDD},
- {14, 788 * MHz, 798 * MHz, 758 * MHz, 768 * MHz, FDD},
-
- {17, 704 * MHz, 716 * MHz, 734 * MHz, 746 * MHz, FDD},
-
- {33, 1900 * MHz, 1920 * MHz, 1900 * MHz, 1920 * MHz, TDD},
- {34, 2010 * MHz, 2025 * MHz, 2010 * MHz, 2025 * MHz, TDD},
- {35, 1850 * MHz, 1910 * MHz, 1850 * MHz, 1910 * MHz, TDD},
- {36, 1930 * MHz, 1990 * MHz, 1930 * MHz, 1990 * MHz, TDD},
- {37, 1910 * MHz, 1930 * MHz, 1910 * MHz, 1930 * MHz, TDD},
- {38, 2570 * MHz, 2620 * MHz, 2570 * MHz, 2630 * MHz, TDD},
- {39, 1880 * MHz, 1920 * MHz, 1880 * MHz, 1920 * MHz, TDD},
- {40, 2300 * MHz, 2400 * MHz, 2300 * MHz, 2400 * MHz, TDD},
- {41, 2496 * MHz, 2690 * MHz, 2496 * MHz, 2690 * MHz, TDD},
- {42, 3400 * MHz, 3600 * MHz, 3400 * MHz, 3600 * MHz, TDD},
- {43, 3600 * MHz, 3800 * MHz, 3600 * MHz, 3800 * MHz, TDD},
- {44, 703 * MHz, 803 * MHz, 703 * MHz, 803 * MHz, TDD},
-};
void fill_ue_band_info() {
@@ -2797,6 +2889,7 @@ static void get_options (int argc, char **argv) {
downlink_frequency[CC_id][3] = downlink_frequency[CC_id][0];
printf("Downlink for CC_id %d frequency set to %u\n", CC_id, downlink_frequency[CC_id][0]);
}
+ UE_scan=0;
break;
case 'd':
@@ -3495,7 +3588,7 @@ int main(int argc, char **argv) {
openair0_cfg[card].tx_gain[i] = tx_gain[0][i];
openair0_cfg[card].rx_gain[i] = ((UE_flag==0) ? PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB :
- PHY_vars_UE_g[0][0]->rx_total_gain_dB) - 82.0; // calibrated for USRP B210 @ 2.6 GHz
+ PHY_vars_UE_g[0][0]->rx_total_gain_dB) - USRP_GAIN_OFFSET; // calibrated for USRP B210 @ 2.6 GHz
openair0_cfg[card].tx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] : downlink_frequency[0][i]+uplink_frequency_offset[0][i];
openair0_cfg[card].rx_freq[i] = (UE_flag==0) ? downlink_frequency[0][i] + uplink_frequency_offset[0][i] : downlink_frequency[0][i];
printf("Setting tx_gain %f, rx_gain %f, tx_freq %f, rx_freq %f\n",
--
GitLab