bugfix and clarify API function rtlsdr_get_tuner_gain()

Signed-off-by: hayati ayguen <h_ayguen@web.de>
development
hayati ayguen 2020-08-23 08:29:28 -07:00
parent d1395e22ba
commit 3aa88a9885
4 changed files with 59 additions and 13 deletions

View File

@ -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.

View File

@ -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);

View File

@ -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)

View File

@ -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)
{