Merge branch 'feature-38-bladerf' into develop
This commit is contained in:
@@ -336,7 +336,9 @@ int initial_sync(PHY_VARS_UE *phy_vars_ue, runmode_t mode)
|
||||
|
||||
#else
|
||||
#ifndef OAI_USRP
|
||||
#ifndef OAI_BLADERF
|
||||
phy_adjust_gain(phy_vars_ue,0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
|
||||
|
||||
@@ -50,7 +50,7 @@
|
||||
#endif
|
||||
|
||||
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
|
||||
#if defined(OAI_USRP) || defined(EXMIMO)
|
||||
#if defined(OAI_USRP) || defined(EXMIMO) || defined(OAI_BLADERF)
|
||||
#include "common_lib.h"
|
||||
extern openair0_config_t openair0_cfg[];
|
||||
#endif
|
||||
@@ -97,10 +97,10 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
|
||||
#ifdef EXMIMO
|
||||
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB (LNA %d, vga %d dB)\n",phy_vars_ue->rx_total_gain_dB, openair0_cfg[0].rxg_mode[0],(int)openair0_cfg[0].rx_gain[0]);
|
||||
#endif
|
||||
#ifdef OAI_USRP
|
||||
#if defined(OAI_USRP) || defined(OAI_BLADERF)
|
||||
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
|
||||
#endif
|
||||
#if defined(EXMIMO) || defined(OAI_USRP)
|
||||
#if defined(EXMIMO) || defined(OAI_USRP) || defined(OAI_BLADERF)
|
||||
len += sprintf(&buffer[len], "[UE_PROC] Frequency offset %d Hz (%d), estimated carrier frequency %f Hz\n",phy_vars_ue->lte_ue_common_vars.freq_offset,openair_daq_vars.freq_offset,openair0_cfg[0].rx_freq[0]-phy_vars_ue->lte_ue_common_vars.freq_offset);
|
||||
#endif
|
||||
len += sprintf(&buffer[len], "[UE PROC] UE mode = %s (%d)\n",mode_string[phy_vars_ue->UE_mode[0]],phy_vars_ue->UE_mode[0]);
|
||||
|
||||
@@ -197,7 +197,7 @@ int32_t signal_energy(int32_t *input,uint32_t length)
|
||||
for (i=0; i<length>>1; i++) {
|
||||
|
||||
tmpE = vqaddq_s32(tmpE,vshrq_n_s32(vmull_s16(*in,*in),shift));
|
||||
tmpDC = vaddw_s16(tmpDC,vshr_n_s16(*in++,shift_DC));
|
||||
//tmpDC = vaddw_s16(tmpDC,vshr_n_s16(*in++,shift_DC));
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1553,7 +1553,9 @@ void lte_ue_measurement_procedures(uint16_t l, PHY_VARS_UE *phy_vars_ue,uint8_t
|
||||
|
||||
#else
|
||||
#ifndef OAI_USRP
|
||||
#ifndef OAI_BLADERF
|
||||
phy_adjust_gain (phy_vars_ue,0);
|
||||
#endif
|
||||
#endif
|
||||
#endif
|
||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
|
||||
|
||||
@@ -38,6 +38,14 @@
|
||||
#include <inttypes.h>
|
||||
#include "bladerf_lib.h"
|
||||
|
||||
#ifdef __SSE4_1__
|
||||
# include <smmintrin.h>
|
||||
#endif
|
||||
|
||||
#ifdef __AVX2__
|
||||
# include <immintrin.h>
|
||||
#endif
|
||||
|
||||
int num_devices=0;
|
||||
/*These items configure the underlying asynch stream used by the the sync interface.
|
||||
*/
|
||||
@@ -47,16 +55,17 @@ int trx_brf_init(openair0_device *openair0) {
|
||||
}
|
||||
|
||||
|
||||
openair0_timestamp trx_get_timestamp(openair0_device *device) {
|
||||
openair0_timestamp trx_get_timestamp(openair0_device *device, bladerf_module module) {
|
||||
int status;
|
||||
struct bladerf_metadata meta;
|
||||
brf_state_t *brf = (brf_state_t*)device->priv;
|
||||
memset(&meta, 0, sizeof(meta));
|
||||
|
||||
if ((status=bladerf_get_timestamp(brf->dev, BLADERF_MODULE_TX, &meta.timestamp)) != 0) {
|
||||
fprintf(stderr,"Failed to get current RX timestamp: %s\n",bladerf_strerror(status));
|
||||
} else {
|
||||
printf("Current TX timestampe 0x%016"PRIx64"\n", meta.timestamp);
|
||||
}
|
||||
if ((status=bladerf_get_timestamp(brf->dev, module, &meta.timestamp)) != 0) {
|
||||
fprintf(stderr,"Failed to get current %s timestamp: %s\n",(module == BLADERF_MODULE_RX ) ? "RX" : "TX", bladerf_strerror(status));
|
||||
return -1;
|
||||
} // else {printf("Current RX timestampe 0x%016"PRIx64"\n", meta.timestamp); }
|
||||
|
||||
return meta.timestamp;
|
||||
}
|
||||
|
||||
@@ -73,22 +82,26 @@ static void trx_brf_stats(openair0_device *device){
|
||||
|
||||
static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp, void **buff, int nsamps, int cc) {
|
||||
|
||||
int status, i;
|
||||
int status;
|
||||
brf_state_t *brf = (brf_state_t*)device->priv;
|
||||
/* BRF has only 1 rx/tx chaine : is it correct? */
|
||||
void *samples = (void*)buff[0];
|
||||
int16_t *samples = (int16_t*)buff[0];
|
||||
|
||||
//brf->meta_tx.flags &= ~BLADERF_META_FLAG_TX_NOW;
|
||||
brf->meta_tx.flags = BLADERF_META_FLAG_TX_BURST_START |
|
||||
BLADERF_META_FLAG_TX_NOW |
|
||||
BLADERF_META_FLAG_TX_BURST_END;
|
||||
|
||||
brf->meta_tx.timestamp= (uint64_t) ptimestamp;
|
||||
|
||||
//memset(&brf->meta_tx, 0, sizeof(brf->meta_tx));
|
||||
// When BLADERF_META_FLAG_TX_NOW is used the timestamp is not used, so one can't schedule a tx
|
||||
if (brf->meta_tx.flags == 0 )
|
||||
brf->meta_tx.flags = (BLADERF_META_FLAG_TX_BURST_START);// | BLADERF_META_FLAG_TX_BURST_END);// | BLADERF_META_FLAG_TX_NOW);
|
||||
|
||||
|
||||
brf->meta_tx.timestamp= (uint64_t) (ptimestamp);
|
||||
status = bladerf_sync_tx(brf->dev, samples, (unsigned int) nsamps, &brf->meta_tx, 2*brf->tx_timeout_ms);
|
||||
|
||||
if (brf->meta_tx.flags == BLADERF_META_FLAG_TX_BURST_START)
|
||||
brf->meta_tx.flags = BLADERF_META_FLAG_TX_UPDATE_TIMESTAMP;
|
||||
|
||||
|
||||
if (status != 0) {
|
||||
fprintf(stderr,"Failed to TX sample: %s\n", bladerf_strerror(status));
|
||||
//fprintf(stderr,"Failed to TX sample: %s\n", bladerf_strerror(status));
|
||||
brf->num_tx_errors++;
|
||||
brf_error(status);
|
||||
} else if (brf->meta_tx.status & BLADERF_META_STATUS_UNDERRUN){
|
||||
@@ -96,6 +109,8 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp,
|
||||
fprintf(stderr, "TX Underrun detected. %u valid samples were read.\n", brf->meta_tx.actual_count);
|
||||
brf->num_underflows++;
|
||||
}
|
||||
//printf("Provided TX timestampe %u, meta timestame %u\n", ptimestamp,brf->meta_tx.timestamp);
|
||||
|
||||
// printf("tx status %d \n",brf->meta_tx.status);
|
||||
brf->tx_current_ts=brf->meta_tx.timestamp;
|
||||
brf->tx_actual_nsamps+=brf->meta_tx.actual_count;
|
||||
@@ -107,26 +122,28 @@ static int trx_brf_write(openair0_device *device,openair0_timestamp ptimestamp,
|
||||
}
|
||||
|
||||
static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
|
||||
int status, ret;
|
||||
|
||||
unsigned int i;
|
||||
|
||||
int status=0;
|
||||
brf_state_t *brf = (brf_state_t*)device->priv;
|
||||
|
||||
// BRF has only one rx/tx chain
|
||||
void *samples = (void*)buff[0];
|
||||
|
||||
brf->meta_rx.flags |= BLADERF_META_FLAG_RX_NOW;
|
||||
int16_t *samples = (int16_t*)buff[0];
|
||||
|
||||
brf->meta_rx.flags = BLADERF_META_FLAG_RX_NOW;
|
||||
status = bladerf_sync_rx(brf->dev, samples, (unsigned int) nsamps, &brf->meta_rx, 2*brf->rx_timeout_ms);
|
||||
|
||||
// printf("Current RX timestampe %u, nsamps %u, actual %u, cc %d\n", brf->meta_rx.timestamp, nsamps, brf->meta_rx.actual_count, cc);
|
||||
|
||||
if (status != 0) {
|
||||
fprintf(stderr, "RX failed: %s\n", bladerf_strerror(status));
|
||||
// printf("RX failed: %s\n", bladerf_strerror(status));
|
||||
brf->num_rx_errors++;
|
||||
} else if ( brf->meta_rx.status & BLADERF_META_STATUS_OVERRUN) {
|
||||
brf->num_overflows++;
|
||||
fprintf(stderr, "RX overrun (%d) is detected. t=0x%"PRIu64". Got %u samples. nsymps %d\n",
|
||||
brf->num_overflows,brf->meta_rx.timestamp, brf->meta_rx.actual_count, nsamps);
|
||||
//brf->meta_rx.timestamp=(unsigned int)(nsamps-brf->meta_rx.actual_count);
|
||||
}
|
||||
printf("RX overrun (%d) is detected. t=%u. Got %u samples. nsymps %d\n",
|
||||
brf->num_overflows,brf->meta_rx.timestamp, brf->meta_rx.actual_count, nsamps);
|
||||
}
|
||||
//printf("Current RX timestampe %u\n", brf->meta_rx.timestamp);
|
||||
//printf("[BRF] (buff %p) ts=0x%"PRIu64" %s\n",samples, brf->meta_rx.timestamp,bladerf_strerror(status));
|
||||
brf->rx_current_ts=brf->meta_rx.timestamp;
|
||||
brf->rx_actual_nsamps+=brf->meta_rx.actual_count;
|
||||
@@ -135,7 +152,7 @@ static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp,
|
||||
|
||||
|
||||
*ptimestamp = brf->meta_rx.timestamp;
|
||||
|
||||
|
||||
return brf->meta_rx.actual_count;
|
||||
|
||||
}
|
||||
@@ -176,6 +193,23 @@ int trx_brf_stop(openair0_device* device) {
|
||||
|
||||
int trx_brf_set_freq(openair0_device* device) {
|
||||
|
||||
int status;
|
||||
brf_state_t *brf = (brf_state_t *)device->priv;
|
||||
openair0_config_t *openair0_cfg = (openair0_config_t *)device->openair0_cfg;
|
||||
|
||||
|
||||
if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_TX, (unsigned int) openair0_cfg->tx_freq[0])) != 0){
|
||||
fprintf(stderr,"Failed to set TX frequency: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set TX Frequency to %u\n", (unsigned int) openair0_cfg->tx_freq[0]);
|
||||
|
||||
if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg->rx_freq[0])) != 0){
|
||||
fprintf(stderr,"Failed to set RX frequency: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
} else
|
||||
printf("[BRF] set RX frequency to %u\n",(unsigned int)openair0_cfg->rx_freq[0]);
|
||||
|
||||
return(0);
|
||||
|
||||
}
|
||||
@@ -185,6 +219,609 @@ int trx_brf_set_gains(openair0_device* device) {
|
||||
|
||||
}
|
||||
|
||||
#define RXDCLENGTH 16384
|
||||
int16_t cos_fsover8[8] = {2047, 1447, 0, -1448, -2047, -1448, 0, 1447};
|
||||
int16_t cos_3fsover8[8] = {2047, -1448, 0, 1447, -2047, 1447, 0, -1448};
|
||||
|
||||
rx_gain_calib_table_t calib_table_fx4[] = {
|
||||
{2300000000.0,53.5},
|
||||
{1880000000.0,57.0},
|
||||
{816000000.0,73.0},
|
||||
{-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 (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,
|
||||
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] = openair0_cfg->rx_gain_calib_table[i].offset;
|
||||
}
|
||||
i++;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void calibrate_rf(openair0_device *device) {
|
||||
|
||||
|
||||
brf_state_t *brf = (brf_state_t *)device->priv;
|
||||
openair0_timestamp ptimestamp;
|
||||
int16_t *calib_buffp,*calib_tx_buffp;
|
||||
int16_t calib_buff[2*RXDCLENGTH];
|
||||
int16_t calib_tx_buff[2*RXDCLENGTH];
|
||||
int i,j,offI,offQ,offIold,offQold,offInew,offQnew,offphase,offphaseold,offphasenew,offgain,offgainold,offgainnew;
|
||||
int32_t meanI,meanQ,meanIold,meanQold;
|
||||
int cnt=0,loop;
|
||||
|
||||
// put TX on a far-away frequency to avoid interference in RX band
|
||||
bladerf_set_frequency(brf->dev,BLADERF_MODULE_TX, (unsigned int) device->openair0_cfg->rx_freq[0] + 200e6);
|
||||
// Set gains to close to max
|
||||
bladerf_set_gain(brf->dev, BLADERF_MODULE_RX, 60);
|
||||
bladerf_set_gain(brf->dev, BLADERF_MODULE_TX, 60);
|
||||
|
||||
// fill TX buffer with fs/8 complex sinusoid
|
||||
j=0;
|
||||
for (i=0;i<RXDCLENGTH;i++) {
|
||||
calib_tx_buff[j++] = cos_fsover8[i&7];
|
||||
calib_tx_buff[j++] = cos_fsover8[(i+6)&7]; // sin
|
||||
}
|
||||
calib_buffp = &calib_buff[0];
|
||||
calib_tx_buffp = &calib_tx_buff[0];
|
||||
// Calibrate RX DC offset
|
||||
|
||||
offIold=offQold=2048;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_I,offIold);
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_Q,offQold);
|
||||
for (i=0;i<10;i++)
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanIold+=calib_buff[j++];
|
||||
meanQold+=calib_buff[j++];
|
||||
}
|
||||
meanIold/=RXDCLENGTH;
|
||||
meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] RX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold);
|
||||
|
||||
offI=offQ=-2048;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_I,offI);
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_Q,offQ);
|
||||
for (i=0;i<10;i++)
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+=calib_buff[j++];
|
||||
meanQ+=calib_buff[j++];
|
||||
}
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
// printf("[BRF] RX DC: (%d,%d) => (%d,%d)\n",offI,offQ,meanI,meanQ);
|
||||
|
||||
while (cnt++ < 12) {
|
||||
|
||||
offInew=(offIold+offI)>>1;
|
||||
offQnew=(offQold+offQ)>>1;
|
||||
|
||||
if (meanI*meanI < meanIold*meanIold) {
|
||||
meanIold = meanI;
|
||||
offIold = offI;
|
||||
printf("[BRF] *** RX DC: offI %d => %d\n",offIold,meanI);
|
||||
}
|
||||
if (meanQ*meanQ < meanQold*meanQold) {
|
||||
meanQold = meanQ;
|
||||
offQold = offQ;
|
||||
printf("[BRF] *** RX DC: offQ %d => %d\n",offQold,meanQ);
|
||||
}
|
||||
offI = offInew;
|
||||
offQ = offQnew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_I,offI);
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_Q,offQ);
|
||||
|
||||
for (i=0;i<10;i++)
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+=calib_buff[j++];
|
||||
meanQ+=calib_buff[j++];
|
||||
}
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] RX DC: (%d,%d) => (%d,%d)\n",offI,offQ,meanI,meanQ);
|
||||
}
|
||||
|
||||
printf("[BRF] RX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold);
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_I,offIold);
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_LMS_DCOFF_Q,offQold);
|
||||
|
||||
// TX DC offset
|
||||
// PUT TX as f_RX + fs/4
|
||||
// loop back BLADERF_LB_RF_LNA1
|
||||
bladerf_set_frequency(brf->dev,BLADERF_MODULE_TX, (unsigned int) device->openair0_cfg->rx_freq[0] + (unsigned int) device->openair0_cfg->sample_rate/4);
|
||||
bladerf_set_loopback (brf->dev,BLADERF_LB_RF_LNA1);
|
||||
|
||||
offIold=2048;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offIold);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
switch (i&3) {
|
||||
case 0:
|
||||
meanIold+=calib_buff[j++];
|
||||
break;
|
||||
case 1:
|
||||
meanQold+=calib_buff[j++];
|
||||
break;
|
||||
case 2:
|
||||
meanIold-=calib_buff[j++];
|
||||
break;
|
||||
case 3:
|
||||
meanQold-=calib_buff[j++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// meanIold/=RXDCLENGTH;
|
||||
// meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] TX DC (offI): %d => (%d,%d)\n",offIold,meanIold,meanQold);
|
||||
|
||||
offI=-2048;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offI);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
switch (i&3) {
|
||||
case 0:
|
||||
meanI+=calib_buff[j++];
|
||||
break;
|
||||
case 1:
|
||||
meanQ+=calib_buff[j++];
|
||||
break;
|
||||
case 2:
|
||||
meanI-=calib_buff[j++];
|
||||
break;
|
||||
case 3:
|
||||
meanQ-=calib_buff[j++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// meanI/=RXDCLENGTH;
|
||||
// meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] TX DC (offI): %d => (%d,%d)\n",offI,meanI,meanQ);
|
||||
cnt = 0;
|
||||
while (cnt++ < 12) {
|
||||
|
||||
offInew=(offIold+offI)>>1;
|
||||
if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
|
||||
printf("[BRF] TX DC (offI): ([%d,%d]) => %d : %d\n",offIold,offI,offInew,meanI*meanI+meanQ*meanQ);
|
||||
meanIold = meanI;
|
||||
meanQold = meanQ;
|
||||
offIold = offI;
|
||||
}
|
||||
offI = offInew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offI);
|
||||
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
switch (i&3) {
|
||||
case 0:
|
||||
meanI+=calib_buff[j++];
|
||||
break;
|
||||
case 1:
|
||||
meanQ+=calib_buff[j++];
|
||||
break;
|
||||
case 2:
|
||||
meanI-=calib_buff[j++];
|
||||
break;
|
||||
case 3:
|
||||
meanQ-=calib_buff[j++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// meanI/=RXDCLENGTH;
|
||||
// meanQ/=RXDCLENGTH;
|
||||
// printf("[BRF] TX DC (offI): %d => (%d,%d)\n",offI,meanI,meanQ);
|
||||
}
|
||||
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_I,offIold);
|
||||
|
||||
offQold=2048;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQold);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/4
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
switch (i&3) {
|
||||
case 0:
|
||||
meanIold+=calib_buff[j++];
|
||||
break;
|
||||
case 1:
|
||||
meanQold+=calib_buff[j++];
|
||||
break;
|
||||
case 2:
|
||||
meanIold-=calib_buff[j++];
|
||||
break;
|
||||
case 3:
|
||||
meanQold-=calib_buff[j++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// meanIold/=RXDCLENGTH;
|
||||
// meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQold,meanIold,meanQold);
|
||||
|
||||
offQ=-2048;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQ);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
switch (i&3) {
|
||||
case 0:
|
||||
meanI+=calib_buff[j++];
|
||||
break;
|
||||
case 1:
|
||||
meanQ+=calib_buff[j++];
|
||||
break;
|
||||
case 2:
|
||||
meanI-=calib_buff[j++];
|
||||
break;
|
||||
case 3:
|
||||
meanQ-=calib_buff[j++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// meanI/=RXDCLENGTH;
|
||||
// meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ);
|
||||
|
||||
cnt=0;
|
||||
while (cnt++ < 12) {
|
||||
|
||||
offQnew=(offQold+offQ)>>1;
|
||||
if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
|
||||
printf("[BRF] TX DC (offQ): ([%d,%d]) => %d : %d\n",offQold,offQ,offQnew,meanI*meanI+meanQ*meanQ);
|
||||
|
||||
meanIold = meanI;
|
||||
meanQold = meanQ;
|
||||
offQold = offQ;
|
||||
}
|
||||
offQ = offQnew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQ);
|
||||
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
switch (i&3) {
|
||||
case 0:
|
||||
meanI+=calib_buff[j++];
|
||||
break;
|
||||
case 1:
|
||||
meanQ+=calib_buff[j++];
|
||||
break;
|
||||
case 2:
|
||||
meanI-=calib_buff[j++];
|
||||
break;
|
||||
case 3:
|
||||
meanQ-=calib_buff[j++];
|
||||
break;
|
||||
}
|
||||
}
|
||||
// meanI/=RXDCLENGTH;
|
||||
// meanQ/=RXDCLENGTH;
|
||||
// printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ);
|
||||
}
|
||||
|
||||
printf("[BRF] TX DC: (%d,%d) => (%d,%d)\n",offIold,offQold,meanIold,meanQold);
|
||||
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_LMS_DCOFF_Q,offQold);
|
||||
|
||||
// TX IQ imbalance
|
||||
for (loop=0;loop<2;loop++) {
|
||||
offphaseold=4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphaseold);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanIold+= (calib_buff[j]*cos_fsover8[i&7] - calib_buff[j+1]*cos_fsover8[(i+2)&7])>>11;
|
||||
meanQold+= (calib_buff[j]*cos_fsover8[(i+2)&7] + calib_buff[j+1]*cos_fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanIold/=RXDCLENGTH;
|
||||
meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] TX IQ (offphase): %d => (%d,%d)\n",offphaseold,meanIold,meanQold);
|
||||
|
||||
offphase=-4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphase);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_fsover8[i&7] - calib_buff[j+1]*cos_fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_fsover8[(i+2)&7] + calib_buff[j+1]*cos_fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] TX IQ (offphase): %d => (%d,%d)\n",offphase,meanI,meanQ);
|
||||
|
||||
cnt=0;
|
||||
while (cnt++ < 13) {
|
||||
|
||||
offphasenew=(offphaseold+offphase)>>1;
|
||||
printf("[BRF] TX IQ (offphase): ([%d,%d]) => %d : %d\n",offphaseold,offphase,offphasenew,meanI*meanI+meanQ*meanQ);
|
||||
if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
|
||||
|
||||
|
||||
meanIold = meanI;
|
||||
meanQold = meanQ;
|
||||
offphaseold = offphase;
|
||||
}
|
||||
offphase = offphasenew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphase);
|
||||
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_fsover8[i&7] - calib_buff[j+1]*cos_fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_fsover8[(i+2)&7] + calib_buff[j+1]*cos_fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
|
||||
// printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ);
|
||||
}
|
||||
|
||||
printf("[BRF] TX IQ offphase: %d => (%d,%d)\n",offphaseold,meanIold,meanQold);
|
||||
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_PHASE,offphaseold);
|
||||
|
||||
offgainold=4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgainold);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanIold+= (calib_buff[j]*cos_fsover8[i&7] - calib_buff[j+1]*cos_fsover8[(i+2)&7])>>11;
|
||||
meanQold+= (calib_buff[j]*cos_fsover8[(i+2)&7] + calib_buff[j+1]*cos_fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanIold/=RXDCLENGTH;
|
||||
meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] TX IQ (offgain): %d => (%d,%d)\n",offgainold,meanIold,meanQold);
|
||||
|
||||
offgain=-4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgain);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_fsover8[i&7] - calib_buff[j+1]*cos_fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_fsover8[(i+2)&7] + calib_buff[j+1]*cos_fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] TX IQ (offgain): %d => (%d,%d)\n",offgain,meanI,meanQ);
|
||||
|
||||
cnt=0;
|
||||
while (cnt++ < 13) {
|
||||
|
||||
offgainnew=(offgainold+offgain)>>1;
|
||||
if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
|
||||
printf("[BRF] TX IQ (offgain): ([%d,%d]) => %d : %d\n",offgainold,offgain,offgainnew,meanI*meanI+meanQ*meanQ);
|
||||
|
||||
meanIold = meanI;
|
||||
meanQold = meanQ;
|
||||
offgainold = offgain;
|
||||
}
|
||||
offgain = offgainnew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgain);
|
||||
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_fsover8[i&7] - calib_buff[j+1]*cos_fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_fsover8[(i+2)&7] + calib_buff[j+1]*cos_fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
|
||||
// printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ);
|
||||
}
|
||||
|
||||
printf("[BRF] TX IQ offgain: %d => (%d,%d)\n",offgainold,meanIold,meanQold);
|
||||
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_TX,BLADERF_CORR_FPGA_GAIN,offgainold);
|
||||
}
|
||||
|
||||
// RX IQ imbalance
|
||||
for (loop=0;loop<2;loop++) {
|
||||
offphaseold=4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphaseold);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on -3fs/8 (Image of TX signal in -ve frequencies)
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanIold+= (calib_buff[j]*cos_3fsover8[i&7] - calib_buff[j+1]*cos_3fsover8[(i+2)&7])>>11;
|
||||
meanQold+= (calib_buff[j]*cos_3fsover8[(i+2)&7] + calib_buff[j+1]*cos_3fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanIold/=RXDCLENGTH;
|
||||
meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] RX IQ (offphase): %d => (%d,%d)\n",offphaseold,meanIold,meanQold);
|
||||
|
||||
offphase=-4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphase);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on -3fs/8 (Image of TX signal in -ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_3fsover8[i&7] - calib_buff[j+1]*cos_3fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_3fsover8[(i+2)&7] + calib_buff[j+1]*cos_3fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] RX IQ (offphase): %d => (%d,%d)\n",offphase,meanI,meanQ);
|
||||
|
||||
cnt=0;
|
||||
while (cnt++ < 13) {
|
||||
|
||||
offphasenew=(offphaseold+offphase)>>1;
|
||||
printf("[BRF] RX IQ (offphase): ([%d,%d]) => %d : %d\n",offphaseold,offphase,offphasenew,meanI*meanI+meanQ*meanQ);
|
||||
if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
|
||||
|
||||
|
||||
meanIold = meanI;
|
||||
meanQold = meanQ;
|
||||
offphaseold = offphase;
|
||||
}
|
||||
offphase = offphasenew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphase);
|
||||
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on -3fs/8 (Image of TX signal in -ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_3fsover8[i&7] - calib_buff[j+1]*cos_3fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_3fsover8[(i+2)&7] + calib_buff[j+1]*cos_3fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
|
||||
// printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ);
|
||||
}
|
||||
|
||||
printf("[BRF] RX IQ offphase: %d => (%d,%d)\n",offphaseold,meanIold,meanQold);
|
||||
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_PHASE,offphaseold);
|
||||
|
||||
offgainold=4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgainold);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on -3fs/8 (Image of TX signal in +ve frequencies)
|
||||
for (meanIold=meanQold=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanIold+= (calib_buff[j]*cos_3fsover8[i&7] - calib_buff[j+1]*cos_3fsover8[(i+2)&7])>>11;
|
||||
meanQold+= (calib_buff[j]*cos_3fsover8[(i+2)&7] + calib_buff[j+1]*cos_3fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanIold/=RXDCLENGTH;
|
||||
meanQold/=RXDCLENGTH;
|
||||
printf("[BRF] RX IQ (offgain): %d => (%d,%d)\n",offgainold,meanIold,meanQold);
|
||||
|
||||
offgain=-4096;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgain);
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on 3fs/8 (Image of TX signal in -ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_3fsover8[i&7] - calib_buff[j+1]*cos_3fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_3fsover8[(i+2)&7] + calib_buff[j+1]*cos_3fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
printf("[BRF] RX IQ (offgain): %d => (%d,%d)\n",offgain,meanI,meanQ);
|
||||
|
||||
cnt=0;
|
||||
while (cnt++ < 13) {
|
||||
|
||||
offgainnew=(offgainold+offgain)>>1;
|
||||
if (meanI*meanI+meanQ*meanQ < meanIold*meanIold +meanQold*meanQold) {
|
||||
printf("[BRF] RX IQ (offgain): ([%d,%d]) => %d : %d\n",offgainold,offgain,offgainnew,meanI*meanI+meanQ*meanQ);
|
||||
|
||||
meanIold = meanI;
|
||||
meanQold = meanQ;
|
||||
offgainold = offgain;
|
||||
}
|
||||
offgain = offgainnew;
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgain);
|
||||
|
||||
for (i=0;i<10;i++) {
|
||||
trx_brf_read(device, &ptimestamp, (void **)&calib_buffp, RXDCLENGTH, 0);
|
||||
trx_brf_write(device,ptimestamp+5*RXDCLENGTH, (void **)&calib_tx_buffp, RXDCLENGTH, 0);
|
||||
}
|
||||
// project on -3fs/8 (Image of TX signal in -ve frequencies)
|
||||
for (meanI=meanQ=i=j=0;i<RXDCLENGTH;i++) {
|
||||
meanI+= (calib_buff[j]*cos_3fsover8[i&7] - calib_buff[j+1]*cos_3fsover8[(i+2)&7])>>11;
|
||||
meanQ+= (calib_buff[j]*cos_3fsover8[(i+2)&7] + calib_buff[j+1]*cos_3fsover8[i&7])>>11;
|
||||
j+=2;
|
||||
}
|
||||
meanI/=RXDCLENGTH;
|
||||
meanQ/=RXDCLENGTH;
|
||||
|
||||
// printf("[BRF] TX DC (offQ): %d => (%d,%d)\n",offQ,meanI,meanQ);
|
||||
}
|
||||
|
||||
printf("[BRF] RX IQ offgain: %d => (%d,%d)\n",offgainold,meanIold,meanQold);
|
||||
|
||||
bladerf_set_correction(brf->dev,BLADERF_MODULE_RX,BLADERF_CORR_FPGA_GAIN,offgainold);
|
||||
}
|
||||
|
||||
bladerf_set_frequency(brf->dev,BLADERF_MODULE_TX, (unsigned int) device->openair0_cfg->tx_freq[0]);
|
||||
bladerf_set_loopback(brf->dev,BLADERF_LB_NONE);
|
||||
bladerf_set_gain(brf->dev, BLADERF_MODULE_RX, (unsigned int) device->openair0_cfg->rx_gain[0]-device->openair0_cfg[0].rx_gain_offset[0]);
|
||||
bladerf_set_gain(brf->dev, BLADERF_MODULE_TX, (unsigned int) device->openair0_cfg->tx_gain[0]);
|
||||
// write_output("blade_rf_test.m","rxs",calib_buff,RXDCLENGTH,1,1);
|
||||
}
|
||||
|
||||
int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||
|
||||
int status;
|
||||
@@ -192,18 +829,52 @@ int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openai
|
||||
|
||||
brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t));
|
||||
memset(brf, 0, sizeof(brf_state_t));
|
||||
// init required params for BRF
|
||||
brf->num_buffers = 128;
|
||||
brf->buffer_size = (unsigned int) openair0_cfg[card].samples_per_packet*sizeof(int32_t); // buffer size = 4096 for sample_len of 1024
|
||||
brf->num_transfers = 16;
|
||||
brf->rx_timeout_ms = 0;
|
||||
brf->tx_timeout_ms = 0;
|
||||
brf->sample_rate=(unsigned int)openair0_cfg[card].sample_rate;
|
||||
// init required params
|
||||
|
||||
|
||||
printf("\n[BRF] sampling_rate %d, num_buffers %d, buffer_size %d, num transfer %d, timeout_ms (rx %d, tx %d)\n",
|
||||
brf->sample_rate, brf->num_buffers, brf->buffer_size,brf->num_transfers, brf->rx_timeout_ms, brf->tx_timeout_ms);
|
||||
switch ((int)openair0_cfg->sample_rate) {
|
||||
case 30720000:
|
||||
openair0_cfg->samples_per_packet = 2048;
|
||||
openair0_cfg->tx_sample_advance = 0;
|
||||
openair0_cfg->tx_scheduling_advance = 8*openair0_cfg->samples_per_packet;
|
||||
break;
|
||||
case 15360000:
|
||||
openair0_cfg->samples_per_packet = 2048;
|
||||
openair0_cfg->tx_sample_advance = 0;
|
||||
openair0_cfg->tx_scheduling_advance = 4*openair0_cfg->samples_per_packet;
|
||||
break;
|
||||
case 7680000:
|
||||
openair0_cfg->samples_per_packet = 1024;
|
||||
openair0_cfg->tx_sample_advance = 0;
|
||||
openair0_cfg->tx_scheduling_advance = 4*openair0_cfg->samples_per_packet;
|
||||
break;
|
||||
case 1920000:
|
||||
openair0_cfg->samples_per_packet = 256;
|
||||
openair0_cfg->tx_sample_advance = 50;
|
||||
openair0_cfg->tx_scheduling_advance = 8*openair0_cfg->samples_per_packet;
|
||||
break;
|
||||
default:
|
||||
printf("Error: unknown sampling rate %f\n",openair0_cfg->sample_rate);
|
||||
exit(-1);
|
||||
break;
|
||||
}
|
||||
|
||||
openair0_cfg->rx_gain_calib_table = calib_table_fx4;
|
||||
|
||||
// The number of buffers to use in the underlying data stream
|
||||
brf->num_buffers = 128;
|
||||
// the size of the underlying stream buffers, in samples
|
||||
brf->buffer_size = (unsigned int) openair0_cfg->samples_per_packet;//*sizeof(int32_t); // buffer size = 4096 for sample_len of 1024
|
||||
brf->num_transfers = 16;
|
||||
brf->rx_timeout_ms = 0;
|
||||
brf->tx_timeout_ms = 0;
|
||||
brf->sample_rate=(unsigned int)openair0_cfg->sample_rate;
|
||||
|
||||
memset(&brf->meta_rx, 0, sizeof(brf->meta_rx));
|
||||
memset(&brf->meta_tx, 0, sizeof(brf->meta_tx));
|
||||
|
||||
printf("\n[BRF] sampling_rate %d, num_buffers %d, buffer_size %d, num transfer %d, timeout_ms (rx %d, tx %d)\n",
|
||||
brf->sample_rate, brf->num_buffers, brf->buffer_size,brf->num_transfers, brf->rx_timeout_ms, brf->tx_timeout_ms);
|
||||
|
||||
if ((status=bladerf_open(&brf->dev, "")) != 0 ) {
|
||||
fprintf(stderr,"Failed to open brf device: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
@@ -217,83 +888,81 @@ int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openai
|
||||
printf("[BRF] Device does not operates at max speed, change the USB port\n");
|
||||
brf_error(BLADERF_ERR_UNSUPPORTED);
|
||||
}
|
||||
// RX
|
||||
// RX
|
||||
// Example of CLI output: RX Frequency: 2539999999Hz
|
||||
|
||||
if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg[card].rx_freq[0])) != 0){
|
||||
if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg->rx_freq[0])) != 0){
|
||||
fprintf(stderr,"Failed to set RX frequency: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
} else
|
||||
printf("[BRF] set RX frequency to %f\n",openair0_cfg[card].rx_freq[0]);
|
||||
printf("[BRF] set RX frequency to %u\n",(unsigned int)openair0_cfg->rx_freq[0]);
|
||||
|
||||
|
||||
if ((status=bladerf_set_sample_rate(brf->dev, BLADERF_MODULE_RX, (unsigned int)openair0_cfg[card].sample_rate, NULL)) != 0){
|
||||
|
||||
|
||||
unsigned int actual_value=0;
|
||||
if ((status=bladerf_set_sample_rate(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg->sample_rate, &actual_value)) != 0){
|
||||
fprintf(stderr,"Failed to set RX sample rate: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set RX sample rate to %f\n",openair0_cfg[card].sample_rate);
|
||||
}else
|
||||
printf("[BRF] set RX sample rate to %u, %u\n", (unsigned int) openair0_cfg->sample_rate, actual_value);
|
||||
|
||||
if ((status=bladerf_set_bandwidth(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg[card].rx_bw, NULL)) != 0){
|
||||
|
||||
if ((status=bladerf_set_bandwidth(brf->dev, BLADERF_MODULE_RX, (unsigned int) openair0_cfg->rx_bw*2, &actual_value)) != 0){
|
||||
fprintf(stderr,"Failed to set RX bandwidth: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set RX bandwidth to %f\n",openair0_cfg[card].rx_bw);
|
||||
printf("[BRF] set RX bandwidth to %u, %u\n",(unsigned int)openair0_cfg->rx_bw*2, actual_value);
|
||||
|
||||
if ((status=bladerf_set_gain(brf->dev, BLADERF_MODULE_RX, (int) openair0_cfg[card].rx_gain[0])) != 0) {
|
||||
set_rx_gain_offset(&openair0_cfg[0],0);
|
||||
if ((status=bladerf_set_gain(brf->dev, BLADERF_MODULE_RX, (int) openair0_cfg->rx_gain[0]-openair0_cfg[0].rx_gain_offset[0])) != 0) {
|
||||
fprintf(stderr,"Failed to set RX gain: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
} else
|
||||
printf("[BRF] set RX gain to %f\n",openair0_cfg[card].rx_gain[0]);
|
||||
printf("[BRF] set RX gain to %d (%d)\n",(int)(openair0_cfg->rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]),(int)openair0_cfg[0].rx_gain_offset[0]);
|
||||
|
||||
/* Configure the device's RX module for use with the sync interface.
|
||||
* SC16 Q11 samples *with* metadata are used. */
|
||||
if ((status=bladerf_sync_config(brf->dev, BLADERF_MODULE_RX, BLADERF_FORMAT_SC16_Q11_META,brf->num_buffers,brf->buffer_size,brf->num_transfers,brf->rx_timeout_ms)) != 0 ) {
|
||||
fprintf(stderr,"Failed to configure RX sync interface: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] configured Rx for sync interface \n");
|
||||
|
||||
/* We must always enable the RX module after calling bladerf_sync_config(), and
|
||||
* before attempting to RX samples via bladerf_sync_rx(). */
|
||||
if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_RX, true)) != 0) {
|
||||
fprintf(stderr,"Failed to enable RX module: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] RX module enabled \n");
|
||||
|
||||
// TX
|
||||
if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_TX, (unsigned int) openair0_cfg[card].tx_freq[0])) != 0){
|
||||
|
||||
if ((status=bladerf_set_frequency(brf->dev, BLADERF_MODULE_TX, (unsigned int) openair0_cfg->tx_freq[0])) != 0){
|
||||
fprintf(stderr,"Failed to set TX frequency: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set Tx Frequenct to %f \n", openair0_cfg[card].tx_freq[0]);
|
||||
printf("[BRF] set TX Frequency to %u\n", (unsigned int) openair0_cfg->tx_freq[0]);
|
||||
|
||||
if ((status=bladerf_set_sample_rate(brf->dev, BLADERF_MODULE_TX, (unsigned int) openair0_cfg[card].sample_rate, NULL)) != 0){
|
||||
if ((status=bladerf_set_sample_rate(brf->dev, BLADERF_MODULE_TX, (unsigned int) openair0_cfg->sample_rate, NULL)) != 0){
|
||||
fprintf(stderr,"Failed to set TX sample rate: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set Tx sampling rate to %f \n", openair0_cfg[card].sample_rate);
|
||||
printf("[BRF] set TX sampling rate to %u \n", (unsigned int) openair0_cfg->sample_rate);
|
||||
|
||||
if ((status=bladerf_set_bandwidth(brf->dev, BLADERF_MODULE_TX,(unsigned int)openair0_cfg[card].tx_bw, NULL)) != 0){
|
||||
fprintf(stderr, "Failed to set RX bandwidth: %s\n", bladerf_strerror(status));
|
||||
if ((status=bladerf_set_bandwidth(brf->dev, BLADERF_MODULE_TX,(unsigned int)openair0_cfg->tx_bw*2, NULL)) != 0){
|
||||
fprintf(stderr, "Failed to set TX bandwidth: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set Tx sampling ratebandwidth to %f \n", openair0_cfg[card].tx_bw);
|
||||
printf("[BRF] set TX bandwidth to %u \n", (unsigned int) openair0_cfg->tx_bw*2);
|
||||
|
||||
if ((status=bladerf_set_gain(brf->dev, BLADERF_MODULE_TX, (int)openair0_cfg[card].tx_gain[0])) != 0) {
|
||||
if ((status=bladerf_set_gain(brf->dev, BLADERF_MODULE_TX, (int) openair0_cfg->tx_gain[0])) != 0) {
|
||||
fprintf(stderr,"Failed to set TX gain: %s\n",bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] set the Tx gain to %f \n", openair0_cfg[card].tx_gain[0]);
|
||||
printf("[BRF] set the TX gain to %d\n", (int)openair0_cfg->tx_gain[0]);
|
||||
|
||||
|
||||
|
||||
/* Configure the device's TX module for use with the sync interface.
|
||||
/* Configure the device's TX module for use with the sync interface.
|
||||
* SC16 Q11 samples *with* metadata are used. */
|
||||
if ((status=bladerf_sync_config(brf->dev, BLADERF_MODULE_TX,BLADERF_FORMAT_SC16_Q11_META,brf->num_buffers,brf->buffer_size,brf->num_transfers,brf->tx_timeout_ms)) != 0 ) {
|
||||
fprintf(stderr,"Failed to configure TX sync interface: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] configured tx for sync interface \n");
|
||||
printf("[BRF] configured TX sync interface \n");
|
||||
|
||||
/* Configure the device's RX module for use with the sync interface.
|
||||
* SC16 Q11 samples *with* metadata are used. */
|
||||
if ((status=bladerf_sync_config(brf->dev, BLADERF_MODULE_RX, BLADERF_FORMAT_SC16_Q11_META,brf->num_buffers,brf->buffer_size,brf->num_transfers,brf->rx_timeout_ms)) != 0 ) {
|
||||
fprintf(stderr,"Failed to configure RX sync interface: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] configured Rx sync interface \n");
|
||||
|
||||
|
||||
/* We must always enable the TX module after calling bladerf_sync_config(), and
|
||||
* before attempting to TX samples via bladerf_sync_tx(). */
|
||||
@@ -303,7 +972,31 @@ int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openai
|
||||
} else
|
||||
printf("[BRF] TX module enabled \n");
|
||||
|
||||
bladerf_log_set_verbosity(get_brf_log_level(openair0_cfg[card].log_level));
|
||||
/* We must always enable the RX module after calling bladerf_sync_config(), and
|
||||
* before attempting to RX samples via bladerf_sync_rx(). */
|
||||
if ((status=bladerf_enable_module(brf->dev, BLADERF_MODULE_RX, true)) != 0) {
|
||||
fprintf(stderr,"Failed to enable RX module: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] RX module enabled \n");
|
||||
|
||||
// calibrate
|
||||
|
||||
if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_TX)) != 0) {
|
||||
fprintf(stderr,"Failed to calibrate TX DC: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
} else
|
||||
printf("[BRF] TX module calibrated DC \n");
|
||||
|
||||
if ((status=bladerf_calibrate_dc(brf->dev, BLADERF_MODULE_RX)) != 0) {
|
||||
fprintf(stderr,"Failed to calibrate RX DC: %s\n", bladerf_strerror(status));
|
||||
brf_error(status);
|
||||
}else
|
||||
printf("[BRF] RX module calibrated DC \n");
|
||||
|
||||
|
||||
|
||||
bladerf_log_set_verbosity(get_brf_log_level(openair0_cfg->log_level));
|
||||
|
||||
printf("BLADERF: Initializing openair0_device\n");
|
||||
device->priv = brf;
|
||||
@@ -317,7 +1010,11 @@ int openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openai
|
||||
device->trx_stop_func = trx_brf_stop;
|
||||
device->trx_set_freq_func = trx_brf_set_freq;
|
||||
device->trx_set_gains_func = trx_brf_set_gains;
|
||||
memcpy((void*)&device->openair0_cfg,(void*)openair0_cfg,sizeof(openair0_config_t));
|
||||
device->openair0_cfg = openair0_cfg;
|
||||
|
||||
calibrate_rf(device);
|
||||
|
||||
// memcpy((void*)&device->openair0_cfg,(void*)&openair0_cfg[0],sizeof(openair0_config_t));
|
||||
|
||||
return 0;
|
||||
}
|
||||
@@ -359,7 +1056,7 @@ struct bladerf * open_bladerf_from_serial(const char *serial) {
|
||||
int get_brf_log_level(int log_level){
|
||||
|
||||
int level=BLADERF_LOG_LEVEL_INFO;
|
||||
//return BLADERF_LOG_LEVEL_DEBUG;
|
||||
return BLADERF_LOG_LEVEL_DEBUG; // BLADERF_LOG_LEVEL_VERBOSE;// BLADERF_LOG_LEVEL_DEBUG; //
|
||||
switch(log_level) {
|
||||
case LOG_DEBUG:
|
||||
level=BLADERF_LOG_LEVEL_DEBUG;
|
||||
|
||||
@@ -193,7 +193,7 @@ struct openair0_device_t {
|
||||
func_type_t func_type;
|
||||
|
||||
/* RF frontend parameters set by application */
|
||||
openair0_config_t openair0_cfg;
|
||||
openair0_config_t *openair0_cfg;
|
||||
|
||||
/* Can be used by driver to hold internal structure*/
|
||||
void *priv;
|
||||
|
||||
@@ -0,0 +1,171 @@
|
||||
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 = 2680000000L;
|
||||
uplink_frequency_offset = -120000000;
|
||||
Nid_cell = 0;
|
||||
N_RB_DL = 50;
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 60;
|
||||
rx_gain = 60;
|
||||
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 = -26;
|
||||
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.13.11";
|
||||
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.13.10/24";
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
log_config :
|
||||
{
|
||||
global_log_level ="info";
|
||||
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";
|
||||
};
|
||||
|
||||
}
|
||||
);
|
||||
@@ -17,7 +17,7 @@ eNBs =
|
||||
|
||||
mobile_country_code = "208";
|
||||
|
||||
mobile_network_code = "92";
|
||||
mobile_network_code = "93";
|
||||
|
||||
////////// Physical parameters:
|
||||
|
||||
@@ -35,8 +35,8 @@ eNBs =
|
||||
Nid_cell_mbsfn = 0;
|
||||
nb_antennas_tx = 1;
|
||||
nb_antennas_rx = 1;
|
||||
tx_gain = 20;
|
||||
rx_gain = 20;
|
||||
tx_gain = 60;
|
||||
rx_gain = 120;
|
||||
prach_root = 0;
|
||||
prach_config_index = 0;
|
||||
prach_high_speed = "DISABLE";
|
||||
@@ -46,7 +46,7 @@ eNBs =
|
||||
pucch_nRB_CQI = 1;
|
||||
pucch_nCS_AN = 0;
|
||||
pucch_n1_AN = 32;
|
||||
pdsch_referenceSignalPower = -26;
|
||||
pdsch_referenceSignalPower = -29;
|
||||
pdsch_p_b = 0;
|
||||
pusch_n_SB = 1;
|
||||
pusch_enable64QAM = "DISABLE";
|
||||
@@ -132,7 +132,7 @@ eNBs =
|
||||
};
|
||||
|
||||
////////// MME parameters:
|
||||
mme_ip_address = ( { ipv4 = "192.168.13.11";
|
||||
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||
ipv6 = "192:168:30::17";
|
||||
active = "yes";
|
||||
preference = "ipv4";
|
||||
@@ -142,10 +142,10 @@ eNBs =
|
||||
NETWORK_INTERFACES :
|
||||
{
|
||||
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.212/24";
|
||||
|
||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24";
|
||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24";
|
||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
||||
};
|
||||
|
||||
|
||||
@@ -951,7 +951,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
|
||||
((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[0]=
|
||||
#ifdef EXMIMO
|
||||
((short*)dummy_tx_b)[2*i]<<4;
|
||||
#elif OAI_BLADRF
|
||||
#elif OAI_BLADERF
|
||||
((short*)dummy_tx_b)[2*i];
|
||||
#else
|
||||
((short*)dummy_tx_b)[2*i]<<4;
|
||||
@@ -959,7 +959,7 @@ void do_OFDM_mod_rt(int subframe,PHY_VARS_eNB *phy_vars_eNB)
|
||||
((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[1]=
|
||||
#ifdef EXMIMO
|
||||
((short*)dummy_tx_b)[2*i+1]<<4;
|
||||
#elif OAI_BLADRF
|
||||
#elif OAI_BLADERF
|
||||
((short*)dummy_tx_b)[2*i+1];
|
||||
#else
|
||||
((short*)dummy_tx_b)[2*i+1]<<4;
|
||||
@@ -1017,6 +1017,7 @@ static void* eNB_thread_tx( void* param )
|
||||
eNB_proc_t *proc = (eNB_proc_t*)param;
|
||||
FILE *tx_time_file;
|
||||
char tx_time_name[101];
|
||||
|
||||
if (opp_enabled == 1) {
|
||||
snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe);
|
||||
tx_time_file = fopen(tx_time_name,"w");
|
||||
@@ -1156,7 +1157,20 @@ static void* eNB_thread_tx( void* param )
|
||||
}
|
||||
|
||||
do_OFDM_mod_rt( proc->subframe_tx, PHY_vars_eNB_g[0][proc->CC_id] );
|
||||
|
||||
/*
|
||||
short *txdata = (short*)&PHY_vars_eNB_g[0][proc->CC_id]->lte_eNB_common_vars.txdata[0][0][proc->subframe_tx*PHY_vars_eNB_g[0][proc->CC_id]->lte_frame_parms.samples_per_tti];
|
||||
int i;
|
||||
for (i=0;i<7680*2;i+=8) {
|
||||
txdata[i] = 2047;
|
||||
txdata[i+1] = 0;
|
||||
txdata[i+2] = 0;
|
||||
txdata[i+3] = 2047;
|
||||
txdata[i+4] = -2047;
|
||||
txdata[i+5] = 0;
|
||||
txdata[i+6] = 0;
|
||||
txdata[i+7] = -2047;
|
||||
}
|
||||
*/
|
||||
if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
|
||||
LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe );
|
||||
exit_fun("nothing to add");
|
||||
@@ -1838,7 +1852,8 @@ static void* eNB_thread( void* arg )
|
||||
rt_sleep_ns(1000000);
|
||||
#endif
|
||||
|
||||
if ((tx_launched == 0) &&
|
||||
if ((frame>50) &&
|
||||
(tx_launched == 0) &&
|
||||
(rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {
|
||||
tx_launched = 1;
|
||||
|
||||
@@ -1907,52 +1922,53 @@ static void* eNB_thread( void* arg )
|
||||
#else
|
||||
int sf = hw_subframe;
|
||||
#endif
|
||||
|
||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
if (frame>50) {
|
||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||
#ifdef EXMIMO
|
||||
|
||||
if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx) != 0) {
|
||||
LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx);
|
||||
} else {
|
||||
// LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt);
|
||||
PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx++;
|
||||
pthread_mutex_unlock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx);
|
||||
|
||||
if (PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx == 0) {
|
||||
if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_tx) != 0) {
|
||||
LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n",sf);
|
||||
|
||||
if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx) != 0) {
|
||||
LOG_E(PHY,"[eNB] ERROR pthread_mutex_lock for eNB TX thread %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx);
|
||||
} else {
|
||||
// LOG_I(PHY,"[eNB] Waking up eNB process %d (IC %d)\n",sf,PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt);
|
||||
PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx++;
|
||||
pthread_mutex_unlock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx);
|
||||
|
||||
if (PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_tx == 0) {
|
||||
if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_tx) != 0) {
|
||||
LOG_E(PHY,"[eNB] ERROR pthread_cond_signal for eNB TX thread %d\n",sf);
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
} else {
|
||||
LOG_W(PHY,"[eNB] Frame %d, eNB TX thread %d busy!!\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_tx,sf);
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
} else {
|
||||
LOG_W(PHY,"[eNB] Frame %d, eNB TX thread %d busy!!\n",PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_tx,sf);
|
||||
exit_fun("nothing to add");
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx );
|
||||
exit_fun( "error locking mutex_rx" );
|
||||
break;
|
||||
}
|
||||
|
||||
int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx;
|
||||
|
||||
pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx );
|
||||
|
||||
if (cnt_rx == 0) {
|
||||
// the thread was presumably waiting where it should and can now be woken up
|
||||
if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf );
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id );
|
||||
exit_fun( "RX thread busy" );
|
||||
break;
|
||||
}
|
||||
if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_mutex_lock for eNB RX thread %d (IC %d)\n", sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx );
|
||||
exit_fun( "error locking mutex_rx" );
|
||||
break;
|
||||
}
|
||||
|
||||
int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx;
|
||||
|
||||
pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx );
|
||||
|
||||
if (cnt_rx == 0) {
|
||||
// the thread was presumably waiting where it should and can now be woken up
|
||||
if (pthread_cond_signal(&PHY_vars_eNB_g[0][CC_id]->proc[sf].cond_rx) != 0) {
|
||||
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf );
|
||||
exit_fun( "ERROR pthread_cond_signal" );
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
LOG_W( PHY, "[eNB] Frame %d, eNB RX thread %d busy!! instance_cnt %d CC_id %d\n", PHY_vars_eNB_g[0][CC_id]->proc[sf].frame_rx, sf, PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx, CC_id );
|
||||
exit_fun( "RX thread busy" );
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2902,9 +2918,8 @@ int main( int argc, char **argv )
|
||||
} else if (frame_parms[0]->N_RB_DL == 25) {
|
||||
openair0_cfg[card].sample_rate=7.68e6;
|
||||
openair0_cfg[card].samples_per_frame = 76800;
|
||||
openair0_cfg[card].tx_bw = 5e6;
|
||||
openair0_cfg[card].rx_bw = 5e6;
|
||||
|
||||
openair0_cfg[card].tx_bw = 2.5e6;
|
||||
openair0_cfg[card].rx_bw = 2.5e6;
|
||||
} else if (frame_parms[0]->N_RB_DL == 6) {
|
||||
openair0_cfg[card].sample_rate=1.92e6;
|
||||
openair0_cfg[card].samples_per_frame = 19200;
|
||||
@@ -2973,7 +2988,7 @@ int main( int argc, char **argv )
|
||||
openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB;
|
||||
}
|
||||
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;
|
||||
}
|
||||
|
||||
#if 0 // UHD 3.8
|
||||
|
||||
+17
-11
@@ -401,7 +401,7 @@ static void *UE_thread_synch(void *arg)
|
||||
|
||||
case pbch:
|
||||
|
||||
|
||||
LOG_I(PHY,"[UE thread Synch] Running Initial Synch\n");
|
||||
if (initial_sync( UE, UE->mode ) == 0) {
|
||||
|
||||
hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti;
|
||||
@@ -521,10 +521,6 @@ static void *UE_thread_synch(void *arg)
|
||||
for (i=0; i<openair0_cfg[card].rx_num_channels; i++) {
|
||||
openair0_cfg[card].rx_freq[i] = downlink_frequency[card][i]+freq_offset;
|
||||
openair0_cfg[card].tx_freq[i] = downlink_frequency[card][i]+uplink_frequency_offset[card][i]+freq_offset;
|
||||
#ifdef OAI_USRP
|
||||
openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
|
||||
|
||||
|
||||
#ifndef EXMIMO
|
||||
openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0);
|
||||
|
||||
@@ -532,6 +528,12 @@ static void *UE_thread_synch(void *arg)
|
||||
openair0_set_frequencies(&openair0,&openair0_cfg[0],0);
|
||||
|
||||
#endif
|
||||
|
||||
#ifdef OAI_USRP
|
||||
openair0_cfg[card].rx_gain[i] = UE->rx_total_gain_dB;//-USRP_GAIN_OFFSET;
|
||||
|
||||
|
||||
|
||||
switch(UE->lte_frame_parms.N_RB_DL) {
|
||||
case 6:
|
||||
openair0_cfg[card].rx_gain[i] -= 12;
|
||||
@@ -1105,10 +1107,10 @@ void *UE_thread(void *arg)
|
||||
|
||||
for (int i=0; i<UE->lte_frame_parms.nb_antennas_rx; i++)
|
||||
rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i];
|
||||
/*
|
||||
if (dummy_dump == 0)
|
||||
printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx);
|
||||
*/
|
||||
|
||||
/* if (dummy_dump == 0)
|
||||
printf("writing %d samples to %d (first_rx %d)\n",spp - ((first_rx==1) ? rx_off_diff : 0),rxpos,first_rx);*/
|
||||
|
||||
if (UE->mode != loop_through_memory) {
|
||||
rxs = openair0.trx_read_func(&openair0,
|
||||
×tamp,
|
||||
@@ -1117,8 +1119,11 @@ void *UE_thread(void *arg)
|
||||
UE->lte_frame_parms.nb_antennas_rx);
|
||||
|
||||
if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) {
|
||||
exit_fun("problem in rx");
|
||||
return &UE_thread_retval;
|
||||
printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs);
|
||||
if (UE->is_synchronized == 1) {
|
||||
exit_fun("problem in rx");
|
||||
return &UE_thread_retval;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1335,6 +1340,7 @@ void *UE_thread(void *arg)
|
||||
|
||||
#ifndef USRP_DEBUG
|
||||
if (UE->mode != loop_through_memory) {
|
||||
LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset);
|
||||
rxs = openair0.trx_read_func(&openair0,
|
||||
×tamp,
|
||||
(void**)rxdata,
|
||||
|
||||
Reference in New Issue
Block a user