From ba92e37407d38d2b8c2ae9ed54873b90cecb774c Mon Sep 17 00:00:00 2001 From: francescomani Date: Thu, 24 Feb 2022 16:25:12 +0100 Subject: [PATCH] re-initialization of gold sequences at gnb if needed according to fapi messages --- openair1/PHY/INIT/nr_init.c | 14 +++++--- openair1/PHY/NR_REFSIG/nr_gold.c | 23 +++++------- openair1/PHY/NR_REFSIG/nr_refsig.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_csi_rs.c | 19 +++------- openair1/PHY/NR_TRANSPORT/nr_dci.c | 35 ++++++++++++------- openair1/PHY/NR_TRANSPORT/nr_dci.h | 2 +- openair1/PHY/NR_TRANSPORT/nr_dlsch.c | 11 ++++-- .../PHY/NR_TRANSPORT/nr_transport_proto.h | 1 - openair1/PHY/defs_gNB.h | 4 +++ openair1/SCHED_NR/phy_procedures_nr_gNB.c | 5 ++- 10 files changed, 61 insertions(+), 55 deletions(-) diff --git a/openair1/PHY/INIT/nr_init.c b/openair1/PHY/INIT/nr_init.c index 3bf450703c..95e7c011fb 100644 --- a/openair1/PHY/INIT/nr_init.c +++ b/openair1/PHY/INIT/nr_init.c @@ -130,6 +130,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, } nr_generate_modulation_table(); + gNB->pdcch_gold_init = cfg->cell_config.phy_cell_id.value; nr_init_pdcch_dmrs(gNB, cfg->cell_config.phy_cell_id.value); nr_init_pbch_interleaver(gNB->nr_pbch_interleaver); @@ -142,17 +143,21 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, AssertFatal(pdsch_dmrs[slot]!=NULL, "NR init: pdsch_dmrs for slot %d - malloc failed\n", slot); for (int symb=0; symbsymbols_per_slot; symb++) { - pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(NR_MAX_NB_CODEWORDS*sizeof(uint32_t *)); + pdsch_dmrs[slot][symb] = (uint32_t **)malloc16(2*sizeof(uint32_t *)); AssertFatal(pdsch_dmrs[slot][symb]!=NULL, "NR init: pdsch_dmrs for slot %d symbol %d - malloc failed\n", slot, symb); - for (int q=0; qcell_config.phy_cell_id.value); + + for (int nscid = 0; nscid < 2; nscid++) { + gNB->pdsch_gold_init[nscid] = cfg->cell_config.phy_cell_id.value; + nr_init_pdsch_dmrs(gNB, nscid, cfg->cell_config.phy_cell_id.value); + } //PUSCH DMRS init gNB->nr_gold_pusch_dmrs = (uint32_t ****)malloc16(2*sizeof(uint32_t ***)); @@ -193,6 +198,7 @@ int phy_init_nr_gNB(PHY_VARS_gNB *gNB, } } + gNB->csi_gold_init = cfg->cell_config.phy_cell_id.value; nr_init_csi_rs(gNB, cfg->cell_config.phy_cell_id.value); for (int id=0; idframe_parms; uint32_t ****pdsch_dmrs = gNB->nr_gold_pdsch_dmrs; - uint16_t N_n_scid[NR_MAX_NB_CODEWORDS]={Nid, Nid}; // Not correct, appropriate scrambling IDs have to be updated to support DCI 1_1 - uint8_t n_scid=0; // again works only for 1_0 for (uint8_t slot=0; slotslots_per_frame; slot++) { for (uint8_t symb=0; symbsymbols_per_slot; symb++) { - reset = 1; - x2 = ((1<<17) * (fp->symbols_per_slot*slot+symb+1) * ((N_n_scid[n_scid]<<1)+1) +((N_n_scid[n_scid]<<1)+n_scid)); - LOG_D(PHY,"PDSCH DMRS slot %d, symb %d x2 %x, N_n_scid %d,n_scid %d\n",slot,symb,x2,N_n_scid[n_scid],n_scid); - for (uint32_t n=0; nsymbols_per_slot*slot+symb+1) * ((Nid<<1)+1) +((Nid<<1)+nscid)); + LOG_D(PHY,"PDSCH DMRS slot %d, symb %d x2 %x, Nid %d,nscid %d\n",slot,symb,x2,Nid,nscid); + for (uint32_t n=0; nframe_parms; @@ -50,20 +49,10 @@ void nr_generate_csi_rs(PHY_VARS_gNB *gNB, AssertFatal(b!=0, "Invalid CSI frequency domain mapping: no bit selected in bitmap\n"); - // pre-computed for scrambling id equel to cell id - // if the scrambling id is not the cell id we need to re-initialize the rs - if (csi_params.scramb_id != cell_id) { - uint8_t reset; - uint32_t x1, x2; - uint32_t Nid = csi_params.scramb_id; - for (uint8_t symb=0; symbcsi_gold_init) { + gNB->csi_gold_init = csi_params.scramb_id; + nr_init_csi_rs(gNB, csi_params.scramb_id); } switch (csi_params.row) { diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.c b/openair1/PHY/NR_TRANSPORT/nr_dci.c index d233eb9ba6..dc0db4898a 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.c @@ -66,11 +66,12 @@ void nr_pdcch_scrambling(uint32_t *in, } } -void nr_generate_dci(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, - uint32_t **gold_pdcch_dmrs, +void nr_generate_dci(PHY_VARS_gNB *gNB, + nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, int32_t *txdataF, int16_t amp, - NR_DL_FRAME_PARMS *frame_parms) { + NR_DL_FRAME_PARMS *frame_parms, + int slot) { int16_t mod_dmrs[NR_MAX_CSET_DURATION][NR_MAX_PDCCH_DMRS_LENGTH>>1] __attribute__((aligned(16))); // 3 for the max coreset duration uint16_t cset_start_sc; @@ -81,7 +82,7 @@ void nr_generate_dci(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, int rb_offset; int n_rb; - + // compute rb_offset and n_prb based on frequency allocation nr_cce_t cce_list[MAX_DCI_CORESET][NR_MAX_PDCCH_AGG_LEVEL]; nr_fill_cce_list(cce_list,0,pdcch_pdu_rel15); @@ -95,6 +96,13 @@ void nr_generate_dci(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, * in time: by its first slot and its first symbol*/ const nfapi_nr_dl_dci_pdu_t *dci_pdu = &pdcch_pdu_rel15->dci_pdu[d]; + if(dci_pdu->ScramblingId != gNB->pdcch_gold_init) { + gNB->pdcch_gold_init = dci_pdu->ScramblingId; + nr_init_pdcch_dmrs(gNB, dci_pdu->ScramblingId); + } + + uint32_t **gold_pdcch_dmrs = gNB->nr_gold_pdcch_dmrs[slot]; + cset_start_symb = pdcch_pdu_rel15->StartSymbolIndex; cset_nsymb = pdcch_pdu_rel15->DurationSymbols; dci_idx = 0; @@ -104,8 +112,8 @@ void nr_generate_dci(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, uint32_t dmrs_length = n_rb*6; //2(QPSK)*3(per RB)*6(REG per CCE) uint32_t encoded_length = dci_pdu->AggregationLevel*108; //2(QPSK)*9(per RB)*6(REG per CCE) LOG_D(PHY, "DL_DCI : rb_offset %d, nb_rb %d, DMRS length per symbol %d\t DCI encoded length %d (precoder_granularity %d,reg_mapping %d),Scrambling_Id %d,ScramblingRNTI %x,PayloadSizeBits %d\n", - rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType, - dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits); + rb_offset, n_rb,dmrs_length, encoded_length,pdcch_pdu_rel15->precoderGranularity,pdcch_pdu_rel15->CceRegMappingType, + dci_pdu->ScramblingId,dci_pdu->ScramblingRNTI,dci_pdu->PayloadSizeBits); dmrs_length += rb_offset*6; // To accommodate more DMRS symbols in case of rb offset /// DMRS QPSK modulation @@ -115,10 +123,10 @@ void nr_generate_dci(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, #ifdef DEBUG_PDCCH_DMRS if(dci_pdu->RNTI!=0xFFFF) { - for (int i=0; i>1; i++) - printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i, - &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1] ); - } + for (int i=0; i>1; i++) + printf("symb %d i %d %p gold seq 0x%08x mod_dmrs %d %d\n", symb, i, + &gold_pdcch_dmrs[symb][i>>5],gold_pdcch_dmrs[symb][i>>5], mod_dmrs[symb][i<<1], mod_dmrs[symb][(i<<1)+1] ); + } #endif } @@ -251,15 +259,16 @@ void nr_generate_dci(nfapi_nr_dl_tti_pdcch_pdu_rel15_t *pdcch_pdu_rel15, } void nr_generate_dci_top(processingData_L1tx_t *msgTx, - uint32_t **gold_pdcch_dmrs, + int slot, int32_t *txdataF, int16_t amp, NR_DL_FRAME_PARMS *frame_parms) { + for (int i=0; inum_ul_pdcch; i++) - nr_generate_dci(&msgTx->ul_pdcch_pdu[i].pdcch_pdu.pdcch_pdu_rel15,gold_pdcch_dmrs,txdataF,amp,frame_parms); + nr_generate_dci(msgTx->gNB,&msgTx->ul_pdcch_pdu[i].pdcch_pdu.pdcch_pdu_rel15,txdataF,amp,frame_parms,slot); for (int i=0; inum_dl_pdcch; i++) - nr_generate_dci(&msgTx->pdcch_pdu[i].pdcch_pdu_rel15,gold_pdcch_dmrs,txdataF,amp,frame_parms); + nr_generate_dci(msgTx->gNB,&msgTx->pdcch_pdu[i].pdcch_pdu_rel15,txdataF,amp,frame_parms,slot); } diff --git a/openair1/PHY/NR_TRANSPORT/nr_dci.h b/openair1/PHY/NR_TRANSPORT/nr_dci.h index bdc8509d12..490a8b5286 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dci.h +++ b/openair1/PHY/NR_TRANSPORT/nr_dci.h @@ -30,7 +30,7 @@ uint16_t nr_get_dci_size(nfapi_nr_dci_format_e format, uint16_t N_RB); void nr_generate_dci_top(processingData_L1tx_t *msgTx, - uint32_t **gold_pdcch_dmrs, + int slot, int32_t *txdataF, int16_t amp, NR_DL_FRAME_PARMS *frame_parms); diff --git a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c index c6c89c80be..b5e4cbd651 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_dlsch.c +++ b/openair1/PHY/NR_TRANSPORT/nr_dlsch.c @@ -58,7 +58,6 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, PHY_VARS_gNB *gNB = msgTx->gNB; NR_gNB_DLSCH_t *dlsch; - uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs[slot]; int32_t** txdataF = gNB->common_vars.txdataF; int16_t amp = AMP; int xOverhead = 0; @@ -95,6 +94,12 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, } n_dmrs = (rel15->BWPStart+rel15->rbStart+rel15->rbSize)*nb_re_dmrs; + if(rel15->dlDmrsScramblingId != gNB->pdsch_gold_init[rel15->SCID]) { + gNB->pdsch_gold_init[rel15->SCID] = rel15->dlDmrsScramblingId; + nr_init_pdsch_dmrs(gNB, rel15->SCID, rel15->dlDmrsScramblingId); + } + + uint32_t ***pdsch_dmrs = gNB->nr_gold_pdsch_dmrs[slot]; uint16_t dmrs_symbol_map = rel15->dlDmrsSymbPos;//single DMRS: 010000100 Double DMRS 110001100 uint8_t dmrs_len = get_num_dmrs(rel15->dlDmrsSymbPos); uint16_t nb_re = ((12*rel15->NrOfSymbols)-nb_re_dmrs*dmrs_len-xOverhead)*rel15->rbSize*rel15->nrOfLayers; @@ -273,7 +278,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, l_prime = 0; } /// DMRS QPSK modulation - nr_modulation(pdsch_dmrs[l][0], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // currently only codeword 0 is modulated. Qm = 2 as DMRS is QPSK modulated + nr_modulation(pdsch_dmrs[l][rel15->SCID], n_dmrs*2, DMRS_MOD_ORDER, mod_dmrs); // Qm = 2 as DMRS is QPSK modulated #ifdef DEBUG_DLSCH printf("DMRS modulation (symbol %d, %d symbols, type %d):\n", l, n_dmrs, dmrs_Type); @@ -294,7 +299,7 @@ void nr_generate_pdsch(processingData_L1tx_t *msgTx, if(ptrs_symbol) { /* PTRS QPSK Modulation for each OFDM symbol in a slot */ printf("Doing ptrs modulation for symbol %d, n_ptrs %d\n",l,n_ptrs); - nr_modulation(pdsch_dmrs[l][0], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs); + nr_modulation(pdsch_dmrs[l][rel15->SCID], (n_ptrs<<1), DMRS_MOD_ORDER, mod_ptrs); } } uint16_t k = start_sc; diff --git a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h index d45858bca0..a3a88f6c27 100644 --- a/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h +++ b/openair1/PHY/NR_TRANSPORT/nr_transport_proto.h @@ -334,7 +334,6 @@ uint8_t get_nr_prach_duration(uint8_t prach_format); void nr_generate_csi_rs(PHY_VARS_gNB *gNB, int16_t amp, nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params, - uint16_t cell_id, int slot); void free_nr_prach_entry(PHY_VARS_gNB *gNB, int prach_id); diff --git a/openair1/PHY/defs_gNB.h b/openair1/PHY/defs_gNB.h index 7c7d30a6e2..f549e9591b 100644 --- a/openair1/PHY/defs_gNB.h +++ b/openair1/PHY/defs_gNB.h @@ -847,6 +847,10 @@ typedef struct PHY_VARS_gNB_s { /// counter to average prach energh over first 100 prach opportunities int prach_energy_counter; + int csi_gold_init; + int pdcch_gold_init; + int pdsch_gold_init[2]; + int pucch0_thres; int pusch_thres; int prach_thres; diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 7e9f4d091a..f28d9af325 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -161,8 +161,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_gNB_PDCCH_TX,1); - nr_generate_dci_top(msgTx, - gNB->nr_gold_pdcch_dmrs[slot], + nr_generate_dci_top(msgTx, slot, &gNB->common_vars.txdataF[0][txdataF_offset], AMP, fp); @@ -181,7 +180,7 @@ void phy_procedures_gNB_TX(processingData_L1tx_t *msgTx, if (csirs->active == 1) { LOG_D(PHY, "CSI-RS generation started in frame %d.%d\n",frame,slot); nfapi_nr_dl_tti_csi_rs_pdu_rel15_t csi_params = csirs->csirs_pdu.csi_rs_pdu_rel15; - nr_generate_csi_rs(gNB, AMP, csi_params, gNB->gNB_config.cell_config.phy_cell_id.value, slot); + nr_generate_csi_rs(gNB, AMP, csi_params, slot); csirs->active = 0; } }