aboutsummaryrefslogtreecommitdiffstats
path: root/lib/bladerf/bladerf_source_c.cc
diff options
context:
space:
mode:
authorDimitri Stolnikov <horiz0n@gmx.net>2015-01-10 14:01:09 +0100
committerDimitri Stolnikov <horiz0n@gmx.net>2015-01-10 14:01:09 +0100
commit48045b597d3a605d2cb1cd2df62d07317009b9ea (patch)
treee0f9d2bda2133d4e2d119974edeaa099a41180bb /lib/bladerf/bladerf_source_c.cc
parent46bb1ad1a08b44f9c06dd2bf099731aa3bc0e995 (diff)
bladerf: include rxvga1 to the BB gain setting
Patch provided by Samu Laaja
Diffstat (limited to 'lib/bladerf/bladerf_source_c.cc')
-rw-r--r--lib/bladerf/bladerf_source_c.cc24
1 files changed, 19 insertions, 5 deletions
diff --git a/lib/bladerf/bladerf_source_c.cc b/lib/bladerf/bladerf_source_c.cc
index c2fd15d..7450b1b 100644
--- a/lib/bladerf/bladerf_source_c.cc
+++ b/lib/bladerf/bladerf_source_c.cc
@@ -110,7 +110,6 @@ bladerf_source_c::bladerf_source_c (const std::string &args)
/* Set the range of VGA2 VGA2GAIN[4:0], not recommended to be used above 30dB */
_vga2_range = osmosdr::gain_range_t( 0, 30, 3 );
-
/* Warn user about using an old FPGA version, as we no longer strip off the
* markers that were pressent in the pre-v0.0.1 FPGA */
if (bladerf_fpga_version( _dev.get(), &fpga_version ) != 0) {
@@ -397,11 +396,26 @@ double bladerf_source_c::get_gain( const std::string & name, size_t chan )
double bladerf_source_c::set_bb_gain( double gain, size_t chan )
{
- /* TODO: for RX, we should combine VGA1 & VGA2 which both are in BB path */
- osmosdr::gain_range_t bb_gains = get_gain_range( "VGA2", chan );
+ osmosdr::gain_range_t vga1_gains = get_gain_range( "VGA1", chan );
+ osmosdr::gain_range_t vga2_gains = get_gain_range( "VGA2", chan );
+
+ // Gain partitioning from:
+ // http://www.limemicro.com/download/FAQ_v1.0r10.pdf part 5.18
+
+ // So: first maximize VGA1 gain, then VGA2
+
+ if ( gain > vga1_gains.stop() + vga2_gains.start() )
+ {
+ double clip_gain = vga2_gains.clip( gain - vga1_gains.stop(), true );
- double clip_gain = bb_gains.clip( gain, true );
- gain = set_gain( clip_gain, "VGA2", chan );
+ gain = set_gain(vga1_gains.stop(), "VGA1", chan) + set_gain(clip_gain, "VGA2", chan);
+ }
+ else
+ {
+ double clip_gain = vga1_gains.clip( gain - vga2_gains.start(), true );
+
+ gain = set_gain(clip_gain , "VGA1", chan) + set_gain(vga2_gains.start(), "VGA2", chan);
+ }
return gain;
}