diff --git a/targets/ARCH/COMMON/common_lib.h b/targets/ARCH/COMMON/common_lib.h index 8cc7926d4571158f210eb976dd3df102f4d2a510..8432441568321c2754afbf4905bed00e34be6adb 100644 --- a/targets/ARCH/COMMON/common_lib.h +++ b/targets/ARCH/COMMON/common_lib.h @@ -98,6 +98,10 @@ typedef struct { //! \brief Center frequency in Hz for TX. //! index: [0..rx_num_channels[ !!! see lte-ue.c:427 FIXME iterates over rx_num_channels 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) rx_gain_t rxg_mode[4]; //! \brief Gain for RX in dB. diff --git a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp index e57f55720b14fbb7605fc41e6ab091a61cc7755d..73fe2683dcd012c995fca98e5cca9e1772027295 100644 --- a/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp +++ b/targets/ARCH/USRP/USERSPACE/LIB/usrp_lib.cpp @@ -171,17 +171,30 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp #endif - + /* 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]); 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_tmp[0], nsamps, s->rx_md); + }*/ + + 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); } + /* // bring RX data into 12 LSBs for softmodem RX for (int i=0;i<cc;i++) { for (int j=0; j<nsamps2; j++) { @@ -196,6 +209,8 @@ static int trx_usrp_read(openair0_device *device, openair0_timestamp *ptimestamp #endif } } + */ + if (samples_received < nsamps) { printf("[recv] received %d samples out of %d\n",samples_received,nsamps); @@ -279,7 +294,7 @@ int trx_usrp_set_gains(openair0_device* device, exit(-1); } 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); } @@ -289,7 +304,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}, {2660000000.0,53.0}, {2300000000.0,54.0}, @@ -297,19 +312,29 @@ rx_gain_calib_table_t calib_table[] = { {816000000.0,62.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,89}, + {-1,0}}; + void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) { int i=0; // loop through calibration table to find best adjustment factor for RX frequency double min_diff = 6e9,diff; - - while (calib_table[i].freq>0) { - diff = fabs(openair0_cfg->rx_freq[chain_index] - calib_table[i].freq); + + while (openair0_cfg->rx_gain_calib_table[i].freq>0) { + 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", - 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) { 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++; } @@ -375,6 +400,8 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_ // 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 //s->usrp->set_master_clock_rate(usrp_master_clock); + + openair0_cfg[0].rx_gain_calib_table = calib_table_x310; } else { printf("Found USRP B200"); s->usrp = uhd::usrp::multi_usrp::make(args); @@ -387,6 +414,8 @@ int openair0_dev_init_usrp(openair0_device* device, openair0_config_t *openair0_ // s->usrp->set_clock_source("internal"); // set master clock rate and sample rate for tx & rx for streaming s->usrp->set_master_clock_rate(30.72e6); + + openair0_cfg[0].rx_gain_calib_table = calib_table_b210; } diff --git a/targets/RT/USER/lte-softmodem.c b/targets/RT/USER/lte-softmodem.c index b96a7ae5292099fd5bc964e57b2a89e2502699be..acf924050f8dd37dc31948959ae7841b9a4fdc04 100644 --- a/targets/RT/USER/lte-softmodem.c +++ b/targets/RT/USER/lte-softmodem.c @@ -2965,24 +2965,28 @@ openair0_cfg[card].num_rb_dl=frame_parms[0]->N_RB_DL; 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 } - + switch(frame_parms[0]->N_RB_DL) { case 6: - openair0_cfg[card].rx_gain[i] -= 6; + openair0_cfg[card].rx_gain[i] -= 12; break; case 25: - openair0_cfg[card].rx_gain[i] += 6; + openair0_cfg[card].rx_gain[i] -= 6; break; 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; default: break; } - + } diff --git a/targets/RT/USER/lte-ue.c b/targets/RT/USER/lte-ue.c index 31701d877fb0eeab408814bfc62d6f4708c0adb1..ec245360d7554fe6a68fc6966ef1685a321a6054 100644 --- a/targets/RT/USER/lte-ue.c +++ b/targets/RT/USER/lte-ue.c @@ -410,6 +410,7 @@ static void *UE_thread_synch(void *arg) UE->UE_scan_carrier = 0; // rerun with new cell parameters and frequency-offset 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].tx_freq[i] = openair0_cfg[0].rx_freq[i]+uplink_frequency_offset[0][i]; downlink_frequency[0][i] = openair0_cfg[0].rx_freq[i];