From ca2c8357c9f3496e102aa4fb4825d8d9b25c3099 Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Wed, 19 Apr 2017 02:51:15 +0200 Subject: [PATCH] vcd for rru/rau. bug fixing on fronthaul interfaces --- openair1/SCHED/ru_procedures.c | 12 +++---- openair2/UTIL/LOG/vcd_signal_dumper.c | 6 +++- openair2/UTIL/LOG/vcd_signal_dumper.h | 6 +++- targets/RT/USER/lte-ru.c | 51 ++++++++++++++++----------- targets/SIMU/USER/channel_sim.c | 5 ++- 5 files changed, 49 insertions(+), 31 deletions(-) diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index fe77dbbfc0..66331cc71f 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -73,7 +73,7 @@ void feptx_ofdm(RU_t *ru) { // int CC_id = ru->proc.CC_id; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 ); // slot_offset_F = (subframe<<1)*slot_sizeF; @@ -189,7 +189,7 @@ void feptx_ofdm(RU_t *ru) { dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); } } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 ); } void feptx_prec(RU_t *ru) { @@ -216,7 +216,7 @@ void feptx_prec(RU_t *ru) { aa); } } - LOG_I(PHY,"feptx_prec: frame %d, subframe %d: txp (freq) %d dB\n", + LOG_D(PHY,"feptx_prec: frame %d, subframe %d: txp (freq) %d dB\n", ru->proc.frame_tx,subframe, dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[0],2*fp->symbols_per_tti*fp->ofdm_symbol_size))); } @@ -294,7 +294,6 @@ void ru_fep_full_2thread(RU_t *ru) { wait.tv_sec=0; wait.tv_nsec=5000000L; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); start_meas(&ru->ofdm_demod_stats); if (pthread_mutex_timedlock(&proc->mutex_fep,&wait) != 0) { @@ -339,7 +338,6 @@ void fep_full(RU_t *ru) { start_meas(&ru->ofdm_demod_stats); - if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,1); remove_7_5_kHz(ru,proc->subframe_rx<<1); remove_7_5_kHz(ru,1+(proc->subframe_rx<<1)); @@ -359,7 +357,6 @@ void fep_full(RU_t *ru) { } stop_meas(&ru->ofdm_demod_stats); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP,0); } @@ -371,7 +368,7 @@ void do_prach_ru(RU_t *ru) { // check if we have to detect PRACH first if (is_prach_subframe(fp,proc->frame_prach,proc->subframe_prach)>0) { - /* accept some delay in processing - up to 5ms */ + //accept some delay in processing - up to 5ms int i; for (i = 0; i < 10 && proc->instance_cnt_prach == 0; i++) { LOG_W(PHY,"Frame %d Subframe %d, PRACH thread busy (IC %d)!!\n", proc->frame_prach,proc->subframe_prach, @@ -403,3 +400,4 @@ void do_prach_ru(RU_t *ru) { } } + diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 8f7c83673f..1e415d1b60 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -240,9 +240,12 @@ const char* eurecomFunctionsNames[] = { "phy_procedures_eNb_tx1", "phy_procedures_ru_feprx0", "phy_procedures_ru_feprx1", + "phy_procedures_ru_feptx_ofdm0", + "phy_procedures_ru_feptx_ofdm1", + "phy_procedures_ru_feptx_prec0", + "phy_procedures_ru_feptx_prec1", "phy_procedures_eNb_rx_uespec0", "phy_procedures_eNb_rx_uespec1", - "phy_eNB_slot_fep", "phy_procedures_ue_tx", "phy_procedures_ue_rx", "phy_procedures_ue_tx_ulsch_uespec", @@ -292,6 +295,7 @@ const char* eurecomFunctionsNames[] = { "phy_enb_ulsch_decoding7", "phy_enb_sfgen", "phy_enb_prach_rx", + "phy_ru_prach_rx", "phy_enb_pdcch_tx", "phy_enb_rs_tx", "phy_ue_generate_prach", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index fdd590a7b7..925fdd9333 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -214,9 +214,12 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_TX1, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX1, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM1, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_PREC1, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC1, - VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_SLOT_FEP, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_ULSCH_UESPEC, @@ -266,6 +269,7 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_ULSCH_DECODING7, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PRACH_RX, + VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_PDCCH_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX, VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 2696df5db4..e7328c549d 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -137,7 +137,7 @@ static inline void fh_if5_mobipass_south_out(RU_t *ru) { // southbound IF4p5 fronthaul static inline void fh_if4p5_south_out(RU_t *ru) { if (ru == RC.ru[0]) VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, ru->proc.timestamp_tx&0xffffffff ); - LOG_I(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.subframe_tx); + LOG_D(PHY,"Sending IF4p5 for frame %d subframe %d\n",ru->proc.frame_tx,ru->proc.subframe_tx); send_IF4p5(ru,ru->proc.frame_tx, ru->proc.subframe_tx, IF4p5_PDLFFT, 0); } @@ -206,12 +206,9 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) { if ((proc->first_rx==0) && (sf!=*subframe)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received subframe %d != expected %d (first_rx %d)\n",sf,*subframe,proc->first_rx); break; + } else if (packet_type == IF4p5_PRACH) { - if (ru->do_prach==1) { - proc->subframe_prach = sf; - proc->frame_prach = f; - do_prach_ru(ru); - } + // nothing in RU for RAU } } while(proc->symbol_mask[*subframe] != symbol_mask_full); @@ -453,7 +450,14 @@ void fh_if4p5_north_asynch_in(RU_t *ru,int *frame,int *subframe) { } while (symbol_mask != symbol_mask_full); proc->subframe_tx = subframe_tx; + proc->frame_tx = frame_tx; + // dump VCD output for first RU in list + if (ru == RC.ru[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, frame_tx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, subframe_tx ); + } + if (ru->feptx_ofdm) ru->feptx_ofdm(ru); if (ru->fh_south_out) ru->fh_south_out(ru); } @@ -527,6 +531,11 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { proc->subframe_tx = (proc->subframe_rx+4)%10; proc->frame_tx = (proc->subframe_rx>5) ? (proc->frame_rx+1)&1023 : proc->frame_rx; + // dump VCD output for first RU in list + if (ru == RC.ru[0]) { + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_RU, proc->frame_rx ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_RU, proc->subframe_rx ); + } if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ @@ -631,7 +640,7 @@ static void* ru_thread_asynch_rxtx( void* param ) { } else { subframe++; } - LOG_I(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n"); + LOG_D(PHY,"ru_thread_asynch_rxtx: Waiting on incoming fronthaul\n"); // asynchronous receive from south (Mobipass) if (ru->fh_south_asynch_in) ru->fh_south_asynch_in(ru,&frame,&subframe); // asynchronous receive from north (RRU IF4/IF5) @@ -707,15 +716,15 @@ static void* ru_thread_prach( void* param ) { while (!oai_exit) { if (oai_exit) break; - if (wait_on_condition(&proc->mutex_prach,&proc->cond_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break; - + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 1 ); rx_prach(NULL, ru, NULL, NULL, proc->frame_prach, 0); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_RU_PRACH_RX, 0 ); if (release_thread(&proc->mutex_prach,&proc->instance_cnt_prach,"ru_prach_thread") < 0) break; } @@ -857,17 +866,15 @@ static inline int wakeup_prach(RU_t *ru) { exit_fun( "error locking mutex_rxtx" ); return(-1); } - ++ru->proc.instance_cnt_prach; - ru->proc.frame_prach = ru->proc.frame_rx; - ru->proc.subframe_prach = ru->proc.subframe_rx; - - // the thread can now be woken up - if (pthread_cond_signal(&ru->proc.cond_prach) != 0) { - LOG_E( PHY, "[RU] ERROR pthread_cond_signal for RU prach thread\n"); - exit_fun( "ERROR pthread_cond_signal" ); - return(-1); + if (ru->proc.instance_cnt_prach==-1) { + ++ru->proc.instance_cnt_prach; + ru->proc.frame_prach = ru->proc.frame_rx; + ru->proc.subframe_prach = ru->proc.subframe_rx; + + // the thread can now be woken up + AssertFatal(pthread_cond_signal(&ru->proc.cond_prach) == 0, "ERROR pthread_cond_signal for RU prach thread\n"); } - + else LOG_W(PHY,"RU prach thread busy, skipping\n"); pthread_mutex_unlock( &ru->proc.mutex_prach ); return(0); @@ -956,8 +963,10 @@ static void* ru_thread( void* param ) { else AssertFatal(1==0, "No fronthaul interface at south port"); - LOG_D(PHY,"RU thread (proc %p), received frame %d (%p), subframe %d (%p)\n", - proc, proc->frame_tx,&frame,subframe,&subframe); + LOG_D(PHY,"RU thread (do_prach %d, is_prach_subframe %d), received frame %d, subframe %d \n", + ru->do_prach, + is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx), + proc->frame_rx,proc->subframe_rx); if ((ru->do_prach>0) && (is_prach_subframe(fp, proc->frame_rx, proc->subframe_rx)>0)) wakeup_prach(ru); diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 52a8f9732f..101170df7c 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -251,7 +251,10 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM frame_parms->N_RB_DL*12); #ifdef DEBUG_SIM - LOG_D(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n", + LOG_I(PHY,"[SIM][DL] subframe %d: txp (time) %d dB\n", + subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],frame_parms->samples_per_tti))); + + LOG_I(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n", ru_id,CC_id, 10*log10(tx_pwr), frame_parms->pdsch_config_common.referenceSignalPower, -- GitLab