|
|
@ -25,22 +25,19 @@
|
|
|
|
*/
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#include <libbladeRF.h>
|
|
|
|
#include <libbladeRF.h>
|
|
|
|
#include <sys/time.h>
|
|
|
|
|
|
|
|
#include <string.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <pthread.h>
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#include "srslte/srslte.h"
|
|
|
|
#include "srslte/srslte.h"
|
|
|
|
#include "rf_blade_imp.h"
|
|
|
|
#include "rf_blade_imp.h"
|
|
|
|
#include "srslte/phy/rf/rf.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#define CONVERT_BUFFER_SIZE 240*1024
|
|
|
|
#define CONVERT_BUFFER_SIZE (240*1024)
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct {
|
|
|
|
typedef struct {
|
|
|
|
struct bladerf *dev;
|
|
|
|
struct bladerf *dev;
|
|
|
|
uint32_t rx_rate;
|
|
|
|
bladerf_sample_rate rx_rate;
|
|
|
|
uint32_t tx_rate;
|
|
|
|
bladerf_sample_rate tx_rate;
|
|
|
|
int16_t rx_buffer[CONVERT_BUFFER_SIZE];
|
|
|
|
int16_t rx_buffer[CONVERT_BUFFER_SIZE];
|
|
|
|
int16_t tx_buffer[CONVERT_BUFFER_SIZE];
|
|
|
|
int16_t tx_buffer[CONVERT_BUFFER_SIZE];
|
|
|
|
bool rx_stream_enabled;
|
|
|
|
bool rx_stream_enabled;
|
|
|
@ -83,7 +80,7 @@ int rf_blade_start_tx_stream(void *h)
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
|
|
|
|
|
|
|
|
status = bladerf_sync_config(handler->dev,
|
|
|
|
status = bladerf_sync_config(handler->dev,
|
|
|
|
BLADERF_MODULE_TX,
|
|
|
|
BLADERF_TX_X1,
|
|
|
|
BLADERF_FORMAT_SC16_Q11_META,
|
|
|
|
BLADERF_FORMAT_SC16_Q11_META,
|
|
|
|
num_buffers,
|
|
|
|
num_buffers,
|
|
|
|
buffer_size_tx,
|
|
|
|
buffer_size_tx,
|
|
|
@ -112,7 +109,7 @@ int rf_blade_start_rx_stream(void *h, bool now)
|
|
|
|
uint32_t buffer_size_rx = ms_buffer_size_rx*(handler->rx_rate/1000/1024);
|
|
|
|
uint32_t buffer_size_rx = ms_buffer_size_rx*(handler->rx_rate/1000/1024);
|
|
|
|
|
|
|
|
|
|
|
|
status = bladerf_sync_config(handler->dev,
|
|
|
|
status = bladerf_sync_config(handler->dev,
|
|
|
|
BLADERF_MODULE_RX,
|
|
|
|
BLADERF_RX_X1,
|
|
|
|
BLADERF_FORMAT_SC16_Q11_META,
|
|
|
|
BLADERF_FORMAT_SC16_Q11_META,
|
|
|
|
num_buffers,
|
|
|
|
num_buffers,
|
|
|
|
buffer_size_rx,
|
|
|
|
buffer_size_rx,
|
|
|
@ -123,7 +120,7 @@ int rf_blade_start_rx_stream(void *h, bool now)
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
status = bladerf_sync_config(handler->dev,
|
|
|
|
status = bladerf_sync_config(handler->dev,
|
|
|
|
BLADERF_MODULE_TX,
|
|
|
|
BLADERF_TX_X1,
|
|
|
|
BLADERF_FORMAT_SC16_Q11_META,
|
|
|
|
BLADERF_FORMAT_SC16_Q11_META,
|
|
|
|
num_buffers,
|
|
|
|
num_buffers,
|
|
|
|
buffer_size_tx,
|
|
|
|
buffer_size_tx,
|
|
|
@ -186,6 +183,8 @@ int rf_blade_open_multi(char *args, void **h, uint32_t nof_channels)
|
|
|
|
|
|
|
|
|
|
|
|
int rf_blade_open(char *args, void **h)
|
|
|
|
int rf_blade_open(char *args, void **h)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
|
|
|
|
const struct bladerf_range *range_tx = NULL;
|
|
|
|
|
|
|
|
const struct bladerf_range *range_rx = NULL;
|
|
|
|
*h = NULL;
|
|
|
|
*h = NULL;
|
|
|
|
|
|
|
|
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) malloc(sizeof(rf_blade_handler_t));
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) malloc(sizeof(rf_blade_handler_t));
|
|
|
@ -202,32 +201,44 @@ int rf_blade_open(char *args, void **h)
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
status = bladerf_set_gain_mode(handler->dev, BLADERF_MODULE_RX, BLADERF_GAIN_MGC);
|
|
|
|
|
|
|
|
if (status) {
|
|
|
|
|
|
|
|
fprintf(stderr, "Unable to open device: %s\n", bladerf_strerror(status));
|
|
|
|
|
|
|
|
return status;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//bladerf_log_set_verbosity(BLADERF_LOG_LEVEL_VERBOSE);
|
|
|
|
//bladerf_log_set_verbosity(BLADERF_LOG_LEVEL_VERBOSE);
|
|
|
|
|
|
|
|
|
|
|
|
/* Configure the gains of the RX LNA and RX VGA1*/
|
|
|
|
/* Get Gain ranges and set Rx to maximum */
|
|
|
|
status = bladerf_set_lna_gain(handler->dev, BLADERF_LNA_GAIN_MAX);
|
|
|
|
status = bladerf_get_gain_range(handler->dev, BLADERF_MODULE_RX, &range_rx);
|
|
|
|
if (status != 0) {
|
|
|
|
if ((status != 0) | (range_rx == NULL)) {
|
|
|
|
fprintf(stderr, "Failed to set RX LNA gain: %s\n", bladerf_strerror(status));
|
|
|
|
fprintf(stderr, "Failed to get RX gain range: %s\n", bladerf_strerror(status));
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
status = bladerf_set_rxvga1(handler->dev, 27);
|
|
|
|
|
|
|
|
if (status != 0) {
|
|
|
|
bladerf_get_gain_range(handler->dev, BLADERF_MODULE_RX, &range_tx);
|
|
|
|
fprintf(stderr, "Failed to set RX VGA1 gain: %s\n", bladerf_strerror(status));
|
|
|
|
if ((status != 0) | (range_tx == NULL)) {
|
|
|
|
|
|
|
|
fprintf(stderr, "Failed to get TX gain range: %s\n", bladerf_strerror(status));
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
status = bladerf_set_txvga1(handler->dev, BLADERF_TXVGA1_GAIN_MAX);
|
|
|
|
|
|
|
|
|
|
|
|
status = bladerf_set_gain(handler->dev, BLADERF_MODULE_RX, (bladerf_gain) range_rx->max);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to set TX VGA1 gain: %s\n", bladerf_strerror(status));
|
|
|
|
fprintf(stderr, "Failed to set RX LNA gain: %s\n", bladerf_strerror(status));
|
|
|
|
return status;
|
|
|
|
return status;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
handler->rx_stream_enabled = false;
|
|
|
|
handler->rx_stream_enabled = false;
|
|
|
|
handler->tx_stream_enabled = false;
|
|
|
|
handler->tx_stream_enabled = false;
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/* Set default sampling rates */
|
|
|
|
|
|
|
|
rf_blade_set_tx_srate(handler, 1.92e6);
|
|
|
|
|
|
|
|
rf_blade_set_rx_srate(handler, 1.92e6);
|
|
|
|
|
|
|
|
|
|
|
|
/* Set info structure */
|
|
|
|
/* Set info structure */
|
|
|
|
handler->info.min_tx_gain = BLADERF_TXVGA2_GAIN_MIN;
|
|
|
|
handler->info.min_tx_gain = range_tx->min;
|
|
|
|
handler->info.max_tx_gain = BLADERF_TXVGA2_GAIN_MAX;
|
|
|
|
handler->info.max_tx_gain = range_tx->max;
|
|
|
|
handler->info.min_rx_gain = BLADERF_RXVGA2_GAIN_MIN;
|
|
|
|
handler->info.min_rx_gain = range_rx->min;
|
|
|
|
handler->info.max_rx_gain = BLADERF_RXVGA2_GAIN_MAX;
|
|
|
|
handler->info.max_rx_gain = range_rx->max;
|
|
|
|
|
|
|
|
|
|
|
|
return 0;
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -265,7 +276,7 @@ double rf_blade_set_rx_srate(void *h, double freq)
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
status = bladerf_set_bandwidth(handler->dev, BLADERF_MODULE_RX, handler->rx_rate*0.8, &bw);
|
|
|
|
status = bladerf_set_bandwidth(handler->dev, BLADERF_MODULE_RX, (bladerf_bandwidth) (handler->rx_rate * 0.8), &bw);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to set bandwidth = %u: %s\n", handler->rx_rate, bladerf_strerror(status));
|
|
|
|
fprintf(stderr, "Failed to set bandwidth = %u: %s\n", handler->rx_rate, bladerf_strerror(status));
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
@ -296,9 +307,9 @@ double rf_blade_set_rx_gain(void *h, double gain)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
int status;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
status = bladerf_set_rxvga2(handler->dev, (int) gain);
|
|
|
|
status = bladerf_set_gain(handler->dev, BLADERF_MODULE_RX, (bladerf_gain) gain);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to set RX VGA2 gain: %s\n", bladerf_strerror(status));
|
|
|
|
fprintf(stderr, "Failed to set RX gain: %s\n", bladerf_strerror(status));
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return rf_blade_get_rx_gain(h);
|
|
|
|
return rf_blade_get_rx_gain(h);
|
|
|
@ -308,9 +319,9 @@ double rf_blade_set_tx_gain(void *h, double gain)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
int status;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
status = bladerf_set_txvga2(handler->dev, (int) gain);
|
|
|
|
status = bladerf_set_gain(handler->dev, BLADERF_MODULE_TX, (bladerf_gain) gain);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to set TX VGA2 gain: %s\n", bladerf_strerror(status));
|
|
|
|
fprintf(stderr, "Failed to set TX gain: %s\n", bladerf_strerror(status));
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return rf_blade_get_tx_gain(h);
|
|
|
|
return rf_blade_get_tx_gain(h);
|
|
|
@ -319,29 +330,29 @@ double rf_blade_set_tx_gain(void *h, double gain)
|
|
|
|
double rf_blade_get_rx_gain(void *h)
|
|
|
|
double rf_blade_get_rx_gain(void *h)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
int status;
|
|
|
|
int gain;
|
|
|
|
bladerf_gain gain = 0;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
status = bladerf_get_rxvga2(handler->dev, &gain);
|
|
|
|
status = bladerf_get_gain(handler->dev, BLADERF_MODULE_RX, &gain);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to get RX VGA2 gain: %s\n",
|
|
|
|
fprintf(stderr, "Failed to get RX gain: %s\n",
|
|
|
|
bladerf_strerror(status));
|
|
|
|
bladerf_strerror(status));
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return gain; // Add rxvga1 and LNA
|
|
|
|
return gain;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
double rf_blade_get_tx_gain(void *h)
|
|
|
|
double rf_blade_get_tx_gain(void *h)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
int status;
|
|
|
|
int status;
|
|
|
|
int gain;
|
|
|
|
bladerf_gain gain = 0;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
status = bladerf_get_txvga2(handler->dev, &gain);
|
|
|
|
status = bladerf_get_gain(handler->dev, BLADERF_MODULE_TX, &gain);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to get TX VGA2 gain: %s\n",
|
|
|
|
fprintf(stderr, "Failed to get TX gain: %s\n",
|
|
|
|
bladerf_strerror(status));
|
|
|
|
bladerf_strerror(status));
|
|
|
|
return -1;
|
|
|
|
return -1;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return gain; // Add txvga1
|
|
|
|
return gain;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
srslte_rf_info_t *rf_blade_get_info(void *h)
|
|
|
|
srslte_rf_info_t *rf_blade_get_info(void *h)
|
|
|
@ -360,7 +371,7 @@ srslte_rf_info_t *rf_blade_get_info(void *h)
|
|
|
|
double rf_blade_set_rx_freq(void *h, double freq)
|
|
|
|
double rf_blade_set_rx_freq(void *h, double freq)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
uint32_t f_int = (uint32_t) round(freq);
|
|
|
|
bladerf_frequency f_int = (uint32_t) round(freq);
|
|
|
|
int status = bladerf_set_frequency(handler->dev, BLADERF_MODULE_RX, f_int);
|
|
|
|
int status = bladerf_set_frequency(handler->dev, BLADERF_MODULE_RX, f_int);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to set samplerate = %u: %s\n",
|
|
|
|
fprintf(stderr, "Failed to set samplerate = %u: %s\n",
|
|
|
@ -369,7 +380,7 @@ double rf_blade_set_rx_freq(void *h, double freq)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
f_int=0;
|
|
|
|
f_int=0;
|
|
|
|
bladerf_get_frequency(handler->dev, BLADERF_MODULE_RX, &f_int);
|
|
|
|
bladerf_get_frequency(handler->dev, BLADERF_MODULE_RX, &f_int);
|
|
|
|
printf("set RX frequency to %u\n", f_int);
|
|
|
|
printf("set RX frequency to %lu\n", f_int);
|
|
|
|
|
|
|
|
|
|
|
|
return freq;
|
|
|
|
return freq;
|
|
|
|
}
|
|
|
|
}
|
|
|
@ -377,7 +388,7 @@ double rf_blade_set_rx_freq(void *h, double freq)
|
|
|
|
double rf_blade_set_tx_freq(void *h, double freq)
|
|
|
|
double rf_blade_set_tx_freq(void *h, double freq)
|
|
|
|
{
|
|
|
|
{
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
uint32_t f_int = (uint32_t) round(freq);
|
|
|
|
bladerf_frequency f_int = (uint32_t) round(freq);
|
|
|
|
int status = bladerf_set_frequency(handler->dev, BLADERF_MODULE_TX, f_int);
|
|
|
|
int status = bladerf_set_frequency(handler->dev, BLADERF_MODULE_TX, f_int);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to set samplerate = %u: %s\n",
|
|
|
|
fprintf(stderr, "Failed to set samplerate = %u: %s\n",
|
|
|
@ -387,7 +398,7 @@ double rf_blade_set_tx_freq(void *h, double freq)
|
|
|
|
|
|
|
|
|
|
|
|
f_int=0;
|
|
|
|
f_int=0;
|
|
|
|
bladerf_get_frequency(handler->dev, BLADERF_MODULE_TX, &f_int);
|
|
|
|
bladerf_get_frequency(handler->dev, BLADERF_MODULE_TX, &f_int);
|
|
|
|
printf("set TX frequency to %u\n", f_int);
|
|
|
|
printf("set TX frequency to %lu\n", f_int);
|
|
|
|
return freq;
|
|
|
|
return freq;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
@ -431,7 +442,7 @@ void rf_blade_get_time(void *h, time_t *secs, double *frac_secs)
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
rf_blade_handler_t *handler = (rf_blade_handler_t*) h;
|
|
|
|
struct bladerf_metadata meta;
|
|
|
|
struct bladerf_metadata meta;
|
|
|
|
|
|
|
|
|
|
|
|
int status = bladerf_get_timestamp(handler->dev, BLADERF_MODULE_RX, &meta.timestamp);
|
|
|
|
int status = bladerf_get_timestamp(handler->dev, BLADERF_RX, &meta.timestamp);
|
|
|
|
if (status != 0) {
|
|
|
|
if (status != 0) {
|
|
|
|
fprintf(stderr, "Failed to get current RX timestamp: %s\n",
|
|
|
|
fprintf(stderr, "Failed to get current RX timestamp: %s\n",
|
|
|
|
bladerf_strerror(status));
|
|
|
|
bladerf_strerror(status));
|
|
|
@ -479,8 +490,8 @@ int rf_blade_recv_with_time(void *h,
|
|
|
|
error.type = SRSLTE_RF_ERROR_OVERFLOW;
|
|
|
|
error.type = SRSLTE_RF_ERROR_OVERFLOW;
|
|
|
|
blade_error_handler(error);
|
|
|
|
blade_error_handler(error);
|
|
|
|
} else {
|
|
|
|
} else {
|
|
|
|
fprintf(stderr, "Overrun detected in scheduled RX. "
|
|
|
|
/*fprintf(stderr, "Overrun detected in scheduled RX. "
|
|
|
|
"%u valid samples were read.\n\n", meta.actual_count);
|
|
|
|
"%u valid samples were read.\n\n", meta.actual_count);*/
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|