From e09d843d14935082ec12f5e1c16e10a28b092cd3 Mon Sep 17 00:00:00 2001 From: knopp <knopp@mycompany.com> Date: Mon, 13 Jul 2015 15:43:48 +0000 Subject: [PATCH] Added bugfixes for PDCCH (not all). New --ue-dump--frame and --loop-memory option for lte-softmodem. Updates in PMCH/MCH transmission which were forgotten in recent DLSCH/PDSCH changes. mbmssim works again. git-svn-id: http://svn.eurecom.fr/openair4G/trunk@7702 818b1a75-f10b-46b9-bf7c-635c3b92a50f --- openair1/PHY/CODING/lte_rate_matching.c | 2 +- openair1/PHY/INIT/lte_init.c | 2 +- openair1/PHY/LTE_TRANSPORT/dci.c | 72 ++++++------ openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c | 42 +++---- openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c | 11 +- openair1/PHY/LTE_TRANSPORT/pcfich.c | 6 +- openair1/PHY/LTE_TRANSPORT/phich.c | 50 +++++--- openair1/PHY/TOOLS/Makefile | 2 +- openair1/PHY/TOOLS/lte_dfts.c | 62 ++++++++-- openair1/PHY/defs.h | 2 +- openair1/SCHED/phy_procedures_lte_eNb.c | 7 +- openair1/SCHED/phy_procedures_lte_ue.c | 108 ++++++++++-------- openair1/SIMULATION/LTE_PHY/dlsim.c | 2 +- openair1/SIMULATION/LTE_PHY/mbmssim.c | 16 ++- openair1/SIMULATION/LTE_PHY/pdcchsim.c | 3 +- openair2/RRC/LITE/rrc_UE.c | 2 +- openair2/RRC/LITE/rrc_eNB.c | 2 +- .../ETHERNET/USERSPACE/LIB/ethernet_lib.c | 5 + targets/RT/USER/lte-softmodem.c | 58 +++++++--- 19 files changed, 284 insertions(+), 170 deletions(-) diff --git a/openair1/PHY/CODING/lte_rate_matching.c b/openair1/PHY/CODING/lte_rate_matching.c index 9aa18db9bda..837665ceda1 100644 --- a/openair1/PHY/CODING/lte_rate_matching.c +++ b/openair1/PHY/CODING/lte_rate_matching.c @@ -711,7 +711,7 @@ int lte_rate_matching_turbo_rx(uint32_t RTC, #endif if (Kmimo==0 || Mdlharq==0 || C==0 || Qm==0 || Nl==0) { - msg("lte_rate_matching.c: invalid parameters (Kmimo %d, Mdlharq %d, C %d, Qm %d, Nl %d\n", + printf("lte_rate_matching.c: invalid parameters (Kmimo %d, Mdlharq %d, C %d, Qm %d, Nl %d\n", Kmimo,Mdlharq,C,Qm,Nl); return(-1); } diff --git a/openair1/PHY/INIT/lte_init.c b/openair1/PHY/INIT/lte_init.c index b4c964ce2e2..36bb40f3475 100644 --- a/openair1/PHY/INIT/lte_init.c +++ b/openair1/PHY/INIT/lte_init.c @@ -1231,7 +1231,7 @@ int phy_init_lte_eNB(PHY_VARS_eNB *phy_vars_eNB, LTE_eNB_PUSCH** const eNB_pusch_vars = phy_vars_eNB->lte_eNB_pusch_vars; LTE_eNB_SRS* const eNB_srs_vars = phy_vars_eNB->lte_eNB_srs_vars; LTE_eNB_PRACH* const eNB_prach_vars = &phy_vars_eNB->lte_eNB_prach_vars; - int i, j, eNB_id, UE_id; + int i, j, eNB_id, UE_id; phy_vars_eNB->total_dlsch_bitrate = 0; phy_vars_eNB->total_transmitted_bits = 0; diff --git a/openair1/PHY/LTE_TRANSPORT/dci.c b/openair1/PHY/LTE_TRANSPORT/dci.c index 2e485e66fa0..541349fa552 100644 --- a/openair1/PHY/LTE_TRANSPORT/dci.c +++ b/openair1/PHY/LTE_TRANSPORT/dci.c @@ -139,7 +139,7 @@ uint16_t extract_crc(uint8_t *dci,uint8_t dci_len) printf("extract_crc: crc %x\n",crc); */ #ifdef DEBUG_DCI_DECODING - msg("dci_crc (%x,%x,%x), dci_len&0x7=%d\n",dci[dci_len>>3],dci[1+(dci_len>>3)],dci[2+(dci_len>>3)], + LOG_I(PHY,"dci_crc (%x,%x,%x), dci_len&0x7=%d\n",dci[dci_len>>3],dci[1+(dci_len>>3)],dci[2+(dci_len>>3)], dci_len&0x7); #endif @@ -152,7 +152,7 @@ uint16_t extract_crc(uint8_t *dci,uint8_t dci_len) } #ifdef DEBUG_DCI_DECODING - msg("dci_crc =>%x\n",crc16); + LOG_I(PHY,"dci_crc =>%x\n",crc16); #endif // dci[(dci_len>>3)]&=(0xffff<<(dci_len&0xf)); @@ -396,11 +396,11 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm // if REG is allocated to PHICH, skip it if (check_phich_reg(frame_parms,kprime,lprime,mi) == 1) { - //msg("dci_demapping : skipping REG %d\n",(lprime==0)?kprime/6 : kprime>>2); - if ((lprime == 0)&&((kprime%6)==0)) - re_offset0+=4; + // printf("dci_demapping : skipping REG %d (RE %d)\n",(lprime==0)?kprime/6 : kprime>>2,kprime); + if ((lprime == 0)&&((kprime%6)==0)) + re_offset0+=4; } else { // not allocated to PHICH/PCFICH - // msg("dci_demapping: REG %d\n",(lprime==0)?kprime/6 : kprime>>2); + // printf("dci_demapping: REG %d\n",(lprime==0)?kprime/6 : kprime>>2); if (lprime == 0) { // first symbol, or second symbol+4 TX antennas skip pilots kprime_mod12 = kprime%12; @@ -411,7 +411,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm for (i=0; i<4; i++) { wbar[mprime] = llr[tti_offset0+i]; #ifdef DEBUG_DCI_DECODING - msg("[PHY] PDCCH demapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset0,symbol_offset,re_offset0,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); + LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset0+i,symbol_offset,re_offset0,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); #endif mprime++; re_offset0++; @@ -427,7 +427,7 @@ void pdcch_demapping(uint16_t *llr,uint16_t *wbar,LTE_DL_FRAME_PARMS *frame_parm for (i=0; i<4; i++) { wbar[mprime] = llr[tti_offset+i]; #ifdef DEBUG_DCI_DECODING - msg("[PHY] PDCCH demapping mprime %d => %d (symbol %d re %d) -> (%d,%d)\n",mprime,tti_offset,symbol_offset,re_offset+i,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); + LOG_I(PHY,"PDCCH demapping mprime %d.%d <= llr %d (symbol %d re %d) -> (%d,%d)\n",mprime/4,i,tti_offset+i,symbol_offset,re_offset+i,*(char*)&wbar[mprime],*(1+(char*)&wbar[mprime])); #endif mprime++; } @@ -466,8 +466,6 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t // undo permutation for (i=0; i<Mquad; i++) { - //wptr = &wtemp_rx[i<<2]; - //wptr2 = &wbar[((i+frame_parms->Nid_cell)%Mquad)<<2]; wptr = &wtemp_rx[((i+frame_parms->Nid_cell)%Mquad)<<2]; wptr2 = &wbar[i<<2]; @@ -475,16 +473,16 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t wptr[1] = wptr2[1]; wptr[2] = wptr2[2]; wptr[3] = wptr2[3]; - /* - msg("pdcch_deinterleaving (%p,%p): quad %d -> (%d,%d %d,%d %d,%d %d,%d)\n",wptr,wptr2,i, - ((char*)wptr2)[0], - ((char*)wptr2)[1], - ((char*)wptr2)[2], - ((char*)wptr2)[3], - ((char*)wptr2)[4], - ((char*)wptr2)[5], - ((char*)wptr2)[6], - ((char*)wptr2)[7]); + /* + printf("pdcch_deinterleaving (%p,%p): quad %d (%d) -> (%d,%d %d,%d %d,%d %d,%d)\n",wptr,wptr2,i,(i+frame_parms->Nid_cell)%Mquad, + ((char*)wptr2)[0], + ((char*)wptr2)[1], + ((char*)wptr2)[2], + ((char*)wptr2)[3], + ((char*)wptr2)[4], + ((char*)wptr2)[5], + ((char*)wptr2)[6], + ((char*)wptr2)[7]); */ } @@ -514,7 +512,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t zptr[2] = wptr[2]; zptr[3] = wptr[3]; - /* + /* printf("deinterleaving ; k %d, index-Nd %d => (%d,%d,%d,%d,%d,%d,%d,%d)\n",k,(index-ND), ((int8_t *)wptr)[0], ((int8_t *)wptr)[1], @@ -524,7 +522,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t ((int8_t *)wptr)[5], ((int8_t *)wptr)[6], ((int8_t *)wptr)[7]); - */ + */ k++; } @@ -545,7 +543,7 @@ void pdcch_deinterleaving(LTE_DL_FRAME_PARMS *frame_parms,uint16_t *z, uint16_t ((int8_t *)zptr)[5], ((int8_t *)zptr)[6], ((int8_t *)zptr)[7]); - */ + */ } } @@ -922,7 +920,7 @@ void pdcch_extract_rbs_single(int32_t **rxdataF, symbol_mod = (symbol>=(7-frame_parms->Ncp)) ? symbol-(7-frame_parms->Ncp) : symbol; #ifdef DEBUG_DCI_DECODING - msg("[PHY] extract_rbs_single: symbol_mod %d\n",symbol_mod); + LOG_I(PHY, "extract_rbs_single: symbol_mod %d\n",symbol_mod); #endif for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) { @@ -1392,7 +1390,7 @@ void pdcch_channel_compensation(int32_t **rxdataF_ext, #ifdef DEBUG_DCI_DECODING - msg("[PHY] PDCCH comp: symbol %d\n",symbol); + LOG_I(PHY, "PDCCH comp: symbol %d\n",symbol); #endif if (symbol==0) @@ -1756,9 +1754,9 @@ int32_t rx_pdcch(LTE_UE_COMMON *lte_ue_common_vars, for (aarx=0; aarx<frame_parms->nb_antennas_rx; aarx++) avgs = cmax(avgs,avgP[(aarx<<1)+aatx]); - log2_maxh = (log2_approx(avgs)/2) + 2 + frame_parms->nb_antennas_rx - 1; + log2_maxh = (log2_approx(avgs)/2) + 6 + frame_parms->nb_antennas_rx - 1; #ifdef DEBUG_PHY - msg("[PDCCH] log2_maxh = %d (%d,%d)\n",log2_maxh,avgP[0],avgs); + LOG_I(PHY,"subframe %d: pdcch log2_maxh = %d (%d,%d)\n",subframe,log2_maxh,avgP[0],avgs); #endif @@ -1946,16 +1944,17 @@ void pdcch_unscrambling(LTE_DL_FRAME_PARMS *frame_parms, x2 = (subframe<<9) + frame_parms->Nid_cell; //this is c_init in 36.211 Sec 6.8.2 for (i=0; i<length; i++) { - if (i%32==0) { + if ((i&0x1f)==0) { s = lte_gold_generic(&x1, &x2, reset); - //printf("lte_gold[%d]=%x\n",i,s); + // printf("lte_gold[%d]=%x\n",i,s); reset = 0; } - // take the quarter of the PBCH that corresponds to this frame - // printf("unscrambling %d : e %d, c %d\n",i,llr[i],((s>>(i&0x1f))&1)); + + // printf("unscrambling %d : e %d, c %d => ",i,llr[i],((s>>(i&0x1f))&1)); if (((s>>(i%32))&1)==0) llr[i] = -llr[i]; + // printf("%d\n",llr[i]); } } @@ -2013,7 +2012,7 @@ uint8_t get_num_pdcch_symbols(uint8_t num_dci, } - msg("[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); //} @@ -2093,10 +2092,10 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, y[1] = &yseq1[0]; // reset all bits to <NIL>, here we set <NIL> elements as 2 - //memset(e, 2, DCI_BITS_MAX); - // here we interpret NIL as a random QPSK sequence. That makes power estimation easier. - for (i=0; i<DCI_BITS_MAX; i++) - e[i]=0;//taus()&1; + memset(e, 2, DCI_BITS_MAX); + // // here we interpret NIL as a random QPSK sequence. That makes power estimation easier. + // for (i=0; i<DCI_BITS_MAX; i++) + // e[i]=2;//taus()&1; e_ptr = e; @@ -2173,7 +2172,6 @@ uint8_t generate_dci_top(uint8_t num_ue_spec_dci, //((int16_t*)(&(y[1][i])))[0] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; ((int16_t*)(&(y[0][i])))[0] = (*e_ptr == 2) ? 0 : (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; ((int16_t*)(&(y[1][i])))[0] = (*e_ptr == 2) ? 0 : (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; - e_ptr++; //((int16_t*)(&(y[0][i])))[1] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; //((int16_t*)(&(y[1][i])))[1] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c index 549464b2cf2..532570adf2a 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_decoding.c @@ -45,7 +45,7 @@ #include "SCHED/extern.h" #include "SIMULATION/TOOLS/defs.h" //#define DEBUG_DLSCH_DECODING - + void free_ue_dlsch(LTE_UE_DLSCH_t *dlsch) { @@ -325,7 +325,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, } #ifdef DEBUG_DLSCH_DECODING - msg("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? harq_process->F : 0); + printf("f1 %d, f2 %d, F %d\n",f1f2mat_old[2*iind],f1f2mat_old[1+(2*iind)],(r==0) ? harq_process->F : 0); #endif start_meas(dlsch_rate_unmatching_stats); @@ -363,7 +363,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, r, &E)==-1) { stop_meas(dlsch_rate_unmatching_stats); - msg("dlsch_decoding.c: Problem in rate_matching\n"); + LOG_E(PHY,"dlsch_decoding.c: Problem in rate_matching\n"); return(dlsch->max_turbo_iterations); } else stop_meas(dlsch_rate_unmatching_stats); @@ -371,7 +371,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, r_offset += E; /* - msg("Subblock deinterleaving, d %p w %p\n", + printf("Subblock deinterleaving, d %p w %p\n", harq_process->d[r], harq_process->w); */ @@ -389,29 +389,29 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, write_output("decoder_in.m","dec",&harq_process->d[0][96],(3*8*Kr_bytes)+12,1,0); } - msg("decoder input(segment %d) :",r); + printf("decoder input(segment %d) :",r); int i; for (i=0;i<(3*8*Kr_bytes)+12;i++) - msg("%d : %d\n",i,harq_process->d[r][96+i]); - msg("\n");*/ + printf("%d : %d\n",i,harq_process->d[r][96+i]); + printf("\n");*/ #endif - // msg("Clearing c, %p\n",harq_process->c[r]); + // printf("Clearing c, %p\n",harq_process->c[r]); memset(harq_process->c[r],0,Kr_bytes); - // msg("done\n"); + // printf("done\n"); if (harq_process->C == 1) crc_type = CRC24_A; else crc_type = CRC24_B; /* - msg("decoder input(segment %d)\n",r); + printf("decoder input(segment %d)\n",r); for (i=0;i<(3*8*Kr_bytes)+12;i++) if ((harq_process->d[r][96+i]>7) || (harq_process->d[r][96+i] < -8)) - msg("%d : %d\n",i,harq_process->d[r][96+i]); - msg("\n"); + printf("%d : %d\n",i,harq_process->d[r][96+i]); + printf("\n"); */ if (err_flag == 0) { @@ -446,7 +446,7 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, if ((err_flag == 0) && (ret>=(1+dlsch->max_turbo_iterations))) {// a Code segment is in error so break; - //msg("CRC failed, segment %d\n",r); + //printf("CRC failed, segment %d\n",r); err_flag = 1; } @@ -479,9 +479,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, offset = 0; /* - msg("harq_pid %d\n",harq_pid); - msg("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3); - msg("C %d\n",harq_process->C); + printf("harq_pid %d\n",harq_pid); + printf("F %d, Fbytes %d\n",harq_process->F,harq_process->F>>3); + printf("C %d\n",harq_process->C); */ for (r=0; r<harq_process->C; r++) { if (r<harq_process->Cminus) @@ -497,9 +497,9 @@ uint32_t dlsch_decoding(PHY_VARS_UE *phy_vars_ue, &harq_process->c[0][(harq_process->F>>3)], Kr_bytes - (harq_process->F>>3)- ((harq_process->C>1)?3:0)); offset = Kr_bytes - (harq_process->F>>3) - ((harq_process->C>1)?3:0); - // msg("copied %d bytes to b sequence (harq_pid %d)\n", + // printf("copied %d bytes to b sequence (harq_pid %d)\n", // Kr_bytes - (harq_process->F>>3),harq_pid); - // msg("b[0] = %x,c[%d] = %x\n", + // printf("b[0] = %x,c[%d] = %x\n", // harq_process->b[0], // harq_process->F>>3, // harq_process->c[0][(harq_process->F>>3)]); @@ -689,7 +689,7 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, case 0: // SI dlsch_ue = phy_vars_ue->dlsch_ue_SI[eNB_id]; dlsch_eNB = PHY_vars_eNB_g[eNB_id2][CC_id]->dlsch_eNB_SI; - // msg("Doing SI: TBS %d\n",dlsch_ue->harq_processes[0]->TBS>>3); + // printf("Doing SI: TBS %d\n",dlsch_ue->harq_processes[0]->TBS>>3); memcpy(dlsch_ue->harq_processes[0]->b,dlsch_eNB->harq_processes[0]->b,dlsch_ue->harq_processes[0]->TBS>>3); #ifdef DEBUG_DLSCH_DECODING LOG_D(PHY,"SI Decoded\n"); @@ -790,9 +790,9 @@ uint32_t dlsch_decoding_emul(PHY_VARS_UE *phy_vars_ue, #ifdef DEBUG_DLSCH_DECODING for (i=0; i<dlsch_ue->harq_processes[0]->TBS>>3; i++) - msg("%x.",dlsch_eNB->harq_processes[0]->b[i]); + printf("%x.",dlsch_eNB->harq_processes[0]->b[i]); - msg("\n"); + printf("\n"); #endif /* diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c index 5012d0ac3f4..376ba35ed35 100644 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_modulation.c @@ -1007,7 +1007,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, uint8_t first_re,last_re; int inc; #ifdef DEBUG_DLSCH_MODULATION - printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj]); + printf("allocate_re_MCH (mod %d): symbol_offset %d re_offset %d (%d), jj %d -> %d,%d, gain_lin_QPSK %d,txdataF %p\n",mod_order,symbol_offset,re_offset,skip_dc,*jj, x0[*jj], x0[1+*jj],gain_lin_QPSK,&txdataF[0][symbol_offset]); #endif last_re=12; @@ -1035,7 +1035,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, switch (mod_order) { case 2: //QPSK - // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // printf("%d : %d,%d => ",tti_offset,((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) ((int16_t*)&txdataF[aa][tti_offset])[0] += (x0[*jj]==1) ? (-gain_lin_QPSK) : gain_lin_QPSK; //I //b_i @@ -1046,7 +1046,7 @@ int allocate_REs_in_RB_MCH(mod_sym_t **txdataF, *jj = *jj + 1; - // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); + // printf("%d,%d\n",((int16_t*)&txdataF[0][tti_offset])[0],((int16_t*)&txdataF[0][tti_offset])[1]); break; case 4: //16QAM @@ -1498,7 +1498,6 @@ int mch_modulation(mod_sym_t **txdataF, LTE_DL_FRAME_PARMS *frame_parms, LTE_eNB_DLSCH_t *dlsch) { - uint8_t nsymb,nsymb_pmch; uint32_t i,jj,re_allocated,symbol_offset; uint16_t l,rb,re_offset; @@ -1526,7 +1525,7 @@ int mch_modulation(mod_sym_t **txdataF, for (l=2; l<nsymb_pmch; l++) { #ifdef DEBUG_DLSCH_MODULATION - msg("Generating MCH (mod %d) in %d\n",mod_order, l); + printf("Generating MCH (mod %d) in subframe %d for symbol %d\n",mod_order, subframe_offset,l); #endif re_offset = frame_parms->first_carrier_offset; @@ -1552,7 +1551,7 @@ int mch_modulation(mod_sym_t **txdataF, else qam_table_s = NULL; - // printf("Allocated rb %d, subframe_offset %d\n",rb,subframe_offset); + // printf("Allocated rb %d, subframe_offset %d,amp %d\n",rb,subframe_offset,amp); allocate_REs_in_RB_MCH(txdataF, &jj, re_offset, diff --git a/openair1/PHY/LTE_TRANSPORT/pcfich.c b/openair1/PHY/LTE_TRANSPORT/pcfich.c index b2c8ffb6776..8e9038666bd 100644 --- a/openair1/PHY/LTE_TRANSPORT/pcfich.c +++ b/openair1/PHY/LTE_TRANSPORT/pcfich.c @@ -78,9 +78,9 @@ void generate_pcfich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) first_reg = pcfich_reg[3]; } -#ifdef DEBUG_PCFICH - msg("[PHY] pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]); -#endif + //#ifdef DEBUG_PCFICH + printf("pcfich_reg : %d,%d,%d,%d\n",pcfich_reg[0],pcfich_reg[1],pcfich_reg[2],pcfich_reg[3]); + //#endif } void pcfich_scrambling(LTE_DL_FRAME_PARMS *frame_parms, diff --git a/openair1/PHY/LTE_TRANSPORT/phich.c b/openair1/PHY/LTE_TRANSPORT/phich.c index b7f0e3bda42..d9a67cb0ef9 100644 --- a/openair1/PHY/LTE_TRANSPORT/phich.c +++ b/openair1/PHY/LTE_TRANSPORT/phich.c @@ -291,6 +291,7 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) // compute Ngroup_PHICH (see formula at beginning of Section 6.9 in 36-211 Ngroup_PHICH = (frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)/48; + if (((frame_parms->phich_config_common.phich_resource*frame_parms->N_RB_DL)%48) > 0) Ngroup_PHICH++; @@ -299,16 +300,25 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) Ngroup_PHICH<<=1; } -#ifdef DEBUG_PHICH - LOG_D(PHY,"Ngroup_PHICH %d (phich_config_common.phich_resource %d,NidCell %d,Ncp %d, frame_type %d)\n",((frame_parms->Ncp == 0)?Ngroup_PHICH:(Ngroup_PHICH>>1)), - frame_parms->phich_config_common.phich_resource, - frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type); -#endif + //#ifdef DEBUG_PHICH + printf("Ngroup_PHICH %d (phich_config_common.phich_resource %d,phich_config_common.phich_duration %s, NidCell %d,Ncp %d, frame_type %d), smallest pcfich REG %d, n0 %d, n1 %d (first PHICH REG %d)\n", + ((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)), + frame_parms->phich_config_common.phich_resource, + frame_parms->phich_config_common.phich_duration==normal?"normal":"extended", + frame_parms->Nid_cell,frame_parms->Ncp,frame_parms->frame_type, + pcfich_reg[frame_parms->pcfich_first_reg_idx], + n0, + n1, + ((frame_parms->Nid_cell*n0)/n1)%n0); + //#endif - // This is the algorithm from Section 6.9.3 in 36-211 - for (mprime=0; mprime<((frame_parms->Ncp == 0)?Ngroup_PHICH:(Ngroup_PHICH>>1)); mprime++) { + // This is the algorithm from Section 6.9.3 in 36-211, it works only for normal PHICH duration for now ... - if (frame_parms->Ncp==0) { // normal prefix + for (mprime=0; + mprime<((frame_parms->Ncp == NORMAL)?Ngroup_PHICH:(Ngroup_PHICH>>1)); + mprime++) { + + if (frame_parms->phich_config_common.phich_duration==normal) { // normal PHICH duration frame_parms->phich_reg[mprime][0] = (frame_parms->Nid_cell + mprime)%n0; @@ -326,9 +336,10 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) frame_parms->phich_reg[mprime][1] = (frame_parms->Nid_cell + mprime + (n0/3))%n0; + if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[frame_parms->pcfich_first_reg_idx]) frame_parms->phich_reg[mprime][1]++; - + if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+1)&3]) frame_parms->phich_reg[mprime][1]++; @@ -337,9 +348,10 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) if (frame_parms->phich_reg[mprime][1]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3]) frame_parms->phich_reg[mprime][1]++; + frame_parms->phich_reg[mprime][2] = (frame_parms->Nid_cell + mprime + (2*n0/3))%n0; - + if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[frame_parms->pcfich_first_reg_idx]) frame_parms->phich_reg[mprime][2]++; @@ -351,11 +363,11 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) if (frame_parms->phich_reg[mprime][2]>=pcfich_reg[(frame_parms->pcfich_first_reg_idx+3)&3]) frame_parms->phich_reg[mprime][2]++; - -#ifdef DEBUG_PHICH - LOG_D(PHY,"phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); -#endif - } else { // extended prefix + + //#ifdef DEBUG_PHICH + printf("phich_reg :%d => %d,%d,%d\n",mprime,frame_parms->phich_reg[mprime][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); + //#endif + } else { // extended PHICH duration frame_parms->phich_reg[mprime<<1][0] = (frame_parms->Nid_cell + mprime)%n0; frame_parms->phich_reg[1+(mprime<<1)][0] = (frame_parms->Nid_cell + mprime)%n0; @@ -364,10 +376,10 @@ void generate_phich_reg_mapping(LTE_DL_FRAME_PARMS *frame_parms) frame_parms->phich_reg[1+(mprime<<1)][1] = ((frame_parms->Nid_cell*n1/n0) + mprime + (n1/3))%n1; frame_parms->phich_reg[1+(mprime<<1)][2] = ((frame_parms->Nid_cell*n2/n0) + mprime + (2*n2/3))%n2; -#ifdef DEBUG_PHICH - LOG_D(PHY,"phich_reg :%d => %d,%d,%d\n",mprime<<1,frame_parms->phich_reg[mprime<<1][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); - LOG_D(PHY,"phich_reg :%d => %d,%d,%d\n",1+(mprime<<1),frame_parms->phich_reg[1+(mprime<<1)][0],frame_parms->phich_reg[1+(mprime<<1)][1],frame_parms->phich_reg[1+(mprime<<1)][2]); -#endif + //#ifdef DEBUG_PHICH + printf("phich_reg :%d => %d,%d,%d\n",mprime<<1,frame_parms->phich_reg[mprime<<1][0],frame_parms->phich_reg[mprime][1],frame_parms->phich_reg[mprime][2]); + printf("phich_reg :%d => %d,%d,%d\n",1+(mprime<<1),frame_parms->phich_reg[1+(mprime<<1)][0],frame_parms->phich_reg[1+(mprime<<1)][1],frame_parms->phich_reg[1+(mprime<<1)][2]); + //#endif } } // mprime loop } // num_pdcch_symbols loop diff --git a/openair1/PHY/TOOLS/Makefile b/openair1/PHY/TOOLS/Makefile index 1a18e6e0610..d50cde372f2 100644 --- a/openair1/PHY/TOOLS/Makefile +++ b/openair1/PHY/TOOLS/Makefile @@ -1,5 +1,5 @@ lte_dfts: lte_dfts.c - gcc -O3 -msse4.1 -o lte_dfts lte_dfts.c fft.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS + gcc -O3 -mavx2 -o lte_dfts lte_dfts.c time_meas.c file_output.c ../../SIMULATION/TOOLS/taus.c -I$$OPENAIR1_DIR -I$$OPENAIR_TARGETS -I$$OPENAIR2_DIR/COMMON -DUSER_MODE -DMR_MAIN -DNB_ANTENNAS_RX=1 # -DD256STATS #-DD64STATS dft_cycles: lte_dfts ./lte_dfts | egrep cycles diff --git a/openair1/PHY/TOOLS/lte_dfts.c b/openair1/PHY/TOOLS/lte_dfts.c index f2eb3f0e65a..22649ae7b34 100644 --- a/openair1/PHY/TOOLS/lte_dfts.c +++ b/openair1/PHY/TOOLS/lte_dfts.c @@ -53,8 +53,11 @@ #define print_shorts(s,x) printf("%s %d,%d,%d,%d,%d,%d,%d,%d\n",s,(x)[0],(x)[1],(x)[2],(x)[3],(x)[4],(x)[5],(x)[6],(x)[7]) #define print_ints(s,x) printf("%s %d %d %d %d\n",s,(x)[0],(x)[1],(x)[2],(x)[3]) -static int16_t conjugatedft[8] __attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; +#ifdef AVX2 +static int16_t conjugatedft2[16] __attribute__((aligned(32))) = {1,1,1,1,1,1,1,1,-1,1,-1,1,-1,1,-1,1,-1,1}; +#endif +static int16_t conjugatedft[8] __attribute__((aligned(16))) = {-1,1,-1,1,-1,1,-1,1} ; static short reflip[8] __attribute__((aligned(16))) = {1,-1,1,-1,1,-1,1,-1}; @@ -857,8 +860,23 @@ static inline void bfly4_tw1(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, static inline void bfly4_tw1(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, __m128i *y0,__m128i *y1,__m128i *y2,__m128i *y3) { - register __m128i x1_flip,x3_flip; + register __m128i x1_flip,x3_flip,x02t,x13t; + register __m128i complex_shuffle = _mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2); + + x02t = _mm_adds_epi16(*(x0),*(x2)); + x13t = _mm_adds_epi16(*(x1),*(x3)); + *(y0) = _mm_adds_epi16(x02t,x13t); + *(y2) = _mm_subs_epi16(x02t,x13t); + x1_flip = _mm_sign_epi16(*(x1),*(__m128i*)conjugatedft); + x1_flip = _mm_shuffle_epi8(x1_flip,complex_shuffle); + x3_flip = _mm_sign_epi16(*(x3),*(__m128i*)conjugatedft); + x3_flip = _mm_shuffle_epi8(x3_flip,complex_shuffle); + x02t = _mm_subs_epi16(*(x0),*(x2)); + x13t = _mm_subs_epi16(x1_flip,x3_flip); + *(y1) = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f + *(y3) = _mm_subs_epi16(x02t,x13t); // x0 - x1f - x2 + x3f + /* *(y0) = _mm_adds_epi16(*(x0),_mm_adds_epi16(*(x1),_mm_adds_epi16(*(x2),*(x3)))); x1_flip = _mm_sign_epi16(*(x1),*(__m128i*)conjugatedft); x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); @@ -867,7 +885,7 @@ static inline void bfly4_tw1(__m128i *x0,__m128i *x1,__m128i *x2,__m128i *x3, *(y1) = _mm_adds_epi16(*(x0),_mm_subs_epi16(x1_flip,_mm_adds_epi16(*(x2),x3_flip))); *(y2) = _mm_subs_epi16(*(x0),_mm_subs_epi16(*(x1),_mm_subs_epi16(*(x2),*(x3)))); *(y3) = _mm_subs_epi16(*(x0),_mm_adds_epi16(x1_flip,_mm_subs_epi16(*(x2),x3_flip))); - + */ } #elif defined(__arm__) @@ -1417,6 +1435,9 @@ static inline void dft16(int16_t *x,int16_t *y) __m128i *tw16a_128=(__m128i *)tw16a,*tw16b_128=(__m128i *)tw16b,*x128=(__m128i *)x,*y128=(__m128i *)y; + + +#ifndef AVX2 /* This is the original version before unrolling bfly4_tw1(x128,x128+1,x128+2,x128+3, @@ -1431,6 +1452,7 @@ static inline void dft16(int16_t *x,int16_t *y) register __m128i x1_flip,x3_flip,x02t,x13t; register __m128i ytmp0,ytmp1,ytmp2,ytmp3,xtmp0,xtmp1,xtmp2,xtmp3; + register __m128i complex_shuffle = _mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2); // First stage : 4 Radix-4 butterflies without input twiddles @@ -1439,9 +1461,9 @@ static inline void dft16(int16_t *x,int16_t *y) xtmp0 = _mm_adds_epi16(x02t,x13t); xtmp2 = _mm_subs_epi16(x02t,x13t); x1_flip = _mm_sign_epi16(x128[1],*(__m128i*)conjugatedft); - x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); + x1_flip = _mm_shuffle_epi8(x1_flip,complex_shuffle); x3_flip = _mm_sign_epi16(x128[3],*(__m128i*)conjugatedft); - x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); + x3_flip = _mm_shuffle_epi8(x3_flip,complex_shuffle); x02t = _mm_subs_epi16(x128[0],x128[2]); x13t = _mm_subs_epi16(x1_flip,x3_flip); xtmp1 = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f @@ -1474,6 +1496,31 @@ static inline void dft16(int16_t *x,int16_t *y) y128[1] = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f y128[3] = _mm_subs_epi16(x02t,x13t); // x0 - x1f - x2 + x3f +#else + + // x02t = _mm_adds_epi16(x128[0],x128[2]); + // x13t = _mm_adds_epi16(x128[1],x128[3]); + + xt = _mm256_adds_epi16(x256[0],x256[1]); + + xtmp0 = _mm_adds_epi16(x02t,x13t); + xtmp2 = _mm_subs_epi16(x02t,x13t); + + x13_flip + x1_flip = _mm_sign_epi16(x128[1],*(__m128i*)conjugatedft); + x1_flip = _mm_shuffle_epi8(x1_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); + x3_flip = _mm_sign_epi16(x128[3],*(__m128i*)conjugatedft); + x3_flip = _mm_shuffle_epi8(x3_flip,_mm_set_epi8(13,12,15,14,9,8,11,10,5,4,7,6,1,0,3,2)); + + // x02t = _mm_subs_epi16(x128[0],x128[2]); + // x13t = _mm_subs_epi16(x1_flip,x3_flip); + xt = _mm256_subs_epi16(x256flip0,x256flip1); + + xtmp1 = _mm_adds_epi16(x02t,x13t); // x0 + x1f - x2 - x3f + xtmp3 = _mm_subs_epi16(x02t,x13t); // x0 - x1f - x2 + x3f + + +#endif #elif defined(__arm__) @@ -16044,7 +16091,6 @@ void dft1200(int16_t *x,int16_t *y,unsigned char scale_flag) #include <string.h> #include <stdio.h> -int opp_enabled=1; int main(int argc, char**argv) { @@ -16057,7 +16103,7 @@ int main(int argc, char**argv) int i; set_taus_seed(0); - + opp_enabled = 1; /* ((int16_t *)&tw0)[0] = 32767; ((int16_t *)&tw0)[1] = 0; @@ -16423,7 +16469,7 @@ int main(int argc, char**argv) } - printf("\n\n64-point (%f cycles)\n",(double)ts.diff/(double)ts.trials); + printf("\n\n64-point (%f cycles, #trials %d)\n",(double)ts.diff/(double)ts.trials,ts.trials); write_output("x64.m","x64",x,64,1,1); write_output("y64.m","y64",y,64,1,1); diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index b73d804ad86..8519b12b9ee 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -127,7 +127,7 @@ static inline void* malloc16_clear( size_t size ) #define NB_BANDS_MAX 8 -typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6} runmode_t; +typedef enum {normal_txrx=0,rx_calib_ue=1,rx_calib_ue_med=2,rx_calib_ue_byp=3,debug_prach=4,no_L2_connect=5,calib_prach_tx=6,rx_dump_frame=7,loop_through_memory=8} runmode_t; enum transmission_access_mode { NO_ACCESS=0, diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index c919ea1506c..24e40f472bf 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -318,10 +318,11 @@ int get_nCCE_offset(const unsigned char L, const int nCCE, const int common_dci, if (common_dci == 1) { // check CCE(0 ... L-1) nb_candidates = (L==4) ? 4 : 2; + nb_candidates = min(nb_candidates,nCCE/L); - for (m = 0 ; m < nb_candidates ; m++) { + for (m = nb_candidates-1 ; m >=0 ; m--) { search_space_free = 1; - + printf("Checking m %d\n",m); for (l=0; l<L; l++) { if (CCE_table[(m*L) + l] == 1) { search_space_free = 0; @@ -332,7 +333,7 @@ int get_nCCE_offset(const unsigned char L, const int nCCE, const int common_dci, if (search_space_free == 1) { for (l=0; l<L; l++) CCE_table[(m*L)+l]=1; - + printf("OK"); return(m*L); } } diff --git a/openair1/SCHED/phy_procedures_lte_ue.c b/openair1/SCHED/phy_procedures_lte_ue.c index 44ce052448d..be4405ae1ee 100755 --- a/openair1/SCHED/phy_procedures_lte_ue.c +++ b/openair1/SCHED/phy_procedures_lte_ue.c @@ -1961,6 +1961,8 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst (phy_vars_ue->lte_frame_parms.mode1_flag == 1) ? SISO : ALAMOUTI, phy_vars_ue->high_speed_flag, phy_vars_ue->is_secondary_ue); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_RX_PDCCH, VCD_FUNCTION_OUT); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_DCI_DECODING, VCD_FUNCTION_IN); dci_cnt = dci_decoding_procedure(phy_vars_ue, @@ -2107,8 +2109,11 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst //if ((phy_vars_ue->UE_mode[eNB_id] != PRACH) && // (dci_alloc_rx[i].rnti != 0x1234) && - if((dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && - (dci_alloc_rx[i].format != format0)) { + + if ((phy_vars_ue->UE_mode[eNB_id]>PRACH) && + (dci_alloc_rx[i].rnti == phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti) && + (dci_alloc_rx[i].format != format0)) { + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d][DCI][PDSCH %x] frame %d, subframe %d: format %d, num_pdcch_symbols %d, nCCE %d, total CCEs %d\n", phy_vars_ue->Mod_id,dci_alloc_rx[i].rnti, @@ -2118,14 +2123,10 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->nCCE[subframe_rx], get_nCCE(3,&phy_vars_ue->lte_frame_parms,get_mi(&phy_vars_ue->lte_frame_parms,0))); - /* - if (((frame_rx%100) == 0) || (frame_rx < 20)) - dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); - */ #endif #ifdef DIAG_PHY - + if (!(((subframe_rx == 7) && (dci_alloc_rx[i].format == format1E_2A_M10PRB)) || ((subframe_rx == 7) && (dci_alloc_rx[i].format == format1)))) { LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: should not have received C_RNTI Format %d!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx,dci_alloc_rx[i].format); @@ -2134,40 +2135,40 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(-1); } - + #endif - + // dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); if (generate_ue_dlsch_params_from_dci(subframe_rx, - (void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - dci_alloc_rx[i].format, - phy_vars_ue->dlsch_ue[eNB_id], - &phy_vars_ue->lte_frame_parms, - phy_vars_ue->pdsch_config_dedicated, - SI_RNTI, - 0, - P_RNTI)==0) { + (void *)&dci_alloc_rx[i].dci_pdu, + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + dci_alloc_rx[i].format, + phy_vars_ue->dlsch_ue[eNB_id], + &phy_vars_ue->lte_frame_parms, + phy_vars_ue->pdsch_config_dedicated, + SI_RNTI, + 0, + P_RNTI)==0) { #ifdef DIAG_PHY - + if (phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs != (((frame_rx%1024)%28))) { LOG_E(PHY,"[UE %d][DIAG] frame %d, subframe %d: wrong mcs!\n",phy_vars_ue->Mod_id,frame_rx,subframe_rx, phy_vars_ue->dlsch_ue[eNB_id][0]->harq_processes[phy_vars_ue->dlsch_ue[eNB_id][0]->current_harq_pid]->mcs); dump_dci(&phy_vars_ue->lte_frame_parms,(void *)&dci_alloc_rx[i]); } - + #endif - - + + phy_vars_ue->dlsch_received[eNB_id]++; - + #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] Generated UE DLSCH C_RNTI format %d\n",phy_vars_ue->Mod_id,dci_alloc_rx[i].format); dump_dci(&phy_vars_ue->lte_frame_parms, &dci_alloc_rx[i]); LOG_D(PHY,"[UE %d] *********** dlsch->active in subframe %d (%d)=> %d\n",phy_vars_ue->Mod_id,subframe_rx,slot_rx,phy_vars_ue->dlsch_ue[eNB_id][0]->active); #endif - + // we received a CRNTI, so we're in PUSCH if (phy_vars_ue->UE_mode[eNB_id] != PUSCH) { #ifdef DEBUG_PHY_PROC @@ -2291,17 +2292,18 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; //dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]); - if (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, - subframe_rx, - format0, - phy_vars_ue, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - eNB_id, - 0)==0) { + if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, + phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->crnti, + subframe_rx, + format0, + phy_vars_ue, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + eNB_id, + 0)==0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] Generate UE ULSCH C_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx); @@ -2336,17 +2338,18 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst phy_vars_ue->ulsch_no_allocation_counter[eNB_id] = 0; //dump_dci(&phy_vars_ue->lte_frame_parms,&dci_alloc_rx[i]); - if (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, - phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0], - subframe_rx, - format0, - phy_vars_ue, - SI_RNTI, - 0, - P_RNTI, - CBA_RNTI, - eNB_id, - 0)==0) { + if ((phy_vars_ue->UE_mode[eNB_id] > PRACH) && + (generate_ue_ulsch_params_from_dci((void *)&dci_alloc_rx[i].dci_pdu, + phy_vars_ue->ulsch_ue[eNB_id]->cba_rnti[0], + subframe_rx, + format0, + phy_vars_ue, + SI_RNTI, + 0, + P_RNTI, + CBA_RNTI, + eNB_id, + 0)==0)) { #ifdef DEBUG_PHY_PROC LOG_D(PHY,"[UE %d] Generate UE ULSCH CBA_RNTI format 0 (subframe %d)\n",phy_vars_ue->Mod_id,subframe_rx); @@ -2372,7 +2375,18 @@ int lte_ue_pdcch_procedures(uint8_t eNB_id,PHY_VARS_UE *phy_vars_ue,uint8_t abst } } - +/* + if ((frame_rx > 1000) && ((frame_rx&1)==0) && (subframe_rx == 5)) { + write_output("rxsig0.m","rxs0", phy_vars_ue->lte_ue_common_vars.rxdata[0],10*phy_vars_ue->lte_frame_parms.samples_per_tti,1,1); + write_output("rxsigF0.m","rxsF0", phy_vars_ue->lte_ue_common_vars.rxdataF[0],phy_vars_ue->lte_frame_parms.ofdm_symbol_size*2*((phy_vars_ue->lte_frame_parms.Ncp==0)?14:12),2,1); + write_output("H00.m","h00",&(phy_vars_ue->lte_ue_common_vars.dl_ch_estimates[0][0][0]),((phy_vars_ue->lte_frame_parms.Ncp==0)?7:6)*(phy_vars_ue->lte_frame_parms.ofdm_symbol_size),1,1); + + write_output("pdcch_rxF_ext0.m","pdcch_rxF_ext0",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_ext[0],3*12*phy_vars_ue->lte_frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_comp0.m","pdcch0_rxF_comp0",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->rxdataF_comp[0],4*12*phy_vars_ue->lte_frame_parms.N_RB_DL,1,1); + write_output("pdcch_rxF_llr.m","pdcch_llr",phy_vars_ue->lte_ue_pdcch_vars[eNB_id]->llr,2400,1,4); + mac_xface->macphy_exit("debug exit"); + } +*/ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_PDCCH_PROCEDURES, VCD_FUNCTION_OUT); return(0); } diff --git a/openair1/SIMULATION/LTE_PHY/dlsim.c b/openair1/SIMULATION/LTE_PHY/dlsim.c index 2a71111758a..d098de40640 100644 --- a/openair1/SIMULATION/LTE_PHY/dlsim.c +++ b/openair1/SIMULATION/LTE_PHY/dlsim.c @@ -135,7 +135,7 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi lte_frame_parms->nb_antennas_tx = N_tx; lte_frame_parms->nb_antennas_rx = N_rx; lte_frame_parms->nb_antennas_tx_eNB = N_tx; - lte_frame_parms->phich_config_common.phich_resource = oneSixth; + lte_frame_parms->phich_config_common.phich_resource = one; lte_frame_parms->tdd_config = tdd_config; lte_frame_parms->frame_type = (fdd_flag==1)?0 : 1; // lte_frame_parms->Csrs = 2; diff --git a/openair1/SIMULATION/LTE_PHY/mbmssim.c b/openair1/SIMULATION/LTE_PHY/mbmssim.c index b17ab480870..a6eca1488e4 100644 --- a/openair1/SIMULATION/LTE_PHY/mbmssim.c +++ b/openair1/SIMULATION/LTE_PHY/mbmssim.c @@ -140,6 +140,7 @@ int main(int argc, char **argv) double **s_re,**s_im,**r_re,**r_im; double iqim = 0.0; int subframe=1; + int sched_subframe; char fname[40];//, vname[40]; uint8_t transmission_mode = 1,n_tx=1,n_rx=2; uint16_t Nid_cell=0; @@ -316,6 +317,9 @@ int main(int argc, char **argv) } } + + sched_subframe = (subframe+9)%10; + if (awgn_flag == 1) channel_model = AWGN; @@ -444,7 +448,8 @@ int main(int argc, char **argv) for (SNR=snr0; SNR<snr1; SNR+=snr_step) { PHY_vars_UE->frame_tx=0; - PHY_vars_eNB->proc[subframe].frame_tx=0; + PHY_vars_eNB->proc[sched_subframe].frame_tx=0; + PHY_vars_eNB->proc[sched_subframe].subframe_tx=subframe; errs[0]=0; errs[1]=0; @@ -467,7 +472,8 @@ int main(int argc, char **argv) eNB2UE->first_run = 1; memset(&PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][0],0,FRAME_LENGTH_COMPLEX_SAMPLES_NO_PREFIX*sizeof(mod_sym_t)); - generate_mch(PHY_vars_eNB,subframe,input_buffer,0); + generate_mch(PHY_vars_eNB,sched_subframe,input_buffer,0); + PHY_ofdm_mod(PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0], // input, txdata[0], // output @@ -477,7 +483,7 @@ int main(int argc, char **argv) CYCLIC_PREFIX); if (n_frames==1) { - write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], + write_output("txsigF0.m","txsF0", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[0][0][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size], nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); //if (PHY_vars_eNB->lte_frame_parms.nb_antennas_tx>1) //write_output("txsigF1.m","txsF1", &PHY_vars_eNB->lte_eNB_common_vars.txdataF[eNB_id][1][subframe*nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size],nsymb*PHY_vars_eNB->lte_frame_parms.ofdm_symbol_size,1,1); @@ -552,6 +558,8 @@ int main(int argc, char **argv) get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs), 1,2, PHY_vars_UE->frame_tx,subframe); + PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->Qm = get_Qm(PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->mcs); + dlsch_unscrambling(&PHY_vars_UE->lte_frame_parms,1,PHY_vars_UE->dlsch_ue_MCH[0], PHY_vars_UE->dlsch_ue_MCH[0]->harq_processes[0]->G, PHY_vars_UE->lte_ue_pdsch_vars_MCH[0]->llr[0],0,subframe<<1); @@ -571,7 +579,7 @@ int main(int argc, char **argv) errs[0]++; PHY_vars_UE->frame_tx++; - PHY_vars_eNB->proc[subframe].frame_tx++; + PHY_vars_eNB->proc[sched_subframe].frame_tx++; } printf("errors %d/%d (Pe %e)\n",errs[round],trials,(double)errs[round]/trials); diff --git a/openair1/SIMULATION/LTE_PHY/pdcchsim.c b/openair1/SIMULATION/LTE_PHY/pdcchsim.c index 2ef91c8ceff..1852e349ec1 100644 --- a/openair1/SIMULATION/LTE_PHY/pdcchsim.c +++ b/openair1/SIMULATION/LTE_PHY/pdcchsim.c @@ -49,7 +49,6 @@ #include "PHY/TOOLS/lte_phy_scope.h" #endif - #define N_TRIALS 100 PHY_VARS_eNB *PHY_vars_eNB,*PHY_vars_eNB1,*PHY_vars_eNB2; @@ -89,7 +88,7 @@ void lte_param_init(unsigned char N_tx, unsigned char N_rx,unsigned char transmi lte_frame_parms->nb_antennas_tx_eNB = N_tx; lte_frame_parms->nb_antennas_tx = N_tx; lte_frame_parms->nb_antennas_rx = N_rx; - lte_frame_parms->phich_config_common.phich_resource = oneSixth; //half + lte_frame_parms->phich_config_common.phich_resource = one; //half lte_frame_parms->tdd_config = tdd_config; lte_frame_parms->frame_type = frame_type; diff --git a/openair2/RRC/LITE/rrc_UE.c b/openair2/RRC/LITE/rrc_UE.c index ed7c7e3d6f7..69ee1b1b166 100644 --- a/openair2/RRC/LITE/rrc_UE.c +++ b/openair2/RRC/LITE/rrc_UE.c @@ -710,7 +710,7 @@ rrc_ue_establish_drb( RADIO_ACCESS_BEARER,Rlc_info_um); */ #ifdef PDCP_USE_NETLINK -# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(LINK_ENB_PDCP_TO_GTPV1U) +# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(ETHERNET) && !defined(LINK_ENB_PDCP_TO_GTPV1U) # ifdef OAI_EMU ip_addr_offset3 = oai_emulation.info.nb_enb_local; ip_addr_offset4 = NB_eNB_INST; diff --git a/openair2/RRC/LITE/rrc_eNB.c b/openair2/RRC/LITE/rrc_eNB.c index 7717d2866ce..1f21216fd82 100644 --- a/openair2/RRC/LITE/rrc_eNB.c +++ b/openair2/RRC/LITE/rrc_eNB.c @@ -3049,7 +3049,7 @@ rrc_eNB_process_RRCConnectionReconfigurationComplete( ctxt_pP->module_id, ctxt_pP->frame, (int)DRB_configList->list.array[i]->drb_Identity); #if defined(PDCP_USE_NETLINK) && !defined(LINK_ENB_PDCP_TO_GTPV1U) // can mean also IPV6 since ether -> ipv6 autoconf -# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) +# if !defined(OAI_NW_DRIVER_TYPE_ETHERNET) && !defined(EXMIMO) && !defined(OAI_USRP) && !defined(OAI_BLADERF) && !defined(ETHERNET) LOG_I(OIP, "[eNB %d] trying to bring up the OAI interface oai%d\n", ctxt_pP->module_id, ctxt_pP->module_id); diff --git a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c index d66eb79d211..df8b150502b 100644 --- a/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c +++ b/targets/ARCH/ETHERNET/USERSPACE/LIB/ethernet_lib.c @@ -230,6 +230,11 @@ void trx_eth_end(openair0_device *device) +} + +int openair0_stop(int dummy) { + + return 0; } int num_devices = 0; diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index f51711e2eb7..d42f0926079 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -250,6 +250,8 @@ int UE_scan = 1; int UE_scan_carrier = 0; runmode_t mode = normal_txrx; +FILE *input_fd=NULL; + #ifdef EXMIMO #if MAX_NUM_CCs == 1 @@ -430,9 +432,10 @@ void help (void) { printf(" --debug-ue-prach run normal prach power ramping, but don't continue random-access\n"); printf(" --calib-prach-tx run normal prach with maximum power, but don't continue random-access\n"); printf(" --no-L2-connect bypass L2 and upper layers\n"); - printf(" --ue_rxgain set UE RX gain\n"); - printf(" --ue_txgain set UE tx gain\n"); - printf(" --ue_scan_carrier set UE to scan around carrier\n"); + printf(" --ue-rxgain set UE RX gain\n"); + printf(" --ue-txgain set UE TX gain\n"); + printf(" --ue-scan_carrier set UE to scan around carrier\n"); + printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); printf(" -C Set the downlink frequecny for all Component carrier\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); @@ -2015,7 +2018,9 @@ static void get_options (int argc, char **argv) LONG_OPTION_RXGAIN, LONG_OPTION_TXGAIN, LONG_OPTION_SCANCARRIER, - LONG_OPTION_MAXPOWER + LONG_OPTION_MAXPOWER, + LONG_OPTION_DUMP_FRAME, + LONG_OPTION_LOOPMEMORY }; static const struct option long_options[] = { @@ -2030,6 +2035,8 @@ static void get_options (int argc, char **argv) {"ue-txgain", required_argument, NULL, LONG_OPTION_TXGAIN}, {"ue-scan-carrier", no_argument, NULL, LONG_OPTION_SCANCARRIER}, {"ue-max-power", required_argument, NULL, LONG_OPTION_MAXPOWER}, + {"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME}, + {"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY}, {NULL, 0, NULL, 0} }; @@ -2092,6 +2099,16 @@ static void get_options (int argc, char **argv) break; + case LONG_OPTION_LOOPMEMORY: + mode=loop_through_memory; + input_fd = fopen(optarg,"r"); + AssertFatal(input_fd != NULL,"Please provide an input file\n"); + break; + + case LONG_OPTION_DUMP_FRAME: + mode = rx_dump_frame; + break; + case 'M': #ifdef ETHERNET strcpy(rrh_eNB_ip,optarg); @@ -2400,12 +2417,14 @@ static void get_options (int argc, char **argv) enb_properties->properties[i]->uplink_frequency_offset[CC_id]); } // CC_id }// i - } else if ((UE_flag == 1) && (conf_config_file_name != NULL)) { - - // Here the configuration file is the XER encoded UE capabilities - // Read it in and store in asn1c data structures - strcpy(uecap_xer,conf_config_file_name); - uecap_xer_in=1; + } else if (UE_flag == 1) { + if (conf_config_file_name != NULL) { + + // Here the configuration file is the XER encoded UE capabilities + // Read it in and store in asn1c data structures + strcpy(uecap_xer,conf_config_file_name); + uecap_xer_in=1; + } } } @@ -2869,7 +2888,7 @@ int main( int argc, char **argv ) #ifdef ETHERNET if (frame_parms[0]->N_RB_DL == 6) openair0_cfg[0].samples_per_packet = 256; - else openair0_cfg[0].samples_per_packet = 1536; + else openair0_cfg[0].samples_per_packet = 1024; printf("HW: samples_per_packet %d\n",openair0_cfg[0].samples_per_packet); #endif @@ -2946,10 +2965,15 @@ int main( int argc, char **argv ) printf("Initializing openair0 ..."); openair0_cfg[0].log_level = glog_level; - if (openair0_device_init(&openair0, &openair0_cfg[0]) <0) { + + if ((mode!=loop_through_memory) && + (openair0_device_init(&openair0, &openair0_cfg[0]) <0)) { printf("Exiting, cannot initialize device\n"); exit(-1); } + else if (mode==loop_through_memory) { + + } printf("Done\n"); @@ -3039,6 +3063,13 @@ int main( int argc, char **argv ) UE[CC_id]->lte_ue_common_vars.txdata[aa][i] = 0x00010001; } + if (input_fd) { + printf("Reading in from file to antenna buffer %d\n",0); + fread(UE[0]->lte_ue_common_vars.rxdata[0], + sizeof(int32_t), + frame_parms[0]->samples_per_tti*10, + input_fd); + } //p_exmimo_config->framing.tdd_config = TXRXSWITCH_TESTRX; } else { openair_daq_vars.timing_advance = 0; @@ -3260,7 +3291,8 @@ int main( int argc, char **argv ) #ifndef EXMIMO #ifndef USRP_DEBUG - openair0.trx_start_func(&openair0); + if (mode!=loop_through_memory) + openair0.trx_start_func(&openair0); // printf("returning from usrp start streaming: %llu\n",get_usrp_time(&openair0)); #endif #endif -- GitLab