Merge remote-tracking branch 'origin/Harmonize_frequency_range' into integration_2025_w12 (!3311)
Harmonize and update Frequency Range computation to the current values specified by the standard 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges - FR1 from 410 MHz to 7125 MHz - FR2 from 24.25 GHz to 71 GHz
This commit is contained in:
@@ -1441,3 +1441,32 @@ unsigned short get_m_srs(int c_srs, int b_srs) {
|
||||
unsigned short get_N_b_srs(int c_srs, int b_srs) {
|
||||
return srs_bandwidth_config[c_srs][b_srs][1];
|
||||
}
|
||||
|
||||
frequency_range_t get_freq_range_from_freq(uint64_t freq)
|
||||
{
|
||||
// 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges
|
||||
if (freq >= 410000000 && freq <= 7125000000)
|
||||
return FR1;
|
||||
|
||||
if (freq >= 24250000000 && freq <= 71000000000)
|
||||
return FR2;
|
||||
|
||||
AssertFatal(false, "Undefined Frequency Range for frequency %ld Hz\n", freq);
|
||||
}
|
||||
|
||||
frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn)
|
||||
{
|
||||
// 3GPP TS 38.101-1 Version 19.0.0 Table 5.1-1: Definition of frequency ranges
|
||||
if (arfcn >= 82000 && arfcn <= 875000)
|
||||
return FR1;
|
||||
|
||||
if (arfcn >= 2016667 && arfcn <= 2795832)
|
||||
return FR2;
|
||||
|
||||
AssertFatal(false, "Undefined Frequency Range for ARFCN %d\n", arfcn);
|
||||
}
|
||||
|
||||
frequency_range_t get_freq_range_from_band(uint16_t band)
|
||||
{
|
||||
return band <= 256 ? FR1 : FR2;
|
||||
}
|
||||
|
||||
@@ -299,6 +299,10 @@ unsigned int get_prach_K(int prach_sequence_length, int prach_fmt_id, int pusch_
|
||||
|
||||
int get_slot_idx_in_period(const int slot, const frame_structure_t *fs);
|
||||
|
||||
frequency_range_t get_freq_range_from_freq(uint64_t freq);
|
||||
frequency_range_t get_freq_range_from_arfcn(uint32_t arfcn);
|
||||
frequency_range_t get_freq_range_from_band(uint16_t band);
|
||||
|
||||
#define CEILIDIV(a,b) ((a+b-1)/b)
|
||||
#define ROUNDIDIV(a,b) (((a<<1)+b)/(b<<1))
|
||||
|
||||
|
||||
@@ -354,7 +354,7 @@ void nr_phy_config_request_sim(PHY_VARS_gNB *gNB,
|
||||
}
|
||||
|
||||
fp->threequarter_fs = 0;
|
||||
frequency_range_t frequency_range = fp->nr_band > 256 ? FR2 : FR1;
|
||||
frequency_range_t frequency_range = get_freq_range_from_band(fp->nr_band);
|
||||
int bw_index = get_supported_band_index(mu, frequency_range, N_RB_DL);
|
||||
gNB_config->carrier_config.dl_bandwidth.value = get_supported_bw_mhz(frequency_range, bw_index);
|
||||
|
||||
|
||||
@@ -321,7 +321,7 @@ void nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg, NR_DL_FRAME_PARMS *
|
||||
fp->get_samples_slot_timestamp = &get_samples_slot_timestamp;
|
||||
fp->get_slot_from_timestamp = &get_slot_from_timestamp;
|
||||
fp->samples_per_frame = 10 * fp->samples_per_subframe;
|
||||
fp->freq_range = (fp->dl_CarrierFreq < 6e9) ? FR1 : FR2;
|
||||
fp->freq_range = get_freq_range_from_freq(fp->dl_CarrierFreq);
|
||||
|
||||
fp->Ncp = Ncp;
|
||||
|
||||
@@ -405,7 +405,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
|
||||
fp->get_samples_per_slot = &get_samples_per_slot;
|
||||
fp->get_samples_slot_timestamp = &get_samples_slot_timestamp;
|
||||
fp->samples_per_frame = 10 * fp->samples_per_subframe;
|
||||
fp->freq_range = (fp->dl_CarrierFreq < 6e9) ? FR1 : FR2;
|
||||
fp->freq_range = get_freq_range_from_freq(fp->dl_CarrierFreq);
|
||||
|
||||
uint8_t sco = 0;
|
||||
if (((fp->freq_range == FR1) && (config->ssb_table.ssb_subcarrier_offset < 24)) ||
|
||||
@@ -439,7 +439,9 @@ void nr_init_frame_parms_ue_sa(NR_DL_FRAME_PARMS *frame_parms, uint64_t downlink
|
||||
frame_parms->numerology_index = mu;
|
||||
frame_parms->dl_CarrierFreq = downlink_frequency;
|
||||
frame_parms->ul_CarrierFreq = downlink_frequency + delta_duplex;
|
||||
frame_parms->freq_range = (frame_parms->dl_CarrierFreq < 6e9)? FR1 : FR2;
|
||||
if (get_softmodem_params()->sl_mode == 0) {
|
||||
frame_parms->freq_range = get_freq_range_from_freq(frame_parms->dl_CarrierFreq);
|
||||
}
|
||||
frame_parms->N_RB_UL = frame_parms->N_RB_DL;
|
||||
|
||||
frame_parms->nr_band = nr_band;
|
||||
@@ -570,7 +572,7 @@ int nr_init_frame_parms_ue_sl(NR_DL_FRAME_PARMS *fp,
|
||||
fp->get_samples_per_slot = &get_samples_per_slot;
|
||||
fp->get_samples_slot_timestamp = &get_samples_slot_timestamp;
|
||||
fp->samples_per_frame = 10 * fp->samples_per_subframe;
|
||||
fp->freq_range = (fp->sl_CarrierFreq < 6e9) ? FR1 : FR2;
|
||||
fp->freq_range = get_freq_range_from_freq(fp->sl_CarrierFreq);
|
||||
|
||||
// ssb_offset_pointa points to the first RE where Sidelink-PSBCH starts
|
||||
fp->ssb_start_subcarrier = config->sl_bwp_config.sl_ssb_offset_point_a;
|
||||
|
||||
@@ -481,7 +481,7 @@ int main(int argc, char **argv){
|
||||
gNB->gNB_config.prach_config.num_prach_fd_occasions_list = (nfapi_nr_num_prach_fd_occasions_t *) malloc(num_prach_fd_occasions*sizeof(nfapi_nr_num_prach_fd_occasions_t));
|
||||
|
||||
gNB->proc.slot_rx = slot;
|
||||
frequency_range_t freq_range = absoluteFrequencyPointA > 2016666 ? FR2 : FR1;
|
||||
frequency_range_t freq_range = get_freq_range_from_arfcn(absoluteFrequencyPointA);
|
||||
nr_prach_info_t prach_info = get_nr_prach_occasion_info_from_index(config_index, freq_range, frame_parms->frame_type);
|
||||
int ret = get_nr_prach_sched_from_info(prach_info,
|
||||
config_index,
|
||||
|
||||
@@ -177,14 +177,17 @@ static void configure_NR_UE(PHY_VARS_NR_UE *UE, int mu, int N_RB)
|
||||
config.cell_config.frame_duplex_type = TDD;
|
||||
config.carrier_config.dl_grid_size[mu] = N_RB;
|
||||
config.carrier_config.ul_grid_size[mu] = N_RB;
|
||||
config.carrier_config.dl_frequency = 0;
|
||||
config.carrier_config.uplink_frequency = 0;
|
||||
config.carrier_config.dl_frequency = 3300000;
|
||||
config.carrier_config.uplink_frequency = 3300000;
|
||||
|
||||
int band;
|
||||
if (mu == 1)
|
||||
band = 78;
|
||||
if (mu == 0)
|
||||
if (mu == 0) {
|
||||
band = 34;
|
||||
config.carrier_config.dl_frequency = 2010000;
|
||||
config.carrier_config.uplink_frequency = 2010000;
|
||||
}
|
||||
nr_init_frame_parms_ue(fp, &config, band);
|
||||
fp->ofdm_offset_divisor = 8;
|
||||
nr_dump_frame_parms(fp);
|
||||
|
||||
@@ -1630,7 +1630,7 @@ uint16_t get_nr_prach_format_from_index(uint8_t index, uint32_t pointa, uint8_t
|
||||
{
|
||||
uint8_t format2 = 0xff;
|
||||
uint16_t format;
|
||||
if (pointa > 2016666) { // FR2
|
||||
if (get_freq_range_from_arfcn(pointa) == FR2) {
|
||||
if (table_6_3_3_2_4_prachConfig_Index[index][1] != -1)
|
||||
format2 = (uint8_t)table_6_3_3_2_4_prachConfig_Index[index][1];
|
||||
format = ((uint8_t)table_6_3_3_2_4_prachConfig_Index[index][0]) | (format2 << 8);
|
||||
|
||||
@@ -324,7 +324,7 @@ static void config_common_ue(NR_UE_MAC_INST_t *mac, NR_ServingCellConfigCommon_t
|
||||
if (frequencyInfoDL) { // NeedM for inter-freq handover
|
||||
mac->nr_band = *frequencyInfoDL->frequencyBandList.list.array[0];
|
||||
frame_type = get_frame_type(mac->nr_band, get_softmodem_params()->numerology);
|
||||
mac->frequency_range = mac->nr_band < 256 ? FR1 : FR2;
|
||||
mac->frequency_range = get_freq_range_from_band(mac->nr_band);
|
||||
|
||||
int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
|
||||
mac->frequency_range,
|
||||
|
||||
@@ -410,7 +410,7 @@ static void config_common(gNB_MAC_INST *nrmac,
|
||||
|
||||
// Carrier configuration
|
||||
struct NR_FrequencyInfoDL *frequencyInfoDL = scc->downlinkConfigCommon->frequencyInfoDL;
|
||||
frequency_range_t frequency_range = *frequencyInfoDL->frequencyBandList.list.array[0] > 256 ? FR2 : FR1;
|
||||
frequency_range_t frequency_range = get_freq_range_from_band(*frequencyInfoDL->frequencyBandList.list.array[0]);
|
||||
int bw_index = get_supported_band_index(frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing,
|
||||
frequency_range,
|
||||
frequencyInfoDL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
|
||||
@@ -440,7 +440,7 @@ static void config_common(gNB_MAC_INST *nrmac,
|
||||
}
|
||||
struct NR_FrequencyInfoUL *frequencyInfoUL = scc->uplinkConfigCommon->frequencyInfoUL;
|
||||
int scs = frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
|
||||
frequency_range = *frequencyInfoUL->frequencyBandList->list.array[0] > 256 ? FR2 : FR1;
|
||||
frequency_range = get_freq_range_from_band(*frequencyInfoUL->frequencyBandList->list.array[0]);
|
||||
bw_index =
|
||||
get_supported_band_index(scs, frequency_range, frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->carrierBandwidth);
|
||||
cfg->carrier_config.uplink_bandwidth.value = get_supported_bw_mhz(frequency_range, bw_index);
|
||||
|
||||
@@ -92,7 +92,7 @@ static int16_t ssb_index_from_prach(module_id_t module_idP,
|
||||
msgacc = scc->uplinkConfigCommon->initialUplinkBWP->ext1->msgA_ConfigCommon_r16->choice.setup;
|
||||
const int ul_mu = scc->uplinkConfigCommon->frequencyInfoUL->scs_SpecificCarrierList.list.array[0]->subcarrierSpacing;
|
||||
const int mu = nr_get_prach_or_ul_mu(msgacc, rach_ConfigCommon, ul_mu);
|
||||
frequency_range_t freq_range = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666 ? FR2 : FR1;
|
||||
frequency_range_t freq_range = get_freq_range_from_arfcn(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||
get_nr_prach_sched_from_info(cc->prach_info, config_index, frameP, slotP, mu, freq_range, &RA_sfn_index, cc->frame_type);
|
||||
|
||||
uint8_t index = 0, slot_index = 0;
|
||||
@@ -184,7 +184,7 @@ void find_SSB_and_RO_available(gNB_MAC_INST *nrmac)
|
||||
}
|
||||
|
||||
// prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4
|
||||
frequency_range_t freq_range = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666 ? FR2 : FR1;
|
||||
frequency_range_t freq_range = get_freq_range_from_arfcn(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||
nr_prach_info_t prach_info = get_nr_prach_occasion_info_from_index(config_index, freq_range, cc->frame_type);
|
||||
|
||||
float num_ssb_per_RO = ssb_per_rach_occasion[cfg->prach_config.ssb_per_rach.value];
|
||||
@@ -380,7 +380,7 @@ void schedule_nr_prach(module_id_t module_idP, frame_t frameP, slot_t slotP)
|
||||
const int mu = nr_get_prach_or_ul_mu(msgacc, rach_ConfigCommon, ul_mu);
|
||||
// prach is scheduled according to configuration index and tables 6.3.3.2.2 to 6.3.3.2.4
|
||||
uint16_t RA_sfn_index = -1;
|
||||
frequency_range_t freq_range = scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA > 2016666 ? FR2 : FR1;
|
||||
frequency_range_t freq_range = get_freq_range_from_arfcn(scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA);
|
||||
if (get_nr_prach_sched_from_info(cc->prach_info, config_index, frameP, slotP, mu, freq_range, &RA_sfn_index, cc->frame_type)) {
|
||||
uint16_t format0 = cc->prach_info.format & 0xff; // first column of format from table
|
||||
uint16_t format1 = (cc->prach_info.format >> 8) & 0xff; // second column of format from table
|
||||
|
||||
@@ -610,7 +610,7 @@ void set_dl_maxmimolayers(NR_PDSCH_ServingCellConfig_t *pdsch_servingcellconfig,
|
||||
|
||||
NR_SCS_SpecificCarrier_t *scs_carrier = scc->downlinkConfigCommon->frequencyInfoDL->scs_SpecificCarrierList.list.array[0];
|
||||
int band = *scc->downlinkConfigCommon->frequencyInfoDL->frequencyBandList.list.array[0];
|
||||
const frequency_range_t freq_range = band < 257 ? FR1 : FR2;
|
||||
const frequency_range_t freq_range = get_freq_range_from_band(band);
|
||||
const int scs = scs_carrier->subcarrierSpacing;
|
||||
const int bw_size = scs_carrier->carrierBandwidth;
|
||||
|
||||
@@ -918,7 +918,7 @@ void prepare_sim_uecap(NR_UE_NR_Capability_t *cap,
|
||||
*bandNRinfo->pusch_256QAM = NR_BandNR__pusch_256QAM_supported;
|
||||
}
|
||||
if (mcs_table_dl == 1) {
|
||||
const frequency_range_t freq_range = band < 257 ? FR1 : FR2;
|
||||
const frequency_range_t freq_range = get_freq_range_from_band(band);
|
||||
if (freq_range == FR2) {
|
||||
bandNRinfo->pdsch_256QAM_FR2 = calloc(1, sizeof(*bandNRinfo->pdsch_256QAM_FR2));
|
||||
*bandNRinfo->pdsch_256QAM_FR2 = NR_BandNR__pdsch_256QAM_FR2_supported;
|
||||
@@ -1368,7 +1368,7 @@ static void set_dl_mcs_table(int scs,
|
||||
AssertFatal(bw_rb > 0,"Could not find scs-SpecificCarrierList element for scs %d", scs);
|
||||
|
||||
bool supported = false;
|
||||
const frequency_range_t freq_range = band > 256 ? FR2 : FR1;
|
||||
const frequency_range_t freq_range = get_freq_range_from_band(band);
|
||||
if (freq_range == FR2) {
|
||||
for (int i = 0; i < cap->rf_Parameters.supportedBandListNR.list.count; i++) {
|
||||
NR_BandNR_t *bandNRinfo = cap->rf_Parameters.supportedBandListNR.list.array[i];
|
||||
@@ -2511,7 +2511,7 @@ NR_BCCH_DL_SCH_Message_t *get_SIB1_NR(const NR_ServingCellConfigCommon_t *scc,
|
||||
frequencyInfoDL->frequencyBandList.list.array[i];
|
||||
}
|
||||
|
||||
frequency_range_t frequency_range = band > 256 ? FR2 : FR1;
|
||||
frequency_range_t frequency_range = get_freq_range_from_band(band);
|
||||
sib1->servingCellConfigCommon->downlinkConfigCommon.frequencyInfoDL.offsetToPointA = get_ssb_offset_to_pointA(*scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencySSB,
|
||||
scc->downlinkConfigCommon->frequencyInfoDL->absoluteFrequencyPointA,
|
||||
scc->downlinkConfigCommon->initialDownlinkBWP->genericParameters.subcarrierSpacing,
|
||||
|
||||
@@ -1614,7 +1614,7 @@ static void handle_measid_addmod(rrcPerNB_t *rrc, struct NR_MeasIdToAddModList *
|
||||
else if (obj_nr->refFreqCSI_RS)
|
||||
freq = *obj_nr->refFreqCSI_RS;
|
||||
AssertFatal(freq > 0, "Invalid ARFCN frequency for this measurement object\n");
|
||||
if (freq > 2016666)
|
||||
if (get_freq_range_from_arfcn(freq) == FR2)
|
||||
nr_timer_setup(&timers->T321, 16000, 10); // 16 seconds for FR2
|
||||
else
|
||||
nr_timer_setup(&timers->T321, 2000, 10); // 2 seconds for FR1
|
||||
|
||||
Reference in New Issue
Block a user