Merge branch 'enhancement-57-UHD-interfacing' into develop
This commit is contained in:
@@ -52,7 +52,7 @@ int openair0_device_init(openair0_device *device, openair0_config_t *openair0_cf
|
|||||||
openair0_dev_init_exmimo(device, openair0_cfg);
|
openair0_dev_init_exmimo(device, openair0_cfg);
|
||||||
printf("openair0_dev_init_exmimo...\n");
|
printf("openair0_dev_init_exmimo...\n");
|
||||||
#elif OAI_USRP
|
#elif OAI_USRP
|
||||||
device->type=USRP_IF;
|
device->type=USRP_B200_IF;
|
||||||
openair0_dev_init_usrp(device, openair0_cfg);
|
openair0_dev_init_usrp(device, openair0_cfg);
|
||||||
printf("openair0_dev_init_usrp ...\n");
|
printf("openair0_dev_init_usrp ...\n");
|
||||||
#elif OAI_BLADERF
|
#elif OAI_BLADERF
|
||||||
|
|||||||
@@ -84,10 +84,10 @@ typedef struct {
|
|||||||
double sample_rate;
|
double sample_rate;
|
||||||
//! number of samples per RX/TX packet (USRP + Ethernet)
|
//! number of samples per RX/TX packet (USRP + Ethernet)
|
||||||
int samples_per_packet;
|
int samples_per_packet;
|
||||||
// delay in sending samples (write) due to hardware access, softmodem processing and fronthaul delay if exist
|
//! delay in sending samples (write) due to hardware access, softmodem processing and fronthaul delay if exist
|
||||||
int tx_delay;
|
int tx_scheduling_advance;
|
||||||
//! adjust the position of the samples after delay when sending
|
//! offset in samples between TX and RX paths
|
||||||
unsigned int tx_forward_nsamps;
|
int tx_sample_advance;
|
||||||
//! number of RX channels (=RX antennas)
|
//! number of RX channels (=RX antennas)
|
||||||
int rx_num_channels;
|
int rx_num_channels;
|
||||||
//! number of TX channels (=TX antennas)
|
//! number of TX channels (=TX antennas)
|
||||||
@@ -98,6 +98,10 @@ typedef struct {
|
|||||||
//! \brief Center frequency in Hz for TX.
|
//! \brief Center frequency in Hz for TX.
|
||||||
//! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
|
//! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels
|
||||||
double tx_freq[4];
|
double tx_freq[4];
|
||||||
|
|
||||||
|
//! \brief Pointer to Calibration table for RX gains
|
||||||
|
rx_gain_calib_table_t *rx_gain_calib_table;
|
||||||
|
|
||||||
//! mode for rxgain (ExpressMIMO2)
|
//! mode for rxgain (ExpressMIMO2)
|
||||||
rx_gain_t rxg_mode[4];
|
rx_gain_t rxg_mode[4];
|
||||||
//! \brief Gain for RX in dB.
|
//! \brief Gain for RX in dB.
|
||||||
@@ -147,8 +151,10 @@ typedef enum {
|
|||||||
ETH_IF,
|
ETH_IF,
|
||||||
/*!\brief device is ExpressMIMO */
|
/*!\brief device is ExpressMIMO */
|
||||||
EXMIMO_IF,
|
EXMIMO_IF,
|
||||||
/*!\brief device is USRP*/
|
/*!\brief device is USRP B200/B210*/
|
||||||
USRP_IF,
|
USRP_B200_IF,
|
||||||
|
/*!\brief device is USRP X300/X310*/
|
||||||
|
USRP_X300_IF,
|
||||||
/*!\brief device is BLADE RF*/
|
/*!\brief device is BLADE RF*/
|
||||||
BLADERF_IF,
|
BLADERF_IF,
|
||||||
/*!\brief device is NONE*/
|
/*!\brief device is NONE*/
|
||||||
|
|||||||
@@ -171,31 +171,45 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
if (device->type == USRP_B200_IF) {
|
||||||
if (cc>1) {
|
if (cc>1) {
|
||||||
// receive multiple channels (e.g. RF A and RF B)
|
// receive multiple channels (e.g. RF A and RF B)
|
||||||
std::vector<void *> buff_ptrs;
|
std::vector<void *> buff_ptrs;
|
||||||
for (int i=0;i<cc;i++) buff_ptrs.push_back(buff_tmp[i]);
|
|
||||||
samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md);
|
for (int i=0;i<cc;i++) buff_ptrs.push_back(buff_tmp[i]);
|
||||||
} else {
|
samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md);
|
||||||
|
} else {
|
||||||
// receive a single channel (e.g. from connector RF A)
|
// receive a single channel (e.g. from connector RF A)
|
||||||
samples_received = s->rx_stream->recv(buff_tmp[0], nsamps, s->rx_md);
|
samples_received = s->rx_stream->recv(buff_tmp[0], nsamps, s->rx_md);
|
||||||
}
|
}
|
||||||
|
|
||||||
// bring RX data into 12 LSBs for softmodem RX
|
// bring RX data into 12 LSBs for softmodem RX
|
||||||
for (int i=0;i<cc;i++) {
|
for (int i=0;i<cc;i++) {
|
||||||
for (int j=0; j<nsamps2; j++) {
|
for (int j=0; j<nsamps2; j++) {
|
||||||
#if defined(__x86_64__) || defined(__i386__)
|
#if defined(__x86_64__) || defined(__i386__)
|
||||||
#ifdef __AVX2__
|
#ifdef __AVX2__
|
||||||
((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],4);
|
((__m256i *)buff[i])[j] = _mm256_srai_epi16(buff_tmp[i][j],4);
|
||||||
#else
|
#else
|
||||||
((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],4);
|
((__m128i *)buff[i])[j] = _mm_srai_epi16(buff_tmp[i][j],4);
|
||||||
#endif
|
#endif
|
||||||
#elif defined(__arm__)
|
#elif defined(__arm__)
|
||||||
((int16x8_t*)buff[i])[j] = vshrq_n_s16(buff_tmp[i][j],4);
|
((int16x8_t*)buff[i])[j] = vshrq_n_s16(buff_tmp[i][j],4);
|
||||||
#endif
|
#endif
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
} else if (device->type == USRP_X300_IF) {
|
||||||
|
if (cc>1) {
|
||||||
|
// receive multiple channels (e.g. RF A and RF B)
|
||||||
|
std::vector<void *> buff_ptrs;
|
||||||
|
|
||||||
|
for (int i=0;i<cc;i++) buff_ptrs.push_back(buff[i]);
|
||||||
|
samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md);
|
||||||
|
} else {
|
||||||
|
// receive a single channel (e.g. from connector RF A)
|
||||||
|
samples_received = s->rx_stream->recv(buff[0], nsamps, s->rx_md);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (samples_received < nsamps) {
|
if (samples_received < nsamps) {
|
||||||
printf("[recv] received %d samples out of %d\n",samples_received,nsamps);
|
printf("[recv] received %d samples out of %d\n",samples_received,nsamps);
|
||||||
|
|
||||||
@@ -279,7 +293,7 @@ int trx_usrp_set_gains(openair0_device* device,
|
|||||||
exit(-1);
|
exit(-1);
|
||||||
}
|
}
|
||||||
s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]);
|
s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]);
|
||||||
printf("Setting USRP RX gain to %f\n", openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]);
|
printf("Setting USRP RX gain to %f (rx_gain %f,gain_range.stop() %f)\n", openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0],openair0_cfg[0].rx_gain[0],gain_range.stop());
|
||||||
|
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
@@ -289,7 +303,7 @@ int trx_usrp_stop(int card) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rx_gain_calib_table_t calib_table[] = {
|
rx_gain_calib_table_t calib_table_b210[] = {
|
||||||
{3500000000.0,46.0},
|
{3500000000.0,46.0},
|
||||||
{2660000000.0,53.0},
|
{2660000000.0,53.0},
|
||||||
{2300000000.0,54.0},
|
{2300000000.0,54.0},
|
||||||
@@ -297,19 +311,29 @@ rx_gain_calib_table_t calib_table[] = {
|
|||||||
{816000000.0,62.0},
|
{816000000.0,62.0},
|
||||||
{-1,0}};
|
{-1,0}};
|
||||||
|
|
||||||
|
rx_gain_calib_table_t calib_table_x310[] = {
|
||||||
|
{3500000000.0,77.0},
|
||||||
|
{2660000000.0,80.0},
|
||||||
|
{2300000000.0,81.0},
|
||||||
|
{1880000000.0,82.0},
|
||||||
|
{816000000.0,85.0},
|
||||||
|
{-1,0}};
|
||||||
|
|
||||||
void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
|
void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
|
||||||
|
|
||||||
int i=0;
|
int i=0;
|
||||||
// loop through calibration table to find best adjustment factor for RX frequency
|
// loop through calibration table to find best adjustment factor for RX frequency
|
||||||
double min_diff = 6e9,diff;
|
double min_diff = 6e9,diff;
|
||||||
|
|
||||||
while (calib_table[i].freq>0) {
|
while (openair0_cfg->rx_gain_calib_table[i].freq>0) {
|
||||||
diff = fabs(openair0_cfg->rx_freq[chain_index] - calib_table[i].freq);
|
diff = fabs(openair0_cfg->rx_freq[chain_index] - openair0_cfg->rx_gain_calib_table[i].freq);
|
||||||
printf("cal %d: freq %f, offset %f, diff %f\n",
|
printf("cal %d: freq %f, offset %f, diff %f\n",
|
||||||
i,calib_table[i].freq,calib_table[i].offset,diff);
|
i,
|
||||||
|
openair0_cfg->rx_gain_calib_table[i].freq,
|
||||||
|
openair0_cfg->rx_gain_calib_table[i].offset,diff);
|
||||||
if (min_diff > diff) {
|
if (min_diff > diff) {
|
||||||
min_diff = diff;
|
min_diff = diff;
|
||||||
openair0_cfg->rx_gain_offset[chain_index] = calib_table[i].offset;
|
openair0_cfg->rx_gain_offset[chain_index] = openair0_cfg->rx_gain_calib_table[i].offset;
|
||||||
}
|
}
|
||||||
i++;
|
i++;
|
||||||
}
|
}
|
||||||
@@ -372,9 +396,43 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_
|
|||||||
// lock mboard clocks
|
// lock mboard clocks
|
||||||
s->usrp->set_clock_source("internal");
|
s->usrp->set_clock_source("internal");
|
||||||
|
|
||||||
|
//Setting device type to USRP X300/X310
|
||||||
|
device->type=USRP_X300_IF;
|
||||||
|
|
||||||
// this is not working yet, master clock has to be set via constructor
|
// this is not working yet, master clock has to be set via constructor
|
||||||
// set master clock rate and sample rate for tx & rx for streaming
|
// set master clock rate and sample rate for tx & rx for streaming
|
||||||
//s->usrp->set_master_clock_rate(usrp_master_clock);
|
//s->usrp->set_master_clock_rate(usrp_master_clock);
|
||||||
|
|
||||||
|
openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
|
||||||
|
|
||||||
|
switch ((int)openair0_cfg[0].sample_rate) {
|
||||||
|
case 30720000:
|
||||||
|
// from usrp_time_offset
|
||||||
|
openair0_cfg[0].samples_per_packet = 2048;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 15;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
case 15360000:
|
||||||
|
openair0_cfg[0].samples_per_packet = 2048;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 45;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
case 7680000:
|
||||||
|
openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 50;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
case 1920000:
|
||||||
|
openair0_cfg[0].samples_per_packet = 256;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 50;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
} else {
|
} else {
|
||||||
printf("Found USRP B200");
|
printf("Found USRP B200");
|
||||||
s->usrp = uhd::usrp::multi_usrp::make(args);
|
s->usrp = uhd::usrp::multi_usrp::make(args);
|
||||||
@@ -386,10 +444,42 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_
|
|||||||
// // lock mboard clocks
|
// // lock mboard clocks
|
||||||
// s->usrp->set_clock_source("internal");
|
// s->usrp->set_clock_source("internal");
|
||||||
// set master clock rate and sample rate for tx & rx for streaming
|
// set master clock rate and sample rate for tx & rx for streaming
|
||||||
|
|
||||||
|
device->type = USRP_B200_IF;
|
||||||
s->usrp->set_master_clock_rate(30.72e6);
|
s->usrp->set_master_clock_rate(30.72e6);
|
||||||
|
|
||||||
|
openair0_cfg[0].rx_gain_calib_table = calib_table_b210;
|
||||||
|
|
||||||
|
switch ((int)openair0_cfg[0].sample_rate) {
|
||||||
|
case 30720000:
|
||||||
|
// from usrp_time_offset
|
||||||
|
openair0_cfg[0].samples_per_packet = 2048;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 115;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 11*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
case 15360000:
|
||||||
|
openair0_cfg[0].samples_per_packet = 2048;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 113;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
case 7680000:
|
||||||
|
openair0_cfg[0].samples_per_packet = 1024;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 103;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 5*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
case 1920000:
|
||||||
|
openair0_cfg[0].samples_per_packet = 256;
|
||||||
|
openair0_cfg[0].tx_sample_advance = 40;
|
||||||
|
openair0_cfg[0].tx_scheduling_advance = 8*openair0_cfg[0].samples_per_packet;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printf("Error: unknown sampling rate %f\n",openair0_cfg[0].sample_rate);
|
||||||
|
exit(-1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for(i=0;i<s->usrp->get_rx_num_channels();i++) {
|
for(i=0;i<s->usrp->get_rx_num_channels();i++) {
|
||||||
if (i<openair0_cfg[0].rx_num_channels) {
|
if (i<openair0_cfg[0].rx_num_channels) {
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ eNBs =
|
|||||||
nb_antennas_tx = 1;
|
nb_antennas_tx = 1;
|
||||||
nb_antennas_rx = 1;
|
nb_antennas_rx = 1;
|
||||||
tx_gain = 32;
|
tx_gain = 32;
|
||||||
rx_gain = 84;
|
rx_gain = 116;
|
||||||
prach_root = 0;
|
prach_root = 0;
|
||||||
prach_config_index = 0;
|
prach_config_index = 0;
|
||||||
prach_high_speed = "DISABLE";
|
prach_high_speed = "DISABLE";
|
||||||
|
|||||||
@@ -0,0 +1,169 @@
|
|||||||
|
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 = "92";
|
||||||
|
|
||||||
|
////////// Physical parameters:
|
||||||
|
|
||||||
|
component_carriers = (
|
||||||
|
{
|
||||||
|
frame_type = "FDD";
|
||||||
|
tdd_config = 3;
|
||||||
|
tdd_config_s = 0;
|
||||||
|
prefix_type = "NORMAL";
|
||||||
|
eutra_band = 7;
|
||||||
|
downlink_frequency = 2660000000L;
|
||||||
|
uplink_frequency_offset = -120000000;
|
||||||
|
Nid_cell = 0;
|
||||||
|
N_RB_DL = 25;
|
||||||
|
Nid_cell_mbsfn = 0;
|
||||||
|
nb_antennas_tx = 1;
|
||||||
|
nb_antennas_rx = 1;
|
||||||
|
tx_gain = 32;
|
||||||
|
rx_gain = 116;
|
||||||
|
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 = -16;
|
||||||
|
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 = -90;
|
||||||
|
pusch_alpha = "AL1";
|
||||||
|
pucch_p0_Nominal = -108;
|
||||||
|
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 = -108;
|
||||||
|
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;
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
|
||||||
|
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.26";
|
||||||
|
ipv6 = "192:168:30::17";
|
||||||
|
active = "yes";
|
||||||
|
preference = "ipv4";
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
|
NETWORK_INTERFACES :
|
||||||
|
{
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.111/24";
|
||||||
|
|
||||||
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
|
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.111/24";
|
||||||
|
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||||
|
};
|
||||||
|
|
||||||
|
log_config :
|
||||||
|
{
|
||||||
|
global_log_level ="debug";
|
||||||
|
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";
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
);
|
||||||
@@ -35,7 +35,7 @@ eNBs =
|
|||||||
nb_antennas_tx = 1;
|
nb_antennas_tx = 1;
|
||||||
nb_antennas_rx = 1;
|
nb_antennas_rx = 1;
|
||||||
tx_gain = 32;
|
tx_gain = 32;
|
||||||
rx_gain = 82;
|
rx_gain = 120;
|
||||||
prach_root = 0;
|
prach_root = 0;
|
||||||
prach_config_index = 0;
|
prach_config_index = 0;
|
||||||
prach_high_speed = "DISABLE";
|
prach_high_speed = "DISABLE";
|
||||||
|
|||||||
@@ -16,7 +16,7 @@ eNBs =
|
|||||||
tracking_area_code = "1";
|
tracking_area_code = "1";
|
||||||
|
|
||||||
mobile_country_code = "208";
|
mobile_country_code = "208";
|
||||||
mobile_network_code = "95";
|
mobile_network_code = "92";
|
||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
@@ -30,12 +30,12 @@ eNBs =
|
|||||||
downlink_frequency = 2660000000L;
|
downlink_frequency = 2660000000L;
|
||||||
uplink_frequency_offset = -120000000;
|
uplink_frequency_offset = -120000000;
|
||||||
Nid_cell = 0;
|
Nid_cell = 0;
|
||||||
N_RB_DL = 25;
|
N_RB_DL = 100;
|
||||||
Nid_cell_mbsfn = 0;
|
Nid_cell_mbsfn = 0;
|
||||||
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 = 119;
|
||||||
prach_root = 0;
|
prach_root = 0;
|
||||||
prach_config_index = 0;
|
prach_config_index = 0;
|
||||||
prach_high_speed = "DISABLE";
|
prach_high_speed = "DISABLE";
|
||||||
@@ -130,12 +130,10 @@ eNBs =
|
|||||||
};
|
};
|
||||||
|
|
||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.12.62";
|
mme_ip_address = ( {ipv4 = "192.168.12.26";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6="192:168:30::17";
|
||||||
active = "yes";
|
active="yes";
|
||||||
preference = "ipv4";
|
preference="ipv4";});
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -35,7 +35,7 @@ eNBs =
|
|||||||
nb_antennas_tx = 1;
|
nb_antennas_tx = 1;
|
||||||
nb_antennas_rx = 1;
|
nb_antennas_rx = 1;
|
||||||
tx_gain = 32;
|
tx_gain = 32;
|
||||||
rx_gain = 84;
|
rx_gain = 116;
|
||||||
prach_root = 0;
|
prach_root = 0;
|
||||||
prach_config_index = 0;
|
prach_config_index = 0;
|
||||||
prach_high_speed = "DISABLE";
|
prach_high_speed = "DISABLE";
|
||||||
|
|||||||
@@ -172,7 +172,7 @@ void config_BBU_mod( rrh_module_t *mod_enb, uint8_t RT_flag, uint8_t NRT_flag) {
|
|||||||
mod_enb->devs->openair0_cfg.tx_delay = 8;
|
mod_enb->devs->openair0_cfg.tx_delay = 8;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (mod_enb->devs->type == USRP_IF) {
|
else if ((mod_enb->devs->type == USRP_B200_IF )||(mod_enb->devs->type == USRP_X300_IF )) {
|
||||||
if ( mod_enb->devs->openair0_cfg.num_rb_dl == 100 ) {
|
if ( mod_enb->devs->openair0_cfg.num_rb_dl == 100 ) {
|
||||||
mod_enb->devs->openair0_cfg.samples_per_packet = 2048;
|
mod_enb->devs->openair0_cfg.samples_per_packet = 2048;
|
||||||
mod_enb->devs->openair0_cfg.tx_forward_nsamps = 175;
|
mod_enb->devs->openair0_cfg.tx_forward_nsamps = 175;
|
||||||
|
|||||||
@@ -293,10 +293,6 @@ static int tx_max_power[MAX_NUM_CCs]; /* = {0,0}*/;
|
|||||||
char ref[128] = "internal";
|
char ref[128] = "internal";
|
||||||
char channels[128] = "0";
|
char channels[128] = "0";
|
||||||
|
|
||||||
//unsigned int samples_per_frame = 307200;
|
|
||||||
//unsigned int tx_forward_nsamps=0;
|
|
||||||
//int tx_delay;
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int rx_input_level_dBm;
|
int rx_input_level_dBm;
|
||||||
@@ -1559,7 +1555,7 @@ static void* eNB_thread( void* arg )
|
|||||||
int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9
|
int hw_subframe = 0; // 0..NUM_ENB_THREADS-1 => 0..9
|
||||||
|
|
||||||
unsigned int rx_pos = 0;
|
unsigned int rx_pos = 0;
|
||||||
unsigned int tx_pos = 0; //spp*tx_delay;
|
unsigned int tx_pos = 0;
|
||||||
#endif
|
#endif
|
||||||
int CC_id=0;
|
int CC_id=0;
|
||||||
struct timespec trx_time0, trx_time1, trx_time2;
|
struct timespec trx_time0, trx_time1, trx_time2;
|
||||||
@@ -1634,8 +1630,8 @@ static void* eNB_thread( void* arg )
|
|||||||
int frame = 0;
|
int frame = 0;
|
||||||
|
|
||||||
#ifndef EXMIMO
|
#ifndef EXMIMO
|
||||||
spp = openair0_cfg[0].samples_per_packet;
|
spp = openair0_cfg[0].samples_per_packet;
|
||||||
tx_pos=spp*openair0_cfg[0].tx_delay;
|
tx_pos = openair0_cfg[0].tx_scheduling_advance;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
@@ -1796,11 +1792,10 @@ static void* eNB_thread( void* arg )
|
|||||||
// prepare tx buffer pointers
|
// prepare tx buffer pointers
|
||||||
for (i=0; i<PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx; i++)
|
for (i=0; i<PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx; i++)
|
||||||
txp[i] = (void*)&txdata[i][tx_pos];
|
txp[i] = (void*)&txdata[i][tx_pos];
|
||||||
//printf("tx_pos %d ts %d, ts_offset %d txp[i] %p, ap %d\n", tx_pos, timestamp, (timestamp+(tx_delay*spp)-tx_forward_nsamps),txp[i], i);
|
|
||||||
// if symb_written < spp ==> error
|
// if symb_written < spp ==> error
|
||||||
if (frame > 50) {
|
if (frame > 50) {
|
||||||
openair0.trx_write_func(&openair0,
|
openair0.trx_write_func(&openair0,
|
||||||
(timestamp+(openair0_cfg[card].tx_delay*spp)-openair0_cfg[card].tx_forward_nsamps),
|
(timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance),
|
||||||
txp,
|
txp,
|
||||||
spp,
|
spp,
|
||||||
PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx,
|
PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx,
|
||||||
@@ -1808,7 +1803,7 @@ static void* eNB_thread( void* arg )
|
|||||||
}
|
}
|
||||||
|
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TS, timestamp&0xffffffff );
|
||||||
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_delay*spp)-openair0_cfg[card].tx_forward_nsamps)&0xffffffff );
|
VCD_SIGNAL_DUMPER_DUMP_VARIABLE_BY_NAME( VCD_SIGNAL_DUMPER_VARIABLES_TRX_TST, (timestamp+(openair0_cfg[card].tx_scheduling_advance)-openair0_cfg[card].tx_sample_advance)&0xffffffff );
|
||||||
|
|
||||||
stop_meas( &softmodem_stats_mt );
|
stop_meas( &softmodem_stats_mt );
|
||||||
clock_gettime( CLOCK_MONOTONIC, &trx_time2 );
|
clock_gettime( CLOCK_MONOTONIC, &trx_time2 );
|
||||||
@@ -2847,66 +2842,33 @@ int main( int argc, char **argv )
|
|||||||
for (card=0; card<MAX_CARDS; card++) {
|
for (card=0; card<MAX_CARDS; card++) {
|
||||||
|
|
||||||
if(frame_parms[0]->N_RB_DL == 100) {
|
if(frame_parms[0]->N_RB_DL == 100) {
|
||||||
sample_rate = 30.72e6;
|
|
||||||
bw = 10.0e6;
|
|
||||||
#ifndef EXMIMO
|
|
||||||
openair0_cfg[card].sample_rate=30.72e6;
|
openair0_cfg[card].sample_rate=30.72e6;
|
||||||
openair0_cfg[card].samples_per_packet = 2048;
|
|
||||||
openair0_cfg[card].samples_per_frame = 307200;
|
openair0_cfg[card].samples_per_frame = 307200;
|
||||||
openair0_cfg[card].tx_bw = 10e6;
|
openair0_cfg[card].tx_bw = 10e6;
|
||||||
openair0_cfg[card].rx_bw = 10e6;
|
openair0_cfg[card].rx_bw = 10e6;
|
||||||
// from usrp_time_offset
|
|
||||||
openair0_cfg[card].tx_forward_nsamps = 175;
|
|
||||||
openair0_cfg[card].tx_delay = 8;
|
|
||||||
#endif
|
|
||||||
} else if(frame_parms[0]->N_RB_DL == 50) {
|
} else if(frame_parms[0]->N_RB_DL == 50) {
|
||||||
sample_rate = 15.36e6;
|
|
||||||
bw = 5.0e6;
|
|
||||||
#ifndef EXMIMO
|
|
||||||
openair0_cfg[card].sample_rate=15.36e6;
|
openair0_cfg[card].sample_rate=15.36e6;
|
||||||
openair0_cfg[card].samples_per_packet = 2048;
|
|
||||||
openair0_cfg[card].samples_per_frame = 153600;
|
openair0_cfg[card].samples_per_frame = 153600;
|
||||||
openair0_cfg[card].tx_bw = 5e6;
|
openair0_cfg[card].tx_bw = 5e6;
|
||||||
openair0_cfg[card].rx_bw = 5e6;
|
openair0_cfg[card].rx_bw = 5e6;
|
||||||
openair0_cfg[card].tx_forward_nsamps = 95;
|
|
||||||
openair0_cfg[card].tx_delay = 5;
|
|
||||||
#endif
|
|
||||||
} else if (frame_parms[0]->N_RB_DL == 25) {
|
} else if (frame_parms[0]->N_RB_DL == 25) {
|
||||||
sample_rate = 7.68e6;
|
|
||||||
bw = 2.5e6;
|
|
||||||
#ifndef EXMIMO
|
|
||||||
openair0_cfg[card].sample_rate=7.68e6;
|
openair0_cfg[card].sample_rate=7.68e6;
|
||||||
openair0_cfg[card].samples_per_frame = 76800;
|
openair0_cfg[card].samples_per_frame = 76800;
|
||||||
openair0_cfg[card].tx_bw = 2.5e6;
|
openair0_cfg[card].tx_bw = 2.5e6;
|
||||||
openair0_cfg[card].rx_bw = 2.5e6;
|
openair0_cfg[card].rx_bw = 2.5e6;
|
||||||
openair0_cfg[card].samples_per_packet = 1024;
|
|
||||||
#ifdef OAI_USRP
|
|
||||||
openair0_cfg[card].tx_forward_nsamps = 70;
|
|
||||||
openair0_cfg[card].tx_delay = 5;
|
|
||||||
#elif OAI_BLADERF
|
|
||||||
openair0_cfg[card].tx_forward_nsamps = 0;
|
|
||||||
openair0_cfg[card].tx_delay = 8;
|
|
||||||
#endif
|
|
||||||
#endif
|
|
||||||
} else if (frame_parms[0]->N_RB_DL == 6) {
|
} else if (frame_parms[0]->N_RB_DL == 6) {
|
||||||
sample_rate = 1.92e6;
|
|
||||||
bw = 0.96e6;
|
|
||||||
#ifndef EXMIMO
|
|
||||||
openair0_cfg[card].sample_rate=1.92e6;
|
openair0_cfg[card].sample_rate=1.92e6;
|
||||||
openair0_cfg[card].samples_per_packet = 256;
|
|
||||||
openair0_cfg[card].samples_per_frame = 19200;
|
openair0_cfg[card].samples_per_frame = 19200;
|
||||||
openair0_cfg[card].tx_bw = 1.5e6;
|
openair0_cfg[card].tx_bw = 1.5e6;
|
||||||
openair0_cfg[card].rx_bw = 1.5e6;
|
openair0_cfg[card].rx_bw = 1.5e6;
|
||||||
openair0_cfg[card].tx_forward_nsamps = 40;
|
|
||||||
openair0_cfg[card].tx_delay = 8;
|
|
||||||
#endif
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ETHERNET
|
#ifdef ETHERNET
|
||||||
|
|
||||||
//calib needed
|
//calib needed
|
||||||
openair0_cfg[card].tx_delay = 0;
|
openair0_cfg[card].tx_scheduling_advance = 0;
|
||||||
openair0_cfg[card].tx_forward_nsamps = 0;
|
openair0_cfg[card].tx_sample_advance = 0;
|
||||||
|
|
||||||
if (frame_parms[0]->N_RB_DL == 6)
|
if (frame_parms[0]->N_RB_DL == 6)
|
||||||
openair0_cfg[card].samples_per_packet = 256;
|
openair0_cfg[card].samples_per_packet = 256;
|
||||||
@@ -2917,9 +2879,6 @@ int main( int argc, char **argv )
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
#ifndef EXMIMO
|
|
||||||
openair0_cfg[card].samples_per_packet = openair0_cfg[0].samples_per_packet;
|
|
||||||
#endif
|
|
||||||
printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
|
printf("HW: Configuring card %d, nb_antennas_tx/rx %d/%d\n",card,
|
||||||
((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx),
|
((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_tx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_tx),
|
||||||
((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx));
|
((UE_flag==0) ? PHY_vars_eNB_g[0][0]->lte_frame_parms.nb_antennas_rx : PHY_vars_UE_g[0][0]->lte_frame_parms.nb_antennas_rx));
|
||||||
@@ -2935,11 +2894,9 @@ int main( int argc, char **argv )
|
|||||||
openair0_cfg[card].remote_ip = &rrh_eNB_ip[0];
|
openair0_cfg[card].remote_ip = &rrh_eNB_ip[0];
|
||||||
openair0_cfg[card].remote_port = rrh_eNB_port;
|
openair0_cfg[card].remote_port = rrh_eNB_port;
|
||||||
}
|
}
|
||||||
openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
|
openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
|
||||||
#endif
|
#endif
|
||||||
openair0_cfg[card].sample_rate = sample_rate;
|
|
||||||
openair0_cfg[card].tx_bw = bw;
|
|
||||||
openair0_cfg[card].rx_bw = bw;
|
|
||||||
// in the case of the USRP, the following variables need to be initialized before the init
|
// in the case of the USRP, the following variables need to be initialized before the init
|
||||||
// since the USRP only supports one CC (for the moment), we initialize all the cards with first CC.
|
// since the USRP only supports one CC (for the moment), we initialize all the cards with first CC.
|
||||||
// in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer
|
// in the case of EXMIMO2, these values are overwirtten in the function setup_eNB/UE_buffer
|
||||||
@@ -2965,24 +2922,28 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
|
|||||||
else {
|
else {
|
||||||
openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB;// - USRP_GAIN_OFFSET; // calibrated for USRP B210 @ 2.6 GHz, 30.72 MS/s
|
openair0_cfg[card].rx_gain[i] = PHY_vars_UE_g[0][0]->rx_total_gain_dB;// - USRP_GAIN_OFFSET; // calibrated for USRP B210 @ 2.6 GHz, 30.72 MS/s
|
||||||
}
|
}
|
||||||
|
|
||||||
switch(frame_parms[0]->N_RB_DL) {
|
switch(frame_parms[0]->N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
openair0_cfg[card].rx_gain[i] -= 6;
|
openair0_cfg[card].rx_gain[i] -= 12;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 25:
|
case 25:
|
||||||
openair0_cfg[card].rx_gain[i] += 6;
|
openair0_cfg[card].rx_gain[i] -= 6;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case 50:
|
case 50:
|
||||||
openair0_cfg[card].rx_gain[i] += 8;
|
openair0_cfg[card].rx_gain[i] -= 3;
|
||||||
|
break;
|
||||||
|
|
||||||
|
case 100:
|
||||||
|
openair0_cfg[card].rx_gain[i] -= 0;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -3070,7 +3031,7 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL;
|
|||||||
// connect the TX/RX buffers
|
// connect the TX/RX buffers
|
||||||
if (UE_flag==1) {
|
if (UE_flag==1) {
|
||||||
#ifdef OAI_USRP
|
#ifdef OAI_USRP
|
||||||
openair_daq_vars.timing_advance = 160;
|
openair_daq_vars.timing_advance = 0;
|
||||||
#else
|
#else
|
||||||
openair_daq_vars.timing_advance = 160;
|
openair_daq_vars.timing_advance = 160;
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -410,6 +410,7 @@ static void *UE_thread_synch(void *arg)
|
|||||||
UE->UE_scan_carrier = 0;
|
UE->UE_scan_carrier = 0;
|
||||||
// rerun with new cell parameters and frequency-offset
|
// rerun with new cell parameters and frequency-offset
|
||||||
for (i=0;i<openair0_cfg[0].rx_num_channels;i++) {
|
for (i=0;i<openair0_cfg[0].rx_num_channels;i++) {
|
||||||
|
openair0_cfg[0].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
|
||||||
openair0_cfg[0].rx_freq[i] -= UE->lte_ue_common_vars.freq_offset;
|
openair0_cfg[0].rx_freq[i] -= UE->lte_ue_common_vars.freq_offset;
|
||||||
openair0_cfg[0].tx_freq[i] = openair0_cfg[0].rx_freq[i]+uplink_frequency_offset[0][i];
|
openair0_cfg[0].tx_freq[i] = openair0_cfg[0].rx_freq[i]+uplink_frequency_offset[0][i];
|
||||||
downlink_frequency[0][i] = openair0_cfg[0].rx_freq[i];
|
downlink_frequency[0][i] = openair0_cfg[0].rx_freq[i];
|
||||||
@@ -1002,7 +1003,7 @@ void *UE_thread(void *arg)
|
|||||||
static int UE_thread_retval;
|
static int UE_thread_retval;
|
||||||
PHY_VARS_UE *UE = PHY_vars_UE_g[0][0];
|
PHY_VARS_UE *UE = PHY_vars_UE_g[0][0];
|
||||||
int spp = openair0_cfg[0].samples_per_packet;
|
int spp = openair0_cfg[0].samples_per_packet;
|
||||||
int slot=1, frame=0, hw_subframe=0, rxpos=0, txpos=spp*openair0_cfg[0].tx_delay;
|
int slot=1, frame=0, hw_subframe=0, rxpos=0, txpos=spp*openair0_cfg[0].tx_scheduling_advance;
|
||||||
#ifdef __AVX2__
|
#ifdef __AVX2__
|
||||||
int dummy[2][spp] __attribute__((aligned(32)));
|
int dummy[2][spp] __attribute__((aligned(32)));
|
||||||
#else
|
#else
|
||||||
@@ -1127,7 +1128,7 @@ void *UE_thread(void *arg)
|
|||||||
txp[i] = (void*)&txdata[i][txpos];
|
txp[i] = (void*)&txdata[i][txpos];
|
||||||
|
|
||||||
openair0.trx_write_func(&openair0,
|
openair0.trx_write_func(&openair0,
|
||||||
(timestamp+spp*openair0_cfg[0].tx_delay-openair0_cfg[0].tx_forward_nsamps),
|
(timestamp+openair0_cfg[0].tx_scheduling_advance-openair0_cfg[0].tx_sample_advance),
|
||||||
txp,
|
txp,
|
||||||
spp - ((first_rx==1) ? rx_off_diff : 0),
|
spp - ((first_rx==1) ? rx_off_diff : 0),
|
||||||
UE->lte_frame_parms.nb_antennas_tx,
|
UE->lte_frame_parms.nb_antennas_tx,
|
||||||
|
|||||||
@@ -216,7 +216,7 @@ static rrh_module_t new_module (unsigned int id) {
|
|||||||
LOG_I(RRH,"Setting RF device to EXMIMO\n");
|
LOG_I(RRH,"Setting RF device to EXMIMO\n");
|
||||||
#elif OAI_USRP
|
#elif OAI_USRP
|
||||||
rrh_mod.devs=oai_dv;
|
rrh_mod.devs=oai_dv;
|
||||||
rrh_mod.devs->type=USRP_IF;
|
rrh_mod.devs->type=USRP_B200_IF;
|
||||||
LOG_I(RRH,"Setting RF device to USRP\n");
|
LOG_I(RRH,"Setting RF device to USRP\n");
|
||||||
#elif OAI_BLADERF
|
#elif OAI_BLADERF
|
||||||
rrh_mod.devs=oai_dv;
|
rrh_mod.devs=oai_dv;
|
||||||
|
|||||||
@@ -51,7 +51,7 @@
|
|||||||
|
|
||||||
/*! \brief RRH supports two types of modules: eNB and UE
|
/*! \brief RRH supports two types of modules: eNB and UE
|
||||||
each module is associated with an ethernet device (device of ETH_IF)
|
each module is associated with an ethernet device (device of ETH_IF)
|
||||||
and optionally with a RF device (device type can be USRP_IF/BLADERF_IF/EXMIMO_IF/NONE_IF)
|
and optionally with a RF device (device type can be USRP_B200/USRP_X300/BLADERF_IF/EXMIMO_IF/NONE_IF)
|
||||||
UE modules will always have RF device type NONE_IF */
|
UE modules will always have RF device type NONE_IF */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
/*! \brief module id */
|
/*! \brief module id */
|
||||||
|
|||||||
Reference in New Issue
Block a user