diff --git a/include/rtl-sdr.h b/include/rtl-sdr.h index 953a11b..569d1b1 100755 --- a/include/rtl-sdr.h +++ b/include/rtl-sdr.h @@ -284,7 +284,7 @@ RTLSDR_API int rtlsdr_set_tuner_band_center(rtlsdr_dev_t *dev, int32_t if_band_c RTLSDR_API int rtlsdr_set_tuner_sideband(rtlsdr_dev_t *dev, int sideband); /*! - * Get actual gain the device is configured to. + * Get actual (RF / HF) gain the device is configured to - excluding the IF gain. * * \param dev the device handle given by rtlsdr_open() * \return 0 on error, gain in tenths of a dB, 115 means 11.5 dB. diff --git a/include/tuner_r82xx.h b/include/tuner_r82xx.h index 861029a..c501367 100755 --- a/include/tuner_r82xx.h +++ b/include/tuner_r82xx.h @@ -145,6 +145,9 @@ int r82xx_standby(struct r82xx_priv *priv); int r82xx_init(struct r82xx_priv *priv); int r82xx_set_freq(struct r82xx_priv *priv, uint32_t freq); int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain, int extended_mode, int lna_gain, int mixer_gain, int vga_gain, int *rtl_vga_control); +int r82xx_get_rf_gain(struct r82xx_priv *priv); +int r82xx_get_if_gain(struct r82xx_priv *priv); + int r82xx_set_if_mode(struct r82xx_priv *priv, int if_mode, int *rtl_vga_control); int r82xx_set_i2c_register(struct r82xx_priv *priv, unsigned i2c_register, unsigned data, unsigned mask); diff --git a/src/librtlsdr.c b/src/librtlsdr.c index 63092a5..8bbdbf4 100644 --- a/src/librtlsdr.c +++ b/src/librtlsdr.c @@ -212,7 +212,7 @@ struct rtlsdr_dev { int tuner_if_freq; int tuner_sideband; int corr; /* ppm */ - int gain; /* tenth dB */ + /* int gain; * tenth dB */ enum rtlsdr_ds_mode direct_sampling_mode; uint32_t direct_sampling_threshold; /* Hz */ struct e4k_state e4k_s; @@ -1589,11 +1589,6 @@ int rtlsdr_set_tuner_gain(rtlsdr_dev_t *dev, int gain) rtlsdr_set_i2c_repeater(dev, 0); } - if (!r) - dev->gain = gain; - else - dev->gain = 0; - return r; } @@ -1610,11 +1605,6 @@ int rtlsdr_set_tuner_gain_ext(rtlsdr_dev_t *dev, int lna_gain, int mixer_gain, i rtlsdr_set_i2c_repeater(dev, 0); } - if (!r) - dev->gain = lna_gain + mixer_gain + vga_gain; - else - dev->gain = 0; - return r; } @@ -1637,6 +1627,8 @@ int rtlsdr_set_tuner_if_mode(rtlsdr_dev_t *dev, int if_mode) int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev) { + int rf_gain = 0; + #ifdef _ENABLE_RPC if (rtlsdr_rpc_is_enabled()) { @@ -1647,7 +1639,11 @@ int rtlsdr_get_tuner_gain(rtlsdr_dev_t *dev) if (!dev) return 0; - return dev->gain; + + if (dev->tuner_type == RTLSDR_TUNER_R820T) + rf_gain = r82xx_get_rf_gain(&dev->r82xx_p); + + return rf_gain; } int rtlsdr_set_tuner_if_gain(rtlsdr_dev_t *dev, int stage, int gain) diff --git a/src/tuner_r82xx.c b/src/tuner_r82xx.c index b733dae..55137b6 100644 --- a/src/tuner_r82xx.c +++ b/src/tuner_r82xx.c @@ -1083,6 +1083,37 @@ static int r82xx_get_if_gain_index(int gain) return vga_index; } +static int r82xx_get_lna_gain_from_index(int lna_index) +{ + int i, total_gain = 0; + if ( lna_index < 0 || lna_index > 15 ) + return 0; + for ( i = 0; i <= lna_index; ++i ) + total_gain += r82xx_lna_gain_steps[i]; + return total_gain; +} + +static int r82xx_get_mixer_gain_from_index(int mixer_index) +{ + int i, total_gain = 0; + if ( mixer_index < 0 || mixer_index > 15 ) + return 0; + for ( i = 0; i <= mixer_index; ++i ) + total_gain += r82xx_mixer_gain_steps[i]; + return total_gain; +} + +static int r82xx_get_vga_gain_from_index(int vga_index) +{ + int i, total_gain = VGA_BASE_GAIN; + if ( vga_index < 0 || vga_index > 15 ) + return 0; + for ( i = 0; i <= vga_index; ++i ) + total_gain += r82xx_vga_gain_steps[i]; + return total_gain; +} + + /* set HF gain (LNA/Mixer) and pass through for IF gain (VGA) */ int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain, int extended_mode, int lna_gain_idx, int mixer_gain_idx, int vga_gain_idx, int *rtl_vga_control) @@ -1153,6 +1184,22 @@ int r82xx_set_gain(struct r82xx_priv *priv, int set_manual_gain, int gain, return rc; } +int r82xx_get_rf_gain(struct r82xx_priv *priv) +{ + int lna_gain = r82xx_get_lna_gain_from_index(priv->last_LNA_value); + int mix_gain = r82xx_get_mixer_gain_from_index(priv->last_Mixer_value); + int gain = lna_gain + mix_gain; + return gain; +} + + +int r82xx_get_if_gain(struct r82xx_priv *priv) +{ + int vga_gain = r82xx_get_vga_gain_from_index(priv->last_VGA_value); + return vga_gain; +} + + /* set IF gain (VGA) */ int r82xx_set_if_mode(struct r82xx_priv *priv, int if_mode, int *rtl_vga_control) {