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
|
#else
|
||||||
#ifndef OAI_USRP
|
#ifndef OAI_USRP
|
||||||
|
#ifndef OAI_BLADERF
|
||||||
phy_adjust_gain(phy_vars_ue,0);
|
phy_adjust_gain(phy_vars_ue,0);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|||||||
@@ -50,7 +50,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
extern int mac_get_rrc_status(uint8_t Mod_id,uint8_t eNB_flag,uint8_t index);
|
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"
|
#include "common_lib.h"
|
||||||
extern openair0_config_t openair0_cfg[];
|
extern openair0_config_t openair0_cfg[];
|
||||||
#endif
|
#endif
|
||||||
@@ -97,10 +97,10 @@ int dump_ue_stats(PHY_VARS_UE *phy_vars_ue, char* buffer, int length, runmode_t
|
|||||||
#ifdef EXMIMO
|
#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]);
|
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
|
#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);
|
len += sprintf(&buffer[len], "[UE PROC] RX Gain %d dB\n",phy_vars_ue->rx_total_gain_dB);
|
||||||
#endif
|
#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);
|
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
|
#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]);
|
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++) {
|
for (i=0; i<length>>1; i++) {
|
||||||
|
|
||||||
tmpE = vqaddq_s32(tmpE,vshrq_n_s32(vmull_s16(*in,*in),shift));
|
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
|
#else
|
||||||
#ifndef OAI_USRP
|
#ifndef OAI_USRP
|
||||||
|
#ifndef OAI_BLADERF
|
||||||
phy_adjust_gain (phy_vars_ue,0);
|
phy_adjust_gain (phy_vars_ue,0);
|
||||||
|
#endif
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
VCD_SIGNAL_DUMPER_DUMP_FUNCTION_BY_NAME(VCD_SIGNAL_DUMPER_FUNCTIONS_UE_GAIN_CONTROL, VCD_FUNCTION_OUT);
|
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 <inttypes.h>
|
||||||
#include "bladerf_lib.h"
|
#include "bladerf_lib.h"
|
||||||
|
|
||||||
|
#ifdef __SSE4_1__
|
||||||
|
# include <smmintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef __AVX2__
|
||||||
|
# include <immintrin.h>
|
||||||
|
#endif
|
||||||
|
|
||||||
int num_devices=0;
|
int num_devices=0;
|
||||||
/*These items configure the underlying asynch stream used by the the sync interface.
|
/*These items configure the underlying asynch stream used by the the sync interface.
|
||||||
*/
|
*/
|
||||||
@@ -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;
|
int status;
|
||||||
struct bladerf_metadata meta;
|
struct bladerf_metadata meta;
|
||||||
brf_state_t *brf = (brf_state_t*)device->priv;
|
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) {
|
if ((status=bladerf_get_timestamp(brf->dev, module, &meta.timestamp)) != 0) {
|
||||||
fprintf(stderr,"Failed to get current RX timestamp: %s\n",bladerf_strerror(status));
|
fprintf(stderr,"Failed to get current %s timestamp: %s\n",(module == BLADERF_MODULE_RX ) ? "RX" : "TX", bladerf_strerror(status));
|
||||||
} else {
|
return -1;
|
||||||
printf("Current TX timestampe 0x%016"PRIx64"\n", meta.timestamp);
|
} // else {printf("Current RX timestampe 0x%016"PRIx64"\n", meta.timestamp); }
|
||||||
}
|
|
||||||
return 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) {
|
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_state_t *brf = (brf_state_t*)device->priv;
|
||||||
/* BRF has only 1 rx/tx chaine : is it correct? */
|
/* 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;
|
//memset(&brf->meta_tx, 0, sizeof(brf->meta_tx));
|
||||||
brf->meta_tx.flags = BLADERF_META_FLAG_TX_BURST_START |
|
// When BLADERF_META_FLAG_TX_NOW is used the timestamp is not used, so one can't schedule a tx
|
||||||
BLADERF_META_FLAG_TX_NOW |
|
if (brf->meta_tx.flags == 0 )
|
||||||
BLADERF_META_FLAG_TX_BURST_END;
|
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;
|
|
||||||
|
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);
|
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) {
|
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->num_tx_errors++;
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
} else if (brf->meta_tx.status & BLADERF_META_STATUS_UNDERRUN){
|
} 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);
|
fprintf(stderr, "TX Underrun detected. %u valid samples were read.\n", brf->meta_tx.actual_count);
|
||||||
brf->num_underflows++;
|
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);
|
// printf("tx status %d \n",brf->meta_tx.status);
|
||||||
brf->tx_current_ts=brf->meta_tx.timestamp;
|
brf->tx_current_ts=brf->meta_tx.timestamp;
|
||||||
brf->tx_actual_nsamps+=brf->meta_tx.actual_count;
|
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) {
|
static int trx_brf_read(openair0_device *device, openair0_timestamp *ptimestamp, void **buff, int nsamps, int cc) {
|
||||||
int status, ret;
|
|
||||||
|
int status=0;
|
||||||
unsigned int i;
|
|
||||||
brf_state_t *brf = (brf_state_t*)device->priv;
|
brf_state_t *brf = (brf_state_t*)device->priv;
|
||||||
|
|
||||||
// BRF has only one rx/tx chain
|
// BRF has only one rx/tx chain
|
||||||
void *samples = (void*)buff[0];
|
int16_t *samples = (int16_t*)buff[0];
|
||||||
|
|
||||||
brf->meta_rx.flags |= BLADERF_META_FLAG_RX_NOW;
|
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);
|
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) {
|
if (status != 0) {
|
||||||
fprintf(stderr, "RX failed: %s\n", bladerf_strerror(status));
|
fprintf(stderr, "RX failed: %s\n", bladerf_strerror(status));
|
||||||
|
// printf("RX failed: %s\n", bladerf_strerror(status));
|
||||||
brf->num_rx_errors++;
|
brf->num_rx_errors++;
|
||||||
} else if ( brf->meta_rx.status & BLADERF_META_STATUS_OVERRUN) {
|
} else if ( brf->meta_rx.status & BLADERF_META_STATUS_OVERRUN) {
|
||||||
brf->num_overflows++;
|
brf->num_overflows++;
|
||||||
fprintf(stderr, "RX overrun (%d) is detected. t=0x%"PRIu64". Got %u samples. nsymps %d\n",
|
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);
|
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("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));
|
//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_current_ts=brf->meta_rx.timestamp;
|
||||||
brf->rx_actual_nsamps+=brf->meta_rx.actual_count;
|
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;
|
*ptimestamp = brf->meta_rx.timestamp;
|
||||||
|
|
||||||
return brf->meta_rx.actual_count;
|
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 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);
|
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 openair0_dev_init_bladerf(openair0_device *device, openair0_config_t *openair0_cfg) {
|
||||||
|
|
||||||
int status;
|
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));
|
brf_state_t *brf = (brf_state_t*)malloc(sizeof(brf_state_t));
|
||||||
memset(brf, 0, sizeof(brf_state_t));
|
memset(brf, 0, sizeof(brf_state_t));
|
||||||
// init required params for BRF
|
// init required params
|
||||||
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;
|
|
||||||
|
|
||||||
|
switch ((int)openair0_cfg->sample_rate) {
|
||||||
printf("\n[BRF] sampling_rate %d, num_buffers %d, buffer_size %d, num transfer %d, timeout_ms (rx %d, tx %d)\n",
|
case 30720000:
|
||||||
brf->sample_rate, brf->num_buffers, brf->buffer_size,brf->num_transfers, brf->rx_timeout_ms, brf->tx_timeout_ms);
|
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 ) {
|
if ((status=bladerf_open(&brf->dev, "")) != 0 ) {
|
||||||
fprintf(stderr,"Failed to open brf device: %s\n",bladerf_strerror(status));
|
fprintf(stderr,"Failed to open brf device: %s\n",bladerf_strerror(status));
|
||||||
brf_error(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");
|
printf("[BRF] Device does not operates at max speed, change the USB port\n");
|
||||||
brf_error(BLADERF_ERR_UNSUPPORTED);
|
brf_error(BLADERF_ERR_UNSUPPORTED);
|
||||||
}
|
}
|
||||||
// RX
|
// RX
|
||||||
// Example of CLI output: RX Frequency: 2539999999Hz
|
// 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));
|
fprintf(stderr,"Failed to set RX frequency: %s\n",bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
} else
|
} 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));
|
fprintf(stderr,"Failed to set RX sample rate: %s\n", bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}else
|
||||||
printf("[BRF] set RX sample rate to %f\n",openair0_cfg[card].sample_rate);
|
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));
|
fprintf(stderr,"Failed to set RX bandwidth: %s\n", bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}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));
|
fprintf(stderr,"Failed to set RX gain: %s\n",bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
} else
|
} 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
|
// 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));
|
fprintf(stderr,"Failed to set TX frequency: %s\n",bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}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));
|
fprintf(stderr,"Failed to set TX sample rate: %s\n", bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}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){
|
if ((status=bladerf_set_bandwidth(brf->dev, BLADERF_MODULE_TX,(unsigned int)openair0_cfg->tx_bw*2, NULL)) != 0){
|
||||||
fprintf(stderr, "Failed to set RX bandwidth: %s\n", bladerf_strerror(status));
|
fprintf(stderr, "Failed to set TX bandwidth: %s\n", bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}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));
|
fprintf(stderr,"Failed to set TX gain: %s\n",bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}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. */
|
* 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 ) {
|
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));
|
fprintf(stderr,"Failed to configure TX sync interface: %s\n", bladerf_strerror(status));
|
||||||
brf_error(status);
|
brf_error(status);
|
||||||
}else
|
}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
|
/* We must always enable the TX module after calling bladerf_sync_config(), and
|
||||||
* before attempting to TX samples via bladerf_sync_tx(). */
|
* 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
|
} else
|
||||||
printf("[BRF] TX module enabled \n");
|
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");
|
printf("BLADERF: Initializing openair0_device\n");
|
||||||
device->priv = brf;
|
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_stop_func = trx_brf_stop;
|
||||||
device->trx_set_freq_func = trx_brf_set_freq;
|
device->trx_set_freq_func = trx_brf_set_freq;
|
||||||
device->trx_set_gains_func = trx_brf_set_gains;
|
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;
|
return 0;
|
||||||
}
|
}
|
||||||
@@ -359,7 +1056,7 @@ struct bladerf * open_bladerf_from_serial(const char *serial) {
|
|||||||
int get_brf_log_level(int log_level){
|
int get_brf_log_level(int log_level){
|
||||||
|
|
||||||
int level=BLADERF_LOG_LEVEL_INFO;
|
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) {
|
switch(log_level) {
|
||||||
case LOG_DEBUG:
|
case LOG_DEBUG:
|
||||||
level=BLADERF_LOG_LEVEL_DEBUG;
|
level=BLADERF_LOG_LEVEL_DEBUG;
|
||||||
|
|||||||
@@ -193,7 +193,7 @@ struct openair0_device_t {
|
|||||||
func_type_t func_type;
|
func_type_t func_type;
|
||||||
|
|
||||||
/* RF frontend parameters set by application */
|
/* 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*/
|
/* Can be used by driver to hold internal structure*/
|
||||||
void *priv;
|
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_country_code = "208";
|
||||||
|
|
||||||
mobile_network_code = "92";
|
mobile_network_code = "93";
|
||||||
|
|
||||||
////////// Physical parameters:
|
////////// Physical parameters:
|
||||||
|
|
||||||
@@ -35,8 +35,8 @@ eNBs =
|
|||||||
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 = 20;
|
tx_gain = 60;
|
||||||
rx_gain = 20;
|
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";
|
||||||
@@ -46,7 +46,7 @@ eNBs =
|
|||||||
pucch_nRB_CQI = 1;
|
pucch_nRB_CQI = 1;
|
||||||
pucch_nCS_AN = 0;
|
pucch_nCS_AN = 0;
|
||||||
pucch_n1_AN = 32;
|
pucch_n1_AN = 32;
|
||||||
pdsch_referenceSignalPower = -26;
|
pdsch_referenceSignalPower = -29;
|
||||||
pdsch_p_b = 0;
|
pdsch_p_b = 0;
|
||||||
pusch_n_SB = 1;
|
pusch_n_SB = 1;
|
||||||
pusch_enable64QAM = "DISABLE";
|
pusch_enable64QAM = "DISABLE";
|
||||||
@@ -132,7 +132,7 @@ eNBs =
|
|||||||
};
|
};
|
||||||
|
|
||||||
////////// MME parameters:
|
////////// MME parameters:
|
||||||
mme_ip_address = ( { ipv4 = "192.168.13.11";
|
mme_ip_address = ( { ipv4 = "192.168.12.11";
|
||||||
ipv6 = "192:168:30::17";
|
ipv6 = "192:168:30::17";
|
||||||
active = "yes";
|
active = "yes";
|
||||||
preference = "ipv4";
|
preference = "ipv4";
|
||||||
@@ -142,10 +142,10 @@ eNBs =
|
|||||||
NETWORK_INTERFACES :
|
NETWORK_INTERFACES :
|
||||||
{
|
{
|
||||||
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1_MME = "eth0";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.13.10/24";
|
ENB_IPV4_ADDRESS_FOR_S1_MME = "192.168.12.212/24";
|
||||||
|
|
||||||
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
ENB_INTERFACE_NAME_FOR_S1U = "eth0";
|
||||||
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.13.10/24";
|
ENB_IPV4_ADDRESS_FOR_S1U = "192.168.12.212/24";
|
||||||
ENB_PORT_FOR_S1U = 2152; # Spec 2152
|
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]=
|
((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[0]=
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
((short*)dummy_tx_b)[2*i]<<4;
|
((short*)dummy_tx_b)[2*i]<<4;
|
||||||
#elif OAI_BLADRF
|
#elif OAI_BLADERF
|
||||||
((short*)dummy_tx_b)[2*i];
|
((short*)dummy_tx_b)[2*i];
|
||||||
#else
|
#else
|
||||||
((short*)dummy_tx_b)[2*i]<<4;
|
((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]=
|
((short*)&phy_vars_eNB->lte_eNB_common_vars.txdata[0][aa][tx_offset])[1]=
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
((short*)dummy_tx_b)[2*i+1]<<4;
|
((short*)dummy_tx_b)[2*i+1]<<4;
|
||||||
#elif OAI_BLADRF
|
#elif OAI_BLADERF
|
||||||
((short*)dummy_tx_b)[2*i+1];
|
((short*)dummy_tx_b)[2*i+1];
|
||||||
#else
|
#else
|
||||||
((short*)dummy_tx_b)[2*i+1]<<4;
|
((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;
|
eNB_proc_t *proc = (eNB_proc_t*)param;
|
||||||
FILE *tx_time_file;
|
FILE *tx_time_file;
|
||||||
char tx_time_name[101];
|
char tx_time_name[101];
|
||||||
|
|
||||||
if (opp_enabled == 1) {
|
if (opp_enabled == 1) {
|
||||||
snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe);
|
snprintf(tx_time_name, 100,"/tmp/%s_tx_time_thread_sf_%d", "eNB", proc->subframe);
|
||||||
tx_time_file = fopen(tx_time_name,"w");
|
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] );
|
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) {
|
if (pthread_mutex_lock(&proc->mutex_tx) != 0) {
|
||||||
LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe );
|
LOG_E( PHY, "[SCHED][eNB] error locking mutex for eNB TX proc %d\n", proc->subframe );
|
||||||
exit_fun("nothing to add");
|
exit_fun("nothing to add");
|
||||||
@@ -1838,7 +1852,8 @@ static void* eNB_thread( void* arg )
|
|||||||
rt_sleep_ns(1000000);
|
rt_sleep_ns(1000000);
|
||||||
#endif
|
#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))) {
|
(rx_pos >= (((2*hw_subframe)+1)*PHY_vars_eNB_g[0][0]->lte_frame_parms.samples_per_tti>>1))) {
|
||||||
tx_launched = 1;
|
tx_launched = 1;
|
||||||
|
|
||||||
@@ -1907,52 +1922,53 @@ static void* eNB_thread( void* arg )
|
|||||||
#else
|
#else
|
||||||
int sf = hw_subframe;
|
int sf = hw_subframe;
|
||||||
#endif
|
#endif
|
||||||
|
if (frame>50) {
|
||||||
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
for (int CC_id=0; CC_id<MAX_NUM_CCs; CC_id++) {
|
||||||
#ifdef EXMIMO
|
#ifdef EXMIMO
|
||||||
|
|
||||||
if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_tx) != 0) {
|
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);
|
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 {
|
} 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);
|
// 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++;
|
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);
|
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 (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) {
|
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);
|
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");
|
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
|
#endif
|
||||||
|
|
||||||
if (pthread_mutex_lock(&PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx) != 0) {
|
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 );
|
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" );
|
exit_fun( "error locking mutex_rx" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
int cnt_rx = ++PHY_vars_eNB_g[0][CC_id]->proc[sf].instance_cnt_rx;
|
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 );
|
pthread_mutex_unlock( &PHY_vars_eNB_g[0][CC_id]->proc[sf].mutex_rx );
|
||||||
|
|
||||||
if (cnt_rx == 0) {
|
if (cnt_rx == 0) {
|
||||||
// the thread was presumably waiting where it should and can now be woken up
|
// 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) {
|
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 );
|
LOG_E( PHY, "[eNB] ERROR pthread_cond_signal for eNB RX thread %d\n", sf );
|
||||||
exit_fun( "ERROR pthread_cond_signal" );
|
exit_fun( "ERROR pthread_cond_signal" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
} else {
|
} 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 );
|
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" );
|
exit_fun( "RX thread busy" );
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2902,9 +2918,8 @@ int main( int argc, char **argv )
|
|||||||
} else if (frame_parms[0]->N_RB_DL == 25) {
|
} else if (frame_parms[0]->N_RB_DL == 25) {
|
||||||
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 = 5e6;
|
openair0_cfg[card].tx_bw = 2.5e6;
|
||||||
openair0_cfg[card].rx_bw = 5e6;
|
openair0_cfg[card].rx_bw = 2.5e6;
|
||||||
|
|
||||||
} else if (frame_parms[0]->N_RB_DL == 6) {
|
} else if (frame_parms[0]->N_RB_DL == 6) {
|
||||||
openair0_cfg[card].sample_rate=1.92e6;
|
openair0_cfg[card].sample_rate=1.92e6;
|
||||||
openair0_cfg[card].samples_per_frame = 19200;
|
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;
|
openair0_cfg[card].rx_gain[i] = PHY_vars_eNB_g[0][0]->rx_total_gain_eNB_dB;
|
||||||
}
|
}
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if 0 // UHD 3.8
|
#if 0 // UHD 3.8
|
||||||
|
|||||||
+17
-11
@@ -401,7 +401,7 @@ static void *UE_thread_synch(void *arg)
|
|||||||
|
|
||||||
case pbch:
|
case pbch:
|
||||||
|
|
||||||
|
LOG_I(PHY,"[UE thread Synch] Running Initial Synch\n");
|
||||||
if (initial_sync( UE, UE->mode ) == 0) {
|
if (initial_sync( UE, UE->mode ) == 0) {
|
||||||
|
|
||||||
hw_slot_offset = (UE->rx_offset<<1) / UE->lte_frame_parms.samples_per_tti;
|
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++) {
|
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].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;
|
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
|
#ifndef EXMIMO
|
||||||
openair0.trx_set_freq_func(&openair0,&openair0_cfg[0],0);
|
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);
|
openair0_set_frequencies(&openair0,&openair0_cfg[0],0);
|
||||||
|
|
||||||
#endif
|
#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) {
|
switch(UE->lte_frame_parms.N_RB_DL) {
|
||||||
case 6:
|
case 6:
|
||||||
openair0_cfg[card].rx_gain[i] -= 12;
|
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++)
|
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];
|
rxp[i] = (dummy_dump==0) ? (void*)&rxdata[i][rxpos] : (void*)dummy[i];
|
||||||
/*
|
|
||||||
if (dummy_dump == 0)
|
/* 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);
|
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) {
|
if (UE->mode != loop_through_memory) {
|
||||||
rxs = openair0.trx_read_func(&openair0,
|
rxs = openair0.trx_read_func(&openair0,
|
||||||
×tamp,
|
×tamp,
|
||||||
@@ -1117,8 +1119,11 @@ void *UE_thread(void *arg)
|
|||||||
UE->lte_frame_parms.nb_antennas_rx);
|
UE->lte_frame_parms.nb_antennas_rx);
|
||||||
|
|
||||||
if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) {
|
if (rxs != (spp- ((first_rx==1) ? rx_off_diff : 0))) {
|
||||||
exit_fun("problem in rx");
|
printf("rx error: asked %d got %d ",spp - ((first_rx==1) ? rx_off_diff : 0),rxs);
|
||||||
return &UE_thread_retval;
|
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
|
#ifndef USRP_DEBUG
|
||||||
if (UE->mode != loop_through_memory) {
|
if (UE->mode != loop_through_memory) {
|
||||||
|
LOG_I(PHY,"Resynchronizing RX by %d samples\n",UE->rx_offset);
|
||||||
rxs = openair0.trx_read_func(&openair0,
|
rxs = openair0.trx_read_func(&openair0,
|
||||||
×tamp,
|
×tamp,
|
||||||
(void**)rxdata,
|
(void**)rxdata,
|
||||||
|
|||||||
Reference in New Issue
Block a user