first steps of SoDeRa configuration
This commit is contained in:
@@ -438,16 +438,18 @@ elseif (${RF_BOARD} STREQUAL "OAI_BLADERF")
|
|||||||
#set(LOWLATENCY False)
|
#set(LOWLATENCY False)
|
||||||
|
|
||||||
elseif (${RF_BOARD} STREQUAL "OAI_SODERA")
|
elseif (${RF_BOARD} STREQUAL "OAI_SODERA")
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/")
|
include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB")
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/src/lms7002m")
|
include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m")
|
||||||
include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/src/Si5351C")
|
include_directories("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C")
|
||||||
set(HW_SOURCE ${HW_SOURCE}
|
set(HW_SOURCE ${HW_SOURCE}
|
||||||
${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp
|
${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/sodera_lib.cpp
|
||||||
)
|
)
|
||||||
LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/SoDeRaV1_distro_01v/lms7suite_source_code/build/lms7002m")
|
LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/lms7002m")
|
||||||
|
LINK_DIRECTORIES("${OPENAIR_TARGETS}/ARCH/SODERA/USERSPACE/LIB/lms7suite/src/Si5351C")
|
||||||
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
LINK_DIRECTORIES("/usr/lib/x86_64-linux-gnu")
|
||||||
set(option_HW_lib "usb-1.0")
|
set(option_HW_lib "usb-1.0")
|
||||||
set(LMS7002_LIB "libLMS7002M.a")
|
set(LMS7002_LIB "libLMS7002M.a")
|
||||||
|
set(Si5351C_LIB "libSi5351C.a")
|
||||||
#set(LOWLATENCY False)
|
#set(LOWLATENCY False)
|
||||||
|
|
||||||
elseif (${RF_BOARD} STREQUAL "ETHERNET")
|
elseif (${RF_BOARD} STREQUAL "ETHERNET")
|
||||||
@@ -1447,7 +1449,7 @@ add_executable(lte-softmodem
|
|||||||
|
|
||||||
target_link_libraries (lte-softmodem
|
target_link_libraries (lte-softmodem
|
||||||
-Wl,--start-group
|
-Wl,--start-group
|
||||||
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB}
|
RRC_LIB S1AP_LIB S1AP_ENB GTPV1U SECU_CN SECU_OSA UTIL HASHTABLE SCTP_CLIENT UDP SCHED_LIB PHY LFDS L2 ${MSC_LIB} ${RAL_LIB} ${NAS_UE_LIB} ${ITTI_LIB} ${MIH_LIB} ${LMS7002_LIB} ${Si5351C_LIB}
|
||||||
-Wl,--end-group )
|
-Wl,--end-group )
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -59,11 +59,16 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf
|
|||||||
return(openair0_dev_init_usrp(device, openair0_cfg));
|
return(openair0_dev_init_usrp(device, openair0_cfg));
|
||||||
#elif OAI_BLADERF
|
#elif OAI_BLADERF
|
||||||
device->type=BLADERF_IF;
|
device->type=BLADERF_IF;
|
||||||
printf(" openair0_dev_init_bladerf ...\n");
|
printf("openair0_dev_init_bladerf ...\n");
|
||||||
return(openair0_dev_init_bladerf(device, openair0_cfg));
|
return(openair0_dev_init_bladerf(device, openair0_cfg));
|
||||||
#elif OAI_SODERA
|
#elif OAI_SODERA
|
||||||
device->type=OAI_SODERA;
|
device->type=OAI_SODERA;
|
||||||
printf(" openair0_dev_init_sodera ...\n");
|
printf("openair0_dev_init_sodera ...\n");
|
||||||
|
if (openair0_cfg[0].configFilename==NULL) {
|
||||||
|
printf("Please provide a configuration file for SoDeRa\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
return(openair0_dev_init_sodera(device, openair0_cfg));
|
return(openair0_dev_init_sodera(device, openair0_cfg));
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -133,7 +133,8 @@ typedef struct {
|
|||||||
char *my_ip;
|
char *my_ip;
|
||||||
//! my port number for Ethernet interface (eNB/BBU, UE)
|
//! my port number for Ethernet interface (eNB/BBU, UE)
|
||||||
int my_port;
|
int my_port;
|
||||||
|
//! Configuration file for LMS7002M
|
||||||
|
char *configFilename;
|
||||||
} openair0_config_t;
|
} openair0_config_t;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|||||||
@@ -31,8 +31,9 @@
|
|||||||
*
|
*
|
||||||
* Author: Raymond Knopp
|
* Author: Raymond Knopp
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
#include <string>
|
||||||
#include <stdio.h>
|
#include <stdio.h>
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <inttypes.h>
|
#include <inttypes.h>
|
||||||
@@ -49,6 +50,7 @@
|
|||||||
#include "common_lib.h"
|
#include "common_lib.h"
|
||||||
|
|
||||||
#include "lmsComms.h"
|
#include "lmsComms.h"
|
||||||
|
#include "LMS7002M.h"
|
||||||
#include "Si5351C.h"
|
#include "Si5351C.h"
|
||||||
#ifdef __SSE4_1__
|
#ifdef __SSE4_1__
|
||||||
# include <smmintrin.h>
|
# include <smmintrin.h>
|
||||||
@@ -58,6 +60,8 @@
|
|||||||
# include <immintrin.h>
|
# include <immintrin.h>
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
using namespace std;
|
||||||
|
|
||||||
int num_devices=0;
|
int num_devices=0;
|
||||||
/*These items configure the underlying asynch stream used by the the sync interface.
|
/*These items configure the underlying asynch stream used by the the sync interface.
|
||||||
*/
|
*/
|
||||||
@@ -84,8 +88,8 @@ typedef struct
|
|||||||
uhd::async_metadata_t async_md;
|
uhd::async_metadata_t async_md;
|
||||||
*/
|
*/
|
||||||
|
|
||||||
LMScomms mDataPort;
|
LMScomms Port;
|
||||||
|
Si5351C Si;
|
||||||
double sample_rate;
|
double sample_rate;
|
||||||
// time offset between transmiter timestamp and receiver timestamp;
|
// time offset between transmiter timestamp and receiver timestamp;
|
||||||
double tdiff;
|
double tdiff;
|
||||||
@@ -103,6 +107,7 @@ typedef struct
|
|||||||
|
|
||||||
} sodera_state_t;
|
} sodera_state_t;
|
||||||
|
|
||||||
|
sodera_state_t sodera_state;
|
||||||
|
|
||||||
static int trx_sodera_start(openair0_device *device)
|
static int trx_sodera_start(openair0_device *device)
|
||||||
{
|
{
|
||||||
@@ -308,62 +313,99 @@ int trx_sodera_reset_stats(openair0_device* device) {
|
|||||||
int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair0_cfg)
|
int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair0_cfg)
|
||||||
{
|
{
|
||||||
|
|
||||||
sodera_state_t *s = (sodera_state_t*)malloc(sizeof(sodera_state_t));
|
sodera_state_t *s=&sodera_state;
|
||||||
|
|
||||||
size_t i;
|
size_t i;
|
||||||
memset(s, 0, sizeof(sodera_state_t));
|
|
||||||
|
|
||||||
// Initialize SODERA device
|
// Initialize SODERA device
|
||||||
if (!s->mDataPort.Open(0)) {
|
s->Port.RefreshDeviceList();
|
||||||
printf("Cannot open SoDeRa\n");
|
vector<string> deviceNames=s->Port.GetDeviceList();
|
||||||
exit(-1);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
if (deviceNames.size() == 1) {
|
||||||
int vers=0,subvers=0,subsubvers=0;
|
if (s->Port.Open(0) != IConnection::SUCCESS) {
|
||||||
int bw_gain_adjust=0;
|
printf("Cannot open SoDeRa\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
LMSinfo devInfo = s->Port.GetInfo();
|
||||||
|
printf("Device %s, HW: %d, FW: %d, Protocol %d\n",
|
||||||
|
GetDeviceName(devInfo.device),
|
||||||
|
(int)devInfo.hardware,
|
||||||
|
(int)devInfo.firmware,
|
||||||
|
(int)devInfo.protocol);
|
||||||
|
LMS7002M lmsControl(&s->Port);
|
||||||
|
|
||||||
|
printf("Configuring Si5351C\n");
|
||||||
|
s->Si.Initialize(&s->Port);
|
||||||
|
s->Si.SetPLL(0, 25000000, 0);
|
||||||
|
s->Si.SetPLL(1, 25000000, 0);
|
||||||
|
s->Si.SetClock(0, 27000000, true, false);
|
||||||
|
s->Si.SetClock(1, 27000000, true, false);
|
||||||
|
for (int i = 2; i < 8; ++i)
|
||||||
|
s->Si.SetClock(i, 27000000, false, false);
|
||||||
|
Si5351C::Status status = s->Si.ConfigureClocks();
|
||||||
|
if (status != Si5351C::SUCCESS)
|
||||||
|
{
|
||||||
|
printf("Failed to configure Si5351C");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
status = s->Si.UploadConfiguration();
|
||||||
|
if (status != Si5351C::SUCCESS)
|
||||||
|
printf("Failed to upload Si5351C configuration");
|
||||||
|
|
||||||
|
|
||||||
|
printf("Configuring LMS7002\n");
|
||||||
|
|
||||||
|
int bw_gain_adjust=0;
|
||||||
|
|
||||||
|
|
||||||
openair0_cfg[0].rx_gain_calib_table = calib_table_sodera;
|
openair0_cfg[0].rx_gain_calib_table = calib_table_sodera;
|
||||||
|
|
||||||
switch ((int)openair0_cfg[0].sample_rate) {
|
switch ((int)openair0_cfg[0].sample_rate) {
|
||||||
case 30720000:
|
case 30720000:
|
||||||
// from usrp_time_offset
|
// from usrp_time_offset
|
||||||
openair0_cfg[0].samples_per_packet = 2048;
|
openair0_cfg[0].samples_per_packet = 2048;
|
||||||
openair0_cfg[0].tx_sample_advance = 15;
|
openair0_cfg[0].tx_sample_advance = 15;
|
||||||
openair0_cfg[0].tx_bw = 20e6;
|
openair0_cfg[0].tx_bw = 20e6;
|
||||||
openair0_cfg[0].rx_bw = 20e6;
|
openair0_cfg[0].rx_bw = 20e6;
|
||||||
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
||||||
break;
|
break;
|
||||||
case 15360000:
|
case 15360000:
|
||||||
openair0_cfg[0].samples_per_packet = 2048;
|
openair0_cfg[0].samples_per_packet = 2048;
|
||||||
openair0_cfg[0].tx_sample_advance = 45;
|
openair0_cfg[0].tx_sample_advance = 45;
|
||||||
openair0_cfg[0].tx_bw = 10e6;
|
openair0_cfg[0].tx_bw = 10e6;
|
||||||
openair0_cfg[0].rx_bw = 10e6;
|
openair0_cfg[0].rx_bw = 10e6;
|
||||||
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
||||||
break;
|
break;
|
||||||
case 7680000:
|
case 7680000:
|
||||||
openair0_cfg[0].samples_per_packet = 1024;
|
openair0_cfg[0].samples_per_packet = 1024;
|
||||||
openair0_cfg[0].tx_sample_advance = 50;
|
openair0_cfg[0].tx_sample_advance = 50;
|
||||||
openair0_cfg[0].tx_bw = 5e6;
|
openair0_cfg[0].tx_bw = 5e6;
|
||||||
openair0_cfg[0].rx_bw = 5e6;
|
openair0_cfg[0].rx_bw = 5e6;
|
||||||
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
||||||
break;
|
break;
|
||||||
case 1920000:
|
case 1920000:
|
||||||
openair0_cfg[0].samples_per_packet = 256;
|
openair0_cfg[0].samples_per_packet = 256;
|
||||||
openair0_cfg[0].tx_sample_advance = 50;
|
openair0_cfg[0].tx_sample_advance = 50;
|
||||||
openair0_cfg[0].tx_bw = 1.25e6;
|
openair0_cfg[0].tx_bw = 1.25e6;
|
||||||
openair0_cfg[0].rx_bw = 1.25e6;
|
openair0_cfg[0].rx_bw = 1.25e6;
|
||||||
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
|
printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
|
||||||
exit(-1);
|
exit(-1);
|
||||||
break;
|
break;
|
||||||
}
|
|
||||||
|
}
|
||||||
/*
|
liblms7_status opStatus;
|
||||||
for(i=0;i<s->usrp->get_rx_num_channels();i++) {
|
lmsControl.ResetChip();
|
||||||
if (i<openair0_cfg[0].rx_num_channels) {
|
opStatus = lmsControl.LoadConfig(openair0_cfg[0].configFilename);
|
||||||
|
|
||||||
|
if (opStatus != LIBLMS7_SUCCESS) {
|
||||||
|
printf("Failed to load configuration file %s\n",openair0_cfg[0].configFilename);
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
/*
|
||||||
|
for(i=0;i<openair0_cfg[0].rx_num_channels;i++) {
|
||||||
s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
|
s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
|
||||||
s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
|
s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
|
||||||
printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6);
|
printf("Setting rx freq/gain on channel %lu/%lu : BW %f (readback %f)\n",i,s->usrp->get_rx_num_channels(),openair0_cfg[0].rx_bw/1e6,s->usrp->get_rx_bandwidth(i)/1e6);
|
||||||
@@ -420,9 +462,12 @@ int openair0_dev_init_sodera(openair0_device* device, openair0_config_t *openair
|
|||||||
std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl;
|
std::cout << boost::format("Actual TX bandwidth: %fM...") % (s->usrp->get_tx_bandwidth(i)/1e6) << std::endl;
|
||||||
std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl;
|
std::cout << boost::format("Actual TX antenna: %s...") % (s->usrp->get_tx_antenna(i)) << std::endl;
|
||||||
}
|
}
|
||||||
}
|
|
||||||
*/
|
*/
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
printf("Please connect SoDeRa\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
|
||||||
device->priv = s;
|
device->priv = s;
|
||||||
device->trx_start_func = trx_sodera_start;
|
device->trx_start_func = trx_sodera_start;
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -17,7 +17,7 @@ eNBs =
|
|||||||
|
|
||||||
mobile_country_code = "208";
|
mobile_country_code = "208";
|
||||||
|
|
||||||
mobile_network_code = "92";
|
mobile_network_code = "93";
|
||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
@@ -36,7 +36,7 @@ eNBs =
|
|||||||
nb_antennas_tx = 1;
|
nb_antennas_tx = 1;
|
||||||
nb_antennas_rx = 1;
|
nb_antennas_rx = 1;
|
||||||
tx_gain = 90;
|
tx_gain = 90;
|
||||||
rx_gain = 120;
|
rx_gain = 128;
|
||||||
prach_root = 0;
|
prach_root = 0;
|
||||||
prach_config_index = 0;
|
prach_config_index = 0;
|
||||||
prach_high_speed = "DISABLE";
|
prach_high_speed = "DISABLE";
|
||||||
@@ -66,7 +66,7 @@ eNBs =
|
|||||||
|
|
||||||
pusch_p0_Nominal = -90;
|
pusch_p0_Nominal = -90;
|
||||||
pusch_alpha = "AL1";
|
pusch_alpha = "AL1";
|
||||||
pucch_p0_Nominal = -108;
|
pucch_p0_Nominal = -96;
|
||||||
msg3_delta_Preamble = 6;
|
msg3_delta_Preamble = 6;
|
||||||
pucch_deltaF_Format1 = "deltaF2";
|
pucch_deltaF_Format1 = "deltaF2";
|
||||||
pucch_deltaF_Format1b = "deltaF3";
|
pucch_deltaF_Format1b = "deltaF3";
|
||||||
@@ -131,7 +131,7 @@ eNBs =
|
|||||||
};
|
};
|
||||||
|
|
||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.13.11";
|
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
@@ -141,10 +141,10 @@ eNBs =
|
|||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24";
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.215/24";
|
||||||
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24";
|
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.215/24";
|
||||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -290,6 +290,8 @@ double bw = 10.0e6;
|
|||||||
|
|
||||||
static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
|
static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
|
||||||
|
|
||||||
|
char rf_config_file[1024];
|
||||||
|
|
||||||
int chain_offset=0;
|
int chain_offset=0;
|
||||||
|
|
||||||
#ifndef EXMIMO
|
#ifndef EXMIMO
|
||||||
@@ -411,6 +413,7 @@ void help (void) {
|
|||||||
printf(" sudo -E lte-softmodem [options]\n");
|
printf(" sudo -E lte-softmodem [options]\n");
|
||||||
printf(" sudo -E ./lte-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf -S -V -m 26 -t 16 -x 1 --ulsch-max-errors 100 -W\n\n");
|
printf(" sudo -E ./lte-softmodem -O ../../../targets/PROJECTS/GENERIC-LTE-EPC/CONF/enb.band7.tm1.exmimo2.openEPC.conf -S -V -m 26 -t 16 -x 1 --ulsch-max-errors 100 -W\n\n");
|
||||||
printf("Options:\n");
|
printf("Options:\n");
|
||||||
|
printf(" --rf-config-file Configuration file for front-end (e.g. LMS7002M)\n");
|
||||||
printf(" --ulsch-max-errors set the max ULSCH erros\n");
|
printf(" --ulsch-max-errors set the max ULSCH erros\n");
|
||||||
printf(" --calib-ue-rx set UE RX calibration\n");
|
printf(" --calib-ue-rx set UE RX calibration\n");
|
||||||
printf(" --calib-ue-rx-med \n");
|
printf(" --calib-ue-rx-med \n");
|
||||||
@@ -2051,6 +2054,7 @@ static void get_options (int argc, char **argv)
|
|||||||
|
|
||||||
enum long_option_e {
|
enum long_option_e {
|
||||||
LONG_OPTION_START = 0x100, /* Start after regular single char options */
|
LONG_OPTION_START = 0x100, /* Start after regular single char options */
|
||||||
|
LONG_OPTION_RF_CONFIG_FILE,
|
||||||
LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS,
|
LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS,
|
||||||
LONG_OPTION_CALIB_UE_RX,
|
LONG_OPTION_CALIB_UE_RX,
|
||||||
LONG_OPTION_CALIB_UE_RX_MED,
|
LONG_OPTION_CALIB_UE_RX_MED,
|
||||||
@@ -2067,6 +2071,7 @@ static void get_options (int argc, char **argv)
|
|||||||
};
|
};
|
||||||
|
|
||||||
static const struct option long_options[] = {
|
static const struct option long_options[] = {
|
||||||
|
{"rf-config-file",required_argument, NULL, LONG_OPTION_RF_CONFIG_FILE},
|
||||||
{"ulsch-max-errors",required_argument, NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS},
|
{"ulsch-max-errors",required_argument, NULL, LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS},
|
||||||
{"calib-ue-rx", required_argument, NULL, LONG_OPTION_CALIB_UE_RX},
|
{"calib-ue-rx", required_argument, NULL, LONG_OPTION_CALIB_UE_RX},
|
||||||
{"calib-ue-rx-med", required_argument, NULL, LONG_OPTION_CALIB_UE_RX_MED},
|
{"calib-ue-rx-med", required_argument, NULL, LONG_OPTION_CALIB_UE_RX_MED},
|
||||||
@@ -2085,11 +2090,19 @@ static void get_options (int argc, char **argv)
|
|||||||
|
|
||||||
while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) {
|
while ((c = getopt_long (argc, argv, "A:a:C:dEK:g:F:G:hqO:m:SUVRM:r:P:Ws:t:Tx:",long_options,NULL)) != -1) {
|
||||||
switch (c) {
|
switch (c) {
|
||||||
|
case LONG_OPTION_RF_CONFIG_FILE:
|
||||||
|
if (strlen(optarg)<=1024)
|
||||||
|
strcpy(rf_config_file,optarg);
|
||||||
|
else {
|
||||||
|
printf("Configuration filename is too long\n");
|
||||||
|
exit(-1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
case LONG_OPTION_MAXPOWER:
|
case LONG_OPTION_MAXPOWER:
|
||||||
tx_max_power[0]=atoi(optarg);
|
tx_max_power[0]=atoi(optarg);
|
||||||
for (CC_id=1;CC_id<MAX_NUM_CCs;CC_id++)
|
for (CC_id=1;CC_id<MAX_NUM_CCs;CC_id++)
|
||||||
tx_max_power[CC_id]=tx_max_power[0];
|
tx_max_power[CC_id]=tx_max_power[0];
|
||||||
|
break;
|
||||||
case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
|
case LONG_OPTION_ULSCH_MAX_CONSECUTIVE_ERRORS:
|
||||||
ULSCH_max_consecutive_errors = atoi(optarg);
|
ULSCH_max_consecutive_errors = atoi(optarg);
|
||||||
printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
|
printf("Set ULSCH_max_consecutive_errors = %d\n",ULSCH_max_consecutive_errors);
|
||||||
@@ -2552,8 +2565,12 @@ int main( int argc, char **argv )
|
|||||||
}
|
}
|
||||||
logInit();
|
logInit();
|
||||||
|
|
||||||
|
rf_config_file[0]='\0';
|
||||||
get_options (argc, argv); //Command-line options
|
get_options (argc, argv); //Command-line options
|
||||||
|
if (rf_config_file[0] == '\0')
|
||||||
|
openair0_cfg[0].configFilename = NULL;
|
||||||
|
else
|
||||||
|
openair0_cfg[0].configFilename = rf_config_file;
|
||||||
|
|
||||||
// initialize the log (see log.h for details)
|
// initialize the log (see log.h for details)
|
||||||
set_glog(glog_level, glog_verbosity);
|
set_glog(glog_level, glog_verbosity);
|
||||||
|
|||||||
Reference in New Issue
Block a user