Commit 2bdfcd6e authored by francescomani's avatar francescomani

common function for default N_TA_offset (not sure what in develop is correct)

parent 73442050
...@@ -1206,6 +1206,23 @@ void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates ...@@ -1206,6 +1206,23 @@ void nr_est_delay(int ofdm_symbol_size, const c16_t *ls_est, c16_t *ch_estimates
delay->est_delay = max_pos - sync_pos; delay->est_delay = max_pos - sync_pos;
} }
int set_default_nta_offset(frequency_range_t freq_range, frame_type_t frame_type, uint32_t samples_per_subframe)
{
// ta_offset_samples : ta_offset = samples_per_subframe : (Δf_max x N_f / 1000)
// As described in Section 4.3.1 in 38.211
// TODO There is no way for the UE to know about LTE-NR coexistence case
// as mentioned in Table 7.1.2-2 of 38.133
// LTE-NR coexistence means the presence of an active LTE service in the same band as NR in current deployment
// We assume no coexistence
if (freq_range == FR1)
return (25600 * samples_per_subframe) / (4096 * 480);
AssertFatal(freq_range == FR2, "If we get to this point, it should be FR2 scenario\n");
return (13792 * samples_per_subframe) / (4096 * 480);
}
void nr_timer_start(NR_timer_t *timer) void nr_timer_start(NR_timer_t *timer)
{ {
timer->active = true; timer->active = true;
......
...@@ -176,7 +176,7 @@ bool is_nr_timer_active(NR_timer_t timer); ...@@ -176,7 +176,7 @@ bool is_nr_timer_active(NR_timer_t timer);
*/ */
uint32_t nr_timer_elapsed_time(NR_timer_t timer); uint32_t nr_timer_elapsed_time(NR_timer_t timer);
int set_default_nta_offset(frequency_range_t freq_range, frame_type_t frame_type, uint32_t samples_per_subframe);
extern const nr_bandentry_t nr_bandtable[]; extern const nr_bandentry_t nr_bandtable[];
static inline int get_num_dmrs(uint16_t dmrs_mask ) static inline int get_num_dmrs(uint16_t dmrs_mask )
......
...@@ -958,43 +958,10 @@ int setup_RU_buffers(RU_t *ru) { ...@@ -958,43 +958,10 @@ int setup_RU_buffers(RU_t *ru) {
int mu = config->ssb_config.scs_common.value; int mu = config->ssb_config.scs_common.value;
int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value; int N_RB = config->carrier_config.dl_grid_size[config->ssb_config.scs_common.value].value;
if (config->cell_config.frame_duplex_type.value == TDD) { ru->N_TA_offset = set_default_nta_offset(fp->freq_range, config->cell_config.frame_duplex_type.value, fp->samples_per_subframe);
int N_TA_offset = config->carrier_config.uplink_frequency.value < 6000000 ? 400 : 431; // reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2 LOG_I(PHY,
double factor=1; "RU %d Setting N_TA_offset to %d samples (UL Freq %d, N_RB %d, mu %d)\n",
ru->idx, ru->N_TA_offset, config->carrier_config.uplink_frequency.value, N_RB, mu);
switch (mu) {
case 0: //15 kHz scs
AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
factor = fp->samples_per_subframe / 30720.0;
break;
case 1: //30 kHz sc
AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
factor = fp->samples_per_subframe / 30720.0;
break;
case 2: //60 kHz scs
AssertFatal(1==0, "scs_common should not be 60 kHz\n");
break;
case 3: //120 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
factor = fp->samples_per_subframe / 61440.0;
break;
case 4: //240 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
factor = fp->samples_per_subframe / 61440.0;
break;
default:
AssertFatal(1==0, "Invalid scs_common!\n");
}
ru->N_TA_offset = (int)(N_TA_offset * factor);
LOG_I(PHY,"RU %d Setting N_TA_offset to %d samples (factor %f, UL Freq %d, N_RB %d, mu %d)\n",ru->idx,ru->N_TA_offset,factor,
config->carrier_config.uplink_frequency.value, N_RB, mu);
} else ru->N_TA_offset = 0;
if (ru->openair0_cfg.mmapped_dma == 1) { if (ru->openair0_cfg.mmapped_dma == 1) {
// replace RX signal buffers with mmaped HW versions // replace RX signal buffers with mmaped HW versions
......
...@@ -655,45 +655,13 @@ void init_N_TA_offset(PHY_VARS_NR_UE *ue) ...@@ -655,45 +655,13 @@ void init_N_TA_offset(PHY_VARS_NR_UE *ue)
{ {
NR_DL_FRAME_PARMS *fp = &ue->frame_parms; NR_DL_FRAME_PARMS *fp = &ue->frame_parms;
if (fp->frame_type == FDD) { ue->N_TA_offset = set_default_nta_offset(fp->freq_range, fp->frame_type, fp->samples_per_subframe);
ue->N_TA_offset = 0; ue->ta_frame = -1;
} else { ue->ta_slot = -1;
// reference samples for 25600Tc @ 30.72 Ms/s for FR1, same @ 61.44 Ms/s for FR2
int N_TA_offset = fp->ul_CarrierFreq < 6e9 ? 400 : 431;
double factor = 1.0;
switch (fp->numerology_index) {
case 0: //15 kHz scs
AssertFatal(N_TA_offset == 400, "scs_common 15kHz only for FR1\n");
factor = fp->samples_per_subframe / 30720.0;
break;
case 1: //30 kHz sc
AssertFatal(N_TA_offset == 400, "scs_common 30kHz only for FR1\n");
factor = fp->samples_per_subframe / 30720.0;
break;
case 2: //60 kHz scs
AssertFatal(1==0, "scs_common should not be 60 kHz\n");
break;
case 3: //120 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 120kHz only for FR2\n");
factor = fp->samples_per_subframe / 61440.0;
break;
case 4: //240 kHz scs
AssertFatal(N_TA_offset == 431, "scs_common 240kHz only for FR2\n");
factor = fp->samples_per_subframe / 61440.0;
break;
default:
AssertFatal(1==0, "Invalid scs_common!\n");
}
ue->N_TA_offset = (int)(N_TA_offset * factor); LOG_I(PHY,
ue->ta_frame = -1; "UE %d Setting N_TA_offset to %d samples (UL Freq %lu, N_RB %d, mu %d)\n",
ue->ta_slot = -1; ue->Mod_id, ue->N_TA_offset, fp->ul_CarrierFreq, fp->N_RB_DL, fp->numerology_index);
LOG_I(PHY,
"UE %d Setting N_TA_offset to %d samples (factor %f, UL Freq %lu, N_RB %d, mu %d)\n",
ue->Mod_id, ue->N_TA_offset, factor, fp->ul_CarrierFreq, fp->N_RB_DL, fp->numerology_index);
}
} }
void phy_init_nr_top(PHY_VARS_NR_UE *ue) { void phy_init_nr_top(PHY_VARS_NR_UE *ue) {
......
...@@ -300,7 +300,7 @@ void nr_init_frame_parms(nfapi_nr_config_request_scf_t* cfg, NR_DL_FRAME_PARMS * ...@@ -300,7 +300,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_samples_slot_timestamp = &get_samples_slot_timestamp;
fp->get_slot_from_timestamp = &get_slot_from_timestamp; fp->get_slot_from_timestamp = &get_slot_from_timestamp;
fp->samples_per_frame = 10 * fp->samples_per_subframe; fp->samples_per_frame = 10 * fp->samples_per_subframe;
fp->freq_range = (fp->dl_CarrierFreq < 6e9)? FR1 : FR2; fp->freq_range = (fp->dl_CarrierFreq < 6e9) ? FR1 : FR2;
fp->Ncp = Ncp; fp->Ncp = Ncp;
...@@ -389,7 +389,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp, ...@@ -389,7 +389,7 @@ int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *fp,
fp->get_samples_per_slot = &get_samples_per_slot; fp->get_samples_per_slot = &get_samples_per_slot;
fp->get_samples_slot_timestamp = &get_samples_slot_timestamp; fp->get_samples_slot_timestamp = &get_samples_slot_timestamp;
fp->samples_per_frame = 10 * fp->samples_per_subframe; fp->samples_per_frame = 10 * fp->samples_per_subframe;
fp->freq_range = (fp->dl_CarrierFreq < 6e9)? FR1 : FR2; fp->freq_range = (fp->dl_CarrierFreq < 6e9) ? FR1 : FR2;
uint8_t sco = 0; uint8_t sco = 0;
if (((fp->freq_range == FR1) && (config->ssb_table.ssb_subcarrier_offset < 24)) || if (((fp->freq_range == FR1) && (config->ssb_table.ssb_subcarrier_offset < 24)) ||
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment