Merge remote-tracking branch 'origin/442-integrate-pusch-into-nr-ue-softmodem' into nr_fapi_for_push
This commit is contained in:
@@ -193,7 +193,6 @@ static inline int rxtx(PHY_VARS_gNB *gNB,int frame_rx, int slot_rx, int frame_tx
|
|||||||
// UE-specific RX processing for subframe n
|
// UE-specific RX processing for subframe n
|
||||||
if (nfapi_mode == 0 || nfapi_mode == 1) */
|
if (nfapi_mode == 0 || nfapi_mode == 1) */
|
||||||
|
|
||||||
|
|
||||||
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
pthread_mutex_lock(&gNB->UL_INFO_mutex);
|
||||||
gNB->UL_INFO.frame = frame_rx;
|
gNB->UL_INFO.frame = frame_rx;
|
||||||
gNB->UL_INFO.slot = slot_rx;
|
gNB->UL_INFO.slot = slot_rx;
|
||||||
|
|||||||
+22
-13
@@ -731,10 +731,18 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
|
|||||||
int i;
|
int i;
|
||||||
T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(frame), T_INT(slot),
|
T(T_ENB_PHY_OUTPUT_SIGNAL, T_INT(0), T_INT(0), T_INT(frame), T_INT(slot),
|
||||||
T_INT(0), T_BUFFER(&ru->common.txdata[0][slot * fp->samples_per_slot], fp->samples_per_slot * 4));
|
T_INT(0), T_BUFFER(&ru->common.txdata[0][slot * fp->samples_per_slot], fp->samples_per_slot * 4));
|
||||||
nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame);
|
|
||||||
int sf_extension = 0;
|
int sf_extension = 0;
|
||||||
|
nr_subframe_t SF_type = nr_slot_select(cfg,slot%fp->slots_per_frame);
|
||||||
|
|
||||||
|
if ((slot == 0) ||
|
||||||
|
(slot == 1)) {
|
||||||
|
int siglen=fp->samples_per_slot;
|
||||||
|
int flags;
|
||||||
|
if (slot==0)
|
||||||
|
flags = 2;
|
||||||
|
else if (slot==1)
|
||||||
|
flags=3;
|
||||||
|
|
||||||
int siglen=fp->samples_per_slot,flags=1;
|
|
||||||
/*
|
/*
|
||||||
if (SF_type == SF_S) {
|
if (SF_type == SF_S) {
|
||||||
siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0);
|
siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0);
|
||||||
@@ -774,6 +782,7 @@ void tx_rf(RU_t *ru,int frame,int slot, uint64_t timestamp) {
|
|||||||
(long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot);
|
(long long unsigned int)timestamp,frame,proc->frame_tx_unwrap,slot);
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||||
AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %d/%d)\n",txs, siglen);
|
AssertFatal(txs == siglen+sf_extension,"TX : Timeout (sent %d/%d)\n",txs, siglen);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -1990,8 +1999,8 @@ void set_function_spec_param(RU_t *ru) {
|
|||||||
ru->fh_north_out = fh_if4p5_north_out; // send_IF4p5 on reception
|
ru->fh_north_out = fh_if4p5_north_out; // send_IF4p5 on reception
|
||||||
ru->fh_south_out = tx_rf; // send output to RF
|
ru->fh_south_out = tx_rf; // send output to RF
|
||||||
ru->fh_north_asynch_in = fh_if4p5_north_asynch_in; // TX packets come asynchronously
|
ru->fh_north_asynch_in = fh_if4p5_north_asynch_in; // TX packets come asynchronously
|
||||||
ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_fep_full_2thread : nr_fep_full; // RX DFTs
|
ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_fep_full_2thread : nr_fep_full; // RX DFTs
|
||||||
ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // this is fep with idft only (no precoding in RRU)
|
ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // this is fep with idft only (no precoding in RRU)
|
||||||
ru->feptx_prec = NULL;
|
ru->feptx_prec = NULL;
|
||||||
ru->nr_start_if = nr_start_if; // need to start the if interface for if4p5
|
ru->nr_start_if = nr_start_if; // need to start the if interface for if4p5
|
||||||
ru->ifdevice.host_type = RRU_HOST;
|
ru->ifdevice.host_type = RRU_HOST;
|
||||||
@@ -2012,8 +2021,8 @@ void set_function_spec_param(RU_t *ru) {
|
|||||||
malloc_IF4p5_buffer(ru);
|
malloc_IF4p5_buffer(ru);
|
||||||
} else if (ru->function == gNodeB_3GPP) {
|
} else if (ru->function == gNodeB_3GPP) {
|
||||||
ru->do_prach = 0; // no prach processing in RU
|
ru->do_prach = 0; // no prach processing in RU
|
||||||
ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_fep_full_2thread : nr_fep_full; // RX DFTs
|
ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_fep_full_2thread : nr_fep_full; // RX DFTs
|
||||||
ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // this is fep with idft and precoding
|
ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // this is fep with idft and precoding
|
||||||
ru->feptx_prec = NULL; // this is fep with idft and precoding
|
ru->feptx_prec = NULL; // this is fep with idft and precoding
|
||||||
ru->fh_north_in = NULL; // no incoming fronthaul from north
|
ru->fh_north_in = NULL; // no incoming fronthaul from north
|
||||||
ru->fh_north_out = NULL; // no outgoing fronthaul to north
|
ru->fh_north_out = NULL; // no outgoing fronthaul to north
|
||||||
@@ -2042,13 +2051,13 @@ void set_function_spec_param(RU_t *ru) {
|
|||||||
|
|
||||||
case REMOTE_IF5: // the remote unit is IF5 RRU
|
case REMOTE_IF5: // the remote unit is IF5 RRU
|
||||||
ru->do_prach = 0;
|
ru->do_prach = 0;
|
||||||
ru->feprx = nr_fep_full; // this is frequency-shift + DFTs
|
ru->feprx = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_fep_full_2thread : nr_fep_full; // this is frequency-shift + DFTs
|
||||||
ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
|
ru->feptx_prec = feptx_prec; // need to do transmit Precoding + IDFTs
|
||||||
ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // need to do transmit Precoding + IDFTs
|
ru->feptx_ofdm = (get_thread_worker_conf() == WORKER_ENABLE) ? nr_feptx_ofdm_2thread : nr_feptx_ofdm; // need to do transmit Precoding + IDFTs
|
||||||
ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
|
ru->fh_south_in = fh_if5_south_in; // synchronous IF5 reception
|
||||||
ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission
|
ru->fh_south_out = fh_if5_south_out; // synchronous IF5 transmission
|
||||||
ru->fh_south_asynch_in = NULL; // no asynchronous UL
|
ru->fh_south_asynch_in = NULL; // no asynchronous UL
|
||||||
ru->start_rf = NULL; // no local RF
|
ru->start_rf = NULL; // no local RF
|
||||||
ru->stop_rf = NULL;
|
ru->stop_rf = NULL;
|
||||||
ru->nr_start_if = nr_start_if; // need to start if interface for IF5
|
ru->nr_start_if = nr_start_if; // need to start if interface for IF5
|
||||||
ru->ifdevice.host_type = RAU_HOST;
|
ru->ifdevice.host_type = RAU_HOST;
|
||||||
|
|||||||
+2
-2
@@ -699,7 +699,7 @@ void *UE_thread(void *arg) {
|
|||||||
slot_nr*UE->frame_parms.samples_per_slot];
|
slot_nr*UE->frame_parms.samples_per_slot];
|
||||||
|
|
||||||
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
for (int i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||||
txp[i] = (void *)&UE->common_vars.txdata[i][((curMsg->proc.nr_tti_rx + 4)%nb_slot_frame)*UE->frame_parms.samples_per_slot];
|
txp[i] = (void *)&UE->common_vars.txdata[i][((curMsg->proc.nr_tti_rx + DURATION_RX_TO_TX)%nb_slot_frame)*UE->frame_parms.samples_per_slot];
|
||||||
|
|
||||||
int readBlockSize, writeBlockSize;
|
int readBlockSize, writeBlockSize;
|
||||||
|
|
||||||
@@ -725,7 +725,7 @@ void *UE_thread(void *arg) {
|
|||||||
AssertFatal( writeBlockSize ==
|
AssertFatal( writeBlockSize ==
|
||||||
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||||
timestamp+
|
timestamp+
|
||||||
(4*UE->frame_parms.samples_per_slot) -
|
(DURATION_RX_TO_TX*UE->frame_parms.samples_per_slot) -
|
||||||
UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0 -
|
UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0 -
|
||||||
openair0_cfg[0].tx_sample_advance,
|
openair0_cfg[0].tx_sample_advance,
|
||||||
txp,
|
txp,
|
||||||
|
|||||||
@@ -507,6 +507,26 @@ void init_nr_transport(PHY_VARS_gNB *gNB) {
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
LOG_I(PHY,"Initializing nFAPI for ULSCH, UE %d\n",i);
|
||||||
|
// [hna] added here for RT implementation
|
||||||
|
uint8_t harq_pid = 0;
|
||||||
|
nfapi_nr_ul_config_ulsch_pdu *rel15_ul = &gNB->ulsch[i+1][j]->harq_processes[harq_pid]->ulsch_pdu;
|
||||||
|
|
||||||
|
// --------- setting rel15_ul parameters ----------
|
||||||
|
rel15_ul->rnti = 0x1234;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.start_rb = 0;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.number_rbs = 50;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.start_symbol = 2;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.number_symbols = 12;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.nb_re_dmrs = 6;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.length_dmrs = 1;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.Qm = 2;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.mcs = 9;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.rv = 0;
|
||||||
|
rel15_ul->ulsch_pdu_rel15.n_layers = 1;
|
||||||
|
///////////////////////////////////////////////////
|
||||||
|
|
||||||
|
//////////////////////////////////////////////////////////////////////////
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,6 +79,32 @@ int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp, uint8_t i_ssb, uint8_t half_f
|
|||||||
return symbol;
|
return symbol;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int nr_is_ssb_slot(nfapi_nr_config_request_t *cfg, int slot)
|
||||||
|
{
|
||||||
|
|
||||||
|
uint8_t n_hf;
|
||||||
|
int rel_slot;
|
||||||
|
|
||||||
|
n_hf = cfg->sch_config.half_frame_index.value;
|
||||||
|
|
||||||
|
// if SSB periodicity is 5ms, they are transmitted in both half frames
|
||||||
|
if ( cfg->sch_config.ssb_periodicity.value == 5) {
|
||||||
|
if (slot<10)
|
||||||
|
n_hf=0;
|
||||||
|
else
|
||||||
|
n_hf=1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// to set a effective slot number between 0 to 9 in the half frame where the SSB is supposed to be
|
||||||
|
rel_slot = (n_hf)? (slot-10) : slot;
|
||||||
|
|
||||||
|
if(rel_slot<10 && rel_slot>=0)
|
||||||
|
return 1;
|
||||||
|
else
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp,
|
int nr_init_frame_parms0(NR_DL_FRAME_PARMS *fp,
|
||||||
int mu,
|
int mu,
|
||||||
|
|||||||
@@ -378,6 +378,7 @@ void phy_config_request(PHY_Config_t *phy_config);
|
|||||||
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
|
int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf);
|
||||||
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
|
void dump_frame_parms(LTE_DL_FRAME_PARMS *frame_parms);
|
||||||
int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp, uint8_t i_ssb, uint8_t half_frame_index);
|
int nr_get_ssb_start_symbol(NR_DL_FRAME_PARMS *fp, uint8_t i_ssb, uint8_t half_frame_index);
|
||||||
|
int nr_is_ssb_slot(nfapi_nr_config_request_t *cfg, int slot);
|
||||||
int nr_init_frame_parms(nfapi_nr_config_request_t *config, NR_DL_FRAME_PARMS *frame_parms);
|
int nr_init_frame_parms(nfapi_nr_config_request_t *config, NR_DL_FRAME_PARMS *frame_parms);
|
||||||
int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms,int mu,int Ncp,int N_RB_DL,int n_ssb_crb,int ssb_subcarrier_offset);
|
int nr_init_frame_parms_ue(NR_DL_FRAME_PARMS *frame_parms,int mu,int Ncp,int N_RB_DL,int n_ssb_crb,int ssb_subcarrier_offset);
|
||||||
int init_nr_ue_signal(PHY_VARS_NR_UE *ue,int nb_connected_eNB,uint8_t abstraction_flag);
|
int init_nr_ue_signal(PHY_VARS_NR_UE *ue,int nb_connected_eNB,uint8_t abstraction_flag);
|
||||||
|
|||||||
@@ -31,6 +31,7 @@
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
#include "sched_nr.h"
|
#include "sched_nr.h"
|
||||||
|
#include "PHY/INIT/phy_init.h"
|
||||||
|
|
||||||
nr_subframe_t nr_slot_select(nfapi_nr_config_request_t *cfg,
|
nr_subframe_t nr_slot_select(nfapi_nr_config_request_t *cfg,
|
||||||
unsigned char slot)
|
unsigned char slot)
|
||||||
|
|||||||
Reference in New Issue
Block a user