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