mirror of
https://gitlab.eurecom.fr/oai/openairinterface5g.git
synced 2026-07-13 20:50:28 +00:00
Compare commits
22 Commits
NR_UL_FAPI
...
rru-txwrit
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1fcf44794b | ||
|
|
d3df77bc31 | ||
|
|
d89cf68f80 | ||
|
|
3553db2210 | ||
|
|
370a18ad88 | ||
|
|
4fc3f0e208 | ||
|
|
711042f9a3 | ||
|
|
825241e34f | ||
|
|
662822ab3c | ||
|
|
749bbb2eef | ||
|
|
f0f88a9ec1 | ||
|
|
3f94ec0ad3 | ||
|
|
aaa71cfcad | ||
|
|
406e46d5bb | ||
|
|
674d4529d7 | ||
|
|
03bde23bc8 | ||
|
|
a623d4446d | ||
|
|
8f6c9ff7f7 | ||
|
|
8c2377c712 | ||
|
|
c70d076e0c | ||
|
|
0149203323 | ||
|
|
4484f35443 |
@@ -22,7 +22,7 @@ reset_color="$(tput sgr0)"
|
||||
function error()
|
||||
{
|
||||
echo -e "$red_color"ERROR: "$@""$reset_color"
|
||||
exit 1
|
||||
1
|
||||
}
|
||||
|
||||
function check_sha1()
|
||||
|
||||
@@ -188,10 +188,16 @@ int init_frame_parms(LTE_DL_FRAME_PARMS *frame_parms,uint8_t osf)
|
||||
break;
|
||||
}
|
||||
|
||||
printf("lte_parms.c: Setting N_RB_DL to %d, ofdm_symbol_size %d\n",frame_parms->N_RB_DL, frame_parms->ofdm_symbol_size);
|
||||
|
||||
if (frame_parms->frame_type == TDD) set_S_config(frame_parms);
|
||||
LOG_I(PHY,"Setting N_RB_DL to %d, ofdm_symbol_size %d\n",frame_parms->N_RB_DL, frame_parms->ofdm_symbol_size);
|
||||
|
||||
if (frame_parms->frame_type == TDD) {
|
||||
set_S_config(frame_parms);
|
||||
LOG_I(PHY,"TDD: Configuration %d, S-Subframe config %d: num DL symbols in S-subframe %d, num UL symbols in S-subframe %d\n",
|
||||
frame_parms->tdd_config,
|
||||
frame_parms->tdd_config_S,
|
||||
frame_parms->dl_symbols_in_S_subframe,
|
||||
frame_parms->ul_symbols_in_S_subframe);
|
||||
}
|
||||
// frame_parms->tdd_config=3;
|
||||
return(0);
|
||||
}
|
||||
|
||||
@@ -33,6 +33,7 @@
|
||||
#include "PHY/defs.h"
|
||||
#include "PHY/TOOLS/alaw_lut.h"
|
||||
#include "PHY/extern.h"
|
||||
#include "PHY/defs.h"
|
||||
#include "SCHED/defs.h"
|
||||
|
||||
//#include "targets/ARCH/ETHERNET/USERSPACE/LIB/if_defs.h"
|
||||
@@ -62,7 +63,10 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv);
|
||||
int nsym = fp->symbols_per_tti;
|
||||
|
||||
if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );
|
||||
if (eNB->CC_id==0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 );
|
||||
start_meas(&eNB->send_if4p5_stats);
|
||||
}
|
||||
|
||||
if (packet_type == IF4p5_PDLFFT) {
|
||||
if (subframe_select(fp,subframe)==SF_S)
|
||||
@@ -86,20 +90,26 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
for (symbol_id=0; symbol_id<nsym; symbol_id++) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 );
|
||||
if (eNB->CC_id==1) LOG_I(PHY,"DL_IF4p5: CC_id %d : frame %d, subframe %d, symbol %d\n",eNB->CC_id,frame,subframe,symbol_id);
|
||||
|
||||
|
||||
start_meas(&eNB->send_if4p5_comp_stats);
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
i = (uint16_t*) &txdataF[eNB->CC_id][blockoffsetF+element_id];
|
||||
|
||||
i = (uint16_t*) &txdataF[eNB->CC_id][blockoffsetF+element_id];
|
||||
data_block[element_id] = ((uint16_t) lin2alaw_if4p5[*i]) | (lin2alaw_if4p5[*(i+1)]<<8);
|
||||
|
||||
i = (uint16_t*) &txdataF[eNB->CC_id][slotoffsetF+element_id];
|
||||
data_block[element_id+db_halflength] = ((uint16_t) lin2alaw_if4p5[*i]) | (lin2alaw_if4p5[*(i+1)]<<8);
|
||||
}
|
||||
stop_meas(&eNB->send_if4p5_comp_stats);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 );
|
||||
|
||||
packet_header->frame_status &= ~(0x000f<<26);
|
||||
packet_header->frame_status |= (symbol_id&0x000f)<<26;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 );
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
|
||||
start_meas(&eNB->trx_write_if4p5_stats);
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
symbol_id,
|
||||
&tx_buffer,
|
||||
db_fulllength,
|
||||
@@ -107,6 +117,8 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
IF4p5_PDLFFT)) < 0) {
|
||||
perror("ETHERNET write for IF4p5_PDLFFT\n");
|
||||
}
|
||||
stop_meas(&eNB->trx_write_if4p5_stats);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 );
|
||||
slotoffsetF += fp->ofdm_symbol_size;
|
||||
blockoffsetF += fp->ofdm_symbol_size;
|
||||
@@ -138,19 +150,23 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SEND_IF4_SYMBOL, symbol_id );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 1 );
|
||||
LOG_D(PHY,"IF4p5_PULFFT: frame %d, subframe %d, symbol %d\n",frame,subframe,symbol_id);
|
||||
start_meas(&eNB->send_if4p5_comp_stats);
|
||||
for (element_id=0; element_id<db_halflength; element_id++) {
|
||||
|
||||
i = (uint16_t*) &rxdataF[0][blockoffsetF+element_id];
|
||||
data_block[element_id] = ((uint16_t) lin2alaw_if4p5[*i]) | ((uint16_t)(lin2alaw_if4p5[*(i+1)]<<8));
|
||||
|
||||
i = (uint16_t*) &rxdataF[0][slotoffsetF+element_id];
|
||||
data_block[element_id+db_halflength] = ((uint16_t) lin2alaw_if4p5[*i]) | ((uint16_t)(lin2alaw_if4p5[*(i+1)]<<8));
|
||||
//if (element_id==0) LOG_I(PHY,"send_if4p5: symbol %d rxdata0 = (%d,%d)\n",symbol_id,*i,*(i+1));
|
||||
|
||||
}
|
||||
stop_meas(&eNB->send_if4p5_comp_stats);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_COMPR_IF, 0 );
|
||||
packet_header->frame_status &= ~(0x000f<<26);
|
||||
packet_header->frame_status |= (symbol_id&0x000f)<<26;
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 1 );
|
||||
start_meas(&eNB->trx_write_if4p5_stats);
|
||||
if ((eNB->ifdevice.trx_write_func(&eNB->ifdevice,
|
||||
symbol_id,
|
||||
&tx_buffer,
|
||||
@@ -159,6 +175,7 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
IF4p5_PULFFT)) < 0) {
|
||||
perror("ETHERNET write for IF4p5_PULFFT\n");
|
||||
}
|
||||
stop_meas(&eNB->trx_write_if4p5_stats);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE_IF, 0 );
|
||||
slotoffsetF += fp->ofdm_symbol_size;
|
||||
blockoffsetF += fp->ofdm_symbol_size;
|
||||
@@ -211,7 +228,10 @@ void send_IF4p5(PHY_VARS_eNB *eNB, int frame, int subframe, uint16_t packet_type
|
||||
AssertFatal(1==0, "send_IF4p5 - Unknown packet_type %x", packet_type);
|
||||
}
|
||||
|
||||
if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
|
||||
if (eNB->CC_id==0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 );
|
||||
stop_meas(&eNB->send_if4p5_stats);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -228,7 +248,11 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
|
||||
int slotoffsetF=0, blockoffsetF=0;
|
||||
eth_state_t *eth = (eth_state_t*) (eNB->ifdevice.priv);
|
||||
|
||||
if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );
|
||||
if (eNB->CC_id==0)
|
||||
{
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 );
|
||||
start_meas(&eNB->recv_if4p5_stats);
|
||||
}
|
||||
|
||||
if (eNB->node_function == NGFI_RRU_IF4p5) {
|
||||
db_fulllength = (12*fp->N_RB_DL);
|
||||
@@ -241,6 +265,8 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
|
||||
uint16_t *data_block=NULL, *i=NULL;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 1 );
|
||||
|
||||
start_meas(&eNB->trx_read_if4p5_stats);
|
||||
if (eNB->ifdevice.trx_read_func(&eNB->ifdevice,
|
||||
(int64_t*) packet_type,
|
||||
&rx_buffer,
|
||||
@@ -248,6 +274,8 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
|
||||
0) < 0) {
|
||||
perror("ETHERNET read");
|
||||
}
|
||||
stop_meas(&eNB->trx_read_if4p5_stats);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ_IF, 0 );
|
||||
if (eth->flags == ETH_RAW_IF4p5_MODE) {
|
||||
packet_header = (IF4p5_header_t*) (rx_buffer+MAC_HEADER_SIZE_BYTES);
|
||||
@@ -325,7 +353,11 @@ void recv_IF4p5(PHY_VARS_eNB *eNB, int *frame, int *subframe, uint16_t *packet_t
|
||||
AssertFatal(1==0, "recv_IF4p5 - Unknown packet_type %x", *packet_type);
|
||||
}
|
||||
|
||||
if (eNB->CC_id==0) VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );
|
||||
if (eNB->CC_id==0) {
|
||||
stop_meas(&eNB->recv_if4p5_stats);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 );
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
@@ -1336,22 +1336,10 @@ void rx_prach(PHY_VARS_eNB *eNB,
|
||||
|
||||
#if 0
|
||||
/* TODO: resolv this conflict (there should be no printf anyway, so no big deal) */
|
||||
<<<<<<< HEAD
|
||||
/*
|
||||
en = dB_fixed(signal_energy(&rxsigF[0][k],840));
|
||||
printf("Sending PRACH, k %d,n_ra_prb %d, N_RB_UL %d, en %d\n",k,n_ra_prb,eNB->frame_parms.N_RB_UL,en);
|
||||
if (en>60) {
|
||||
printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
||||
write_output("prach_rx0.m","prach_rx0",(int16_t*)&rxsigF[0][k],839,1,1);
|
||||
exit(-1);
|
||||
}
|
||||
*/
|
||||
|
||||
=======
|
||||
en = dB_fixed(signal_energy(&rxsigF[0][k],840));
|
||||
if (en>60)
|
||||
printf("PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
||||
>>>>>>> origin/fix-if4p5
|
||||
int en = dB_fixed(signal_energy((int32_t*)&rxsigF[0][k],840));
|
||||
if (en>50)
|
||||
LOG_I(PHY,"PRACH: Frame %d, Subframe %d => %d dB\n",eNB->proc.frame_rx,eNB->proc.subframe_rx,en);
|
||||
#endif
|
||||
|
||||
return;
|
||||
|
||||
@@ -282,6 +282,8 @@ void do_OFDM_mod(int32_t **txdataF, int32_t **txdata, uint32_t frame,uint16_t ne
|
||||
|
||||
}
|
||||
|
||||
extern PHY_VARS_eNB ***PHY_vars_eNB_g;
|
||||
|
||||
// OFDM modulation for each symbol
|
||||
void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t next_slot, LTE_DL_FRAME_PARMS *frame_parms,int do_precoding)
|
||||
{
|
||||
@@ -295,7 +297,7 @@ void do_OFDM_mod_symbol(LTE_eNB_COMMON *eNB_common_vars, int eNB_id, uint16_t ne
|
||||
slot_offsetF = (next_slot)*(frame_parms->ofdm_symbol_size)*((frame_parms->Ncp==EXTENDED) ? 6 : 7);
|
||||
//printf("Thread %d starting ... aa %d (%llu)\n",omp_get_thread_num(),aa,rdtsc());
|
||||
for (l=0; l<frame_parms->symbols_per_tti>>1; l++) {
|
||||
|
||||
if (PHY_vars_eNB_g[0][0]->proc.frame_tx==0) LOG_I(PHY,"Generating symbol %d for slot %d\n",l,next_slot);
|
||||
for (aa=0; aa<frame_parms->nb_antennas_tx; aa++) {
|
||||
|
||||
//printf("do_OFDM_mod_l, slot=%d, l=%d, NUMBER_OF_OFDM_CARRIERS=%d,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES=%d\n",next_slot, l,NUMBER_OF_OFDM_CARRIERS,OFDM_SYMBOL_SIZE_COMPLEX_SAMPLES);
|
||||
|
||||
@@ -242,6 +242,8 @@ typedef struct eNB_proc_t_s {
|
||||
openair0_timestamp timestamp_tx;
|
||||
/// subframe to act upon for reception
|
||||
int subframe_rx;
|
||||
/// subframe to act upon for transmission
|
||||
int subframe_tx;
|
||||
/// symbol mask for IF4p5 reception per subframe
|
||||
uint32_t symbol_mask[10];
|
||||
/// subframe to act upon for PRACH
|
||||
@@ -252,6 +254,8 @@ typedef struct eNB_proc_t_s {
|
||||
int frame_tx;
|
||||
/// frame offset for secondary eNBs (to correct for frame asynchronism at startup)
|
||||
int frame_offset;
|
||||
/// to undo modulo 1024 frame counter
|
||||
int unwrapped_tx_frame;
|
||||
/// frame to act upon for PRACH
|
||||
int frame_prach;
|
||||
/// \internal This variable is protected by \ref mutex_fep.
|
||||
@@ -630,6 +634,14 @@ typedef struct PHY_VARS_eNB_s {
|
||||
time_stats_t ulsch_tc_intl1_stats;
|
||||
time_stats_t ulsch_tc_intl2_stats;
|
||||
|
||||
// IF4 stats
|
||||
time_stats_t send_if4p5_stats;
|
||||
time_stats_t recv_if4p5_stats;
|
||||
time_stats_t trx_write_if4p5_stats;
|
||||
time_stats_t trx_read_if4p5_stats;
|
||||
time_stats_t send_if4p5_comp_stats;
|
||||
|
||||
|
||||
#ifdef LOCALIZATION
|
||||
/// time state for localization
|
||||
time_stats_t localization_stats;
|
||||
|
||||
@@ -497,6 +497,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
// generate Cell-Specific Reference Signals for both slots
|
||||
if (eNB->abstraction_flag==0) {
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_RS_TX,1);
|
||||
if (frame==0) LOG_I(PHY,"Generating RS for slot %d\n",subframe<<1);
|
||||
generate_pilots_slot(eNB,
|
||||
txdataF,
|
||||
AMP,
|
||||
@@ -598,6 +599,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
|
||||
if ((fp->frame_type == TDD)&&
|
||||
(eNB->abstraction_flag==0)){
|
||||
if (frame==0) LOG_I(PHY,"Generating SSS for slot %d\n",1+(subframe<<1));
|
||||
generate_sss(txdataF,
|
||||
AMP,
|
||||
fp,
|
||||
@@ -624,6 +626,7 @@ void common_signal_procedures (PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc) {
|
||||
else if ((subframe == 1) &&
|
||||
(fp->frame_type == TDD)&&
|
||||
(eNB->abstraction_flag==0)) {
|
||||
if (frame==0) LOG_I(PHY,"Generating PSS for slot %d\n",subframe<<1);
|
||||
generate_pss(txdataF,
|
||||
AMP,
|
||||
fp,
|
||||
@@ -1383,7 +1386,7 @@ void phy_procedures_eNB_TX(PHY_VARS_eNB *eNB,
|
||||
LOG_D(PHY,"[eNB %"PRIu8"] Frame %d, subframe %d: Calling generate_dci_top (pdcch) (common %"PRIu8",ue_spec %"PRIu8")\n",eNB->Mod_id,frame, subframe,
|
||||
DCI_pdu->Num_common_dci,DCI_pdu->Num_ue_spec_dci);
|
||||
}
|
||||
|
||||
if (frame==0) LOG_I(PHY,"Generating PDCCCH/PCFICH for slot %d\n",subframe<<1);
|
||||
num_pdcch_symbols = generate_dci_top(DCI_pdu->Num_ue_spec_dci,
|
||||
DCI_pdu->Num_common_dci,
|
||||
DCI_pdu->dci_alloc,
|
||||
|
||||
@@ -106,6 +106,17 @@ static int trx_usrp_start(openair0_device *device) {
|
||||
|
||||
usrp_state_t *s = (usrp_state_t*)device->priv;
|
||||
|
||||
|
||||
// setup GPIO for TDD, GPIO(4) = ATR_RX
|
||||
//set data direction register (DDR) to output
|
||||
s->usrp->set_gpio_attr("FP0", "DDR", 0x1f, 0x1f);
|
||||
|
||||
//set control register to ATR
|
||||
s->usrp->set_gpio_attr("FP0", "CTRL", 0x1f,0x1f);
|
||||
|
||||
//set ATR register
|
||||
s->usrp->set_gpio_attr("FP0", "ATR_RX", 1<<4, 0x1f);
|
||||
|
||||
// init recv and send streaming
|
||||
uhd::stream_cmd_t cmd(uhd::stream_cmd_t::STREAM_MODE_START_CONTINUOUS);
|
||||
cmd.time_spec = s->usrp->get_time_now() + uhd::time_spec_t(0.05);
|
||||
|
||||
@@ -17,7 +17,7 @@ eNBs =
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
mobile_network_code = "94";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
@@ -34,7 +34,7 @@ eNBs =
|
||||
downlink_frequency = 2580000000L;
|
||||
uplink_frequency_offset = 0;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
|
||||
@@ -31,7 +31,7 @@ eNBs =
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2685000000L;
|
||||
downlink_frequency = 2680000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
|
||||
@@ -0,0 +1,194 @@
|
||||
Active_eNBs = ( "eNB_Eurecom_LTEBox");
|
||||
# Asn1_verbosity, choice in: none, info, annoying
|
||||
Asn1_verbosity = "none";
|
||||
|
||||
eNBs =
|
||||
(
|
||||
{
|
||||
////////// Identification parameters:
|
||||
eNB_ID = 0xe00;
|
||||
|
||||
cell_type = "CELL_MACRO_ENB";
|
||||
|
||||
eNB_name = "eNB_Eurecom_LTEBox";
|
||||
|
||||
// Tracking area code, 0x0000 and 0xfffe are reserved values
|
||||
tracking_area_code = "1";
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "93";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
component_carriers = (
|
||||
{
|
||||
node_function = "NGFI_RRU_IF4p5";
|
||||
node_timing = "synch_to_ext_device";
|
||||
node_synch_ref = 0;
|
||||
frame_type = "TDD";
|
||||
tdd_config = 3;
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 38;
|
||||
downlink_frequency = 2580000000L;
|
||||
uplink_frequency_offset = 0;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antenna_ports = 1;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 86;
|
||||
rx_gain = 120;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
prach_zero_correlation = 1;
|
||||
prach_freq_offset = 2;
|
||||
pucch_delta_shift = 1;
|
||||
pucch_nRB_CQI = 1;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -12;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
pusch_hoppingMode = "interSubFrame";
|
||||
pusch_hoppingOffset = 0;
|
||||
pusch_groupHoppingEnabled = "ENABLE";
|
||||
pusch_groupAssignment = 0;
|
||||
pusch_sequenceHoppingEnabled = "DISABLE";
|
||||
pusch_nDMRS1 = 1;
|
||||
phich_duration = "NORMAL";
|
||||
phich_resource = "ONESIXTH";
|
||||
srs_enable = "DISABLE";
|
||||
/* srs_BandwidthConfig =;
|
||||
srs_SubframeConfig =;
|
||||
srs_ackNackST =;
|
||||
srs_MaxUpPts =;*/
|
||||
|
||||
pusch_p0_Nominal = -95;
|
||||
pusch_alpha = "AL1";
|
||||
pucch_p0_Nominal = -104;
|
||||
msg3_delta_Preamble = 6;
|
||||
pucch_deltaF_Format1 = "deltaF2";
|
||||
pucch_deltaF_Format1b = "deltaF3";
|
||||
pucch_deltaF_Format2 = "deltaF0";
|
||||
pucch_deltaF_Format2a = "deltaF0";
|
||||
pucch_deltaF_Format2b = "deltaF0";
|
||||
|
||||
rach_numberOfRA_Preambles = 64;
|
||||
rach_preamblesGroupAConfig = "DISABLE";
|
||||
/*
|
||||
rach_sizeOfRA_PreamblesGroupA = ;
|
||||
rach_messageSizeGroupA = ;
|
||||
rach_messagePowerOffsetGroupB = ;
|
||||
*/
|
||||
rach_powerRampingStep = 4;
|
||||
rach_preambleInitialReceivedTargetPower = -104;
|
||||
rach_preambleTransMax = 10;
|
||||
rach_raResponseWindowSize = 10;
|
||||
rach_macContentionResolutionTimer = 48;
|
||||
rach_maxHARQ_Msg3Tx = 4;
|
||||
|
||||
pcch_default_PagingCycle = 128;
|
||||
pcch_nB = "oneT";
|
||||
bcch_modificationPeriodCoeff = 2;
|
||||
ue_TimersAndConstants_t300 = 1000;
|
||||
ue_TimersAndConstants_t301 = 1000;
|
||||
ue_TimersAndConstants_t310 = 1000;
|
||||
ue_TimersAndConstants_t311 = 10000;
|
||||
ue_TimersAndConstants_n310 = 20;
|
||||
ue_TimersAndConstants_n311 = 1;
|
||||
|
||||
ue_TransmissionMode = 1;
|
||||
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
srb1_parameters :
|
||||
{
|
||||
# timer_poll_retransmit = (ms) [5, 10, 15, 20,... 250, 300, 350, ... 500]
|
||||
timer_poll_retransmit = 80;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 100, 110, 120, ... ,200]
|
||||
timer_reordering = 35;
|
||||
|
||||
# timer_reordering = (ms) [0,5, ... 250, 300, 350, ... ,500]
|
||||
timer_status_prohibit = 0;
|
||||
|
||||
# poll_pdu = [4, 8, 16, 32 , 64, 128, 256, infinity(>10000)]
|
||||
poll_pdu = 4;
|
||||
|
||||
# poll_byte = (kB) [25,50,75,100,125,250,375,500,750,1000,1250,1500,2000,3000,infinity(>10000)]
|
||||
poll_byte = 99999;
|
||||
|
||||
# max_retx_threshold = [1, 2, 3, 4 , 6, 8, 16, 32]
|
||||
max_retx_threshold = 4;
|
||||
}
|
||||
|
||||
# ------- SCTP definitions
|
||||
SCTP :
|
||||
{
|
||||
# Number of streams to use in input/output
|
||||
SCTP_INSTREAMS = 2;
|
||||
SCTP_OUTSTREAMS = 2;
|
||||
};
|
||||
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
}
|
||||
);
|
||||
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth3";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth0";
|
||||
remote_address = "192.168.117.113";
|
||||
local_address = "192.168.117.200";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
tr_preference = "udp_if4p5";
|
||||
rf_preference = "usrp_b200";
|
||||
if_compression = "yes";
|
||||
iq_txshift = 4;
|
||||
tx_sample_advance = 80;
|
||||
tx_scheduling_advance = 9;
|
||||
}
|
||||
);
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
global_log_verbosity ="medium";
|
||||
hw_log_level ="info";
|
||||
hw_log_verbosity ="medium";
|
||||
phy_log_level ="info";
|
||||
phy_log_verbosity ="medium";
|
||||
mac_log_level ="info";
|
||||
mac_log_verbosity ="high";
|
||||
rlc_log_level ="info";
|
||||
rlc_log_verbosity ="medium";
|
||||
pdcp_log_level ="info";
|
||||
pdcp_log_verbosity ="medium";
|
||||
rrc_log_level ="info";
|
||||
rrc_log_verbosity ="medium";
|
||||
};
|
||||
}
|
||||
);
|
||||
@@ -17,7 +17,7 @@ eNBs =
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "93";
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
@@ -31,7 +31,7 @@ eNBs =
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2685000000L;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 25;
|
||||
@@ -159,8 +159,8 @@ eNBs =
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth0";
|
||||
remote_address = "10.10.10.155";
|
||||
local_address = "10.10.10.60";
|
||||
remote_address = "192.168.117.113";
|
||||
local_address = "192.168.117.200";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
|
||||
@@ -17,7 +17,7 @@ eNBs =
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "93";
|
||||
mobile_network_code = "92";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
@@ -31,7 +31,7 @@ eNBs =
|
||||
tdd_config_s = 0;
|
||||
prefix_type = "NORMAL";
|
||||
eutra_band = 7;
|
||||
downlink_frequency = 2685000000L;
|
||||
downlink_frequency = 2660000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
@@ -159,8 +159,8 @@ eNBs =
|
||||
rrh_gw_config = (
|
||||
{
|
||||
local_if_name = "eth0";
|
||||
remote_address = "10.10.10.215";
|
||||
local_address = "10.10.10.60";
|
||||
remote_address = "192.168.117.113";
|
||||
local_address = "192.168.117.200";
|
||||
local_port = 50000; #for raw option local port must be the same to remote
|
||||
remote_port = 50000;
|
||||
rrh_gw_active = "yes";
|
||||
|
||||
@@ -135,6 +135,7 @@ extern int transmission_mode;
|
||||
extern int oaisim_flag;
|
||||
|
||||
//pthread_t main_eNB_thread;
|
||||
pthread_t if_stats_thread;
|
||||
|
||||
time_stats_t softmodem_stats_mt; // main thread
|
||||
time_stats_t softmodem_stats_hw; // hw acquisition
|
||||
@@ -307,6 +308,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_ENB_OFDM_MODULATION,1);
|
||||
|
||||
if (phy_vars_eNB->proc.frame_tx==0) LOG_I(PHY,"doing OFDM mod for for slot %d\n",subframe<<1);
|
||||
do_OFDM_mod_symbol(&phy_vars_eNB->common_vars,
|
||||
0,
|
||||
subframe<<1,
|
||||
@@ -492,6 +494,9 @@ void proc_tx_full(PHY_VARS_eNB *eNB,
|
||||
// do OFDM modulation
|
||||
do_OFDM_mod_rt(proc->subframe_tx,eNB);
|
||||
// if TX fronthaul go ahead
|
||||
if (proc->frame_tx == 0) LOG_I(PHY, "Frame 0 : Calling eNB->tx_fh for subframe %d\n",proc->subframe_tx);
|
||||
|
||||
eNB->proc.subframe_tx = proc->subframe_tx;
|
||||
if (eNB->tx_fh) eNB->tx_fh(eNB,proc);
|
||||
|
||||
/*
|
||||
@@ -668,6 +673,34 @@ static void wait_system_ready (char *message, volatile int *start_flag) {
|
||||
}
|
||||
#endif
|
||||
|
||||
//Thread for printing stats
|
||||
|
||||
static void* print_stats_thread( void* param ) {
|
||||
|
||||
eNB_rxtx_proc_t *proc = (eNB_rxtx_proc_t*)param;
|
||||
|
||||
PHY_VARS_eNB *eNB = PHY_vars_eNB_g[0][proc->CC_id];
|
||||
|
||||
printf("[eNB] Launching print_stats thread...\n");
|
||||
|
||||
reset_meas(&eNB->send_if4p5_stats);
|
||||
reset_meas(&eNB->recv_if4p5_stats);
|
||||
reset_meas(&eNB->trx_write_if4p5_stats);
|
||||
reset_meas(&eNB->trx_read_if4p5_stats);
|
||||
|
||||
reset_meas(&eNB->send_if4p5_comp_stats);
|
||||
|
||||
while (!oai_exit) {
|
||||
sleep(2);
|
||||
print_meas(&eNB->send_if4p5_stats, "send_if4p5_stats", NULL, NULL);
|
||||
print_meas(&eNB->recv_if4p5_stats, "recv_if4p5_stats", NULL, NULL);
|
||||
print_meas(&eNB->trx_write_if4p5_stats, "trx_write_if4p5_stats", NULL, NULL);
|
||||
print_meas(&eNB->trx_read_if4p5_stats, "trx_read_if4p5_stats", NULL, NULL);
|
||||
print_meas(&eNB->send_if4p5_comp_stats, "send_if4p5_comp_stats", NULL, NULL);
|
||||
printf("\n");
|
||||
}
|
||||
return(0);
|
||||
}
|
||||
|
||||
// asynchronous UL with IF5 (RCC,RAU,eNodeB_BBU)
|
||||
void fh_if5_asynch_UL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
@@ -788,6 +821,15 @@ void fh_if5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
exit_fun("Exiting");
|
||||
}
|
||||
}
|
||||
|
||||
*frame = frame_tx;
|
||||
if ((frame_tx == 0) && (subframe_tx == 0))
|
||||
proc->unwrapped_tx_frame += 1024;
|
||||
proc->timestamp_tx = (((frame_tx+proc->unwrapped_tx_frame)*10)+subframe_tx)*eNB->frame_parms.samples_per_tti;
|
||||
|
||||
proc->subframe_tx = subframe_tx;
|
||||
if (eNB->tx_fh) eNB->tx_fh(eNB,&eNB->proc.proc_rxtx[0]);
|
||||
|
||||
}
|
||||
|
||||
void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
@@ -848,8 +890,10 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
} while (proc->symbol_mask[*subframe] != symbol_mask_full);
|
||||
|
||||
*frame = frame_tx;
|
||||
|
||||
|
||||
if ((frame_tx == 0) && (subframe_tx == 0))
|
||||
proc->unwrapped_tx_frame += 1024;
|
||||
proc->timestamp_tx = (((frame_tx+proc->unwrapped_tx_frame)*10)+subframe_tx)*eNB->frame_parms.samples_per_tti;
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_TX0_ENB, frame_tx );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_TX0_ENB, subframe_tx );
|
||||
|
||||
@@ -857,6 +901,8 @@ void fh_if4p5_asynch_DL(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
proc->symbol_mask[*subframe] = 0;
|
||||
|
||||
do_OFDM_mod_rt(*subframe, eNB);
|
||||
proc->subframe_tx = subframe_tx;
|
||||
if (eNB->tx_fh) eNB->tx_fh(eNB,&eNB->proc.proc_rxtx[0]);
|
||||
}
|
||||
|
||||
/*!
|
||||
@@ -919,72 +965,14 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||
void *rxp[fp->nb_antennas_rx],*txp[fp->nb_antennas_tx];
|
||||
unsigned int rxs,txs;
|
||||
void *rxp[fp->nb_antennas_rx];
|
||||
unsigned int rxs;
|
||||
|
||||
|
||||
int i;
|
||||
int tx_sfoffset = (eNB->single_thread_flag == 1) ? 3 : 2;
|
||||
openair0_timestamp ts,old_ts;
|
||||
|
||||
if (proc->first_rx==0) {
|
||||
|
||||
// Transmit TX buffer based on timestamp from RX
|
||||
// printf("trx_write -> USRP TS %llu (sf %d)\n", (proc->timestamp_rx+(3*fp->samples_per_tti)),(proc->subframe_rx+2)%10);
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_rx+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance)&0xffffffff );
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
// prepare tx buffer pointers
|
||||
|
||||
lte_subframe_t SF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset)%10);
|
||||
lte_subframe_t prevSF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset+9)%10);
|
||||
lte_subframe_t nextSF_type = subframe_select(fp,(proc->subframe_rx+tx_sfoffset+1)%10);
|
||||
if ((SF_type == SF_DL) ||
|
||||
(SF_type == SF_S)) {
|
||||
|
||||
for (i=0; i<fp->nb_antennas_tx; i++)
|
||||
txp[i] = (void*)&eNB->common_vars.txdata[0][i][((proc->subframe_rx+tx_sfoffset)%10)*fp->samples_per_tti];
|
||||
|
||||
int siglen=fp->samples_per_tti,flags=1;
|
||||
|
||||
if (SF_type == SF_S) {
|
||||
siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0);
|
||||
flags=3; // end of burst
|
||||
}
|
||||
if ((fp->frame_type == TDD) &&
|
||||
(SF_type == SF_DL)&&
|
||||
(prevSF_type == SF_UL) &&
|
||||
(nextSF_type == SF_DL))
|
||||
flags = 2; // start of burst
|
||||
|
||||
if ((fp->frame_type == TDD) &&
|
||||
(SF_type == SF_DL)&&
|
||||
(prevSF_type == SF_UL) &&
|
||||
(nextSF_type == SF_UL))
|
||||
flags = 4; // start of burst and end of burst (only one DL SF between two UL)
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS,flags);
|
||||
txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice,
|
||||
proc->timestamp_rx+eNB->ts_offset+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance,
|
||||
txp,
|
||||
siglen,
|
||||
fp->nb_antennas_tx,
|
||||
flags);
|
||||
clock_gettime( CLOCK_MONOTONIC, &end_rf);
|
||||
end_rf_ts = proc->timestamp_rx+eNB->ts_offset+(tx_sfoffset*fp->samples_per_tti)-openair0_cfg[0].tx_sample_advance;
|
||||
if (recv_if_count != 0 ) {
|
||||
recv_if_count = recv_if_count-1;
|
||||
LOG_D(HW,"[From Timestamp %"PRId64" to Timestamp %"PRId64"] RTT_RF: %"PRId64"; RTT_RF\n", start_rf_prev_ts, end_rf_ts, clock_difftime_ns(start_rf_prev, end_rf));
|
||||
LOG_D(HW,"[From Timestamp %"PRId64" to Timestamp %"PRId64"] RTT_RF: %"PRId64"; RTT_RF\n",start_rf_prev2_ts, end_rf_ts, clock_difftime_ns(start_rf_prev2, end_rf));
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||
|
||||
|
||||
|
||||
if (txs != siglen) {
|
||||
LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti);
|
||||
exit_fun( "problem transmitting samples" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (i=0; i<fp->nb_antennas_rx; i++)
|
||||
rxp[i] = (void*)&eNB->common_vars.rxdata[0][i][*subframe*fp->samples_per_tti];
|
||||
@@ -1004,7 +992,6 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
start_rf_prev_ts = start_rf_new_ts;
|
||||
clock_gettime( CLOCK_MONOTONIC, &start_rf_new);
|
||||
start_rf_new_ts = ts;
|
||||
LOG_D(PHY,"rx_rf: first_rx %d received ts %"PRId64" (sptti %d)\n",proc->first_rx,ts,fp->samples_per_tti);
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 );
|
||||
|
||||
proc->timestamp_rx = ts-eNB->ts_offset;
|
||||
@@ -1021,19 +1008,20 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
else {
|
||||
|
||||
if (proc->timestamp_rx - old_ts != fp->samples_per_tti) {
|
||||
LOG_I(PHY,"rx_rf: rfdevice timing drift of %"PRId64" samples (ts_off %"PRId64")\n",proc->timestamp_rx - old_ts - fp->samples_per_tti,eNB->ts_offset);
|
||||
LOG_I(PHY,"xx_rf: rfdevice timing drift of %"PRId64" samples\n",proc->timestamp_rx - old_ts - fp->samples_per_tti);
|
||||
eNB->ts_offset += (proc->timestamp_rx - old_ts - fp->samples_per_tti);
|
||||
proc->timestamp_rx = ts-eNB->ts_offset;
|
||||
}
|
||||
}
|
||||
proc->frame_rx = (proc->timestamp_rx / (fp->samples_per_tti*10))&1023;
|
||||
proc->subframe_rx = (proc->timestamp_rx / fp->samples_per_tti)%10;
|
||||
//proc->subframe_tx = (proc->subframe_rx+4)%10;
|
||||
proc->frame_rx = (proc->frame_rx+proc->frame_offset)&1023;
|
||||
proc->frame_tx = proc->frame_rx;
|
||||
if (proc->subframe_rx > 5) proc->frame_tx=(proc->frame_tx+1)&1023;
|
||||
//proc->frame_tx = proc->frame_rx;
|
||||
//if (proc->subframe_rx > 5) proc->frame_tx=(proc->frame_tx+1)&1023;
|
||||
// synchronize first reception to frame 0 subframe 0
|
||||
|
||||
proc->timestamp_tx = proc->timestamp_rx+(4*fp->samples_per_tti);
|
||||
//proc->timestamp_tx = proc->timestamp_rx+(4*fp->samples_per_tti);
|
||||
// printf("trx_read <- USRP TS %lu (offset %d sf %d, f %d, first_rx %d)\n", proc->timestamp_rx,eNB->ts_offset,proc->subframe_rx,proc->frame_rx,proc->first_rx);
|
||||
|
||||
if (proc->first_rx == 0) {
|
||||
@@ -1054,12 +1042,13 @@ void rx_rf(PHY_VARS_eNB *eNB,int *frame,int *subframe) {
|
||||
|
||||
//printf("timestamp_rx %lu, frame %d(%d), subframe %d(%d)\n",proc->timestamp_rx,proc->frame_rx,frame,proc->subframe_rx,subframe);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, proc->timestamp_rx&0xffffffff );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, (proc->timestamp_rx+eNB->ts_offset)&0xffffffff );
|
||||
|
||||
if (rxs != fp->samples_per_tti)
|
||||
exit_fun( "problem receiving samples" );
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
@@ -1525,6 +1514,82 @@ static void* eNB_thread_prach( void* param ) {
|
||||
}
|
||||
|
||||
|
||||
void tx_rf(PHY_VARS_eNB *eNB,eNB_rxtx_proc_t *proc_rxtx) {
|
||||
|
||||
eNB_proc_t *proc = &eNB->proc;
|
||||
LTE_DL_FRAME_PARMS *fp = &eNB->frame_parms;
|
||||
void *txp[fp->nb_antennas_tx];
|
||||
unsigned int txs;
|
||||
int i;
|
||||
|
||||
|
||||
// Transmit TX buffer based on timestamp from RX
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
// prepare tx buffer pointers
|
||||
|
||||
lte_subframe_t SF_type = subframe_select(fp,(proc->subframe_tx)%10);
|
||||
lte_subframe_t prevSF_type = subframe_select(fp,(proc->subframe_tx+9)%10);
|
||||
lte_subframe_t nextSF_type = subframe_select(fp,(proc->subframe_tx+1)%10);
|
||||
int sf_extension = 0;
|
||||
|
||||
if ((SF_type == SF_DL) ||
|
||||
(SF_type == SF_S)) {
|
||||
|
||||
|
||||
|
||||
int siglen=fp->samples_per_tti,flags=1;
|
||||
|
||||
if (SF_type == SF_S) {
|
||||
siglen = fp->dl_symbols_in_S_subframe*(fp->ofdm_symbol_size+fp->nb_prefix_samples0);
|
||||
flags=3; // end of burst
|
||||
}
|
||||
if ((fp->frame_type == TDD) &&
|
||||
(SF_type == SF_DL)&&
|
||||
(prevSF_type == SF_UL) &&
|
||||
(nextSF_type == SF_DL)) {
|
||||
flags = 2; // start of burst
|
||||
sf_extension = eNB->N_TA_offset<<1;
|
||||
}
|
||||
if ((fp->frame_type == TDD) &&
|
||||
(SF_type == SF_DL)&&
|
||||
(prevSF_type == SF_UL) &&
|
||||
(nextSF_type == SF_UL)) {
|
||||
flags = 4; // start of burst and end of burst (only one DL SF between two UL)
|
||||
sf_extension = eNB->N_TA_offset<<1;
|
||||
}
|
||||
|
||||
if (proc->frame_tx == 0) LOG_I(PHY,"siglen = %d, sf_extension = %d (%d,%d)\n",siglen,sf_extension,proc->subframe_tx,proc_rxtx->subframe_tx);
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx+eNB->ts_offset-openair0_cfg[0].tx_sample_advance-sf_extension)&0xffffffff );
|
||||
for (i=0; i<fp->nb_antennas_tx; i++)
|
||||
txp[i] = (void*)&eNB->common_vars.txdata[0][i][(((proc->subframe_tx)%10)*fp->samples_per_tti) - sf_extension];
|
||||
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 1 );
|
||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_WRITE_FLAGS,flags);
|
||||
txs = eNB->rfdevice.trx_write_func(&eNB->rfdevice,
|
||||
proc->timestamp_tx+eNB->ts_offset-openair0_cfg[0].tx_sample_advance-sf_extension,
|
||||
txp,
|
||||
siglen+sf_extension,
|
||||
fp->nb_antennas_tx,
|
||||
flags);
|
||||
clock_gettime( CLOCK_MONOTONIC, &end_rf);
|
||||
end_rf_ts = proc->timestamp_tx+eNB->ts_offset-openair0_cfg[0].tx_sample_advance;
|
||||
if (recv_if_count != 0 ) {
|
||||
recv_if_count = recv_if_count-1;
|
||||
LOG_D(HW,"[From Timestamp %llu to Timestamp %llu] RTT_RF: %"PRId64"; RTT_RF\n", (long long unsigned int)start_rf_prev_ts, (long long unsigned int)end_rf_ts, clock_difftime_ns(start_rf_prev, end_rf));
|
||||
LOG_D(HW,"[From Timestamp %llu to Timestamp %llu] RTT_RF: %"PRId64"; RTT_RF\n", (long long unsigned int)start_rf_prev2_ts, (long long unsigned int)end_rf_ts, clock_difftime_ns(start_rf_prev2, end_rf));
|
||||
}
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_WRITE, 0 );
|
||||
|
||||
|
||||
|
||||
if (txs != siglen+sf_extension) {
|
||||
LOG_E(PHY,"TX : Timeout (sent %d/%d)\n",txs, fp->samples_per_tti);
|
||||
exit_fun( "problem transmitting samples" );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void* eNB_thread_single( void* param ) {
|
||||
|
||||
@@ -1676,7 +1741,7 @@ static void* eNB_thread_single( void* param ) {
|
||||
proc_rxtx->subframe_tx = (proc->subframe_rx+4)%10;
|
||||
proc_rxtx->frame_tx = (proc->subframe_rx>5) ? (1+proc->frame_rx)&1023 : proc->frame_rx;
|
||||
proc->frame_tx = proc_rxtx->frame_tx;
|
||||
proc_rxtx->timestamp_tx = proc->timestamp_tx;
|
||||
proc->timestamp_tx = proc->timestamp_rx+(4*fp->samples_per_tti);
|
||||
// adjust for timing offset between RRU
|
||||
if (eNB->CC_id!=0) proc_rxtx->frame_tx = (proc_rxtx->frame_tx+proc->frame_offset)&1023;
|
||||
|
||||
@@ -1727,6 +1792,7 @@ void init_eNB_proc(int inst) {
|
||||
proc->first_rx=1;
|
||||
proc->first_tx=1;
|
||||
proc->frame_offset = 0;
|
||||
proc->unwrapped_tx_frame = 0;
|
||||
|
||||
for (i=0;i<10;i++) proc->symbol_mask[i]=0;
|
||||
|
||||
@@ -1783,10 +1849,11 @@ void init_eNB_proc(int inst) {
|
||||
if ((eNB->node_timing == synch_to_other) ||
|
||||
(eNB->node_function == NGFI_RRU_IF5) ||
|
||||
(eNB->node_function == NGFI_RRU_IF4p5))
|
||||
|
||||
|
||||
pthread_create( &proc->pthread_asynch_rxtx, attr_asynch, eNB_thread_asynch_rxtx, &eNB->proc );
|
||||
|
||||
if(eNB->node_function == NGFI_RRU_IF4p5 || eNB->node_function == NGFI_RCC_IF4p5)
|
||||
pthread_create( &if_stats_thread, NULL, print_stats_thread, &eNB->proc);
|
||||
|
||||
char name[16];
|
||||
if (eNB->single_thread_flag == 0) {
|
||||
snprintf( name, sizeof(name), "RXTX0 %d", i );
|
||||
@@ -2040,7 +2107,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
eNB->te = NULL;
|
||||
eNB->proc_uespec_rx = NULL;
|
||||
eNB->proc_tx = NULL;
|
||||
eNB->tx_fh = NULL;
|
||||
eNB->tx_fh = tx_rf;
|
||||
eNB->rx_fh = rx_rf;
|
||||
eNB->start_rf = start_rf;
|
||||
eNB->start_if = start_if;
|
||||
@@ -2070,7 +2137,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
eNB->te = NULL;
|
||||
eNB->proc_uespec_rx = NULL;
|
||||
eNB->proc_tx = NULL;//proc_tx_rru_if4p5;
|
||||
eNB->tx_fh = NULL;
|
||||
eNB->tx_fh = tx_rf;
|
||||
eNB->rx_fh = rx_rf;
|
||||
eNB->fh_asynch = fh_if4p5_asynch_DL;
|
||||
eNB->start_rf = start_rf;
|
||||
@@ -2103,7 +2170,7 @@ void init_eNB(eNB_func_t node_function[], eNB_timing_t node_timing[],int nb_inst
|
||||
eNB->te = dlsch_encoding;//(single_thread_flag==1) ? dlsch_encoding_2threads : dlsch_encoding;
|
||||
eNB->proc_uespec_rx = phy_procedures_eNB_uespec_RX;
|
||||
eNB->proc_tx = proc_tx_full;
|
||||
eNB->tx_fh = NULL;
|
||||
eNB->tx_fh = tx_rf;
|
||||
eNB->rx_fh = rx_rf;
|
||||
eNB->start_rf = start_rf;
|
||||
eNB->start_if = NULL;
|
||||
|
||||
@@ -461,12 +461,12 @@ static void *scope_thread(void *arg) {
|
||||
//fl_set_object_label(form_stats_l2->stats_text, stats_buffer);
|
||||
fl_clear_browser(form_stats_l2->stats_text);
|
||||
fl_add_browser_line(form_stats_l2->stats_text, stats_buffer);
|
||||
}
|
||||
len = dump_eNB_stats (PHY_vars_eNB_g[0][0], stats_buffer, 0);
|
||||
|
||||
len = dump_eNB_stats (PHY_vars_eNB_g[0][0], stats_buffer, 0);
|
||||
|
||||
if (MAX_NUM_CCs>1)
|
||||
if (MAX_NUM_CCs>1)
|
||||
len += dump_eNB_stats (PHY_vars_eNB_g[0][1], &stats_buffer[len], 0);
|
||||
|
||||
}
|
||||
//fl_set_object_label(form_stats->stats_text, stats_buffer);
|
||||
fl_clear_browser(form_stats->stats_text);
|
||||
fl_add_browser_line(form_stats->stats_text, stats_buffer);
|
||||
@@ -1564,7 +1564,7 @@ int main( int argc, char **argv ) {
|
||||
UE[CC_id] = PHY_vars_UE_g[0][CC_id];
|
||||
printf("PHY_vars_UE_g[0][%d] = %p\n",CC_id,UE[CC_id]);
|
||||
|
||||
if (phy_test==1)
|
||||
if (phy_test==1)
|
||||
UE[CC_id]->mac_enabled = 0;
|
||||
else
|
||||
UE[CC_id]->mac_enabled = 1;
|
||||
@@ -1641,7 +1641,7 @@ int main( int argc, char **argv ) {
|
||||
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;
|
||||
if ((phy_test==1) || (node_function[CC_id] > NGFI_RAU_IF4p5)) PHY_vars_eNB_g[0][CC_id]->mac_enabled = 0;
|
||||
else PHY_vars_eNB_g[0][CC_id]->mac_enabled = 1;
|
||||
|
||||
if (PHY_vars_eNB_g[0][CC_id]->mac_enabled == 0) { //set default parameters for testing mode
|
||||
|
||||
Reference in New Issue
Block a user