|
|
|
@@ -4798,3 +4798,193 @@ uint8_t is_ri_TXOp(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t gNB_id)
|
|
|
|
|
else
|
|
|
|
|
return(0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void nr_ue_prach_procedures(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode) {
|
|
|
|
|
|
|
|
|
|
int frame_tx = proc->frame_tx;
|
|
|
|
|
int nr_tti_tx = proc->nr_tti_tx;
|
|
|
|
|
int prach_power;
|
|
|
|
|
uint16_t preamble_tx=50;
|
|
|
|
|
PRACH_RESOURCES_t prach_resources;
|
|
|
|
|
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_IN);
|
|
|
|
|
|
|
|
|
|
ue->generate_nr_prach=0;
|
|
|
|
|
if (ue->mac_enabled==0){
|
|
|
|
|
ue->prach_resources[eNB_id] = &prach_resources;
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PreambleIndex = preamble_tx;
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_TDD_map_index = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ue->mac_enabled==1){
|
|
|
|
|
|
|
|
|
|
// ask L2 for RACH transport
|
|
|
|
|
if ((mode != rx_calib_ue) && (mode != rx_calib_ue_med) && (mode != rx_calib_ue_byp) && (mode != no_L2_connect) ) {
|
|
|
|
|
LOG_D(PHY,"Getting PRACH resources\n");
|
|
|
|
|
//ue->prach_resources[eNB_id] = mac_xface->ue_get_rach(ue->Mod_id,ue->CC_id,frame_tx,eNB_id,nr_tti_tx);
|
|
|
|
|
// LOG_D(PHY,"Got prach_resources for eNB %d address %p, RRCCommon %p\n",eNB_id,ue->prach_resources[eNB_id],UE_mac_inst[ue->Mod_id].radioResourceConfigCommon);
|
|
|
|
|
// LOG_D(PHY,"Prach resources %p\n",ue->prach_resources[eNB_id]);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (ue->prach_resources[eNB_id]!=NULL) {
|
|
|
|
|
|
|
|
|
|
ue->generate_nr_prach=1;
|
|
|
|
|
ue->prach_cnt=0;
|
|
|
|
|
#ifdef SMBV
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PreambleIndex = preamble_tx;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
#ifdef OAI_EMU
|
|
|
|
|
ue->prach_PreambleIndex=ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (abstraction_flag == 0) {
|
|
|
|
|
|
|
|
|
|
LOG_I(PHY,"mode %d\n",mode);
|
|
|
|
|
|
|
|
|
|
if ((ue->mac_enabled==1) && (mode != calib_prach_tx)) {
|
|
|
|
|
|
|
|
|
|
ue->tx_power_dBm[nr_tti_tx] = ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_nr_PL(ue,eNB_id);
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
ue->tx_power_dBm[nr_tti_tx] = ue->tx_power_max_dBm;
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PreambleIndex = preamble_tx;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_I(PHY,"[UE %d][RAPROC] Frame %d, nr_tti_rx %d : Generating PRACH, preamble %d,PL %d, P0_PRACH %d, TARGET_RECEIVED_POWER %d dBm, PRACH TDD Resource index %d, RA-RNTI %d\n",
|
|
|
|
|
ue->Mod_id,
|
|
|
|
|
frame_tx,
|
|
|
|
|
nr_tti_tx,
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PreambleIndex,
|
|
|
|
|
get_nr_PL(ue,eNB_id),
|
|
|
|
|
ue->tx_power_dBm[nr_tti_tx],
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER,
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_TDD_map_index,
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_RNTI);
|
|
|
|
|
|
|
|
|
|
ue->tx_total_RE[nr_tti_tx] = 96;
|
|
|
|
|
|
|
|
|
|
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF) || defined(OAI_LMSSDR) || defined(OAI_ADRV9371_ZC706)
|
|
|
|
|
ue->prach_vars[eNB_id]->amp = get_tx_amp(ue->tx_power_dBm[nr_tti_tx],
|
|
|
|
|
ue->tx_power_max_dBm,
|
|
|
|
|
ue->frame_parms.N_RB_UL,
|
|
|
|
|
6);
|
|
|
|
|
#else
|
|
|
|
|
ue->prach_vars[eNB_id]->amp = AMP;
|
|
|
|
|
#endif
|
|
|
|
|
if ((mode == calib_prach_tx) && (((proc->frame_tx&0xfffe)%100)==0))
|
|
|
|
|
LOG_D(PHY,"[UE %d][RAPROC] Frame %d, nr_tti_rx %d : PRACH TX power %d dBm, amp %d\n",
|
|
|
|
|
ue->Mod_id,
|
|
|
|
|
proc->frame_rx,
|
|
|
|
|
proc->nr_tti_tx,
|
|
|
|
|
ue->tx_power_dBm[nr_tti_tx],
|
|
|
|
|
ue->prach_vars[eNB_id]->amp);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// start_meas(&ue->tx_prach);
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_IN);
|
|
|
|
|
|
|
|
|
|
// prach_power = generate_nr_prach(ue,eNB_id,nr_tti_tx,frame_tx);
|
|
|
|
|
prach_power = generate_nr_prach(ue,0,9,0); //subframe number hardcoded according to the simulator
|
|
|
|
|
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GENERATE_PRACH, VCD_FUNCTION_OUT);
|
|
|
|
|
// stop_meas(&ue->tx_prach);
|
|
|
|
|
LOG_D(PHY,"[UE %d][RAPROC] PRACH PL %d dB, power %d dBm, digital power %d dB (amp %d)\n",
|
|
|
|
|
ue->Mod_id,
|
|
|
|
|
get_nr_PL(ue,eNB_id),
|
|
|
|
|
ue->tx_power_dBm[nr_tti_tx],
|
|
|
|
|
dB_fixed(prach_power),
|
|
|
|
|
ue->prach_vars[eNB_id]->amp);
|
|
|
|
|
}/* else {
|
|
|
|
|
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_flag=1;
|
|
|
|
|
UE_transport_info[ue->Mod_id][ue->CC_id].cntl.prach_id=ue->prach_resources[eNB_id]->ra_PreambleIndex;
|
|
|
|
|
}*/ // commented for compiling as abstraction flag is 0
|
|
|
|
|
|
|
|
|
|
if (ue->mac_enabled==1){
|
|
|
|
|
//mac_xface->Msg1_transmitted(ue->Mod_id,ue->CC_id,frame_tx,eNB_id);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_I(PHY,"[UE %d][RAPROC] Frame %d, nr_tti_rx %d: Generating PRACH (eNB %d) preamble index %d for UL, TX power %d dBm (PL %d dB), l3msg \n",
|
|
|
|
|
ue->Mod_id,frame_tx,nr_tti_tx,eNB_id,
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PreambleIndex,
|
|
|
|
|
ue->prach_resources[eNB_id]->ra_PREAMBLE_RECEIVED_TARGET_POWER+get_nr_PL(ue,eNB_id),
|
|
|
|
|
get_nr_PL(ue,eNB_id));
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// if we're calibrating the PRACH kill the pointer to its resources so that the RA protocol doesn't continue
|
|
|
|
|
if (mode == calib_prach_tx)
|
|
|
|
|
ue->prach_resources[eNB_id]=NULL;
|
|
|
|
|
|
|
|
|
|
LOG_D(PHY,"[UE %d] frame %d nr_tti_rx %d : generate_nr_prach %d, prach_cnt %d\n",
|
|
|
|
|
ue->Mod_id,frame_tx,nr_tti_tx,ue->generate_nr_prach,ue->prach_cnt);
|
|
|
|
|
|
|
|
|
|
ue->prach_cnt++;
|
|
|
|
|
|
|
|
|
|
if (ue->prach_cnt==3)
|
|
|
|
|
ue->generate_nr_prach=0;
|
|
|
|
|
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX_PRACH, VCD_FUNCTION_OUT);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//Yet to be done
|
|
|
|
|
/* void phy_procedures_nrUE_TX(PHY_VARS_NR_UE *ue,UE_nr_rxtx_proc_t *proc,uint8_t eNB_id,uint8_t abstraction_flag,runmode_t mode,relaying_type_t r_type) {
|
|
|
|
|
|
|
|
|
|
NR_DL_FRAME_PARMS *frame_parms=&ue->frame_parms;
|
|
|
|
|
int32_t ulsch_start=0;
|
|
|
|
|
int nr_tti_tx = proc->nr_tti_tx;
|
|
|
|
|
int frame_tx = proc->frame_tx;
|
|
|
|
|
unsigned int aa;
|
|
|
|
|
uint8_t isSubframeSRS;
|
|
|
|
|
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX,VCD_FUNCTION_IN);
|
|
|
|
|
|
|
|
|
|
LOG_D(PHY,"****** start TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, nr_tti_tx);
|
|
|
|
|
ue->generate_ul_signal[eNB_id] = 0;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#if UE_TIMING_TRACE
|
|
|
|
|
start_meas(&ue->phy_proc_tx);
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
ue->tx_power_dBm[nr_tti_tx]=-127;
|
|
|
|
|
printf("ue mode =%d\n",ue->UE_mode[eNB_id]);
|
|
|
|
|
|
|
|
|
|
if (abstraction_flag==0) {
|
|
|
|
|
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
|
|
|
|
memset(&ue->common_vars.txdataF[aa][nr_tti_tx*frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti],0,frame_parms->ofdm_symbol_size*frame_parms->symbols_per_tti*sizeof(int32_t));
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (abstraction_flag == 0) {
|
|
|
|
|
ulsch_common_procedures(ue,proc, (ue->generate_ul_signal[eNB_id] == 0));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
ue->UE_mode[eNB_id]=1;
|
|
|
|
|
ue->frame_parms.prach_config_common.prach_Config_enabled=1;
|
|
|
|
|
printf("S: ue->UE_mode[eNB_id] == PRACH is %d and ue->frame_parms.prach_config_common.prach_Config_enabled is %d\n", ue->UE_mode[eNB_id],ue->frame_parms.prach_config_common.prach_Config_enabled);
|
|
|
|
|
if ((ue->UE_mode[eNB_id] == PRACH) &&
|
|
|
|
|
(ue->frame_parms.prach_config_common.prach_Config_enabled==1)) {
|
|
|
|
|
|
|
|
|
|
// check if we have PRACH opportunity
|
|
|
|
|
if (is_nr_prach_subframe(&ue->frame_parms,frame_tx,nr_tti_tx)) {
|
|
|
|
|
printf("the value of is_nr_prach subframe is %d\n",is_nr_prach_subframe(&ue->frame_parms,frame_tx,nr_tti_tx));
|
|
|
|
|
nr_ue_prach_procedures(ue,proc,eNB_id,abstraction_flag,mode);
|
|
|
|
|
}
|
|
|
|
|
} // mode is PRACH
|
|
|
|
|
else {
|
|
|
|
|
ue->generate_prach=0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
LOG_D(PHY,"****** end TX-Chain for AbsSubframe %d.%d ******\n", frame_tx, nr_tti_tx);
|
|
|
|
|
|
|
|
|
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_UE_TX, VCD_FUNCTION_OUT);
|
|
|
|
|
#if UE_TIMING_TRACE
|
|
|
|
|
stop_meas(&ue->phy_proc_tx);
|
|
|
|
|
#endif
|
|
|
|
|
} */
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|