initial LMS7002M register configuration. modifications for lte-ue and rf_device to use LimeSDR.
This commit is contained in:
@@ -136,7 +136,7 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
#ifdef DEBUG_OFDM_MOD
|
#ifdef DEBUG_OFDM_MOD
|
||||||
printf("[PHY] symbol %d/%d offset %d (%p,%p -> %p)\n",i,nb_symbols,i*fftsize+(i*nb_prefix_samples),input,&input[i*fftsize],&output[(i*fftsize) + ((i)*nb_prefix_samples)]);
|
printf("[PHY] symbol %d/%d offset %d (%p,%p -> %p)\n",i,nb_symbols,i*fftsize+(i*nb_prefix_samples),input,&input[i*fftsize],&output[(i*fftsize) + ((i)*nb_prefix_samples)]);
|
||||||
#endif
|
#endif
|
||||||
|
/*
|
||||||
#ifndef __AVX2__
|
#ifndef __AVX2__
|
||||||
// handle 128-bit alignment for 128-bit SIMD (SSE4,NEON,AltiVEC)
|
// handle 128-bit alignment for 128-bit SIMD (SSE4,NEON,AltiVEC)
|
||||||
idft((int16_t *)&input[i*fftsize],
|
idft((int16_t *)&input[i*fftsize],
|
||||||
@@ -149,7 +149,11 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
1);
|
1);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
*/
|
||||||
|
|
||||||
|
idft((int16_t *)&input[i*fftsize],
|
||||||
|
(int16_t *)temp,
|
||||||
|
1);
|
||||||
// Copy to frame buffer with Cyclic Extension
|
// Copy to frame buffer with Cyclic Extension
|
||||||
// Note: will have to adjust for synchronization offset!
|
// Note: will have to adjust for synchronization offset!
|
||||||
|
|
||||||
@@ -160,12 +164,12 @@ void PHY_ofdm_mod(int *input, /// pointer to complex input
|
|||||||
|
|
||||||
|
|
||||||
// msg("Doing cyclic prefix method\n");
|
// msg("Doing cyclic prefix method\n");
|
||||||
|
/*
|
||||||
#ifndef __AVX2__
|
#ifndef __AVX2__
|
||||||
if (fftsize==128)
|
if (fftsize==128)
|
||||||
#else
|
#else
|
||||||
if (fftsize<=512)
|
if (fftsize<=512)
|
||||||
#endif
|
#endif*/
|
||||||
{
|
{
|
||||||
for (j=0; j<fftsize ; j++) {
|
for (j=0; j<fftsize ; j++) {
|
||||||
output_ptr[j] = temp_ptr[j];
|
output_ptr[j] = temp_ptr[j];
|
||||||
|
|||||||
@@ -362,6 +362,9 @@ struct openair0_device_t {
|
|||||||
*/
|
*/
|
||||||
int (*trx_set_gains_func)(openair0_device* device, openair0_config_t *openair0_cfg);
|
int (*trx_set_gains_func)(openair0_device* device, openair0_config_t *openair0_cfg);
|
||||||
|
|
||||||
|
/*! \brief Indicator that device is running
|
||||||
|
*/
|
||||||
|
int trx_started;
|
||||||
};
|
};
|
||||||
|
|
||||||
/* type of device init function, implemented in shared lib */
|
/* type of device init function, implemented in shared lib */
|
||||||
|
|||||||
Executable
+1128
File diff suppressed because it is too large
Load Diff
+1128
File diff suppressed because it is too large
Load Diff
Executable
+1128
File diff suppressed because it is too large
Load Diff
+1128
File diff suppressed because it is too large
Load Diff
@@ -132,26 +132,37 @@ void set_rx_gain_offset(openair0_config_t *openair0_cfg, int chain_index) {
|
|||||||
*/
|
*/
|
||||||
int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
|
int trx_lms_set_gains(openair0_device* device, openair0_config_t *openair0_cfg) {
|
||||||
|
|
||||||
|
int ret=0;
|
||||||
|
|
||||||
|
double rxg_ratio = openair0_cfg[0].rx_gain[0]/openair0_cfg[0].rx_gain_offset[0];
|
||||||
|
if (rxg_ratio > 1) {
|
||||||
|
printf("[LMS] Reduce RX Gain 0 by %f dB\n",openair0_cfg[0].rx_gain[0]-openair0_cfg[0].rx_gain_offset[0]);
|
||||||
|
ret = -1;
|
||||||
|
rxg_ratio = 1;
|
||||||
|
}
|
||||||
|
|
||||||
LMS_SetNormalizedGain(lms_device, LMS_CH_TX, 0, openair0_cfg[0].tx_gain[0]/100.0);
|
LMS_SetNormalizedGain(lms_device, LMS_CH_TX, 0, openair0_cfg[0].tx_gain[0]/100.0);
|
||||||
|
LMS_SetNormalizedGain(lms_device, LMS_CH_RX, 0, .8*rxg_ratio);
|
||||||
|
/*
|
||||||
// RX gains, use low-level setting
|
// RX gains, use low-level setting
|
||||||
|
|
||||||
double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0];
|
double gv = openair0_cfg[0].rx_gain[0] - openair0_cfg[0].rx_gain_offset[0];
|
||||||
if (gv > 31) {
|
if (gv > 31) {
|
||||||
printf("RX Gain 0 too high, reduce by %f dB\n",gv-31);
|
printf("RX Gain 0 too high, reduce by %f dB\n",gv-31);
|
||||||
gv = 31;
|
gv = 31;
|
||||||
|
ret=-1;
|
||||||
}
|
}
|
||||||
if (gv < 0) {
|
if (gv < 0) {
|
||||||
printf("RX Gain 0 too low, increase by %f dB\n",-gv);
|
printf("RX Gain 0 too low, increase by %f dB\n",-gv);
|
||||||
gv = 0;
|
gv = 0;
|
||||||
|
ret=-1;
|
||||||
}
|
}
|
||||||
printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv);
|
printf("[LMS] Setting 7002M G_PGA_RBB to %d\n", (int16_t)gv);
|
||||||
LMS7002M lms7;
|
LMS7002M lms7;
|
||||||
lms7.SetConnection(lms7.GetConnection());
|
lms7.SetConnection(lms7.GetConnection());
|
||||||
lms7.Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv);
|
lms7.Modify_SPI_Reg_bits(LMS7param(G_PGA_RBB),(int16_t)gv);
|
||||||
|
*/
|
||||||
|
|
||||||
|
return(ret);
|
||||||
return(0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Start LMSSDR
|
/*! \brief Start LMSSDR
|
||||||
@@ -163,6 +174,7 @@ int trx_lms_start(openair0_device *device){
|
|||||||
lms_info_str_t list[16]={0};
|
lms_info_str_t list[16]={0};
|
||||||
|
|
||||||
int n= LMS_GetDeviceList(list);
|
int n= LMS_GetDeviceList(list);
|
||||||
|
int ret;
|
||||||
|
|
||||||
if (n <= 0) {
|
if (n <= 0) {
|
||||||
fprintf(stderr, "No LimeSDR board found: %s\n", n < 0?LMS_GetLastErrorMessage():"");
|
fprintf(stderr, "No LimeSDR board found: %s\n", n < 0?LMS_GetLastErrorMessage():"");
|
||||||
@@ -212,9 +224,9 @@ int trx_lms_start(openair0_device *device){
|
|||||||
}
|
}
|
||||||
printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6);
|
printf("Set TX frequency %f MHz\n",device->openair0_cfg[0].tx_freq[0]/1e6);
|
||||||
|
|
||||||
printf("Override antenna settings to: RX1_H, TXA_2");
|
// printf("Override antenna settings to: RX1_H, TXA_2");
|
||||||
LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 1);
|
// LMS_SetAntenna(lms_device, LMS_CH_RX, 0, 1);
|
||||||
LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2);
|
// LMS_SetAntenna(lms_device, LMS_CH_TX, 0, 2);
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -245,7 +257,7 @@ int trx_lms_start(openair0_device *device){
|
|||||||
tx_stream.dataFmt = lms_stream_t::LMS_FMT_I12;
|
tx_stream.dataFmt = lms_stream_t::LMS_FMT_I12;
|
||||||
tx_stream.isTx = true;
|
tx_stream.isTx = true;
|
||||||
|
|
||||||
trx_lms_set_gains(device, device->openair0_cfg);
|
if ((ret = trx_lms_set_gains(device, device->openair0_cfg))<0) return(-1);
|
||||||
|
|
||||||
if (LMS_SetupStream(lms_device, &tx_stream)!=0)
|
if (LMS_SetupStream(lms_device, &tx_stream)!=0)
|
||||||
printf("TX stream setup failed %s\n",LMS_GetLastErrorMessage());
|
printf("TX stream setup failed %s\n",LMS_GetLastErrorMessage());
|
||||||
@@ -259,6 +271,7 @@ int trx_lms_start(openair0_device *device){
|
|||||||
printf("Failed to start TX stream %s\n",LMS_GetLastErrorMessage());
|
printf("Failed to start TX stream %s\n",LMS_GetLastErrorMessage());
|
||||||
if (LMS_StartStream(&tx_stream)!=0)
|
if (LMS_StartStream(&tx_stream)!=0)
|
||||||
printf("Failed to start Rx stream %s\n",LMS_GetLastErrorMessage());
|
printf("Failed to start Rx stream %s\n",LMS_GetLastErrorMessage());
|
||||||
|
device->trx_started=1;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -272,6 +285,7 @@ int trx_lms_stop(openair0_device *device) {
|
|||||||
LMS_DestroyStream(lms_device,&rx_stream);
|
LMS_DestroyStream(lms_device,&rx_stream);
|
||||||
LMS_DestroyStream(lms_device,&tx_stream);
|
LMS_DestroyStream(lms_device,&tx_stream);
|
||||||
LMS_Close(lms_device);
|
LMS_Close(lms_device);
|
||||||
|
device->trx_started=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Set frequencies (TX/RX)
|
/*! \brief Set frequencies (TX/RX)
|
||||||
@@ -292,14 +306,22 @@ int trx_lms_set_freq(openair0_device* device, openair0_config_t *openair0_cfg,in
|
|||||||
|
|
||||||
// 31 = 19 dB => 105 dB total gain @ 2.6 GHz
|
// 31 = 19 dB => 105 dB total gain @ 2.6 GHz
|
||||||
/*! \brief calibration table for LMSSDR */
|
/*! \brief calibration table for LMSSDR */
|
||||||
|
// V1.2 board
|
||||||
|
rx_gain_calib_table_t calib_table_lmssdr_1v2[] = {
|
||||||
|
{3500000000.0,44.0}, // on L PAD
|
||||||
|
{2660000000.0,62.0}, // on L PAD
|
||||||
|
{2300000000.0,62.0}, // on L PAD
|
||||||
|
{1880000000.0,64.0}, // on L PAD
|
||||||
|
{816000000.0,79.0}, // on W PAD
|
||||||
|
{-1,0}};
|
||||||
|
// V1.4 board
|
||||||
rx_gain_calib_table_t calib_table_lmssdr[] = {
|
rx_gain_calib_table_t calib_table_lmssdr[] = {
|
||||||
{3500000000.0,70.0},
|
{3500000000.0,97.0}, // on H PAD
|
||||||
{2660000000.0,80.0},
|
{2660000000.0,110.0}, // on H PAD
|
||||||
{2300000000.0,80.0},
|
{2300000000.0,106.0}, // on H PAD
|
||||||
{1880000000.0,74.0}, // on W PAD
|
{1880000000.0,106.0}, // on H PAD
|
||||||
{816000000.0,76.0}, // on W PAD
|
{816000000.0,102.0}, // on W PAD
|
||||||
{-1,0}};
|
{-1,0}};
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -332,7 +354,7 @@ int trx_lms_reset_stats(openair0_device* device) {
|
|||||||
*/
|
*/
|
||||||
void trx_lms_end(openair0_device *device) {
|
void trx_lms_end(openair0_device *device) {
|
||||||
|
|
||||||
|
device->trx_started=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
extern "C" {
|
extern "C" {
|
||||||
|
|||||||
@@ -137,6 +137,8 @@ static int trx_usrp_start(openair0_device *device)
|
|||||||
s->tx_count = 0;
|
s->tx_count = 0;
|
||||||
s->rx_timestamp = 0;
|
s->rx_timestamp = 0;
|
||||||
|
|
||||||
|
device->trx_started=1;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
/*! \brief Terminate operation of the USRP transceiver -- free all associated resources
|
/*! \brief Terminate operation of the USRP transceiver -- free all associated resources
|
||||||
@@ -152,7 +154,7 @@ static void trx_usrp_end(openair0_device *device)
|
|||||||
s->tx_md.end_of_burst = true;
|
s->tx_md.end_of_burst = true;
|
||||||
s->tx_stream->send("", 0, s->tx_md);
|
s->tx_stream->send("", 0, s->tx_md);
|
||||||
s->tx_md.end_of_burst = false;
|
s->tx_md.end_of_burst = false;
|
||||||
|
device->trx_started=0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*! \brief Called to send samples to the USRP RF target
|
/*! \brief Called to send samples to the USRP RF target
|
||||||
@@ -453,6 +455,7 @@ int trx_usrp_set_gains(openair0_device* device,
|
|||||||
* \param card refers to the hardware index to use
|
* \param card refers to the hardware index to use
|
||||||
*/
|
*/
|
||||||
int trx_usrp_stop(openair0_device* device) {
|
int trx_usrp_stop(openair0_device* device) {
|
||||||
|
device->trx_started=0;
|
||||||
return(0);
|
return(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -368,14 +368,15 @@ static void *UE_thread_synch(void *arg)
|
|||||||
while (sync_var<0)
|
while (sync_var<0)
|
||||||
pthread_cond_wait(&sync_cond, &sync_mutex);
|
pthread_cond_wait(&sync_cond, &sync_mutex);
|
||||||
|
|
||||||
pthread_mutex_unlock(&sync_mutex);
|
|
||||||
printf("Started device, unlocked sync_mutex (UE_sync_thread)\n");
|
|
||||||
|
|
||||||
if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) {
|
if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) {
|
||||||
LOG_E(HW,"Could not start the device\n");
|
LOG_E(HW,"Could not start the device\n");
|
||||||
oai_exit=1;
|
oai_exit=1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
pthread_mutex_unlock(&sync_mutex);
|
||||||
|
printf("Started device, unlocked sync_mutex (UE_sync_thread)\n");
|
||||||
|
|
||||||
while (oai_exit==0) {
|
while (oai_exit==0) {
|
||||||
|
|
||||||
if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) {
|
if (pthread_mutex_lock(&UE->proc.mutex_synch) != 0) {
|
||||||
@@ -485,13 +486,14 @@ static void *UE_thread_synch(void *arg)
|
|||||||
|
|
||||||
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
UE->rfdevice.trx_set_freq_func(&UE->rfdevice,&openair0_cfg[0],0);
|
||||||
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
|
//UE->rfdevice.trx_set_gains_func(&openair0,&openair0_cfg[0]);
|
||||||
UE->rfdevice.trx_stop_func(&UE->rfdevice);
|
|
||||||
sleep(1);
|
//UE->rfdevice.trx_stop_func(&UE->rfdevice);
|
||||||
init_frame_parms(&UE->frame_parms,1);
|
// sleep(1);
|
||||||
if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) {
|
// init_frame_parms(&UE->frame_parms,1);
|
||||||
LOG_E(HW,"Could not start the device\n");
|
// if (UE->rfdevice.trx_start_func(&UE->rfdevice) != 0 ) {
|
||||||
oai_exit=1;
|
// LOG_E(HW,"Could not start the device\n");
|
||||||
}
|
// oai_exit=1;
|
||||||
|
// }
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
UE->is_synchronized = 1;
|
UE->is_synchronized = 1;
|
||||||
@@ -939,6 +941,9 @@ void *UE_thread(void *arg) {
|
|||||||
itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p);
|
itti_send_msg_to_task (TASK_NAS_UE, INSTANCE_DEFAULT, message_p);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
while (UE->rfdevice.trx_started==0)
|
||||||
|
usleep(500);
|
||||||
|
|
||||||
while (!oai_exit) {
|
while (!oai_exit) {
|
||||||
|
|
||||||
if (UE->is_synchronized == 0) {
|
if (UE->is_synchronized == 0) {
|
||||||
|
|||||||
Reference in New Issue
Block a user