diff --git a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c index e12cf4ff86..85e0157827 100755 --- a/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c +++ b/openair1/PHY/LTE_TRANSPORT/dlsch_scrambling.c @@ -83,25 +83,7 @@ void dlsch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, uint32_t x1, x2, s=0; uint8_t *dlsch_e=dlsch->harq_processes[harq_pid]->e; uint8_t *e=dlsch_e; -#ifdef Rel14 - // Rule for accumulation of subframes for BL/CE UEs - uint8_t Nacc=4; - uint16_t j0,j,idelta; - uint16_t i = (Ns>>1) + (10*frame); - uint16_t i0 = dlsch->i0; - if (dlsch->sib1_br_flag==1) Nacc=1; - else if (dlsch->rnti == 0xFFFF || dlsch->rnti == 0xFFFE) Nacc = (frame_parms->frame_type == TDD) ? 10 : 4; - // Note: above SC-RNTI will also have to be added when/if implemented - else if (dlsch->CEmode == CEmodeA) Nacc=1; - else if (dlsch->CEmode == CEmodeB) Nacc = (frame_parms->frame_type == TDD) ? 10 : 4; - - if (frame_parms->frame_type == FDD || Nacc == 1) idelta = 0; - else idelta = Nacc-2; - - j0 = (i0+idelta)/Nacc; - j = (i - i0)/Nacc; -#endif VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_DLSCH_SCRAMBLING, VCD_FUNCTION_IN); #ifdef Rel14 diff --git a/openair1/PHY/LTE_TRANSPORT/edci.c b/openair1/PHY/LTE_TRANSPORT/edci.c index 2487e8370c..49a60ae9e8 100755 --- a/openair1/PHY/LTE_TRANSPORT/edci.c +++ b/openair1/PHY/LTE_TRANSPORT/edci.c @@ -48,75 +48,156 @@ //#define DEBUG_DCI_DECODING 1 //#define DEBUG_PHY -typedef struct { - uint8_t num_dci; - mDCI_ALLOC_t mdci_alloc[32]; -} LTE_eNB_MPDCCH; - -typedef struct { - /// Length of DCI in bits - uint8_t dci_length; - /// Aggregation level - uint8_t L; - /// Position of first CCE of the dci - int firstCCE; - /// flag to indicate that this is a RA response - boolean_t ra_flag; - /// rnti - rnti_t rnti; - /// Format - DCI_format_t format; - /// harq process index - uint8_t harq_pid; - /// Narrowband index - uint8_t narrowband; - /// number of PRB pairs for MPDCCH - uint8_t number_of_prb_pairs; - /// mpdcch resource assignement (0=localized,1=distributed) - uint8_t resource_block_assignment; - /// transmission type - uint8_t transmission_type; - /// mpdcch start symbol - uint8_t start_symbol; - /// CE mode (1=ModeA,2=ModeB) - uint8_t ce_mode; - /// 0-503 n_EPDCCHid_i - uint16_t dmrs_scrambling_init; - /// Absolute subframe of the initial transmission (0-10239) - uint16_t initial_transmission_sf_io; - /// DCI pdu - uint8_t dci_pdu[8]; -} mDCI_ALLOC_t; - +#ifdef Rel14 void generate_edci_top(PHY_VARS_eNB *eNB, int frame, int subframe) { } -void generate_mdci_top(PHY_VARS_eNB *eNB, int frame, int subframe) { +void mpdcch_scrambling(LTE_DL_FRAME_PARMS *frame_parms, + mDCI_ALLOC_t *mdci, + uint16_t i, + uint8_t *e, + uint32_t length) +{ + int n; + uint8_t reset; + uint32_t x1, x2, s=0; + uint8_t Nacc=4; + uint16_t j0,j,idelta; + uint16_t i0 = mdci->i0; + + // Note: we could actually not do anything if i-i0 < Nacc, save it for later + + reset = 1; + // x1 is set in lte_gold_generic + + if ((mdci->rnti == 0xFFFE) || + (mdci->ce_mode == 2)) // CEModeB Note: also for mdci->rnti==SC_RNTI + Nacc=frame_parms->frame_type == FDD ? 4 : 10; + else Nacc=1; + + if (frame_parms->frame_type == FDD || Nacc == 1) idelta = 0; + else idelta = Nacc-2; + + j0 = (i0+idelta)/Nacc; + j = (i - i0)/Nacc; + + + // rule for BL/CE UEs from Section 6.8.B2 in 36.211 + x2= ((((j0+j)*Nacc)%10)<<9) + mdci->dmrs_scrambling_init; + + for (n=0; n>(i&0x1f))&1); + } +} + +// this table is the allocation of modulated MPDCCH format 5 symbols to REs +// There are in total 36 REs/ECCE * 4 ECCE/PRB_pair = 144 REs in total/PRB_pair, total is 168 REs => 24 REs for DMRS +// For format 5 there are 6 PRB pairs => 864 REs for 24 total ECCE +static uint16_t mpdcch5tab[864]; + +void init_mpdcch5tab_normal_regular_subframe_evenNRBDL(PHY_VARS_eNB *eNB) { + int l,k,kmod,re; + + LOG_I(PHY,"Inititalizing mpdcch5tab for normal prefix, normal prefix, no PSS/SSS/PBCH, even N_RB_DL\n"); + for (l=0,re=0;l<14;l++) { + for (k=0;k<72;k++){ + kmod = k % 12; + if (((l!=5) && (l!=6) && (l!=12) && (l!=13)) || + (((l==5)||(l==6)||(l==12)||(l==13))&&(kmod!=0)&&(kmod!=5)&&(kmod!=10))) + mpdcch5tab[re++]=(l*eNB->frame_parms.ofdm_symbol_size)+k; + } + } + AssertFatal(re==864,"RE count not equal to 864\n"); +} + +extern uint8_t *generate_dci0(uint8_t *dci, + uint8_t *e, + uint8_t DCI_LENGTH, + uint8_t aggregation_level, + uint16_t rnti); + +void generate_mdci_top(PHY_VARS_eNB *eNB, int frame, int subframe,int16_t amp,int32_t **txdataF) { LTE_eNB_MPDCCH *mpdcch= &eNB->mpdcch_vars[subframe&2]; mDCI_ALLOC_t *mdci; - uint8_t e[DCI_BITS_MAX]; + int coded_bits; + LTE_DL_FRAME_PARMS *fp=&eNB->frame_parms; + int i; + int gain_lin_QPSK; for (i=0;inum_dci;i++) { - mdci = &mdpcch->mdci_alloc[i]; + mdci = &mpdcch->mdci_alloc[i]; - // Assume 4 EREG/ECCE case (normal prefix) - AssertFatal(eNB->frame_parms.frame_type==FDD,"TDD is not yet supported for MPDCCH\n"); - // 9 REs/EREG => 36 REs/ECCE => 72 bits/ECCE + AssertFatal(fp->frame_type==FDD,"TDD is not yet supported for MPDCCH\n"); + AssertFatal(fp->Ncp == NORMAL,"Extended Prefix not yet supported for MPDCCH\n"); + AssertFatal(mdci->L<=24,"L is %d\n",mdci->L); + AssertFatal(fp->N_RB_DL==50 || fp->N_RB_DL==100,"Only N_RB_DL=50,100 for MPDCCH\n"); + // Force MPDDCH format 5 + AssertFatal(mdci->number_of_prb_pairs==6,"2 or 4 PRB pairs not support yet for MPDCCH\n"); + AssertFatal(mdci->reps>0,"mdci->reps==0\n"); + + // 9 REs/EREG * 4 EREG/ECCE => 36 REs/ECCE => 72 bits/ECCE, so same as regular PDCCH channel encoding + + // Note: We only have to run this every Nacc subframes during repetitions, data and scrambling are constant, but we do it for now to simplify during testing + generate_dci0(mdci->dci_pdu, - e+(72*mdci->firstCCE), - mdci_length, + mpdcch->e+(72*mdci->firstCCE), + mdci->dci_length, mdci->L, mdci->rnti); - // compute MPDCCH format based on parameters from NFAPI - AssertFatal(mdci->reps>0,"mdci->reps==0\n"); - if (reps==0) { // table 6.8A.1-1 - AssertFatal(eNB->frame_parms->Ncp == NORMAL,"Extended Prefix not yet supported for MPDCCH\n"); - N_ECCE_EREG = 4; + + coded_bits = 72 * mdci->L; + + // scrambling + uint16_t absSF = (frame*10)+subframe; + + AssertFatal(absSF < 1024, + "Absolute subframe %d = %d*10 + %d > 1023\n", + absSF,frame,subframe); + + mpdcch_scrambling(fp, + mdci, + absSF, + mpdcch->e+(72*mdci->firstCCE), + coded_bits); + + // Modulation for PDCCH + if (fp->nb_antenna_ports_eNB==1) + gain_lin_QPSK = (int16_t)((amp*ONE_OVER_SQRT2_Q15)>>15); + else + gain_lin_QPSK = amp/2; + + uint8_t *e_ptr = mpdcch->e; + + // if (mdci->transmission_type==0) nprime=mdci->rnti&3; // for Localized 2+4 we use 6.8B.5 rule + // map directly to one antenna port for now + // Note: aside from the antenna port mapping, there is no difference between localized and distributed transmission for MPDCCH format 5 + + // first RE of narrowband + // mpdcchtab5 below contains the mapping from each coded symbol to relative RE avoiding the DMRS + + + int re_offset = fp->first_carrier_offset + 1 + ((fp->N_RB_DL==100)?1:0) + mdci->narrowband*12*6; + if (re_offset>fp->ofdm_symbol_size) re_offset-=(fp->ofdm_symbol_size-1); + int32_t *txF = &txdataF[0][re_offset]; + int32_t yIQ; + + for (i=0; i<(coded_bits>>1); i++) { + // QPSK modulation to yIQ + ((int16_t*)&yIQ)[0] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; + ((int16_t*)&yIQ)[1] = (*e_ptr == 1) ? -gain_lin_QPSK : gain_lin_QPSK; e_ptr++; + txF[mpdcch5tab[i+(36*mdci->firstCCE)]] = yIQ; } - + } } + +#endif diff --git a/openair1/PHY/impl_defs_lte.h b/openair1/PHY/impl_defs_lte.h index e3154e42d7..0777848892 100755 --- a/openair1/PHY/impl_defs_lte.h +++ b/openair1/PHY/impl_defs_lte.h @@ -802,8 +802,8 @@ typedef struct { uint8_t harq_pid; /// Narrowband index uint8_t narrowband; - /// number of repetitions - uint8_t reps; + /// number of mdpcch repetitions + uint16_t reps; /// number of PRB pairs for MPDCCH uint8_t number_of_prb_pairs; /// mpdcch resource assignement (combinatorial index r) @@ -818,8 +818,6 @@ typedef struct { uint16_t dmrs_scrambling_init; /// Absolute subframe of the initial transmission (0-10239) uint16_t i0; - /// number of mdpcch repetitions - uint16_t reps; /// current absolute subframe number uint16_t absSF; /// DCI pdu