Commit 01913855 authored by ivan's avatar ivan

dual-USRP testing (intermediate commit to switch machines

parent 25922810
......@@ -718,15 +718,19 @@ int init_lte_ue_signal(PHY_VARS_UE *ue,
}
// init RX buffers
int nb_rx = (ue->sidelink_active == 1 && ue->SLonly == 0) ? 2*fp->nb_antennas_rx : fp->nb_antennas_rx;
common_vars->rxdata = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
common_vars->common_vars_rx_data_per_thread[0].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
common_vars->common_vars_rx_data_per_thread[1].rxdataF = (int32_t**)malloc16( fp->nb_antennas_rx*sizeof(int32_t*) );
if (ue->sidelink_active == 1) common_vars->rxdata_syncSL = (int16_t**)malloc16( fp->nb_antennas_rx*sizeof(int16_t*) );
for (i=0; i<fp->nb_antennas_rx; i++) {
for (i=0; i<nb_rx; i++) {
common_vars->rxdata[i] = (int32_t*) malloc16_clear( (fp->samples_per_tti*10+2048)*sizeof(int32_t) );
LOG_I(PHY,"common_vars->rxdata[%d] %p\n",i,common_vars->rxdata[i]);
}
for (i=0; i<fp->nb_antennas_rx; i++) {
common_vars->common_vars_rx_data_per_thread[0].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
common_vars->common_vars_rx_data_per_thread[1].rxdataF[i] = (int32_t*)malloc16_clear( sizeof(int32_t)*(fp->ofdm_symbol_size*14) );
......
......@@ -288,6 +288,9 @@ struct openair0_device_t {
/*!brief Can be used by driver to hold internal structure*/
void *priv;
/*!brief Can be used by driver to hold second internal structure*/
void *priv2;
/* Functions API, which are called by the application*/
/*! \brief Called to start the transceiver. Return 0 if OK, < 0 if error
......
......@@ -103,6 +103,7 @@ typedef struct {
int64_t rx_count;
int wait_for_first_pps;
int use_gps;
int external_time_source;
//! timestamp of RX packet
openair0_timestamp rx_timestamp;
......@@ -304,7 +305,8 @@ static int trx_usrp_start(openair0_device *device) {
if (u_sf_mode != 2) { // not replay mode
#endif
usrp_state_t *s = (usrp_state_t *)device->priv;
usrp_state_t *s;
for (s= (usrp_state_t *)device->priv;s!=(usrp_state_t *)NULL;s=(usrp_state_t *)device->priv2) {
// setup GPIO for TDD, GPIO(4) = ATR_RX
//set data direction register (DDR) to output
s->usrp->set_gpio_attr("FP0", "DDR", 0x1f, 0x1f);
......@@ -314,10 +316,10 @@ static int trx_usrp_start(openair0_device *device) {
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);
LOG_I(PHY,"Time in secs now: %llu \n", s->usrp->get_time_now().to_ticks(s->sample_rate));
LOG_I(PHY,"Time in secs last pps: %llu \n", s->usrp->get_time_last_pps().to_ticks(s->sample_rate));
LOG_I(PHY,"USRP %p: Time in secs now: %llu \n", s,s->usrp->get_time_now().to_ticks(s->sample_rate));
LOG_I(PHY,"USRP %p: Time in secs last pps: %llu \n", s,s->usrp->get_time_last_pps().to_ticks(s->sample_rate));
if (s->use_gps == 1) {
if (s->use_gps == 1 || s->external_time_source == 1) {
s->wait_for_first_pps = 1;
cmd.time_spec = s->usrp->get_time_last_pps() + uhd::time_spec_t(1.0);
} else {
......@@ -325,6 +327,8 @@ static int trx_usrp_start(openair0_device *device) {
cmd.time_spec = s->usrp->get_time_now() + uhd::time_spec_t(0.05);
}
LOG_I(PHY,"USRP %p: Time to wakeups: %llu \n", s,cmd.time_spec.to_ticks(s->sample_rate));
cmd.stream_now = false; // start at constant delay
s->rx_stream->issue_stream_cmd(cmd);
s->tx_md.time_spec = cmd.time_spec + uhd::time_spec_t(1-(double)s->tx_forward_nsamps/s->sample_rate);
......@@ -334,9 +338,10 @@ static int trx_usrp_start(openair0_device *device) {
s->rx_count = 0;
s->tx_count = 0;
s->rx_timestamp = 0;
if (s==(usrp_state_t *)device->priv2) break;
}
#if defined(USRP_REC_PLAY)
}
#endif
return 0;
}
......@@ -355,11 +360,14 @@ static void trx_usrp_end(openair0_device *device) {
if (u_sf_mode != 2) { // not subframes replay
#endif
usrp_state_t *s = (usrp_state_t *)device->priv;
for (s= (usrp_state_t *)device->priv;s!=(usrp_state_t *)NULL;s=(usrp_state_t *)device->priv2) {
s->rx_stream->issue_stream_cmd(uhd::stream_cmd_t::STREAM_MODE_STOP_CONTINUOUS);
//send a mini EOB packet
s->tx_md.end_of_burst = true;
s->tx_stream->send("", 0, s->tx_md);
s->tx_md.end_of_burst = false;
if (s==(usrp_state_t *)device->priv2) break;
}
sleep(1);
#if defined(USRP_REC_PLAY)
}
......@@ -541,6 +549,8 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
usrp_state_t *s = (usrp_state_t *)device->priv;
int samples_received=0,i,j;
int nsamps2; // aligned to upper 32 or 16 byte boundary
int board=0;
int nboards = (device->priv2!=NULL) ? 2 : 1;
#if defined(USRP_REC_PLAY)
if (u_sf_mode != 2) { // not replay mode
......@@ -548,22 +558,23 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
#if defined(__x86_64) || defined(__i386__)
#ifdef __AVX2__
nsamps2 = (nsamps+7)>>3;
__m256i buff_tmp[2][nsamps2];
__m256i buff_tmp[cc*nboards][nsamps2];
#else
nsamps2 = (nsamps+3)>>2;
__m128i buff_tmp[2][nsamps2];
__m128i buff_tmp[cc*nboards][nsamps2];
#endif
#elif defined(__arm__)
nsamps2 = (nsamps+3)>>2;
int16x8_t buff_tmp[2][nsamps2];
int16x8_t buff_tmp[cc*nboards][nsamps2];
#endif
if (device->type == USRP_B200_DEV) {
for (s= (usrp_state_t *)device->priv,board=0;s!=(usrp_state_t *)NULL,board=1;s=(usrp_state_t *)device->priv2) {
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_tmp[i]);
for (int i=0; i<cc; i++) buff_ptrs.push_back(buff_tmp[i+(board*cc)]);
samples_received = s->rx_stream->recv(buff_ptrs, nsamps, s->rx_md);
} else {
......@@ -571,22 +582,25 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp
samples_received=0;
while (samples_received != nsamps) {
samples_received += s->rx_stream->recv(buff_tmp[0]+samples_received,
LOG_I(HW,"USRP %p: Receiving %d samples\n",s,nsamps);
samples_received += s->rx_stream->recv(buff_tmp[board]+samples_received,
nsamps-samples_received, s->rx_md);
LOG_I(HW,"USRP %p: Got %d samples @ %llu\n",s,samples_received,s->rx_md.time_spec.to_ticks(s->sample_rate));
if ((s->wait_for_first_pps == 0) && (s->rx_md.error_code!=uhd::rx_metadata_t::ERROR_CODE_NONE))
break;
/*
if ((s->wait_for_first_pps == 1) && (samples_received != nsamps)) {
printf("sleep...\n"); //usleep(100);
}
}*/
}
if (samples_received == nsamps) s->wait_for_first_pps=0;
}
if (s==(usrp_state_t *)device->priv2) break;
}
// bring RX data into 12 LSBs for softmodem RX
for (int i=0; i<cc; i++) {
for (int i=0; i<cc*nboards; i++) {
for (int j=0; j<nsamps2; j++) {
#if defined(__x86_64__) || defined(__i386__)
#ifdef __AVX2__
......@@ -740,16 +754,19 @@ void *freq_thread(void *arg) {
int trx_usrp_set_freq(openair0_device *device, openair0_config_t *openair0_cfg, int dont_block) {
usrp_state_t *s = (usrp_state_t *)device->priv;
pthread_t f_thread;
printf("Setting USRP TX Freq %f, RX Freq %f\n",openair0_cfg[0].tx_freq[0],openair0_cfg[0].rx_freq[0]);
// spawn a thread to handle the frequency change to not block the calling thread
if (dont_block == 1)
pthread_create(&f_thread,NULL,freq_thread,(void *)device);
else {
for (int i=0;i<device->openair0_cfg[0].tx_num_channels;i++)
for (int i=0;i<device->openair0_cfg[0].tx_num_channels;i++) {
LOG_I(HW,"Setting USRP TX%d Freq %f\n",i,openair0_cfg[0].tx_freq[i]);
s->usrp->set_tx_freq(device->openair0_cfg[0].tx_freq[i],i);
for (int i=0;i<device->openair0_cfg[0].rx_num_channels;i++)
}
for (int i=0;i<device->openair0_cfg[0].rx_num_channels;i++) {
s->usrp->set_rx_freq(device->openair0_cfg[0].rx_freq[i],i);
LOG_I(HW,"Setting USRP RX%d Freq %f\n",i,openair0_cfg[0].rx_freq[i]);
}
}
return(0);
......@@ -1052,6 +1069,7 @@ extern "C" {
#endif
uhd::set_thread_priority_safe(1.0);
usrp_state_t *s = (usrp_state_t *)calloc(sizeof(usrp_state_t),1);
usrp_state_t *s2;
if (openair0_cfg[0].clock_source==gpsdo)
s->use_gps =1;
......@@ -1102,6 +1120,7 @@ extern "C" {
if (device_adds[0].get("type") == "b200") {
device->type = USRP_B200_DEV;
usrp_master_clock = 30.72e6;
AssertFatal(device_adds.size()<3,"Number of B2x0 USRP must be 1 or 2\n");
args += boost::str(boost::format(",master_clock_rate=%f") % usrp_master_clock);
args += ",num_send_frames=256,num_recv_frames=256, send_frame_size=7680, recv_frame_size=7680" ;
}
......@@ -1121,15 +1140,31 @@ extern "C" {
}
s->usrp = uhd::usrp::multi_usrp::make(args);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) { //allow for second instance of UHD with B2x0
s2 = (usrp_state_t *)calloc(sizeof(usrp_state_t),1);
s2->usrp = uhd::usrp::multi_usrp::make(args);
}
// lock mboard clocks
if (openair0_cfg[0].clock_source == internal && device_adds.size() == 1)
if (openair0_cfg[0].clock_source == internal && device_adds.size() == 1) {
LOG_I(HW,"Setting clock source to internal\n");
s->usrp->set_clock_source("internal");
else // if we set to external or if we have more than 1 USRP
}
else {// if we set to external or if we have more than 1 USRP
s->usrp->set_clock_source("external");
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_clock_source("internal");
LOG_I(HW,"Setting clock source to external\n");
}
// if we have more than 1 USRP require PPS source
if (device_adds.size()>1) s->usrp->set_time_source("external");
if (device_adds.size()>1) {
s->usrp->set_time_source("external");
s->external_time_source = 1;
if (device->type == USRP_B200_DEV) {
s2->usrp->set_time_source("external");
s2->external_time_source = 1;
}
LOG_I(HW,"Setting timing source to external\n");
}
else s->external_time_source = 0;
if (device->type==USRP_X300_DEV) {
openair0_cfg[0].rx_gain_calib_table = calib_table_x310;
......@@ -1209,6 +1244,7 @@ extern "C" {
switch ((int)openair0_cfg[0].sample_rate) {
case 30720000:
s->usrp->set_master_clock_rate(30.72e6);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s->usrp->set_master_clock_rate(30.72e6);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg[0].tx_sample_advance = 115;
openair0_cfg[0].tx_bw = 20e6;
......@@ -1217,6 +1253,7 @@ extern "C" {
case 23040000:
s->usrp->set_master_clock_rate(23.04e6); //to be checked
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_master_clock_rate(23.04e6);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg[0].tx_sample_advance = 113;
openair0_cfg[0].tx_bw = 20e6;
......@@ -1225,6 +1262,7 @@ extern "C" {
case 15360000:
s->usrp->set_master_clock_rate(30.72e06);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_master_clock_rate(30.72e6);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg[0].tx_sample_advance = 103;
openair0_cfg[0].tx_bw = 20e6;
......@@ -1233,6 +1271,7 @@ extern "C" {
case 7680000:
s->usrp->set_master_clock_rate(30.72e6);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_master_clock_rate(30.72e6);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg[0].tx_sample_advance = 80;
openair0_cfg[0].tx_bw = 20e6;
......@@ -1241,6 +1280,7 @@ extern "C" {
case 1920000:
s->usrp->set_master_clock_rate(30.72e6);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_master_clock_rate(30.72e6);
//openair0_cfg[0].samples_per_packet = 1024;
openair0_cfg[0].tx_sample_advance = 40;
openair0_cfg[0].tx_bw = 20e6;
......@@ -1264,6 +1304,10 @@ extern "C" {
if (i<openair0_cfg[0].rx_num_channels) {
s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) {
s->usrp->set_rx_rate(openair0_cfg[0].sample_rate,i);
s->usrp->set_rx_freq(openair0_cfg[0].rx_freq[i],i);
}
set_rx_gain_offset(&openair0_cfg[0],i,bw_gain_adjust);
::uhd::gain_range_t gain_range = s->usrp->get_rx_gain_range(i);
// limit to maximum gain
......@@ -1271,6 +1315,9 @@ extern "C" {
"RX Gain too high, lower by %f dB\n",
openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i] - gain_range.stop());
s->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) {
s2->usrp->set_rx_gain(openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],i);
}
LOG_I(PHY,"RX Gain %d %f (%f) => %f (max %f)\n",i,
openair0_cfg[0].rx_gain[i],openair0_cfg[0].rx_gain_offset[i],
openair0_cfg[0].rx_gain[i]-openair0_cfg[0].rx_gain_offset[i],gain_range.stop());
......@@ -1287,12 +1334,15 @@ extern "C" {
s->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
s->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
s->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) {
s2->usrp->set_tx_rate(openair0_cfg[0].sample_rate,i);
s2->usrp->set_tx_freq(openair0_cfg[0].tx_freq[i],i);
s2->usrp->set_tx_gain(gain_range_tx.stop()-openair0_cfg[0].tx_gain[i],i);
}
LOG_I(PHY,"USRP TX_GAIN:%3.2lf gain_range:%3.2lf tx_gain:%3.2lf\n", gain_range_tx.stop()-openair0_cfg[0].tx_gain[i], gain_range_tx.stop(), openair0_cfg[0].tx_gain[i]);
}
}
//s->usrp->set_clock_source("external");
//s->usrp->set_time_source("external");
// display USRP settings
LOG_I(PHY,"Actual master clock: %fMHz...\n",s->usrp->get_master_clock_rate()/1e6);
sleep(1);
......@@ -1314,19 +1364,24 @@ extern "C" {
stream_args_rx.channels.push_back(i);
s->rx_stream = s->usrp->get_rx_stream(stream_args_rx);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->rx_stream = s->usrp->get_rx_stream(stream_args_rx);
uhd::stream_args_t stream_args_tx("sc16", "sc16");
for (int i = 0; i<openair0_cfg[0].tx_num_channels; i++)
stream_args_tx.channels.push_back(i);
s->tx_stream = s->usrp->get_tx_stream(stream_args_tx);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->tx_stream = s->usrp->get_tx_stream(stream_args_tx);
/* Setting TX/RX BW after streamers are created due to USRP calibration issue */
for(int i=0; i<s->usrp->get_tx_num_channels() && i<openair0_cfg[0].tx_num_channels; i++)
for(int i=0; i<s->usrp->get_tx_num_channels() && i<openair0_cfg[0].tx_num_channels; i++) {
s->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_tx_bandwidth(openair0_cfg[0].tx_bw,i);
}
for(int i=0; i<s->usrp->get_rx_num_channels() && i<openair0_cfg[0].rx_num_channels; i++)
for(int i=0; i<s->usrp->get_rx_num_channels() && i<openair0_cfg[0].rx_num_channels; i++) {
s->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->usrp->set_rx_bandwidth(openair0_cfg[0].rx_bw,i);
}
for (int i=0; i<openair0_cfg[0].rx_num_channels; i++) {
LOG_I(PHY,"RX Channel %d\n",i);
......@@ -1348,6 +1403,8 @@ extern "C" {
LOG_I(PHY,"Device timestamp: %f...\n", s->usrp->get_time_now().get_real_secs());
device->priv = s;
if (device_adds.size()==2 && device->type == USRP_B200_DEV) device->priv2 = s2;
else device->priv2 = NULL;
device->trx_start_func = trx_usrp_start;
device->trx_write_func = trx_usrp_write;
device->trx_read_func = trx_usrp_read;
......@@ -1359,18 +1416,23 @@ extern "C" {
device->trx_set_gains_func = trx_usrp_set_gains;
device->openair0_cfg = openair0_cfg;
s->sample_rate = openair0_cfg[0].sample_rate;
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->sample_rate = openair0_cfg[0].sample_rate;
// TODO:
// init tx_forward_nsamps based usrp_time_offset ex
if(is_equal(s->sample_rate, (double)30.72e6))
if(is_equal(s->sample_rate, (double)30.72e6)) {
s->tx_forward_nsamps = 176;
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->tx_forward_nsamps = 176;
}
if(is_equal(s->sample_rate, (double)15.36e6))
if(is_equal(s->sample_rate, (double)15.36e6)) {
s->tx_forward_nsamps = 90;
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->tx_forward_nsamps = 90;
}
if(is_equal(s->sample_rate, (double)7.68e6))
if(is_equal(s->sample_rate, (double)7.68e6)) {
s->tx_forward_nsamps = 50;
if (device_adds.size()==2 && device->type == USRP_B200_DEV) s2->tx_forward_nsamps = 50;
}
if (s->use_gps == 1) {
if (sync_to_gps(device)) {
LOG_I(PHY,"USRP fails to sync with GPS...\n");
......
......@@ -529,7 +529,7 @@ static void *UE_thread_synch(void *arg)
found = 0;
// this is number of RX antennas for legacy LTE operation (i.e. not sidelink)
int nb_rx = UE->sidelink_active == 1 ? openair0_cfg[UE->rf_map.card].rx_num_channels : openair0_cfg[UE->rf_map.card].rx_num_channels>>1;
int nb_rx = openair0_cfg[UE->rf_map.card].rx_num_channels;
if (UE->UE_scan == 0) {
do {
......@@ -771,9 +771,11 @@ static void *UE_thread_synch(void *arg)
#endif
for (i=0; i<openair0_cfg[UE->rf_map.card].rx_num_channels; i++) {
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]+freq_offset;
openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][i]+uplink_frequency_offset[CC_id][i]+freq_offset;
if (UE->sidelink_active == 1) openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i+openair0_cfg[UE->rf_map.card].rx_num_channels] = downlink_frequency[CC_id][0]+uplink_frequency_offset[CC_id][0]+freq_offset;
openair0_cfg[UE->rf_map.card].rx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][0]+freq_offset;
openair0_cfg[UE->rf_map.card].tx_freq[UE->rf_map.chain+i] = downlink_frequency[CC_id][0]+uplink_frequency_offset[CC_id][0]+freq_offset;
openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
if (UE->sidelink_active == 1) openair0_cfg[UE->rf_map.card].rx_gain[UE->rf_map.chain+i+openair0_cfg[UE->rf_map.card].rx_num_channels] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
if (UE->UE_scan_carrier==1)
openair0_cfg[UE->rf_map.card].autocal[UE->rf_map.chain+i] = 1;
}
......@@ -1828,10 +1830,10 @@ void *UE_thread(void *arg) {
PHY_VARS_UE *UE = (PHY_VARS_UE *) arg;
// int tx_enabled = 0;
int dummy_rx[UE->frame_parms.nb_antennas_rx][UE->frame_parms.samples_per_tti] __attribute__((aligned(32)));
openair0_timestamp timestamp,timestamp1;
void* rxp[NB_ANTENNAS_RX], *txp[NB_ANTENNAS_TX];
int start_rx_stream = 0;
int start_rx_stream =1;
int i;
int th_id;
......@@ -1864,6 +1866,8 @@ void *UE_thread(void *arg) {
LOG_E(HW,"Could not start the device\n");
oai_exit=1;
}
int nb_rx = (UE->sidelink_active == 1 && UE->SLonly == 0) ? 2*UE->frame_parms.nb_antennas_rx : UE->frame_parms.nb_antennas_rx;
int dummy_rx[nb_rx][UE->frame_parms.samples_per_tti] __attribute__((aligned(32)));
while (!oai_exit) {
#if BASIC_SIMULATOR
......@@ -1881,7 +1885,7 @@ void *UE_thread(void *arg) {
if (is_synchronized == 0) {
if (instance_cnt_synch < 0) { // we can invoke the synch
// grab 10 ms of signal and wakeup synch thread
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
for (int i=0; i<nb_rx; i++)
rxp[i] = (void*)&UE->common_vars.rxdata[i][0];
if (UE->mode != loop_through_memory)
......@@ -1907,7 +1911,7 @@ void *UE_thread(void *arg) {
#else
// grab 10 ms of signal into dummy buffer
if (UE->mode != loop_through_memory) {
for (int i=0; i<UE->frame_parms.nb_antennas_rx; i++)
for (int i=0; i<nb_rx; i++)
rxp[i] = (void*)&dummy_rx[i][0];
for (int sf=0; sf<10; sf++)
// printf("Reading dummy sf %d\n",sf);
......@@ -1980,7 +1984,7 @@ void *UE_thread(void *arg) {
if (UE->mode != loop_through_memory) {
for (i=0; i<UE->frame_parms.nb_antennas_rx; i++)
for (i=0; i<nb_rx; i++)
rxp[i] = (void*)&UE->common_vars.rxdata[i][UE->frame_parms.ofdm_symbol_size+
UE->frame_parms.nb_prefix_samples0+
sub_frame*UE->frame_parms.samples_per_tti];
......@@ -2122,7 +2126,7 @@ void init_UE_threads(int inst) {
pthread_mutex_init(&UE->proc.mutex_synch,NULL);
pthread_cond_init(&UE->proc.cond_synch,NULL);
UE->proc.instance_cnt_synch = -1;
UE->is_synchronized = 0;
UE->is_synchronized = 1;
if (UE->sidelink_active == 1 && UE->SLonly==1) {
pthread_attr_init (&UE->proc.attr_ueSL);
......
......@@ -600,8 +600,10 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain,int SLactive) {
openair0_cfg[card].Mod_id = 0;
openair0_cfg[card].num_rb_dl=frame_parms->N_RB_DL;
openair0_cfg[card].clock_source = clock_source;
openair0_cfg[card].tx_num_channels=min(2,frame_parms->nb_antennas_tx)<<SLactive;
openair0_cfg[card].rx_num_channels=min(2,frame_parms->nb_antennas_rx)<<SLactive;
openair0_cfg[card].tx_num_channels=min(2,frame_parms->nb_antennas_tx);
openair0_cfg[card].rx_num_channels=min(2,frame_parms->nb_antennas_rx);
LOG_I(PHY,"card %d: tx_num_channels %d, rx_num_channels %d\n",card,openair0_cfg[card].tx_num_channels,openair0_cfg[card].rx_num_channels);
for (i=0; i<4; i++) {
if (i<openair0_cfg[card].tx_num_channels)
......@@ -617,8 +619,9 @@ void init_openair0(LTE_DL_FRAME_PARMS *frame_parms,int rxgain,int SLactive) {
}
else { // assign DL and UL frequency alternately on antenna ports if SL is active
if (i<openair0_cfg[card].rx_num_channels) {
if ((i&2)==0) openair0_cfg[card].rx_freq[i] = downlink_frequency[0][i/2];
else openair0_cfg[card].rx_freq[i] = downlink_frequency[0][i/2]+uplink_frequency_offset[0][i];
openair0_cfg[card].rx_freq[i] = downlink_frequency[0][i/2];
openair0_cfg[card].rx_freq[i+openair0_cfg[card].rx_num_channels] = downlink_frequency[0][i/2]+uplink_frequency_offset[0][i];
LOG_I(PHY,"Setting SL receiver @ %f\n",openair0_cfg[card].rx_freq[i+openair0_cfg[card].rx_num_channels]);
}
else
openair0_cfg[card].rx_freq[i]=0.0;
......@@ -843,7 +846,7 @@ int main( int argc, char **argv ) {
}
}
}
else init_openair0(frame_parms[0],(int)rx_gain[0][0],(PHY_vars_UE_g[0][0]->sidelink_active==1 && PHY_vars_UE_g[0][0]->SLonly==0)?1:0);
else init_openair0(frame_parms[0],(int)rx_gain[0][0],(sidelink_active==1 && SLonly==0)?1:0);
if (simL1flag==1) {
RCConfig_sim();
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment