From 413df163d83ae891ef9ac86071a37dbc64d4004b Mon Sep 17 00:00:00 2001 From: Raymond Knopp <raymond.knopp@eurecom.fr> Date: Sun, 4 Jun 2017 02:44:26 -0700 Subject: [PATCH] first working version with oaisim. This is prior to MAC interface reworking --- openair1/PHY/INIT/lte_init.c | 31 +- openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c | 2 +- .../PHY/LTE_ESTIMATION/lte_ue_measurements.c | 14 +- openair1/PHY/LTE_TRANSPORT/dci.c | 41 +- openair1/PHY/LTE_TRANSPORT/dci_tools.c | 17 +- openair1/PHY/LTE_TRANSPORT/if4_tools.c | 21 +- openair1/PHY/LTE_TRANSPORT/if4_tools.h | 2 +- openair1/PHY/LTE_TRANSPORT/pcfich.c | 23 +- openair1/PHY/LTE_TRANSPORT/prach.c | 136 ++- openair1/PHY/LTE_TRANSPORT/print_stats.c | 43 +- .../PHY/LTE_TRANSPORT/ulsch_demodulation.c | 11 +- openair1/PHY/MODULATION/defs.h | 3 +- openair1/PHY/MODULATION/slot_fep_ul.c | 51 +- openair1/PHY/MODULATION/ul_7_5_kHz.c | 2 +- openair1/PHY/defs.h | 12 + openair1/SCHED/phy_procedures_lte_eNb.c | 35 +- openair1/SCHED/phy_procedures_lte_ue.c | 22 +- openair1/SCHED/ru_procedures.c | 20 +- openair1/SIMULATION/RF/dac.c | 27 +- openair1/SIMULATION/RF/defs.h | 2 + openair2/ENB_APP/enb_config.c | 16 +- openair2/LAYER2/MAC/config.c | 5 + openair2/LAYER2/MAC/eNB_scheduler_ulsch.c | 8 +- openair2/LAYER2/MAC/main.c | 8 +- openair2/RRC/LITE/MESSAGES/asn1_msg.c | 28 +- openair2/RRC/LITE/rrc_eNB.c | 4 + openair2/UTIL/LOG/vcd_signal_dumper.c | 4 + openair2/UTIL/LOG/vcd_signal_dumper.h | 4 + targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h | 4 +- targets/RT/USER/lte-enb.c | 80 +- targets/RT/USER/lte-ru.c | 88 +- targets/RT/USER/lte-softmodem.c | 3 +- targets/RT/USER/lte-ue.c | 884 +++++++++--------- targets/SIMU/USER/channel_sim.c | 92 +- targets/SIMU/USER/oaisim.c | 14 +- targets/SIMU/USER/oaisim.h | 6 +- targets/SIMU/USER/oaisim_functions.c | 73 +- 37 files changed, 990 insertions(+), 846 deletions(-) diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index fe12ba0e18e..8784aa80b34 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -41,7 +41,7 @@ int N_RB_DL_array[6] = {6,15,25,50,75,100}; void phy_config_mib_eNB(int Mod_id, int CC_id, - int eutra_band, + int eutra_band, int dl_Bandwidth, PHICH_Config_t *phich_config, int Nid_cell, @@ -52,9 +52,10 @@ void phy_config_mib_eNB(int Mod_id, LTE_DL_FRAME_PARMS *fp; + PHICH_RESOURCE_t phich_resource_table[4]={oneSixth,half,one,two}; - LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u)\n", - Mod_id, CC_id, eutra_band, N_RB_DL_array[dl_Bandwidth], Nid_cell, p_eNB,dl_CarrierFreq); + LOG_I(PHY,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n", + Mod_id, CC_id, eutra_band, N_RB_DL_array[dl_Bandwidth], Nid_cell, p_eNB,dl_CarrierFreq,phich_config->phich_Resource,phich_config->phich_Duration); if (RC.eNB == NULL) { RC.eNB = (PHY_VARS_eNB ***)malloc((1+NUMBER_OF_eNB_MAX)*sizeof(PHY_VARS_eNB***)); @@ -84,7 +85,9 @@ void phy_config_mib_eNB(int Mod_id, fp->eutra_band = eutra_band; fp->Ncp = Ncp; fp->nb_antenna_ports_eNB = p_eNB; - fp->phich_config_common.phich_resource = phich_config->phich_Resource; + + AssertFatal(phich_config->phich_Resource < 4, "Illegal phich_Resource\n"); + fp->phich_config_common.phich_resource = phich_resource_table[phich_config->phich_Resource]; fp->phich_config_common.phich_duration = phich_config->phich_Duration; fp->dl_CarrierFreq = dl_CarrierFreq; fp->ul_CarrierFreq = ul_CarrierFreq; @@ -168,6 +171,8 @@ void phy_config_sib2_eNB(uint8_t Mod_id, LOG_D(PHY,"prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig = %d\n",fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig); fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset =radioResourceConfigCommon->prach_Config.prach_ConfigInfo.prach_FreqOffset; LOG_D(PHY,"prach_config_common.prach_ConfigInfo.prach_FreqOffset = %d\n",fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset); + + init_prach_tables(839); compute_prach_seq(&fp->prach_config_common,fp->frame_type, RC.eNB[Mod_id][CC_id]->X_u); @@ -245,7 +250,6 @@ void phy_config_sib2_eNB(uint8_t Mod_id, init_ul_hopping(fp); - // MBSFN if (mbsfn_SubframeConfigList != NULL) { fp->num_MBSFN_config = mbsfn_SubframeConfigList->list.count; @@ -1563,15 +1567,15 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, if (abstraction_flag==0) { for (eNB_id=0; eNB_id<3; eNB_id++) { - pusch_vars[UE_id]->rxdataF_ext = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->rxdataF_ext2 = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->drs_ch_estimates = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->drs_ch_estimates_time = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->rxdataF_comp = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_mag = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); - pusch_vars[UE_id]->ul_ch_magb = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_ext = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_ext2 = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->drs_ch_estimates_time = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->rxdataF_comp = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_mag = (int32_t**)malloc16( 2*sizeof(int32_t*) ); + pusch_vars[UE_id]->ul_ch_magb = (int32_t**)malloc16( 2*sizeof(int32_t*) ); - for (i=0; i<fp->nb_antennas_rx; i++) { + for (i=0; i<2; i++) { // RK 2 times because of output format of FFT! // FIXME We should get rid of this pusch_vars[UE_id]->rxdataF_ext[i] = (int32_t*)malloc16_clear( 2*sizeof(int32_t)*fp->N_RB_UL*12*fp->symbols_per_tti ); @@ -1594,7 +1598,6 @@ int phy_init_lte_eNB(PHY_VARS_eNB *eNB, eNB->pdsch_config_dedicated->p_a = dB0; //defaul value until overwritten by RRCConnectionReconfiguration - init_prach_tables(839); return (0); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c index 807c4e3e0a4..99cf55746dc 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_adjust_sync.c @@ -206,7 +206,7 @@ int lte_est_timing_advance_pusch(PHY_VARS_eNB* eNB,uint8_t UE_id) LTE_DL_FRAME_PARMS *frame_parms = &eNB->frame_parms; LTE_eNB_PUSCH *eNB_pusch_vars = eNB->pusch_vars[UE_id]; - int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time[0]; + int32_t **ul_ch_estimates_time= eNB_pusch_vars->drs_ch_estimates_time; uint8_t cyclic_shift = 0; int sync_pos = (frame_parms->ofdm_symbol_size-cyclic_shift*frame_parms->ofdm_symbol_size/12)%(frame_parms->ofdm_symbol_size); diff --git a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c index 09603d96cde..4ce6e6487af 100644 --- a/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c +++ b/openair1/PHY/LTE_ESTIMATION/lte_ue_measurements.c @@ -344,10 +344,10 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, for (l=0,nu=0; l<=(4-ue->frame_parms.Ncp); l+=(4-ue->frame_parms.Ncp),nu=3) { k = (nu + nushift)%6; -#ifdef DEBUG_MEAS_RRC - LOG_I(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift, + //#ifdef DEBUG_MEAS_RRC + LOG_D(PHY,"[UE %d] Frame %d subframe %d Doing ue_rrc_measurements rsrp/rssi (Nid_cell %d, nushift %d, eNB_offset %d, k %d, l %d)\n",ue->Mod_id,ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,Nid_cell,nushift, eNB_offset,k,l); -#endif + //#endif for (aarx=0; aarx<ue->frame_parms.nb_antennas_rx; aarx++) { rxF = (int16_t *)&ue->common_vars.common_vars_rx_data_per_thread[subframe&0x1].rxdataF[aarx][(l*ue->frame_parms.ofdm_symbol_size)]; @@ -422,18 +422,18 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, } -#ifdef DEBUG_MEAS_RRC + //#ifdef DEBUG_MEAS_RRC // if (slot == 0) { if (eNB_offset == 0) - LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id, + LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements => rssi %3.1f dBm (digital: %3.1f dB, gain %d), N0 %d dBm\n",ue->Mod_id, ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,10*log10(ue->measurements.rssi)-ue->rx_total_gain_dB, 10*log10(ue->measurements.rssi), ue->rx_total_gain_dB, ue->measurements.n0_power_tot_dBm); - LOG_I(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", + LOG_D(PHY,"[UE %d] Frame %d, subframe %d RRC Measurements (idx %d, Cell id %d) => rsrp: %3.1f dBm/RE (%d), rsrq: %3.1f dB\n", ue->Mod_id, ue->proc.proc_rxtx[subframe&1].frame_rx,subframe,eNB_offset, (eNB_offset>0) ? ue->measurements.adj_cell_id[eNB_offset-1] : ue->frame_parms.Nid_cell, @@ -448,7 +448,7 @@ void ue_rrc_measurements(PHY_VARS_UE *ue, // } -#endif + //#endif } } diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index a719ae614f1..3913c8a0bd7 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -42,6 +42,7 @@ #include "assertions.h" #include "T.h" +#include "UTIL/LOG/log.h" //#define DEBUG_DCI_ENCODING 1 //#define DEBUG_DCI_DECODING 1 @@ -452,10 +453,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t // printf("Mquad %d, RCC %d\n",Mquad,RCC); - if (!z) { - printf("dci.c: pdcch_deinterleaving: FATAL z is Null\n"); - return; - } + AssertFatal(z!=NULL,"dci.c: pdcch_deinterleaving: FATAL z is Null\n"); // undo permutation for (i=0; i<Mquad; i++) { @@ -1881,9 +1879,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *common_vars, #ifdef DEBUG_DCI_DECODING - printf("[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols); + LOG_I(PHY,"[PDCCH] subframe %d n_pdcch_symbols from PCFICH =%d\n",subframe,n_pdcch_symbols); - printf("demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config); + LOG_I(PHY,"demapping: subframe %d, mi %d, tdd_config %d\n",subframe,get_mi(frame_parms,subframe),frame_parms->tdd_config); #endif pdcch_demapping(pdcch_vars[eNB_id]->llr, @@ -2020,7 +2018,7 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, } - LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci); + // LOG_I(PHY," dci.c: get_num_pdcch_symbols subframe %d FATAL, illegal numCCE %d (num_dci %d)\n",subframe,numCCE,num_dci); //for (i=0;i<num_dci;i++) { // printf("dci_alloc[%d].L = %d\n",i,dci_alloc[i].L); //} @@ -2114,7 +2112,7 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, if (dci_alloc[i].L == (uint8_t)L) { #ifdef DEBUG_DCI_ENCODING - printf("Generating common DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_common_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,1<<dci_alloc[i].L, + LOG_I(PHY,"Generating common DCI %d/%d (nCCE %d) of length %d, aggregation %d (%x)\n",i,num_common_dci,dci_alloc[i].firstCCE,dci_alloc[i].dci_length,1<<dci_alloc[i].L, *(unsigned int*)dci_alloc[i].dci_pdu); dump_dci(frame_parms,&dci_alloc[i]); #endif @@ -2792,14 +2790,13 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, // CCE is not allocated yet if (CCEmap_cand == 0) { -#ifdef DEBUG_DCI_DECODING if (do_common == 1) - LOG_I(PHY,"[DCI search - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); + LOG_D(PHY,"[DCI search - common] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); else - LOG_I(PHY,"[DCI search - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); + LOG_D(PHY,"[DCI search - ue spec] Attempting candidate %d Aggregation Level %d DCI length %d at CCE %d/%d (CCEmap %x,CCEmap_cand %x)\n",m,L2,sizeof_bits,CCEind,nCCE,*CCEmap,CCEmap_mask); + -#endif dci_decoding(sizeof_bits, L, @@ -2810,9 +2807,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, printf("dci_decoded_output[%d] => %x\n",i,dci_decoded_output[i]); */ crc = (crc16(dci_decoded_output,sizeof_bits)>>16) ^ extract_crc(dci_decoded_output,sizeof_bits); -#ifdef DEBUG_DCI_DECODING - printf("crc =>%x\n",crc); -#endif + + //LOG_I(PHY,"crc =>%x\n",crc); + if (((L>1) && ((crc == si_rnti)|| (crc == p_rnti)|| @@ -2828,9 +2825,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[1]; dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[2]; dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[3]; -#ifdef DEBUG_DCI_DECODING - printf("DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]); -#endif + + //LOG_I(PHY,"DCI => %x,%x,%x,%x\n",dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3]); + } else { dci_alloc[*dci_cnt].dci_pdu[7] = dci_decoded_output[0]; dci_alloc[*dci_cnt].dci_pdu[6] = dci_decoded_output[1]; @@ -2840,11 +2837,9 @@ void dci_decoding_procedure0(LTE_UE_PDCCH **pdcch_vars, dci_alloc[*dci_cnt].dci_pdu[2] = dci_decoded_output[5]; dci_alloc[*dci_cnt].dci_pdu[1] = dci_decoded_output[6]; dci_alloc[*dci_cnt].dci_pdu[0] = dci_decoded_output[7]; -#ifdef DEBUG_DCI_DECODING - printf("DCI => %x,%x,%x,%x,%x,%x,%x,%x\n", - dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3], - dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]); -#endif + //LOG_I(PHY,"DCI => %x,%x,%x,%x,%x,%x,%x,%x\n", + // dci_decoded_output[0],dci_decoded_output[1],dci_decoded_output[2],dci_decoded_output[3], + // dci_decoded_output[4],dci_decoded_output[5],dci_decoded_output[6],dci_decoded_output[7]); } if (crc==si_rnti) { diff --git a/openair1/PHY/LTE_TRANSPORT/dci_tools.c b/openair1/PHY/LTE_TRANSPORT/dci_tools.c index beaebbca951..764aa2d7f10 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/dci_tools.c @@ -3039,14 +3039,14 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) break; case 50: - LOG_D(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]); - LOG_D(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type); - LOG_D(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]); - LOG_D(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs); - LOG_D(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid); - LOG_D(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi); - LOG_D(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv); - LOG_D(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC); + LOG_I(PHY,"DCI format1A(FDD, 10MHz), rnti %x (%x)\n",dci->rnti,((uint32_t*)&dci->dci_pdu[0])[0]); + LOG_I(PHY,"VRB_TYPE %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->vrb_type); + LOG_I(PHY,"RB_ALLOC %x (NB_RB %d)\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc,RIV2nb_rb_LUT50[((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rballoc]); + LOG_I(PHY,"MCS %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->mcs); + LOG_I(PHY,"HARQ_PID %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->harq_pid); + LOG_I(PHY,"NDI %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->ndi); + LOG_I(PHY,"RV %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->rv); + LOG_I(PHY,"TPC %d\n",((DCI1A_10MHz_FDD_t *)&dci->dci_pdu[0])->TPC); break; case 100: @@ -3800,7 +3800,6 @@ int dump_dci(LTE_DL_FRAME_PARMS *frame_parms, DCI_ALLOC_t *dci) return(0); } - int generate_ue_dlsch_params_from_dci(int frame, uint8_t subframe, void *dci_pdu, diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.c b/openair1/PHY/LTE_TRANSPORT/if4_tools.c index 8cdd32406f1..f24794fe2b1 100755 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.c +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.c @@ -39,7 +39,7 @@ #include "targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.h" #include "UTIL/LOG/vcd_signal_dumper.h" -void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k) { +void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type) { LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; int32_t **txdataF = ru->common.txdataF_BF; @@ -132,7 +132,8 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k) if (packet_type == IF4p5_PULFFT) { for (symbol_id=fp->symbols_per_tti-nsym; symbol_id<fp->symbols_per_tti; symbol_id++) { - LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id); + LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d: %d dB\n",frame,subframe,symbol_id, + dB_fixed(signal_energy((int32_t*)&rxdataF[0][blockoffsetF],db_halflength))); for (element_id=0; element_id<db_halflength; element_id++) { i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id]; data_block[element_id] = ((uint16_t) lin2alaw[*i]) | ((uint16_t)(lin2alaw[*(i+1)]<<8)); @@ -172,7 +173,7 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k) } else if (packet_type == IF4p5_PRACH) { // FIX: hard coded prach samples length LOG_D(PHY,"IF4p5_PRACH: frame %d, subframe %d\n",frame,subframe); - db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES; + db_fulllength = PRACH_NUM_SAMPLES; if (eth->flags == ETH_RAW_IF4p5_MODE) { packet_header = (IF4p5_header_t *)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES); @@ -185,11 +186,11 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k) if (eth->flags == ETH_RAW_IF4p5_MODE) { memcpy((int16_t*)(tx_buffer_prach + MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t), - (&prach_rxsigF[0][k]), + (&prach_rxsigF[0][0]), PRACH_BLOCK_SIZE_BYTES); } else { memcpy((int16_t*)(tx_buffer_prach + sizeof_IF4p5_header_t), - (&prach_rxsigF[0][k]), + (&prach_rxsigF[0][0]), PRACH_BLOCK_SIZE_BYTES); } @@ -209,6 +210,7 @@ void send_IF4p5(RU_t *ru, int frame, int subframe, uint16_t packet_type, int k) return; } +extern void wakeup_prach(PHY_VARS_eNB *eNB,RU_t *ru); void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint32_t *symbol_number) { LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; @@ -221,6 +223,7 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint uint16_t db_fulllength, db_halflength; int slotoffsetF=0, blockoffsetF=0; eth_state_t *eth = (eth_state_t*) (ru->ifdevice.priv); + int idx; if (ru->idx==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); @@ -297,10 +300,9 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint } } else if (*packet_type == IF4p5_PRACH) { - LOG_D(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d\n",ru->idx,*frame,*subframe); // FIX: hard coded prach samples length - db_fulllength = PRACH_HARD_CODED_NUM_SAMPLES; + db_fulllength = PRACH_NUM_SAMPLES; if (eth->flags == ETH_RAW_IF4p5_MODE) { memcpy((&prach_rxsigF[0][0]), @@ -311,6 +313,11 @@ void recv_IF4p5(RU_t *ru, int *frame, int *subframe, uint16_t *packet_type, uint (int16_t*) (rx_buffer+sizeof_IF4p5_header_t), PRACH_BLOCK_SIZE_BYTES); } + + LOG_I(PHY,"PRACH_IF4p5: CC_id %d : frame %d, subframe %d => %d dB\n",ru->idx,*frame,*subframe, + dB_fixed(signal_energy(&prach_rxsigF[0][0],839))); + for (idx=0;idx<ru->num_eNB;idx++) ru->wakeup_prach_eNB(ru->eNB_list[idx],ru); + } else if (*packet_type == IF4p5_PULTICK) { } else { diff --git a/openair1/PHY/LTE_TRANSPORT/if4_tools.h b/openair1/PHY/LTE_TRANSPORT/if4_tools.h index eebbb41557e..7a084a4b510 100644 --- a/openair1/PHY/LTE_TRANSPORT/if4_tools.h +++ b/openair1/PHY/LTE_TRANSPORT/if4_tools.h @@ -62,7 +62,7 @@ void gen_IF4p5_ul_header(IF4p5_header_t*, uint16_t, int, int); void gen_IF4p5_prach_header(IF4p5_header_t*, int, int); -void send_IF4p5(RU_t*, int, int, uint16_t, int); +void send_IF4p5(RU_t*, int, int, uint16_t); void recv_IF4p5(RU_t*, int*, int*, uint16_t*, uint32_t*); diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index ab9b55975d9..ca687cefffb 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -31,9 +31,6 @@ */ #include "PHY/defs.h" -//uint16_t pcfich_reg[4]; -//uint8_t pcfich_first_reg_idx = 0; - //#define DEBUG_PCFICH void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) @@ -69,9 +66,9 @@ void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) first_reg = pcfich_reg[3]; } - //#ifdef DEBUG_PCFICH +#ifdef DEBUG_PCFICH printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]); - //#endif +#endif } void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms, @@ -95,7 +92,6 @@ void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms, } bt[i] = (b[i]&1) ^ ((s>>(i&0x1f))&1); - // printf("scrambling %d : b %d => bt %d, c %d\n",i,b[i],bt[i],((s>>(i&0x1f))&1)); } } @@ -122,7 +118,6 @@ void pcfich_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, if (((s>>(i&0x1f))&1) == 1) d[i]=-d[i]; - // printf("scrambling %d : b %d => bt %d, c %d\n",i,b[i],bt[i],((s>>(i&0x1f))&1)); } } @@ -148,7 +143,7 @@ void generate_pcfich(uint8_t num_pdcch_symbols, int nushiftmod3 = frame_parms->nushift%3; #ifdef DEBUG_PCFICH - msg("[PHY] Generating PCFICH for %d PDCCH symbols, AMP %d\n",num_pdcch_symbols,amp); + printf("[PHY] Generating PCFICH for %d PDCCH symbols, AMP %d\n",num_pdcch_symbols,amp); #endif // scrambling @@ -247,12 +242,12 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms, pcfich_d_ptr[0] = ((int16_t*)&rxdataF_comp[0][reg_offset+i])[0]; // RE component pcfich_d_ptr[1] = ((int16_t*)&rxdataF_comp[0][reg_offset+i])[1]; // IM component - /* - printf("rx_pcfich: quad %d, i %d, offset %d => m%d (%d,%d) => pcfich_d_ptr[0] %d \n",pcfich_quad,i,reg_offset+i,m, +#ifdef DEBUG_PCFICH + printf("rx_pcfich: quad %d, i %d, offset %d => (%d,%d) => pcfich_d_ptr[0] %d \n",pcfich_quad,i,reg_offset+i, ((int16_t*)&rxdataF_comp[0][reg_offset+i])[0], ((int16_t*)&rxdataF_comp[0][reg_offset+i])[1], pcfich_d_ptr[0]); - */ +#endif pcfich_d_ptr+=2; } @@ -295,12 +290,12 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms, metric = 0; for (j=0; j<32; j++) { - //printf("pcfich_b[%d][%d] %d => pcfich_d[%d] %d\n",i,j,pcfich_b[i][j],j,pcfich_d[j]); + // printf("pcfich_b[%d][%d] %d => pcfich_d[%d] %d\n",i,j,pcfich_b[i][j],j,pcfich_d[j]); metric += (int32_t)(((pcfich_b[i][j]==0) ? (pcfich_d[j]) : (-pcfich_d[j]))); } #ifdef DEBUG_PCFICH - msg("metric %d : %d\n",i,metric); + printf("metric %d : %d\n",i,metric); #endif if (metric > old_metric) { @@ -310,7 +305,7 @@ uint8_t rx_pcfich(LTE_DL_FRAME_PARMS *frame_parms, } #ifdef DEBUG_PCFICH - msg("[PHY] PCFICH detected for %d PDCCH symbols\n",num_pdcch_symbols); + printf("[PHY] PCFICH detected for %d PDCCH symbols\n",num_pdcch_symbols); #endif return(num_pdcch_symbols); } diff --git a/openair1/PHY/LTE_TRANSPORT/prach.c b/openair1/PHY/LTE_TRANSPORT/prach.c index 3c343eaf4ec..def05cdd2e1 100644 --- a/openair1/PHY/LTE_TRANSPORT/prach.c +++ b/openair1/PHY/LTE_TRANSPORT/prach.c @@ -1077,7 +1077,7 @@ int32_t generate_prach( PHY_VARS_UE *ue, uint8_t eNB_id, uint8_t subframe, uint1 } -#ifdef PRACH_DEBUG +#if 0 write_output("prach_txF0.m","prachtxF0",prachF,prach_len-Ncp,1,1); write_output("prach_tx0.m","prachtx0",prach+(Ncp<<1),prach_len-Ncp,1,1); write_output("txsig.m","txs",(int16_t*)(&ue->common_vars.txdata[0][0]),2*ue->frame_parms.samples_per_tti,1,1); @@ -1109,9 +1109,16 @@ void rx_prach(PHY_VARS_eNB *eNB, int16_t *prachF=NULL; int16_t **rxsigF=NULL; int16_t **prach_ifft=NULL; + int nb_rx; - if (ru) fp = &ru->frame_parms; - else if (eNB) fp = &eNB->frame_parms; + if (ru) { + fp = &ru->frame_parms; + nb_rx = ru->nb_rx; + } + else if (eNB) { + fp = &eNB->frame_parms; + nb_rx = fp->nb_antennas_rx; + } else AssertFatal(1==0,"rx_prach called without valid RU or eNB descriptor\n"); frame_type = fp->frame_type; @@ -1119,7 +1126,7 @@ void rx_prach(PHY_VARS_eNB *eNB, prach_ConfigIndex = fp->prach_config_common.prach_ConfigInfo.prach_ConfigIndex; Ncs_config = fp->prach_config_common.prach_ConfigInfo.zeroCorrelationZoneConfig; restricted_set = fp->prach_config_common.prach_ConfigInfo.highSpeedFlag; - int16_t *prach[fp->nb_antennas_rx]; + int16_t *prach[nb_rx]; if (eNB) { subframe = eNB->proc.subframe_prach; @@ -1130,6 +1137,8 @@ void rx_prach(PHY_VARS_eNB *eNB, else { subframe = ru->proc.subframe_prach; rxsigF = ru->prach_rxsigF; + LOG_D(PHY,"PRACH (RU) : running rx_prach for subframe %d, prach_FreqOffset %d, prach_ConfigIndex %d\n", + subframe,fp->prach_config_common.prach_ConfigInfo.prach_FreqOffset,prach_ConfigIndex); } int16_t *prach2; @@ -1157,14 +1166,19 @@ void rx_prach(PHY_VARS_eNB *eNB, int32_t lev; int16_t levdB; int fft_size,log2_ifft_size; - uint8_t nb_ant_rx = 1; //eNB->frame_parms.nb_antennas_rx; #ifdef PRACH_DEBUG - int en; + int en,en0=0; #endif - for (aa=0; aa<nb_ant_rx; aa++) { - if (ru) prach[aa] = (int16_t*)&ru->common.rxdata[aa][subframe*fp->samples_per_tti-ru->N_TA_offset]; + for (aa=0; aa<nb_rx; aa++) { + if ((eNB==NULL) && + (ru!=NULL)) { + prach[aa] = (int16_t*)&ru->common.rxdata[aa][(subframe*fp->samples_per_tti)-ru->N_TA_offset]; +#ifdef PRACH_DEBUG + LOG_D(PHY,"RU %d, subframe %d, : prach %p (energy %d)\n",ru->idx,subframe,prach[aa],dB_fixed(en0=signal_energy(prach[aa],fp->samples_per_tti))); +#endif + } } // First compute physical root sequence @@ -1250,10 +1264,11 @@ void rx_prach(PHY_VARS_eNB *eNB, } - if (((eNB!=NULL) && (ru!=NULL) && (ru->function != NGFI_RRU_IF4p5))|| + if (((eNB!=NULL) && (ru!=NULL) && (ru->function != NGFI_RAU_IF4p5))|| ((eNB==NULL) && (ru!=NULL) && (ru->function == NGFI_RRU_IF4p5))) { // compute the DFTs of the PRACH temporal resources // Do forward transform - for (aa=0; aa<nb_ant_rx; aa++) { + LOG_D(PHY,"rx_prach: Doing FFT for N_RB_UL %d\n",fp->N_RB_UL); + for (aa=0; aa<nb_rx; aa++) { prach2 = prach[aa] + (Ncp<<1); // do DFT @@ -1345,49 +1360,53 @@ void rx_prach(PHY_VARS_eNB *eNB, break; } + + k = (12*n_ra_prb) - 6*fp->N_RB_UL; + + if (k<0) { + k+=(fp->ofdm_symbol_size); + } + + k*=12; + k+=13; + k*=2; + int dftsize_x2 = fp->ofdm_symbol_size*24; + LOG_D(PHY,"Shifting prach_rxF from %d to 0\n",k); + + if ((k+(839*2)) > dftsize_x2) { // PRACH signal is split around DC + memmove((void*)&rxsigF[aa][dftsize_x2-k],(void*)&rxsigF[aa][0],(k+(839*2)-dftsize_x2)*2); + memmove((void*)&rxsigF[aa][0],(void*)(&rxsigF[aa][k]),(dftsize_x2-k)*2); + } + else // PRACH signal is not split around DC + memmove((void*)&rxsigF[aa][0],(void*)(&rxsigF[aa][k]),839*4); + } + } if ((eNB==NULL) && (ru!=NULL) && ru->function == NGFI_RRU_IF4p5) { - k = (12*n_ra_prb) - 6*fp->N_RB_UL; - - if (k<0) { - k+=(fp->ofdm_symbol_size); - } - k*=12; - k+=13; - k*=2; - /// **** send_IF4 of rxsigF to RAU **** /// - send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH, k); - + send_IF4p5(ru, ru->proc.frame_prach, ru->proc.subframe_prach, IF4p5_PRACH); + #if 0 - en = dB_fixed(signal_energy(&rxsigF[0][k],840)); - if (en>60) - printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en); + if (dB_fixed(en0)>30) { + en = dB_fixed(signal_energy(&rxsigF[0][k],840)); + // if (en>60) + printf("PRACH (if4p5), k %d, n_ra_prb %d: Frame %d, Subframe %d => %d dB\n",k,n_ra_prb,ru->proc.frame_rx,ru->proc.subframe_rx,en); + write_output("rxsigF.m","prach_rxF",rxsigF[0],12288,1,1); + exit(-1); + } #endif return; } else if (eNB!=NULL) { - k = (12*n_ra_prb) - 6*fp->N_RB_UL; - - if (k<0) k+=fp->ofdm_symbol_size; - - k*=12; - k+=13; - k*=2; - - // Adjust received rxsigF offset - memmove((&rxsigF[0][k]), - (&rxsigF[0][0]), - 839*2*sizeof(int16_t)); #if 0 - en = dB_fixed(signal_energy(&rxsigF[0][k],840)); - /*if (en>60) - printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);*/ + en = dB_fixed(signal_energy(&rxsigF[0][0],840)); + /*if (en>60)*/ + printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en); #endif } @@ -1493,18 +1512,6 @@ void rx_prach(PHY_VARS_eNB *eNB, - - k = (12*n_ra_prb) - 6*fp->N_RB_UL; - - if (k<0) - k+=fp->ofdm_symbol_size; - - k*=12; - k+=13; // phi + K/2 - k*=2; - - - memset( prachF, 0, sizeof(int16_t)*2*1024 ); #ifdef PRACH_DEBUG if (prach[0]!= NULL) write_output("prach_rx0.m","prach_rx0",prach[0],6144+792,1,1); @@ -1513,30 +1520,14 @@ void rx_prach(PHY_VARS_eNB *eNB, // write_output("prach_rxF0.m","prach_rxF0",rxsigF[0],24576,1,1); // write_output("prach_rxF1.m","prach_rxF1",rxsigF[1],6144,1,1); - for (aa=0;aa<nb_ant_rx; aa++) { + for (aa=0;aa<nb_rx; aa++) { // Do componentwise product with Xu* - + + k=0; for (offset=0; offset<(N_ZC<<1); offset+=2) { prachF[offset] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k] + (int32_t)Xu[offset+1]*rxsigF[aa][k+1])>>15); prachF[offset+1] = (int16_t)(((int32_t)Xu[offset]*rxsigF[aa][k+1] - (int32_t)Xu[offset+1]*rxsigF[aa][k])>>15); - /* - if (offset<16) - printf("Xu[%d] %d %d, rxsigF[%d][%d] %d %d\n",offset,Xu[offset],Xu[offset+1],aa,k,rxsigF[aa][k],rxsigF[aa][k+1]); - */ - /* - mmtmpX0 = _mm_madd_epi16(*(__m128i*)&Xu[offset],*(__m128i*)&rxsigF[aa][k<<1]); - mmtmpX1 = _mm_shufflelo_epi16(*(__m128i*)&Xu[offset],_MM_SHUFFLE(2,3,0,1)); - mmtmpX1 = _mm_shufflehi_epi16(mmtmpX1,_MM_SHUFFLE(2,3,0,1)); - mmtmpX1 = _mm_sign_epi16(mmtmpX1,*(__m128i*)&conjugate[0]); - mmtmpX1 = _mm_madd_epi16(mmtmpX1,*(__m128i*)&rxsigF[aa][k<<1]); - mmtmpX0 = _mm_srai_epi32(mmtmpX0,15); - mmtmpX1 = _mm_srai_epi32(mmtmpX1,15); - mmtmpX2 = _mm_unpacklo_epi32(mmtmpX0,mmtmpX1); - mmtmpX3 = _mm_unpackhi_epi32(mmtmpX0,mmtmpX1); - *(__m128i*)&prachF[offset] = _mm_packs_epi32(mmtmpX2,mmtmpX3); - */ k+=2; - if (k==(12*2*fp->ofdm_symbol_size)) k=0; } @@ -1566,8 +1557,9 @@ void rx_prach(PHY_VARS_eNB *eNB, k+=13; k*=2; printf("Dumping prach, k = %d (n_ra_prb %d)\n",k,n_ra_prb); - write_output("rxsigF.m","prach_rxF",&rxsigF[0][k],840,1,1); + write_output("rxsigF.m","prach_rxF",&rxsigF[0][0],12288,1,1); write_output("prach_rxF_comp0.m","prach_rxF_comp0",prachF,1024,1,1); + write_output("Xu.m","xu",Xu,N_ZC,1,1); write_output("prach_ifft0.m","prach_t0",prach_ifft[0],1024,1,1); exit(-1); } @@ -1581,7 +1573,7 @@ void rx_prach(PHY_VARS_eNB *eNB, for (i=0; i<NCS2; i++) { lev = 0; - for (aa=0; aa<nb_ant_rx; aa++) { + for (aa=0; aa<nb_rx; aa++) { lev += (int32_t)prach_ifft[aa][(preamble_shift2+i)<<1]*prach_ifft[aa][(preamble_shift2+i)<<1] + (int32_t)prach_ifft[aa][1+((preamble_shift2+i)<<1)]*prach_ifft[aa][1+((preamble_shift2+i)<<1)]; } diff --git a/openair1/PHY/LTE_TRANSPORT/print_stats.c b/openair1/PHY/LTE_TRANSPORT/print_stats.c index 913288e096c..43803857a23 100644 --- a/openair1/PHY/LTE_TRANSPORT/print_stats.c +++ b/openair1/PHY/LTE_TRANSPORT/print_stats.c @@ -550,7 +550,7 @@ int dump_ue_stats(PHY_VARS_UE *ue, UE_rxtx_proc_t *proc,char* buffer, int length return len; } // is_clusterhead - +/* int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) { @@ -593,14 +593,12 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) } len += sprintf(&buffer[len],"\n"); len += sprintf(&buffer[len],"\nPERFORMANCE PARAMETERS\n"); - /* - len += sprintf(&buffer[len],"[eNB PROC] Total DLSCH Bitrate for the System %dkbps\n",((eNB->UE_stats[0].dlsch_bitrate + eNB->UE_stats[1].dlsch_bitrate)/1000)); - len += sprintf(&buffer[len],"[eNB PROC] Total Bits successfully transitted %dKbits in %dframe(s)\n",((eNB->UE_stats[0].total_transmitted_bits + eNB->UE_stats[1].total_transmitted_bits)/1000),eNB->frame+1); - len += sprintf(&buffer[len],"[eNB PROC] Average System Throughput %dKbps\n",(eNB->UE_stats[0].total_transmitted_bits + eNB->UE_stats[1].total_transmitted_bits)/((eNB->frame+1)*10)); - */ for (UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { - if ((eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& + if (eNB && + (eNB->dlsch!=NULL) && + (eNB->dlsch[(uint8_t)UE_id]!=NULL) && + (eNB->dlsch[(uint8_t)UE_id][0]->rnti>0)&& (eNB->UE_stats[UE_id].mode == PUSCH)) { eNB->total_dlsch_bitrate = eNB->UE_stats[UE_id].dlsch_bitrate + eNB->total_dlsch_bitrate; @@ -643,15 +641,6 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) eNB->measurements.wideband_cqi_dB[UE_id][0], eNB->measurements.wideband_cqi_dB[UE_id][1]); - /* len += sprintf(&buffer[len],"[eNB PROC] Subband CQI: "); - - for (i=0; i<eNB->frame_parms.N_RB_DL; i++) - len += sprintf(&buffer[len],"%2d ", - eNB->measurements[eNB_id].subband_cqi_tot_dB[UE_id][i]); - - len += sprintf(&buffer[len],"\n"); - */ - len += sprintf(&buffer[len],"DL TM %d, DL_cqi %d, DL_pmi_single %jx ", eNB->transmission_mode[UE_id], eNB->UE_stats[UE_id].DL_cqi[0], @@ -802,27 +791,6 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) len += sprintf(&buffer[len],"DLSCH total bits ack'ed: %dkbit ",(eNB->UE_stats[UE_id].total_TBS)/1000); len += sprintf(&buffer[len],"DLSCH Average throughput (100 frames): %dkbps\n",(eNB->UE_stats[UE_id].dlsch_bitrate/1000)); // len += sprintf(&buffer[len],"[eNB PROC] Transmission Mode %d\n",eNB->transmission_mode[UE_id]); - /* - if(eNB->transmission_mode[UE_id] == 5) { - if(eNB->mu_mimo_mode[UE_id].dl_pow_off == 0) - len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in MU-MIMO mode****\n",UE_id); - else if(eNB->mu_mimo_mode[UE_id].dl_pow_off == 1) - len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is in SU-MIMO mode****\n",UE_id); - else - len += sprintf(&buffer[len],"[eNB PROC] ****UE %d is not scheduled****\n",UE_id); - } - */ - /* - len += sprintf(&buffer[len],"[eNB PROC] RB Allocation on Sub-bands: "); - - // for (j=0;j< mac_xface->frame_parms->N_RBGS;j++) - for (j=0; j<7; j++) - len += sprintf(&buffer[len],"%d ", - eNB->mu_mimo_mode[UE_id].rballoc_sub[j]); - - len += sprintf(&buffer[len],"\n"); - len += sprintf(&buffer[len],"[eNB PROC] Total Number of Allocated PRBs = %d\n",eNB->mu_mimo_mode[UE_id].pre_nb_available_rbs); - */ } } @@ -833,3 +801,4 @@ int dump_eNB_stats(PHY_VARS_eNB *eNB, char* buffer, int length) return len; } +*/ diff --git a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c index 425bd383913..0ef041a50eb 100644 --- a/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c +++ b/openair1/PHY/LTE_TRANSPORT/ulsch_demodulation.c @@ -1810,11 +1810,11 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB, //#ifndef OAI_EMU write_output("/tmp/ulsch_d.m","ulsch_dseq",&eNB->ulsch[UE_id]->harq_processes[harq_pid]->d[0][96], eNB->ulsch[UE_id]->harq_processes[harq_pid]->Kplus*3,1,0); - write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1); + if (eNB->common_vars.rxdata) write_output("/tmp/rxsig0.m","rxs0", &eNB->common_vars.rxdata[0][0],eNB->frame_parms.samples_per_tti*10,1,1); if (eNB->frame_parms.nb_antennas_rx>1) - write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1); + if (eNB->common_vars.rxdata) write_output("/tmp/rxsig1.m","rxs1", &eNB->common_vars.rxdata[1][0],eNB->frame_parms.samples_per_tti*10,1,1); write_output("/tmp/rxsigF0.m","rxsF0", &eNB->common_vars.rxdataF[0][0],eNB->frame_parms.ofdm_symbol_size*nsymb,1,1); @@ -1827,11 +1827,12 @@ void rx_ulsch_emul(PHY_VARS_eNB *eNB, if (eNB->frame_parms.nb_antennas_rx>1) write_output("/tmp/rxsigF1_ext.m","rxsF1_ext", &eNB->pusch_vars[UE_id]->rxdataF_ext[0][0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); - - write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1); + /* + if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est0.m","srsest0",eNB->srs_vars[UE_id].srs_ch_estimates[0],eNB->frame_parms.ofdm_symbol_size,1,1); if (eNB->frame_parms.nb_antennas_rx>1) - write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1); + if (eNB->srs_vars[UE_id].srs_ch_estimates) write_output("/tmp/srs_est1.m","srsest1",eNB->srs_vars[UE_id].srs_ch_estimates[1],eNB->frame_parms.ofdm_symbol_size,1,1); + */ write_output("/tmp/drs_est0.m","drsest0",eNB->pusch_vars[UE_id]->drs_ch_estimates[0],eNB->frame_parms.N_RB_UL*12*nsymb,1,1); diff --git a/openair1/PHY/MODULATION/defs.h b/openair1/PHY/MODULATION/defs.h index 1ed81e79936..a4625c25704 100644 --- a/openair1/PHY/MODULATION/defs.h +++ b/openair1/PHY/MODULATION/defs.h @@ -71,8 +71,7 @@ int slot_fep_mbsfn(PHY_VARS_UE *phy_vars_ue, int sample_offset, int no_prefix); -int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, - RU_COMMON *common, +int slot_fep_ul(RU_t *ru, unsigned char l, unsigned char Ns, int no_prefix); diff --git a/openair1/PHY/MODULATION/slot_fep_ul.c b/openair1/PHY/MODULATION/slot_fep_ul.c index e3da81788e6..cf586dec1a9 100644 --- a/openair1/PHY/MODULATION/slot_fep_ul.c +++ b/openair1/PHY/MODULATION/slot_fep_ul.c @@ -24,8 +24,7 @@ #include "defs.h" //#define DEBUG_FEP -int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, - RU_COMMON *common, +int slot_fep_ul(RU_t *ru, unsigned char l, unsigned char Ns, int no_prefix) @@ -34,19 +33,23 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, char fname[40], vname[40]; #endif unsigned char aa; - unsigned char symbol = l+((7-frame_parms->Ncp)*(Ns&1)); ///symbol within sub-frame - unsigned int nb_prefix_samples = (no_prefix ? 0 : frame_parms->nb_prefix_samples); - unsigned int nb_prefix_samples0 = (no_prefix ? 0 : frame_parms->nb_prefix_samples0); + RU_COMMON *common=&ru->common; + LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; + RU_proc_t *proc = &ru->proc; + unsigned char symbol = l+((7-fp->Ncp)*(Ns&1)); ///symbol within sub-frame + unsigned int nb_prefix_samples = (no_prefix ? 0 : fp->nb_prefix_samples); + unsigned int nb_prefix_samples0 = (no_prefix ? 0 : fp->nb_prefix_samples0); // unsigned int subframe_offset; unsigned int slot_offset; + void (*dft)(int16_t *,int16_t *, int); int tmp_dft_in[2048] __attribute__ ((aligned (32))); // This is for misalignment issues for 6 and 15 PRBs - unsigned int frame_length_samples = frame_parms->samples_per_tti * 10; + unsigned int frame_length_samples = fp->samples_per_tti * 10; unsigned int rx_offset; - switch (frame_parms->ofdm_symbol_size) { + switch (fp->ofdm_symbol_size) { case 128: dft = dft128; break; @@ -78,14 +81,14 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, if (no_prefix) { // subframe_offset = frame_parms->ofdm_symbol_size * frame_parms->symbols_per_tti * (Ns>>1); - slot_offset = frame_parms->ofdm_symbol_size * (frame_parms->symbols_per_tti>>1) * (Ns&1); + slot_offset = fp->ofdm_symbol_size * (fp->symbols_per_tti>>1) * (Ns&1); } else { // subframe_offset = frame_parms->samples_per_tti * (Ns>>1); - slot_offset = (frame_parms->samples_per_tti>>1) * (Ns&1); + slot_offset = (fp->samples_per_tti>>1) * (Ns&1); } - if (l<0 || l>=7-frame_parms->Ncp) { - LOG_E(PHY,"slot_fep: l must be between 0 and %d\n",7-frame_parms->Ncp); + if (l<0 || l>=7-fp->Ncp) { + LOG_E(PHY,"slot_fep: l must be between 0 and %d\n",7-fp->Ncp); return(-1); } @@ -98,39 +101,33 @@ int slot_fep_ul(LTE_DL_FRAME_PARMS *frame_parms, LOG_D(PHY,"slot_fep: Ns %d offset %d, symbol %d, nb_prefix_samples %d\n",Ns,slot_offset,symbol, nb_prefix_samples); #endif - for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { + for (aa=0; aa<ru->nb_rx; aa++) { rx_offset = slot_offset +nb_prefix_samples0; if (l==0) { - +#ifdef DEBUG_FEP + LOG_D(PHY,"slot_fep: symbol 0 %d dB\n", + dB_fixed(signal_energy(&common->rxdata_7_5kHz[aa][rx_offset],fp->ofdm_symbol_size))); +#endif dft( (int16_t *)&common->rxdata_7_5kHz[aa][rx_offset], - (int16_t *)&common->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + (int16_t *)&common->rxdataF[aa][fp->ofdm_symbol_size*symbol], 1 ); } else { - rx_offset += (frame_parms->ofdm_symbol_size+nb_prefix_samples)*l; - /* should never happen for eNB - if(rx_offset > (frame_length_samples - frame_parms->ofdm_symbol_size)) - { - memcpy((void *)&eNB_common_vars->rxdata_7_5kHz[aa][frame_length_samples], - (void *)&eNB_common_vars->rxdata_7_5kHz[aa][0], - frame_parms->ofdm_symbol_size*sizeof(int)); - } - */ - + rx_offset += (fp->ofdm_symbol_size+nb_prefix_samples)*l; // check for 256-bit alignment of input buffer and do DFT directly, else do via intermediate buffer if( (rx_offset & 15) != 0){ memcpy((void *)&tmp_dft_in, (void *)&common->rxdata_7_5kHz[aa][(rx_offset % frame_length_samples)], - frame_parms->ofdm_symbol_size*sizeof(int)); + fp->ofdm_symbol_size*sizeof(int)); dft( (short *) tmp_dft_in, - (short*) &common->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + (short*) &common->rxdataF[aa][fp->ofdm_symbol_size*symbol], 1 ); } else{ dft( (short *)&common->rxdata_7_5kHz[aa][rx_offset], - (short*)&common->rxdataF[aa][frame_parms->ofdm_symbol_size*symbol], + (short*)&common->rxdataF[aa][fp->ofdm_symbol_size*symbol], 1 ); } diff --git a/openair1/PHY/MODULATION/ul_7_5_kHz.c b/openair1/PHY/MODULATION/ul_7_5_kHz.c index bcb18eb3662..14abd2380d2 100644 --- a/openair1/PHY/MODULATION/ul_7_5_kHz.c +++ b/openair1/PHY/MODULATION/ul_7_5_kHz.c @@ -197,7 +197,7 @@ void remove_7_5_kHz(RU_t *ru,uint8_t slot) len = frame_parms->samples_per_tti/2; - for (aa=0; aa<frame_parms->nb_antennas_rx; aa++) { + for (aa=0; aa<ru->nb_rx; aa++) { #if defined(__x86_64__) || defined(__i386__) rxptr128 = (__m128i *)&rxdata[aa][slot_offset]; diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 0fc0106201d..2677bbe023d 100644 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -288,6 +288,8 @@ typedef struct RU_proc_t_s { int frame_rx; /// frame to act upon for transmission int frame_tx; + /// unwrapped frame count + int frame_tx_unwrap; /// frame to act upon for reception of prach int frame_prach; /// frame offset for slave RUs (to correct for frame asynchronism at startup) @@ -452,6 +454,14 @@ typedef struct eNB_proc_t_s { pthread_mutex_t mutex_prach; /// mutex for asynch RX/TX thread pthread_mutex_t mutex_asynch_rxtx; + /// mutex for RU access to eNB processing (PDSCH/PUSCH) + pthread_mutex_t mutex_RU; + /// mutex for RU access to eNB processing (PRACH) + pthread_mutex_t mutex_RU_PRACH; + /// mask for RUs serving eNB (PDSCH/PUSCH) + int RU_mask; + /// mask for RUs serving eNB (PRACH) + int RU_mask_prach; /// parameters for turbo-decoding worker thread td_params tdp; /// parameters for turbo-encoding worker thread @@ -612,6 +622,8 @@ typedef struct RU_t_s{ void (*feptx_prec)(struct RU_t_s *ru); /// function pointer to wakeup routine in lte-enb. int (*wakeup_rxtx)(struct PHY_VARS_eNB_s *eNB,int frame_rx,int subframe_rx); + /// function pointer to wakeup routine in lte-enb. + int (*wakeup_prach_eNB)(struct PHY_VARS_eNB_s *eNB,struct RU_t_s *ru); /// function pointer to eNB entry routine void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string); /// Timing statistics diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index 78953d4fbca..02343d17478 100644 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -495,6 +495,8 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) { int subframe = proc->subframe_tx; int frame = proc->frame_tx; + LOG_D(PHY,"common_signal_procedures: frame %d, subframe %d\n",frame,subframe); + // generate Cell-Specific Reference Signals for both slots if (eNB->abstraction_flag==0) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1); @@ -695,12 +697,12 @@ void generate_eNB_dlsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC P_RNTI, eNB->UE_stats[0].DL_pmi_single, 0); - + LOG_I(PHY,"frame %d, subframe %d : SI with mcs %d\n",frame,subframe,eNB->dlsch_SI->harq_processes[0]->mcs); eNB->dlsch_SI->nCCE[subframe] = dci_alloc->firstCCE; - - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8"\n",eNB->Mod_id,frame,subframe, - eNB->dlsch_SI->nCCE[subframe]); + + LOG_I(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resource for common DCI (SI) => %"PRIu8", aggregation %d\n",eNB->Mod_id,frame,subframe, + eNB->dlsch_SI->nCCE[subframe],1<<dci_alloc->L); #if defined(SMBV) @@ -824,7 +826,7 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC int frame = proc->frame_tx; int subframe = proc->subframe_tx; - LOG_D(PHY, + LOG_I(PHY, "[eNB %"PRIu8"][PUSCH %"PRIu8"] Frame %d subframe %d UL Frame %"PRIu32", UL Subframe %"PRIu8", Generated ULSCH (format0) DCI (rnti %"PRIx16", dci %"PRIx8"), aggregation %d\n", eNB->Mod_id, subframe2harq_pid(fp, @@ -849,7 +851,6 @@ void generate_eNB_ulsch_params(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,DCI_ALLOC P_RNTI, CBA_RNTI, 0); // do_srs - LOG_T(PHY,"[eNB %"PRIu8"] Frame %d subframe %d : CCE resources for UE spec DCI (PUSCH %"PRIx16") => %d\n", eNB->Mod_id,frame,subframe,dci_alloc->rnti, dci_alloc->firstCCE); @@ -1391,7 +1392,10 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB, fp, eNB->common_vars.txdataF, subframe); - + if (DCI_pdu->Num_ue_spec_dci+DCI_pdu->Num_common_dci > 0) { + LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: num_pdcch_symbols %d\n",eNB->Mod_id,frame, subframe, + num_pdcch_symbols); + } } #ifdef PHY_ABSTRACTION // FIXME this ifdef seems suspicious @@ -1965,7 +1969,7 @@ void prach_procedures(PHY_VARS_eNB *eNB) { } if (eNB->abstraction_flag == 0) { rx_prach(eNB, - NULL, + eNB->RU_list[0], preamble_energy_list, preamble_delay_list, frame, @@ -1999,12 +2003,13 @@ void prach_procedures(PHY_VARS_eNB *eNB) { } } -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[RAPROC] Most likely preamble %d, energy %d dB delay %d\n", - preamble_max, + //#ifdef DEBUG_PHY_PROC + LOG_D(PHY,"[RAPROC] Frame %d, subframe %d : Most likely preamble %d, energy %d dB delay %d\n", + frame,subframe, + preamble_max, preamble_energy_list[preamble_max], preamble_delay_list[preamble_max]); -#endif + //#endif if (preamble_energy_list[preamble_max] > 580) { @@ -2867,14 +2872,14 @@ void phy_procedures_eNB_uespec_RX(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc,const if (eNB->ulsch[i]->Msg3_flag == 1) { - LOG_D(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", + LOG_I(PHY,"[eNB %d/%d][RAPROC] frame %d, subframe %d, UE %d: Error receiving ULSCH (Msg3), round %d/%d\n", eNB->Mod_id, eNB->CC_id, frame,subframe, i, eNB->ulsch[i]->harq_processes[harq_pid]->round-1, fp->maxHARQ_Msg3Tx-1); - /*dump_ulsch(eNB,proc,i); - exit(-1);*/ + dump_ulsch(eNB,proc,i); + exit(-1); LOG_D(PHY,"[eNB %d][PUSCH %d] frame %d subframe %d RNTI %x RX power (%d,%d) RSSI (%d,%d) N0 (%d,%d) dB ACK (%d,%d), decoding iter %d\n", eNB->Mod_id,harq_pid, diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 0ef60b499fd..dcbd3fb3694 100644 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -2562,7 +2562,7 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin proc->frame_tx = proc->frame_rx; ue->proc.proc_rxtx[1].frame_rx = proc->frame_rx; ue->proc.proc_rxtx[1].frame_tx = proc->frame_tx; - LOG_I(PHY,"[UE %d] frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d\n", + LOG_I(PHY,"[UE %d] TXPATH frame %d, subframe %d: Adjusting frame counter (PBCH ant_tx=%d, frame_tx=%d, phase %d, rx_offset %d) => new frame %d\n", ue->Mod_id, frame_rx, subframe_rx, @@ -2575,7 +2575,7 @@ void ue_pbch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc, uin } else if (((frame_tx & 0x03FF) != (proc->frame_rx & 0x03FF))) { //(pbch_tx_ant != ue->frame_parms.nb_antennas_tx)) { - LOG_D(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n", + LOG_I(PHY,"[UE %d] frame %d, subframe %d: Re-adjusting frame counter (PBCH ant_tx=%d, frame_rx=%d, frame%%1024=%d, phase %d).\n", ue->Mod_id, proc->frame_rx, subframe_rx, @@ -2834,9 +2834,7 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint else if ((dci_alloc_rx[i].rnti == SI_RNTI) && ((dci_alloc_rx[i].format == format1A) || (dci_alloc_rx[i].format == format1C))) { -#ifdef DEBUG_PHY_PROC - LOG_D(PHY,"[UE %d] subframe %d: Found rnti %x, format 1%s, dci_cnt %d\n",ue->Mod_id,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i); -#endif + if (generate_ue_dlsch_params_from_dci(frame_rx, @@ -2852,7 +2850,9 @@ int ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint P_RNTI, ue->transmission_mode[eNB_id]<7?0:ue->transmission_mode[eNB_id], 0)==0) { - +#ifdef DEBUG_PHY_PROC + LOG_I(PHY,"[UE %d] frame %d subframe %d: Found rnti %x, format 1%s, dci_cnt %d, mcs %d\n",ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].rnti,dci_alloc_rx[i].format==format1A?"A":"C",i,ue->dlsch_SI[eNB_id]->harq_processes[0]->mcs); +#endif ue->dlsch_SI_received[eNB_id]++; @@ -3570,6 +3570,16 @@ int phy_procedures_UE_RX(PHY_VARS_UE *ue,UE_rxtx_proc_t *proc,uint8_t eNB_id,uin LOG_D(PHY,"[%s %d] Frame %d subframe %d: Doing phy_procedures_UE_RX\n", (r_type == multicast_relay) ? "RN/UE" : "UE", ue->Mod_id,frame_rx, subframe_rx); + LOG_D(PHY,"phy_procedures_UR_RX: Frame %d, subframe %d : energy %d\n", + frame_rx,subframe_rx, + dB_fixed(signal_energy(&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti], + ue->frame_parms.samples_per_tti))); + + /* + if ((subframe_rx == 5) && ((frame_rx &1) == 0)) { + write_output("rxsig5.m","rxs5",&ue->common_vars.rxdata[0][subframe_rx*ue->frame_parms.samples_per_tti],ue->frame_parms.samples_per_tti,1,1); + exit(-1); + }*/ #endif if (ue->frame_parms.Ncp == 0) { // normal prefix diff --git a/openair1/SCHED/ru_procedures.c b/openair1/SCHED/ru_procedures.c index 60b2b81d576..19adae31b88 100644 --- a/openair1/SCHED/ru_procedures.c +++ b/openair1/SCHED/ru_procedures.c @@ -150,6 +150,7 @@ void feptx_ofdm(RU_t *ru) { } } else { + LOG_D(PHY,"feptx_ofdm: Writing to position %d\n",slot_offset); tx_offset = (int)slot_offset; txdata = (int16_t*)&ru->common.txdata[aa][tx_offset]; @@ -184,8 +185,8 @@ void feptx_ofdm(RU_t *ru) { ru->common.txdata[aa][tx_offset] = 0x00000000; } } - LOG_D(PHY,"feptx_ofdm: frame %d, subframe %d: txp (time) %d dB, txp (freq) %d dB\n", - ru->proc.frame_tx,subframe,dB_fixed(signal_energy(txdata,fp->samples_per_tti)), + LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n", + ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy(txdata,fp->samples_per_tti)), dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF))); } } @@ -248,10 +249,9 @@ void fep0(RU_t *ru,int slot) { remove_7_5_kHz(ru,(slot&1)+(proc->subframe_rx<<1)); for (l=0; l<fp->symbols_per_tti/2; l++) { - slot_fep_ul(fp, - &ru->common, + slot_fep_ul(ru, l, - (slot&1)+(proc->subframe_rx<<1), + (slot&1), 0 ); } @@ -353,16 +353,14 @@ void fep_full(RU_t *ru) { remove_7_5_kHz(ru,proc->subframe_rx<<1); remove_7_5_kHz(ru,1+(proc->subframe_rx<<1)); for (l=0; l<fp->symbols_per_tti/2; l++) { - slot_fep_ul(fp, - &ru->common, + slot_fep_ul(ru, l, - proc->subframe_rx<<1, + 0, 0 ); - slot_fep_ul(fp, - &ru->common, + slot_fep_ul(ru, l, - 1+(proc->subframe_rx<<1), + 1, 0 ); } diff --git a/openair1/SIMULATION/RF/dac.c b/openair1/SIMULATION/RF/dac.c index 4bd006c4766..4822a4d26d0 100644 --- a/openair1/SIMULATION/RF/dac.c +++ b/openair1/SIMULATION/RF/dac.c @@ -84,24 +84,33 @@ double dac_fixed_gain(double *s_re[2], uint32_t length_meas, uint8_t B, double txpwr_dBm, + uint8_t do_amp_compute, + double *amp1, int NB_RE) { int i; int aa; - double amp,amp1; + double amp,amp1_local,*amp1p; amp = //sqrt(NB_RE)*pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna pow(10.0,.05*txpwr_dBm)/sqrt(nb_tx_antennas); //this is amp per tx antenna - amp1 = 0; - for (aa=0; aa<nb_tx_antennas; aa++) { - amp1 += sqrt((double)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas)/NB_RE); + if (amp1==NULL) amp1p = &1_local; + else amp1p = amp1; + + if (do_amp_compute==1) { + *amp1p = 0; + for (aa=0; aa<nb_tx_antennas; aa++) { + *amp1p += (double)signal_energy((int32_t*)&input[aa][input_offset_meas],length_meas)/NB_RE; + } + *amp1p/=nb_tx_antennas; + *amp1p=sqrt(*amp1p); } - amp1/=nb_tx_antennas; - // printf("DAC: amp1 %f dB (%d,%d), tx_power %f\n",20*log10(amp1),input_offset,input_offset_meas,txpwr_dBm); + + // printf("DAC: amp %f, amp1 %f dB (%d,%d), tx_power %f (%f),length %d,pos %d\n",20*log10(amp),20*log10(*amp1p),input_offset,input_offset_meas,txpwr_dBm,length, 10*log10((double)signal_energy((int32_t*)&input[0][input_offset_meas],length_meas)/NB_RE),input_offset_meas); /* if (nb_tx_antennas==2) @@ -117,12 +126,12 @@ double dac_fixed_gain(double *s_re[2], for (i=0; i<length; i++) { for (aa=0; aa<nb_tx_antennas; aa++) { - s_re[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)])/amp1; ///(1<<(B-1)); - s_im[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)+1])/amp1; ///(1<<(B-1)); + s_re[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)])/(*amp1p); + s_im[aa][i] = amp*((double)(((short *)input[aa]))[((i+input_offset)<<1)+1])/(*amp1p); } } // printf("ener %e\n",signal_energy_fp(s_re,s_im,nb_tx_antennas,length,0)); - return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length_meas,0)/NB_RE); + return(signal_energy_fp(s_re,s_im,nb_tx_antennas,length<length_meas?length:length_meas,0)/NB_RE); } diff --git a/openair1/SIMULATION/RF/defs.h b/openair1/SIMULATION/RF/defs.h index b3d5e47e6b0..74bca6350bb 100644 --- a/openair1/SIMULATION/RF/defs.h +++ b/openair1/SIMULATION/RF/defs.h @@ -95,4 +95,6 @@ double dac_fixed_gain(double *s_re[2], unsigned int length_meas, unsigned char B, double gain, + uint8_t do_amp_compute, + double *amp1, int NB_RE); diff --git a/openair2/ENB_APP/enb_config.c b/openair2/ENB_APP/enb_config.c index 90cfb6d95a1..f5a4d7f1f67 100644 --- a/openair2/ENB_APP/enb_config.c +++ b/openair2/ENB_APP/enb_config.c @@ -1274,27 +1274,31 @@ int RCconfig_RRC(MessageDef *msg_p, uint32_t i, eNB_RRC_INST *rrc) { RC.config_file_name, i, pusch_nDMRS1); if (strcmp(phich_duration,"NORMAL")==0) { - RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = normal; + RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_normal; } else if (strcmp(phich_duration,"EXTENDED")==0) { - RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = extended; + RRC_CONFIGURATION_REQ (msg_p).phich_duration[j] = PHICH_Config__phich_Duration_extended; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_duration choice: NORMAL,EXTENDED!\n", RC.config_file_name, i, phich_duration); if (strcmp(phich_resource,"ONESIXTH")==0) { - RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = oneSixth; + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_oneSixth ; } else if (strcmp(phich_resource,"HALF")==0) { - RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = half; + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_half; } else if (strcmp(phich_resource,"ONE")==0) { - RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = one; + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_one; } else if (strcmp(phich_resource,"TWO")==0) { - RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = two; + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j] = PHICH_Config__phich_Resource_two; } else AssertFatal (0, "Failed to parse eNB configuration file %s, enb %d unknown value \"%s\" for phich_resource choice: ONESIXTH,HALF,ONE,TWO!\n", RC.config_file_name, i, phich_resource); + printf("phich.resource %d (%s), phich.duration %d (%s)\n", + RRC_CONFIGURATION_REQ (msg_p).phich_resource[j],phich_resource, + RRC_CONFIGURATION_REQ (msg_p).phich_duration[j],phich_duration); + if (strcmp(srs_enable, "ENABLE") == 0) { RRC_CONFIGURATION_REQ (msg_p).srs_enable[j] = TRUE; } else if (strcmp(srs_enable, "DISABLE") == 0) { diff --git a/openair2/LAYER2/MAC/config.c b/openair2/LAYER2/MAC/config.c index c358d0cc5c5..09b215098f3 100644 --- a/openair2/LAYER2/MAC/config.c +++ b/openair2/LAYER2/MAC/config.c @@ -146,6 +146,9 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP, RC.mac[Mod_idP]->common_channels[CC_idP].eutra_band = eutra_band; RC.mac[Mod_idP]->common_channels[CC_idP].dl_CarrierFreq = dl_CarrierFreq; + LOG_I(MAC,"Configuring MIB for instance %d, CCid %d : (band %d,N_RB_DL %d,Nid_cell %d,p %d,DL freq %u,phich_config.resource %d, phich_config.duration %d)\n", + Mod_idP, CC_idP, eutra_band, mib->message.dl_Bandwidth, physCellId, p_eNB,dl_CarrierFreq,mib->message.phich_Config.phich_Resource,mib->message.phich_Config.phich_Duration); + mac_xface->phy_config_mib_eNB(Mod_idP,CC_idP, eutra_band, mib->message.dl_Bandwidth, @@ -178,6 +181,8 @@ int rrc_mac_config_req_eNB(module_id_t Mod_idP, RC.mac[Mod_idP]->common_channels[CC_idP].radioResourceConfigCommon = radioResourceConfigCommon; if (ul_CarrierFreq>0) RC.mac[Mod_idP]->common_channels[CC_idP].ul_CarrierFreq = ul_CarrierFreq; if (ul_Bandwidth) RC.mac[Mod_idP]->common_channels[CC_idP].ul_Bandwidth = *ul_Bandwidth; + else RC.mac[Mod_idP]->common_channels[CC_idP].ul_Bandwidth = RC.mac[Mod_idP]->common_channels[CC_idP].mib->message.dl_Bandwidth; + mac_xface->phy_config_sib2_eNB(Mod_idP, CC_idP, radioResourceConfigCommon, NULL, ul_Bandwidth, additionalSpectrumEmission, mbsfn_SubframeConfigList); diff --git a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c index 7c8b730af9f..7d3682ee549 100644 --- a/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c +++ b/openair2/LAYER2/MAC/eNB_scheduler_ulsch.c @@ -790,16 +790,18 @@ abort(); N_RB_UL = to_prb(cc[CC_id].ul_Bandwidth); eNB_UE_stats = mac_xface->get_eNB_UE_stats(module_idP,CC_id,rnti); + aggregation=get_aggregation(get_bw_index(module_idP,CC_id), eNB_UE_stats->DL_cqi[0], format0); + if (CCE_allocation_infeasible(module_idP,CC_id,0,subframeP,aggregation,rnti)) { LOG_W(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d: not enough nCCE\n", module_idP,frameP,subframeP,UE_id,rnti,CC_id); continue; // break; } else{ - LOG_D(MAC,"[eNB %d] frame %d subframe %d, UE %d/%x CC %d mode %s: aggregation level %d\n", - module_idP,frameP,subframeP,UE_id,rnti,CC_id, mode_string[eNB_UE_stats->mode], 1<<aggregation); + LOG_D(MAC,"[eNB %d] frame %d subframe %d,Scheduling PUSCH for UE %d/%x CC %d mode %s: aggregation level %d, N_RB_UL %d\n", + module_idP,frameP,subframeP,UE_id,rnti,CC_id, mode_string[eNB_UE_stats->mode], 1<<aggregation,N_RB_UL); } @@ -910,7 +912,7 @@ abort(); T_INT(TBS), T_INT(ndi)); if (mac_eNB_get_rrc_status(module_idP,rnti) < RRC_CONNECTED) - LOG_I(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", + LOG_D(MAC,"[eNB %d][PUSCH %d/%x] CC_id %d Frame %d subframeP %d Scheduled UE %d (mcs %d, first rb %d, nb_rb %d, rb_table_index %d, TBS %d, harq_pid %d)\n", module_idP,harq_pid,rnti,CC_id,frameP,subframeP,UE_id,mcs, first_rb[CC_id],rb_table[rb_table_index], rb_table_index,TBS,harq_pid); diff --git a/openair2/LAYER2/MAC/main.c b/openair2/LAYER2/MAC/main.c index 7b24df95094..70a11180231 100644 --- a/openair2/LAYER2/MAC/main.c +++ b/openair2/LAYER2/MAC/main.c @@ -536,6 +536,10 @@ int l2_init_ue(int eMBMS_active, char *uecap_xer,uint8_t cba_group_active, uint8 mac_xface->ue_process_rar = ue_process_rar; mac_xface->ue_scheduler = ue_scheduler; mac_xface->process_timing_advance = process_timing_advance; + mac_xface->Msg3_transmitted = Msg3_tx; + mac_xface->Msg1_transmitted = Msg1_tx; + mac_xface->ra_failed = ra_failed; + mac_xface->ra_succeeded = ra_succeeded; LOG_I(MAC,"[MAIN] PHY Frame configuration \n"); @@ -641,10 +645,6 @@ int l2_init_eNB() mac_xface->get_prb = get_prb; // mac_xface->get_SB_size = Get_SB_size; mac_xface->get_subframe_direction = get_subframe_direction; - mac_xface->Msg3_transmitted = Msg3_tx; - mac_xface->Msg1_transmitted = Msg1_tx; - mac_xface->ra_failed = ra_failed; - mac_xface->ra_succeeded = ra_succeeded; mac_xface->mac_phy_remove_ue = mac_phy_remove_ue; LOG_I(MAC,"[MAIN] PHY Frame configuration \n"); diff --git a/openair2/RRC/LITE/MESSAGES/asn1_msg.c b/openair2/RRC/LITE/MESSAGES/asn1_msg.c index 079d100bde0..6f51a49e4e4 100644 --- a/openair2/RRC/LITE/MESSAGES/asn1_msg.c +++ b/openair2/RRC/LITE/MESSAGES/asn1_msg.c @@ -223,36 +223,20 @@ uint8_t do_MIB(rrc_eNB_carrier_data_t *carrier, uint32_t N_RB_DL, uint32_t phich case 100: mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n100; break; - default: - mib->message.dl_Bandwidth = MasterInformationBlock__dl_Bandwidth_n6; - break; - } - - switch (phich_Resource) { - case oneSixth: - mib->message.phich_Config.phich_Resource = 0; - break; - - case half: - mib->message.phich_Config.phich_Resource = 1; - break; - - case one: - mib->message.phich_Config.phich_Resource = 2; - break; - - case two: - mib->message.phich_Config.phich_Resource = 3; - break; + AssertFatal(1==0,"Unknown dl_Bandwidth %d\n",N_RB_DL); } + AssertFatal(phich_Resource <= PHICH_Config__phich_Resource_two,"Illegal phich_Resource\n"); + mib->message.phich_Config.phich_Resource = phich_Resource; + AssertFatal(phich_Resource <= PHICH_Config__phich_Duration_extended,"Illegal phich_Duration\n"); + mib->message.phich_Config.phich_Duration = phich_duration; LOG_I(RRC,"[MIB] systemBandwidth %x, phich_duration %x, phich_resource %x,sfn %x\n", (uint32_t)mib->message.dl_Bandwidth, (uint32_t)phich_duration, (uint32_t)phich_Resource, (uint32_t)sfn); - mib->message.phich_Config.phich_Duration = phich_duration; + mib->message.systemFrameNumber.buf = &sfn; mib->message.systemFrameNumber.size = 1; mib->message.systemFrameNumber.bits_unused=0; diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 5ff86de40ae..3bd4f1fd59e 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -140,6 +140,10 @@ init_SI( RC.rrc[ctxt_pP->module_id]->carrier[CC_id].Ncp = configuration->prefix_type[CC_id]; RC.rrc[ctxt_pP->module_id]->carrier[CC_id].dl_CarrierFreq = configuration->downlink_frequency[CC_id]; RC.rrc[ctxt_pP->module_id]->carrier[CC_id].ul_CarrierFreq = configuration->downlink_frequency[CC_id]+ configuration->uplink_frequency_offset[CC_id]; + LOG_I(RRC, "Configuring MIB (N_RB_DL %d,phich_Resource %d,phich_Duration %d)\n", + configuration->N_RB_DL[CC_id], + configuration->phich_resource[CC_id], + configuration->phich_duration[CC_id]); do_MIB(&RC.rrc[ctxt_pP->module_id]->carrier[CC_id], #ifdef ENABLE_ITTI configuration->N_RB_DL[CC_id], diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 1e415d1b608..65922a2ad3f 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -106,6 +106,8 @@ const char* eurecomVariablesNames[] = { "rxcnt", "trx_ts", "trx_tst", + "trx_ts_ue", + "trx_tst_ue", "trx_write_flags", "tx_ts", "rx_ts", @@ -196,6 +198,8 @@ const char* eurecomFunctionsNames[] = { "rt_sleep", "trx_read", "trx_write", + "trx_read_ue", + "trx_write_ue", "trx_read_if", "trx_write_if", "eNB_thread_rxtx0", diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index 925fdd93336..714cd28e2f8 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -78,6 +78,8 @@ typedef enum { VCD_SIGNAL_DUMPER_VARIABLES_RXCNT, VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, + VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS_UE, + VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST_UE, VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS, VCD_SIGNAL_DUMPER_VARIABLES_TX_TS, VCD_SIGNAL_DUMPER_VARIABLES_RX_TS, @@ -170,6 +172,8 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_RT_SLEEP=0, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, + VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_UE, + VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_UE, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, VCD_SIGNAL_DUMPER_FUNCTIONS_eNB_PROC_RXTX0, diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h index f4d6d6df1c6..73aa27826c5 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h @@ -61,8 +61,8 @@ // Packet sizes for IF4p5 interface format #define DATA_BLOCK_SIZE_BYTES(scaled_nblocks) (sizeof(uint16_t)*scaled_nblocks) -#define PRACH_HARD_CODED_NUM_SAMPLES (839*4) -#define PRACH_BLOCK_SIZE_BYTES (sizeof(int16_t)*PRACH_HARD_CODED_NUM_SAMPLES) // FIX hard coded prach size +#define PRACH_NUM_SAMPLES (839) +#define PRACH_BLOCK_SIZE_BYTES (sizeof(int32_t)*PRACH_NUM_SAMPLES) #define RAW_IF4p5_PDLFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) #define RAW_IF4p5_PULFFT_SIZE_BYTES(nblocks) (MAC_HEADER_SIZE_BYTES + sizeof_IF4p5_header_t + DATA_BLOCK_SIZE_BYTES(nblocks)) diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index f1747abae4c..9b9834a9d84 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -104,7 +104,6 @@ struct timing_info_t { // Fix per CC openair rf/if device update // extern openair0_device openair0; -void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe); #if defined(ENABLE_ITTI) extern volatile int start_eNB; @@ -141,7 +140,7 @@ void exit_fun(const char* s); void init_eNB(int,int); void stop_eNB(int nb_inst); - +void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru); static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_name) { @@ -150,8 +149,8 @@ static inline int rxtx(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc, char *thread_nam // **************************************** // Common RX procedures subframe n - do_prach(eNB,proc->frame_rx,proc->subframe_rx); - // phy_procedures_eNB_common_RX(eNB,proc); + // if this is IF5 or 3GPP_eNB + if (eNB->RU_list[0]->function < NGFI_RAU_IF4p5) wakeup_prach_eNB(eNB,NULL); // UE-specific RX processing for subframe n phy_procedures_eNB_uespec_RX(eNB, proc, no_relay ); @@ -278,11 +277,38 @@ void eNB_top(PHY_VARS_eNB *eNB, int frame_rx, int subframe_rx, char *string) { } -int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS *fp) { +int wakeup_rxtx(PHY_VARS_eNB *eNB,RU_t *ru) { + + eNB_proc_t *proc=&eNB->proc; + + eNB_rxtx_proc_t *proc_rxtx=&proc->proc_rxtx[proc->frame_rx&1]; + + LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms; int i; struct timespec wait; + pthread_mutex_lock(&proc->mutex_RU); + for (i=0;i<eNB->num_RU;i++) { + if (ru == eNB->RU_list[i]) { + if ((proc->RU_mask&(1<<i)) > 0) + LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information from RU %d (num_RU %d,mask %x) has not been served yet!\n", + eNB->Mod_id,proc->frame_rx,proc->subframe_rx,ru->idx,eNB->num_RU,proc->RU_mask); + proc->RU_mask |= (1<<i); + } + } + if (proc->RU_mask != (1<<eNB->num_RU)-1) { // not all RUs have provided their information so return + pthread_mutex_unlock(&proc->mutex_RU); + return(0); + } + else { // all RUs have provided their information so continue on and wakeup eNB processing + proc->RU_mask = 0; + pthread_mutex_unlock(&proc->mutex_RU); + } + + + + wait.tv_sec=0; wait.tv_nsec=5000000L; @@ -330,18 +356,37 @@ int wakeup_rxtx(eNB_proc_t *proc,eNB_rxtx_proc_t *proc_rxtx,LTE_DL_FRAME_PARMS * return(0); } -void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe) { +void wakeup_prach_eNB(PHY_VARS_eNB *eNB,RU_t *ru) { eNB_proc_t *proc = &eNB->proc; LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i; - - + if (ru!=NULL) { + pthread_mutex_lock(&proc->mutex_RU_PRACH); + for (i=0;i<eNB->num_RU;i++) { + if (ru == eNB->RU_list[i]) { + if ((proc->RU_mask_prach&(1<<i)) > 0) + LOG_E(PHY,"eNB %d frame %d, subframe %d : previous information (PRACH) from RU %d (num_RU %d, mask %x) has not been served yet!\n", + eNB->Mod_id,proc->frame_rx,proc->subframe_rx,ru->idx,eNB->num_RU,proc->RU_mask_prach); + proc->RU_mask_prach |= (1<<i); + } + } + if (proc->RU_mask_prach != (1<<eNB->num_RU)-1) { // not all RUs have provided their information so return + pthread_mutex_unlock(&proc->mutex_RU_PRACH); + return(0); + } + else { // all RUs have provided their information so continue on and wakeup eNB processing + proc->RU_mask_prach = 0; + pthread_mutex_unlock(&proc->mutex_RU_PRACH); + } + } + // check if we have to detect PRACH first - if (is_prach_subframe(fp,frame,subframe)>0) { - LOG_D(PHY,"Triggering prach processing, frame %d, subframe %d\n",frame,subframe); + if (is_prach_subframe(fp,proc->frame_rx,proc->subframe_rx)>0) { + LOG_D(PHY,"Triggering prach processing, frame %d, subframe %d\n",proc->frame_rx,proc->subframe_rx); if (proc->instance_cnt_prach == 0) { - LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH\n", frame,subframe); + LOG_W(PHY,"[eNB] Frame %d Subframe %d, dropping PRACH\n", proc->frame_rx,proc->subframe_rx); return; } @@ -354,8 +399,8 @@ void do_prach(PHY_VARS_eNB *eNB,int frame,int subframe) { ++proc->instance_cnt_prach; // set timing for prach thread - proc->frame_prach = frame; - proc->subframe_prach = subframe; + proc->frame_prach = proc->frame_rx; + proc->subframe_prach = proc->subframe_rx; // the thread can now be woken up if (pthread_cond_signal(&proc->cond_prach) != 0) { @@ -435,6 +480,8 @@ void init_eNB_proc(int inst) { proc->first_rx=1; proc->first_tx=1; + proc->RU_mask=0; + proc->RU_mask_prach=0; pthread_mutex_init( &proc_rxtx[0].mutex_rxtx, NULL); pthread_mutex_init( &proc_rxtx[1].mutex_rxtx, NULL); @@ -443,6 +490,8 @@ void init_eNB_proc(int inst) { pthread_mutex_init( &proc->mutex_prach, NULL); pthread_mutex_init( &proc->mutex_asynch_rxtx, NULL); + pthread_mutex_init( &proc->mutex_RU,NULL); + pthread_mutex_init( &proc->mutex_RU_PRACH,NULL); pthread_cond_init( &proc->cond_prach, NULL); pthread_cond_init( &proc->cond_asynch_rxtx, NULL); @@ -672,8 +721,9 @@ void init_eNB_afterRU() { if (RC.ru[ru_id]==NULL) RC.ru[ru_id] = (RU_t*)malloc(sizeof(RU_t)); - RC.ru[ru_id]->wakeup_rxtx = wakeup_rxtx; - RC.ru[ru_id]->eNB_top = eNB_top; + RC.ru[ru_id]->wakeup_rxtx = wakeup_rxtx; + RC.ru[ru_id]->wakeup_prach_eNB = wakeup_prach_eNB; + RC.ru[ru_id]->eNB_top = eNB_top; } } void init_eNB(int single_thread_flag,int wait_for_sync) { diff --git a/targets/RT/USER/lte-ru.c b/targets/RT/USER/lte-ru.c index 7da58eda4a9..69420fe122a 100644 --- a/targets/RT/USER/lte-ru.c +++ b/targets/RT/USER/lte-ru.c @@ -304,7 +304,7 @@ static inline void fh_if5_mobipass_south_out(RU_t *ru) { 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_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); + send_IF4p5(ru,ru->proc.frame_tx, ru->proc.subframe_tx, IF4p5_PDLFFT); } /*************************************************************/ @@ -358,34 +358,29 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) { else symbol_mask_full = (1<<fp->symbols_per_tti)-1; - + AssertFatal(proc->symbol_mask[*subframe]==0,"rx_fh_if4p5: proc->symbol_mask[%d] = %x\n",*subframe,proc->symbol_mask[*subframe]); do { // Blocking, we need a timeout on this !!!!!!!!!!!!!!!!!!!!!!! recv_IF4p5(ru, &f, &sf, &packet_type, &symbol_number); - if (packet_type == IF4p5_PULFFT) { - proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<<symbol_number); - - } else if (packet_type == IF4p5_PULTICK) { - if ((proc->first_rx==0) && (f!=*frame)) - LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame); - 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); + if (packet_type == IF4p5_PULFFT) proc->symbol_mask[sf] = proc->symbol_mask[sf] | (1<<symbol_number); + else if (packet_type == IF4p5_PULTICK) { + if ((proc->first_rx==0) && (f!=*frame)) LOG_E(PHY,"rx_fh_if4p5: PULTICK received frame %d != expected %d\n",f,*frame); + 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) { // nothing in RU for RAU } - + LOG_D(PHY,"rx_fh_if4p5: subframe %d symbol mask %x\n",*subframe,proc->symbol_mask[*subframe]); } while(proc->symbol_mask[*subframe] != symbol_mask_full); //caculate timestamp_rx, timestamp_tx based on frame and subframe - proc->subframe_rx = sf; - proc->frame_rx = f; + proc->subframe_rx = sf; + proc->frame_rx = f; proc->timestamp_rx = ((proc->frame_rx * 10) + proc->subframe_rx ) * fp->samples_per_tti ; - proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); - proc->subframe_tx = (sf+4)%10; - proc->frame_tx = (sf>5) ? (f+1)&1023 : f; - + // proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti); + proc->subframe_tx = (sf+4)%10; + proc->frame_tx = (sf>5) ? (f+1)&1023 : f; if (proc->first_rx == 0) { if (proc->subframe_rx != *subframe){ @@ -411,7 +406,8 @@ void fh_if4p5_south_in(RU_t *ru,int *frame,int *subframe) { proc->symbol_mask[sf] = 0; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff ); - + LOG_D(PHY,"RU %d: fh_if4p5_south_in sleeping ...\n",ru->idx); + usleep(100); } // Dummy FH from south for getting synchronization from master RU @@ -614,9 +610,13 @@ 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; + proc->subframe_tx = subframe_tx; + proc->frame_tx = frame_tx; + + if ((frame_tx == 0)&&(subframe_tx == 0)) proc->frame_tx_unwrap += 1024; + proc->timestamp_tx = (((frame_tx + proc->frame_tx_unwrap) * 10) + subframe_tx) * fp->samples_per_tti; + LOG_D(PHY,"RU %d/%d TST %llu, frame %d, subframe %d\n",ru->idx,0,proc->timestamp_tx,frame_tx,subframe_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 ); @@ -649,7 +649,7 @@ void fh_if4p5_north_out(RU_t *ru) { if ((fp->frame_type == TDD) && (subframe_select(fp,subframe)!=SF_UL)) { /// **** in TDD during DL send_IF4 of ULTICK to RCC **** /// - send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULTICK, 0); + send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULTICK); return; } if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 ); @@ -658,7 +658,7 @@ void fh_if4p5_north_out(RU_t *ru) { if (ru->feprx) { LOG_D(PHY,"Doing FEP/IF4p5 for frame %d, subframe %d\n",proc->frame_rx,proc->subframe_rx); ru->feprx(ru); - send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT, 0); + send_IF4p5(ru, proc->frame_rx, proc->subframe_rx, IF4p5_PULFFT); } if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 0 ); @@ -667,12 +667,12 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { RU_proc_t *proc = &ru->proc; LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; - void *rxp[fp->nb_antennas_rx]; + void *rxp[ru->nb_rx]; unsigned int rxs; int i; - for (i=0; i<fp->nb_antennas_rx; i++) + for (i=0; i<ru->nb_rx; i++) rxp[i] = (void*)&ru->common.rxdata[i][*subframe*fp->samples_per_tti]; VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); @@ -681,7 +681,7 @@ void rx_rf(RU_t *ru,int *frame,int *subframe) { &(proc->timestamp_rx), rxp, fp->samples_per_tti, - fp->nb_antennas_rx); + ru->nb_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); @@ -696,6 +696,8 @@ 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; + LOG_D(PHY,"RU %d/%d TS %llu (off %d), frame %d, subframe %d\n",ru->idx, 0, proc->timestamp_rx,ru->ts_offset,proc->frame_rx,proc->subframe_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 ); @@ -734,7 +736,7 @@ void tx_rf(RU_t *ru) { RU_proc_t *proc = &ru->proc; LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; - void *txp[fp->nb_antennas_tx]; + void *txp[ru->nb_tx]; unsigned int txs; int i; @@ -742,16 +744,18 @@ void tx_rf(RU_t *ru) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); // prepare tx buffer pointers - for (i=0; i<fp->nb_antennas_tx; i++) + for (i=0; i<ru->nb_tx; i++) txp[i] = (void*)&ru->common.txdata[i][proc->subframe_tx*fp->samples_per_tti]; txs = ru->rfdevice.trx_write_func(&ru->rfdevice, proc->timestamp_tx-ru->openair0_cfg.tx_sample_advance, txp, fp->samples_per_tti, - fp->nb_antennas_tx, + ru->nb_tx, 1); + LOG_D(PHY,"[TXPATH] RU %d tx_rf, writing to TS %llu, frame %d, unwrapped_frame %d, subframe %d\n",ru->idx, + proc->timestamp_tx,proc->frame_tx,proc->frame_tx_unwrap,proc->subframe_tx,proc); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); @@ -967,7 +971,7 @@ void do_ru_synch(RU_t *ru) { // continuously read in frames, 1ms at a time, // until we are done with the synchronization procedure - for (i=0; i<fp->nb_antennas_rx; i++) + for (i=0; i<ru->nb_rx; i++) rxp2[i] = (void*)&dummy_rx[i][0]; for (i=0;i<10;i++) rxs = ru->rfdevice.trx_read_func(&ru->rfdevice, @@ -986,7 +990,7 @@ void do_ru_synch(RU_t *ru) { &(proc->timestamp_rx), rxp, ru->rx_offset, - fp->nb_antennas_rx); + ru->nb_rx); for (i=0;i<4;i++) { ru->rfdevice.openair0_cfg->rx_freq[i] = temp_freq1; ru->rfdevice.openair0_cfg->tx_freq[i] = temp_freq2; @@ -1003,6 +1007,8 @@ void wakeup_eNBs(RU_t *ru) { int i; PHY_VARS_eNB **eNB_list = ru->eNB_list; + LOG_D(PHY,"wakeup_eNBs (num %d) for RU %d\n",ru->num_eNB,ru->idx); + if (ru->num_eNB==1) { // call eNB function directly @@ -1019,7 +1025,7 @@ void wakeup_eNBs(RU_t *ru) { } } -static inline int wakeup_prach(RU_t *ru) { +static inline int wakeup_prach_ru(RU_t *ru) { struct timespec wait; @@ -1035,7 +1041,8 @@ static inline int wakeup_prach(RU_t *ru) { ++ru->proc.instance_cnt_prach; ru->proc.frame_prach = ru->proc.frame_rx; ru->proc.subframe_prach = ru->proc.subframe_rx; - + + LOG_D(PHY,"RU %d: waking up PRACH thread\n",ru->idx); // 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"); } @@ -1053,8 +1060,8 @@ static void* ru_thread( void* param ) { RU_proc_t *proc = &ru->proc; LTE_DL_FRAME_PARMS *fp = &ru->frame_parms; int ret; - int subframe =0; - int frame =0; + int subframe =9; + int frame =1023; // set default return value ru_thread_status = 0; @@ -1136,7 +1143,7 @@ static void* ru_thread( void* param ) { 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); + wakeup_prach_ru(ru); @@ -1154,6 +1161,7 @@ static void* ru_thread( void* param ) { // If this proc is to provide synchronization, do so wakeup_slaves(proc); + LOG_D(PHY,"RU %d/%d frame_tx %d, subframe_tx %d\n",0,ru->idx,proc->frame_tx,proc->subframe_tx); // wakeup all eNB processes waiting for this RU if (ru->num_eNB>0) wakeup_eNBs(ru); @@ -1168,7 +1176,7 @@ static void* ru_thread( void* param ) { 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); } @@ -1285,20 +1293,22 @@ void init_RU_proc(RU_t *ru) { char name[100]; #ifndef OCP_FRAMEWORK - LOG_I(PHY,"Initializing RU %d (%s,%s),\n",ru->idx,eNB_functions[ru->function],eNB_timing[ru->if_timing]); + LOG_I(PHY,"Initializing RU proc %d (%s,%s),\n",ru->idx,eNB_functions[ru->function],eNB_timing[ru->if_timing]); #endif proc = &ru->proc; memset((void*)proc,0,sizeof(RU_proc_t)); proc->ru = ru; proc->instance_cnt_prach = -1; - proc->instance_cnt_synch = -1; + proc->instance_cnt_synch = -1; ; proc->instance_cnt_FH = -1; proc->instance_cnt_asynch_rxtx = -1; proc->first_rx = 1; proc->first_tx = 1; proc->frame_offset = 0; proc->num_slaves = 0; + proc->frame_tx_unwrap = 0; + for (i=0;i<10;i++) proc->symbol_mask[i]=0; pthread_mutex_init( &proc->mutex_prach, NULL); @@ -1808,7 +1818,7 @@ void init_RU(const char *rf_config_file) { } // for ru_id - sleep(1); + // sleep(1); LOG_D(HW,"[lte-softmodem.c] RU threads created\n"); diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 90fc37bbe3b..ae6db702495 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -526,6 +526,7 @@ static void *scope_thread(void *arg) 0,7); } else { + /* if (RC.eNB[0][0]->mac_enabled==1) { len = dump_eNB_l2_stats (stats_buffer, 0); //fl_set_object_label(form_stats_l2->stats_text, stats_buffer); @@ -540,7 +541,7 @@ static void *scope_thread(void *arg) //fl_set_object_label(form_stats->stats_text, stats_buffer); fl_clear_browser(form_stats->stats_text); fl_add_browser_line(form_stats->stats_text, stats_buffer); - + */ ue_cnt=0; for(UE_id=0; UE_id<NUMBER_OF_UE_MAX; UE_id++) { for(CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 98206a3c52d..b71a4d06641 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -189,7 +189,9 @@ PHY_VARS_UE* init_ue_vars(LTE_DL_FRAME_PARMS *frame_parms, } else ue = PHY_vars_UE_g[UE_id][0]; - ue->Mod_id=UE_id; + + ue->Mod_id = UE_id; + ue->mac_enabled = 1; // initialize all signal buffers init_lte_ue_signal(ue,1,abstraction_flag); // intialize transport @@ -298,37 +300,37 @@ static void *UE_thread_synch(void *arg) /* CPU 0 is reserved for UHD threads */ CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY +#ifdef CPU_AFFINITY if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } } - } - #endif +#endif /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } + { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } memset(cpu_affinity, 0 , sizeof(cpu_affinity)); for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf(temp, " CPU_%d ", j); + strcat(cpu_affinity, temp); + } memset(&sparam, 0 , sizeof (sparam)); sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; @@ -336,24 +338,24 @@ static void *UE_thread_synch(void *arg) s = pthread_setschedparam(pthread_self(), policy, &sparam); if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } + { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } s = pthread_getschedparam(pthread_self(), &policy, &sparam); if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); + { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); - } + } LOG_I( HW, "[SCHED][UE] Started UE synch thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + (int) sparam.sched_priority, cpu_affinity); #endif @@ -491,14 +493,16 @@ static void *UE_thread_synch(void *arg) LOG_I(PHY,"[UE thread Synch] Running Initial Synch (mode %d)\n",UE->mode); if (initial_sync( UE, UE->mode ) == 0) { + + hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti; LOG_I( HW, "Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n", - hw_slot_offset, - freq_offset, - UE->rx_total_gain_dB, - UE->frame_parms.dl_CarrierFreq+freq_offset, - UE->frame_parms.ul_CarrierFreq+freq_offset, - UE->UE_scan_carrier ); + hw_slot_offset, + freq_offset, + UE->rx_total_gain_dB, + UE->frame_parms.dl_CarrierFreq+freq_offset, + UE->frame_parms.ul_CarrierFreq+freq_offset, + UE->UE_scan_carrier ); if (UE->UE_scan_carrier == 1) { @@ -506,14 +510,14 @@ static void *UE_thread_synch(void *arg) // rerun with new cell parameters and frequency-offset for (i=0;i<openair0_cfg[UE->rf_map.card].rx_num_channels;i++) { openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET; - if (freq_offset >= 0) - { + if (freq_offset >= 0) + { openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] += UE->common_vars.freq_offset; - } + } else - { + { openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] -= UE->common_vars.freq_offset; - } + } openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i]+uplink_frequency_offset[CC_id][i]; UE->frame_parms.dl_CarrierFreq = openair0_cfg[CC_id].rx_freq[i]; freq_offset=0; @@ -712,37 +716,37 @@ static void *UE_thread_rxn_txnp4(void *arg) /* CPU 0 is reserved for UHD threads */ CPU_ZERO(&cpuset); - #ifdef CPU_AFFINITY +#ifdef CPU_AFFINITY if (get_nprocs() >2) - { - for (j = 1; j < get_nprocs(); j++) - CPU_SET(j, &cpuset); - - s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); - if (s != 0) { - perror( "pthread_setaffinity_np"); - exit_fun("Error setting processor affinity"); + for (j = 1; j < get_nprocs(); j++) + CPU_SET(j, &cpuset); + + s = pthread_setaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); + if (s != 0) + { + perror( "pthread_setaffinity_np"); + exit_fun("Error setting processor affinity"); + } } - } - #endif +#endif /* Check the actual affinity mask assigned to the thread */ s = pthread_getaffinity_np(pthread_self(), sizeof(cpu_set_t), &cpuset); if (s != 0) - { - perror( "pthread_getaffinity_np"); - exit_fun("Error getting processor affinity "); - } + { + perror( "pthread_getaffinity_np"); + exit_fun("Error getting processor affinity "); + } memset(cpu_affinity, 0 , sizeof(cpu_affinity)); for (j = 0; j < CPU_SETSIZE; j++) - if (CPU_ISSET(j, &cpuset)) - { - char temp[1024]; - sprintf(temp, " CPU_%d ", j); - strcat(cpu_affinity, temp); - } + if (CPU_ISSET(j, &cpuset)) + { + char temp[1024]; + sprintf(temp, " CPU_%d ", j); + strcat(cpu_affinity, temp); + } memset(&sparam, 0 , sizeof (sparam)); sparam.sched_priority = sched_get_priority_max(SCHED_FIFO)-1; @@ -750,24 +754,24 @@ static void *UE_thread_rxn_txnp4(void *arg) s = pthread_setschedparam(pthread_self(), policy, &sparam); if (s != 0) - { - perror("pthread_setschedparam : "); - exit_fun("Error setting thread priority"); - } + { + perror("pthread_setschedparam : "); + exit_fun("Error setting thread priority"); + } s = pthread_getschedparam(pthread_self(), &policy, &sparam); if (s != 0) - { - perror("pthread_getschedparam : "); - exit_fun("Error getting thread priority"); + { + perror("pthread_getschedparam : "); + exit_fun("Error getting thread priority"); - } + } LOG_I( HW, "[SCHED][UE] Started UE RX thread on CPU %d TID %ld , sched_policy = %s, priority = %d, CPU Affinity = %s \n", (int)sched_getcpu(), gettid(), - (policy == SCHED_FIFO) ? "SCHED_FIFO" : - (policy == SCHED_RR) ? "SCHED_RR" : - (policy == SCHED_OTHER) ? "SCHED_OTHER" : - "???", - (int) sparam.sched_priority, cpu_affinity); + (policy == SCHED_FIFO) ? "SCHED_FIFO" : + (policy == SCHED_RR) ? "SCHED_RR" : + (policy == SCHED_OTHER) ? "SCHED_OTHER" : + "???", + (int) sparam.sched_priority, cpu_affinity); #endif @@ -787,10 +791,10 @@ static void *UE_thread_rxn_txnp4(void *arg) char threadname[THREAD_NAME_LEN]; ret = pthread_getname_np(proc->pthread_rxtx, threadname, THREAD_NAME_LEN); if (ret != 0) - { - perror("pthread_getname_np : "); - exit_fun("Error getting thread name"); - } + { + perror("pthread_getname_np : "); + exit_fun("Error getting thread name"); + } pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread_rxtx)\n"); @@ -831,20 +835,20 @@ static void *UE_thread_rxn_txnp4(void *arg) (sf_type == SF_S)) { if (UE->frame_parms.frame_type == TDD) { - LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n", - threadname, - UE->frame_parms.tdd_config, - (sf_type==SF_DL? "SF_DL" : - (sf_type==SF_UL? "SF_UL" : - (sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE")))); + LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n", + threadname, + UE->frame_parms.tdd_config, + (sf_type==SF_DL? "SF_DL" : + (sf_type==SF_UL? "SF_UL" : + (sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE")))); } else { LOG_D(PHY, "%s,%s,%s: calling UE_RX\n", - threadname, - (UE->frame_parms.frame_type==FDD? "FDD": - (UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")), - (sf_type==SF_DL? "SF_DL" : - (sf_type==SF_UL? "SF_UL" : - (sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE")))); + threadname, + (UE->frame_parms.frame_type==FDD? "FDD": + (UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")), + (sf_type==SF_DL? "SF_DL" : + (sf_type==SF_UL? "SF_UL" : + (sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE")))); } phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL ); } @@ -852,13 +856,13 @@ static void *UE_thread_rxn_txnp4(void *arg) if (UE->mac_enabled==1) { ret = mac_xface->ue_scheduler(UE->Mod_id, - proc->frame_rx, - proc->subframe_rx, - proc->frame_tx, - proc->subframe_tx, - subframe_select(&UE->frame_parms,proc->subframe_tx), - 0, - 0/*FIXME CC_id*/); + proc->frame_rx, + proc->subframe_rx, + proc->frame_tx, + proc->subframe_tx, + subframe_select(&UE->frame_parms,proc->subframe_tx), + 0, + 0/*FIXME CC_id*/); if (ret == CONNECTION_LOST) { LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n", @@ -884,10 +888,10 @@ static void *UE_thread_rxn_txnp4(void *arg) } if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_S) && - (UE->frame_parms.frame_type == TDD)) { + (UE->frame_parms.frame_type == TDD)) { if (UE->mode != loop_through_memory) { - phy_procedures_UE_S_TX(UE,0,0,no_relay); + phy_procedures_UE_S_TX(UE,0,0,no_relay); } } @@ -1033,7 +1037,8 @@ void *UE_thread(void *arg) { UE->frame_parms.samples_per_tti*10, UE->frame_parms.nb_antennas_rx); - + LOG_D(PHY,"UE TS %llu, synch, samples %d\n",timestamp,UE->frame_parms.samples_per_tti*10); + if (rxs!=UE->frame_parms.samples_per_tti*10) { LOG_E(PHY, "problem in rx 1! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti*10, rxs); exit_fun("problem in rx 1"); @@ -1067,6 +1072,7 @@ void *UE_thread(void *arg) { rxp, UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_rx); + LOG_D(PHY,"UE TS %llu, subframe %d, samples %d\n",timestamp,sf,UE->frame_parms.samples_per_tti); if (rxs!=UE->frame_parms.samples_per_tti){ LOG_E(PHY, "problem in rx 2! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti, rxs); @@ -1086,15 +1092,17 @@ void *UE_thread(void *arg) { if (UE->no_timing_correction==0) { LOG_I(PHY,"Resynchronizing RX by %d samples (mode = %d)\n",UE->rx_offset,UE->mode); - rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, - ×tamp, - (void**)UE->common_vars.rxdata, - UE->rx_offset, - UE->frame_parms.nb_antennas_rx); - if (rxs != UE->rx_offset) { - LOG_E(PHY, "problem in rx 3! expect #samples=%d but got only %d!\n", UE->rx_offset, rxs); - exit_fun("problem in rx 3!"); - return &UE_thread_retval; + if (UE->rx_offset>0) { + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)UE->common_vars.rxdata, + UE->rx_offset, + UE->frame_parms.nb_antennas_rx); + if (rxs != UE->rx_offset) { + LOG_E(PHY, "problem in rx 3! expect #samples=%d but got only %d!\n", UE->rx_offset, rxs); + exit_fun("problem in rx 3!"); + return &UE_thread_retval; + } } } LOG_D(PHY,"Set rx_offset to 0 \n"); @@ -1108,11 +1116,12 @@ void *UE_thread(void *arg) { (void**)UE->common_vars.rxdata, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, UE->frame_parms.nb_antennas_rx); - if (rxs != (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0)) { - LOG_E(PHY, "problem in rx 4! expect #samples=%d but got only %d!\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, rxs); - exit_fun("problem in rx 4!"); - return &UE_thread_retval; - } + LOG_D(PHY,"UE TS %llu, subframe %d, samples %d\n",timestamp,0,UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0); + if (rxs != (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0)) { + LOG_E(PHY, "problem in rx 4! expect #samples=%d but got only %d!\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, rxs); + exit_fun("problem in rx 4!"); + return &UE_thread_retval; + } slot_fep(UE, 0, 0, @@ -1129,26 +1138,25 @@ void *UE_thread(void *arg) { }// start_rx_stream==0 else { - //UE->proc.proc_rxtx[0].frame_rx++; - //UE->proc.proc_rxtx[1].frame_rx++; - for (int sf=0;sf<10;sf++) { + for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)]; // grab signal for subframe if (UE->mode != loop_through_memory) { if (sf<9) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_UE, 1 ); rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp, rxp, UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_rx); - LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d \n", sf, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti), - UE->frame_parms.samples_per_tti); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_UE, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS_MISSING, UE->frame_parms.samples_per_tti - rxs); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS_UE, timestamp&0xffffffff ); + if (rxs != UE->frame_parms.samples_per_tti) { LOG_E(PHY, "problem in rx 5! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti, rxs); exit_fun("problem in rx 5!"); @@ -1159,7 +1167,7 @@ void *UE_thread(void *arg) { for (i=0; i<UE->frame_parms.nb_antennas_tx; i++) txp[i] = (void*)&UE->common_vars.txdata[i][((sf+2)%10)*UE->frame_parms.samples_per_tti]; - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_UE, 1 ); txs = UE->rfdevice.trx_write_func(&UE->rfdevice, timestamp+ (2*UE->frame_parms.samples_per_tti) - @@ -1169,13 +1177,13 @@ void *UE_thread(void *arg) { UE->frame_parms.samples_per_tti, UE->frame_parms.nb_antennas_tx, 1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_UE, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS, txs ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS_MISSING, UE->frame_parms.samples_per_tti - txs); - if (txs != UE->frame_parms.samples_per_tti) { - LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti); - exit_fun( "problem transmitting samples" ); - } + if (txs != UE->frame_parms.samples_per_tti) { + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti); + exit_fun( "problem transmitting samples" ); + } VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS_MISSING, UE->frame_parms.samples_per_tti - txs); } @@ -1187,16 +1195,18 @@ void *UE_thread(void *arg) { UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, UE->frame_parms.nb_antennas_rx); - LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d \n", sf, UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti), - UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0); + LOG_D(PHY,"grab signal for subframe %d offset %d Nbsamples %d => %d dB\n", sf, + UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti), + UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, + dB_fixed(signal_energy(rxp[0],UE->frame_parms.samples_per_tti))); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS_MISSING, (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0) - rxs); - if (rxs != (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0)) { - LOG_E(PHY, "problem in rx 6! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, rxs); - exit_fun("problem in rx 6!"); - return &UE_thread_retval; - } + if (rxs != (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0)) { + LOG_E(PHY, "problem in rx 6! expect #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, rxs); + exit_fun("problem in rx 6!"); + return &UE_thread_retval; + } // prepare tx buffer pointers for (i=0; i<UE->frame_parms.nb_antennas_tx; i++) @@ -1216,16 +1226,16 @@ void *UE_thread(void *arg) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS, txs ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS_MISSING, (UE->frame_parms.samples_per_tti - rx_off_diff) - txs); if (txs != UE->frame_parms.samples_per_tti - rx_off_diff) { - LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti-rx_off_diff); - exit_fun( "problem transmitting samples" ); + LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti-rx_off_diff); + exit_fun( "problem transmitting samples" ); } - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 1 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 1 ); // read in first symbol of next frame and adjust for timing drift - for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) - { - rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; - } + for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) + { + rxp[i] = (void*)&UE->common_vars.rxdata[i][0]; + } rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, @@ -1234,26 +1244,26 @@ void *UE_thread(void *arg) { UE->frame_parms.nb_antennas_rx); for (i=0; i<UE->frame_parms.nb_antennas_rx; i++) - { - rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.nb_prefix_samples0]; - } + { + rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.nb_prefix_samples0]; + } rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, ×tamp1, - rxp, + rxp, UE->frame_parms.ofdm_symbol_size, UE->frame_parms.nb_antennas_rx); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs ); - if (rxs != (UE->frame_parms.ofdm_symbol_size)) { - LOG_E(PHY, "problem in rx 7! expect #samples=%d but got only %d! rx_off_diff=%d\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, rxs, rx_off_diff); - exit_fun("problem in rx 7!"); - return &UE_thread_retval; - } - UE->rx_offset_diff = rx_off_diff; - LOG_D(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff); - rx_off_diff = 0; + if (rxs != (UE->frame_parms.ofdm_symbol_size)) { + LOG_E(PHY, "problem in rx 7! expect #samples=%d but got only %d! rx_off_diff=%d\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, rxs, rx_off_diff); + exit_fun("problem in rx 7!"); + return &UE_thread_retval; + } + UE->rx_offset_diff = rx_off_diff; + LOG_D(PHY,"SET rx_off_diff to %d\n",UE->rx_offset_diff); + rx_off_diff = 0; } } // operate on thread sf mod 2 @@ -1271,23 +1281,27 @@ void *UE_thread(void *arg) { int instance_cnt_rxtx = ++proc->instance_cnt_rxtx; VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, proc->instance_cnt_rxtx); if(sf == 0) - { - UE->proc.proc_rxtx[0].frame_rx++; - UE->proc.proc_rxtx[1].frame_rx++; - } + { + UE->proc.proc_rxtx[0].frame_rx++; + UE->proc.proc_rxtx[1].frame_rx++; + proc->frame_rx = UE->proc.proc_rxtx[0].frame_rx; + } + + proc->subframe_rx=sf; proc->subframe_tx=(sf+4)%10; proc->frame_tx = proc->frame_rx + ((proc->subframe_rx>5)?1:0); proc->timestamp_tx = timestamp+(4*UE->frame_parms.samples_per_tti)-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0; + LOG_D(PHY,"UE TS %llu, frame %d, subframe %d\n",timestamp,proc->frame_rx,proc->subframe_rx); #if T_TRACER T(T_UE_MASTER_TICK, T_INT(0), T_INT(proc->frame_rx%1024), T_INT(proc->subframe_rx)); #endif /* - if (sf != (timestamp/UE->frame_parms.samples_per_tti)%10) { + if (sf != (timestamp/UE->frame_parms.samples_per_tti)%10) { LOG_E(PHY,"steady-state UE_thread error : frame_rx %d, subframe_rx %d, frame_tx %d, subframe_tx %d, rx subframe %d\n",proc->frame_rx,proc->subframe_rx,proc->frame_tx,proc->subframe_tx,(timestamp/UE->frame_parms.samples_per_tti)%10); exit(-1); - } + } */ if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) { LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX\n" ); @@ -1306,7 +1320,7 @@ void *UE_thread(void *arg) { } LOG_D(PHY, "firing up rxtx_thread[%d] at subframe %d\n", proc_select, sf); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SIGNAL_COND_RXTX0+proc_select, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SIGNAL_COND_RXTX0+proc_select, 0 ); } else { LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rxtx); @@ -1348,22 +1362,22 @@ void *UE_thread(void *arg) { } // UE->is_synchronized==1 } // while !oai_exit - return NULL; + return NULL; } // UE_thread /* -void *UE_thread_old(void *arg) -{ + void *UE_thread_old(void *arg) + { UNUSED(arg) static int UE_thread_retval; PHY_VARS_UE *UE = PHY_vars_UE_g[0][0]; int spp = openair0_cfg[0].samples_per_packet; int slot=1, frame=0, hw_subframe=0, rxpos=0, txpos=openair0_cfg[0].tx_scheduling_advance; -#ifdef __AVX2__ + #ifdef __AVX2__ int dummy[2][spp] __attribute__((aligned(32))); -#else + #else int dummy[2][spp] __attribute__((aligned(16))); -#endif + #endif int dummy_dump = 0; int tx_enabled = 0; int start_rx_stream = 0; @@ -1376,11 +1390,11 @@ void *UE_thread_old(void *arg) openair0_timestamp timestamp; -#ifdef NAS_UE + #ifdef NAS_UE MessageDef *message_p; -#endif + #endif -#ifdef DEADLINE_SCHEDULER + #ifdef DEADLINE_SCHEDULER struct sched_attr attr; unsigned int flags = 0; @@ -1397,18 +1411,18 @@ void *UE_thread_old(void *arg) attr.sched_period = 500000; if (sched_setattr(0, &attr, flags) < 0 ) { - perror("[SCHED] main eNB thread: sched_setattr failed\n"); - exit_fun("Nothing to add"); - return &UE_thread_retval; + perror("[SCHED] main eNB thread: sched_setattr failed\n"); + exit_fun("Nothing to add"); + return &UE_thread_retval; } LOG_I(HW,"[SCHED][eNB] eNB main deadline thread %lu started on CPU %d\n", - (unsigned long)gettid(), sched_getcpu()); + (unsigned long)gettid(), sched_getcpu()); -#else + #else struct sched_param sp; sp.sched_priority = sched_get_priority_max(SCHED_FIFO); pthread_setschedparam(pthread_self(),SCHED_FIFO,&sp); -#endif + #endif // Lock memory from swapping. This is a process wide call (not constraint to this thread). mlockall(MCL_CURRENT | MCL_FUTURE); @@ -1418,320 +1432,320 @@ void *UE_thread_old(void *arg) printf("Locked sync_mutex, waiting (UE_thread)\n"); while (sync_var<0) - pthread_cond_wait(&sync_cond, &sync_mutex); + pthread_cond_wait(&sync_cond, &sync_mutex); pthread_mutex_unlock(&sync_mutex); printf("unlocked sync_mutex, waiting (UE_thread)\n"); printf("starting UE thread\n"); -#ifdef NAS_UE + #ifdef NAS_UE message_p = itti_alloc_new_message(TASK_NAS_UE, INITIALIZE_MESSAGE); itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p); -#endif + #endif T0 = rt_get_time_ns(); first_rx = 1; rxpos=0; while (!oai_exit) { - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_SUBFRAME, hw_subframe ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_HW_FRAME, frame ); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_DUMMY_DUMP, dummy_dump ); - while (rxpos < (1+hw_subframe)*UE->frame_parms.samples_per_tti) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); + while (rxpos < (1+hw_subframe)*UE->frame_parms.samples_per_tti) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 ); -#ifndef USRP_DEBUG + #ifndef USRP_DEBUG - DevAssert( UE->frame_parms.nb_antennas_rx <= 2 ); - void* rxp[2]; + DevAssert( UE->frame_parms.nb_antennas_rx <= 2 ); + void* rxp[2]; - for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++) - rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i]; + for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++) + rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i]; - if (UE->mode != loop_through_memory) { - rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, - ×tamp, - rxp, - spp - ((first_rx==1) ? rx_off_diff : 0), - UE->frame_parms.nb_antennas_rx); - - if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) { - printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs); - if (UE->is_synchronized == 1) { - exit_fun("problem in rx"); - return &UE_thread_retval; - } - } - } + if (UE->mode != loop_through_memory) { + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + rxp, + spp - ((first_rx==1) ? rx_off_diff : 0), + UE->frame_parms.nb_antennas_rx); + + if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) { + printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs); + if (UE->is_synchronized == 1) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } + } + } - if (rx_off_diff !=0) - LOG_D(PHY,"frame %d, rx_offset %d, rx_off_diff %d\n",UE->frame_rx,UE->rx_offset,rx_off_diff); + if (rx_off_diff !=0) + LOG_D(PHY,"frame %d, rx_offset %d, rx_off_diff %d\n",UE->frame_rx,UE->rx_offset,rx_off_diff); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); - // Transmit TX buffer based on timestamp from RX - if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) { - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); + // Transmit TX buffer based on timestamp from RX + if ((tx_enabled==1) && (UE->mode!=loop_through_memory)) { + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 ); - DevAssert( UE->frame_parms.nb_antennas_tx <= 2 ); - void* txp[2]; + DevAssert( UE->frame_parms.nb_antennas_tx <= 2 ); + void* txp[2]; - for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++) - txp[i] = (void*)&txdata[i][txpos]; + for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++) + txp[i] = (void*)&txdata[i][txpos]; - UE->rfdevice.trx_write_func(&openair0, - (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance), - txp, - spp - ((first_rx==1) ? rx_off_diff : 0), - UE->frame_parms.nb_antennas_tx, - 1); + UE->rfdevice.trx_write_func(&openair0, + (timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance), + txp, + spp - ((first_rx==1) ? rx_off_diff : 0), + UE->frame_parms.nb_antennas_tx, + 1); - VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); - } - else if (UE->mode == loop_through_memory) - rt_sleep_ns(1000000); -#else - // define USRP_DEBUG is active - rt_sleep_ns(1000000); -#endif + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 ); + } + else if (UE->mode == loop_through_memory) + rt_sleep_ns(1000000); + #else + // define USRP_DEBUG is active + rt_sleep_ns(1000000); + #endif - rx_off_diff = 0; - first_rx = 0; + rx_off_diff = 0; + first_rx = 0; - rxpos += spp; - txpos += spp; + rxpos += spp; + txpos += spp; - if (txpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti) - txpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti; - } + if (txpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti) + txpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti; + } - if (rxpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti) - rxpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti; + if (rxpos >= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti) + rxpos -= 10*PHY_vars_UE_g[0][0]->frame_parms.samples_per_tti; - if (UE->is_synchronized == 1) { - LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); + if (UE->is_synchronized == 1) { + LOG_D( HW, "UE_thread: hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - if (start_rx_stream == 1) { - LOG_D(PHY,"Locking mutex_rx (IC %d)\n",UE->instance_cnt_rx); - if (pthread_mutex_lock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } + if (start_rx_stream == 1) { + LOG_D(PHY,"Locking mutex_rx (IC %d)\n",UE->instance_cnt_rx); + if (pthread_mutex_lock(&UE->mutex_rx) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } - int instance_cnt_rx = ++UE->instance_cnt_rx; + int instance_cnt_rx = ++UE->instance_cnt_rx; - LOG_D(PHY,"Unlocking mutex_rx (IC %d)\n",instance_cnt_rx); - if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } + LOG_D(PHY,"Unlocking mutex_rx (IC %d)\n",instance_cnt_rx); + if (pthread_mutex_unlock(&UE->mutex_rx) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx); + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_RX, instance_cnt_rx); - if (instance_cnt_rx == 0) { - LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - if (pthread_cond_signal(&UE->proc.cond_rx) != 0) { - LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } + if (instance_cnt_rx == 0) { + LOG_D(HW,"signalling rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); + if (pthread_cond_signal(&UE->proc.cond_rx) != 0) { + LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } - LOG_D(HW,"signalled rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - if (UE->mode == loop_through_memory) { - printf("Processing subframe %d",UE->slot_rx>>1); - getchar(); - } + LOG_D(HW,"signalled rx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); + if (UE->mode == loop_through_memory) { + printf("Processing subframe %d",UE->slot_rx>>1); + getchar(); + } - if (UE->mode == rx_calib_ue) { - if (frame == 10) { - LOG_D(PHY, - "[SCHED][UE] Found cell with N_RB_DL %"PRIu8", PHICH CONFIG (%d,%d), Nid_cell %"PRIu16", NB_ANTENNAS_TX %"PRIu8", frequency offset "PRIi32" Hz, RSSI (digital) %hu dB, measured Gain %d dB, total_rx_gain %"PRIu32" dB, USRP rx gain %f dB\n", - UE->frame_parms.N_RB_DL, - UE->frame_parms.phich_config_common.phich_duration, - UE->frame_parms.phich_config_common.phich_resource, - UE->frame_parms.Nid_cell, - UE->frame_parms.nb_antennas_tx_eNB, - UE->common_vars.freq_offset, - UE->measurements.rx_power_avg_dB[0], - UE->measurements.rx_power_avg_dB[0] - rx_input_level_dBm, - UE->rx_total_gain_dB, - openair0_cfg[0].rx_gain[0] - ); - exit_fun("[HW][UE] UE in RX calibration mode, exiting"); - return &UE_thread_retval; - } - } - } else { - LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rx); - if (instance_cnt_rx > 2) { - exit_fun("instance_cnt_rx > 1"); - return &UE_thread_retval; - } - } + if (UE->mode == rx_calib_ue) { + if (frame == 10) { + LOG_D(PHY, + "[SCHED][UE] Found cell with N_RB_DL %"PRIu8", PHICH CONFIG (%d,%d), Nid_cell %"PRIu16", NB_ANTENNAS_TX %"PRIu8", frequency offset "PRIi32" Hz, RSSI (digital) %hu dB, measured Gain %d dB, total_rx_gain %"PRIu32" dB, USRP rx gain %f dB\n", + UE->frame_parms.N_RB_DL, + UE->frame_parms.phich_config_common.phich_duration, + UE->frame_parms.phich_config_common.phich_resource, + UE->frame_parms.Nid_cell, + UE->frame_parms.nb_antennas_tx_eNB, + UE->common_vars.freq_offset, + UE->measurements.rx_power_avg_dB[0], + UE->measurements.rx_power_avg_dB[0] - rx_input_level_dBm, + UE->rx_total_gain_dB, + openair0_cfg[0].rx_gain[0] + ); + exit_fun("[HW][UE] UE in RX calibration mode, exiting"); + return &UE_thread_retval; + } + } + } else { + LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rx); + if (instance_cnt_rx > 2) { + exit_fun("instance_cnt_rx > 1"); + return &UE_thread_retval; + } + } - if ((tx_enabled==1)&&(UE->mode != loop_through_memory)) { + if ((tx_enabled==1)&&(UE->mode != loop_through_memory)) { - if (pthread_mutex_lock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } + if (pthread_mutex_lock(&UE->mutex_tx) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE TX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } - int instance_cnt_tx = ++UE->instance_cnt_tx; + int instance_cnt_tx = ++UE->instance_cnt_tx; - if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx); + if (pthread_mutex_unlock(&UE->mutex_tx) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE TX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME(VCD_SIGNAL_DUMPER_VARIABLES_UE_INST_CNT_TX, instance_cnt_tx); - if (instance_cnt_tx == 0) { - if (pthread_cond_signal(&UE->cond_tx) != 0) { - LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - LOG_D(HW,"signalled tx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); + if (instance_cnt_tx == 0) { + if (pthread_cond_signal(&UE->cond_tx) != 0) { + LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE TX thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + LOG_D(HW,"signalled tx thread to wake up, hw_frame %d, hw_subframe %d (time %lli)\n", frame, hw_subframe, rt_get_time_ns()-T0 ); - } else { - LOG_E( PHY, "[SCHED][UE] UE TX thread busy (IC %d)!!\n" ); - if (instance_cnt_tx>2) { - exit_fun("instance_cnt_tx > 1"); - return &UE_thread_retval; - } - } - } + } else { + LOG_E( PHY, "[SCHED][UE] UE TX thread busy (IC %d)!!\n" ); + if (instance_cnt_tx>2) { + exit_fun("instance_cnt_tx > 1"); + return &UE_thread_retval; + } + } + } - } - } else { - // we are not yet synchronized - if ((hw_subframe == 9) && (dummy_dump == 0)) { - // Wake up initial synch thread - if (pthread_mutex_lock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - int instance_cnt_synch = ++UE->instance_cnt_synch; - - if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - - dummy_dump = 1; - - if (instance_cnt_synch == 0) { - if (pthread_cond_signal(&UE->cond_synch) != 0) { - LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - } else { - LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" ); - exit_fun("nothing to add"); - return &UE_thread_retval; - } - } - } + } + } else { + // we are not yet synchronized + if ((hw_subframe == 9) && (dummy_dump == 0)) { + // Wake up initial synch thread + if (pthread_mutex_lock(&UE->mutex_synch) != 0) { + LOG_E( PHY, "[SCHED][UE] error locking mutex for UE initial synch thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } - hw_subframe++; - slot+=2; + int instance_cnt_synch = ++UE->instance_cnt_synch; - if (hw_subframe==10) { - hw_subframe = 0; - first_rx = 1; - frame++; - slot = 1; + if (pthread_mutex_unlock(&UE->mutex_synch) != 0) { + LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE initial synch thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } - int fail = pthread_mutex_lock(&UE->mutex_synch); - int instance_cnt_synch = UE->instance_cnt_synch; - fail = fail || pthread_mutex_unlock(&UE->mutex_synch); + dummy_dump = 1; - if (fail) { - LOG_E( PHY, "[SCHED][UE] error (un-)locking mutex for UE synch\n" ); - exit_fun("noting to add"); - return &UE_thread_retval; - } + if (instance_cnt_synch == 0) { + if (pthread_cond_signal(&UE->cond_synch) != 0) { + LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE sync thread\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + } else { + LOG_E( PHY, "[SCHED][UE] UE sync thread busy!!\n" ); + exit_fun("nothing to add"); + return &UE_thread_retval; + } + } + } - if (instance_cnt_synch < 0) { - // the UE_thread_synch is ready - if (UE->is_synchronized == 1) { - rx_off_diff = 0; - LTE_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES - - // LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset); - if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) { - start_rx_stream=1; - frame=0; - // dump ahead in time to start of frame - -#ifndef USRP_DEBUG - if (UE->mode != loop_through_memory) { - LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); - rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, - ×tamp, - (void**)rxdata, - UE->rx_offset, - UE->frame_parms.nb_antennas_rx); - if (rxs != UE->rx_offset) { - exit_fun("problem in rx"); - return &UE_thread_retval; - } - UE->rx_offset=0; - tx_enabled = 1; - } - else - rt_sleep_ns(1000000); -#else - rt_sleep_ns(10000000); -#endif + hw_subframe++; + slot+=2; - } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && - (UE->rx_offset > RX_OFF_MIN) && - (start_rx_stream==1) && - (rx_correction_timer == 0)) { - rx_off_diff = -UE->rx_offset + RX_OFF_MIN; - LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff); - rx_correction_timer = 5; - } else if ((UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && - (UE->rx_offset < (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN)) && - (start_rx_stream==1) && - (rx_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples - rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset; - LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff); + if (hw_subframe==10) { + hw_subframe = 0; + first_rx = 1; + frame++; + slot = 1; - rx_correction_timer = 5; - } + int fail = pthread_mutex_lock(&UE->mutex_synch); + int instance_cnt_synch = UE->instance_cnt_synch; + fail = fail || pthread_mutex_unlock(&UE->mutex_synch); - if (rx_correction_timer>0) - rx_correction_timer--; - } + if (fail) { + LOG_E( PHY, "[SCHED][UE] error (un-)locking mutex for UE synch\n" ); + exit_fun("noting to add"); + return &UE_thread_retval; + } - dummy_dump=0; - } - } + if (instance_cnt_synch < 0) { + // the UE_thread_synch is ready + if (UE->is_synchronized == 1) { + rx_off_diff = 0; + LTE_DL_FRAME_PARMS *frame_parms = &UE->frame_parms; // for macro FRAME_LENGTH_COMPLEX_SAMPLES + + // LOG_I(PHY,"UE->rx_offset %d\n",UE->rx_offset); + if ((UE->rx_offset > RX_OFF_MAX) && (start_rx_stream == 0)) { + start_rx_stream=1; + frame=0; + // dump ahead in time to start of frame + + #ifndef USRP_DEBUG + if (UE->mode != loop_through_memory) { + LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset); + rxs = UE->rfdevice.trx_read_func(&UE->rfdevice, + ×tamp, + (void**)rxdata, + UE->rx_offset, + UE->frame_parms.nb_antennas_rx); + if (rxs != UE->rx_offset) { + exit_fun("problem in rx"); + return &UE_thread_retval; + } + UE->rx_offset=0; + tx_enabled = 1; + } + else + rt_sleep_ns(1000000); + #else + rt_sleep_ns(10000000); + #endif -#if defined(ENABLE_ITTI) - itti_update_lte_time(frame, slot); -#endif + } else if ((UE->rx_offset<(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && + (UE->rx_offset > RX_OFF_MIN) && + (start_rx_stream==1) && + (rx_correction_timer == 0)) { + rx_off_diff = -UE->rx_offset + RX_OFF_MIN; + LOG_D(PHY,"UE->rx_offset %d > %d, diff %d\n",UE->rx_offset,RX_OFF_MIN,rx_off_diff); + rx_correction_timer = 5; + } else if ((UE->rx_offset>(FRAME_LENGTH_COMPLEX_SAMPLES/2)) && + (UE->rx_offset < (FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN)) && + (start_rx_stream==1) && + (rx_correction_timer == 0)) { // moving to the left so drop rx_off_diff samples + rx_off_diff = FRAME_LENGTH_COMPLEX_SAMPLES - RX_OFF_MIN - UE->rx_offset; + LOG_D(PHY,"UE->rx_offset %d < %d, diff %d\n",UE->rx_offset,FRAME_LENGTH_COMPLEX_SAMPLES-RX_OFF_MIN,rx_off_diff); + + rx_correction_timer = 5; + } + + if (rx_correction_timer>0) + rx_correction_timer--; + } + + dummy_dump=0; + } + } + + #if defined(ENABLE_ITTI) + itti_update_lte_time(frame, slot); + #endif } return &UE_thread_retval; -} + } */ @@ -1827,13 +1841,13 @@ int setup_ue_buffers(PHY_VARS_UE **phy_vars_ue, openair0_config_t *openair0_cfg) } /* - if (frame_parms->frame_type == TDD) { + if (frame_parms->frame_type == TDD) { if (frame_parms->N_RB_DL == 100) - N_TA_offset = 624; + N_TA_offset = 624; else if (frame_parms->N_RB_DL == 50) - N_TA_offset = 624/2; + N_TA_offset = 624/2; else if (frame_parms->N_RB_DL == 25) - N_TA_offset = 624/4; + N_TA_offset = 624/4; } */ diff --git a/targets/SIMU/USER/channel_sim.c b/targets/SIMU/USER/channel_sim.c index 905ee199322..31c292dee00 100644 --- a/targets/SIMU/USER/channel_sim.c +++ b/targets/SIMU/USER/channel_sim.c @@ -60,7 +60,7 @@ #include "oaisim.h" #define RF -//#define DEBUG_SIM +#define DEBUG_SIM int number_rb_ul; int first_rbUL ; @@ -77,10 +77,15 @@ int UE_output_mask[NUMBER_OF_RU_MAX]; pthread_mutex_t RU_output_mutex[NUMBER_OF_UE_MAX]; pthread_mutex_t UE_output_mutex[NUMBER_OF_RU_MAX]; +double ru_amp[NUMBER_OF_RU_MAX]; + void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], node_desc_t *enb_data[NUMBER_OF_RU_MAX], node_desc_t *ue_data[NUMBER_OF_UE_MAX], - uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *ue_frame_parms, + uint16_t subframe, + uint16_t offset, + uint16_t length, + uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *ue_frame_parms, uint8_t UE_id, int CC_id) { @@ -237,22 +242,26 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM txdata = RC.ru[ru_id]->common.txdata; frame_parms = &RC.ru[ru_id]->frame_parms; - sf_offset = subframe*frame_parms->samples_per_tti; + sf_offset = (subframe*frame_parms->samples_per_tti) + offset; + LOG_D(EMU,"TXPATH: RU %d : DL_sig reading TX for subframe %d (sf_offset %d, length %d) from %p\n",ru_id,subframe,sf_offset,length,txdata[0]+sf_offset); + int length_meas = frame_parms->ofdm_symbol_size; tx_pwr = dac_fixed_gain(s_re, s_im, txdata, sf_offset, nb_antennas_tx, - frame_parms->samples_per_tti, + length, sf_offset, - frame_parms->ofdm_symbol_size, + length_meas, 14, frame_parms->pdsch_config_common.referenceSignalPower, // dBm/RE + 0, + &ru_amp[ru_id], frame_parms->N_RB_DL*12); #ifdef DEBUG_SIM LOG_D(PHY,"[SIM][DL] subframe %d: txp (time) %d dB\n", - subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],frame_parms->samples_per_tti))); + subframe,dB_fixed(signal_energy(&txdata[0][sf_offset],length_meas))); LOG_D(OCM,"[SIM][DL] RU %d (CCid %d): tx_pwr %.1f dBm/RE (target %d dBm/RE), for subframe %d\n", ru_id,CC_id, @@ -261,9 +270,13 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM subframe); #endif + tx_pwr = signal_energy_fp(s_re,s_im,nb_antennas_tx, + length<length_meas?length:length_meas, + 0)/(12.0*frame_parms->N_RB_DL); + //RU2UE[eNB_id][UE_id]->path_loss_dB = 0; multipath_channel(RU2UE[ru_id][UE_id][CC_id],s_re,s_im,r_re0,r_im0, - frame_parms->samples_per_tti,hold_channel); + length,hold_channel); #ifdef DEBUG_SIM rx_pwr = signal_energy_fp2(RU2UE[ru_id][UE_id][CC_id]->ch[0], RU2UE[ru_id][UE_id][CC_id]->channel_length)*RU2UE[ru_id][UE_id][CC_id]->channel_length; @@ -278,7 +291,7 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM #endif - LOG_D(OCM,"[SIM][DL] Channel eNB %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n", + LOG_D(OCM,"[SIM][DL] Channel RU %d => UE %d (CCid %d): tx_power %.1f dBm/RE, path_loss %1.f dB\n", ru_id,UE_id,CC_id, (double)frame_parms->pdsch_config_common.referenceSignalPower, // enb_data[eNB_id]->tx_power_dBm, @@ -286,11 +299,15 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM #ifdef DEBUG_SIM rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx, - frame_parms->ofdm_symbol_size, + length<length_meas?length:length_meas, 0)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI)for subframe %d\n",UE_id, - 10*log10(rx_pwr), - 10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12),subframe); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr %f dBm/RE (%f dBm RSSI,tx %f dB)for subframe %d (length %d)\n",UE_id, + 10*log10(rx_pwr), + 10*log10(rx_pwr*(double)frame_parms->N_RB_DL*12), + 10*log10(tx_pwr),subframe, + length<length_meas?length:length_meas); + + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (noise) -132 dBm/RE (N0fs = %.1f dBm, N0B = %.1f dBm) for subframe %d\n", UE_id, 10*log10(RU2UE[ru_id][UE_id][CC_id]->sampling_rate*1e6)-174, @@ -311,16 +328,16 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM rf_rx_simple(r_re0, r_im0, nb_antennas_rx, - frame_parms->samples_per_tti, + length, 1e3/RU2UE[ru_id][UE_id][CC_id]->sampling_rate, // sampling time (ns) (double)PHY_vars_UE_g[UE_id][CC_id]->rx_total_gain_dB - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM rx_pwr = signal_energy_fp(r_re0,r_im0, nb_antennas_rx, - frame_parms->ofdm_symbol_size, + length<length_meas?length:length_meas, 0)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : ADC in (eNB %d) %f dBm/RE for subframe %d\n", + LOG_D(OCM,"[SIM][DL] UE %d : ADC in (RU %d) %f dBm/RE for subframe %d\n", UE_id,ru_id, 10*log10(rx_pwr),subframe); #endif @@ -341,12 +358,12 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM double *r_im_p[2] = {r_im_DL[ru_id][0],r_im_DL[ru_id][1]}; #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->ofdm_symbol_size,0)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm for subframe %d\n",UE_id,10*log10(rx_pwr),subframe); + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,length<length_meas?length:length_meas,0)/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : ADC in %f dBm/RE for subframe %d\n",UE_id,10*log10(rx_pwr),subframe); #endif rxdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.rxdata; - sf_offset = subframe*frame_parms->samples_per_tti; + sf_offset = (subframe*frame_parms->samples_per_tti)+offset; adc(r_re_p, @@ -355,12 +372,13 @@ void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM sf_offset, rxdata, nb_antennas_rx, - frame_parms->samples_per_tti, + length, 12); #ifdef DEBUG_SIM - rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->ofdm_symbol_size)/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata); + rx_pwr2 = signal_energy(rxdata[0]+sf_offset,length<length_meas?length:length_meas)/(12.0*frame_parms->N_RB_DL); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB/RE (%d) for subframe %d, writing to %p, length %d\n",UE_id, 10*log10((double)rx_pwr2),rx_pwr2,subframe,rxdata,length<length_meas?length:length_meas); + LOG_D(OCM,"[SIM][DL] UE %d : rx_pwr (ADC out) %f dB for subframe %d\n",UE_id,10*log10((double)rx_pwr2*12*frame_parms->N_RB_DL) ,subframe); #else UNUSED_VARIABLE(rx_pwr2); UNUSED_VARIABLE(tx_pwr); @@ -477,7 +495,7 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM // Compute RX signal for eNB = eNB_id for (UE_id=0; UE_id<NB_UE_INST; UE_id++) { - txdata = RC.ru[ru_id]->common.txdata; + txdata = PHY_vars_UE_g[UE_id][CC_id]->common_vars.txdata; AssertFatal(txdata != NULL,"txdata is null\n"); sf_offset = subframe*frame_parms->samples_per_tti; if (((double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe] + @@ -499,10 +517,12 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM frame_parms->ofdm_symbol_size, 14, (double)PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe]-10*log10((double)PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]), + 1, + NULL, PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]); // This make the previous argument the total power LOG_D(OCM,"[SIM][UL] UE %d tx_pwr %f dBm (target %d dBm, num_RE %d) for subframe %d (sf_offset %d)\n", UE_id, - 10*log10(tx_pwr), + 10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe]), PHY_vars_UE_g[UE_id][CC_id]->tx_power_dBm[subframe], PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe], subframe,sf_offset); @@ -520,10 +540,17 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM UE2RU[UE_id][ru_id][CC_id]->path_loss_dB); rx_pwr = signal_energy_fp(r_re0,r_im0,nb_antennas_rx,frame_parms->samples_per_tti,0); - LOG_D(OCM,"[SIM][UL] eNB %d : rx_pwr %f dBm (%f) for subframe %d, sptti %d\n", - ru_id,10*log10(rx_pwr),rx_pwr,subframe,frame_parms->samples_per_tti); - - + LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (tx_pwr - PL %f) for subframe %d, sptti %d\n", + ru_id,nb_antennas_rx,UE2RU[UE_id][ru_id][CC_id]->nb_rx,10*log10(rx_pwr),10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])+UE2RU[UE_id][ru_id][CC_id]->path_loss_dB,subframe,frame_parms->samples_per_tti); + /* + if (abs(10*log10(rx_pwr)-10*log10(tx_pwr*PHY_vars_UE_g[UE_id][CC_id]->tx_total_RE[subframe])-UE2RU[UE_id][ru_id][CC_id]->path_loss_dB)>3) { + write_output("txsig_re.m","s_re",s_re[0],frame_parms->samples_per_tti,1,7); + write_output("txsig_im.m","s_im",s_im[0],frame_parms->samples_per_tti,1,7); + write_output("rxsig_re.m","r_re",r_re0[0],frame_parms->samples_per_tti,1,7); + write_output("rxsig_im.m","r_im",r_im0[0],frame_parms->samples_per_tti,1,7); + exit(-1); + }*/ + if (UE2RU[UE_id][ru_id][CC_id]->first_run == 1) UE2RU[UE_id][ru_id][CC_id]->first_run = 0; @@ -542,6 +569,10 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM double *r_re_p[2] = {r_re_UL[ru_id][0],r_re_UL[ru_id][1]}; double *r_im_p[2] = {r_im_UL[ru_id][0],r_im_UL[ru_id][1]}; + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0); + LOG_D(OCM,"[SIM][UL] RU %d (%d/%d rx antennas) : rx_pwr %f dBm (before RF) for subframe %d, gain %f\n", + ru_id,nb_antennas_rx,nb_antennas_rx,10*log10(rx_pwr),subframe, + (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227); rf_rx_simple(r_re_p, r_im_p, nb_antennas_rx, @@ -550,8 +581,9 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx - 66.227); // rx_gain (dB) (66.227 = 20*log10(pow2(11)) = gain from the adc that will be applied later) #ifdef DEBUG_SIM - rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d\n",10*log10(rx_pwr),subframe); + rx_pwr = signal_energy_fp(r_re_p,r_im_p,nb_antennas_rx,frame_parms->samples_per_tti,0);//*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL; + LOG_D(OCM,"[SIM][UL] rx_pwr (ADC in) %f dB for subframe %d (rx_gain %f)\n",10*log10(rx_pwr),subframe, + (double)RC.ru[ru_id]->max_rxgain-(double)RC.ru[ru_id]->att_rx); #endif rxdata = RC.ru[ru_id]->common.rxdata; @@ -569,7 +601,7 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM #ifdef DEBUG_SIM rx_pwr2 = signal_energy(rxdata[0]+sf_offset,frame_parms->samples_per_tti)*(double)frame_parms->ofdm_symbol_size/(12.0*frame_parms->N_RB_DL); - LOG_D(OCM,"[SIM][UL] RU %d rx_pwr (ADC out) %f dB (%d) for subframe %d (offset %d)\n",ru_id,10*log10((double)rx_pwr2),rx_pwr2,subframe,sf_offset); + LOG_D(OCM,"[SIM][UL] RU %d rx_pwr (ADC out) %f dB (%d) for subframe %d (offset %d) = %p\n",ru_id,10*log10((double)rx_pwr2),rx_pwr2,subframe,sf_offset,rxdata[0]+sf_offset); #else UNUSED_VARIABLE(tx_pwr); UNUSED_VARIABLE(rx_pwr); diff --git a/targets/SIMU/USER/oaisim.c b/targets/SIMU/USER/oaisim.c index 999e2dd8547..12e1352eb2b 100644 --- a/targets/SIMU/USER/oaisim.c +++ b/targets/SIMU/USER/oaisim.c @@ -705,7 +705,6 @@ l2l1_task (void *args_p) for (sf = 0; sf < 10; sf++) { LOG_D(EMU,"************************* Subframe %d\n",sf); - start_meas (&oaisim_stats_f); wait_for_slot_isr (); @@ -732,12 +731,13 @@ l2l1_task (void *args_p) CC_id=0; int all_done=0; + while (all_done==0) { pthread_mutex_lock(&subframe_mutex); int subframe_ru_mask_local = subframe_ru_mask; int subframe_UE_mask_local = subframe_UE_mask; pthread_mutex_unlock(&subframe_mutex); - LOG_D(EMU,"Frame %d, Subframe %d: Checking masks %x,%x\n",frame,sf,subframe_ru_mask,subframe_UE_mask); + LOG_D(EMU,"Frame %d, Subframe %d: Checking masks %x,%x\n",frame,sf,subframe_ru_mask_local,subframe_UE_mask_local); if ((subframe_ru_mask_local == ((1<<NB_RU)-1)) && (subframe_UE_mask_local == ((1<<NB_UE_INST)-1))) all_done=1; @@ -745,6 +745,7 @@ l2l1_task (void *args_p) usleep(1500); } + //clear subframe masks for next round pthread_mutex_lock(&subframe_mutex); subframe_ru_mask=0; @@ -761,9 +762,11 @@ l2l1_task (void *args_p) */ for (ru_id=0;ru_id<NB_RU;ru_id++) { current_ru_rx_timestamp[ru_id][CC_id] += RC.ru[ru_id]->frame_parms.samples_per_tti; + LOG_D(EMU,"RU %d/%d: TS %llu\n",ru_id,CC_id,current_ru_rx_timestamp[ru_id][CC_id]); } for (UE_inst = 0; UE_inst<NB_UE_INST;UE_inst++) { current_UE_rx_timestamp[UE_inst][CC_id] += PHY_vars_UE_g[UE_inst][CC_id]->frame_parms.samples_per_tti; + LOG_D(EMU,"UE %d/%d: TS %llu\n",UE_id,CC_id,current_UE_rx_timestamp[UE_inst][CC_id]); } @@ -817,14 +820,14 @@ l2l1_task (void *args_p) if(eNB_avg_thr) fprintf(eNB_avg_thr,"%d %d\n",RC.eNB[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx, (RC.eNB[eNB_inst][0]->total_system_throughput)/((RC.eNB[eNB_inst][0]->proc.proc_rxtx[sf&1].frame_tx+1)*10)); - + /* if (eNB_stats[eNB_inst]) { len = dump_eNB_stats(RC.eNB[eNB_inst][0], stats_buffer, 0); rewind (eNB_stats[eNB_inst]); fwrite (stats_buffer, 1, len, eNB_stats[eNB_inst]); fflush(eNB_stats[eNB_inst]); } - + */ #ifdef OPENAIR2 if (eNB_l2_stats) { @@ -1214,6 +1217,7 @@ void wait_RUs() { // copy frame parameters from RU to UEs for (i=0;i<NB_UE_INST;i++) { PHY_vars_UE_g[i][0]->frame_parms.N_RB_DL = RC.ru[0]->frame_parms.N_RB_DL; + PHY_vars_UE_g[i][0]->frame_parms.N_RB_UL = RC.ru[0]->frame_parms.N_RB_UL; PHY_vars_UE_g[i][0]->frame_parms.nb_antennas_tx = 1; PHY_vars_UE_g[i][0]->frame_parms.nb_antennas_rx = 1; // set initially to 2, it will be revised after initial synchronization @@ -1229,7 +1233,7 @@ void wait_RUs() { PHY_vars_UE_g[i][0]->frame_parms.ul_CarrierFreq, PHY_vars_UE_g[i][0]->frame_parms.eutra_band); - current_UE_rx_timestamp[i][0] = RC.ru[0]->frame_parms.samples_per_tti; + current_UE_rx_timestamp[i][0] = RC.ru[0]->frame_parms.samples_per_tti + RC.ru[0]->frame_parms.ofdm_symbol_size + RC.ru[0]->frame_parms.nb_prefix_samples0; } diff --git a/targets/SIMU/USER/oaisim.h b/targets/SIMU/USER/oaisim.h index d405e0493bc..adf4b3c1b72 100644 --- a/targets/SIMU/USER/oaisim.h +++ b/targets/SIMU/USER/oaisim.h @@ -48,7 +48,11 @@ void do_UL_sig(channel_desc_t *UE2RU[NUMBER_OF_UE_MAX][NUMBER_OF_RU_MAX][MAX_NUM uint32_t frame,int eNB_id,uint8_t CC_id); void do_DL_sig(channel_desc_t *RU2UE[NUMBER_OF_RU_MAX][NUMBER_OF_UE_MAX][MAX_NUM_CCs], - node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX],uint16_t subframe,uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id); + node_desc_t *enb_data[NUMBER_OF_RU_MAX],node_desc_t *ue_data[NUMBER_OF_UE_MAX], + uint16_t subframe, + uint16_t offset, + uint16_t length, + uint8_t abstraction_flag,LTE_DL_FRAME_PARMS *frame_parms,uint8_t UE_id,int CC_id); void init_ue(node_desc_t *ue_data, UE_Antenna ue_ant);//Abstraction changes void init_enb(node_desc_t *enb_data, eNB_Antenna enb_ant);//Abstraction changes diff --git a/targets/SIMU/USER/oaisim_functions.c b/targets/SIMU/USER/oaisim_functions.c index f9959ebd49c..c50f171923a 100644 --- a/targets/SIMU/USER/oaisim_functions.c +++ b/targets/SIMU/USER/oaisim_functions.c @@ -1064,10 +1064,6 @@ int ru_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** usleep(500); } - // tell top-level we are busy - pthread_mutex_lock(&subframe_mutex); - subframe_ru_mask|=(1<<ru_id); - pthread_mutex_unlock(&subframe_mutex); subframe = (last_ru_rx_timestamp[ru_id][CC_id]/RC.ru[ru_id]->frame_parms.samples_per_tti)%10; LOG_D(EMU,"RU_trx_read generating UL subframe %d (Ts %llu, current TS %llu)\n", @@ -1097,13 +1093,13 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** int UE_id = device->Mod_id; int CC_id = device->CC_id; - int subframe; + int subframe,new_subframe; int sample_count=0; int read_size; *ptimestamp = last_UE_rx_timestamp[UE_id][CC_id]; - LOG_D(EMU,"UE_trx_read nsamps %d TS(%llu,%llu) antenna %d\n",nsamps, + LOG_D(EMU,"[TXPATH]UE_trx_read nsamps %d TS %llu (%llu) antenna %d\n",nsamps, (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id], (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id], cc); @@ -1116,29 +1112,23 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** while (sample_count<nsamps) { while (current_UE_rx_timestamp[UE_id][CC_id] < (last_UE_rx_timestamp[UE_id][CC_id]+read_size)) { - LOG_D(EMU,"UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]); + LOG_D(EMU,"[TXPATH]UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]); usleep(500); } // LOG_D(EMU,"UE_trx_read : current TS %d, last TS %d, sleeping\n",current_UE_rx_timestamp[UE_id][CC_id],last_UE_rx_timestamp[UE_id][CC_id]); - - // tell top-level we are busy - pthread_mutex_lock(&subframe_mutex); - subframe_UE_mask|=(1<<UE_id); - pthread_mutex_unlock(&subframe_mutex); - - - // otherwise we have one subframe here so generate the received signal + // if we cross a subframe-boundary subframe = (last_UE_rx_timestamp[UE_id][CC_id]/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10; - if ((last_UE_rx_timestamp[UE_id][CC_id]%PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti) > 0) - subframe++; + new_subframe = ((last_UE_rx_timestamp[UE_id][CC_id]+read_size)/PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti)%10; + if (new_subframe!=subframe) { + // tell top-level we are busy + pthread_mutex_lock(&subframe_mutex); + subframe_UE_mask|=(1<<UE_id); + LOG_D(EMU,"Setting UE_id %d mask to busy (%d)\n",UE_id,subframe_UE_mask); + pthread_mutex_unlock(&subframe_mutex); - last_UE_rx_timestamp[UE_id][CC_id] += read_size; - sample_count += read_size; - - if (subframe > 9) - return(nsamps); + } LOG_D(PHY,"UE_trx_read generating DL subframe %d (Ts %llu, current TS %llu)\n", subframe,(unsigned long long)*ptimestamp, @@ -1147,11 +1137,24 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** enb_data, ue_data, subframe, + last_UE_rx_timestamp[UE_id][CC_id]%PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti, + nsamps, 0, //abstraction_flag, &PHY_vars_UE_g[UE_id][CC_id]->frame_parms, UE_id, CC_id); + LOG_D(EMU,"[TXPATH]UE_trx_read @ TS %llu (%llu)=> frame %d, subframe %d\n", + (unsigned long long)current_UE_rx_timestamp[UE_id][CC_id], + (unsigned long long)last_UE_rx_timestamp[UE_id][CC_id], + ((unsigned long long)last_UE_rx_timestamp[UE_id][CC_id]/(PHY_vars_UE_g[UE_id][CC_id]->frame_parms.samples_per_tti*10))&1023, + subframe); + + last_UE_rx_timestamp[UE_id][CC_id] += read_size; + sample_count += read_size; + + + } @@ -1159,8 +1162,34 @@ int UE_trx_read(openair0_device *device, openair0_timestamp *ptimestamp, void ** return(nsamps); } +extern double ru_amp[NUMBER_OF_RU_MAX]; + int ru_trx_write(openair0_device *device,openair0_timestamp timestamp, void **buff, int nsamps, int cc, int flags) { + int ru_id = device->Mod_id; + + LTE_DL_FRAME_PARMS *frame_parms = &RC.ru[ru_id]->frame_parms; + + pthread_mutex_lock(&subframe_mutex); + LOG_D(EMU,"[TXPATH] ru_trx_write: RU %d mask %d\n",ru_id,subframe_ru_mask); + pthread_mutex_unlock(&subframe_mutex); + + // compute amplitude of TX signal from first symbol in subframe + // note: assumes that the packet is an entire subframe + + ru_amp[ru_id] = 0; + for (int aa=0; aa<RC.ru[ru_id]->nb_tx; aa++) { + ru_amp[ru_id] += (double)signal_energy((int32_t*)buff[aa],frame_parms->ofdm_symbol_size)/(12*frame_parms->N_RB_DL); + } + ru_amp[ru_id] = sqrt(ru_amp[ru_id]); + + LOG_D(EMU,"Setting amp for RU %d to %f (%d)\n",ru_id,ru_amp[ru_id], dB_fixed((double)signal_energy((int32_t*)buff[0],frame_parms->ofdm_symbol_size))); + // tell top-level we are done + pthread_mutex_lock(&subframe_mutex); + subframe_ru_mask|=(1<<ru_id); + LOG_D(EMU,"Setting RU %d to busy\n",ru_id); + pthread_mutex_unlock(&subframe_mutex); + return(nsamps); } -- GitLab