forked from sdr/gr-osmosdr
bladerf: compatibility with older libbladeRF
Implement compatibility with older libbladeRF versions
This commit is contained in:
parent
8f8b137cee
commit
bee32d9f0d
|
@ -124,6 +124,10 @@ static bool _is_tx(bladerf_channel ch)
|
||||||
|
|
||||||
size_t num_streams(bladerf_channel_layout layout)
|
size_t num_streams(bladerf_channel_layout layout)
|
||||||
{
|
{
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
return 1;
|
||||||
|
#else
|
||||||
|
|
||||||
switch (layout) {
|
switch (layout) {
|
||||||
case BLADERF_RX_X1:
|
case BLADERF_RX_X1:
|
||||||
case BLADERF_TX_X1:
|
case BLADERF_TX_X1:
|
||||||
|
@ -136,6 +140,7 @@ size_t num_streams(bladerf_channel_layout layout)
|
||||||
assert(false);
|
assert(false);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
/******************************************************************************
|
/******************************************************************************
|
||||||
|
@ -527,8 +532,16 @@ bladerf_channel bladerf_common::chan2channel(bladerf_direction direction,
|
||||||
|
|
||||||
osmosdr::meta_range_t bladerf_common::sample_rates(bladerf_channel ch)
|
osmosdr::meta_range_t bladerf_common::sample_rates(bladerf_channel ch)
|
||||||
{
|
{
|
||||||
int status;
|
|
||||||
osmosdr::meta_range_t sample_rates;
|
osmosdr::meta_range_t sample_rates;
|
||||||
|
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
/* assuming the same for RX & TX */
|
||||||
|
sample_rates += osmosdr::range_t( 160e3, 200e3, 40e3 );
|
||||||
|
sample_rates += osmosdr::range_t( 300e3, 900e3, 100e3 );
|
||||||
|
sample_rates += osmosdr::range_t( 1e6, 40e6, 1e6 );
|
||||||
|
#else
|
||||||
|
|
||||||
|
int status;
|
||||||
bladerf_range brf_sample_rates;
|
bladerf_range brf_sample_rates;
|
||||||
|
|
||||||
status = bladerf_get_sample_rate_range(_dev.get(), ch, &brf_sample_rates);
|
status = bladerf_get_sample_rate_range(_dev.get(), ch, &brf_sample_rates);
|
||||||
|
@ -546,6 +559,7 @@ osmosdr::meta_range_t bladerf_common::sample_rates(bladerf_channel ch)
|
||||||
sample_rates += osmosdr::range_t(brf_sample_rates.max / 2.0,
|
sample_rates += osmosdr::range_t(brf_sample_rates.max / 2.0,
|
||||||
brf_sample_rates.max,
|
brf_sample_rates.max,
|
||||||
brf_sample_rates.max / 4.0);
|
brf_sample_rates.max / 4.0);
|
||||||
|
#endif
|
||||||
|
|
||||||
return sample_rates;
|
return sample_rates;
|
||||||
}
|
}
|
||||||
|
@ -583,6 +597,11 @@ double bladerf_common::get_sample_rate(bladerf_channel ch)
|
||||||
|
|
||||||
osmosdr::freq_range_t bladerf_common::freq_range(bladerf_channel ch)
|
osmosdr::freq_range_t bladerf_common::freq_range(bladerf_channel ch)
|
||||||
{
|
{
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
return osmosdr::freq_range_t( _is_xb_attached(_dev) ? 0 : 280e6,
|
||||||
|
BLADERF_FREQUENCY_MAX );
|
||||||
|
#else
|
||||||
|
|
||||||
int status;
|
int status;
|
||||||
struct bladerf_range range;
|
struct bladerf_range range;
|
||||||
|
|
||||||
|
@ -594,6 +613,7 @@ osmosdr::freq_range_t bladerf_common::freq_range(bladerf_channel ch)
|
||||||
return osmosdr::freq_range_t(static_cast<double>(range.min),
|
return osmosdr::freq_range_t(static_cast<double>(range.min),
|
||||||
static_cast<double>(range.max),
|
static_cast<double>(range.max),
|
||||||
static_cast<double>(range.step));
|
static_cast<double>(range.step));
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
double bladerf_common::set_center_freq(double freq, bladerf_channel ch)
|
double bladerf_common::set_center_freq(double freq, bladerf_channel ch)
|
||||||
|
@ -631,9 +651,19 @@ double bladerf_common::get_center_freq(bladerf_channel ch)
|
||||||
|
|
||||||
osmosdr::freq_range_t bladerf_common::filter_bandwidths(bladerf_channel ch)
|
osmosdr::freq_range_t bladerf_common::filter_bandwidths(bladerf_channel ch)
|
||||||
{
|
{
|
||||||
/* the same for RX & TX according to the datasheet */
|
|
||||||
int status;
|
|
||||||
osmosdr::freq_range_t bandwidths;
|
osmosdr::freq_range_t bandwidths;
|
||||||
|
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
std::vector<double> half_bandwidths; /* in MHz */
|
||||||
|
half_bandwidths += \
|
||||||
|
0.75, 0.875, 1.25, 1.375, 1.5, 1.92, 2.5,
|
||||||
|
2.75, 3, 3.5, 4.375, 5, 6, 7, 10, 14;
|
||||||
|
|
||||||
|
BOOST_FOREACH( double half_bw, half_bandwidths )
|
||||||
|
bandwidths += osmosdr::range_t( half_bw * 2e6 );
|
||||||
|
#else
|
||||||
|
|
||||||
|
int status;
|
||||||
bladerf_range range;
|
bladerf_range range;
|
||||||
|
|
||||||
status = bladerf_get_bandwidth_range(_dev.get(), ch, &range);
|
status = bladerf_get_bandwidth_range(_dev.get(), ch, &range);
|
||||||
|
@ -642,6 +672,7 @@ osmosdr::freq_range_t bladerf_common::filter_bandwidths(bladerf_channel ch)
|
||||||
}
|
}
|
||||||
|
|
||||||
bandwidths += osmosdr::range_t(range.min, range.max, range.step);
|
bandwidths += osmosdr::range_t(range.min, range.max, range.step);
|
||||||
|
#endif
|
||||||
|
|
||||||
return bandwidths;
|
return bandwidths;
|
||||||
}
|
}
|
||||||
|
@ -682,11 +713,15 @@ double bladerf_common::get_bandwidth(bladerf_channel ch)
|
||||||
|
|
||||||
std::vector<std::string> bladerf_common::get_gain_names(bladerf_channel ch)
|
std::vector<std::string> bladerf_common::get_gain_names(bladerf_channel ch)
|
||||||
{
|
{
|
||||||
const size_t max_count = 16;
|
|
||||||
std::vector<std::string> names;
|
std::vector<std::string> names;
|
||||||
|
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
names += "LNA", "VGA1", "VGA2";
|
||||||
|
#else
|
||||||
|
|
||||||
|
const size_t max_count = 16;
|
||||||
char *gain_names[max_count];
|
char *gain_names[max_count];
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
names += SYSTEM_GAIN_NAME;
|
names += SYSTEM_GAIN_NAME;
|
||||||
|
|
||||||
count = bladerf_get_gain_stages(_dev.get(), ch,
|
count = bladerf_get_gain_stages(_dev.get(), ch,
|
||||||
|
@ -700,6 +735,7 @@ std::vector<std::string> bladerf_common::get_gain_names(bladerf_channel ch)
|
||||||
char *tmp = gain_names[i];
|
char *tmp = gain_names[i];
|
||||||
names += std::string(tmp);
|
names += std::string(tmp);
|
||||||
};
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
return names;
|
return names;
|
||||||
}
|
}
|
||||||
|
@ -713,6 +749,19 @@ osmosdr::gain_range_t bladerf_common::get_gain_range(bladerf_channel ch)
|
||||||
osmosdr::gain_range_t bladerf_common::get_gain_range(std::string const &name,
|
osmosdr::gain_range_t bladerf_common::get_gain_range(std::string const &name,
|
||||||
bladerf_channel ch)
|
bladerf_channel ch)
|
||||||
{
|
{
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
if( name == "LNA" ) {
|
||||||
|
return osmosdr::gain_range_t( 0, 6, 3 );
|
||||||
|
} else if( name == "VGA1" ) {
|
||||||
|
return osmosdr::gain_range_t( 5, 30, 1 );
|
||||||
|
} else if( name == "VGA2" ) {
|
||||||
|
return osmosdr::gain_range_t( 0, 30, 3 );
|
||||||
|
} else {
|
||||||
|
BLADERF_THROW_STATUS(BLADERF_ERR_UNSUPPORTED, boost::str(boost::format(
|
||||||
|
"Failed to get gain range for stage '%s'") % name));
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
int status;
|
int status;
|
||||||
struct bladerf_range range;
|
struct bladerf_range range;
|
||||||
|
|
||||||
|
@ -728,6 +777,7 @@ osmosdr::gain_range_t bladerf_common::get_gain_range(std::string const &name,
|
||||||
}
|
}
|
||||||
|
|
||||||
return osmosdr::gain_range_t(range.min, range.max, range.step);
|
return osmosdr::gain_range_t(range.min, range.max, range.step);
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
bool bladerf_common::set_gain_mode(bool automatic, bladerf_channel ch,
|
bool bladerf_common::set_gain_mode(bool automatic, bladerf_channel ch,
|
||||||
|
@ -772,12 +822,34 @@ double bladerf_common::set_gain(double gain,
|
||||||
{
|
{
|
||||||
int status;
|
int status;
|
||||||
|
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
if( name == "LNA" ) {
|
||||||
|
bladerf_lna_gain g;
|
||||||
|
|
||||||
|
if ( gain >= 6.0f )
|
||||||
|
g = BLADERF_LNA_GAIN_MAX;
|
||||||
|
else if ( gain >= 3.0f )
|
||||||
|
g = BLADERF_LNA_GAIN_MID;
|
||||||
|
else /* gain < 3.0f */
|
||||||
|
g = BLADERF_LNA_GAIN_BYPASS;
|
||||||
|
|
||||||
|
status = bladerf_set_lna_gain( _dev.get(), g );
|
||||||
|
} else if( name == "VGA1" ) {
|
||||||
|
status = bladerf_set_rxvga1( _dev.get(), (int)gain );
|
||||||
|
} else if( name == "VGA2" ) {
|
||||||
|
status = bladerf_set_rxvga2( _dev.get(), (int)gain );
|
||||||
|
} else {
|
||||||
|
status = BLADERF_ERR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
if (name == SYSTEM_GAIN_NAME) {
|
if (name == SYSTEM_GAIN_NAME) {
|
||||||
status = bladerf_set_gain(_dev.get(), ch, static_cast<int>(gain));
|
status = bladerf_set_gain(_dev.get(), ch, static_cast<int>(gain));
|
||||||
} else {
|
} else {
|
||||||
status = bladerf_set_gain_stage(_dev.get(), ch, name.c_str(),
|
status = bladerf_set_gain_stage(_dev.get(), ch, name.c_str(),
|
||||||
static_cast<int>(gain));
|
static_cast<int>(gain));
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check for errors */
|
/* Check for errors */
|
||||||
if (BLADERF_ERR_UNSUPPORTED == status) {
|
if (BLADERF_ERR_UNSUPPORTED == status) {
|
||||||
|
@ -802,11 +874,26 @@ double bladerf_common::get_gain(std::string const &name, bladerf_channel ch)
|
||||||
int status;
|
int status;
|
||||||
int g = 0;
|
int g = 0;
|
||||||
|
|
||||||
|
#ifdef BLADERF_COMPATIBILITY
|
||||||
|
if( name == "LNA" ) {
|
||||||
|
bladerf_lna_gain lna_g;
|
||||||
|
status = bladerf_get_lna_gain( _dev.get(), &lna_g );
|
||||||
|
g = lna_g == BLADERF_LNA_GAIN_BYPASS ? 0 : lna_g == BLADERF_LNA_GAIN_MID ? 3 : 6;
|
||||||
|
} else if( name == "VGA1" ) {
|
||||||
|
status = bladerf_get_rxvga1( _dev.get(), &g );
|
||||||
|
} else if( name == "VGA2" ) {
|
||||||
|
status = bladerf_get_rxvga2( _dev.get(), &g );
|
||||||
|
} else {
|
||||||
|
status = BLADERF_ERR_UNSUPPORTED;
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
|
||||||
if (name == SYSTEM_GAIN_NAME) {
|
if (name == SYSTEM_GAIN_NAME) {
|
||||||
status = bladerf_get_gain(_dev.get(), ch, &g);
|
status = bladerf_get_gain(_dev.get(), ch, &g);
|
||||||
} else {
|
} else {
|
||||||
status = bladerf_get_gain_stage(_dev.get(), ch, name.c_str(), &g);
|
status = bladerf_get_gain_stage(_dev.get(), ch, name.c_str(), &g);
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Check for errors */
|
/* Check for errors */
|
||||||
if (status != 0) {
|
if (status != 0) {
|
||||||
|
|
|
@ -34,6 +34,8 @@
|
||||||
#include "osmosdr/ranges.h"
|
#include "osmosdr/ranges.h"
|
||||||
#include "arg_helpers.h"
|
#include "arg_helpers.h"
|
||||||
|
|
||||||
|
#include "bladerf_compat.h"
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
typedef ptrdiff_t ssize_t;
|
typedef ptrdiff_t ssize_t;
|
||||||
|
|
|
@ -0,0 +1,78 @@
|
||||||
|
/* -*- c++ -*- */
|
||||||
|
/*
|
||||||
|
* Copyright 2017 Nuand LLC
|
||||||
|
*
|
||||||
|
* GNU Radio is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 3, or (at your option)
|
||||||
|
* any later version.
|
||||||
|
*
|
||||||
|
* GNU Radio is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with GNU Radio; see the file COPYING. If not, write to
|
||||||
|
* the Free Software Foundation, Inc., 51 Franklin Street,
|
||||||
|
* Boston, MA 02110-1301, USA.
|
||||||
|
*/
|
||||||
|
#ifndef INCLUDED_BLADERF_COMPAT_H
|
||||||
|
#define INCLUDED_BLADERF_COMPAT_H
|
||||||
|
|
||||||
|
#if defined(LIBBLADERF_API_VERSION) && (LIBBLADERF_API_VERSION < 0x01080100)
|
||||||
|
#warning Old libbladeRF detected: using compatibility workarounds.
|
||||||
|
|
||||||
|
#define BLADERF_COMPATIBILITY
|
||||||
|
|
||||||
|
/* New libbladeRF supports multiple channels, via various enums. */
|
||||||
|
typedef bladerf_module bladerf_channel;
|
||||||
|
#define BLADERF_CHANNEL_RX(ch) BLADERF_MODULE_RX
|
||||||
|
#define BLADERF_CHANNEL_TX(ch) BLADERF_MODULE_TX
|
||||||
|
#define BLADERF_CHANNEL_INVALID BLADERF_MODULE_INVALID
|
||||||
|
|
||||||
|
typedef bladerf_module bladerf_channel_layout;
|
||||||
|
#define BLADERF_RX_X1 BLADERF_MODULE_RX
|
||||||
|
#define BLADERF_TX_X1 BLADERF_MODULE_TX
|
||||||
|
#define BLADERF_RX_X2 BLADERF_MODULE_INVALID
|
||||||
|
#define BLADERF_TX_X2 BLADERF_MODULE_INVALID
|
||||||
|
|
||||||
|
typedef bladerf_module bladerf_direction;
|
||||||
|
#define BLADERF_RX BLADERF_MODULE_RX
|
||||||
|
#define BLADERF_TX BLADERF_MODULE_TX
|
||||||
|
#define BLADERF_DIRECTION_MASK (0x1)
|
||||||
|
|
||||||
|
/* Changed API calls */
|
||||||
|
static
|
||||||
|
int bladerf_get_frequency(struct bladerf *dev,
|
||||||
|
bladerf_channel ch,
|
||||||
|
uint64_t *freq) // was unsigned int *frequency
|
||||||
|
{
|
||||||
|
unsigned int f32 = 0;
|
||||||
|
int status = bladerf_get_frequency(dev, ch, &f32);
|
||||||
|
*freq = static_cast<uint64_t>(f32);
|
||||||
|
return status;
|
||||||
|
}
|
||||||
|
|
||||||
|
static
|
||||||
|
int bladerf_sync_tx(struct bladerf *dev,
|
||||||
|
void const *samples, // was void *samples
|
||||||
|
unsigned int num_samples,
|
||||||
|
struct bladerf_metadata *metadata,
|
||||||
|
unsigned int timeout_ms)
|
||||||
|
{
|
||||||
|
void *s = const_cast<void *>(samples);
|
||||||
|
return bladerf_sync_tx(dev, s, num_samples, metadata, timeout_ms);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Changed enums/defines */
|
||||||
|
#define BLADERF_GAIN_DEFAULT BLADERF_GAIN_AUTOMATIC
|
||||||
|
#define BLADERF_GAIN_MGC BLADERF_GAIN_MANUAL
|
||||||
|
#define BLADERF_RX_MUX_BASEBAND BLADERF_RX_MUX_BASEBAND_LMS
|
||||||
|
|
||||||
|
/* New functionality with no equivalent */
|
||||||
|
#define BLADERF_LB_AD9361_BIST BLADERF_LB_NONE
|
||||||
|
#define bladerf_get_board_name(name) "bladerf1"
|
||||||
|
|
||||||
|
#endif // libbladeRF < 1.8.1
|
||||||
|
#endif // INCLUDED_BLADERF_COMPAT_H
|
|
@ -614,12 +614,12 @@ void bladerf_source_c::set_rx_mux_mode(const std::string &rxmux)
|
||||||
|
|
||||||
void bladerf_source_c::set_agc_mode(const std::string &agcmode)
|
void bladerf_source_c::set_agc_mode(const std::string &agcmode)
|
||||||
{
|
{
|
||||||
|
#ifndef BLADERF_COMPATIBILITY
|
||||||
int status;
|
int status;
|
||||||
bladerf_gain_mode mode;
|
bladerf_gain_mode mode;
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
struct bladerf_gain_modes const *modes = NULL;
|
struct bladerf_gain_modes const *modes = NULL;
|
||||||
|
|
||||||
|
|
||||||
/* Get the list of AGC modes */
|
/* Get the list of AGC modes */
|
||||||
status = bladerf_get_gain_modes(_dev.get(), BLADERF_CHANNEL_RX(0), &modes);
|
status = bladerf_get_gain_modes(_dev.get(), BLADERF_CHANNEL_RX(0), &modes);
|
||||||
if (status < 0) {
|
if (status < 0) {
|
||||||
|
@ -651,4 +651,5 @@ void bladerf_source_c::set_agc_mode(const std::string &agcmode)
|
||||||
bladerf_common::set_gain_mode(true, BLADERF_CHANNEL_RX(i), _agcmode);
|
bladerf_common::set_gain_mode(true, BLADERF_CHANNEL_RX(i), _agcmode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue