Added BladeRF Micro Support (required bladerf driver > 2.0.2)

master
Xavier Arteaga 6 years ago
parent 0294923e2b
commit f865296421

@ -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);*/
} }
} }

Loading…
Cancel
Save