diff --git a/openair1/PHY/impl_defs_nr.h b/openair1/PHY/impl_defs_nr.h index 05e14f5e8d..cff2f02444 100644 --- a/openair1/PHY/impl_defs_nr.h +++ b/openair1/PHY/impl_defs_nr.h @@ -119,7 +119,7 @@ SystemInformationBlockType1_nr_t; #define NR_TDD_SET_ALL_SYMBOLS (0x3FFF) #define NR_DOWNLINK_SLOT (0x01) -#define NR_UPLINK_SLOT (0x02) +#define NR_UPLINK_SLOT (0x05) #define FRAME_DURATION_MICRO_SEC (10000) /* frame duration in microsecond */ diff --git a/openair1/SCHED_NR/phy_procedures_nr_gNB.c b/openair1/SCHED_NR/phy_procedures_nr_gNB.c index e353a51143..dd10ada2d6 100644 --- a/openair1/SCHED_NR/phy_procedures_nr_gNB.c +++ b/openair1/SCHED_NR/phy_procedures_nr_gNB.c @@ -268,10 +268,10 @@ void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, // -------------------- nfapi_rx_indication_pdu_t *pdu; - int timing_advance_update; int sync_pos; + uint16_t mu = gNB->gNB_config.subframe_config.numerology_index_mu.value; // pthread_mutex_lock(&gNB->UL_INFO_mutex); // gNB->UL_INFO.rx_ind.sfn_sf = frame<<4| slot_rx; @@ -285,19 +285,16 @@ void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, // pdu->rx_indication_rel8.tl.tag = NFAPI_RX_INDICATION_REL8_TAG; // pdu->rx_indication_rel8.length = gNB->ulsch[UE_id+1][0]->harq_processes[harq_pid]->TBS>>3; // pdu->rx_indication_rel8.offset = 1; // DJP - I dont understand - but broken unless 1 ???? 0; // filled in at the end of the UL_INFO formation - pdu->data = gNB->ulsch[UE_id+1][0]->harq_processes[harq_pid]->b; - // estimate timing advance for MAC - sync_pos = nr_est_timing_advance_pusch(gNB, UE_id); - timing_advance_update = sync_pos; // - gNB->frame_parms.nb_prefix_samples/4; //to check + pdu->data = gNB->ulsch[UE_id+1][0]->harq_processes[harq_pid]->b; + sync_pos = nr_est_timing_advance_pusch(gNB, UE_id); // estimate timing advance for MAC + timing_advance_update = sync_pos * (1 << mu); // scale by the used scs numerology + + // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size switch (gNB->frame_parms.N_RB_DL) { - // case 6: /* nothing to do */ break; - // case 15: timing_advance_update /= 2; break; - // case 25: timing_advance_update /= 4; break; - // case 50: timing_advance_update /= 8; break; - // case 75: timing_advance_update /= 12; break; case 106: timing_advance_update /= 16; break; case 217: timing_advance_update /= 32; break; + case 245: timing_advance_update /= 32; break; case 273: timing_advance_update /= 32; break; default: abort(); } @@ -308,7 +305,7 @@ void nr_fill_rx_indication(PHY_VARS_gNB *gNB, int frame, int slot_rx, int UE_id, if (timing_advance_update < 0) timing_advance_update = 0; if (timing_advance_update > 63) timing_advance_update = 63; - printf("\x1B[33m" "Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n" "\x1B[0m", sync_pos,timing_advance_update); + LOG_D(PHY, "Estimated timing advance PUSCH is = %d, timing_advance_update is %d \n", sync_pos,timing_advance_update); pdu->rx_indication_rel8.timing_advance = timing_advance_update; diff --git a/openair1/SCHED_NR_UE/defs.h b/openair1/SCHED_NR_UE/defs.h index cbcb936be3..66398c393e 100644 --- a/openair1/SCHED_NR_UE/defs.h +++ b/openair1/SCHED_NR_UE/defs.h @@ -295,7 +295,7 @@ int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB); @param timing_advance TA command @param mu numerology index (0,1,2..) */ -void nr_process_timing_advance(module_id_t Mod_id,uint8_t CC_id,uint8_t timing_advance, uint8_t mu); +void nr_process_timing_advance(module_id_t Mod_id,uint8_t CC_id,uint8_t timing_advance, uint8_t mu, uint16_t bwp_ul_NB_RB); void nr_process_timing_advance_rar(PHY_VARS_NR_UE *phy_vars_ue,UE_nr_rxtx_proc_t *proc,uint16_t timing_advance); unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb); diff --git a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c index bccc3a61b9..138f40790f 100644 --- a/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c +++ b/openair1/SCHED_NR_UE/phy_procedures_nr_ue.c @@ -1545,14 +1545,23 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDUR #endif -void nr_process_timing_advance(module_id_t Mod_id, uint8_t CC_id, uint8_t timing_advance, uint8_t mu){ +void nr_process_timing_advance(module_id_t Mod_id, uint8_t CC_id, uint8_t timing_advance, uint8_t mu, uint16_t bwp_ul_NB_RB){ // 3GPP TS 38.213 p4.2 - + // scale by the scs numerology int factor_mu = 1 << mu; + uint16_t bw_scaling; - //PHY_vars_UE_g[Mod_id][CC_id]->timing_advance += (timing_advance - 31) * 1024 / factor_mu ; + // scale the 16 factor in N_TA calculation in 38.213 section 4.2 according to the used FFT size + switch (bwp_ul_NB_RB) { + case 106: bw_scaling = 16; break; + case 217: bw_scaling = 32; break; + case 245: bw_scaling = 32; break; + case 273: bw_scaling = 32; break; + default: abort(); + } + PHY_vars_UE_g[Mod_id][CC_id]->timing_advance += (timing_advance - 31) * bw_scaling / factor_mu; LOG_D(PHY,"[UE %d] Got timing advance %u from MAC, new value is %u\n",Mod_id, timing_advance, PHY_vars_UE_g[Mod_id][CC_id]->timing_advance); } diff --git a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c index 57b418f945..f63620b1d0 100644 --- a/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c +++ b/openair2/LAYER2/NR_MAC_UE/nr_ue_procedures.c @@ -2124,7 +2124,7 @@ void nr_ue_process_mac_pdu( NR_UE_MAC_INST_t *UE_mac_inst = get_mac_inst(module_idP); uint8_t scs = UE_mac_inst->mib->subCarrierSpacingCommon; - + uint16_t bwp_ul_NB_RB = UE_mac_inst->initial_bwp_ul.N_RB; // For both DL/UL-SCH // Except: // - UL/DL-SCH: fixed-size MAC CE(known by LCID) @@ -2293,7 +2293,7 @@ void nr_ue_process_mac_pdu( LOG_D(MAC, "Received TA_COMMAND %u TAGID %u CC_id %d\n", ta_command, tag_id, CC_id); //if (nfapi_mode!=3){ // TODO check nfapi_mode - nr_process_timing_advance(module_idP, CC_id, ta_command, scs); + nr_process_timing_advance(module_idP, CC_id, ta_command, scs, bwp_ul_NB_RB); //} break; diff --git a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c index cc3f0c5001..4443dfdb20 100644 --- a/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c +++ b/openair2/LAYER2/NR_MAC_gNB/gNB_scheduler_ulsch.c @@ -177,7 +177,7 @@ nr_rx_sdu(const module_id_t gnb_mod_idP, */ //UE_scheduling_control->ta_update = (UE_scheduling_control->ta_update * 3 + timing_advance) / 4; UE_scheduling_control->ta_update = timing_advance; - printf("UE_scheduling_control->ta_update %u\n", UE_scheduling_control->ta_update); + // printf("UE_scheduling_control->ta_update %u\n", UE_scheduling_control->ta_update); // UE_scheduling_control->pusch_snr[CC_idP] = ul_cqi; // UE_scheduling_control->ul_consecutive_errors = 0; diff --git a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c index 86a24bd8d6..ac072841f3 100644 --- a/openair2/NR_PHY_INTERFACE/NR_IF_Module.c +++ b/openair2/NR_PHY_INTERFACE/NR_IF_Module.c @@ -169,7 +169,7 @@ void handle_nr_ulsch(NR_UL_IND_t *UL_info) { UL_info->rx_ind.rx_indication_body.number_of_pdus = 0; } } else { - printf("UL_info->rx_ind.rx_indication_body.number_of_pdus %d UL_info->crc_ind.crc_indication_body.number_of_crcs %d\n", UL_info->rx_ind.rx_indication_body.number_of_pdus, UL_info->crc_ind.crc_indication_body.number_of_crcs); + // printf("UL_info->rx_ind.rx_indication_body.number_of_pdus %d UL_info->crc_ind.crc_indication_body.number_of_crcs %d\n", UL_info->rx_ind.rx_indication_body.number_of_pdus, UL_info->crc_ind.crc_indication_body.number_of_crcs); if (UL_info->rx_ind.rx_indication_body.number_of_pdus>0 && UL_info->crc_ind.crc_indication_body.number_of_crcs>0) { for (int i=0; irx_ind.rx_indication_body.number_of_pdus; i++) { for (int j=0; jcrc_ind.crc_indication_body.number_of_crcs; j++) { @@ -205,7 +205,7 @@ void handle_nr_ulsch(NR_UL_IND_t *UL_info) { UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance, UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi); } - printf("rx_indication_rel8.timing_advance %d\n", UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance); + //printf("rx_indication_rel8.timing_advance %d\n", UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.timing_advance); break; } //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==