diff --git a/openair1/PHY/defs.h b/openair1/PHY/defs.h index 70a661adf0c67d636c81b418c6e79586362eb45b..f9a459612986cf06b1b300935d7f844eea7745fe 100755 --- a/openair1/PHY/defs.h +++ b/openair1/PHY/defs.h @@ -158,10 +158,11 @@ enum transmission_access_mode { CBA_ACCESS}; typedef enum { - eNodeB_3GPP=0, // classical eNodeB function + eNodeB_3GPP=0, // classical eNodeB function eNodeB_3GPP_BBU, // eNodeB with NGFI IF5 - NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) - NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) + NGFI_RRU_IF5, // NGFI_RRU with IF5 + NGFI_RRU_IF4, // NGFI_RRU (NGFI remote radio-unit, currently split at common - ue_specific interface, IF4) + NGFI_RCC_IF4 // NGFI_RCC (NGFI radio cloud center, currently split at common - ue_specific interface, IF4) } eNB_func_t; typedef struct UE_SCAN_INFO_s { diff --git a/openair1/SCHED/phy_procedures_lte_eNb.c b/openair1/SCHED/phy_procedures_lte_eNb.c index a81e9dcfad4cdd65f1786740701664257c7eebbf..db069c64403fbcb95b607f4d033a7a97627fbda4 100755 --- a/openair1/SCHED/phy_procedures_lte_eNb.c +++ b/openair1/SCHED/phy_procedures_lte_eNb.c @@ -2546,7 +2546,8 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl if (abstraction_flag==0) { // grab signal in chunks of 500 us (1 slot) - if ((eNB->node_function == NGFI_RRU_IF4) || + if ((eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5) || (eNB->node_function == eNodeB_3GPP)) { // acquisition from RF for (i=0; i<fp->nb_antennas_rx; i++) @@ -2586,7 +2587,11 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_TRX_READ, 0 ); } else if(eNB->node_function == eNodeB_3GPP_BBU) { // acquisition from IF - /// **** trx_read_func from IF device **** /// + /// **** recv_IF5 of rxdata from RRH **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + nanosleep(&time_req, &time_rem); proc->timestamp_rx += fp->samples_per_tti; @@ -2598,7 +2603,14 @@ void phy_procedures_eNB_common_RX(PHY_VARS_eNB *eNB,const uint8_t abstraction_fl VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_FRAME_NUMBER_RX_ENB, proc->frame_rx ); VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_SUBFRAME_NUMBER_RX_ENB, proc->subframe_rx ); } - + + if (eNB->node_function == NGFI_RRU_IF5) { + /// **** send_IF5 of rxdata to BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); + //send_IF5(eNB, proc, ); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); + + } if ((eNB->node_function == NGFI_RRU_IF4) || (eNB->node_function == eNodeB_3GPP) || diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.c b/openair2/UTIL/LOG/vcd_signal_dumper.c index 73abd5d698827e043da05c466c0dc94098ec5b19..8fe33fefd5a405cc058d108891eb81c2403f8824 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.c +++ b/openair2/UTIL/LOG/vcd_signal_dumper.c @@ -331,9 +331,11 @@ const char* eurecomFunctionsNames[] = { "itti_relay_thread", "test", - /* IF4 signals */ + /* IF4/IF5 signals */ "send_if4", - "recv_if4" + "recv_if4", + "send_if5", + "recv_if5" }; struct vcd_module_s vcd_modules[VCD_SIGNAL_DUMPER_MODULE_END] = { diff --git a/openair2/UTIL/LOG/vcd_signal_dumper.h b/openair2/UTIL/LOG/vcd_signal_dumper.h index b6d0072603d019629703627f0dfae4c435aa5ed7..7bcdc5733bfb0403f811b6a4a58cd946a1027565 100644 --- a/openair2/UTIL/LOG/vcd_signal_dumper.h +++ b/openair2/UTIL/LOG/vcd_signal_dumper.h @@ -308,10 +308,12 @@ typedef enum { VCD_SIGNAL_DUMPER_FUNCTIONS_ITTI_RELAY_THREAD, VCD_SIGNAL_DUMPER_FUNCTIONS_TEST, - /* IF4 signals */ + /* IF4/IF5 signals */ VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, - + VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, + VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, + VCD_SIGNAL_DUMPER_FUNCTIONS_LAST, VCD_SIGNAL_DUMPER_FUNCTIONS_END = VCD_SIGNAL_DUMPER_FUNCTIONS_LAST, } vcd_signal_dump_functions; diff --git a/targets/RT/USER/lte-enb.c b/targets/RT/USER/lte-enb.c index 9111fe42c6092b53c0f32c84c7867d1ca4813f2c..0668764edd7b42379b7aeb49a12e153a56231180 100644 --- a/targets/RT/USER/lte-enb.c +++ b/targets/RT/USER/lte-enb.c @@ -436,7 +436,9 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; // UE-specific RX processing for subframe n - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_PROCEDURES_ENB_RX_UESPEC, 1 ); // this is the ue-specific processing for the subframe and can be multi-threaded later phy_procedures_eNB_uespec_RX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay ); @@ -474,7 +476,9 @@ static void* eNB_thread_rxtx( void* param ) { if (oai_exit) break; - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RRU_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RCC_IF4)) { phy_procedures_eNB_TX(PHY_vars_eNB_g[0][proc->CC_id], proc, 0, no_relay, NULL ); /* we're done, let the next one proceed */ @@ -491,8 +495,7 @@ static void* eNB_thread_rxtx( void* param ) { exit_fun("nothing to add"); break; } - } else { - + } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { /// **** recv_IF4 of txdataF from RCC **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 1 ); do { @@ -500,11 +503,19 @@ static void* eNB_thread_rxtx( void* param ) { } while (symbol_number < PHY_vars_eNB_g[0][proc->CC_id]->frame_parms.symbols_per_tti-1); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF4, 0 ); + } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5) { + /// **** recv_IF5 of txdata from BBU **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 1 ); + //recv_IF5(); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_RECV_IF5, 0 ); + } } // eNodeB_3GPP, _BBU and RRU create txdata - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function != NGFI_RCC_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4)) { VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 1 ); do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] ); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_PHY_ENB_SFGEN , 0 ); @@ -526,8 +537,9 @@ static void* eNB_thread_rxtx( void* param ) { // eNodeB_3GPP, RRU write to RF device - if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP || - PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) { + if ((PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF4) || + (PHY_vars_eNB_g[0][proc->CC_id]->node_function == NGFI_RRU_IF5)) { // 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 @@ -548,14 +560,17 @@ static void* eNB_thread_rxtx( void* param ) { VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (proc->timestamp_tx-openair0_cfg[0].tx_sample_advance)&0xffffffff ); } else if (PHY_vars_eNB_g[0][proc->CC_id]->node_function == eNodeB_3GPP_BBU) { - /// **** trx_write_func to IF device **** /// + /// **** send_IF5 of txdata to RRH **** /// + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 1 ); send_IF5(PHY_vars_eNB_g[0][proc->CC_id], proc, &seqno, IF5_RRH_GW); + VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF5, 0 ); } else { /// **** send_IF4 of txdataF to RRU **** /// VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 1 ); send_IF4(PHY_vars_eNB_g[0][proc->CC_id], proc->frame_tx, proc->subframe_tx, IF4_PDLFFT, 0); VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME( VCD_SIGNAL_DUMPER_FUNCTIONS_SEND_IF4, 0 ); + } if (pthread_mutex_lock(&proc->mutex_rxtx) != 0) { @@ -759,7 +774,9 @@ static void* eNB_thread_rx_common( void* param ) { } // Start RF device for this CC - if (eNB->node_function == eNodeB_3GPP || eNB->node_function == NGFI_RRU_IF4) { + if ((eNB->node_function == eNodeB_3GPP) || + (eNB->node_function == NGFI_RRU_IF4) || + (eNB->node_function == NGFI_RRU_IF5)) { if (eNB->rfdevice.trx_start_func(&eNB->rfdevice) != 0 ) LOG_E(HW,"Could not start the RF device\n"); } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index 656c22ced32f9471e63230b765551f3f94971916..887f95a1117fee0c88131d0c561ff0eb1dec9498 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -385,9 +385,11 @@ void help (void) { printf(" --ue-txgain set UE TX gain\n"); printf(" --ue-scan_carrier set UE to scan around carrier\n"); printf(" --loop-memory get softmodem (UE) to loop through memory instead of acquiring from HW\n"); - printf(" --RCC run using NGFI RCC node function\n"); - printf(" --RRU run using NGFI RRU node function\n"); + printf(" --RCC run using NGFI RCC node function IF4 split\n"); + printf(" --RRU run using NGFI RRU node function IF4 split\n"); printf(" --eNB run using 3GPP eNB node function\n"); + printf(" --BBU run using 3GPP eNB node function with IF5 split\n"); + printf(" --RRH run using RRH node function with IF5 split\n"); printf(" -C Set the downlink frequency for all component carriers\n"); printf(" -d Enable soft scope and L1 and L2 stats (Xforms)\n"); printf(" -F Calibrate the EXMIMO borad, available files: exmimo2_2arxg.lime exmimo2_2brxg.lime \n"); @@ -687,7 +689,8 @@ static void get_options (int argc, char **argv) LONG_OPTION_RCC, LONG_OPTION_RRU, LONG_OPTION_ENB, - LONG_OPTION_ENB_BBU + LONG_OPTION_ENB_BBU, + LONG_OPTION_RRH #if T_TRACER , LONG_OPTION_T_PORT, @@ -715,6 +718,7 @@ static void get_options (int argc, char **argv) {"RRU", no_argument, NULL, LONG_OPTION_RRU}, {"eNB", no_argument, NULL, LONG_OPTION_ENB}, {"BBU", no_argument, NULL, LONG_OPTION_ENB_BBU}, + {"RRH", no_argument, NULL, LONG_OPTION_RRH}, #if T_TRACER {"T_port", required_argument, 0, LONG_OPTION_T_PORT}, {"T_nowait", no_argument, 0, LONG_OPTION_T_NOWAIT}, @@ -821,6 +825,10 @@ static void get_options (int argc, char **argv) case LONG_OPTION_ENB_BBU: node_function = eNodeB_3GPP_BBU; break; + + case LONG_OPTION_RRH: + node_function = NGFI_RRU_IF5; + break; #if T_TRACER case LONG_OPTION_T_PORT: { @@ -1649,7 +1657,7 @@ int main( int argc, char **argv ) openair0_cfg[0].log_level = glog_level; for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { - if (node_function == NGFI_RRU_IF4) { + if (node_function == NGFI_RRU_IF4 || node_function == NGFI_RRU_IF5) { PHY_vars_eNB_g[0][CC_id]->rfdevice.host_type = RRH_HOST; PHY_vars_eNB_g[0][CC_id]->ifdevice.host_type = RRH_HOST; } else { @@ -1670,39 +1678,12 @@ int main( int argc, char **argv ) openair0.type = NONE_DEV; /* transport type is initialized NONE_TP (no transport protocol) when the transport protocol will be initiated transport protocol type will be set */ openair0.transp_type = NONE_TP; - - // Legacy BBU - RRH init - //int returns=-1; - ///* BBU can have either a local or a remote radio head */ - //if (local_remote_radio == BBU_LOCAL_RADIO_HEAD) { //local radio head active - load library of radio head and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_device_load(&openair0, &openair0_cfg[0]); - //printf("openair0_device_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize device\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} else { //remote radio head active - load library of transport protocol and initiate it - //if (mode!=loop_through_memory) { - //returns=openair0_transport_load(&openair0, &openair0_cfg[0], eth_params); - //printf("openair0_transport_init returns %d\n",returns); - //if (returns<0) { - //printf("Exiting, cannot initialize transport protocol\n"); - //exit(-1); - //} - //} - //else if (mode==loop_through_memory) { - //} - //} - + int returns=-1; // Handle spatially distributed MIMO antenna ports // Load RF device and initialize - if (node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { + if (node_function == NGFI_RRU_IF5 || node_function == NGFI_RRU_IF4 || node_function == eNodeB_3GPP) { for (CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) { if (mode!=loop_through_memory) { returns=openair0_device_load(&(PHY_vars_eNB_g[0][CC_id]->rfdevice), &openair0_cfg[0]);