From 5143133d33385aa55b60fcc0250a5888118b8162 Mon Sep 17 00:00:00 2001 From: rakesh mundlamuri Date: Mon, 3 Apr 2023 13:45:05 +0200 Subject: [PATCH] ssb offset to point A bugfix --- openair1/SCHED_NR/phy_procedures_nr_gNB.c | 3 +- openair2/LAYER2/NR_MAC_gNB/config.c | 19 +++++---- .../LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c | 2 +- openair2/RRC/NR/nr_rrc_config.c | 42 +++++-------------- 4 files changed, 24 insertions(+), 42 deletions(-) diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index 0b37171aac..3da7971f8b 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -75,7 +75,8 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame,int slot,nfapi_nr_ // setting the first subcarrier const int scs = cfg->ssb_config.scs_common.value; const int prb_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>scs : ssb_pdu.ssb_pdu_rel15.ssbOffsetPointA>>(scs-2); - const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset>>scs : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset; + const int sc_offset = (fp->freq_range == nr_FR1) ? ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> scs + : ssb_pdu.ssb_pdu_rel15.SsbSubcarrierOffset >> (scs - 2); fp->ssb_start_subcarrier = (12 * prb_offset + sc_offset); LOG_D(PHY, "SSB first subcarrier %d (%d,%d)\n", fp->ssb_start_subcarrier, prb_offset, sc_offset); diff --git a/openair2/LAYER2/NR_MAC_gNB/config.c b/openair2/LAYER2/NR_MAC_gNB/config.c index a647dcd21c..8da2d12c55 100644 --- a/openair2/LAYER2/NR_MAC_gNB/config.c +++ b/openair2/LAYER2/NR_MAC_gNB/config.c @@ -351,24 +351,27 @@ void config_common(gNB_MAC_INST *nrmac, int pdsch_AntennaPorts, int pusch_Antenn cfg->num_tlv++; // SSB Table Configuration - uint32_t absolute_diff = (*frequencyInfoDL->absoluteFrequencySSB - frequencyInfoDL->absoluteFrequencyPointA); - const int scaling_5khz = frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; - int sco = (absolute_diff/scaling_5khz) % 24; - if(frequency_range == FR2) - sco >>= 1; // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only option supported by OAI for - const int scs_scaling = frequency_range == FR2 ? 1 << (*scc->ssbSubcarrierSpacing - 2) : 1 << *scc->ssbSubcarrierSpacing; - cfg->ssb_table.ssb_offset_point_a.value = absolute_diff/(12*scaling_5khz) - 10*scs_scaling; //absoluteFrequencySSB is the central frequency of SSB which is made by 20RBs in total + + cfg->ssb_table.ssb_offset_point_a.value = get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, + scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, + *scc->ssbSubcarrierSpacing, + frequency_range); cfg->ssb_table.ssb_offset_point_a.tl.tag = NFAPI_NR_CONFIG_SSB_OFFSET_POINT_A_TAG; cfg->num_tlv++; cfg->ssb_table.ssb_period.value = *scc->ssb_periodicityServingCell; cfg->ssb_table.ssb_period.tl.tag = NFAPI_NR_CONFIG_SSB_PERIOD_TAG; cfg->num_tlv++; - cfg->ssb_table.ssb_subcarrier_offset.value = sco; + cfg->ssb_table.ssb_subcarrier_offset.value = get_ssb_subcarrier_offset(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, + scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); cfg->ssb_table.ssb_subcarrier_offset.tl.tag = NFAPI_NR_CONFIG_SSB_SUBCARRIER_OFFSET_TAG; cfg->num_tlv++; nrmac->ssb_SubcarrierOffset = cfg->ssb_table.ssb_subcarrier_offset.value; nrmac->ssb_OffsetPointA = cfg->ssb_table.ssb_offset_point_a.value; + LOG_I(NR_MAC, + "ssb_OffsetPointA %d, ssb_SubcarrierOffset %d\n", + cfg->ssb_table.ssb_offset_point_a.value, + cfg->ssb_table.ssb_subcarrier_offset.value); switch (scc->ssb_PositionsInBurst->present) { case 1 : diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c index 6ffbe7c270..f6d1f83e35 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_bch.c @@ -218,7 +218,7 @@ void schedule_nr_mib(module_id_t module_idP, frame_t frameP, sub_frame_t slotP, if ((ssb_start_symbol/14) == rel_slot){ const int prb_offset = offset_pointa >> (scs-2); // reference 60kHz schedule_ssb(frameP, slotP, scc, dl_req, i_ssb, ssbSubcarrierOffset, offset_pointa, (*(uint32_t*)cc->MIB_pdu.payload) & ((1<<24)-1)); - fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset, ssb_start_symbol, CC_id); + fill_ssb_vrb_map(cc, prb_offset, ssbSubcarrierOffset >> (scs - 2), ssb_start_symbol, CC_id); const NR_TDD_UL_DL_Pattern_t *tdd = &scc->tdd_UL_DL_ConfigurationCommon->pattern1; const int n_slots_frame = nr_slots_per_frame[*scc->ssbSubcarrierSpacing]; // FR2 is only TDD, to be fixed for flexible TDD diff --git a/openair2/RRC/NR/nr_rrc_config.c b/openair2/RRC/NR/nr_rrc_config.c index 46627636de..af5431fb33 100644 --- a/openair2/RRC/NR/nr_rrc_config.c +++ b/openair2/RRC/NR/nr_rrc_config.c @@ -1646,15 +1646,8 @@ NR_BCCH_BCH_Message_t *get_new_MIB_NR(const NR_ServingCellConfigCommon_t *scc) frequency_range_t frequency_range = band < 100 ? FR1 : FR2; int ssb_subcarrier_offset = 31; // default value for NSA if (get_softmodem_params()->sa) { - uint32_t absolute_diff = (*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB - - scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); - int scs_scaling = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA < 600000 ? 3 : 1; - ssb_subcarrier_offset = (absolute_diff / scs_scaling) % 24; - if (frequency_range == FR2) { - // this assumes 120kHz SCS for SSB and subCarrierSpacingCommon (only - // option supported by OAI for now) - ssb_subcarrier_offset >>= 1; - } + ssb_subcarrier_offset = get_ssb_subcarrier_offset(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, + scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA); } mib->message.choice.mib->ssb_SubcarrierOffset = ssb_subcarrier_offset & 15; @@ -1839,32 +1832,17 @@ NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const gNB_RrcConfigurationReq *configurati frequencyInfoDL->frequencyBandList.list.array[i]; } - int scs_scaling0 = 1 << (configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing); - int scs_scaling = scs_scaling0; - int scs_scaling2 = scs_scaling0; - if (frequencyInfoDL->absoluteFrequencyPointA < 600000) { - scs_scaling = scs_scaling0 * 3; - } - if (frequencyInfoDL->absoluteFrequencyPointA > 2016666) { - scs_scaling = scs_scaling0 >> 2; - scs_scaling2 = scs_scaling0 >> 2; - } - uint32_t absolute_diff = (*frequencyInfoDL->absoluteFrequencySSB - frequencyInfoDL->absoluteFrequencyPointA); - - sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = - scs_scaling2 * (absolute_diff / (12 * scs_scaling) - 10); + const NR_FreqBandIndicatorNR_t band = *configuration->scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0]; + frequency_range_t frequency_range = band < 100 ? FR1 : FR2; + sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = get_ssb_offset_to_pointA(*configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB, + configuration->scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA, + configuration->scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing, + frequency_range); LOG_I(NR_RRC, - "SIB1 freq: absoluteFrequencySSB %ld, absoluteFrequencyPointA %ld\n", - *frequencyInfoDL->absoluteFrequencySSB, - frequencyInfoDL->absoluteFrequencyPointA); - LOG_I(NR_RRC, - "SIB1 freq: absolute_diff %d, %d*(absolute_diff/(12*%d) - 10) %d\n", - absolute_diff, - scs_scaling2, - scs_scaling, + "SIB1 freq: offsetToPointA %d\n", (int)sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA); - + for (int i = 0; i < frequencyInfoDL->scs_SpecificCarrierList.list.count; i++) { asn1cSeqAdd(&ServCellCom->downlinkConfigCommon.frequencyInfoDL.scs_SpecificCarrierList.list, frequencyInfoDL->scs_SpecificCarrierList.list.array[i]);