slot-based processing in nr-ru. All compilations and unitary simulators ok.
This commit is contained in:
@@ -120,10 +120,10 @@ typedef struct RU_proc_t_s {
|
||||
openair0_timestamp timestamp_rx;
|
||||
/// timestamp to send to "slave rru"
|
||||
openair0_timestamp timestamp_tx;
|
||||
/// subframe to act upon for reception
|
||||
int subframe_rx;
|
||||
/// subframe to act upon for transmission
|
||||
int subframe_tx;
|
||||
/// subframe (LTE) / slot (NR) to act upon for reception
|
||||
int tti_rx;
|
||||
/// subframe (LTE) / slot (NR) to act upon for transmission
|
||||
int tti_tx;
|
||||
/// subframe to act upon for reception of prach
|
||||
int subframe_prach;
|
||||
#if (RRC_VERSION >= MAKE_VERSION(14, 0, 0))
|
||||
@@ -420,7 +420,7 @@ typedef struct RU_t_s{
|
||||
|
||||
/// function pointer to NB entry routine
|
||||
void (*eNB_top)(struct PHY_VARS_eNB_s *eNB, int frame_rx, int subframe_rx, char *string, struct RU_t_s *ru);
|
||||
void (*gNB_top)(struct PHY_VARS_gNB_s *gNB, int frame_rx, int subframe_rx, char *string, struct RU_t_s *ru);
|
||||
void (*gNB_top)(struct PHY_VARS_gNB_s *gNB, int frame_rx, int slot_rx, char *string, struct RU_t_s *ru);
|
||||
|
||||
/// Timing statistics
|
||||
time_stats_t ofdm_demod_stats;
|
||||
|
||||
@@ -61,7 +61,7 @@ void feptx0(RU_t *ru,int slot) {
|
||||
unsigned int aa,slot_offset;
|
||||
int slot_sizeF = (fp->ofdm_symbol_size)*
|
||||
((fp->Ncp==1) ? 6 : 7);
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
int subframe = ru->proc.tti_tx;
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 1 );
|
||||
@@ -172,7 +172,7 @@ void feptx_ofdm_2thread(RU_t *ru) {
|
||||
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
struct timespec wait;
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
int subframe = ru->proc.tti_tx;
|
||||
|
||||
wait.tv_sec=0;
|
||||
wait.tv_nsec=5000000L;
|
||||
@@ -239,7 +239,7 @@ void feptx_ofdm(RU_t *ru) {
|
||||
((fp->Ncp==1) ? 6 : 7);
|
||||
int len,len2;
|
||||
int16_t *txdata;
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
int subframe = ru->proc.tti_tx;
|
||||
|
||||
// int CC_id = ru->proc.CC_id;
|
||||
|
||||
@@ -374,7 +374,7 @@ void feptx_prec(RU_t *ru) {
|
||||
PHY_VARS_eNB **eNB_list = ru->eNB_list,*eNB;
|
||||
LTE_DL_FRAME_PARMS *fp;
|
||||
int32_t ***bw;
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
int subframe = ru->proc.tti_tx;
|
||||
|
||||
if (ru->num_eNB == 1) {
|
||||
eNB = eNB_list[0];
|
||||
@@ -420,7 +420,7 @@ void fep0(RU_t *ru,int slot) {
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX+slot, 1);
|
||||
|
||||
remove_7_5_kHz(ru,(slot&1)+(proc->subframe_rx<<1));
|
||||
remove_7_5_kHz(ru,(slot&1)+(proc->tti_rx<<1));
|
||||
for (l=0; l<fp->symbols_per_tti/2; l++) {
|
||||
slot_fep_ul(ru,
|
||||
l,
|
||||
@@ -537,7 +537,7 @@ void ru_fep_full_2thread(RU_t *ru) {
|
||||
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
||||
|
||||
if ((fp->frame_type == TDD) &&
|
||||
(subframe_select(fp,proc->subframe_rx) != SF_UL)) return;
|
||||
(subframe_select(fp,proc->tti_rx) != SF_UL)) return;
|
||||
|
||||
if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 );
|
||||
|
||||
@@ -580,7 +580,7 @@ void ru_fep_full_2thread(RU_t *ru) {
|
||||
stop_meas(&ru->ofdm_demod_wait_stats);
|
||||
if(opp_enabled == 1 && ru->ofdm_demod_wakeup_stats.p_time>30*3000){
|
||||
print_meas_now(&ru->ofdm_demod_wakeup_stats,"fep wakeup",stderr);
|
||||
printf("delay in fep wait on codition in frame_rx: %d subframe_rx: %d \n",proc->frame_rx,proc->subframe_rx);
|
||||
printf("delay in fep wait on codition in frame_rx: %d subframe_rx: %d \n",proc->frame_rx,proc->tti_rx);
|
||||
}
|
||||
|
||||
stop_meas(&ru->ofdm_demod_stats);
|
||||
@@ -596,13 +596,13 @@ void fep_full(RU_t *ru) {
|
||||
LTE_DL_FRAME_PARMS *fp=ru->frame_parms;
|
||||
|
||||
if ((fp->frame_type == TDD) &&
|
||||
(subframe_select(fp,proc->subframe_rx) != SF_UL)) return;
|
||||
(subframe_select(fp,proc->tti_rx) != SF_UL)) return;
|
||||
|
||||
start_meas(&ru->ofdm_demod_stats);
|
||||
if (ru->idx == 0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPRX, 1 );
|
||||
|
||||
remove_7_5_kHz(ru,proc->subframe_rx<<1);
|
||||
remove_7_5_kHz(ru,1+(proc->subframe_rx<<1));
|
||||
remove_7_5_kHz(ru,proc->tti_rx<<1);
|
||||
remove_7_5_kHz(ru,1+(proc->tti_rx<<1));
|
||||
|
||||
for (l=0; l<fp->symbols_per_tti/2; l++) {
|
||||
slot_fep_ul(ru,
|
||||
|
||||
@@ -58,38 +58,58 @@ extern openair0_config_t openair0_cfg[MAX_CARDS];
|
||||
|
||||
extern int oai_exit;
|
||||
|
||||
void nr_feptx0(RU_t *ru,int slot) {
|
||||
void nr_feptx0(RU_t *ru,int first_symbol, int num_symbols) {
|
||||
|
||||
NR_DL_FRAME_PARMS *fp = ru->nr_frame_parms;
|
||||
|
||||
unsigned int aa,slot_offset;
|
||||
int slot_sizeF = fp->ofdm_symbol_size * fp->symbols_per_slot;
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
unsigned int aa,slot_offset,slot_offsetF;
|
||||
int slot = ru->proc.tti_tx;
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM, 1 );
|
||||
|
||||
slot_offset = subframe*fp->samples_per_subframe + (slot*(fp->samples_per_subframe / fp->slots_per_subframe));
|
||||
slot_offset = slot*fp->samples_per_slot;
|
||||
slot_offsetF = first_symbol*fp->ofdm_symbol_size;
|
||||
|
||||
LOG_D(PHY,"SFN/SF:RU:TX:%d/%d Generating slot %d\n",ru->proc.frame_tx, ru->proc.subframe_tx,slot);
|
||||
if (first_symbol>0) slot_offset += (fp->ofdm_symbol_size*first_symbol) + (fp->nb_prefix_samples0) + (fp->nb_prefix_samples*(first_symbol-1));
|
||||
|
||||
LOG_D(PHY,"SFN/SF:RU:TX:%d/%d Generating slot %d (first_symbol %d num_symbols %d)\n",ru->proc.frame_tx, ru->proc.tti_tx,slot,first_symbol,num_symbols);
|
||||
|
||||
for (aa=0; aa<ru->nb_tx; aa++) {
|
||||
if (fp->Ncp == 1) {
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->ofdm_symbol_size,
|
||||
12,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->ofdm_symbol_size,
|
||||
num_symbols,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
}
|
||||
else {
|
||||
nr_normal_prefix_mod(&ru->common.txdataF_BF[aa][slot*slot_sizeF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->symbols_per_slot,
|
||||
fp);
|
||||
if (first_symbol==0) {
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->ofdm_symbol_size,
|
||||
1,
|
||||
fp->nb_prefix_samples0,
|
||||
CYCLIC_PREFIX);
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF+fp->ofdm_symbol_size],
|
||||
(int*)&ru->common.txdata[aa][slot_offset+fp->nb_prefix_samples0+fp->ofdm_symbol_size],
|
||||
fp->ofdm_symbol_size,
|
||||
num_symbols-1,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
}
|
||||
else {
|
||||
PHY_ofdm_mod(&ru->common.txdataF_BF[aa][slot_offsetF],
|
||||
(int*)&ru->common.txdata[aa][slot_offset],
|
||||
fp->ofdm_symbol_size,
|
||||
num_symbols,
|
||||
fp->nb_prefix_samples,
|
||||
CYCLIC_PREFIX);
|
||||
}
|
||||
}
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM+slot , 0);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM, 0);
|
||||
}
|
||||
|
||||
void nr_feptx_ofdm_2thread(RU_t *ru) {
|
||||
@@ -98,24 +118,24 @@ void nr_feptx_ofdm_2thread(RU_t *ru) {
|
||||
nfapi_nr_config_request_t *cfg = &ru->gNB_list[0]->gNB_config;
|
||||
RU_proc_t *proc = &ru->proc;
|
||||
struct timespec wait;
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
int slot = ru->proc.tti_tx;
|
||||
|
||||
wait.tv_sec=0;
|
||||
wait.tv_nsec=5000000L;
|
||||
|
||||
start_meas(&ru->ofdm_mod_stats);
|
||||
|
||||
if (nr_subframe_select(cfg,subframe) == SF_UL) return;
|
||||
if (nr_slot_select(cfg,slot) == SF_UL) return;
|
||||
|
||||
// this copy should be done in the precoding thread (currently inactive)
|
||||
for (int aa=0;aa<ru->nb_tx;aa++)
|
||||
memcpy((void*)ru->common.txdataF_BF[aa],
|
||||
(void*)ru->gNB_list[0]->common_vars.txdataF[aa], fp->samples_per_subframe_wCP*sizeof(int32_t));
|
||||
memcpy((void*)ru->common.txdataF_BF[aa],
|
||||
(void*)ru->gNB_list[0]->common_vars.txdataF[aa], fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 );
|
||||
|
||||
if (nr_subframe_select(cfg,subframe)==SF_DL) {
|
||||
// If this is not an S-subframe
|
||||
if (nr_slot_select(cfg,slot)==SF_DL) {
|
||||
// If this is not an S-tti
|
||||
if (pthread_mutex_timedlock(&proc->mutex_feptx,&wait) != 0) {
|
||||
printf("[RU] ERROR pthread_mutex_lock for feptx thread (IC %d)\n", proc->instance_cnt_feptx);
|
||||
exit_fun( "error locking mutex_feptx" );
|
||||
@@ -141,8 +161,8 @@ void nr_feptx_ofdm_2thread(RU_t *ru) {
|
||||
pthread_mutex_unlock( &proc->mutex_feptx );
|
||||
}
|
||||
|
||||
// call first slot in this thread
|
||||
nr_feptx0(ru,0);
|
||||
// call first half-slot in this thread
|
||||
nr_feptx0(ru,0,fp->symbols_per_slot>>1);
|
||||
wait_on_busy_condition(&proc->mutex_feptx,&proc->cond_feptx,&proc->instance_cnt_feptx,"NR feptx thread");
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 );
|
||||
@@ -163,7 +183,7 @@ static void *nr_feptx_thread(void *param) {
|
||||
while (!oai_exit) {
|
||||
|
||||
if (wait_on_condition(&proc->mutex_feptx,&proc->cond_feptx,&proc->instance_cnt_feptx,"NR feptx thread")<0) break;
|
||||
nr_feptx0(ru,1);
|
||||
nr_feptx0(ru,ru->nr_frame_parms->symbols_per_slot>>1,ru->nr_frame_parms->symbols_per_slot>>1);
|
||||
if (release_thread(&proc->mutex_feptx,&proc->instance_cnt_feptx,"NR feptx thread")<0) break;
|
||||
|
||||
if (pthread_cond_signal(&proc->cond_feptx) != 0) {
|
||||
@@ -196,11 +216,11 @@ void nr_feptx_ofdm(RU_t *ru) {
|
||||
NR_DL_FRAME_PARMS *fp=ru->nr_frame_parms;
|
||||
nfapi_nr_config_request_t *cfg = &ru->gNB_list[0]->gNB_config;
|
||||
|
||||
unsigned int aa=0,slot=0;
|
||||
unsigned int aa=0;
|
||||
int slot_sizeF = (fp->ofdm_symbol_size)*
|
||||
((cfg->subframe_config.dl_cyclic_prefix_type.value == 1) ? 12 : 14);
|
||||
int subframe = ru->proc.subframe_tx;
|
||||
int *txdata = &ru->common.txdata[aa][subframe*fp->samples_per_subframe];
|
||||
int slot = ru->proc.tti_tx;
|
||||
int *txdata = &ru->common.txdata[aa][slot*fp->samples_per_slot];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 1 );
|
||||
start_meas(&ru->ofdm_mod_stats);
|
||||
@@ -208,22 +228,21 @@ void nr_feptx_ofdm(RU_t *ru) {
|
||||
// this copy should be done in the precoding thread (currently inactive)
|
||||
for (int aa=0;aa<ru->nb_tx;aa++)
|
||||
memcpy((void*)ru->common.txdataF_BF[aa],
|
||||
(void*)ru->gNB_list[0]->common_vars.txdataF[aa], fp->samples_per_subframe_wCP*sizeof(int32_t));
|
||||
(void*)ru->gNB_list[0]->common_vars.txdataF[aa], fp->samples_per_slot_wCP*sizeof(int32_t));
|
||||
|
||||
if ((nr_subframe_select(cfg,subframe)==SF_DL)||
|
||||
((nr_subframe_select(cfg,subframe)==SF_S))) {
|
||||
if ((nr_slot_select(cfg,slot)==SF_DL)||
|
||||
((nr_slot_select(cfg,slot)==SF_S))) {
|
||||
// LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
|
||||
|
||||
for (slot=0; slot<fp->slots_per_subframe;slot++)
|
||||
nr_feptx0(ru,slot);
|
||||
nr_feptx0(ru,0,fp->symbols_per_slot);
|
||||
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_RU_FEPTX_OFDM , 0 );
|
||||
stop_meas(&ru->ofdm_mod_stats);
|
||||
|
||||
LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, subframe %d: txp (time %p) %d dB, txp (freq) %d dB\n",
|
||||
ru->proc.frame_tx,subframe,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_subframe)),
|
||||
LOG_D(PHY,"feptx_ofdm (TXPATH): frame %d, slot %d: txp (time %p) %d dB, txp (freq) %d dB\n",
|
||||
ru->proc.frame_tx,slot,txdata,dB_fixed(signal_energy((int32_t*)txdata,fp->samples_per_slot)),
|
||||
dB_fixed(signal_energy_nodc(ru->common.txdataF_BF[aa],2*slot_sizeF)));
|
||||
|
||||
}
|
||||
|
||||
@@ -41,7 +41,7 @@ void nr_common_signal_procedures (PHY_VARS_gNB *gNB,int frame, int slot);
|
||||
void nr_init_feptx_thread(RU_t *ru,pthread_attr_t *attr_feptx);
|
||||
void nr_feptx_ofdm(RU_t *ru);
|
||||
void nr_feptx_ofdm_2thread(RU_t *ru);
|
||||
void nr_feptx0(RU_t *ru,int slot);
|
||||
void nr_feptx0(RU_t *ru,int first_symbol, int num_symbols);
|
||||
|
||||
void nr_configure_css_dci_initial(nfapi_nr_dl_config_pdcch_parameters_rel15_t* pdcch_params,
|
||||
nr_scs_e scs_common,
|
||||
|
||||
@@ -72,7 +72,6 @@ int oai_nfapi_ul_config_req(nfapi_ul_config_request_t *ul_config_req) { return(0
|
||||
|
||||
int oai_nfapi_nr_dl_config_req(nfapi_nr_dl_config_request_t *dl_config_req) {return(0);}
|
||||
|
||||
uint32_t from_nrarfcn(int nr_bandP,uint32_t dl_nrarfcn) {return(0);}
|
||||
int32_t get_uldl_offset(int nr_bandP) {return(0);}
|
||||
|
||||
NR_IF_Module_t *NR_IF_Module_init(int Mod_id){return(NULL);}
|
||||
|
||||
Reference in New Issue
Block a user