diff --git a/cmake_targets/CMakeLists.txt b/cmake_targets/CMakeLists.txt index ae5eaefc432225ea99d906ea7c6df85f3a981d52..9a14bac60fdb6d0b3656c3130f06283ab3e9f396 100644 --- a/cmake_targets/CMakeLists.txt +++ b/cmake_targets/CMakeLists.txt @@ -2014,7 +2014,7 @@ target_link_libraries (lte-uesoftmodem ${T_LIB}) add_executable(lte-uesoftmodem-nos1 ${rrc_h} ${s1ap_h} -# ${OPENAIR_BIN_DIR}/messages_xml.h + ${OPENAIR_BIN_DIR}/messages_xml.h ${OPENAIR_TARGETS}/RT/USER/rt_wrapper.c ${OPENAIR_TARGETS}/RT/USER/lte-ue.c ${OPENAIR_TARGETS}/RT/USER/lte-uesoftmodem.c diff --git a/openair1/PHY/INIT/lte_init_ue.c b/openair1/PHY/INIT/lte_init_ue.c index f8fc634b94b9e4d78e7491a928b885132ab5a953..6a8430bc769c36db654a6e28e7cac98204c60e31 100644 --- a/openair1/PHY/INIT/lte_init_ue.c +++ b/openair1/PHY/INIT/lte_init_ue.c @@ -709,6 +709,7 @@ int init_lte_ue_signal(PHY_VARS_UE *ue, for (i=0; i<fp->nb_antennas_rx; i++) { common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) ); + LOG_I(PHY,"common_vars->rxdata[%d] %p\n",i,common_vars->rxdata[i]); common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) ); } diff --git a/openair1/PHY/defs_common.h b/openair1/PHY/defs_common.h index c253488a200b687ea107541f2991fd7d12cafd3d..2a41fd887e0d7b12999b32b9f39dba56c970ce10 100644 --- a/openair1/PHY/defs_common.h +++ b/openair1/PHY/defs_common.h @@ -986,7 +986,7 @@ typedef uint8_t(*encoder_if_t)(uint8_t *input, static inline void wait_sync(char *thread_name) { - printf( "waiting for sync (%s)\n",thread_name); + printf( "waiting for sync (%s,%p,%p,%p)\n",thread_name,&sync_var,&sync_cond,&sync_mutex); pthread_mutex_lock( &sync_mutex ); while (sync_var<0) diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 057052aa32d3d0cf97f796f0bb9b80c280a9c1be..018544525ce7ca38fd812bb77ca6f338501fa024 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -1644,7 +1644,7 @@ static void* ru_thread( void* param ) { // wakeup all eNB processes waiting for this RU if (ru->num_eNB>0) wakeup_eNBs(ru); - if(get_nprocs() <= 4){ + if(get_nprocs() <= 4 || ru->num_eNB==0){ // do TX front-end processing if needed (precoding and/or IDFTs) if (ru->feptx_prec) ru->feptx_prec(ru); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index e9373620fb56b22bce33f6470e6a8db7b3a96d86..c6750f303f11ea0e1d25be26974ad477fd5d2f1d 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -154,7 +154,8 @@ static char *itti_dump_file = NULL; int UE_scan = 1; int UE_scan_carrier = 0; runmode_t mode = normal_txrx; - +int simL1flag; +int snr_dB; FILE *input_fd=NULL; diff --git a/targets/RT/USER/lte-softmodem.h b/targets/RT/USER/lte-softmodem.h index 87cda699517b741b43ab4e088b7ac7a444e14e86..40fdbba3253fd68655a60a14822453b3e050fbaa 100644 --- a/targets/RT/USER/lte-softmodem.h +++ b/targets/RT/USER/lte-softmodem.h @@ -81,6 +81,7 @@ #define CONFIG_HLP_MSLOTS "Skip the missed slots/subframes \n" #define CONFIG_HLP_ULMCS "Set the maximum uplink MCS\n" #define CONFIG_HLP_TDD "Set hardware to TDD mode (default: FDD). Used only with -U (otherwise set in config file).\n" +#define CONFIG_HLP_SNR "Set average SNR in dB (for --siml1 option)\n" #define CONFIG_HLP_UE "Set the lte softmodem as a UE\n" #define CONFIG_HLP_L2MONW "Enable L2 wireshark messages on localhost \n" #define CONFIG_HLP_L2MONP "Enable L2 pcap messages on localhost \n" @@ -183,6 +184,7 @@ {"q" , CONFIG_HLP_STMON, PARAMFLAG_BOOL, iptr:&opp_enabled, defintval:0, TYPE_INT, 0}, \ {"S" , CONFIG_HLP_MSLOTS, PARAMFLAG_BOOL, u8ptr:&exit_missed_slots, defintval:1, TYPE_UINT8, 0}, \ {"T" , CONFIG_HLP_TDD, PARAMFLAG_BOOL, iptr:&tddflag, defintval:0, TYPE_INT, 0}, \ +{"s" , CONFIG_HLP_SNR, PARAMFLAG_BOOL, iptr:&snr_dB, defintval:15, TYPE_INT, 0}, \ {"numerology" , CONFIG_HLP_NUMEROLOGY, PARAMFLAG_BOOL, iptr:&numerology, defintval:0, TYPE_INT, 0}, \ {"emulate-rf" , CONFIG_HLP_EMULATE_RF, PARAMFLAG_BOOL, iptr:&emulate_rf, defintval:0, TYPE_INT, 0}, \ {"codingw" , CONFIG_HLP_CODINGW, PARAMFLAG_BOOL, iptr:&codingw, defintval:0, TYPE_INT, 0}, \ diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index c113b1264c3333065cdf2846b7851e8d178ba5f8..3277998f101407d18322ffa9ce4feeb6223cd430 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -254,8 +254,18 @@ void init_UE(int nb_inst,int eMBMS_active, int uecap_xer_in, int timing_correcti for (inst=0;inst<nb_inst;inst++) { if (PHY_vars_UE_g[inst]==NULL) PHY_vars_UE_g[inst] = (PHY_VARS_UE**)calloc(1+MAX_NUM_CCs,sizeof(PHY_VARS_UE*)); + + if (simL1flag == 0) PHY_vars_UE_g[inst][0] = init_ue_vars(NULL,inst,0); - else PHY_vars_UE_g[inst][0] = init_ue_vars(&RC.ru[0]->frame_parms,inst,0); + else { + RC.ru[0]->frame_parms.nb_antennas_rx = nb_rx; + RC.ru[0]->frame_parms.nb_antennas_tx = nb_tx; + RC.ru[0]->frame_parms.frame_type = FDD; + RC.ru[0]->frame_parms.tdd_config = 3; + RC.ru[0]->frame_parms.tdd_config_S = 0; + + PHY_vars_UE_g[inst][0] = init_ue_vars(&RC.ru[0]->frame_parms,inst,0); + } // turn off timing control loop in UE PHY_vars_UE_g[inst][0]->no_timing_correction = timing_correction; @@ -1476,8 +1486,7 @@ void *UE_thread(void *arg) { pthread_mutex_unlock(&sync_mutex); */ - wait_sync("UE thread\n"); - LOG_I(PHY,"UE_thread Got sync\n"); + wait_sync("UE thread"); #ifdef NAS_UE MessageDef *message_p; message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE); diff --git a/targets/RT/USER/lte-uesoftmodem.c b/targets/RT/USER/lte-uesoftmodem.c index 9b803009a26928ef04480321fa450750a1ac7349..38bdc565732e198e3dd59943f3b1615aed7a520e 100644 --- a/targets/RT/USER/lte-uesoftmodem.c +++ b/targets/RT/USER/lte-uesoftmodem.c @@ -157,6 +157,8 @@ static char *itti_dump_file = NULL; int UE_scan = 1; int UE_scan_carrier = 0; int simL1flag = 0; +int snr_dB=15; + runmode_t mode = normal_txrx; FILE *input_fd=NULL; @@ -870,6 +872,9 @@ int main( int argc, char **argv ) log_set_instance_type (LOG_INSTANCE_UE); + pthread_cond_init(&sync_cond,NULL); + pthread_mutex_init(&sync_mutex, NULL); + printf("ITTI init\n"); itti_init(TASK_MAX, THREAD_MAX, MESSAGES_ID_MAX, tasks_info, messages_info, messages_definition_xml, itti_dump_file); @@ -1052,8 +1057,6 @@ int main( int argc, char **argv ) mlockall(MCL_CURRENT | MCL_FUTURE); - pthread_cond_init(&sync_cond,NULL); - pthread_mutex_init(&sync_mutex, NULL); #ifdef XFORMS int UE_id; @@ -1144,19 +1147,19 @@ int main( int argc, char **argv ) } //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; - if (simL1flag==1) init_ocm(); + if (simL1flag==1) init_ocm((double)snr_dB,0); - printf("Sending sync to all threads\n"); + printf("Sending sync to all threads (%p,%p,%p)\n",&sync_var,&sync_mutex,&sync_cond); pthread_mutex_lock(&sync_mutex); sync_var=0; pthread_cond_broadcast(&sync_cond); pthread_mutex_unlock(&sync_mutex); - +/* printf("About to call end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); end_configmodule(); printf("Called end_configmodule() from %s() %s:%d\n", __FUNCTION__, __FILE__, __LINE__); - +*/ // wait for end of program printf("TYPE <CTRL-C> TO TERMINATE\n"); //getchar(); diff --git a/targets/RT/USER/rfsim.c b/targets/RT/USER/rfsim.c index 32897c5c2c2477d5450aaed0a7bf3096b30a5ce2..9e73fd3ffe1608fdc51fc2668ec2457dd0fe9eb7 100644 --- a/targets/RT/USER/rfsim.c +++ b/targets/RT/USER/rfsim.c @@ -151,7 +151,7 @@ void RCConfig_sim(void) { init_ru_devices(); - int nframes = 100000; + static int nframes = 100000; AssertFatal(0 == pthread_create(&rfsim_thread, NULL, @@ -223,7 +223,8 @@ int ru_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** usleep(500); } - + + subframe = (last_ru_rx_timestamp[ru_id][CC_id]/RC.ru[ru_id]->frame_parms.samples_per_tti)%10; if (subframe_select(&RC.ru[ru_id]->frame_parms,subframe) != SF_DL || RC.ru[ru_id]->frame_parms.frame_type == FDD) { LOG_D(SIM,"RU_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n", @@ -373,7 +374,7 @@ void init_ru_devices(){ if (RC.ru==NULL) RC.ru = (RU_t**)malloc(RC.nb_RU*sizeof(RU_t*)); for (ru_id=0;ru_id<RC.nb_RU;ru_id++) { - LOG_I(SIM,"Initiaizing rfdevice for RU %d\n",ru_id); + LOG_D(SIM,"Initiaizing rfdevice for RU %d\n",ru_id); if (RC.ru[ru_id]==NULL) RC.ru[ru_id] = (RU_t*)malloc(sizeof(RU_t)); ru = RC.ru[ru_id]; ru->rfdevice.Mod_id = ru_id; @@ -530,13 +531,11 @@ void init_channel_vars(void) void rfsim_top(void *n_frames) { - LOG_I(PHY,"rfsim_top: Waiting for sync\n"); - while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); - pthread_mutex_unlock(&sync_mutex); + wait_sync("rfsim_top"); + printf("Running rfsim with %d frames\n",*(int*)n_frames); for (int frame = 0; frame < *(int*)n_frames; frame++) { @@ -544,10 +543,10 @@ void rfsim_top(void *n_frames) { for (int sf = 0; sf < 10; sf++) { int CC_id=0; int all_done=0; - printf("Running %d.%d\n",frame,sf); while (all_done==0) { pthread_mutex_lock(&subframe_mutex); + int subframe_ru_mask_local = (subframe_select(&RC.ru[0]->frame_parms,(sf+4)%10)!=SF_UL) ? subframe_ru_mask : ((1<<RC.nb_RU)-1); int subframe_UE_mask_local = (RC.ru[0]->frame_parms.frame_type == FDD || subframe_select(&RC.ru[0]->frame_parms,(sf+4)%10)!=SF_DL) ? subframe_UE_mask : ((1<<NB_UE_INST)-1); pthread_mutex_unlock(&subframe_mutex);