Merge branch 'enhancement-10-harmony' of https://gitlab.eurecom.fr/oai/openairinterface5g into enhancement-10-harmony
Conflicts: openair1/PHY/INIT/lte_init.c targets/RT/USER/lte-enb.c targets/RT/USER/lte-softmodem.c targets/SIMU/USER/init_lte.c
This commit is contained in:
@@ -193,7 +193,7 @@ CFLAGS += -DHARD_RT
|
||||
endif
|
||||
|
||||
ifeq ($(EMOS),1)
|
||||
CFLAGS += -D_FILE_OFFSET_BITS=64 -DEMOS #-DEMOS_CHANNEL
|
||||
CFLAGS += -D_FILE_OFFSET_BITS=64 #-DEMOS -DEMOS_CHANNEL
|
||||
LDFLAGS += -lgps
|
||||
endif
|
||||
|
||||
@@ -320,6 +320,7 @@ drivers:
|
||||
# cd $(OPENAIR2_DIR)/NAS/DRIVER/MESH/RB_TOOL && make clean && make
|
||||
cd $(OPENAIR_TARGETS)/ARCH/EXMIMO/DRIVER/eurecom && make clean && make
|
||||
cd $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT && make clean && make
|
||||
cp $(OPENAIR_TARGETS)/ARCH/EXMIMO/USERSPACE/OAI_FW_INIT/updatefw $(OPENAIR_TARGETS)/bin/.
|
||||
|
||||
run: condtest
|
||||
rtai-load condtest --verbose
|
||||
|
||||
+91
-76
@@ -128,6 +128,8 @@ extern pthread_cond_t sync_cond;
|
||||
extern pthread_mutex_t sync_mutex;
|
||||
extern int sync_var;
|
||||
|
||||
extern transmission_mode;
|
||||
|
||||
//pthread_t main_eNB_thread;
|
||||
|
||||
time_stats_t softmodem_stats_mt; // main thread
|
||||
@@ -273,28 +275,45 @@ static inline void wait_sync(char *thread_name) {
|
||||
|
||||
}
|
||||
|
||||
void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) {
|
||||
|
||||
unsigned int aa,slot_offset, slot_offset_F;
|
||||
int dummy_tx_b[7680*4] __attribute__((aligned(32)));
|
||||
int i,j, tx_offset;
|
||||
int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)*
|
||||
((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7);
|
||||
int len,len2;
|
||||
int16_t *txdata;
|
||||
// int CC_id = phy_vars_eNB->proc.CC_id;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 );
|
||||
void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
|
||||
{
|
||||
|
||||
// compute subframe modulo-2
|
||||
slot_offset_F = ((subframe&1)<<1)*slot_sizeF;
|
||||
unsigned int aa,slot_offset;
|
||||
//int dummy_tx_b[7680*4] __attribute__((aligned(32)));
|
||||
int i, tx_offset;
|
||||
//int slot_sizeF = (phy_vars_eNB->frame_parms.ofdm_symbol_size)* ((phy_vars_eNB->frame_parms.Ncp==1) ? 6 : 7);
|
||||
int len;
|
||||
//int slot_offset_F = (subframe<<1)*slot_sizeF;
|
||||
|
||||
slot_offset = subframe*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
|
||||
|
||||
if ((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_DL)||
|
||||
((subframe_select(&phy_vars_eNB->frame_parms,subframe)==SF_S))) {
|
||||
// LOG_D(HW,"Frame %d: Generating slot %d\n",frame,next_slot);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_OFDM_MODULATION,1);
|
||||
|
||||
do_OFDM_mod_symbol(&phy_vars_eNB->common_vars,
|
||||
0,
|
||||
subframe<<1,
|
||||
&phy_vars_eNB->frame_parms,
|
||||
phy_vars_eNB->do_precoding);
|
||||
|
||||
// if S-subframe generate first slot only
|
||||
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL) {
|
||||
do_OFDM_mod_symbol(&phy_vars_eNB->common_vars,
|
||||
0,
|
||||
1+(subframe<<1),
|
||||
&phy_vars_eNB->frame_parms,
|
||||
phy_vars_eNB->do_precoding);
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_OFDM_MODULATION,0);
|
||||
|
||||
|
||||
/*
|
||||
for (aa=0; aa<phy_vars_eNB->frame_parms.nb_antennas_tx; aa++) {
|
||||
if (phy_vars_eNB->frame_parms.Ncp == EXTENDED) {
|
||||
PHY_ofdm_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F],
|
||||
@@ -316,13 +335,15 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) {
|
||||
7,
|
||||
&(phy_vars_eNB->frame_parms));
|
||||
// if S-subframe generate first slot only
|
||||
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL)
|
||||
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_DL)
|
||||
normal_prefix_mod(&phy_vars_eNB->common_vars.txdataF[0][aa][slot_offset_F+slot_sizeF],
|
||||
dummy_tx_b+(phy_vars_eNB->frame_parms.samples_per_tti>>1),
|
||||
7,
|
||||
&(phy_vars_eNB->frame_parms));
|
||||
}
|
||||
} */
|
||||
|
||||
for (aa=0; aa<phy_vars_eNB->frame_parms.nb_antennas_tx; aa++) {
|
||||
// if S-subframe generate first slot only
|
||||
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S)
|
||||
len = phy_vars_eNB->frame_parms.samples_per_tti>>1;
|
||||
@@ -335,55 +356,36 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) {
|
||||
dummy_tx_b[i+2] = 0xff00;
|
||||
dummy_tx_b[i+3] = 0xff000000;
|
||||
}*/
|
||||
|
||||
if (slot_offset+time_offset[aa]<0) {
|
||||
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)+tx_offset];
|
||||
len2 = -(slot_offset+time_offset[aa]);
|
||||
len2 = (len2>len) ? len : len2;
|
||||
for (i=0; i<(len2<<1); i++) {
|
||||
txdata[i] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||
}
|
||||
if (len2<len) {
|
||||
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][0];
|
||||
for (j=0; i<(len<<1); i++,j++) {
|
||||
txdata[j++] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||
}
|
||||
}
|
||||
}
|
||||
else if ((slot_offset+time_offset[aa]+len)>(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti)) {
|
||||
tx_offset = (int)slot_offset+time_offset[aa];
|
||||
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset];
|
||||
len2 = -tx_offset+LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
for (i=0; i<(len2<<1); i++) {
|
||||
txdata[i] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||
}
|
||||
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][0];
|
||||
for (j=0; i<(len<<1); i++,j++) {
|
||||
txdata[j++] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||
}
|
||||
}
|
||||
else {
|
||||
tx_offset = (int)slot_offset+time_offset[aa];
|
||||
txdata = (int16_t*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset];
|
||||
for (i=0; i<len; i++) {
|
||||
tx_offset = (int)slot_offset+time_offset[aa]+i;
|
||||
|
||||
for (i=0; i<(len<<1); i++) {
|
||||
txdata[i] = ((int16_t*)dummy_tx_b)[i]<<openair0_cfg[0].iq_txshift;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
if (tx_offset<0)
|
||||
tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
|
||||
if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti))
|
||||
tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
|
||||
/* ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0] = ((short*)dummy_tx_b)[2*i]<<openair0_cfg[0].iq_txshift;
|
||||
|
||||
((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1] = ((short*)dummy_tx_b)[2*i+1]<<openair0_cfg[0].iq_txshift; */
|
||||
|
||||
((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[0]<<openair0_cfg[0].iq_txshift;
|
||||
|
||||
((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1] = ((short*)&phy_vars_eNB->common_vars.txdata[0][aa][tx_offset])[1]<<openair0_cfg[0].iq_txshift;
|
||||
}
|
||||
// if S-subframe switch to RX in second subframe
|
||||
/*
|
||||
if (subframe_select(&phy_vars_eNB->frame_parms,subframe) == SF_S) {
|
||||
for (i=0; i<len; i++) {
|
||||
phy_vars_eNB->common_vars.txdata[0][aa][tx_offset++] = 0x00010001;
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
if ((((phy_vars_eNB->frame_parms.tdd_config==0) ||
|
||||
(phy_vars_eNB->frame_parms.tdd_config==1) ||
|
||||
(phy_vars_eNB->frame_parms.tdd_config==2) ||
|
||||
(phy_vars_eNB->frame_parms.tdd_config==6)) &&
|
||||
(subframe==0)) || (subframe==5)) {
|
||||
(phy_vars_eNB->frame_parms.tdd_config==1) ||
|
||||
(phy_vars_eNB->frame_parms.tdd_config==2) ||
|
||||
(phy_vars_eNB->frame_parms.tdd_config==6)) &&
|
||||
(subframe==0)) || (subframe==5)) {
|
||||
// turn on tx switch N_TA_offset before
|
||||
//LOG_D(HW,"subframe %d, time to switch to tx (N_TA_offset %d, slot_offset %d) \n",subframe,phy_vars_eNB->N_TA_offset,slot_offset);
|
||||
for (i=0; i<phy_vars_eNB->N_TA_offset; i++) {
|
||||
@@ -391,17 +393,17 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB) {
|
||||
if (tx_offset<0)
|
||||
tx_offset += LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
|
||||
if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti))
|
||||
tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
if (tx_offset>=(LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti))
|
||||
tx_offset -= LTE_NUMBER_OF_SUBFRAMES_PER_FRAME*phy_vars_eNB->frame_parms.samples_per_tti;
|
||||
|
||||
phy_vars_eNB->common_vars.txdata[0][aa][tx_offset] = 0x00000000;
|
||||
phy_vars_eNB->common_vars.txdata[0][aa][tx_offset] = 0x00000000;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 );
|
||||
}
|
||||
|
||||
|
||||
void tx_fh_if5(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, proc->timestamp_tx&0xffffffff );
|
||||
send_IF5(eNB, proc->timestamp_tx, proc->subframe_tx, &seqno, IF5_RRH_GW_DL);
|
||||
@@ -471,15 +473,16 @@ void proc_tx_full(PHY_VARS_eNB *eNB,
|
||||
if (eNB->tx_fh) eNB->tx_fh(eNB,proc);
|
||||
|
||||
/*
|
||||
if (proc->frame_tx>1000) {
|
||||
write_output("/tmp/txsig0.m","txs0", &eNB->common_vars.txdata[eNB->Mod_id][0][0], eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
write_output("/tmp/txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB->Mod_id][0][0],eNB->frame_parms.symbols_per_tti*eNB->frame_parms.ofdm_symbol_size*10,1,1);
|
||||
write_output("/tmp/txsig1.m","txs1", &eNB->common_vars.txdata[eNB->Mod_id][1][0], eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
write_output("/tmp/txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB->Mod_id][1][0],eNB->frame_parms.symbols_per_tti*eNB->frame_parms.ofdm_symbol_size*10,1,1);
|
||||
//if (transmission_mode == 7) write_output("/tmp/txsigF5.m","txsF5", &eNB->common_vars.txdataF[eNB->Mod_id][5][0],eNB->frame_parms.symbols_per_tti*eNB->frame_parms.ofdm_symbol_size*10,1,1);
|
||||
exit_fun("");
|
||||
}
|
||||
*/
|
||||
if (proc->frame_tx>1000) {
|
||||
write_output("/tmp/txsig0.m","txs0", &eNB->common_vars.txdata[eNB->Mod_id][0][0], eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
write_output("/tmp/txsigF0.m","txsF0", &eNB->common_vars.txdataF[eNB->Mod_id][0][0],eNB->frame_parms.symbols_per_tti*eNB->frame_parms.ofdm_symbol_size*10,1,1);
|
||||
write_output("/tmp/txsig1.m","txs1", &eNB->common_vars.txdata[eNB->Mod_id][1][0], eNB->frame_parms.samples_per_tti*10,1,1);
|
||||
write_output("/tmp/txsigF1.m","txsF1", &eNB->common_vars.txdataF[eNB->Mod_id][1][0],eNB->frame_parms.symbols_per_tti*eNB->frame_parms.ofdm_symbol_size*10,1,1);
|
||||
if (transmission_mode == 7)
|
||||
write_output("/tmp/txsigF5.m","txsF5", &eNB->common_vars.txdataF[eNB->Mod_id][5][0],eNB->frame_parms.symbols_per_tti*eNB->frame_parms.ofdm_symbol_size*10,1,1);
|
||||
exit_fun("");
|
||||
}
|
||||
*/
|
||||
}
|
||||
|
||||
void proc_tx_rru_if4p5(PHY_VARS_eNB *eNB,
|
||||
@@ -644,7 +647,7 @@ static void wait_system_ready (char *message, volatile int *start_flag) {
|
||||
#endif
|
||||
|
||||
|
||||
// asynchronous UL with IF4p5 (RCC,RAU,eNodeB_BBU)
|
||||
// asynchronous UL with IF5 (RCC,RAU,eNodeB_BBU)
|
||||
void fh_if5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
@@ -990,6 +993,8 @@ void rx_fh_if5(PHY_VARS_eNB *eNB,int *frame, int *subframe) {
|
||||
*subframe = proc->subframe_rx;
|
||||
}
|
||||
|
||||
|
||||
|
||||
proc->timestamp_tx = proc->timestamp_rx + (4*fp->samples_per_tti);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
|
||||
@@ -1748,8 +1753,8 @@ void kill_eNB_proc(int inst) {
|
||||
antennas are mapped to successive RF chains on the same card. */
|
||||
int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_cfg) {
|
||||
|
||||
int i, CC_id;
|
||||
int j;
|
||||
int i,j;
|
||||
int CC_id,card,ant;
|
||||
|
||||
//uint16_t N_TA_offset = 0;
|
||||
|
||||
@@ -1780,10 +1785,12 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c
|
||||
// replace RX signal buffers with mmaped HW versions
|
||||
|
||||
for (i=0; i<frame_parms->nb_antennas_rx; i++) {
|
||||
printf("Mapping eNB CC_id %d, rx_ant %d\n",CC_id,i);
|
||||
card = i/4;
|
||||
ant = i%4;
|
||||
printf("Mapping eNB CC_id %d, rx_ant %d, on card %d, chain %d\n",CC_id,i,phy_vars_eNB[CC_id]->rf_map.card+card, phy_vars_eNB[CC_id]->rf_map.chain+ant);
|
||||
free(phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]);
|
||||
phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = openair0_cfg[CC_id].rxbase[i];
|
||||
|
||||
phy_vars_eNB[CC_id]->common_vars.rxdata[0][i] = openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card+card].rxbase[phy_vars_eNB[CC_id]->rf_map.chain+ant];
|
||||
|
||||
printf("rxdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i]);
|
||||
for (j=0; j<16; j++) {
|
||||
printf("rxbuffer %d: %x\n",j,phy_vars_eNB[CC_id]->common_vars.rxdata[0][i][j]);
|
||||
@@ -1792,9 +1799,11 @@ int setup_eNB_buffers(PHY_VARS_eNB **phy_vars_eNB, openair0_config_t *openair0_c
|
||||
}
|
||||
|
||||
for (i=0; i<frame_parms->nb_antennas_tx; i++) {
|
||||
printf("Mapping eNB CC_id %d, tx_ant %d\n",CC_id,i);
|
||||
card = i/4;
|
||||
ant = i%4;
|
||||
printf("Mapping eNB CC_id %d, tx_ant %d, on card %d, chain %d\n",CC_id,i,phy_vars_eNB[CC_id]->rf_map.card+card, phy_vars_eNB[CC_id]->rf_map.chain+ant);
|
||||
free(phy_vars_eNB[CC_id]->common_vars.txdata[0][i]);
|
||||
phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = openair0_cfg[CC_id].txbase[i];//(int32_t*) openair0_exmimo_pci[rf_map[CC_id].card].dac_head[rf_map[CC_id].chain+i];
|
||||
phy_vars_eNB[CC_id]->common_vars.txdata[0][i] = openair0_cfg[phy_vars_eNB[CC_id]->rf_map.card+card].txbase[phy_vars_eNB[CC_id]->rf_map.chain+ant];
|
||||
|
||||
printf("txdata[%d] @ %p\n",i,phy_vars_eNB[CC_id]->common_vars.txdata[0][i]);
|
||||
|
||||
@@ -1897,6 +1906,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
switch (node_function[CC_id]) {
|
||||
case NGFI_RRU_IF5:
|
||||
eNB->do_prach = NULL;
|
||||
eNB->do_precoding = 0;
|
||||
eNB->fep = eNB_fep_rru_if5;
|
||||
eNB->td = NULL;
|
||||
eNB->te = NULL;
|
||||
@@ -1922,6 +1932,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
}
|
||||
break;
|
||||
case NGFI_RRU_IF4p5:
|
||||
eNB->do_precoding = 0;
|
||||
eNB->do_prach = do_prach;
|
||||
eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
|
||||
eNB->td = NULL;
|
||||
@@ -1952,6 +1963,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
|
||||
break;
|
||||
case eNodeB_3GPP:
|
||||
eNB->do_precoding = 1;
|
||||
eNB->do_prach = do_prach;
|
||||
eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
|
||||
eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
|
||||
@@ -1972,6 +1984,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
eNB->ifdevice.host_type = BBU_HOST;
|
||||
break;
|
||||
case eNodeB_3GPP_BBU:
|
||||
eNB->do_precoding = 1;
|
||||
eNB->do_prach = do_prach;
|
||||
eNB->fep = eNB_fep_full;//(single_thread_flag==1) ? eNB_fep_full_2thread : eNB_fep_full;
|
||||
eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
|
||||
@@ -2004,6 +2017,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
}
|
||||
break;
|
||||
case NGFI_RCC_IF4p5:
|
||||
eNB->do_precoding = 0;
|
||||
eNB->do_prach = do_prach;
|
||||
eNB->fep = NULL;
|
||||
eNB->td = ulsch_decoding_data;//(single_thread_flag==1) ? ulsch_decoding_data_2thread : ulsch_decoding_data;
|
||||
@@ -2027,6 +2041,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
|
||||
break;
|
||||
case NGFI_RAU_IF4p5:
|
||||
eNB->do_precoding = 0;
|
||||
eNB->do_prach = do_prach;
|
||||
eNB->fep = NULL;
|
||||
|
||||
|
||||
@@ -207,6 +207,7 @@ char rf_config_file[1024];
|
||||
|
||||
int chain_offset=0;
|
||||
int phy_test = 0;
|
||||
uint8_t usim_test = 0;
|
||||
|
||||
|
||||
char ref[128] = "internal";
|
||||
@@ -237,7 +238,7 @@ uint64_t num_missed_slots=0; // counter for the number of missed slots
|
||||
|
||||
extern void reset_opp_meas(void);
|
||||
extern void print_opp_meas(void);
|
||||
//int transmission_mode=1;
|
||||
int transmission_mode=1;
|
||||
|
||||
int16_t glog_level = LOG_INFO;
|
||||
int16_t glog_verbosity = LOG_MED;
|
||||
@@ -382,6 +383,7 @@ void help (void) {
|
||||
printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n");
|
||||
printf(" --mmapped-dma sets flag for improved EXMIMO UE performance\n");
|
||||
printf(" --external-clock tells hardware to use an external clock reference\n");
|
||||
printf(" --usim-test use XOR autentication algo in case of test usim mode\n");
|
||||
printf(" --single-thread-disable. Disables single-thread mode in lte-softmodem\n");
|
||||
printf(" -C Set the downlink frequency for all component carriers\n");
|
||||
printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n");
|
||||
@@ -689,6 +691,7 @@ static void get_options (int argc, char **argv)
|
||||
LONG_OPTION_DUMP_FRAME,
|
||||
LONG_OPTION_LOOPMEMORY,
|
||||
LONG_OPTION_PHYTEST,
|
||||
LONG_OPTION_USIMTEST,
|
||||
LONG_OPTION_MMAPPED_DMA,
|
||||
LONG_OPTION_EXTERNAL_CLOCK,
|
||||
LONG_OPTION_WAIT_FOR_SYNC,
|
||||
@@ -717,6 +720,7 @@ static void get_options (int argc, char **argv)
|
||||
{"ue-dump-frame", no_argument, NULL, LONG_OPTION_DUMP_FRAME},
|
||||
{"loop-memory", required_argument, NULL, LONG_OPTION_LOOPMEMORY},
|
||||
{"phy-test", no_argument, NULL, LONG_OPTION_PHYTEST},
|
||||
{"usim-test", no_argument, NULL, LONG_OPTION_USIMTEST},
|
||||
{"mmapped-dma", no_argument, NULL, LONG_OPTION_MMAPPED_DMA},
|
||||
{"external-clock", no_argument, NULL, LONG_OPTION_EXTERNAL_CLOCK},
|
||||
{"wait-for-sync", no_argument, NULL, LONG_OPTION_WAIT_FOR_SYNC},
|
||||
@@ -818,6 +822,9 @@ static void get_options (int argc, char **argv)
|
||||
phy_test = 1;
|
||||
break;
|
||||
|
||||
case LONG_OPTION_USIMTEST:
|
||||
usim_test = 1;
|
||||
break;
|
||||
case LONG_OPTION_MMAPPED_DMA:
|
||||
mmapped_dma = 1;
|
||||
break;
|
||||
@@ -1137,13 +1144,13 @@ static void get_options (int argc, char **argv)
|
||||
frame_parms[CC_id]->N_RB_DL = enb_properties->properties[i]->N_RB_DL[CC_id];
|
||||
frame_parms[CC_id]->N_RB_UL = enb_properties->properties[i]->N_RB_DL[CC_id];
|
||||
frame_parms[CC_id]->nb_antennas_tx = enb_properties->properties[i]->nb_antennas_tx[CC_id];
|
||||
frame_parms[CC_id]->nb_antennas_tx_eNB = enb_properties->properties[i]->nb_antenna_ports[CC_id];
|
||||
frame_parms[CC_id]->nb_antenna_ports_eNB = enb_properties->properties[i]->nb_antenna_ports[CC_id];
|
||||
frame_parms[CC_id]->nb_antennas_rx = enb_properties->properties[i]->nb_antennas_rx[CC_id];
|
||||
|
||||
frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_ConfigIndex = enb_properties->properties[i]->prach_config_index[CC_id];
|
||||
frame_parms[CC_id]->prach_config_common.prach_ConfigInfo.prach_FreqOffset = enb_properties->properties[i]->prach_freq_offset[CC_id];
|
||||
|
||||
frame_parms[CC_id]->mode1_flag = (frame_parms[CC_id]->nb_antennas_tx_eNB == 1) ? 1 : 0;
|
||||
frame_parms[CC_id]->mode1_flag = (frame_parms[CC_id]->nb_antenna_ports_eNB == 1) ? 1 : 0;
|
||||
frame_parms[CC_id]->threequarter_fs = threequarter_fs;
|
||||
|
||||
//} // j
|
||||
@@ -1205,8 +1212,13 @@ static void get_options (int argc, char **argv)
|
||||
printf("Downlink frequency/ uplink offset of CC_id %d set to %ju/%d\n", CC_id,
|
||||
enb_properties->properties[i]->downlink_frequency[CC_id],
|
||||
enb_properties->properties[i]->uplink_frequency_offset[CC_id]);
|
||||
|
||||
} // CC_id
|
||||
}// i
|
||||
|
||||
//this is needed for phy-test option
|
||||
transmission_mode = enb_properties->properties[0]->ue_TransmissionMode[0]+1;
|
||||
|
||||
} else if (UE_flag == 1) {
|
||||
if (conf_config_file_name != NULL) {
|
||||
|
||||
@@ -1241,7 +1253,7 @@ void set_default_frame_parms(LTE_DL_FRAME_PARMS *frame_parms[MAX_NUM_CCs]) {
|
||||
frame_parms[CC_id]->Ncp_UL = NORMAL;
|
||||
frame_parms[CC_id]->Nid_cell = 0;
|
||||
frame_parms[CC_id]->num_MBSFN_config = 0;
|
||||
frame_parms[CC_id]->nb_antennas_tx_eNB = 1;
|
||||
frame_parms[CC_id]->nb_antenna_ports_eNB = 1;
|
||||
frame_parms[CC_id]->nb_antennas_tx = 1;
|
||||
frame_parms[CC_id]->nb_antennas_rx = 1;
|
||||
|
||||
@@ -1376,7 +1388,7 @@ void init_openair0() {
|
||||
|
||||
int main( int argc, char **argv )
|
||||
{
|
||||
int i,aa;
|
||||
int i,j,k,aa,re;
|
||||
#if defined (XFORMS)
|
||||
void *status;
|
||||
#endif
|
||||
@@ -1537,7 +1549,7 @@ int main( int argc, char **argv )
|
||||
if (UE_flag==1) {
|
||||
frame_parms[CC_id]->nb_antennas_tx = 1;
|
||||
frame_parms[CC_id]->nb_antennas_rx = 1;
|
||||
frame_parms[CC_id]->nb_antennas_tx_eNB = 1; //initial value overwritten by initial sync later
|
||||
frame_parms[CC_id]->nb_antenna_ports_eNB = 1; //initial value overwritten by initial sync later
|
||||
}
|
||||
|
||||
init_ul_hopping(frame_parms[CC_id]);
|
||||
@@ -1627,7 +1639,18 @@ int main( int argc, char **argv )
|
||||
PHY_vars_eNB_g[0][CC_id]->target_ue_dl_mcs=target_dl_mcs;
|
||||
PHY_vars_eNB_g[0][CC_id]->ue_ul_nb_rb=6;
|
||||
PHY_vars_eNB_g[0][CC_id]->target_ue_ul_mcs=target_ul_mcs;
|
||||
|
||||
// initialization for phy-test
|
||||
for (k=0;k<NUMBER_OF_UE_MAX;k++) {
|
||||
PHY_vars_eNB_g[0][CC_id]->transmission_mode[k] = transmission_mode;
|
||||
if (transmission_mode==7)
|
||||
lte_gold_ue_spec_port5(PHY_vars_eNB_g[0][CC_id]->lte_gold_uespec_port5_table[k],frame_parms[CC_id]->Nid_cell,0x1235+k);
|
||||
}
|
||||
if ((transmission_mode==1) || (transmission_mode==7)) {
|
||||
for (j=0; j<frame_parms[CC_id]->nb_antennas_tx; j++)
|
||||
for (re=0; re<frame_parms[CC_id]->ofdm_symbol_size; re++)
|
||||
PHY_vars_eNB_g[0][CC_id]->common_vars.beam_weights[0][0][j][re] = 0x00007fff/frame_parms[CC_id]->nb_antennas_tx;
|
||||
}
|
||||
|
||||
if (phy_test==1) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0;
|
||||
else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1;
|
||||
|
||||
@@ -1649,18 +1672,7 @@ int main( int argc, char **argv )
|
||||
|
||||
|
||||
PHY_vars_eNB_g[0][CC_id]->rx_total_gain_dB = (int)rx_gain[CC_id][0];
|
||||
|
||||
if (frame_parms[CC_id]->frame_type==FDD) {
|
||||
PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0;
|
||||
}
|
||||
else {
|
||||
if (frame_parms[CC_id]->N_RB_DL == 100)
|
||||
PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624;
|
||||
else if (frame_parms[CC_id]->N_RB_DL == 50)
|
||||
PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/2;
|
||||
else if (frame_parms[CC_id]->N_RB_DL == 25)
|
||||
PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 624/4;
|
||||
}
|
||||
PHY_vars_eNB_g[0][CC_id]->N_TA_offset = 0;
|
||||
}
|
||||
|
||||
|
||||
|
||||
+123
-33
@@ -433,7 +433,14 @@ static void *UE_thread_synch(void *arg)
|
||||
if (initial_sync( UE, UE->mode ) == 0) {
|
||||
|
||||
hw_slot_offset = (UE->rx_offset<<1) / UE->frame_parms.samples_per_tti;
|
||||
LOG_I( HW, "Got synch: hw_slot_offset %d\n", hw_slot_offset );
|
||||
LOG_I( HW, "Got synch: hw_slot_offset %d, carrier off %d Hz, rxgain %d (DL %u, UL %u), UE_scan_carrier %d\n",
|
||||
hw_slot_offset,
|
||||
freq_offset,
|
||||
UE->rx_total_gain_dB,
|
||||
downlink_frequency[0][0]+freq_offset,
|
||||
downlink_frequency[0][0]+uplink_frequency_offset[0][0]+freq_offset,
|
||||
UE->UE_scan_carrier );
|
||||
|
||||
if (UE->UE_scan_carrier == 1) {
|
||||
|
||||
UE->UE_scan_carrier = 0;
|
||||
@@ -710,12 +717,22 @@ static void *UE_thread_rxn_txnp4(void *arg)
|
||||
while (sync_var<0)
|
||||
pthread_cond_wait(&sync_cond, &sync_mutex);
|
||||
|
||||
#define THREAD_NAME_LEN 16
|
||||
char threadname[THREAD_NAME_LEN];
|
||||
ret = pthread_getname_np(proc->pthread_rxtx, threadname, THREAD_NAME_LEN);
|
||||
if (ret != 0)
|
||||
{
|
||||
perror("pthread_getname_np : ");
|
||||
exit_fun("Error getting thread name");
|
||||
}
|
||||
|
||||
pthread_mutex_unlock(&sync_mutex);
|
||||
printf("unlocked sync_mutex, waiting (UE_thread_rxtx)\n");
|
||||
|
||||
printf("Starting UE RXN_TXNP4 thread\n");
|
||||
printf("Starting UE RXN_TXNP4 thread (%s)\n", threadname);
|
||||
|
||||
while (!oai_exit) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0+(proc->subframe_rx&1), 1 );
|
||||
if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) {
|
||||
LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" );
|
||||
exit_fun("nothing to add");
|
||||
@@ -723,15 +740,18 @@ static void *UE_thread_rxn_txnp4(void *arg)
|
||||
}
|
||||
|
||||
while (proc->instance_cnt_rxtx < 0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_WAIT_COND_RXTX0+(proc->subframe_rx&1), 1 );
|
||||
// most of the time, the thread is waiting here
|
||||
pthread_cond_wait( &proc->cond_rxtx, &proc->mutex_rxtx );
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_WAIT_COND_RXTX0+(proc->subframe_rx&1), 0 );
|
||||
|
||||
if (pthread_mutex_unlock(&proc->mutex_rxtx) != 0) {
|
||||
LOG_E( PHY, "[SCHED][UE] error unlocking mutex for UE RXn_TXnp4\n" );
|
||||
exit_fun("nothing to add");
|
||||
return &UE_thread_rxtx_retval;
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_LOCK_MUTEX_RXTX_FOR_COND_WAIT0+(proc->subframe_rx&1), 0 );
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0+(proc->subframe_rx&1), 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX0_UE+(proc->subframe_rx&1), proc->subframe_rx );
|
||||
@@ -739,21 +759,40 @@ static void *UE_thread_rxn_txnp4(void *arg)
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX0_UE+(proc->subframe_rx&1), proc->frame_rx );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_UE+(proc->subframe_tx&1), proc->frame_tx );
|
||||
|
||||
if ((subframe_select( &UE->frame_parms, proc->subframe_rx) == SF_DL) ||
|
||||
(UE->frame_parms.frame_type == FDD) ||
|
||||
(subframe_select( &UE->frame_parms, proc->subframe_rx ) == SF_S)) {
|
||||
lte_subframe_t sf_type = subframe_select( &UE->frame_parms, proc->subframe_rx);
|
||||
if ((sf_type == SF_DL) ||
|
||||
(UE->frame_parms.frame_type == FDD) ||
|
||||
(sf_type == SF_S)) {
|
||||
|
||||
if (UE->frame_parms.frame_type == TDD) {
|
||||
LOG_D(PHY, "%s,TDD%d,%s: calling UE_RX\n",
|
||||
threadname,
|
||||
UE->frame_parms.tdd_config,
|
||||
(sf_type==SF_DL? "SF_DL" :
|
||||
(sf_type==SF_UL? "SF_UL" :
|
||||
(sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE"))));
|
||||
} else {
|
||||
LOG_D(PHY, "%s,%s,%s: calling UE_RX\n",
|
||||
threadname,
|
||||
(UE->frame_parms.frame_type==FDD? "FDD":
|
||||
(UE->frame_parms.frame_type==TDD? "TDD":"UNKNOWN_DUPLEX_MODE")),
|
||||
(sf_type==SF_DL? "SF_DL" :
|
||||
(sf_type==SF_UL? "SF_UL" :
|
||||
(sf_type==SF_S ? "SF_S" : "UNKNOWN_SF_TYPE"))));
|
||||
}
|
||||
phy_procedures_UE_RX( UE, proc, 0, 0, UE->mode, no_relay, NULL );
|
||||
}
|
||||
|
||||
if (UE->mac_enabled==1) {
|
||||
|
||||
ret = mac_xface->ue_scheduler(UE->Mod_id,
|
||||
proc->frame_tx,
|
||||
proc->subframe_rx,
|
||||
subframe_select(&UE->frame_parms,proc->subframe_tx),
|
||||
0,
|
||||
0/*FIXME CC_id*/);
|
||||
proc->frame_rx,
|
||||
proc->subframe_rx,
|
||||
proc->frame_tx,
|
||||
proc->subframe_tx,
|
||||
subframe_select(&UE->frame_parms,proc->subframe_tx),
|
||||
0,
|
||||
0/*FIXME CC_id*/);
|
||||
|
||||
if (ret == CONNECTION_LOST) {
|
||||
LOG_E( PHY, "[UE %"PRIu8"] Frame %"PRIu32", subframe %u RRC Connection lost, returning to PRACH\n",
|
||||
@@ -771,17 +810,25 @@ static void *UE_thread_rxn_txnp4(void *arg)
|
||||
}
|
||||
|
||||
if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_UL) ||
|
||||
(UE->frame_parms.frame_type == FDD) ||
|
||||
(subframe_select( &UE->frame_parms, proc->subframe_tx ) == SF_S)) {
|
||||
(UE->frame_parms.frame_type == FDD) ) {
|
||||
|
||||
if (UE->mode != loop_through_memory) {
|
||||
phy_procedures_UE_TX(UE,proc,0,0,UE->mode,no_relay);
|
||||
}
|
||||
}
|
||||
|
||||
if ((subframe_select( &UE->frame_parms, proc->subframe_tx) == SF_S) &&
|
||||
(UE->frame_parms.frame_type == TDD)) {
|
||||
|
||||
if (UE->mode != loop_through_memory) {
|
||||
phy_procedures_UE_S_TX(UE,0,0,no_relay);
|
||||
}
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_THREAD_RXTX0+(proc->subframe_rx&1), 0 );
|
||||
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0+(proc->subframe_rx&1), 1 );
|
||||
if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) {
|
||||
LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RXTX\n" );
|
||||
exit_fun("noting to add");
|
||||
@@ -796,6 +843,7 @@ static void *UE_thread_rxn_txnp4(void *arg)
|
||||
exit_fun("noting to add");
|
||||
return &UE_thread_rxtx_retval;
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_LOCK_MUTEX_RXTX_FOR_CNT_DECREMENT0+(proc->subframe_rx&1), 0 );
|
||||
}
|
||||
|
||||
// thread finished
|
||||
@@ -918,10 +966,11 @@ void *UE_thread(void *arg) {
|
||||
rxp,
|
||||
UE->frame_parms.samples_per_tti*10,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
|
||||
|
||||
|
||||
if (rxs!=UE->frame_parms.samples_per_tti*10) {
|
||||
exit_fun("problem in rx");
|
||||
LOG_E(PHY, "problem in rx 1! want #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti*10, rxs);
|
||||
exit_fun("problem in rx 1");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
}
|
||||
@@ -954,7 +1003,8 @@ void *UE_thread(void *arg) {
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
|
||||
if (rxs!=UE->frame_parms.samples_per_tti){
|
||||
exit_fun("problem in rx");
|
||||
LOG_E(PHY, "problem in rx 2! want #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti, rxs);
|
||||
exit_fun("problem in rx 2");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
|
||||
@@ -976,7 +1026,8 @@ void *UE_thread(void *arg) {
|
||||
UE->rx_offset,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
if (rxs != UE->rx_offset) {
|
||||
exit_fun("problem in rx");
|
||||
LOG_E(PHY, "problem in rx 3! want #samples=%d but got only %d!\n", UE->rx_offset, rxs);
|
||||
exit_fun("problem in rx 3!");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
}
|
||||
@@ -990,6 +1041,11 @@ void *UE_thread(void *arg) {
|
||||
(void**)rxdata,
|
||||
UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
if (rxs != (UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0)) {
|
||||
LOG_E(PHY, "problem in rx 4! want #samples=%d but got only %d!\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0, rxs);
|
||||
exit_fun("problem in rx 4!");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
slot_fep(UE,
|
||||
0,
|
||||
0,
|
||||
@@ -1006,27 +1062,34 @@ void *UE_thread(void *arg) {
|
||||
|
||||
}// start_rx_stream==0
|
||||
else {
|
||||
UE->proc.proc_rxtx[0].frame_rx++;
|
||||
UE->proc.proc_rxtx[1].frame_rx++;
|
||||
//UE->proc.proc_rxtx[0].frame_rx++;
|
||||
//UE->proc.proc_rxtx[1].frame_rx++;
|
||||
|
||||
for (int sf=0;sf<10;sf++) {
|
||||
for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
|
||||
rxp[i] = (void*)&rxdata[i][UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0+(sf*UE->frame_parms.samples_per_tti)];
|
||||
// grab signal for subframe
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
|
||||
if (UE->mode != loop_through_memory) {
|
||||
if (sf<9) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 1 );
|
||||
rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
×tamp,
|
||||
rxp,
|
||||
UE->frame_parms.samples_per_tti,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
// prepare tx buffer pointers
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs );
|
||||
if (rxs != UE->frame_parms.samples_per_tti) {
|
||||
LOG_E(PHY, "problem in rx 5! want #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti, rxs);
|
||||
exit_fun("problem in rx 5!");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
|
||||
// prepare tx buffer pointers
|
||||
for (i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||
txp[i] = (void*)&UE->common_vars.txdata[i][((sf+2)%10)*UE->frame_parms.samples_per_tti];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
txs = UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||
timestamp+
|
||||
(2*UE->frame_parms.samples_per_tti) -
|
||||
@@ -1036,27 +1099,34 @@ void *UE_thread(void *arg) {
|
||||
UE->frame_parms.samples_per_tti,
|
||||
UE->frame_parms.nb_antennas_tx,
|
||||
1);
|
||||
if (txs != UE->frame_parms.samples_per_tti) {
|
||||
LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti);
|
||||
exit_fun( "problem transmitting samples" );
|
||||
}
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS, rxs );
|
||||
if (txs != UE->frame_parms.samples_per_tti) {
|
||||
LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti);
|
||||
exit_fun( "problem transmitting samples" );
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 1 );
|
||||
rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
×tamp,
|
||||
rxp,
|
||||
UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs );
|
||||
if (rxs != (UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0)) {
|
||||
LOG_E(PHY, "problem in rx 6! want #samples=%d but got only %d!\n", UE->frame_parms.samples_per_tti-UE->frame_parms.ofdm_symbol_size-UE->frame_parms.nb_prefix_samples0, rxs);
|
||||
exit_fun("problem in rx 6!");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
|
||||
// prepare tx buffer pointers
|
||||
|
||||
for (i=0; i<UE->frame_parms.nb_antennas_tx; i++)
|
||||
txp[i] = (void*)&UE->common_vars.txdata[i][((sf+2)%10)*UE->frame_parms.samples_per_tti];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_SF9, 1 );
|
||||
txs = UE->rfdevice.trx_write_func(&UE->rfdevice,
|
||||
timestamp+
|
||||
(2*UE->frame_parms.samples_per_tti) -
|
||||
@@ -1066,25 +1136,34 @@ void *UE_thread(void *arg) {
|
||||
UE->frame_parms.samples_per_tti - rx_off_diff,
|
||||
UE->frame_parms.nb_antennas_tx,
|
||||
1);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_SF9, 0 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_WRITE_NS, rxs );
|
||||
if (txs != UE->frame_parms.samples_per_tti - rx_off_diff) {
|
||||
LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, UE->frame_parms.samples_per_tti-rx_off_diff);
|
||||
exit_fun( "problem transmitting samples" );
|
||||
}
|
||||
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_READ_SF9, 1 );
|
||||
// read in first symbol of next frame and adjust for timing drift
|
||||
rxs = UE->rfdevice.trx_read_func(&UE->rfdevice,
|
||||
×tamp1,
|
||||
(void**)rxdata,
|
||||
UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff,
|
||||
UE->frame_parms.ofdm_symbol_size + UE->frame_parms.nb_prefix_samples0 - rx_off_diff,
|
||||
UE->frame_parms.nb_antennas_rx);
|
||||
rx_off_diff = 0;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_SF9, 0 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_UE0_TRX_READ_NS, rxs );
|
||||
if (rxs != (UE->frame_parms.ofdm_symbol_size + UE->frame_parms.nb_prefix_samples0 - rx_off_diff)) {
|
||||
LOG_E(PHY, "problem in rx 7! want #samples=%d but got only %d! rx_off_diff=%d\n", UE->frame_parms.ofdm_symbol_size+UE->frame_parms.nb_prefix_samples0 - rx_off_diff, rxs, rx_off_diff);
|
||||
exit_fun("problem in rx 7!");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
rx_off_diff = 0;
|
||||
}
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
|
||||
// operate on thread sf mod 2
|
||||
UE_rxtx_proc_t *proc = &UE->proc.proc_rxtx[sf&1];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0+(proc->subframe_rx&1), 1 );
|
||||
// lock mutex
|
||||
if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) {
|
||||
LOG_E( PHY, "[SCHED][UE] error locking mutex for UE RX\n" );
|
||||
@@ -1093,6 +1172,11 @@ void *UE_thread(void *arg) {
|
||||
}
|
||||
// increment instance count and change proc subframe/frame variables
|
||||
int instance_cnt_rxtx = ++proc->instance_cnt_rxtx;
|
||||
if(sf == 0)
|
||||
{
|
||||
UE->proc.proc_rxtx[0].frame_rx++;
|
||||
UE->proc.proc_rxtx[1].frame_rx++;
|
||||
}
|
||||
proc->subframe_rx=sf;
|
||||
proc->subframe_tx=(sf+4)%10;
|
||||
proc->frame_tx = proc->frame_rx + ((proc->subframe_rx>5)?1:0);
|
||||
@@ -1109,14 +1193,20 @@ void *UE_thread(void *arg) {
|
||||
exit_fun("nothing to add");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_LOCK_MUTEX_RXTX_FOR_CNT_INCREMENT0+(proc->subframe_rx&1), 0 );
|
||||
|
||||
|
||||
if (instance_cnt_rxtx == 0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SIGNAL_COND_RXTX, 1 );
|
||||
if (pthread_cond_signal(&proc->cond_rxtx) != 0) {
|
||||
LOG_E( PHY, "[SCHED][UE] ERROR pthread_cond_signal for UE RX thread\n" );
|
||||
exit_fun("nothing to add");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
LOG_D(PHY, "firing up rxtx_thread[%d] at subframe %d\n", sf&1, sf);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_UE_SIGNAL_COND_RXTX, 0 );
|
||||
|
||||
} else {
|
||||
LOG_E( PHY, "[SCHED][UE] UE RX thread busy (IC %d)!!\n", instance_cnt_rxtx);
|
||||
if (instance_cnt_rxtx > 2) {
|
||||
|
||||
Reference in New Issue
Block a user