TA implementation complete and tested in rfsimulator
This commit is contained in:
@@ -119,7 +119,7 @@ SystemInformationBlockType1_nr_t;
|
|||||||
#define NR_TDD_SET_ALL_SYMBOLS (0x3FFF)
|
#define NR_TDD_SET_ALL_SYMBOLS (0x3FFF)
|
||||||
|
|
||||||
#define NR_DOWNLINK_SLOT (0x01)
|
#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 */
|
#define FRAME_DURATION_MICRO_SEC (10000) /* frame duration in microsecond */
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
nfapi_rx_indication_pdu_t *pdu;
|
||||||
|
|
||||||
int timing_advance_update;
|
int timing_advance_update;
|
||||||
int sync_pos;
|
int sync_pos;
|
||||||
|
|
||||||
|
uint16_t mu = gNB->gNB_config.subframe_config.numerology_index_mu.value;
|
||||||
// pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
// pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||||
|
|
||||||
// gNB->UL_INFO.rx_ind.sfn_sf = frame<<4| slot_rx;
|
// 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.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.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->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) {
|
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 106: timing_advance_update /= 16; break;
|
||||||
case 217: timing_advance_update /= 32; break;
|
case 217: timing_advance_update /= 32; break;
|
||||||
|
case 245: timing_advance_update /= 32; break;
|
||||||
case 273: timing_advance_update /= 32; break;
|
case 273: timing_advance_update /= 32; break;
|
||||||
default: abort();
|
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 < 0) timing_advance_update = 0;
|
||||||
if (timing_advance_update > 63) timing_advance_update = 63;
|
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;
|
pdu->rx_indication_rel8.timing_advance = timing_advance_update;
|
||||||
|
|
||||||
|
|||||||
@@ -295,7 +295,7 @@ int8_t nr_find_ue(uint16_t rnti, PHY_VARS_eNB *phy_vars_eNB);
|
|||||||
@param timing_advance TA command
|
@param timing_advance TA command
|
||||||
@param mu numerology index (0,1,2..)
|
@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);
|
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);
|
unsigned int get_tx_amp(int power_dBm, int power_max_dBm, int N_RB_UL, int nb_rb);
|
||||||
|
|||||||
@@ -1545,14 +1545,23 @@ VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDUR
|
|||||||
#endif
|
#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
|
// 3GPP TS 38.213 p4.2
|
||||||
|
// scale by the scs numerology
|
||||||
int factor_mu = 1 << mu;
|
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);
|
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);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2124,7 +2124,7 @@ void nr_ue_process_mac_pdu(
|
|||||||
|
|
||||||
NR_UE_MAC_INST_t *UE_mac_inst = get_mac_inst(module_idP);
|
NR_UE_MAC_INST_t *UE_mac_inst = get_mac_inst(module_idP);
|
||||||
uint8_t scs = UE_mac_inst->mib->subCarrierSpacingCommon;
|
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
|
// For both DL/UL-SCH
|
||||||
// Except:
|
// Except:
|
||||||
// - UL/DL-SCH: fixed-size MAC CE(known by LCID)
|
// - 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);
|
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
|
//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;
|
break;
|
||||||
|
|||||||
@@ -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 = (UE_scheduling_control->ta_update * 3 + timing_advance) / 4;
|
||||||
UE_scheduling_control->ta_update = timing_advance;
|
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->pusch_snr[CC_idP] = ul_cqi;
|
||||||
// UE_scheduling_control->ul_consecutive_errors = 0;
|
// UE_scheduling_control->ul_consecutive_errors = 0;
|
||||||
|
|
||||||
|
|||||||
@@ -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;
|
UL_info->rx_ind.rx_indication_body.number_of_pdus = 0;
|
||||||
}
|
}
|
||||||
} else {
|
} 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) {
|
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; i<UL_info->rx_ind.rx_indication_body.number_of_pdus; i++) {
|
for (int i=0; i<UL_info->rx_ind.rx_indication_body.number_of_pdus; i++) {
|
||||||
for (int j=0; j<UL_info->crc_ind.crc_indication_body.number_of_crcs; j++) {
|
for (int j=0; j<UL_info->crc_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.timing_advance,
|
||||||
UL_info->rx_ind.rx_indication_body.rx_pdu_list[i].rx_indication_rel8.ul_cqi);
|
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;
|
break;
|
||||||
} //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
|
} //if (UL_info->crc_ind.crc_pdu_list[j].rx_ue_information.rnti ==
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user