diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index ac57356f619f4516b7d74bbf86bb667e36d72371..dc20eff0caec7ef7aa2dc79c7576621051563e88 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -778,16 +778,13 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { // synchronize first reception to frame 0 subframe 0 #ifdef PHY_TX_THREAD - proc->timestamp_phy_tx = proc->timestamp_rx+(3*fp->samples_per_tti); - proc->subframe_phy_tx = (proc->subframe_rx+3)%10; - proc->frame_phy_tx = (proc->subframe_rx>6) ? (proc->frame_rx+1)&1023 : proc->frame_rx; + proc->timestamp_phy_tx = proc->timestamp_rx+((sf_ahead-1)*fp->samples_per_tti); + proc->subframe_phy_tx = (proc->subframe_rx+(sf_ahead-1))%10; + proc->frame_phy_tx = (proc->subframe_rx>(9-(sf_ahead-1))) ? (proc->frame_rx+1)&1023 : proc->frame_rx; #else -#if 0 - /* TODO for Fujitsu: fix this somehow */ proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti); proc->subframe_tx = (proc->subframe_rx+sf_ahead)%10; proc->frame_tx = (proc->subframe_rx>(9-sf_ahead)) ? (proc->frame_rx+1)&1023 : proc->frame_rx; -#endif #endif //proc->timestamp_tx = proc->timestamp_rx+(sf_ahead*fp->samples_per_tti); @@ -887,8 +884,6 @@ void tx_rf(RU_t *ru) { for (i=0; i<ru->nb_tx; i++) txp[i] = (void*)&ru->common.txdata[i][(proc->subframe_tx*fp->samples_per_tti)-sf_extension]; -#if 0 - /* TODO for Fujitsu: fix this somehow */ /* add fail safe for late command */ if(late_control!=STATE_BURST_NORMAL){//stop burst switch (late_control) { @@ -916,7 +911,6 @@ void tx_rf(RU_t *ru) { } } /* add fail safe for late command end */ -#endif VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_RU, proc->frame_tx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_RU, proc->subframe_tx ); @@ -1783,6 +1777,11 @@ static void* ru_thread( void* param ) { // wakeup all eNB processes waiting for this RU if (ru->num_eNB>0) wakeup_eNBs(ru); + // wait until eNBs are finished subframe RX n and TX n+sf_ahead + if(get_nprocs() > 4) + wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread"); + +#ifndef PHY_TX_THREAD if(get_nprocs() <= 4){ // do TX front-end processing if needed (precoding and/or IDFTs) if (ru->feptx_prec) ru->feptx_prec(ru); @@ -1796,32 +1795,11 @@ static void* ru_thread( void* param ) { if (ru->fh_north_out) ru->fh_north_out(ru); } } - -#if 0 - /* TODO for Fujitsu: fix this somehow */ - // wait until eNBs are finished subframe RX n and TX n+sf_ahead - wait_on_condition(&proc->mutex_eNBs,&proc->cond_eNBs,&proc->instance_cnt_eNBs,"ru_thread"); -#endif - - -#if 0 - /* TODO for Fujitsu: fix this somehow */ -#ifndef PHY_TX_THREAD - // do TX front-end processing if needed (precoding and/or IDFTs) - if (ru->feptx_prec) ru->feptx_prec(ru); - - // do OFDM if needed - if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru); - // do outgoing fronthaul (south) if needed - if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru); - - if (ru->fh_north_out) ru->fh_north_out(ru); #else while((!oai_exit)&&(phy_tx_end == 0)){ nanosleep(&time_req,&time_rem); continue; } -#endif #endif } @@ -2058,10 +2036,12 @@ static void* rf_tx( void* param ) { if (ru->feptx_prec) ru->feptx_prec(ru); // do OFDM if needed if ((ru->fh_north_asynch_in == NULL) && (ru->feptx_ofdm)) ru->feptx_ofdm(ru); - // do outgoing fronthaul (south) if needed - if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru); + if(!emulate_rf){ + // do outgoing fronthaul (south) if needed + if ((ru->fh_north_asynch_in == NULL) && (ru->fh_south_out)) ru->fh_south_out(ru); - if (ru->fh_north_out) ru->fh_north_out(ru); + if (ru->fh_north_out) ru->fh_north_out(ru); + } } if (release_thread(&proc->mutex_rf_tx,&proc->instance_cnt_rf_tx,"rf_tx") < 0) break; if(proc->instance_cnt_rf_tx >= 0){